Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'target_explorer/plugins/org.eclipse.tcf.te.ui')
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/.classpath7
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/.project39
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/.settings/org.eclipse.jdt.core.prefs362
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/.settings/org.eclipse.jdt.ui.prefs4
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/META-INF/MANIFEST.MF38
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/build.properties8
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/icons/dlcl16/newtarget_wiz.gifbin0 -> 202 bytes
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/icons/elcl16/newtarget_wiz.gifbin0 -> 328 bytes
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/icons/ovr16/busy.gifbin0 -> 838 bytes
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/icons/ovr16/gold_ovr.gifbin0 -> 854 bytes
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/icons/ovr16/green_ovr.gifbin0 -> 854 bytes
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/icons/ovr16/grey_ovr.gifbin0 -> 854 bytes
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/icons/ovr16/redX_ovr.gifbin0 -> 854 bytes
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/icons/ovr16/red_ovr.gifbin0 -> 854 bytes
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/icons/wizban/newtarget_wiz.gifbin0 -> 2886 bytes
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/plugin.properties35
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/plugin.xml87
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/pom.xml17
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/schema/newWizards.exsd220
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/AbstractViewerComparator.java106
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/WorkbenchPartControl.java130
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/activator/UIPlugin.java134
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/decorators/images/ConnectableImageDescriptor.java130
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/dialogs/NameValuePairDialog.java204
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/dialogs/RenameDialog.java143
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/events/AbstractEventListener.java47
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/interfaces/IContextHelpIds.java33
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/interfaces/IUIConstants.java28
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/interfaces/ImageConsts.java95
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/executors/SWTDisplayExecutor.java107
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/executors/SWTDisplayExecutorUtilDelegate.java36
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/nls/Messages.java57
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/nls/Messages.properties36
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/statushandler/DefaultStatusHandler.java295
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/tables/TableViewerComparator.java135
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/tables/properties/NodePropertiesTableControl.java420
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/tables/properties/NodePropertiesTableTableNode.java42
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/AbstractTreeControl.java309
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/TreeArrayContentProvider.java62
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/TreeViewerComparator.java178
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/TreeViewerSorter.java205
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/AbstractWizard.java81
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/AbstractWizardCommandHandler.java131
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/interfaces/INewTargetWizard.java31
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/interfaces/ISharedDataWizardPage.java63
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/interfaces/IValidatableWizardPage.java30
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/newWizard/NewWizard.java123
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/newWizard/NewWizardCommandHandler.java36
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/newWizard/NewWizardNode.java144
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/newWizard/NewWizardRegistry.java62
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/newWizard/NewWizardSelectionPage.java402
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/pages/AbstractFormsWizardPage.java89
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/pages/AbstractSharedDataWizardPage.java68
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/pages/AbstractValidatableWizardPage.java99
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/pages/AbstractWizardPage.java121
55 files changed, 5229 insertions, 0 deletions
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/.classpath b/target_explorer/plugins/org.eclipse.tcf.te.ui/.classpath
new file mode 100644
index 000000000..8a8f1668c
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/.project b/target_explorer/plugins/org.eclipse.tcf.te.ui/.project
new file mode 100644
index 000000000..d4938fc6c
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/.project
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.tcf.te.ui</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+ <filteredResources>
+ <filter>
+ <id>1311579499295</id>
+ <name></name>
+ <type>10</type>
+ <matcher>
+ <id>org.eclipse.ui.ide.multiFilter</id>
+ <arguments>1.0-name-matches-false-false-target</arguments>
+ </matcher>
+ </filter>
+ </filteredResources>
+</projectDescription>
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/.settings/org.eclipse.jdt.core.prefs b/target_explorer/plugins/org.eclipse.tcf.te.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 000000000..4a8e8509e
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,362 @@
+#Fri Oct 07 16:14:33 CEST 2011
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=warning
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=enabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=enabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=enabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=0
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=0
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=0
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=0
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=0
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=true
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+org.eclipse.jdt.core.formatter.comment.line_length=100
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=4
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=4
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=true
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=true
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=true
+org.eclipse.jdt.core.formatter.lineSplit=100
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=false
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=true
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/.settings/org.eclipse.jdt.ui.prefs b/target_explorer/plugins/org.eclipse.tcf.te.ui/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 000000000..4cda17440
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,4 @@
+#Fri Oct 07 16:14:33 CEST 2011
+eclipse.preferences.version=1
+formatter_profile=_Target Explorer Java STD
+formatter_settings_version=12
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/META-INF/MANIFEST.MF b/target_explorer/plugins/org.eclipse.tcf.te.ui/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..c24ac7c73
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,38 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.tcf.te.ui;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Activator: org.eclipse.tcf.te.ui.activator.UIPlugin
+Bundle-Vendor: %providerName
+Require-Bundle: org.eclipse.core.runtime;bundle-version="3.7.0",
+ org.eclipse.core.expressions;bundle-version="3.4.300",
+ org.eclipse.ui;bundle-version="3.7.0",
+ org.eclipse.ui.forms;bundle-version="3.5.100",
+ org.eclipse.help;bundle-version="3.5.100",
+ org.eclipse.tcf.te.runtime;bundle-version="1.0.0",
+ org.eclipse.tcf.te.runtime.concurrent;bundle-version="1.0.0",
+ org.eclipse.tcf.te.runtime.model;bundle-version="1.0.0",
+ org.eclipse.tcf.te.runtime.statushandler;bundle-version="1.0.0",
+ org.eclipse.tcf.te.core;bundle-version="1.0.0",
+ org.eclipse.tcf.te.ui.swt;bundle-version="1.0.0",
+ org.eclipse.tcf.te.ui.forms;bundle-version="1.0.0"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-ActivationPolicy: lazy
+Bundle-Localization: plugin
+Export-Package: org.eclipse.tcf.te.ui,
+ org.eclipse.tcf.te.ui.activator,
+ org.eclipse.tcf.te.ui.decorators.images,
+ org.eclipse.tcf.te.ui.dialogs,
+ org.eclipse.tcf.te.ui.events,
+ org.eclipse.tcf.te.ui.interfaces,
+ org.eclipse.tcf.te.ui.internal.executors;x-internal:=true,
+ org.eclipse.tcf.te.ui.nls,
+ org.eclipse.tcf.te.ui.statushandler,
+ org.eclipse.tcf.te.ui.tables,
+ org.eclipse.tcf.te.ui.tables.properties,
+ org.eclipse.tcf.te.ui.trees,
+ org.eclipse.tcf.te.ui.wizards,
+ org.eclipse.tcf.te.ui.wizards.interfaces,
+ org.eclipse.tcf.te.ui.wizards.newWizard,
+ org.eclipse.tcf.te.ui.wizards.pages
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/build.properties b/target_explorer/plugins/org.eclipse.tcf.te.ui/build.properties
new file mode 100644
index 000000000..2b24d2258
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/build.properties
@@ -0,0 +1,8 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.properties,\
+ plugin.xml,\
+ icons/
+src.includes = schema/
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/icons/dlcl16/newtarget_wiz.gif b/target_explorer/plugins/org.eclipse.tcf.te.ui/icons/dlcl16/newtarget_wiz.gif
new file mode 100644
index 000000000..5d9eae9e5
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/icons/dlcl16/newtarget_wiz.gif
Binary files differ
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/icons/elcl16/newtarget_wiz.gif b/target_explorer/plugins/org.eclipse.tcf.te.ui/icons/elcl16/newtarget_wiz.gif
new file mode 100644
index 000000000..9f2b4acc7
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/icons/elcl16/newtarget_wiz.gif
Binary files differ
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/icons/ovr16/busy.gif b/target_explorer/plugins/org.eclipse.tcf.te.ui/icons/ovr16/busy.gif
new file mode 100644
index 000000000..b53591825
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/icons/ovr16/busy.gif
Binary files differ
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/icons/ovr16/gold_ovr.gif b/target_explorer/plugins/org.eclipse.tcf.te.ui/icons/ovr16/gold_ovr.gif
new file mode 100644
index 000000000..a05073c2f
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/icons/ovr16/gold_ovr.gif
Binary files differ
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/icons/ovr16/green_ovr.gif b/target_explorer/plugins/org.eclipse.tcf.te.ui/icons/ovr16/green_ovr.gif
new file mode 100644
index 000000000..35ed218ad
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/icons/ovr16/green_ovr.gif
Binary files differ
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/icons/ovr16/grey_ovr.gif b/target_explorer/plugins/org.eclipse.tcf.te.ui/icons/ovr16/grey_ovr.gif
new file mode 100644
index 000000000..3f5fb9f6f
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/icons/ovr16/grey_ovr.gif
Binary files differ
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/icons/ovr16/redX_ovr.gif b/target_explorer/plugins/org.eclipse.tcf.te.ui/icons/ovr16/redX_ovr.gif
new file mode 100644
index 000000000..8fa687bb2
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/icons/ovr16/redX_ovr.gif
Binary files differ
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/icons/ovr16/red_ovr.gif b/target_explorer/plugins/org.eclipse.tcf.te.ui/icons/ovr16/red_ovr.gif
new file mode 100644
index 000000000..ea5aaa545
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/icons/ovr16/red_ovr.gif
Binary files differ
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/icons/wizban/newtarget_wiz.gif b/target_explorer/plugins/org.eclipse.tcf.te.ui/icons/wizban/newtarget_wiz.gif
new file mode 100644
index 000000000..6a4a5ef6b
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/icons/wizban/newtarget_wiz.gif
Binary files differ
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/plugin.properties b/target_explorer/plugins/org.eclipse.tcf.te.ui/plugin.properties
new file mode 100644
index 000000000..0d7e06546
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/plugin.properties
@@ -0,0 +1,35 @@
+##################################################################################
+# Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved.
+# This program and the accompanying materials are made available under the terms
+# of the Eclipse Public License v1.0 which accompanies this distribution, and is
+# available at http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# Wind River Systems - initial API and implementation
+##################################################################################
+
+pluginName = Target Explorer, Common UI and Helper
+providerName = Eclipse.org
+
+# ***** Wizards *****
+
+NewWizards.category.name=General
+
+# ***** Context and binding contributions *****
+
+context.targetexplorer.name=In Target Explorer
+context.targetexplorer.description=The Target Explorer view is active
+
+# ***** Command contributions *****
+Command.category.name=Target Explorer Commands
+
+Command.newWizards.name=New Target
+Command.newWizards.description=Open the New target wizard
+
+# ***** Status Handler *****
+
+DefaultStatusHandler.label=Default Status Handler
+
+# ***** Executors / Executor Utility Delegates *****
+
+SWTDisplayExecutorUtilDelegate.label=SWT Display Executor Utility Delegate
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/plugin.xml b/target_explorer/plugins/org.eclipse.tcf.te.ui/plugin.xml
new file mode 100644
index 000000000..8f52d609b
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/plugin.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+ <extension-point id="newWizards" name="New Target Wizards" schema="schema/newWizards.exsd"/>
+
+<!-- New target wizard contributions -->
+
+ <extension point="org.eclipse.tcf.te.ui.newWizards">
+ <category
+ id="org.eclipse.tcf.te.ui.newWizards.category.general"
+ name="%NewWizards.category.name">
+ </category>
+ </extension>
+
+<!-- Command contributions -->
+ <extension point="org.eclipse.ui.commands">
+ <category
+ id="org.eclipse.tcf.te.ui.commands.category"
+ name="%Command.category.name">
+ </category>
+
+ <command
+ categoryId="org.eclipse.tcf.te.ui.commands.category"
+ defaultHandler="org.eclipse.tcf.te.ui.wizards.newWizard.NewWizardCommandHandler"
+ description="%Command.newWizards.description"
+ helpContextId="org.eclipse.tcf.te.ui.command.newWizards"
+ id="org.eclipse.tcf.te.ui.command.newWizards"
+ name="%Command.newWizards.name">
+ </command>
+ </extension>
+
+<!-- Command image contributions -->
+ <extension point="org.eclipse.ui.commandImages">
+ <image
+ commandId="org.eclipse.tcf.te.ui.command.newWizards"
+ disabledIcon="icons/dlcl16/newtarget_wiz.gif"
+ icon="icons/elcl16/newtarget_wiz.gif">
+ </image>
+ </extension>
+
+<!-- Context and binding contributions -->
+ <extension point="org.eclipse.ui.contexts">
+ <context
+ description="%context.targetexplorer.description"
+ id="org.eclipse.tcf.te.ui.views.TargetExplorer"
+ name="%context.targetexplorer.name"
+ parentId="org.eclipse.ui.contexts.window">
+ </context>
+ </extension>
+
+ <extension point="org.eclipse.ui.bindings">
+ <key
+ commandId="org.eclipse.tcf.te.ui.command.newWizards"
+ contextId="org.eclipse.tcf.te.ui.views.TargetExplorer"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="M1+N">
+ </key>
+ </extension>
+
+<!-- Status handler contributions -->
+ <extension point="org.eclipse.tcf.te.runtime.statushandler.handlers">
+ <handler
+ class="org.eclipse.tcf.te.ui.statushandler.DefaultStatusHandler"
+ id="org.eclipse.tcf.te.statushandler.default"
+ label="%DefaultStatusHandler.label">
+ </handler>
+ </extension>
+
+<!-- Executor service contributions -->
+ <extension point="org.eclipse.tcf.te.runtime.concurrent.executorServices">
+ <executorService
+ id="org.eclipse.tcf.te.ui.executors.SWTDisplay"
+ label="Eclipse Platform Display Executor"
+ class="org.eclipse.tcf.te.ui.internal.executors.SWTDisplayExecutor">
+ </executorService>
+ </extension>
+
+<!-- Executor utility delegate contributions -->
+ <extension point="org.eclipse.tcf.te.runtime.concurrent.executorUtilDelegates">
+ <executorUtilDelegate
+ class="org.eclipse.tcf.te.ui.internal.executors.SWTDisplayExecutorUtilDelegate"
+ id="org.eclipse.tcf.te.ui.executors.delegate.SWTDisplay"
+ label="%SWTDisplayExecutorUtilDelegate.label">
+ </executorUtilDelegate>
+ </extension>
+
+</plugin>
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/pom.xml b/target_explorer/plugins/org.eclipse.tcf.te.ui/pom.xml
new file mode 100644
index 000000000..bb00f6d66
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/pom.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+ xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.tcf</groupId>
+ <artifactId>tcf-parent</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <relativePath>../../../pom.xml</relativePath>
+ </parent>
+
+ <version>1.0.0.qualifier</version>
+ <artifactId>org.eclipse.tcf.te.ui</artifactId>
+ <packaging>eclipse-plugin</packaging>
+</project>
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/schema/newWizards.exsd b/target_explorer/plugins/org.eclipse.tcf.te.ui/schema/newWizards.exsd
new file mode 100644
index 000000000..0a92ad1f0
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/schema/newWizards.exsd
@@ -0,0 +1,220 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.tcf.te.ui" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appinfo>
+ <meta.schema plugin="org.eclipse.tcf.te.ui" id="newWizards" name="New Target Wizards"/>
+ </appinfo>
+ <documentation>
+ This extension point is used to register target creation wizard extensions. Target creation wizards appear as choices within the &quot;New Target&quot; dialog, and are used to create target definitions. Target creation wizards can be organized in categories. Uncategorized wizards or wizards with invalid category paths will be sorted in as non-categorized root element.
+&lt;p&gt;
+Target creation wizards may optionally specify a description subelement whose body should contain short text about the wizard.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appinfo>
+ <meta.element />
+ </appinfo>
+ </annotation>
+ <complexType>
+ <choice>
+ <element ref="category" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="wizard" minOccurs="0" maxOccurs="unbounded"/>
+ </choice>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+ a fully qualified identifier of the target extension point
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+ an optional identifier of the extension instance
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+ an optional name of the extension instance
+ </documentation>
+ <appinfo>
+ <meta.attribute translatable="true"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="category">
+ <complexType>
+ <attribute name="id" type="string" use="required">
+ <annotation>
+ <documentation>
+ a unique name that can be used to identify this category
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string" use="required">
+ <annotation>
+ <documentation>
+ a translatable name of the category that will be used in the dialog box
+ </documentation>
+ <appinfo>
+ <meta.attribute translatable="true"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ <attribute name="parentCategory" type="string">
+ <annotation>
+ <documentation>
+ a path to another category if this category should be added as a child
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="identifier" basedOn="org.eclipse.tcf.te.ui.newWizards/category/@id"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="wizard">
+ <complexType>
+ <sequence>
+ <element ref="description" minOccurs="0" maxOccurs="1"/>
+ </sequence>
+ <attribute name="id" type="string" use="required">
+ <annotation>
+ <documentation>
+ a unique id that can be used to identify this wizard
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string" use="required">
+ <annotation>
+ <documentation>
+ a translatable name of the wizard that will be used in the UI
+ </documentation>
+ <appinfo>
+ <meta.attribute translatable="true"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ <attribute name="icon" type="string">
+ <annotation>
+ <documentation>
+ a relative path of an icon that will be used together with the name to represent the wizard as one of the choices in the creation dialog box.
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="resource"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ <attribute name="category" type="string">
+ <annotation>
+ <documentation>
+ a slash-delimited path (&apos;/&apos;) of category IDs. Each token in the path must represent a valid category ID previously defined by this or some other plug-in. If omitted, the wizard will be added to the &quot;Other&quot; category.
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+ a fully qualified name of the Java class implementing &lt;samp&gt;org.eclipse.ui.IWorkbenchWizard&lt;/samp&gt;.
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.jface.wizard.Wizard:org.eclipse.ui.IWorkbenchWizard"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ <attribute name="canFinishEarly" type="boolean">
+ <annotation>
+ <documentation>
+ whether the wizard is capable of finishing without ever showing pages to the user.
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="hasPages" type="boolean">
+ <annotation>
+ <documentation>
+ whether the wizard provides any pages.
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="description" type="string">
+ <annotation>
+ <appinfo>
+ <meta.element translatable="true"/>
+ </appinfo>
+ <documentation>
+ an optional subelement whose body contains a short text describing what the wizard will do when started
+ </documentation>
+ </annotation>
+ </element>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="since"/>
+ </appinfo>
+ <documentation>
+ Target Explorer 1.0.0
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="examples"/>
+ </appinfo>
+ <documentation>
+ The following is an example of this extension point&apos;s usage:
+
+&lt;p&gt;
+&lt;pre&gt;
+ &lt;extension point=&quot;org.eclipse.tcf.te.ui.newWizards&quot;&gt;
+ &lt;category id=&quot;org.eclipse.tcf.te.ui.newWizards.category&quot;
+ name=&quot;General&quot;/&gt;
+ &lt;wizard
+ categoryId=&quot;org.eclipse.tcf.te.ui.newWizards.category&quot;
+ class=&quot;org.eclipse.tcf.te.tcf.ui.internal.wizards.NewTargetWizard&quot;
+ id=&quot;org.eclipse.tcf.te.tcf.ui.wizards.NewTargetWizard&quot;
+ name=&quot;TCF Target&quot;&gt;
+ &lt;/wizard&gt;
+ &lt;/extension&gt;
+&lt;/pre&gt;
+&lt;/p&gt;
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="apiinfo"/>
+ </appinfo>
+ <documentation>
+ The provider of a new target creation wizard must implement &lt;samp&gt;org.eclipse.ui.IWorkbenchWizard&lt;/samp&gt;.
+ </documentation>
+ </annotation>
+
+
+ <annotation>
+ <appinfo>
+ <meta.section type="copyright"/>
+ </appinfo>
+ <documentation>
+ Copyright (c) 2011 Wind River Systems, Inc. and others.
+
+All rights reserved.
+
+This program and the accompanying materials are made available under the terms
+of the Eclipse Public License v1.0 which accompanies this distribution, and is
+available at http://www.eclipse.org/legal/epl-v10.html.
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/AbstractViewerComparator.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/AbstractViewerComparator.java
new file mode 100644
index 000000000..d15212989
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/AbstractViewerComparator.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerComparator;
+
+/**
+ * Common viewer comparator implementation.
+ */
+public abstract class AbstractViewerComparator extends ViewerComparator {
+ // Reference to the viewer
+ private final Viewer viewer;
+
+ /**
+ * Constructor.
+ *
+ * @param viewer The parent viewer. Must not be <code>null</code>.
+ */
+ public AbstractViewerComparator(Viewer viewer) {
+ Assert.isNotNull(viewer);
+ this.viewer = viewer;
+ }
+
+ /**
+ * Returns the parent viewer instance.
+ *
+ * @return The parent viewer instance.
+ */
+ protected final Viewer getParentViewer() {
+ return viewer;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+ */
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ if (viewer != null && viewer.getControl() != null && !viewer.getControl().isDisposed()) {
+ return doCompare(e1, e2, doGetSortColumnLabel(viewer), doGetSortColumnIndex(viewer) , doDetermineInverter(viewer));
+ }
+ return super.compare(viewer, e1, e2);
+ }
+
+ /* (non-Javadoc)
+ * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
+ */
+ public int compare(Object o1, Object o2) {
+ return doCompare(o1, o2, null, -1, doDetermineInverter(getParentViewer()));
+ }
+
+ /**
+ * Compare the given nodes by the given sort column and inverter.
+ *
+ * @param node1 The first node or <code>null</code>.
+ * @param node2 The second node or <code>null</code>.
+ * @param sortColumn The sort column text or <code>null</code>.
+ * @param index The sort column index or <code>-1</code>.
+ * @param inverter The inverter.
+ *
+ * @return The compare result.
+ */
+ protected abstract int doCompare(Object node1, Object node2, String sortColumn, int index, int inverter);
+
+ /**
+ * Returns the text to compare for the given node and column index.
+ *
+ * @param node The node or <code>null</code>.
+ * @param index The column index or <code>-1</code>.
+ *
+ * @return The text for the given node and column index or <code>null</code>.
+ */
+ protected abstract String doGetText(Object node, int index);
+
+ /**
+ * Determine if or if not the sort direction needs to be inverted.
+ *
+ * @param viewer The viewer or <code>null</code>.
+ * @return <code>1</code> for original sort order, or <code>-1</code> for inverted sort order.
+ */
+ protected abstract int doDetermineInverter(Viewer viewer);
+
+ /**
+ * Return the label of the sort column of the given viewer.
+ *
+ * @param viewer The viewer or <code>null</code>.
+ * @return The label of the sort column or an empty string.
+ */
+ protected abstract String doGetSortColumnLabel(Viewer viewer);
+
+ /**
+ * Return the index of the sort column of the given viewer.
+ *
+ * @param viewer The viewer or <code>null</code>.
+ * @return The index of the sort column or <code>-1</code>.
+ */
+ protected abstract int doGetSortColumnIndex(Viewer viewer);
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/WorkbenchPartControl.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/WorkbenchPartControl.java
new file mode 100644
index 000000000..a205cc449
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/WorkbenchPartControl.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.PlatformObject;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.tcf.te.ui.activator.UIPlugin;
+import org.eclipse.tcf.te.ui.forms.CustomFormToolkit;
+import org.eclipse.ui.ISelectionService;
+import org.eclipse.ui.IWorkbenchPart;
+
+
+/**
+ * Common workbench part control implementation.
+ */
+public class WorkbenchPartControl extends PlatformObject {
+ /**
+ * Reference to the parent workbench part the control might be embedded in.
+ */
+ private final IWorkbenchPart parentPart;
+
+ /**
+ * Reference to the form toolkit instance provided via {@link #setupFormPanel(Composite, CustomFormToolkit)}.
+ */
+ private CustomFormToolkit formToolkit = null;
+
+ /**
+ * Reference to the parent control.
+ */
+ private Composite parentControl;
+
+ /**
+ * Constructor.
+ */
+ public WorkbenchPartControl() {
+ this(null);
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param parentPart The parent workbench part this control is embedded in or <code>null</code>.
+ */
+ public WorkbenchPartControl(IWorkbenchPart parentPart) {
+ super();
+ this.parentPart = parentPart;
+ }
+
+ /**
+ * Returns the parent workbench part the control might be embedded in.
+ *
+ * @return The parent workbench part or <code>null</code>.
+ */
+ public final IWorkbenchPart getParentPart() {
+ return parentPart;
+ }
+
+ /**
+ * Returns if the <code>setupPanel(...)</code> method has been called at least once with
+ * a non-null parent control.
+ *
+ * @return <code>true</code> if the associated parent control is not <code>null</code>, <code>false</code> otherwise.
+ */
+ public final boolean isControlCreated() {
+ return (parentControl != null);
+ }
+
+ /**
+ * Returns the parent control of the control.
+ *
+ * @return The parent control or <code>null</code>.
+ */
+ public final Composite getParentControl() {
+ return parentControl;
+ }
+
+ /**
+ * Cleanup all resources the control might have been created.
+ */
+ public void dispose() {
+ parentControl = null;
+ }
+
+ /**
+ * Creates the controls UI elements.
+ *
+ * @param parent The parent composite. Must not be <code>null</code>.
+ * @param toolkit The {@link CustomFormToolkit} instance. Must not be <code>null</code>.
+ */
+ public void setupFormPanel(Composite parent, CustomFormToolkit toolkit) {
+ Assert.isNotNull(parent);
+ Assert.isNotNull(toolkit);
+
+ parentControl = parent;
+ formToolkit = toolkit;
+ }
+
+ /**
+ * Returns the associated form toolkit instance.
+ *
+ * @return The form toolkit instance or <code>null</code> if not initialized yet.
+ */
+ protected final CustomFormToolkit getFormToolkit() {
+ return formToolkit;
+ }
+
+ /**
+ * Returns the selection service of the workbench.
+ *
+ * @return The selection service or <code>null</code>.
+ */
+ protected final ISelectionService getSelectionService() {
+ ISelectionService selectionService = null;
+ // Check if plugin, workbench and active workbench window are still valid
+ if (UIPlugin.getDefault() != null && UIPlugin.getDefault().getWorkbench() != null
+ && UIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow() != null) {
+ selectionService = UIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getSelectionService();
+ }
+ return selectionService;
+ }
+
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/activator/UIPlugin.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/activator/UIPlugin.java
new file mode 100644
index 000000000..b578b08d1
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/activator/UIPlugin.java
@@ -0,0 +1,134 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.activator;
+
+import java.net.URL;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.tcf.te.ui.interfaces.ImageConsts;
+import org.eclipse.tcf.te.runtime.tracing.TraceHandler;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class UIPlugin extends AbstractUIPlugin {
+ // The shared instance
+ private static UIPlugin plugin;
+ // The trace handler instance
+ private static TraceHandler traceHandler;
+
+ /**
+ * The constructor
+ */
+ public UIPlugin() {
+ }
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static UIPlugin getDefault() {
+ return plugin;
+ }
+
+ /**
+ * Convenience method which returns the unique identifier of this plugin.
+ */
+ public static String getUniqueIdentifier() {
+ if (getDefault() != null && getDefault().getBundle() != null) {
+ return getDefault().getBundle().getSymbolicName();
+ }
+ return null;
+ }
+
+ /**
+ * Returns the bundles trace handler.
+ *
+ * @return The bundles trace handler.
+ */
+ public static TraceHandler getTraceHandler() {
+ if (traceHandler == null) {
+ traceHandler = new TraceHandler(getUniqueIdentifier());
+ }
+ return traceHandler;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+ */
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+ */
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ super.stop(context);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#initializeImageRegistry(org.eclipse.jface.resource.ImageRegistry)
+ */
+ @Override
+ protected void initializeImageRegistry(ImageRegistry registry) {
+ URL url = UIPlugin.getDefault().getBundle().getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_WIZBAN + "newtarget_wiz.gif"); //$NON-NLS-1$
+ registry.put(ImageConsts.NEW_TARGET_WIZARD, ImageDescriptor.createFromURL(url));
+
+ url = UIPlugin.getDefault().getBundle().getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_DLCL + "newtarget_wiz.gif"); //$NON-NLS-1$
+ registry.put(ImageConsts.NEW_TARGET_WIZARD_DISABLED, ImageDescriptor.createFromURL(url));
+ url = UIPlugin.getDefault().getBundle().getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_ELCL + "newtarget_wiz.gif"); //$NON-NLS-1$
+ registry.put(ImageConsts.NEW_TARGET_WIZARD_ENABLED, ImageDescriptor.createFromURL(url));
+
+ url = UIPlugin.getDefault().getBundle().getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_OVR + "gold_ovr.gif"); //$NON-NLS-1$
+ registry.put(ImageConsts.GOLD_OVR, ImageDescriptor.createFromURL(url));
+ url = UIPlugin.getDefault().getBundle().getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_OVR + "green_ovr.gif"); //$NON-NLS-1$
+ registry.put(ImageConsts.GREEN_OVR, ImageDescriptor.createFromURL(url));
+ url = UIPlugin.getDefault().getBundle().getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_OVR + "grey_ovr.gif"); //$NON-NLS-1$
+ registry.put(ImageConsts.GREY_OVR, ImageDescriptor.createFromURL(url));
+ url = UIPlugin.getDefault().getBundle().getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_OVR + "red_ovr.gif"); //$NON-NLS-1$
+ registry.put(ImageConsts.RED_OVR, ImageDescriptor.createFromURL(url));
+ url = UIPlugin.getDefault().getBundle().getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_OVR + "redX_ovr.gif"); //$NON-NLS-1$
+ registry.put(ImageConsts.RED_X_OVR, ImageDescriptor.createFromURL(url));
+ url = UIPlugin.getDefault().getBundle().getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_OVR + "busy.gif"); //$NON-NLS-1$
+ registry.put(ImageConsts.BUSY_OVR, ImageDescriptor.createFromURL(url));
+ }
+
+ /**
+ * Loads the image registered under the specified key from the image
+ * registry and returns the <code>Image</code> object instance.
+ *
+ * @param key The key the image is registered with.
+ * @return The <code>Image</code> object instance or <code>null</code>.
+ */
+ public static Image getImage(String key) {
+ return getDefault().getImageRegistry().get(key);
+ }
+
+ /**
+ * Loads the image registered under the specified key from the image
+ * registry and returns the <code>ImageDescriptor</code> object instance.
+ *
+ * @param key The key the image is registered with.
+ * @return The <code>ImageDescriptor</code> object instance or <code>null</code>.
+ */
+ public static ImageDescriptor getImageDescriptor(String key) {
+ return getDefault().getImageRegistry().getDescriptor(key);
+ }
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/decorators/images/ConnectableImageDescriptor.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/decorators/images/ConnectableImageDescriptor.java
new file mode 100644
index 000000000..921231702
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/decorators/images/ConnectableImageDescriptor.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.decorators.images;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.tcf.te.ui.interfaces.ImageConsts;
+import org.eclipse.tcf.te.core.model.interfaces.IConnectable;
+import org.eclipse.tcf.te.runtime.model.interfaces.IModelNode;
+import org.eclipse.tcf.te.ui.jface.images.AbstractImageDescriptor;
+
+
+/**
+ * Connectable node image descriptor implementation.
+ */
+public class ConnectableImageDescriptor extends AbstractImageDescriptor {
+ // the base image to decorate with overlays
+ private Image baseImage;
+ // the image size
+ private Point imageSize;
+
+ // Flags representing the object states to decorate
+ private int connectState;
+ private int connectSubState;
+ private boolean pending;
+
+ /**
+ * Constructor.
+ *
+ * @param registry The image registry. Must not be <code>null</code>.
+ * @param baseImage The base image. Must not be <code>null</code>.
+ * @param node The connectable node. Must not be <code>null</code>.
+ */
+ public ConnectableImageDescriptor(final ImageRegistry registry, final Image baseImage, final IConnectable node) {
+ super(registry);
+
+ Assert.isNotNull(baseImage);
+ this.baseImage = baseImage;
+ imageSize = new Point(baseImage.getImageData().width, baseImage.getImageData().height);
+
+ // invoke initialize
+ invokeInitialize(node);
+
+ // build up the key for the image registry
+ defineKey(baseImage.hashCode());
+ }
+
+ /**
+ * Invoke the initialize method.
+ * <p>
+ * Called from the constructor to initialize the image descriptor. Sub classes
+ * can overwrite this method to implement necessary thread-safety.
+ *
+ * @param node The connectable node. Must not be <code>null</code>.
+ */
+ protected void invokeInitialize(IConnectable node) {
+ Assert.isNotNull(node);
+ initialize(node);
+ }
+
+ /**
+ * Initialize the image descriptor from the connectable node.
+ *
+ * @param node The target node. Must not be <code>null</code>.
+ */
+ protected void initialize(IConnectable node) {
+ Assert.isNotNull(node);
+
+ connectState = node.getConnectState();
+ connectSubState = node.getConnectSubState();
+ pending = node instanceof IModelNode ? ((IModelNode)node).isPending() : false;
+ }
+
+ protected void defineKey(int hashCode) {
+ String key = "CNID:" + //$NON-NLS-1$
+ hashCode + ":" + //$NON-NLS-1$
+ connectState + ":" + //$NON-NLS-1$
+ connectSubState + ":" + //$NON-NLS-1$
+ pending;
+
+ setDecriptorKey(key);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.resource.CompositeImageDescriptor#drawCompositeImage(int, int)
+ */
+ @Override
+ protected void drawCompositeImage(int width, int height) {
+ drawCentered(baseImage, width, height);
+
+ if (pending || (connectState == IConnectable.STATE_UNREACHABLE && (connectSubState == IConnectable.SUB_STATE_REBOOT_MANUAL))) {
+ drawTopLeft(ImageConsts.BUSY_OVR);
+ }
+
+ if (connectState == IConnectable.STATE_CONNECTING || connectState == IConnectable.STATE_DISCONNECTING) {
+ drawBottomRight(ImageConsts.GOLD_OVR);
+ } else if (connectState == IConnectable.STATE_UNREACHABLE) {
+ drawBottomRight(ImageConsts.RED_OVR);
+ } else if (connectState == IConnectable.STATE_CONNECTED) {
+ drawBottomRight(ImageConsts.GREEN_OVR);
+ } else if (connectState == IConnectable.STATE_UNCONNECTED) {
+ drawBottomRight(ImageConsts.GREY_OVR);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.resource.CompositeImageDescriptor#getSize()
+ */
+ @Override
+ protected Point getSize() {
+ return imageSize;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.ui.jface.images.AbstractImageDescriptor#getBaseImage()
+ */
+ @Override
+ protected Image getBaseImage() {
+ return baseImage;
+ }
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/dialogs/NameValuePairDialog.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/dialogs/NameValuePairDialog.java
new file mode 100644
index 000000000..8620c26ed
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/dialogs/NameValuePairDialog.java
@@ -0,0 +1,204 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.dialogs;
+
+import java.util.Set;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.tcf.te.ui.interfaces.IContextHelpIds;
+import org.eclipse.tcf.te.ui.nls.Messages;
+import org.eclipse.tcf.te.ui.jface.dialogs.CustomTitleAreaDialog;
+import org.eclipse.tcf.te.ui.swt.SWTControlUtil;
+
+/**
+ * Dialog implementation allowing to enter the data for name/value pairs.
+ */
+public class NameValuePairDialog extends CustomTitleAreaDialog {
+
+ private String name;
+ private String value;
+
+ private String dialogTitle;
+ private String title;
+ private String message;
+ private String[] fieldLabels;
+ private String[] initialValues;
+ private Set<String> usedNames;
+
+ private Text nameText;
+ private Text valueText;
+
+ /**
+ * Constructor.
+ *
+ * @param shell The parent shell or <code>null</code>.
+ * @param dialogTitle The dialog title. Must not be <code>null</code>.
+ * @param title The title. Must not be <code>null</code>.
+ * @param message The dialogs default message. Must not be <code>null</code>.
+ * @param fieldLabels The field labels. Must not be <code>null</code>.
+ * @param initialValues The field initial values. Must not be <code>null</code>.
+ * @param usedNames The list of used names. Must not be <code>null</code>.
+ */
+ public NameValuePairDialog(Shell shell, String dialogTitle, String title, String message, String[] fieldLabels, String[] initialValues, Set<String> usedNames) {
+ super(shell, IContextHelpIds.NAME_VALUE_PAIR_DIALOG);
+
+ Assert.isNotNull(dialogTitle);
+ Assert.isNotNull(title);
+ Assert.isNotNull(message);
+ Assert.isNotNull(fieldLabels);
+ Assert.isNotNull(initialValues);
+ Assert.isNotNull(usedNames);
+
+ this.dialogTitle = dialogTitle;
+ this.title = title;
+ this.message = message;
+ this.fieldLabels = fieldLabels;
+ this.initialValues = initialValues;
+ this.usedNames = usedNames;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.ui.jface.dialogs.CustomTitleAreaDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ Composite top = (Composite)super.createDialogArea(parent);
+
+ setDialogTitle(dialogTitle);
+ setTitle(title);
+ setDefaultMessage(message, IMessageProvider.NONE);
+
+ Composite panel = new Composite(top, SWT.NONE);
+ panel.setLayout(new GridLayout(2, false));
+ panel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+
+ Label label = new Label(panel, SWT.NONE);
+ label.setText(fieldLabels[0]);
+
+ nameText = new Text(panel, SWT.BORDER | SWT.SINGLE);
+ nameText.setText(initialValues[0]);
+ GridData layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false);
+ layoutData.widthHint = 300;
+ nameText.setLayoutData(layoutData);
+ nameText.addModifyListener(new ModifyListener() {
+ @Override
+ public void modifyText(ModifyEvent e) {
+ updateButtons();
+ }
+ });
+
+ label = new Label(panel, SWT.NONE);
+ label.setText(fieldLabels[1]);
+
+ valueText = new Text(panel, SWT.BORDER | SWT.SINGLE);
+ valueText.setText(initialValues[1]);
+ layoutData = new GridData(GridData.FILL_HORIZONTAL);
+ layoutData.widthHint = 300;
+ valueText.setLayoutData(layoutData);
+ valueText.addModifyListener(new ModifyListener() {
+ @Override
+ public void modifyText(ModifyEvent e) {
+ updateButtons();
+ }
+ });
+
+ applyDialogFont(panel);
+ return panel;
+ }
+
+ /**
+ * Return the name/value pair entered in this dialog.
+ * <p>
+ * If the cancel button was hit, both will be <code>null</code>.
+ */
+ public String[] getNameValuePair() {
+ return new String[] { name, value };
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.ui.jface.dialogs.CustomTitleAreaDialog#create()
+ */
+ @Override
+ public void create() {
+ super.create();
+ updateButtons();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.dialogs.Dialog#buttonPressed(int)
+ */
+ @Override
+ protected void buttonPressed(int buttonId) {
+ if (buttonId == IDialogConstants.OK_ID) {
+ name= SWTControlUtil.getText(nameText).trim();
+ value = SWTControlUtil.getText(valueText).trim();
+ } else {
+ name = null;
+ value = null;
+ }
+ super.buttonPressed(buttonId);
+ }
+
+ /**
+ * Enable the OK button if valid input
+ */
+ protected void updateButtons() {
+ String name = SWTControlUtil.getText(nameText).trim();
+ String value = SWTControlUtil.getText(valueText).trim();
+
+ if (name.trim().length() == 0) {
+ setMessage(getErrorMissingName(), IMessageProvider.INFORMATION);
+ }
+ else if (usedNames.contains(name.trim())) {
+ setMessage(NLS.bind(getErrorUsedOrIllegalName(), name), IMessageProvider.ERROR);
+ }
+ else if (value.trim().length() == 0) {
+ setMessage(NLS.bind(getErrorMissingValue(), name), IMessageProvider.INFORMATION);
+ }
+ else {
+ setMessage(message, IMessageProvider.NONE);
+ }
+ getButton(IDialogConstants.OK_ID).setEnabled(getMessageType() == IMessageProvider.NONE);
+ }
+
+ /**
+ * Returns the text to show as missing name error.
+ */
+ protected String getErrorMissingName() {
+ return Messages.NameValuePairDialog_missingName_error;
+ }
+
+ /**
+ * Returns the text to show as used or illegal name error.
+ */
+ protected String getErrorUsedOrIllegalName() {
+ return Messages.NameValuePairDialog_usedOrIllegalName_error;
+ }
+
+ /**
+ * Returns the text to show as missing value error.
+ */
+ protected String getErrorMissingValue() {
+ return Messages.NameValuePairDialog_missingValue_error;
+ }
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/dialogs/RenameDialog.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/dialogs/RenameDialog.java
new file mode 100644
index 000000000..5690fee4a
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/dialogs/RenameDialog.java
@@ -0,0 +1,143 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.dialogs;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.tcf.te.ui.jface.dialogs.CustomTitleAreaDialog;
+
+/**
+ * Rename dialog implementation.
+ */
+public class RenameDialog extends CustomTitleAreaDialog {
+
+ private String title;
+ /* default */ String defaultMessage;
+ /* default */ String usedErrorMessage;
+ /* default */ String formatErrorMessage;
+ private String label;
+ /* default */ String formatRegex;
+ private String oldName;
+ private String newName;
+ /* default */ List<String> usedNames;
+
+ /* default */ Text name;
+
+ /**
+ * Constructor.
+ *
+ * @param parent The parent shell.
+ * @param title The title for the dialog.
+ * @param defaultMessage The default info message for the dialog.
+ * @param usedErrorMessage The error message if the name is already in use.
+ * @param formatErrorMessage The error message if the format of the name is illegal.
+ * @param label The label for the entry field.
+ * @param oldName The original name.
+ * @param formatRegex The format regular expression.
+ * @param usedNames The list of used or reserved names.
+ * @param contextHelpId The context help id.
+ */
+ public RenameDialog(Shell parent, String title, String defaultMessage, String usedErrorMessage, String formatErrorMessage,
+ String label, String oldName, String formatRegex, String[] usedNames, String contextHelpId) {
+ super(parent, contextHelpId);
+
+ this.title = title != null ? title : "Rename"; //$NON-NLS-1$
+ this.defaultMessage = defaultMessage != null ? defaultMessage : ""; //$NON-NLS-1$
+ this.usedErrorMessage = usedErrorMessage != null ? usedErrorMessage : ""; //$NON-NLS-1$
+ this.formatErrorMessage = formatErrorMessage != null ? formatErrorMessage : ""; //$NON-NLS-1$
+ this.formatRegex = formatRegex != null ? formatRegex : ".*"; //$NON-NLS-1$
+ this.label = label != null ? label : "Name:"; //$NON-NLS-1$
+ this.oldName = oldName != null ? oldName : ""; //$NON-NLS-1$
+ this.usedNames = usedNames != null ? Arrays.asList(usedNames) : new ArrayList<String>();
+ this.newName = this.oldName;
+ }
+
+ /*(non-Javadoc)
+ * @see org.eclipse.tcf.te.ui.dialogs.CustomTitleAreaDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ setDialogTitle(title);
+ setDefaultMessage(defaultMessage, IMessageProvider.INFORMATION);
+
+ //set margins of dialog and apply dialog font
+ Composite container = (Composite) super.createDialogArea(parent);
+ //we need two columns
+ Composite comp = new Composite(container, SWT.NONE);
+ comp.setLayout(new GridLayout(2, false));
+ comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ new Label(comp, SWT.NONE).setText(label);
+ name = new Text(comp, SWT.BORDER | SWT.SINGLE);
+ name.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ name.setText(oldName);
+ name.addModifyListener(new ModifyListener(){
+ @Override
+ public void modifyText(ModifyEvent e) {
+ if (usedNames.contains(name.getText())) {
+ setButtonEnabled(OK, false);
+ setMessage(usedErrorMessage, IMessageProvider.ERROR);
+ }
+ else if (!name.getText().matches(formatRegex)) {
+ setButtonEnabled(OK, false);
+ setMessage(formatErrorMessage, IMessageProvider.ERROR);
+ }
+ else {
+ setButtonEnabled(OK, true);
+ setMessage(defaultMessage, IMessageProvider.INFORMATION);
+ }
+ }
+ });
+
+ applyDialogFont(container);
+
+ return container;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.dialogs.TrayDialog#createButtonBar(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ protected Control createButtonBar(Composite parent) {
+ Control control = super.createButtonBar(parent);
+ setButtonEnabled(OK, false);
+ return control;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.ui.dialogs.CustomTitleAreaDialog#okPressed()
+ */
+ @Override
+ protected void okPressed() {
+ newName = name.getText();
+ super.okPressed();
+ }
+
+ /**
+ * Return the new name after OK was pressed.
+ * Unless OK was pressed, the old name is returned.
+ */
+ public String getNewName() {
+ return newName;
+ }
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/events/AbstractEventListener.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/events/AbstractEventListener.java
new file mode 100644
index 000000000..8a98c9af3
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/events/AbstractEventListener.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.events;
+
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.tcf.te.runtime.interfaces.events.IEventFireDelegate;
+import org.eclipse.tcf.te.runtime.interfaces.events.IEventListener;
+import org.eclipse.tcf.te.ui.swt.DisplayUtil;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * Abstract event listener implementation firing the event
+ * within the platforms UI thread.
+ */
+public abstract class AbstractEventListener implements IEventListener, IEventFireDelegate {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.runtime.interfaces.events.IEventFireDelegate#fire(java.lang.Runnable)
+ */
+ @Override
+ public void fire(Runnable runnable) {
+ // Do nothing if no valid runnable is passed
+ if (runnable == null) return;
+
+ // Executes the runnable asynchronously within the current platform
+ // UI thread if the platform display instance is available and not yet disposed.
+ if (PlatformUI.isWorkbenchRunning() && PlatformUI.getWorkbench().getDisplay() != null
+ && !PlatformUI.getWorkbench().getDisplay().isDisposed()) {
+ // Check if the current thread is the platform UI thread
+ if (PlatformUI.getWorkbench().getDisplay().equals(Display.getCurrent())) {
+ // We can execute the runnable directly
+ runnable.run();
+ } else {
+ // We have to execute the runnable asynchronously
+ DisplayUtil.safeAsyncExec(runnable);
+ }
+ }
+ }
+
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/interfaces/IContextHelpIds.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/interfaces/IContextHelpIds.java
new file mode 100644
index 000000000..33eb7e6fc
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/interfaces/IContextHelpIds.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.interfaces;
+
+import org.eclipse.tcf.te.ui.activator.UIPlugin;
+
+/**
+ * Context help id definitions.
+ */
+public interface IContextHelpIds {
+
+ /**
+ * UI plug-in common context help id prefix.
+ */
+ public final static String PREFIX = UIPlugin.getUniqueIdentifier() + "."; //$NON-NLS-1$
+
+ /**
+ * New target wizard context help id.
+ */
+ public final static String NEW_TARGET_WIZARD = PREFIX + "NewTargetWizard"; //$NON-NLS-1$
+
+ /**
+ * Name/value pair dialog context help id.
+ */
+ public final static String NAME_VALUE_PAIR_DIALOG = PREFIX + "NameValuePairDialog"; //$NON-NLS-1$
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/interfaces/IUIConstants.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/interfaces/IUIConstants.java
new file mode 100644
index 000000000..a089d4fe9
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/interfaces/IUIConstants.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.interfaces;
+
+import org.eclipse.tcf.te.ui.activator.UIPlugin;
+
+/**
+ * Common UI constants.
+ */
+public interface IUIConstants {
+
+ /**
+ * The Target Explorer common controls context menu id base part.
+ */
+ public static final String ID_CONTROL_MENUS_BASE = UIPlugin.getUniqueIdentifier() + ".controls"; //$NON-NLS-1$
+
+ /**
+ * The Target Explorer new target wizard selection page context help id.
+ */
+ public static final String HELP_NEW_WIZARD_SELECTION_PAGE = UIPlugin.getUniqueIdentifier() + ".NewWizardSelectionPage"; //$NON-NLS-1$
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/interfaces/ImageConsts.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/interfaces/ImageConsts.java
new file mode 100644
index 000000000..a33ff46a3
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/interfaces/ImageConsts.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.interfaces;
+
+/**
+ * Image registry constants.
+ */
+public interface ImageConsts {
+
+ // ***** The directory structure constants *****
+
+ /**
+ * The root directory where to load the images from, relative to
+ * the bundle directory.
+ */
+ public final static String IMAGE_DIR_ROOT = "icons/"; //$NON-NLS-1$
+
+ /**
+ * The directory where to load disabled local toolbar images from,
+ * relative to the image root directory.
+ */
+ public final static String IMAGE_DIR_DLCL = "dlcl16/"; //$NON-NLS-1$
+
+ /**
+ * The directory where to load enabled local toolbar images from,
+ * relative to the image root directory.
+ */
+ public final static String IMAGE_DIR_ELCL = "elcl16/"; //$NON-NLS-1$
+
+ /**
+ * The directory where to load wizard banner images from,
+ * relative to the image root directory.
+ */
+ public final static String IMAGE_DIR_WIZBAN = "wizban/"; //$NON-NLS-1$
+
+ /**
+ * The directory where to load object overlay images from,
+ * relative to the image root directory.
+ */
+ public final static String IMAGE_DIR_OVR = "ovr16/"; //$NON-NLS-1$
+
+ // ***** The image constants *****
+
+ /**
+ * The key to access the New target wizard banner image.
+ */
+ public static final String NEW_TARGET_WIZARD = "NewTargetWizard"; //$NON-NLS-1$
+
+ /**
+ * The key to access the New target wizard image (enabled).
+ */
+ public static final String NEW_TARGET_WIZARD_ENABLED = "NewTargetWizard_enabled"; //$NON-NLS-1$
+
+ /**
+ * The key to access the New target wizard image (disabled).
+ */
+ public static final String NEW_TARGET_WIZARD_DISABLED = "NewTargetWizard_disabled"; //$NON-NLS-1$
+
+ /**
+ * The key to access the target object gold overlay image.
+ */
+ public static final String GOLD_OVR = "GoldOverlay"; //$NON-NLS-1$
+
+ /**
+ * The key to access the target object green overlay image.
+ */
+ public static final String GREEN_OVR = "GreenOverlay"; //$NON-NLS-1$
+
+ /**
+ * The key to access the target object grey overlay image.
+ */
+ public static final String GREY_OVR = "GreyOverlay"; //$NON-NLS-1$
+
+ /**
+ * The key to access the target object red overlay image.
+ */
+ public static final String RED_OVR = "RedOverlay"; //$NON-NLS-1$
+
+ /**
+ * The key to access the target object red X overlay image.
+ */
+ public static final String RED_X_OVR = "RedXOverlay"; //$NON-NLS-1$
+
+ /**
+ * The key to access the target object busy state overlay image.
+ */
+ public static final String BUSY_OVR = "BusyOverlay"; //$NON-NLS-1$
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/executors/SWTDisplayExecutor.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/executors/SWTDisplayExecutor.java
new file mode 100644
index 000000000..e92f86380
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/executors/SWTDisplayExecutor.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.internal.executors;
+
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.tcf.te.ui.activator.UIPlugin;
+import org.eclipse.tcf.te.runtime.concurrent.interfaces.IExecutor;
+import org.eclipse.tcf.te.runtime.concurrent.interfaces.INestableExecutor;
+import org.eclipse.tcf.te.runtime.concurrent.interfaces.ISingleThreadedExecutor;
+import org.eclipse.tcf.te.runtime.extensions.ExecutableExtension;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * SWT display executor implementation utilizing the platform display.
+ */
+public class SWTDisplayExecutor extends ExecutableExtension implements IExecutor, ISingleThreadedExecutor, INestableExecutor {
+
+ /* (non-Javadoc)
+ * @see java.util.concurrent.Executor#execute(java.lang.Runnable)
+ */
+ @Override
+ public void execute(Runnable command) {
+ // Try the platform display first
+ if (PlatformUI.isWorkbenchRunning()
+ && PlatformUI.getWorkbench() != null && PlatformUI.getWorkbench().getDisplay() != null
+ && !PlatformUI.getWorkbench().getDisplay().isDisposed()) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(command);
+ } else {
+ // Fallback to the display associated with the current thread
+ Display display = Display.findDisplay(Thread.currentThread());
+ // If there is a display associated with the current thread,
+ // execute the runnable using that display instance.
+ if (display != null && !display.isDisposed()) {
+ display.asyncExec(command);
+ } else {
+ // There is no display to execute the runnable at.
+ // Drop execution and write a trace message if enabled
+ UIPlugin.getTraceHandler().trace("DROPPED display command invocation. No display instance found.!", 1, this); //$NON-NLS-1$
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.runtime.concurrent.interfaces.ISingleThreadedExecutor#isExecutorThread()
+ */
+ @Override
+ public boolean isExecutorThread() {
+ return isExecutorThread(Thread.currentThread());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.runtime.concurrent.interfaces.ISingleThreadedExecutor#isExecutorThread(java.lang.Thread)
+ */
+ @Override
+ public boolean isExecutorThread(Thread thread) {
+ if (thread != null) {
+ // Try the platform display first
+ if (PlatformUI.isWorkbenchRunning()
+ && PlatformUI.getWorkbench() != null && PlatformUI.getWorkbench().getDisplay() != null
+ && !PlatformUI.getWorkbench().getDisplay().isDisposed()) {
+ return thread.equals(PlatformUI.getWorkbench().getDisplay().getThread());
+ }
+
+ // Fallback to the display associated with the current thread
+ Display display = Display.findDisplay(thread);
+ if (display != null && !display.isDisposed()) {
+ return thread.equals(display.getThread());
+ }
+ }
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.runtime.concurrent.interfaces.INestableExecutor#getMaxDepth()
+ */
+ @Override
+ public int getMaxDepth() {
+ return 1;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.runtime.concurrent.interfaces.INestableExecutor#readAndExecute()
+ */
+ @Override
+ public boolean readAndExecute() {
+ // Try the platform display first
+ if (PlatformUI.isWorkbenchRunning()
+ && PlatformUI.getWorkbench() != null && PlatformUI.getWorkbench().getDisplay() != null
+ && !PlatformUI.getWorkbench().getDisplay().isDisposed()) {
+ return PlatformUI.getWorkbench().getDisplay().readAndDispatch();
+ }
+
+ // Fallback to the display associated with the current thread
+ Display display = Display.getCurrent();
+ if (display != null && !display.isDisposed()) {
+ return display.readAndDispatch();
+ }
+ return false;
+ }
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/executors/SWTDisplayExecutorUtilDelegate.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/executors/SWTDisplayExecutorUtilDelegate.java
new file mode 100644
index 000000000..1fe8bdd61
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/executors/SWTDisplayExecutorUtilDelegate.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.internal.executors;
+
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.tcf.te.runtime.concurrent.interfaces.IExecutorUtilDelegate;
+import org.eclipse.tcf.te.runtime.extensions.ExecutableExtension;
+
+/**
+ * SWT display executor utility delegate implementation.
+ */
+public class SWTDisplayExecutorUtilDelegate extends ExecutableExtension implements IExecutorUtilDelegate {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.runtime.concurrent.interfaces.IExecutorUtilDelegate#isHandledExecutorThread()
+ */
+ @Override
+ public boolean isHandledExecutorThread() {
+ return Display.getCurrent() != null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.runtime.concurrent.interfaces.IExecutorUtilDelegate#readAndDispatch()
+ */
+ @Override
+ public boolean readAndDispatch() {
+ return Display.getCurrent().readAndDispatch();
+ }
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/nls/Messages.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/nls/Messages.java
new file mode 100644
index 000000000..83925c511
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/nls/Messages.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.nls;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * Common UI plugin externalized strings management.
+ */
+public class Messages extends NLS {
+
+ // The plug-in resource bundle name
+ private static final String BUNDLE_NAME = "org.eclipse.tcf.te.ui.nls.Messages"; //$NON-NLS-1$
+
+ /**
+ * Static constructor.
+ */
+ static {
+ // Load message values from bundle file
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ // **** Declare externalized string id's down here *****
+
+ public static String NewWizard_dialog_title;
+
+ public static String NewWizardSelectionPage_title;
+ public static String NewWizardSelectionPage_description;
+ public static String NewWizardSelectionPage_wizards;
+ public static String NewWizardSelectionPage_createWizardFailed;
+
+ public static String NodePropertiesTableControl_section_title;
+ public static String NodePropertiesTableControl_section_title_noSelection;
+ public static String NodePropertiesTableControl_column_name_label;
+ public static String NodePropertiesTableControl_column_value_label;
+
+ public static String PendingOperation_label;
+
+ public static String EditBrowseTextControl_button_label;
+
+ public static String DefaultStatusHandler_question_title;
+ public static String DefaultStatusHandler_warning_title;
+ public static String DefaultStatusHandler_error_title;
+ public static String DefaultStatusHandler_information_title;
+ public static String DefaultStatusHandler_toggleMessage_doNotShowAgain;
+
+ public static String NameValuePairDialog_missingName_error;
+ public static String NameValuePairDialog_missingValue_error;
+ public static String NameValuePairDialog_usedOrIllegalName_error;
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/nls/Messages.properties b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/nls/Messages.properties
new file mode 100644
index 000000000..e506bd7d2
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/nls/Messages.properties
@@ -0,0 +1,36 @@
+#
+# org.eclipse.tcf.te.ui
+# Externalized Strings.
+#
+
+# ***** Wizards *****
+
+NewWizard_dialog_title=New Target
+
+NewWizardSelectionPage_title=Select a target wizard
+NewWizardSelectionPage_description=Please select the target creation wizard matching the target to connect to.
+NewWizardSelectionPage_wizards=Wizards:
+NewWizardSelectionPage_createWizardFailed=The selected wizard could not be started.
+
+# ***** Controls *****
+
+NodePropertiesTableControl_section_title={0} Information
+NodePropertiesTableControl_section_title_noSelection=Node
+NodePropertiesTableControl_column_name_label=Property
+NodePropertiesTableControl_column_value_label=Value
+
+PendingOperation_label=Pending...
+
+EditBrowseTextControl_button_label=Browse...
+
+DefaultStatusHandler_question_title=Question
+DefaultStatusHandler_warning_title=Warning
+DefaultStatusHandler_error_title=Error
+DefaultStatusHandler_information_title=Information
+DefaultStatusHandler_toggleMessage_doNotShowAgain=Do not show this dialog again.
+
+# ***** Dialogs *****
+
+NameValuePairDialog_missingName_error=Please enter a name.
+NameValuePairDialog_missingValue_error=Please enter a value for ''{0}''.
+NameValuePairDialog_usedOrIllegalName_error=The name ''{0}'' is reserved or already in use.
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/statushandler/DefaultStatusHandler.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/statushandler/DefaultStatusHandler.java
new file mode 100644
index 000000000..9e02d98f9
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/statushandler/DefaultStatusHandler.java
@@ -0,0 +1,295 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.statushandler;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.tcf.te.ui.activator.UIPlugin;
+import org.eclipse.tcf.te.ui.nls.Messages;
+import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer;
+import org.eclipse.tcf.te.runtime.properties.PropertiesContainer;
+import org.eclipse.tcf.te.runtime.statushandler.AbstractStatusHandler;
+import org.eclipse.tcf.te.runtime.statushandler.interfaces.IStatusHandlerConstants;
+import org.eclipse.tcf.te.runtime.utils.Host;
+import org.eclipse.tcf.te.ui.jface.dialogs.OptionalMessageDialog;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * The default status handler implementation.
+ * <p>
+ * This status handler is returned by the status handler manager if no other
+ * status handler can be found for a given context object.
+ */
+public class DefaultStatusHandler extends AbstractStatusHandler {
+ // Declare some default title messages
+ protected final static String QUESTION_TITLE = Messages.DefaultStatusHandler_question_title;
+ protected final static String WARNING_TITLE = Messages.DefaultStatusHandler_warning_title;
+ protected final static String ERROR_TITLE = Messages.DefaultStatusHandler_error_title;
+ protected final static String INFORMATION_TITLE = Messages.DefaultStatusHandler_information_title;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.runtime.statushandler.interfaces.IStatusHandler#handleStatus(org.eclipse.core.runtime.IStatus, org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer, org.eclipse.tcf.te.runtime.statushandler.interfaces.IStatusHandler.DoneHandleStatus)
+ */
+ @Override
+ public void handleStatus(final IStatus status, final IPropertiesContainer data, final DoneHandleStatus done) {
+ Assert.isNotNull(status);
+
+ // If the platform UI is not longer running or the display does not
+ // exist or is disposed already, don't do anything.
+ Display display = PlatformUI.getWorkbench().getDisplay();
+ if (!PlatformUI.isWorkbenchRunning() || display == null || display.isDisposed()) {
+ return;
+ }
+
+ // The message dialog has to open within the display thread. Check if we are in
+ // the correct display thread and spawn to it if not.
+ if (Thread.currentThread().equals(display.getThread())) {
+ // The current thread is the display thread, execute synchronously
+ doHandleStatus(status, data, done);
+ } else {
+ // The current thread is not the display, execute asynchronously
+ display.asyncExec(new Runnable() {
+ @Override
+ public void run() {
+ doHandleStatus(status, data, done != null ? done : new DoneHandleStatus() {
+ @Override
+ public void doneHandleStatus(Throwable error, IPropertiesContainer data) {
+ }
+ });
+ }
+ });
+ }
+ }
+
+ /**
+ * Execute the status handling.
+ * <p>
+ * <b>Note:</b> This method must be called within the platforms display thread.
+ *
+ * @param status The status. Must not be <code>null</code>.
+ * @param data The custom status data object, or <code>null</code> if none.
+ * @param done The callback. Must not be <code>null</code>.
+ */
+ protected void doHandleStatus(IStatus status, IPropertiesContainer data, DoneHandleStatus done) {
+ Assert.isNotNull(status);
+ Assert.isNotNull(done);
+ Assert.isTrue(Thread.currentThread().equals(PlatformUI.getWorkbench().getDisplay().getThread()));
+
+ Object result = null;
+ Throwable error = null;
+
+ try {
+ // Unpack the status object
+ String message = status.getMessage();
+ String pluginId = status.getPlugin();
+ int code = status.getCode();
+ int severity = status.getSeverity();
+ Throwable exception = status.getException();
+
+ String title = null;
+ String[] buttonLabel = null;
+ String contextHelpId = null;
+ String dontAskAgainId = null;
+ Object caller = null;
+
+ // Unpack the custom data
+ if (data != null) {
+ title = data.getStringProperty(IStatusHandlerConstants.PROPERTY_TITLE);
+ buttonLabel = (String[])data.getProperty(IStatusHandlerConstants.PROPERTY_BUTTON_LABEL);
+ contextHelpId = data.getStringProperty(IStatusHandlerConstants.PROPERTY_CONTEXT_HELP_ID);
+ dontAskAgainId = data.getStringProperty(IStatusHandlerConstants.PROPERTY_DONT_ASK_AGAIN_ID);
+ caller = data.getProperty(IStatusHandlerConstants.PROPERTY_CALLER);
+ }
+
+ if (message != null && pluginId != null) {
+ // Determine the shell (null if workbench is not running, typically for headless mode).
+ Shell shell = null;
+
+ if (PlatformUI.isWorkbenchRunning()
+ && PlatformUI.getWorkbench() != null
+ && PlatformUI.getWorkbench().getActiveWorkbenchWindow() != null
+ && PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell() != null) {
+ shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ }
+
+ // Invoke subclass hook to overwrite the severity
+ severity = adjustSeverity(severity, exception);
+ // Invoke subclass hook to overwrite the title
+ title = adjustTitle(title, severity, exception);
+ // Invoke subclass hook to overwrite the message
+ message = adjustMessage(message, severity, exception, caller);
+
+ if (Host.isInteractive() && shell != null) {
+ // we can show a real dialogs to the user. However, warnings and
+ // errors will go to the error log too. It will give us a clue later
+ // if we have to analyze the log files for possible failure scenarios.
+
+ // Use a default dialog box title in case no specific title is given.
+ if (title == null) {
+ switch (severity) {
+ case IStatusHandlerConstants.QUESTION:
+ case IStatusHandlerConstants.YES_NO_CANCEL:
+ title = QUESTION_TITLE;
+ break;
+ case IStatus.WARNING:
+ title = WARNING_TITLE;
+ break;
+ case IStatus.ERROR:
+ title = ERROR_TITLE;
+ break;
+ default:
+ title = INFORMATION_TITLE;
+ }
+ }
+
+ // In case the status represents a warning or an error,
+ // log the status to the error log.
+ if (severity == IStatus.WARNING || severity == IStatus.ERROR) {
+ UIPlugin.getDefault().getLog().log(status);
+ }
+
+ // Invoke subclass hook to overwrite the context help id.
+ String[] contextHelpIds = adjustContextHelpIds(contextHelpId, code, caller);
+ String helpContextId = (contextHelpIds.length > 0) ? contextHelpIds[0] : null;
+
+ // Show the message dialog finally
+ result = doOpenMessageDialog(shell, title, message, buttonLabel, severity, dontAskAgainId, helpContextId);
+ } else {
+ // Not interactive -> Re-pack the status and log it to the error log
+ status = new Status(severity == IStatusHandlerConstants.QUESTION ? IStatus.WARNING : severity,
+ pluginId, code, message, exception);
+ UIPlugin.getDefault().getLog().log(status);
+ }
+ }
+
+ // Fill in the result object to the custom data object
+ if (data == null && result != null) data = new PropertiesContainer();
+ if (data != null) data.setProperty(IStatusHandlerConstants.PROPERTY_RESULT, result);
+ } catch (Throwable e) {
+ error = e;
+ } finally {
+ // Invoke the callback
+ done.doneHandleStatus(error, data);
+ }
+
+ return;
+ }
+
+ /**
+ * Allows overrides to adjust the message severity based on the passed information finally
+ * before the message box will show up. The default implementation will return whatever has
+ * been passed in as proposed severity.
+ *
+ * @param proposedSeverity The proposed message severity.
+ * @param exception The associated message exception.
+ * @return The final message box title. Must not be <code>null</code>!
+ */
+ protected int adjustSeverity(int proposedSeverity, Throwable exception) {
+ return proposedSeverity;
+ }
+
+ /**
+ * Allows subclasses to adjust the message box title based on the passed information finally
+ * before the message box will show up. The default implementation will return whatever has
+ * been passed in as proposed title.
+ *
+ * @param proposedTitle The proposed message box title.
+ * @param severity The message severity.
+ * @param exception The associated message exception.
+ *
+ * @return The final message box title. Must not be <code>null</code>!
+ */
+ protected String adjustTitle(String proposedTitle, int severity, Throwable exception) {
+ return proposedTitle;
+ }
+
+ /**
+ * Allows subclasses to adjust the message box message based on the passed information finally
+ * before the message box will show up. The default implementation will return whatever has
+ * been passed in as proposed message.
+ *
+ * @param proposedMessage The proposed message box message.
+ * @param severity The message severity.
+ * @param exception The associated message exception.
+ * @param caller The caller of the status handler or <code>null</code>.
+ *
+ * @return The final message box message. Must not be <code>null</code>!
+ */
+ protected String adjustMessage(String proposedMessage, int severity, Throwable exception, Object caller) {
+ return proposedMessage;
+ }
+
+ protected final static String[] EMPTY = new String[0];
+
+ /**
+ * Allows subclasses to finally adjust the set of context help id's associated with message box. The
+ * method must allows return a non <code>null</code> value! The default implementation only transforms
+ * the proposed contextHelpId within an array.
+ * <p>
+ * Note: Only message with severity <code>ERROR</code> can have multiple context help id's associated!
+ * <p>
+ * @param proposedContextHelpId The proposed context help id.
+ * @param errorCode The associated error code.
+ * @param caller The caller of the status handler or <code>null</code>.
+ *
+ * @return An array of context help id's. Must not be <code>null</code>!
+ */
+ protected String[] adjustContextHelpIds(String proposedContextHelpId, int errorCode, Object caller) {
+ if (proposedContextHelpId == null) {
+ return EMPTY;
+ }
+ return new String[] { proposedContextHelpId };
+ }
+
+ /**
+ * Open the message dialog.
+ *
+ * @param shell The shell. Must not be <code>null</code>.
+ * @param title The title. Must not be <code>null</code>.
+ * @param message The message. Must not be <code>null</code>.
+ * @param buttonLabel An string array listing the labels of the message dialog buttons. If <code>null</code>, the default
+ * labeling, typically &quot;OK&quot; for a single button message dialog, will be applied.
+ * @param severity The severity. Must be one of the {@link IStatus} constants.
+ * @param keyDontAskAgain The unique key for the stored result value or <code>null</code>.
+ * @param helpContextId The help context id or <code>null</code>.
+ *
+ * @return {@link Boolean} if the severity is {@link IWRMessageStatusHandler#QUESTION}, <code>null</code> otherwise.
+ */
+ protected Object doOpenMessageDialog(Shell shell, String title, String message, String[] buttonLabel, int severity, String keyDontAskAgain, String helpContextId) {
+ Assert.isNotNull(shell);
+ Assert.isNotNull(title);
+ Assert.isNotNull(message);
+
+ Object result = null;
+
+ switch (severity) {
+ case IStatusHandlerConstants.QUESTION:
+ result = new Boolean(OptionalMessageDialog.openYesNoDialog(shell, title, message, buttonLabel, keyDontAskAgain, helpContextId) == IDialogConstants.YES_ID);
+ break;
+ case IStatusHandlerConstants.YES_NO_CANCEL:
+ result = new Integer(OptionalMessageDialog.openYesNoCancelDialog(shell, title, message, buttonLabel, keyDontAskAgain, helpContextId));
+ break;
+ case IStatus.WARNING:
+ OptionalMessageDialog.openWarningDialog(shell, title, message, buttonLabel, keyDontAskAgain, helpContextId);
+ break;
+ case IStatus.ERROR:
+ OptionalMessageDialog.openErrorDialog(shell, title, message, buttonLabel, keyDontAskAgain, helpContextId);
+ break;
+ default:
+ OptionalMessageDialog.openInformationDialog(shell, title, message, buttonLabel, keyDontAskAgain, helpContextId);
+ }
+
+ return result;
+ }
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/tables/TableViewerComparator.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/tables/TableViewerComparator.java
new file mode 100644
index 000000000..cb5bebcbf
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/tables/TableViewerComparator.java
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.tables;
+
+import java.util.Arrays;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.tcf.te.ui.AbstractViewerComparator;
+
+
+/**
+ * Common table control viewer comparator implementation.
+ */
+public class TableViewerComparator extends AbstractViewerComparator {
+ private final ITableLabelProvider labelProvider;
+
+ /**
+ * Constructor.
+ *
+ * @param viewer The parent viewer. Must not be <code>null</code>.
+ * @param labelProvider The table label provider. Must not be <code>null</code>.
+ */
+ public TableViewerComparator(Viewer viewer, ITableLabelProvider labelProvider) {
+ super(viewer);
+ Assert.isNotNull(labelProvider);
+ this.labelProvider = labelProvider;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.ui.controls.AbstractViewerComparator#doDetermineInverter(org.eclipse.jface.viewers.Viewer)
+ */
+ @Override
+ protected int doDetermineInverter(Viewer viewer) {
+ int inverter = 1;
+
+ // Viewer must be of type TableViewer and the table must not be disposed yet
+ if (viewer instanceof TableViewer && ((TableViewer)viewer).getTable() != null) {
+ Table table = ((TableViewer)viewer).getTable();
+ if (!table.isDisposed() && table.getSortDirection() == SWT.DOWN) inverter = -1;
+ }
+
+ return inverter;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.ui.controls.AbstractViewerComparator#doGetText(java.lang.Object, int)
+ */
+ @Override
+ protected String doGetText(Object node, int index) {
+ if (node != null && labelProvider != null) {
+ return index != -1 ? labelProvider.getColumnText(node, index) : ((ILabelProvider)labelProvider).getText(node);
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.ui.controls.AbstractViewerComparator#doGetSortColumnLabel(org.eclipse.jface.viewers.Viewer)
+ */
+ @Override
+ protected String doGetSortColumnLabel(Viewer viewer) {
+ // Viewer must be of type TableViewer and the table must not be disposed yet
+ if (viewer instanceof TableViewer && ((TableViewer)viewer).getTable() != null && !((TableViewer)viewer).getTable().isDisposed()) {
+ Table table = ((TableViewer)viewer).getTable();
+ return table.getSortColumn() != null ? table.getSortColumn().getText() : ""; //$NON-NLS-1$
+ }
+ return ""; //$NON-NLS-1$
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.ui.controls.AbstractViewerComparator#doGetSortColumnIndex(org.eclipse.jface.viewers.Viewer)
+ */
+ @Override
+ protected int doGetSortColumnIndex(Viewer viewer) {
+ // Viewer must be of type TableViewer and the table must not be disposed yet
+ if (viewer instanceof TableViewer && ((TableViewer)viewer).getTable() != null && !((TableViewer)viewer).getTable().isDisposed()) {
+ Table table = ((TableViewer)viewer).getTable();
+ return table.getSortColumn() != null ? Arrays.asList(table.getColumns()).indexOf(table.getSortColumn()) : -1;
+ }
+ return -1;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.ui.controls.AbstractViewerComparator#doCompare(java.lang.Object, java.lang.Object, java.lang.String, int, int)
+ */
+ @Override
+ protected int doCompare(Object node1, Object node2, String sortColumn, int index, int inverter) {
+ if (node1 == null && node2 == null) return 0;
+ if (node1 != null && node2 == null) return 1;
+ if (node1 == null && node2 != null) return -1;
+
+ // Get the labels
+ String text1 = doGetText(node1, index);
+ String text2 = doGetText(node2, index);
+
+ // If the text is matching ".*[0-9]+$" -> compare numerical instead of alphabetical
+ if (text1 != null && text1.matches(".*[0-9]+$") && text2 != null && text2.matches(".*[0-9]+$")) { //$NON-NLS-1$ //$NON-NLS-2$
+ // Split numbers and text (note that this effectively removes the number ... splitted[1] == "").
+ String[] splitted1 = text1.split("[0-9]+$", 2); //$NON-NLS-1$
+ String[] splitted2 = text2.split("[0-9]+$", 2); //$NON-NLS-1$
+
+ // Get the parts to match alphabetical
+ String alpha1 = splitted1[0];
+ String alpha2 = splitted2[0];
+
+ // The numerical parts is what remains if we strip the alpha parts from the original text
+ String num1 = text1.replace(alpha1, ""); //$NON-NLS-1$
+ String num2 = text2.replace(alpha2, ""); //$NON-NLS-1$
+
+ // Compare the alpha parts
+ int result = getComparator().compare(alpha1, alpha2) * inverter;
+ // Only if the alpha parts are equal, compare the numerical parts too
+ if (result == 0) {
+ result = Integer.decode(num1).compareTo(Integer.decode(num2)) * inverter;
+ }
+
+ return result;
+ }
+
+ // Compare the text alphabetical
+ return getComparator().compare(text1, text2) * inverter;
+ }
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/tables/properties/NodePropertiesTableControl.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/tables/properties/NodePropertiesTableControl.java
new file mode 100644
index 000000000..1de64c627
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/tables/properties/NodePropertiesTableControl.java
@@ -0,0 +1,420 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.tables.properties;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TableLayout;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerComparator;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Cursor;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.tcf.te.ui.WorkbenchPartControl;
+import org.eclipse.tcf.te.ui.interfaces.IUIConstants;
+import org.eclipse.tcf.te.ui.nls.Messages;
+import org.eclipse.tcf.te.ui.forms.CustomFormToolkit;
+import org.eclipse.ui.ISelectionListener;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchPartSite;
+import org.eclipse.ui.forms.widgets.Section;
+
+
+/**
+ * Abstract node properties table control implementation.
+ */
+public abstract class NodePropertiesTableControl extends WorkbenchPartControl {
+ // Reference to the table viewer
+ private TableViewer viewer;
+ // Reference to the selection changed listener
+ private ISelectionChangedListener editorSelectionChangedListener;
+
+ // We remember the sorting order (ascending vs. descending) for each
+ // column separately. That way we can come up with the sort order switching
+ // correctly if the user changes from one column to the next. If set
+ // to Boolean.FALSE, the sort order for the column is descending (default)
+ private final Map<TableColumn, Boolean> columnSortOrder = new LinkedHashMap<TableColumn, Boolean>();
+
+ /**
+ * Default node properties table control selection changed listener implementation.
+ * The selection changed listener is registered to the editor tree control.
+ */
+ protected class NodePropertiesTableControlSelectionChangedListener implements ISelectionChangedListener {
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+ */
+ @Override
+ public void selectionChanged(SelectionChangedEvent event) {
+ if (getViewer() != null) {
+ getViewer().setInput(event.getSelection());
+ }
+ }
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param parentPart The parent workbench part this control is embedded in or <code>null</code>.
+ */
+ public NodePropertiesTableControl(IWorkbenchPart parentPart) {
+ super(parentPart);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.ui.WorkbenchPartControl#dispose()
+ */
+ @Override
+ public void dispose() {
+ // Dispose the editor tree control selection changed listener
+ if (editorSelectionChangedListener != null) {
+ ISelectionProvider selectionProvider = (ISelectionProvider)getParentPart().getAdapter(ISelectionProvider.class);
+ if (selectionProvider != null) {
+ selectionProvider.removeSelectionChangedListener(editorSelectionChangedListener);
+ editorSelectionChangedListener = null;
+ }
+ }
+
+ super.dispose();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.ui.WorkbenchPartControl#setupFormPanel(org.eclipse.swt.widgets.Composite, org.eclipse.tcf.te.ui.forms.CustomFormToolkit)
+ */
+ @Override
+ public void setupFormPanel(Composite parent, CustomFormToolkit toolkit) {
+ super.setupFormPanel(parent, toolkit);
+
+ // Create the table viewer
+ viewer = doCreateTableViewer(parent);
+ // Configure the table viewer
+ configureTableViewer(viewer);
+ // Configure the table
+ configureTable(viewer.getTable(), viewer.getComparator() != null);
+
+ // Register the control as selection listener to the editor control
+ ISelectionProvider selectionProvider = getParentPart() != null ? (ISelectionProvider)getParentPart().getAdapter(ISelectionProvider.class) : null;
+ if (selectionProvider != null) {
+ // Create the selection changed listener instance
+ editorSelectionChangedListener = doCreateEditorSelectionChangedListener();
+ selectionProvider.addSelectionChangedListener(editorSelectionChangedListener);
+ }
+
+ // Prepare popup menu and toolbar
+ createContributionItems(viewer);
+
+ // Set the current selection as input
+ viewer.setInput(selectionProvider != null ? selectionProvider.getSelection() : null);
+ }
+
+ /**
+ * Creates a new editor tree control selection changed listener instance.
+ *
+ * @return The editor tree control selection changed listener instance.
+ */
+ protected ISelectionChangedListener doCreateEditorSelectionChangedListener() {
+ return new NodePropertiesTableControlSelectionChangedListener();
+ }
+
+ /**
+ * Creates the table viewer instance.
+ *
+ * @param parent The parent composite. Must not be <code>null</code>.
+ * @return The table viewer.
+ */
+ protected TableViewer doCreateTableViewer(Composite parent) {
+ Assert.isNotNull(parent);
+
+ TableViewer tableViewer = new TableViewer(parent, SWT.FULL_SELECTION | SWT.MULTI | SWT.BORDER);
+
+ return tableViewer;
+ }
+
+ /**
+ * Configure the table Viewer.
+ *
+ * @param tableViewer The table viewer. Must not be <code>null</code>.
+ */
+ protected void configureTableViewer(TableViewer tableViewer) {
+ Assert.isNotNull(tableViewer);
+
+ tableViewer.setLabelProvider(doCreateTableViewerLabelProvider(tableViewer));
+ tableViewer.setContentProvider(doCreateTableViewerContentProvider(tableViewer));
+ tableViewer.setComparator(doCreateTableViewerComparator(tableViewer));
+ }
+
+ /**
+ * Creates the table viewer label provider instance.
+ *
+ * @param viewer The table viewer. Must not be <code>null</code>.
+ * @return The table viewer label provider instance.
+ */
+ protected abstract ITableLabelProvider doCreateTableViewerLabelProvider(TableViewer viewer);
+
+ /**
+ * Creates the table viewer content provider instance.
+ *
+ * @param viewer The table viewer. Must not be <code>null</code>.
+ * @return The table viewer content provider instance.
+ */
+ protected abstract IStructuredContentProvider doCreateTableViewerContentProvider(TableViewer viewer);
+
+ /**
+ * Creates the table viewer comparator instance.
+ *
+ * @param viewer The table viewer. Must not be <code>null</code>.
+ * @return The table viewer comparator instance or <code>null</code> to turn of sorting.
+ */
+ protected ViewerComparator doCreateTableViewerComparator(TableViewer viewer) {
+ return null;
+ }
+
+ /**
+ * Configure the table.
+ *
+ * @param table The table. Must not be <code>null</code>.
+ * @param sorted Specify <code>true</code> if the table shall support sorting, <code>false</code> otherwise.
+ */
+ protected void configureTable(Table table, boolean sorted) {
+ Assert.isNotNull(table);
+
+ // Create and configure the table columns
+ createTableColumns(table, sorted);
+
+ table.setHeaderVisible(true);
+ table.setLinesVisible(true);
+ }
+
+ /**
+ * Create the table columns.
+ *
+ * @param table The table. Must not be <code>null</code>.
+ * @param sorted Specify <code>true</code> if the table shall support sorting, <code>false</code> otherwise.
+ */
+ protected void createTableColumns(final Table table, boolean sorted) {
+ Assert.isNotNull(table);
+
+ TableColumn sortColumn = null;
+
+ TableColumn column = new TableColumn(table, SWT.LEFT);
+ column.setText(Messages.NodePropertiesTableControl_column_name_label);
+ columnSortOrder.put(column, Boolean.TRUE);
+ if (sorted) column.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (e.widget instanceof TableColumn) {
+ switchSortColumn(table, (TableColumn)e.widget);
+ }
+ }
+ });
+ // The property name is the default sorting column
+ sortColumn = column;
+
+ column = new TableColumn(table, SWT.LEFT);
+ column.setText(Messages.NodePropertiesTableControl_column_value_label);
+ columnSortOrder.put(column, Boolean.FALSE);
+ if (sorted) column.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (e.widget instanceof TableColumn) {
+ switchSortColumn(table, (TableColumn)e.widget);
+ }
+ }
+ });
+
+ TableLayout tableLayout = new TableLayout();
+ tableLayout.addColumnData(new ColumnWeightData(30));
+ tableLayout.addColumnData(new ColumnWeightData(70));
+ table.setLayout(tableLayout);
+
+ GridData layoutData = new GridData(GridData.FILL_BOTH | GridData.VERTICAL_ALIGN_BEGINNING);
+ table.setLayoutData(layoutData);
+
+ if (sorted) {
+ // set the default sort column
+ table.setSortColumn(sortColumn);
+ table.setSortDirection(columnSortOrder.get(sortColumn).booleanValue() ? SWT.UP : SWT.DOWN);
+ }
+ }
+
+ /**
+ * Switches the sort order for the given column and set the
+ * new sort order and sort column to the given table.
+ *
+ * @param table The table.
+ * @param column The table column
+ */
+ protected final void switchSortColumn(Table table, TableColumn column) {
+ if (table == null || table.isDisposed() || column == null || column.isDisposed()) {
+ return;
+ }
+ // Get the current sorting order for the given column
+ boolean newSortOrder = !columnSortOrder.get(column).booleanValue();
+ // Set sort column and sort direction
+ table.setSortColumn(column);
+ table.setSortDirection(newSortOrder ? SWT.UP : SWT.DOWN);
+ // And update the remembered sort order in the map
+ columnSortOrder.put(column, Boolean.valueOf(newSortOrder));
+
+ getViewer().refresh();
+ }
+
+ /**
+ * Create the context menu and toolbar groups.
+ *
+ * @param viewer The table viewer. Must not be <code>null</code>.
+ */
+ protected void createContributionItems(TableViewer viewer) {
+ Assert.isNotNull(viewer);
+
+ // Create the menu manager
+ MenuManager manager = new MenuManager("#PopupMenu"); //$NON-NLS-1$
+ // Attach the menu listener
+ manager.addMenuListener(new IMenuListener() {
+ @Override
+ public void menuAboutToShow(IMenuManager manager) {
+ manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+ }
+ });
+ // All items are removed when menu is closing
+ manager.setRemoveAllWhenShown(true);
+ // Associated with the tree
+ viewer.getTable().setMenu(manager.createContextMenu(viewer.getTable()));
+
+ // Register the context menu at the parent workbench part site.
+ if (getParentPart() != null && getParentPart().getSite() != null && getContextMenuId() != null) {
+ IWorkbenchPartSite site = getParentPart().getSite();
+ site.registerContextMenu(getContextMenuId(), manager, viewer);
+ }
+
+ // The toolbar is a bit more complicated as we want to have the
+ // toolbar placed within the section title.
+ createToolbarContributionItem(viewer);
+ }
+
+ /**
+ * Returns the controls context menu id.
+ *
+ * @return The context menu id or <code>null</code>.
+ */
+ protected String getContextMenuId() {
+ return IUIConstants.ID_CONTROL_MENUS_BASE + ".menu.propertiesTable"; //$NON-NLS-1$
+ }
+
+ /**
+ * Creates the toolbar within the section parent of the given filtered tree.
+ *
+ * @param viewer The table viewer. Must not be <code>null</code>.
+ */
+ protected void createToolbarContributionItem(TableViewer viewer) {
+ Assert.isNotNull(viewer);
+
+ // Determine the section parent from the filtered tree
+ Composite parent = viewer.getTable().getParent();
+ while (parent != null && !(parent instanceof Section)) {
+ parent = parent.getParent();
+ }
+
+ // We are done here if we cannot find a section parent or the parent is disposed
+ if (parent == null || parent.isDisposed()) {
+ return;
+ }
+
+ // Create the toolbar control
+ ToolBar toolbar = new ToolBar(parent, SWT.FLAT | SWT.HORIZONTAL | SWT.RIGHT);
+
+ // The cursor within the toolbar shall change to an hand
+ final Cursor handCursor = new Cursor(parent.getDisplay(), SWT.CURSOR_HAND);
+ toolbar.setCursor(handCursor);
+ // Cursor needs to be explicitly disposed
+ toolbar.addDisposeListener(new DisposeListener() {
+ @Override
+ public void widgetDisposed(DisposeEvent e) {
+ if (handCursor.isDisposed() == false) {
+ handCursor.dispose();
+ }
+ }
+ });
+
+ // If the parent composite is a forms section, set the toolbar
+ // as text client to the section header
+ if (parent instanceof Section) {
+ Section section = (Section)parent;
+ // Set the toolbar as text client
+ section.setTextClient(toolbar);
+ }
+
+ // create the toolbar items
+ createToolBarItems(toolbar);
+ }
+
+ /**
+ * Create the toolbar items to be added to the toolbar. Override
+ * to add the wanted toolbar items.
+ * <p>
+ * <b>Note:</b> The toolbar items are added from left to right.
+ *
+ * @param toolbar The toolbar to add the toolbar items too. Must not be <code>null</code>.
+ */
+ protected void createToolBarItems(ToolBar toolbar) {
+ Assert.isNotNull(toolbar);
+ }
+
+ /**
+ * Returns the viewer instance.
+ *
+ * @return The viewer instance or <code>null</code>.
+ */
+ public Viewer getViewer() {
+ return viewer;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+ */
+ @Override
+ public Object getAdapter(Class adapter) {
+ if (Viewer.class.isAssignableFrom(adapter)) {
+ // We have to double check if our real viewer is assignable to
+ // the requested Viewer class.
+ Viewer viewer = getViewer();
+ if (!adapter.isAssignableFrom(viewer.getClass())) {
+ viewer = null;
+ }
+ return viewer;
+ } else if (ISelectionListener.class.isAssignableFrom(adapter)) {
+ return editorSelectionChangedListener;
+ }
+
+ return super.getAdapter(adapter);
+ }
+
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/tables/properties/NodePropertiesTableTableNode.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/tables/properties/NodePropertiesTableTableNode.java
new file mode 100644
index 000000000..f5e3ba1bc
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/tables/properties/NodePropertiesTableTableNode.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.tables.properties;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.PlatformObject;
+
+/**
+ * Immutable representation of a table node.
+ */
+public final class NodePropertiesTableTableNode extends PlatformObject {
+ /**
+ * The node name.
+ */
+ public final String name;
+
+ /**
+ * The node value.
+ */
+ public final String value;
+
+ /**
+ * Constructor.
+ *
+ * @param name The node name. Must not be <code>null</code>.
+ * @param value The node value. Must not be <code>null</code>.
+ */
+ public NodePropertiesTableTableNode(String name, String value) {
+ Assert.isNotNull(name);
+ Assert.isNotNull(value);
+
+ this.name = name;
+ this.value = value;
+ }
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/AbstractTreeControl.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/AbstractTreeControl.java
new file mode 100644
index 000000000..d0fe87976
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/AbstractTreeControl.java
@@ -0,0 +1,309 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.trees;
+
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerComparator;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.graphics.Cursor;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.tcf.te.ui.WorkbenchPartControl;
+import org.eclipse.tcf.te.ui.forms.CustomFormToolkit;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.forms.widgets.Section;
+
+
+/**
+ * Abstract tree control implementation.
+ */
+public abstract class AbstractTreeControl extends WorkbenchPartControl {
+ // Reference to the tree viewer instance
+ private TreeViewer viewer;
+ // Reference to the selection changed listener
+ private ISelectionChangedListener selectionChangedListener;
+
+ /**
+ * Constructor.
+ */
+ public AbstractTreeControl() {
+ super();
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param parentPart The parent workbench part this control is embedded in or <code>null</code>.
+ */
+ public AbstractTreeControl(IWorkbenchPart parentPart) {
+ super(parentPart);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.ui.WorkbenchPartControl#dispose()
+ */
+ @Override
+ public void dispose() {
+ // Unregister the selection changed listener
+ if (selectionChangedListener != null) {
+ if (getViewer() != null) {
+ getViewer().removeSelectionChangedListener(selectionChangedListener);
+ }
+ selectionChangedListener = null;
+ }
+
+ super.dispose();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.ui.WorkbenchPartControl#setupFormPanel(org.eclipse.swt.widgets.Composite, org.eclipse.tcf.te.ui.forms.CustomFormToolkit)
+ */
+ @Override
+ public void setupFormPanel(Composite parent, CustomFormToolkit toolkit) {
+ super.setupFormPanel(parent, toolkit);
+
+ // Create the tree viewer
+ viewer = doCreateTreeViewer(parent);
+ // And configure the tree viewer
+ configureTreeViewer(viewer);
+
+ // Prepare popup menu and toolbar
+ createContributionItems(viewer);
+ }
+
+ /**
+ * Creates the tree viewer instance.
+ *
+ * @param parent The parent composite. Must not be <code>null</code>.
+ * @return The tree viewer.
+ */
+ protected TreeViewer doCreateTreeViewer(Composite parent) {
+ Assert.isNotNull(parent);
+ return new TreeViewer(parent, SWT.FULL_SELECTION | SWT.SINGLE);
+ }
+
+ /**
+ * Configure the tree viewer.
+ *
+ * @param viewer The tree viewer. Must not be <code>null</code>.
+ */
+ protected void configureTreeViewer(TreeViewer viewer) {
+ Assert.isNotNull(viewer);
+
+ viewer.setAutoExpandLevel(getAutoExpandLevel());
+
+ viewer.setLabelProvider(doCreateTreeViewerLabelProvider(viewer));
+ viewer.setContentProvider(doCreateTreeViewerContentProvider(viewer));
+ viewer.setComparator(doCreateTreeViewerComparator(viewer));
+
+ viewer.getTree().setLayoutData(doCreateTreeViewerLayoutData(viewer));
+
+ // Attach the selection changed listener
+ selectionChangedListener = doCreateTreeViewerSelectionChangedListener(viewer);
+ if (selectionChangedListener != null) {
+ viewer.addSelectionChangedListener(selectionChangedListener);
+ }
+ }
+
+ /**
+ * Returns the number of levels to auto expand.
+ * If the method returns <code>0</code>, no auto expansion will happen
+ *
+ * @return The number of levels to auto expand or <code>0</code>.
+ */
+ protected int getAutoExpandLevel() {
+ return 2;
+ }
+
+ /**
+ * Creates the tree viewer layout data instance.
+ *
+ * @param viewer The tree viewer. Must not be <code>null</code>.
+ * @return The tree viewer layout data instance.
+ */
+ protected Object doCreateTreeViewerLayoutData(TreeViewer viewer) {
+ return new GridData(GridData.FILL_BOTH);
+ }
+
+ /**
+ * Creates the tree viewer label provider instance.
+ *
+ * @param viewer The tree viewer. Must not be <code>null</code>.
+ * @return The tree viewer label provider instance.
+ */
+ protected abstract ILabelProvider doCreateTreeViewerLabelProvider(TreeViewer viewer);
+
+ /**
+ * Creates the tree viewer content provider instance.
+ *
+ * @param viewer The tree viewer. Must not be <code>null</code>.
+ * @return The tree viewer content provider instance.
+ */
+ protected abstract ITreeContentProvider doCreateTreeViewerContentProvider(TreeViewer viewer);
+
+ /**
+ * Creates the tree viewer comparator instance.
+ *
+ * @param viewer The tree viewer. Must not be <code>null</code>.
+ * @return The tree viewer comparator instance or <code>null</code> to turn of sorting.
+ */
+ protected ViewerComparator doCreateTreeViewerComparator(TreeViewer viewer) {
+ Assert.isNotNull(viewer);
+ return null;
+ }
+
+ /**
+ * Creates a new selection changed listener instance.
+ *
+ * @param viewer The tree viewer. Must not be <code>null</code>.
+ * @return The selection changed listener instance.
+ */
+ protected abstract ISelectionChangedListener doCreateTreeViewerSelectionChangedListener(TreeViewer viewer);
+
+ /**
+ * Create the context menu and toolbar groups.
+ *
+ * @param viewer The tree viewer instance. Must not be <code>null</code>.
+ */
+ protected void createContributionItems(TreeViewer viewer) {
+ Assert.isNotNull(viewer);
+
+ // Create the menu manager
+ MenuManager manager = new MenuManager("#PopupMenu"); //$NON-NLS-1$
+ // Attach the menu listener
+ manager.addMenuListener(new IMenuListener() {
+ @Override
+ public void menuAboutToShow(IMenuManager manager) {
+ manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+ }
+ });
+ // All items are removed when menu is closing
+ manager.setRemoveAllWhenShown(true);
+ // Associated with the tree
+ viewer.getTree().setMenu(manager.createContextMenu(viewer.getTree()));
+
+ // Register the context menu at the parent workbench part site.
+ if (getParentPart() != null && getParentPart().getSite() != null && getContextMenuId() != null) {
+ getParentPart().getSite().registerContextMenu(getContextMenuId(), manager, viewer);
+ }
+
+ // The toolbar is a bit more complicated as we want to have the
+ // toolbar placed within the section title.
+ createToolbarContributionItem(viewer);
+ }
+
+ /**
+ * Returns the context menu id.
+ *
+ * @return The context menu id.
+ */
+ protected abstract String getContextMenuId();
+
+ /**
+ * Creates the toolbar within the section parent of the given tree viewer.
+ *
+ * @param viewer The tree viewer instance. Must not be <code>null</code>.
+ */
+ protected void createToolbarContributionItem(TreeViewer viewer) {
+ Assert.isNotNull(viewer);
+
+ // Determine the section parent from the tree viewer
+ Composite parent = viewer.getTree().getParent();
+ while (parent != null && !(parent instanceof Section)) {
+ parent = parent.getParent();
+ }
+
+ // We are done here if we cannot find a section parent or the parent is disposed
+ if (parent == null || parent.isDisposed()) {
+ return;
+ }
+
+ // Create the toolbar control
+ ToolBar toolbar = new ToolBar(parent, SWT.FLAT | SWT.HORIZONTAL | SWT.RIGHT);
+
+ // The cursor within the toolbar shall change to an hand
+ final Cursor handCursor = new Cursor(parent.getDisplay(), SWT.CURSOR_HAND);
+ toolbar.setCursor(handCursor);
+ // Cursor needs to be explicitly disposed
+ toolbar.addDisposeListener(new DisposeListener() {
+ @Override
+ public void widgetDisposed(DisposeEvent e) {
+ if (handCursor.isDisposed() == false) {
+ handCursor.dispose();
+ }
+ }
+ });
+
+ // If the parent composite is a forms section, set the toolbar
+ // as text client to the section header
+ if (parent instanceof Section) {
+ Section section = (Section)parent;
+ // Set the toolbar as text client
+ section.setTextClient(toolbar);
+ }
+
+ // create the toolbar items
+ createToolBarItems(toolbar);
+ }
+
+ /**
+ * Create the toolbar items to be added to the toolbar. Override
+ * to add the wanted toolbar items.
+ * <p>
+ * <b>Note:</b> The toolbar items are added from left to right.
+ *
+ * @param toolbar The toolbar to add the toolbar items too. Must not be <code>null</code>.
+ */
+ protected void createToolBarItems(ToolBar toolbar) {
+ Assert.isNotNull(toolbar);
+ }
+
+ /**
+ * Returns the viewer instance.
+ *
+ * @return The viewer instance or <code>null</code>.
+ */
+ public Viewer getViewer() {
+ return viewer;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+ */
+ @Override
+ public Object getAdapter(Class adapter) {
+ if (Viewer.class.isAssignableFrom(adapter)) {
+ // We have to double check if our real viewer is assignable to
+ // the requested Viewer class.
+ Viewer viewer = getViewer();
+ if (!adapter.isAssignableFrom(viewer.getClass())) {
+ viewer = null;
+ }
+ return viewer;
+ }
+
+ return super.getAdapter(adapter);
+ }
+
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/TreeArrayContentProvider.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/TreeArrayContentProvider.java
new file mode 100644
index 000000000..dda8267dc
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/TreeArrayContentProvider.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.trees;
+
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+
+/**
+ * This implementation of <code>ITreeContentProvider</code> handles
+ * the case where the viewer input is an unchanging array or collection of elements.
+ */
+public class TreeArrayContentProvider extends ArrayContentProvider implements ITreeContentProvider {
+
+ private static TreeArrayContentProvider instance;
+
+ /**
+ * Returns an instance of TreeArrayContentProvider. Since instances of this
+ * class do not maintain any state, they can be shared between multiple
+ * clients.
+ *
+ * @return an instance of TreeArrayContentProvider
+ */
+ public static TreeArrayContentProvider getInstance() {
+ synchronized(TreeArrayContentProvider.class) {
+ if (instance == null) {
+ instance = new TreeArrayContentProvider();
+ }
+ return instance;
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
+ */
+ @Override
+ public Object[] getChildren(Object parentElement) {
+ return getElements(parentElement);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
+ */
+ @Override
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
+ */
+ @Override
+ public boolean hasChildren(Object element) {
+ return false;
+ }
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/TreeViewerComparator.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/TreeViewerComparator.java
new file mode 100644
index 000000000..e1b4bd6f6
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/TreeViewerComparator.java
@@ -0,0 +1,178 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.trees;
+
+import java.util.Arrays;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.tcf.te.ui.AbstractViewerComparator;
+
+
+/**
+ * Common tree control viewer comparator implementation.
+ */
+public class TreeViewerComparator extends AbstractViewerComparator {
+ private final ILabelProvider labelProvider;
+
+ /**
+ * Constructor.
+ *
+ * @param viewer The parent viewer. Must not be <code>null</code>.
+ * @param labelProvider The label provider. Must not be <code>null</code>.
+ */
+ public TreeViewerComparator(Viewer viewer, ILabelProvider labelProvider) {
+ super(viewer);
+ Assert.isNotNull(labelProvider);
+ this.labelProvider = labelProvider;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.ui.controls.AbstractViewerComparator#doDetermineInverter(org.eclipse.jface.viewers.Viewer)
+ */
+ @Override
+ protected int doDetermineInverter(Viewer viewer) {
+ int inverter = 1;
+
+ // Viewer must be of type TreeViewer and the tree must not be disposed yet
+ if (viewer instanceof TreeViewer && ((TreeViewer)viewer).getTree() != null) {
+ Tree tree = ((TreeViewer)viewer).getTree();
+ if (!tree.isDisposed() && tree.getSortDirection() == SWT.DOWN) inverter = -1;
+ }
+
+ return inverter;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.ui.controls.AbstractViewerComparator#doGetText(java.lang.Object, int)
+ */
+ @Override
+ protected String doGetText(Object node, int index) {
+ if (node != null && labelProvider != null) {
+ return labelProvider.getText(node);
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.ui.controls.AbstractViewerComparator#doGetSortColumnLabel(org.eclipse.jface.viewers.Viewer)
+ */
+ @Override
+ protected String doGetSortColumnLabel(Viewer viewer) {
+ // Viewer must be of type TreeViewer and the tree must not be disposed yet
+ if (viewer instanceof TreeViewer && ((TreeViewer)viewer).getTree() != null && !((TreeViewer)viewer).getTree().isDisposed()) {
+ Tree tree = ((TreeViewer)viewer).getTree();
+ return tree.getSortColumn() != null ? tree.getSortColumn().getText() : ""; //$NON-NLS-1$
+ }
+ return ""; //$NON-NLS-1$
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.ui.controls.AbstractViewerComparator#doGetSortColumnIndex(org.eclipse.jface.viewers.Viewer)
+ */
+ @Override
+ protected int doGetSortColumnIndex(Viewer viewer) {
+ if (viewer instanceof TreeViewer && ((TreeViewer)viewer).getTree() != null && !((TreeViewer)viewer).getTree().isDisposed()) {
+ Tree tree = ((TreeViewer)viewer).getTree();
+ return tree.getSortColumn() != null ? Arrays.asList(tree.getColumns()).indexOf(tree.getSortColumn()) : -1;
+ }
+ return -1;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.ui.controls.AbstractViewerComparator#doCompare(java.lang.Object, java.lang.Object, java.lang.String, int, int)
+ */
+ @Override
+ protected int doCompare(Object node1, Object node2, String sortColumn, int index, int inverter) {
+ if (node1 == null && node2 == null) return 0;
+ if (node1 != null && node2 == null) return 1;
+ if (node1 == null && node2 != null) return -1;
+
+ // Get the labels
+ String text1 = doGetText(node1, index);
+ String text2 = doGetText(node2, index);
+
+ // Normalize labels
+ if (text1 == null) text1 = ""; //$NON-NLS-1$
+ if (text2 == null) text2 = ""; //$NON-NLS-1$
+
+ // The tree sorts not strictly alphabetical. First comes entries starting with numbers,
+ // second entries starting with uppercase and than all the rest. Additional, if a label contains
+ // uppercase characters, it is sorted in before any labels being lowercase only.
+ if (text1.length() > 0 && text2.length() > 0) {
+ // Get the first characters of both
+ char c1 = text1.charAt(0);
+ char c2 = text2.charAt(0);
+
+ if (Character.isDigit(c1) || Character.isDigit(c2)) {
+ // Check on the differences. If both are digits, the standard compare will do it
+ if (Character.isDigit(c1) && !Character.isDigit(c2)) return -1 * inverter;
+ if (!Character.isDigit(c1) && Character.isDigit(c2)) return 1 * inverter;
+ }
+
+ if (Character.isUpperCase(c1) || Character.isUpperCase(c2)) {
+ // Check on the differences. If both are uppercase characters, the standard compare will do it
+ if (Character.isUpperCase(c1) && !Character.isUpperCase(c2)) return -1 * inverter;
+ if (!Character.isUpperCase(c1) && Character.isUpperCase(c2)) return 1 * inverter;
+ }
+
+ Matcher m1 = Pattern.compile("(\\D+)(\\d+)").matcher(text1); //$NON-NLS-1$
+ Matcher m2 = Pattern.compile("(\\D+)(\\d+)").matcher(text2); //$NON-NLS-1$
+ if (m1.matches() && m2.matches()) {
+ String p11 = m1.group(1);
+ String p12 = m1.group(2);
+
+ String p21 = m2.group(1);
+ String p22 = m2.group(2);
+
+ if (p11 != null && p11.equals(p21)) {
+ // Compare the second parts as number
+ try {
+ int result = 0;
+ long l1 = Long.parseLong(p12);
+ long l2 = Long.parseLong(p22);
+
+ if (l1 > l2) result = 1;
+ if (l1 < l2) result = -1;
+
+ return result;
+ } catch (NumberFormatException e) { /* ignored on purpose */ }
+ }
+ }
+
+ if (text1.matches(".*[A-Z]+.*") || text2.matches(".*[A-Z]+.*")) { //$NON-NLS-1$ //$NON-NLS-2$
+ if (text1.matches(".*[A-Z]+.*") && !text2.matches(".*[A-Z]+.*")) return -1 * inverter; //$NON-NLS-1$ //$NON-NLS-2$
+ if (!text1.matches(".*[A-Z]+.*") && text2.matches(".*[A-Z]+.*")) return 1 * inverter; //$NON-NLS-1$ //$NON-NLS-2$
+
+ // Additionally, it even depends on the position of the first uppercase
+ // character if both strings contains them :-(
+ int minLength = Math.min(text1.length(), text2.length());
+ for (int i = 0; i < minLength; i++) {
+ char ch1 = text1.charAt(i);
+ char ch2 = text2.charAt(i);
+
+ if (Character.isUpperCase(ch1) && !Character.isUpperCase(ch2)) return -1 * inverter;
+ if (!Character.isUpperCase(ch1) && Character.isUpperCase(ch2)) return 1 * inverter;
+ // If both are uppercase, we break the loop and compare as usual
+ if (Character.isUpperCase(ch1) && Character.isUpperCase(ch2)) break;
+ }
+ }
+ }
+
+ // Compare the text alphabetical
+ return getComparator().compare(text1, text2) * inverter;
+ }
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/TreeViewerSorter.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/TreeViewerSorter.java
new file mode 100644
index 000000000..b10acdc37
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/TreeViewerSorter.java
@@ -0,0 +1,205 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.trees;
+
+import java.util.Arrays;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.jface.viewers.ContentViewer;
+import org.eclipse.jface.viewers.IBaseLabelProvider;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.TreePathViewerSorter;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Tree;
+
+/**
+ * Common sorter implementation.
+ */
+public class TreeViewerSorter extends TreePathViewerSorter {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+ */
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ if (viewer != null && viewer.getControl() != null && !viewer.getControl().isDisposed()) {
+ return doCompare(viewer, e1, e2, doGetSortColumnLabel(viewer), doGetSortColumnIndex(viewer) , doDetermineInverter(viewer));
+ }
+ return super.compare(viewer, e1, e2);
+ }
+
+ /**
+ * Returns the text to compare for the given node and column index.
+ *
+ * @param viewer The viewer or <code>null</code>.
+ * @param node The node or <code>null</code>.
+ * @param index The column index or <code>-1</code>.
+ *
+ * @return The text for the given node and column index or <code>null</code>.
+ */
+ protected String doGetText(Viewer viewer, Object node, int index) {
+ if (node != null && doGetLabelProvider(viewer) != null) {
+ return doGetLabelProvider(viewer).getText(node);
+ }
+ return null;
+ }
+
+ /**
+ * Return the label provider associated with the specified viewer.
+ *
+ * @param viewer The viewer or <code>null</code>.
+ * @return The label provider or <code>null</code>.
+ */
+ protected ILabelProvider doGetLabelProvider(Viewer viewer) {
+ if (viewer instanceof ContentViewer) {
+ IBaseLabelProvider candidate = ((ContentViewer)viewer).getLabelProvider();
+ if (candidate instanceof ILabelProvider) return (ILabelProvider)candidate;
+ }
+ return null;
+ }
+
+ /**
+ * Determine if or if not the sort direction needs to be inverted.
+ *
+ * @param viewer The viewer or <code>null</code>.
+ * @return <code>1</code> for original sort order, or <code>-1</code> for inverted sort order.
+ */
+ protected int doDetermineInverter(Viewer viewer) {
+ int inverter = 1;
+
+ // Viewer must be of type TreeViewer and the tree must not be disposed yet
+ if (viewer instanceof TreeViewer && ((TreeViewer)viewer).getTree() != null) {
+ Tree tree = ((TreeViewer)viewer).getTree();
+ if (!tree.isDisposed() && tree.getSortDirection() == SWT.DOWN) inverter = -1;
+ }
+
+ return inverter;
+ }
+
+ /**
+ * Return the label of the sort column of the given viewer.
+ *
+ * @param viewer The viewer or <code>null</code>.
+ * @return The label of the sort column or an empty string.
+ */
+ protected String doGetSortColumnLabel(Viewer viewer) {
+ // Viewer must be of type TreeViewer and the tree must not be disposed yet
+ if (viewer instanceof TreeViewer && ((TreeViewer)viewer).getTree() != null && !((TreeViewer)viewer).getTree().isDisposed()) {
+ Tree tree = ((TreeViewer)viewer).getTree();
+ return tree.getSortColumn() != null ? tree.getSortColumn().getText() : ""; //$NON-NLS-1$
+ }
+ return ""; //$NON-NLS-1$
+ }
+
+ /**
+ * Return the index of the sort column of the given viewer.
+ *
+ * @param viewer The viewer or <code>null</code>.
+ * @return The index of the sort column or <code>-1</code>.
+ */
+ protected int doGetSortColumnIndex(Viewer viewer) {
+ if (viewer instanceof TreeViewer && ((TreeViewer)viewer).getTree() != null && !((TreeViewer)viewer).getTree().isDisposed()) {
+ Tree tree = ((TreeViewer)viewer).getTree();
+ return tree.getSortColumn() != null ? Arrays.asList(tree.getColumns()).indexOf(tree.getSortColumn()) : -1;
+ }
+ return -1;
+ }
+
+ /**
+ * Compare the given model nodes by the given sort column and inverter.
+ *
+ * @param viewer The viewer or <code>null</code>.
+ * @param node1 The first node or <code>null</code>.
+ * @param node2 The second node or <code>null</code>.
+ * @param sortColumn The sort column text or <code>null</code>.
+ * @param index The sort column index or <code>-1</code>.
+ * @param inverter The inverter.
+ *
+ * @return The compare result.
+ */
+ protected int doCompare(Viewer viewer, Object node1, Object node2, String sortColumn, int index, int inverter) {
+ if (node1 == null && node2 == null) return 0;
+ if (node1 != null && node2 == null) return 1;
+ if (node1 == null && node2 != null) return -1;
+
+ // Get the labels
+ String text1 = doGetText(viewer, node1, index);
+ String text2 = doGetText(viewer, node2, index);
+
+ // The tree sorts not strictly alphabetical. First comes entries starting with numbers,
+ // second entries starting with uppercase and than all the rest. Additional, if a label contains
+ // uppercase characters, it is sorted in before any labels being lowercase only.
+ if (text1.length() > 0 && text2.length() > 0) {
+ // Get the first characters of both
+ char c1 = text1.charAt(0);
+ char c2 = text2.charAt(0);
+
+ if (Character.isDigit(c1) || Character.isDigit(c2)) {
+ // Check on the differences. If both are digits, the standard compare will do it
+ if (Character.isDigit(c1) && !Character.isDigit(c2)) return -1 * inverter;
+ if (!Character.isDigit(c1) && Character.isDigit(c2)) return 1 * inverter;
+ }
+
+ if (Character.isUpperCase(c1) || Character.isUpperCase(c2)) {
+ // Check on the differences. If both are uppercase characters, the standard compare will do it
+ if (Character.isUpperCase(c1) && !Character.isUpperCase(c2)) return -1 * inverter;
+ if (!Character.isUpperCase(c1) && Character.isUpperCase(c2)) return 1 * inverter;
+ }
+
+ Matcher m1 = Pattern.compile("(\\D+)(\\d+)").matcher(text1); //$NON-NLS-1$
+ Matcher m2 = Pattern.compile("(\\D+)(\\d+)").matcher(text2); //$NON-NLS-1$
+ if (m1.matches() && m2.matches()) {
+ String p11 = m1.group(1);
+ String p12 = m1.group(2);
+
+ String p21 = m2.group(1);
+ String p22 = m2.group(2);
+
+ if (p11 != null && p11.equals(p21)) {
+ // Compare the second parts as number
+ try {
+ int result = 0;
+ long l1 = Long.parseLong(p12);
+ long l2 = Long.parseLong(p22);
+
+ if (l1 > l2) result = 1;
+ if (l1 < l2) result = -1;
+
+ return result;
+ } catch (NumberFormatException e) { /* ignored on purpose */ }
+ }
+ }
+
+ if (text1.matches(".*[A-Z]+.*") || text2.matches(".*[A-Z]+.*")) { //$NON-NLS-1$ //$NON-NLS-2$
+ if (text1.matches(".*[A-Z]+.*") && !text2.matches(".*[A-Z]+.*")) return -1 * inverter; //$NON-NLS-1$ //$NON-NLS-2$
+ if (!text1.matches(".*[A-Z]+.*") && text2.matches(".*[A-Z]+.*")) return 1 * inverter; //$NON-NLS-1$ //$NON-NLS-2$
+
+ // Additionally, it even depends on the position of the first uppercase
+ // character if both strings contains them :-(
+ int minLength = Math.min(text1.length(), text2.length());
+ for (int i = 0; i < minLength; i++) {
+ char ch1 = text1.charAt(i);
+ char ch2 = text2.charAt(i);
+
+ if (Character.isUpperCase(ch1) && !Character.isUpperCase(ch2)) return -1 * inverter;
+ if (!Character.isUpperCase(ch1) && Character.isUpperCase(ch2)) return 1 * inverter;
+ // If both are uppercase, we break the loop and compare as usual
+ if (Character.isUpperCase(ch1) && Character.isUpperCase(ch2)) break;
+ }
+ }
+ }
+
+ // Compare the text alphabetical
+ return getComparator().compare(text1, text2) * inverter;
+ }
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/AbstractWizard.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/AbstractWizard.java
new file mode 100644
index 000000000..ca3e30879
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/AbstractWizard.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.wizards;
+
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.tcf.te.ui.activator.UIPlugin;
+
+/**
+ * An abstract wizard implementation.
+ * <p>
+ * This wizard implementation is adding dialog settings management.
+ */
+public abstract class AbstractWizard extends Wizard {
+ // A marker to remember if the dialog settings got
+ // initialized for this wizard
+ private boolean dialogSettingsInitialized = false;
+
+ /**
+ * Initialize the dialog settings and associate them with the wizard.
+ */
+ private final void initializeDialogSettings() {
+ // Get the root dialog settings
+ IDialogSettings rootSettings = getRootDialogSettings();
+ // Get the wizards dialog settings section
+ IDialogSettings section = rootSettings.getSection(getWizardSectionName());
+ if (section == null) {
+ // The section does not exist -> create it
+ section = rootSettings.addNewSection(getWizardSectionName());
+ }
+ // Push the section to the wizard
+ setDialogSettings(section);
+ // Mark the dialog settings initialized
+ dialogSettingsInitialized = true;
+ }
+
+ /**
+ * Returns the root dialog settings.
+ * <p>
+ * Typically, this are the dialog settings of the parent bundle. The
+ * default implementation returns the dialog settings of the bundle
+ * &quot;<code>org.eclipse.tcf.te.ui</code>&quot;. Overwrite to return
+ * different root dialog settings.
+ *
+ * @return The root dialog settings.
+ */
+ protected IDialogSettings getRootDialogSettings() {
+ return UIPlugin.getDefault().getDialogSettings();
+ }
+
+ /**
+ * Returns the name of the wizards associated dialog settings
+ * section.
+ * <p>
+ * The default implementation returns the simple name of the
+ * implementation class.
+ *
+ * @return The name of the wizards dialog settings section.
+ */
+ protected String getWizardSectionName() {
+ return getClass().getSimpleName();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.wizard.Wizard#getDialogSettings()
+ */
+ @Override
+ public IDialogSettings getDialogSettings() {
+ if (!dialogSettingsInitialized) {
+ initializeDialogSettings();
+ }
+ return super.getDialogSettings();
+ }
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/AbstractWizardCommandHandler.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/AbstractWizardCommandHandler.java
new file mode 100644
index 000000000..7c0175535
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/AbstractWizardCommandHandler.java
@@ -0,0 +1,131 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.wizards;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.wizard.IWizard;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWizard;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * Abstract wizard command handler implementation.
+ */
+public abstract class AbstractWizardCommandHandler extends AbstractHandler {
+ /**
+ * The wizard dialog default width
+ */
+ private static final int DEFAULT_WIZARD_WIDTH = 500;
+
+ /**
+ * The wizard dialog default height
+ */
+ private static final int DEFAULT_WIZARD_HEIGHT = 500;
+
+ /**
+ * Creates the wizard instance.
+ *
+ * @return The wizard instance. Must be never <code>null</code>.
+ */
+ protected abstract IWizard createWizard();
+
+ /**
+ * Creates the wizard dialog instance.
+ *
+ * @param shell The parent shell or <code>null</code>.
+ * @param wizard The wizard instance. Must not be <code>null</code>.
+ *
+ * @return The wizard dialog instance.
+ */
+ protected WizardDialog createWizardDialog(Shell shell, IWizard wizard) {
+ Assert.isNotNull(wizard);
+ return new WizardDialog(shell, wizard);
+ }
+
+ /**
+ * Returns the current selection casted to {@link IStructuredSelection}.
+ *
+ * @param event The execution event.
+ * @return The current selection casted to {@link IStructuredSelection} or an empty selection.
+ */
+ protected IStructuredSelection getCurrentSelection(ExecutionEvent event) {
+ ISelection selection = HandlerUtil.getCurrentSelection(event);
+ return selection instanceof IStructuredSelection ? (IStructuredSelection)selection : StructuredSelection.EMPTY;
+ }
+
+ /**
+ * Returns the default wizard dialog width.
+ *
+ * @return The default wizard dialog width in pixel.
+ */
+ protected int getDefaultWidth() {
+ return DEFAULT_WIZARD_WIDTH;
+ }
+
+ /**
+ * Returns the default wizard dialog height.
+ *
+ * @return The default wizard dialog height in pixel.
+ */
+ protected int getDefaultHeight() {
+ return DEFAULT_WIZARD_HEIGHT;
+ }
+
+ /**
+ * Returns the help id to be associated with the wizard dialog.
+ *
+ * @return The help id or <code>null</code>.
+ */
+ protected abstract String getHelpId();
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindow(event);
+ if (window != null) {
+ // Create the wizard
+ IWizard wizard = createWizard();
+ Assert.isNotNull(wizard);
+
+ // If the wizard is a workbench wizard, initialize the wizard
+ // with the current workbench instance and the current selection
+ if (wizard instanceof IWorkbenchWizard) {
+ ((IWorkbenchWizard)wizard).init(window.getWorkbench(), getCurrentSelection(event));
+ }
+
+ // Create and configure the wizard dialog
+ WizardDialog dialog = createWizardDialog(window.getShell(), wizard);
+ dialog.create();
+ dialog.getShell().setSize(Math.max(getDefaultWidth(), dialog.getShell().getSize().x), getDefaultHeight());
+
+ // Configure the wizard dialog help id
+ if (getHelpId() != null) {
+ window.getWorkbench().getHelpSystem().setHelp(dialog.getShell(), getHelpId());
+ }
+
+ // Open the dialog
+ dialog.open();
+ }
+
+ return null;
+ }
+
+
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/interfaces/INewTargetWizard.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/interfaces/INewTargetWizard.java
new file mode 100644
index 000000000..b5235670e
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/interfaces/INewTargetWizard.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.wizards.interfaces;
+
+import org.eclipse.tcf.te.ui.wizards.newWizard.NewWizardSelectionPage;
+import org.eclipse.ui.wizards.IWizardDescriptor;
+
+/**
+ * Interface to be implemented optionally by new target wizards.
+ */
+public interface INewTargetWizard {
+
+ /**
+ * Called by the {@link NewWizardSelectionPage} to associate the wizard
+ * instance with the wizard descriptor the wizard got created from.
+ * <p>
+ * This method is called just before
+ * {@link #init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection)}
+ * is called.
+ *
+ * @param descriptor
+ */
+ public void setWizardDescriptor(IWizardDescriptor descriptor);
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/interfaces/ISharedDataWizardPage.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/interfaces/ISharedDataWizardPage.java
new file mode 100644
index 000000000..03951fc58
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/interfaces/ISharedDataWizardPage.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.wizards.interfaces;
+
+import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer;
+
+/**
+ * Public interface for wizard or dialog pages or wizard page
+ * widgets sharing a common data object.
+ */
+public interface ISharedDataWizardPage {
+
+ /**
+ * Initialize the page widgets based of the data from the given properties container.
+ * <p>
+ * This method may called multiple times during the lifetime of the page and
+ * the given properties container might be even <code>null</code>.
+ *
+ * @param data The properties container or <code>null</code>.
+ */
+ public void setupData(IPropertiesContainer data);
+
+ /**
+ * Extract the data from the page widgets and write it back to the given
+ * properties container.
+ * <p>
+ * This method may called multiple times during the lifetime of the page and
+ * the given properties container might be even <code>null</code>.
+ *
+ * @param data The properties container or <code>null</code>.
+ */
+ public void extractData(IPropertiesContainer data);
+
+ /**
+ * Initialize the given properties container with default values for the data
+ * this page is managing.
+ * <p>
+ * This method is called once for each wizard page and is typically called from a
+ * new target wizard. The page widgets are typically not yet created as this method
+ * can be called before the page is set visible.
+ *
+ * @param data The properties container or <code>null</code>.
+ */
+ public void initializeData(IPropertiesContainer data);
+
+ /**
+ * Remove the data of the page widgets from the given properties
+ * container.
+ * <p>
+ * This method may called multiple times during the lifetime of the page and the
+ * given properties container might be even <code>null</code>.
+ *
+ * @param data The properties container or <code>null</code>.
+ */
+ public void removeData(IPropertiesContainer data);
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/interfaces/IValidatableWizardPage.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/interfaces/IValidatableWizardPage.java
new file mode 100644
index 000000000..4828f7bd5
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/interfaces/IValidatableWizardPage.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.wizards.interfaces;
+
+import org.eclipse.jface.wizard.WizardPage;
+
+/**
+ * Public interface for validatable wizard pages.
+ */
+public interface IValidatableWizardPage {
+
+ /**
+ * Validates the page status.
+ * <p>
+ * If necessary, set corresponding messages and message types to signal if some
+ * control on the page needs attention.
+ * <p>
+ * Depending on the outcome of the page data validation, call {@link WizardPage#setPageComplete(boolean)}
+ * with either <code>true</code> or <code>false</code> to signal if the wizard
+ * can finish given the current page data or not.
+ */
+ public void validatePage();
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/newWizard/NewWizard.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/newWizard/NewWizard.java
new file mode 100644
index 000000000..474b7444c
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/newWizard/NewWizard.java
@@ -0,0 +1,123 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.wizards.newWizard;
+
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.IWizard;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.tcf.te.ui.activator.UIPlugin;
+import org.eclipse.tcf.te.ui.interfaces.ImageConsts;
+import org.eclipse.tcf.te.ui.nls.Messages;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * The New Target wizard implementation.
+ *
+ * @noextend This class is not intended to be subclassed by clients.
+ */
+public final class NewWizard extends Wizard implements INewWizard {
+ // The new target wizard registry to use
+ private NewWizardRegistry wizardRegistry;
+ // The new wizard selection page instance
+ private NewWizardSelectionPage mainPage;
+
+ /**
+ * Constructor.
+ */
+ public NewWizard() {
+ super();
+ setWindowTitle(Messages.NewWizard_dialog_title);
+ setForcePreviousAndNextButtons(true);
+ setNeedsProgressMonitor(true);
+
+ // Initialize the dialog settings for this wizard
+ IDialogSettings settings = UIPlugin.getDefault().getDialogSettings();
+ String sectionName = this.getClass().getName();
+ if (settings.getSection(sectionName) == null) settings.addNewSection(sectionName);
+ setDialogSettings(settings.getSection(sectionName));
+
+ wizardRegistry = NewWizardRegistry.getInstance();
+ mainPage = new NewWizardSelectionPage(wizardRegistry);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.wizard.Wizard#dispose()
+ */
+ @Override
+ public void dispose() {
+ super.dispose();
+ mainPage = null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.wizard.Wizard#getDefaultPageImage()
+ */
+ @Override
+ public Image getDefaultPageImage() {
+ return UIPlugin.getImage(ImageConsts.NEW_TARGET_WIZARD);
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection)
+ */
+ @Override
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ if (mainPage != null) mainPage.init(workbench, selection);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.wizard.Wizard#addPages()
+ */
+ @Override
+ public void addPages() {
+ if (mainPage != null) addPage(mainPage);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.rse.ui.wizards.AbstractSystemWizard#performFinish()
+ */
+ @Override
+ public boolean performFinish() {
+ if (mainPage != null) {
+ // Trigger the saving of the widget values of
+ // the main wizard selection page
+ mainPage.saveWidgetValues();
+
+ // If the finish is invoked directly from the main page,
+ // call performFinish() for the selected wizard too.
+ if (mainPage.equals(getContainer().getCurrentPage())) {
+ if (mainPage.canFinishEarly() && mainPage.getSelectedNode() != null) {
+ // Get the selected wizard
+ IWizard wizard = mainPage.getSelectedNode().getWizard();
+ if (wizard != null) {
+ wizard.setContainer(getContainer());
+ wizard.performFinish();
+ }
+ }
+ }
+ }
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.wizard.Wizard#canFinish()
+ */
+ @Override
+ public boolean canFinish() {
+ if (mainPage != null && mainPage.equals(getContainer().getCurrentPage())) {
+ return mainPage.canFinishEarly();
+ }
+ return super.canFinish();
+ }
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/newWizard/NewWizardCommandHandler.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/newWizard/NewWizardCommandHandler.java
new file mode 100644
index 000000000..7e20aebce
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/newWizard/NewWizardCommandHandler.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.wizards.newWizard;
+
+import org.eclipse.jface.wizard.IWizard;
+import org.eclipse.tcf.te.ui.interfaces.IContextHelpIds;
+import org.eclipse.tcf.te.ui.wizards.AbstractWizardCommandHandler;
+
+/**
+ * &quot;org.eclipse.tcf.te.ui.command.newWizards" default command handler implementation.
+ */
+public class NewWizardCommandHandler extends AbstractWizardCommandHandler {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.ui.wizards.AbstractWizardCommandHandler#createWizard()
+ */
+ @Override
+ protected IWizard createWizard() {
+ return new NewWizard();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.ui.wizards.AbstractWizardCommandHandler#getHelpId()
+ */
+ @Override
+ protected String getHelpId() {
+ return IContextHelpIds.NEW_TARGET_WIZARD;
+ }
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/newWizard/NewWizardNode.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/newWizard/NewWizardNode.java
new file mode 100644
index 000000000..716e51527
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/newWizard/NewWizardNode.java
@@ -0,0 +1,144 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.wizards.newWizard;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.IWizard;
+import org.eclipse.jface.wizard.IWizardNode;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.tcf.te.ui.activator.UIPlugin;
+import org.eclipse.tcf.te.ui.nls.Messages;
+import org.eclipse.tcf.te.ui.wizards.interfaces.INewTargetWizard;
+import org.eclipse.ui.IPluginContribution;
+import org.eclipse.ui.IWorkbenchWizard;
+import org.eclipse.ui.internal.util.Util;
+import org.eclipse.ui.wizards.IWizardDescriptor;
+
+/**
+ * New wizard node implementation.
+ */
+@SuppressWarnings("restriction")
+/* default */ class NewWizardNode implements IWizardNode, IPluginContribution {
+ // The associated wizard descriptor
+ private final IWizardDescriptor descriptor;
+ // The parent wizard selection page
+ private final NewWizardSelectionPage page;
+
+ // The wizard instance, once created
+ private IWizard wizard;
+
+ /**
+ * Constructor.
+ *
+ * @param page The parent wizard selection page. Must not be <code>null</code>.
+ * @param descriptor The wizard descriptor. Must not be <code>null</code>.
+ */
+ public NewWizardNode(NewWizardSelectionPage page, IWizardDescriptor descriptor) {
+ Assert.isNotNull(page);
+ Assert.isNotNull(descriptor);
+
+ this.page = page;
+ this.descriptor = descriptor;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.wizard.IWizardNode#dispose()
+ */
+ @Override
+ public void dispose() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.wizard.IWizardNode#getExtent()
+ */
+ @Override
+ public Point getExtent() {
+ return new Point(-1, -1);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IPluginContribution#getLocalId()
+ */
+ @Override
+ public String getLocalId() {
+ IPluginContribution contribution = (IPluginContribution)Util.getAdapter(descriptor, IPluginContribution.class);
+ if (contribution != null) {
+ return contribution.getLocalId();
+ }
+ return descriptor.getId();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IPluginContribution#getPluginId()
+ */
+ @Override
+ public String getPluginId() {
+ IPluginContribution contribution = (IPluginContribution) Util.getAdapter(descriptor, IPluginContribution.class);
+ if (contribution != null) {
+ return contribution.getPluginId();
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.wizard.IWizardNode#isContentCreated()
+ */
+ @Override
+ public boolean isContentCreated() {
+ return wizard != null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.wizard.IWizardNode#getWizard()
+ */
+ @Override
+ public IWizard getWizard() {
+ if (wizard == null) {
+ wizard = createWizard(descriptor);
+ }
+ return wizard;
+ }
+
+ /**
+ * Create the wizard associated with the specified wizard descriptor.
+ *
+ * @param descriptor The wizard descriptor. Must not be <code>null</code>.
+ * @return The wizard or <code>null</code> if the creation fails.
+ */
+ private final IWorkbenchWizard createWizard(IWizardDescriptor descriptor) {
+ Assert.isNotNull(descriptor);
+
+ IWorkbenchWizard wizard = null;
+
+ try {
+ // Create the wizard instance
+ wizard = descriptor.createWizard();
+
+ // If the wizard is a INewTargetWizard, associate the wizard descriptor
+ if (wizard instanceof INewTargetWizard) ((INewTargetWizard)wizard).setWizardDescriptor(descriptor);
+
+ // Initialize the wizard
+ IStructuredSelection wizardSelection = descriptor.adaptedSelection(page.getSelection());
+ wizard.init(page.getWorkbench(), wizardSelection);
+ } catch (CoreException e) {
+ page.setErrorMessage(Messages.NewWizardSelectionPage_createWizardFailed);
+
+ IStatus status = new Status(IStatus.ERROR, UIPlugin.getUniqueIdentifier(),
+ Messages.NewWizardSelectionPage_createWizardFailed, e);
+ UIPlugin.getDefault().getLog().log(status);
+ }
+
+ return wizard;
+ }
+} \ No newline at end of file
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/newWizard/NewWizardRegistry.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/newWizard/NewWizardRegistry.java
new file mode 100644
index 000000000..0b297ad3e
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/newWizard/NewWizardRegistry.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.wizards.newWizard;
+
+
+import org.eclipse.tcf.te.ui.activator.UIPlugin;
+import org.eclipse.ui.internal.wizards.AbstractExtensionWizardRegistry;
+
+/**
+ * New target wizard registry.
+ *
+ * @see org.eclipse.ui.internal.wizards.NewWizardRegistry
+ */
+@SuppressWarnings("restriction")
+public final class NewWizardRegistry extends AbstractExtensionWizardRegistry {
+
+ /*
+ * Thread save singleton instance creation.
+ */
+ private static class LazyInstance {
+ public static NewWizardRegistry instance = new NewWizardRegistry();
+ }
+
+ /**
+ * Constructor.
+ */
+ /* default */ NewWizardRegistry() {
+ super();
+ }
+
+ /**
+ * Returns the singleton instance of the wizard registry.
+ */
+ public static NewWizardRegistry getInstance() {
+ return LazyInstance.instance;
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.internal.wizards.AbstractExtensionWizardRegistry#getExtensionPoint()
+ */
+ @Override
+ protected String getExtensionPoint() {
+ return "newWizards"; //$NON-NLS-1$
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.internal.wizards.AbstractExtensionWizardRegistry#getPlugin()
+ */
+ @Override
+ protected String getPlugin() {
+ return UIPlugin.getUniqueIdentifier();
+ }
+
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/newWizard/NewWizardSelectionPage.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/newWizard/NewWizardSelectionPage.java
new file mode 100644
index 000000000..d983ab45b
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/newWizard/NewWizardSelectionPage.java
@@ -0,0 +1,402 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.wizards.newWizard;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IBasicPropertyConstants;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.ViewerComparator;
+import org.eclipse.jface.wizard.IWizard;
+import org.eclipse.jface.wizard.IWizardContainer;
+import org.eclipse.jface.wizard.IWizardNode;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.tcf.te.ui.activator.UIPlugin;
+import org.eclipse.tcf.te.ui.interfaces.IUIConstants;
+import org.eclipse.tcf.te.ui.nls.Messages;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.activities.ITriggerPoint;
+import org.eclipse.ui.activities.WorkbenchActivityHelper;
+import org.eclipse.ui.dialogs.FilteredTree;
+import org.eclipse.ui.dialogs.PatternFilter;
+import org.eclipse.ui.internal.activities.ws.WorkbenchTriggerPoints;
+import org.eclipse.ui.internal.dialogs.WizardContentProvider;
+import org.eclipse.ui.internal.dialogs.WizardPatternFilter;
+import org.eclipse.ui.model.WorkbenchLabelProvider;
+import org.eclipse.ui.wizards.IWizardCategory;
+import org.eclipse.ui.wizards.IWizardDescriptor;
+
+/**
+ * The New Target creation wizard selection page implementation.
+ */
+@SuppressWarnings("restriction")
+public class NewWizardSelectionPage extends WizardPage {
+ // The wizards settings storage id where the expanded categories are remembered
+ private static final String EXPANDED_CATEGORIES_SETTINGS_ID = "filteredTree.expandedCatogryIds"; //$NON-NLS-1$
+
+ // The wizards settings storage id where the selected wizard descriptor id is remembered
+ private static final String SELECTED_WIZARD_DESCRIPTOR_SETTINGS_ID = "filteredTree.selectedWizardDescriptorId"; //$NON-NLS-1$
+
+ // The default expanded category id's
+ private static final String[] DEFAULT_EXPANDED_CATEGORY_IDS = new String[] { "org.eclipse.tcf.te.ui.newWizards.category.general" }; //$NON-NLS-1$
+
+ // The new target wizard registry
+ private NewWizardRegistry wizardRegistry;
+
+ // References to the page subcontrol's
+ private FilteredTree filteredTree;
+ private PatternFilter filteredTreeFilter;
+
+ // The selected wizard descriptor
+ private IWizardDescriptor selectedWizardDescriptor;
+
+ // The wizard nodes per wizard descriptor
+ private final Map<IWizardDescriptor, IWizardNode> wizardNodes = new HashMap<IWizardDescriptor, IWizardNode>();
+
+ // The workbench instance as passed in by init(...)
+ private IWorkbench workbench;
+ // The selection as passed in by init(...)
+ private IStructuredSelection selection;
+
+ /**
+ * Internal class. The wizard viewer comparator is responsible for
+ * the sorting in the tree. Current implementation is not prioritizing
+ * categories.
+ */
+ /* default */ static class NewWizardViewerComparator extends ViewerComparator {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ViewerComparator#isSorterProperty(java.lang.Object, java.lang.String)
+ */
+ @Override
+ public boolean isSorterProperty(Object element, String property) {
+ // The comparator is affected if the label of the elements should change.
+ return property.equals(IBasicPropertyConstants.P_TEXT);
+ }
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param wizardRegistry The new target wizard registry. Must not be <code>null</code>.
+ */
+ public NewWizardSelectionPage(NewWizardRegistry wizardRegistry) {
+ super(NewWizardSelectionPage.class.getSimpleName());
+
+ setTitle(getDefaultTitle());
+ setDescription(getDefaultDescription());
+
+ Assert.isNotNull(wizardRegistry);
+ this.wizardRegistry = wizardRegistry;
+ }
+
+ /**
+ * Returns the default page title.
+ *
+ * @return The default page title. Must be never <code>null</code>.
+ */
+ protected String getDefaultTitle() {
+ return Messages.NewWizardSelectionPage_title;
+ }
+
+ /**
+ * Returns the default page description.
+ *
+ * @return The default page description. Must be never <code>null</code>.
+ */
+ protected String getDefaultDescription() {
+ return Messages.NewWizardSelectionPage_description;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ public void createControl(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ Label label = new Label(composite, SWT.NONE);
+ label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ label.setText(Messages.NewWizardSelectionPage_wizards);
+ label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ filteredTreeFilter = new WizardPatternFilter();
+ filteredTree = new FilteredTree(composite, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER, filteredTreeFilter, true);
+ filteredTree.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
+ GridData layoutData = new GridData(GridData.FILL_BOTH);
+ layoutData.heightHint = 325; layoutData.widthHint = 450;
+ filteredTree.setLayoutData(layoutData);
+
+ final TreeViewer treeViewer = filteredTree.getViewer();
+ treeViewer.setContentProvider(new WizardContentProvider());
+ treeViewer.setLabelProvider(new WorkbenchLabelProvider());
+ treeViewer.setComparator(new NewWizardViewerComparator());
+
+ treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+ @Override
+ public void selectionChanged(SelectionChangedEvent event) {
+ onSelectionChanged();
+ }
+ });
+ treeViewer.addDoubleClickListener(new IDoubleClickListener() {
+ @Override
+ public void doubleClick(DoubleClickEvent event) {
+ // Double-click on a connection type is triggering the sub wizard
+ if (event.getSelection() instanceof IStructuredSelection) {
+ IStructuredSelection selection = (IStructuredSelection)event.getSelection();
+ // The tree is single selection, so look for the first element only.
+ Object element = selection.getFirstElement();
+ if (element instanceof IWizardDescriptor) {
+ // Double-click on a connection type is triggering the sub wizard
+ if (canFlipToNextPage()) getWizard().getContainer().showPage(getNextPage());
+ } else if (event.getViewer() instanceof TreeViewer) {
+ TreeViewer viewer = (TreeViewer)event.getViewer();
+ if (viewer.isExpandable(element)) {
+ viewer.setExpandedState(element, !viewer.getExpandedState(element));
+ }
+ }
+ }
+ }
+ });
+
+ treeViewer.setInput(wizardRegistry.getRootCategory());
+
+ // apply the standard dialog font
+ Dialog.applyDialogFont(composite);
+
+ setControl(composite);
+
+ // Restore the tree state
+ restoreWidgetValues();
+
+ // Initialize the context help id
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IUIConstants.HELP_NEW_WIZARD_SELECTION_PAGE);
+ }
+
+ /**
+ * Initialize the page with the current workbench instance and the
+ * current workbench selection.
+ *
+ * @param workbench The current workbench.
+ * @param selection The current object selection.
+ */
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ this.workbench = workbench;
+ this.selection = selection;
+ }
+
+ /**
+ * Returns the current workbench.
+ *
+ * @return The current workbench or <code>null</code> if not set.
+ */
+ public IWorkbench getWorkbench() {
+ return workbench;
+ }
+
+ /**
+ * Returns the current object selection.
+ *
+ * @return The current object selection or <code>null</code> if not set.
+ */
+ public IStructuredSelection getSelection() {
+ return selection;
+ }
+
+ /**
+ * Called from the selection listener to propagate the current
+ * system type selection to the underlying wizard.
+ */
+ protected void onSelectionChanged() {
+ if (filteredTree.getViewer().getSelection() instanceof IStructuredSelection) {
+ IStructuredSelection filteredTreeSelection = (IStructuredSelection)filteredTree.getViewer().getSelection();
+ if (filteredTreeSelection.getFirstElement() instanceof IWizardDescriptor) {
+ selectedWizardDescriptor = (IWizardDescriptor)filteredTreeSelection.getFirstElement();
+
+ // Update the description if the current wizard descriptor has one
+ if (selectedWizardDescriptor.getDescription() != null && !"".equals(selectedWizardDescriptor.getDescription())) { //$NON-NLS-1$
+ setDescription(selectedWizardDescriptor.getDescription());
+ } else {
+ if (!getDefaultDescription().equals(getDescription())) setDescription(getDefaultDescription());
+ }
+ } else {
+ selectedWizardDescriptor = null;
+ }
+
+ // Create the wizard node for the selected descriptor if not yet done
+ if (selectedWizardDescriptor != null && !wizardNodes.containsKey(selectedWizardDescriptor)) {
+ wizardNodes.put(selectedWizardDescriptor, new NewWizardNode(this, selectedWizardDescriptor));
+ }
+ }
+
+ // Update the wizard container UI elements
+ IWizardContainer container = getContainer();
+ if (container != null && container.getCurrentPage() != null) {
+ container.updateWindowTitle();
+ container.updateTitleBar();
+ container.updateButtons();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.wizard.WizardPage#getNextPage()
+ */
+ @Override
+ public IWizardPage getNextPage() {
+ ITriggerPoint triggerPoint = workbench.getActivitySupport().getTriggerPointManager().getTriggerPoint(WorkbenchTriggerPoints.NEW_WIZARDS);
+ if (triggerPoint == null || WorkbenchActivityHelper.allowUseOf(triggerPoint, getSelectedNode())) {
+ IWizardNode selectedNode = getSelectedNode();
+ if (selectedNode != null) {
+ // Determine if the content got create before(!) triggering
+ // the wizard creation
+ boolean isCreated = selectedNode.isContentCreated();
+ // Get the wizard from the selected node (triggers wizard creation if needed)
+ IWizard wizard = selectedNode.getWizard();
+ if (wizard != null) {
+ // If the wizard got created by the call to getWizard(),
+ // then allow the wizard to create its pages
+ if (!isCreated) wizard.addPages();
+ // Return the starting page of the wizard
+ return wizard.getStartingPage();
+ }
+ }
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.wizard.WizardPage#canFlipToNextPage()
+ */
+ @Override
+ public boolean canFlipToNextPage() {
+ if (selectedWizardDescriptor != null && selectedWizardDescriptor.hasPages()) {
+ return super.canFlipToNextPage();
+ }
+ return false;
+ }
+
+ /**
+ * Returns if or if not the wizard can be finished early.
+ *
+ * @return <code>True</code> if the wizard can be finished early, <code>false</code> otherwise.
+ */
+ public boolean canFinishEarly() {
+ return selectedWizardDescriptor != null && selectedWizardDescriptor.canFinishEarly();
+ }
+
+ /**
+ * Returns the wizard node for the currently selected
+ * wizard descriptor.
+ *
+ * @return The wizard node or <code>null</code> if none.
+ */
+ public IWizardNode getSelectedNode() {
+ IWizardNode node = null;
+ if (selectedWizardDescriptor != null) {
+ node = wizardNodes.get(selectedWizardDescriptor);
+ }
+ return node;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.wizard.WizardPage#getDialogSettings()
+ */
+ @Override
+ protected IDialogSettings getDialogSettings() {
+ // If the wizard is set and returns dialog settings, we re-use them here
+ IDialogSettings settings = super.getDialogSettings();
+ // If the dialog settings could not set from the wizard, fallback to the plugin's
+ // dialog settings store.
+ if (settings == null) settings = UIPlugin.getDefault().getDialogSettings();
+ String sectionName = this.getClass().getName();
+ if (settings.getSection(sectionName) == null) settings.addNewSection(sectionName);
+ settings = settings.getSection(sectionName);
+
+ return settings;
+ }
+
+ /**
+ * Restore the tree state from the dialog settings.
+ */
+ public void restoreWidgetValues() {
+ IDialogSettings settings = getDialogSettings();
+ if (settings != null) {
+ String[] expandedCategories = settings.getArray(EXPANDED_CATEGORIES_SETTINGS_ID);
+ // by default we expand always the "General" category.
+ if (expandedCategories == null) expandedCategories = DEFAULT_EXPANDED_CATEGORY_IDS;
+ if (expandedCategories != null) {
+ List<IWizardCategory> expanded = new ArrayList<IWizardCategory>();
+ for (int i = 0; i < expandedCategories.length; i++) {
+ String categoryId = expandedCategories[i];
+ if (categoryId != null && !"".equals(categoryId.trim())) { //$NON-NLS-1$
+ IWizardCategory category = wizardRegistry.findCategory(categoryId);
+ if (category != null && !expanded.contains(category)) {
+ expanded.add(category);
+ }
+ }
+ }
+
+ if (expanded.size() > 0) filteredTree.getViewer().setExpandedElements(expanded.toArray());
+ }
+
+ String selectedWizardDescriptorId = settings.get(SELECTED_WIZARD_DESCRIPTOR_SETTINGS_ID);
+ if (selectedWizardDescriptorId != null && !"".equals(selectedWizardDescriptorId.trim())) { //$NON-NLS-1$
+ IWizardDescriptor descriptor = wizardRegistry.findWizard(selectedWizardDescriptorId);
+ if (descriptor != null) {
+ filteredTree.getViewer().setSelection(new StructuredSelection(descriptor), true);
+ }
+ }
+ }
+ }
+
+ /**
+ * Saves the tree state to the wizards settings store.
+ */
+ public void saveWidgetValues() {
+ IDialogSettings settings = getDialogSettings();
+ if (settings != null) {
+ List<String> expandedCategories = new ArrayList<String>();
+ Object[] expanded = filteredTree.getViewer().getVisibleExpandedElements();
+ for (int i = 0; i < expanded.length; i++) {
+ if (expanded[i] instanceof IWizardCategory) {
+ expandedCategories.add(((IWizardCategory)expanded[i]).getId());
+ }
+ }
+ settings.put(EXPANDED_CATEGORIES_SETTINGS_ID, expandedCategories.toArray(new String[expandedCategories.size()]));
+
+ if (selectedWizardDescriptor != null) {
+ settings.put(SELECTED_WIZARD_DESCRIPTOR_SETTINGS_ID, selectedWizardDescriptor.getId());
+ } else {
+ settings.put(SELECTED_WIZARD_DESCRIPTOR_SETTINGS_ID, ""); //$NON-NLS-1$
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/pages/AbstractFormsWizardPage.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/pages/AbstractFormsWizardPage.java
new file mode 100644
index 000000000..27f4dbeca
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/pages/AbstractFormsWizardPage.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.wizards.pages;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.tcf.te.ui.forms.CustomFormToolkit;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * Abstract wizard page using forms.
+ */
+public abstract class AbstractFormsWizardPage extends AbstractWizardPage {
+ // The forms toolkit instance
+ private CustomFormToolkit toolkit = null;
+
+ /**
+ * Constructor.
+ *
+ * @param pageName The page name. Must not be <code>null</code>.
+ */
+ public AbstractFormsWizardPage(String pageName) {
+ super(pageName);
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param pageName The page name. Must not be <code>null</code>.
+ * @param title The wizard page title or <code>null</code>.
+ * @param titleImage The wizard page title image or <code>null</code>.
+ */
+ public AbstractFormsWizardPage(String pageName, String title, ImageDescriptor titleImage) {
+ super(pageName, title, titleImage);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.dialogs.DialogPage#dispose()
+ */
+ @Override
+ public void dispose() {
+ toolkit = null;
+ super.dispose();
+ }
+
+ /**
+ * Creates the forms toolkit to use.
+ *
+ * @param display The display. Must not be <code>null</code>.
+ * @return The forms toolkit instance. Must never be <code>null</code>.
+ */
+ protected CustomFormToolkit createFormToolkit(Display display) {
+ Assert.isNotNull(display);
+ return new CustomFormToolkit(new FormToolkit(display));
+ }
+
+ /**
+ * Returns the forms toolkit to use.
+ * <p>
+ * If {@link #createControl(Composite)} hasn't been called yet, or
+ * {@link #dispose()} has been called, the method will return
+ * <code>null</code>.
+ *
+ * @return The forms toolkit instance or <code>null</code>.
+ */
+ public final CustomFormToolkit getFormToolkit() {
+ return toolkit;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ public void createControl(Composite parent) {
+ // Create the form toolkit
+ toolkit = createFormToolkit(parent.getDisplay());
+ Assert.isNotNull(toolkit);
+ }
+
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/pages/AbstractSharedDataWizardPage.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/pages/AbstractSharedDataWizardPage.java
new file mode 100644
index 000000000..700886d23
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/pages/AbstractSharedDataWizardPage.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.wizards.pages;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.tcf.te.ui.wizards.interfaces.ISharedDataWizardPage;
+import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer;
+
+/**
+ * An abstract shared data wizard page implementation.
+ */
+public abstract class AbstractSharedDataWizardPage extends AbstractValidatableWizardPage implements ISharedDataWizardPage {
+
+ /**
+ * Constructor.
+ *
+ * @param pageName The page name. Must not be <code>null</code>.
+ */
+ public AbstractSharedDataWizardPage(String pageName) {
+ super(pageName);
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param pageName The page name. Must not be <code>null</code>.
+ * @param title The wizard page title or <code>null</code>.
+ * @param titleImage The wizard page title image or <code>null</code>.
+ */
+ public AbstractSharedDataWizardPage(String pageName, String title, ImageDescriptor titleImage) {
+ super(pageName, title, titleImage);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.ui.wizards.interfaces.ISharedDataWizardPage#setupData(org.eclipse.tcf.te.runtime.interfaces.nodes.IPropertiesContainer)
+ */
+ @Override
+ public void setupData(IPropertiesContainer data) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.ui.wizards.interfaces.ISharedDataWizardPage#extractData(org.eclipse.tcf.te.runtime.interfaces.nodes.IPropertiesContainer)
+ */
+ @Override
+ public void extractData(IPropertiesContainer data) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.ui.wizards.interfaces.ISharedDataWizardPage#initializeData(org.eclipse.tcf.te.runtime.interfaces.nodes.IPropertiesContainer)
+ */
+ @Override
+ public void initializeData(IPropertiesContainer data) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.ui.wizards.interfaces.ISharedDataWizardPage#removeData(org.eclipse.tcf.te.runtime.interfaces.nodes.IPropertiesContainer)
+ */
+ @Override
+ public void removeData(IPropertiesContainer data) {
+ }
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/pages/AbstractValidatableWizardPage.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/pages/AbstractValidatableWizardPage.java
new file mode 100644
index 000000000..d44944ca3
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/pages/AbstractValidatableWizardPage.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.wizards.pages;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.tcf.te.ui.wizards.interfaces.IValidatableWizardPage;
+
+/**
+ * An abstract validatable wizard page implementation.
+ * <p>
+ * This wizard page implementation is adding utility methods
+ * for handling page validation.
+ */
+public abstract class AbstractValidatableWizardPage extends AbstractWizardPage implements IValidatableWizardPage {
+ // A used to detect if a validation process is already running.
+ // If set to true, validatePage() should return immediately.
+ private boolean validationInProgress = false;
+
+ /**
+ * Constructor.
+ *
+ * @param pageName The page name. Must not be <code>null</code>.
+ */
+ public AbstractValidatableWizardPage(String pageName) {
+ super(pageName);
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param pageName The page name. Must not be <code>null</code>.
+ * @param title The wizard page title or <code>null</code>.
+ * @param titleImage The wizard page title image or <code>null</code>.
+ */
+ public AbstractValidatableWizardPage(String pageName, String title, ImageDescriptor titleImage) {
+ super(pageName, title, titleImage);
+ }
+
+ /**
+ * Set the validation in progress state.
+ *
+ * @param state <code>True</code> to mark validation in progress, <code>false</code> otherwise.
+ */
+ public final boolean setValidationInProgress(boolean state) {
+ boolean changed = false;
+ // Apply only if really changed
+ if (validationInProgress != state) {
+ // Set the new value
+ validationInProgress = state;
+ onValidationInProgressChanged(validationInProgress);
+ changed = true;
+ }
+ return changed;
+ }
+
+ /**
+ * Called from {@link #setValidationInProgress(boolean)} if the value
+ * of the corresponding flag changed. Subclasses may overwrite this
+ * method if additional custom steps shall be executed.
+ * <p>
+ * The default implementation is doing nothing.
+ *
+ * @param newValue The new value of the validation in progress flag. Same as calling {@link #isValidationInProgress()}.
+ */
+ protected void onValidationInProgressChanged(boolean newValue) {
+ }
+
+ /**
+ * Returns if the current validation in progress state.
+ *
+ * @return <code>True</code> to mark validation in progress, <code>false</code> otherwise.
+ */
+ public final boolean isValidationInProgress() {
+ return validationInProgress;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.ui.controls.interfaces.IValidatableDialogPage#validatePage()
+ */
+ @Override
+ public void validatePage() {
+ if (isValidationInProgress()) return;
+ setValidationInProgress(true);
+
+ setMessage(null);
+ setErrorMessage(null);
+ setPageComplete(true);
+
+ setValidationInProgress(false);
+ }
+
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/pages/AbstractWizardPage.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/pages/AbstractWizardPage.java
new file mode 100644
index 000000000..9d3c2f4b6
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/wizards/pages/AbstractWizardPage.java
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.wizards.pages;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.tcf.te.ui.swt.SWTControlUtil;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * An abstract common wizard page implementation.
+ * <p>
+ * This wizard page implementation is adding control history management
+ * and link the page with the context help system.
+ */
+public abstract class AbstractWizardPage extends WizardPage {
+ // The context help id of the wizard page
+ private String contextHelpId = null;
+
+ /**
+ * Constructor.
+ *
+ * @param pageName The page name. Must not be <code>null</code>.
+ */
+ public AbstractWizardPage(String pageName) {
+ super(pageName);
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param pageName The page name. Must not be <code>null</code>.
+ * @param title The wizard page title or <code>null</code>.
+ * @param titleImage The wizard page title image or <code>null</code>.
+ */
+ public AbstractWizardPage(String pageName, String title, ImageDescriptor titleImage) {
+ super(pageName, title, titleImage);
+ }
+
+ /**
+ * Set the wizard page context help id.
+ * <p>
+ * If set to non <code>null</code>, than the help id is associated
+ * with the pages control once subclasses calls {@link #setControl(org.eclipse.swt.widgets.Control)}.
+ *
+ * @param contextHelpId The context help id or <code>null</code> if none.
+ */
+ protected final void setContextHelpId(String contextHelpId) {
+ this.contextHelpId = contextHelpId;
+ }
+
+ /**
+ * Returns the wizard page context help id.
+ *
+ * @return The context help id or <code>null</code> if none.
+ */
+ protected final String getContextHelpId() {
+ return contextHelpId;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.dialogs.DialogPage#performHelp()
+ */
+ @Override
+ public void performHelp() {
+ String contextHelpId = getContextHelpId();
+ if (contextHelpId != null) {
+ PlatformUI.getWorkbench().getHelpSystem().displayHelp(contextHelpId);
+ }
+ }
+
+ /**
+ * Convenience method to create a "invisible" label for creating an
+ * empty space between controls.
+ *
+ * @param parent The parent composite. Must not be <code>null</code>.
+ * @param heightHint The height hint in pixel or <code>SWT.DEFAULT</code>.
+ * @param span The horizontal span.
+ * @param toolkit The form toolkit or <code>null</code>.
+ *
+ * @return
+ */
+ protected Label createEmptySpace(Composite parent, int heightHint, int span, FormToolkit toolkit) {
+ Assert.isNotNull(parent);
+
+ Label emptySpace = toolkit != null ? toolkit.createLabel(parent, null) : new Label(parent, SWT.NONE);
+
+ GridData layoutData = new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false);
+ layoutData.horizontalSpan = span;
+ layoutData.widthHint = 0; layoutData.heightHint = heightHint != SWT.DEFAULT ? heightHint : SWTControlUtil.convertHeightInCharsToPixels(emptySpace, 1);
+
+ emptySpace.setLayoutData(layoutData);
+
+ return emptySpace;
+ }
+
+ /**
+ * Saves the widget history of all UI elements of the page.
+ */
+ public void saveWidgetValues() {
+ }
+
+ /**
+ * Restores the widget history of all UI elements of the page.
+ */
+ public void restoreWidgetValues() {
+ }
+}

Back to the top