diff options
| author | pguilet | 2017-07-11 09:12:59 +0000 |
|---|---|---|
| committer | pguilet | 2017-07-25 13:54:14 +0000 |
| commit | 2a558aba45bacafe31b0aec30efa0e717070b8a4 (patch) | |
| tree | f6db18d129cb0e20258c1bfcd1cef4e348164f94 | |
| parent | 76a352526f7647c4be4eb462c4dc75d2012f43ba (diff) | |
| download | org.eclipse.sirius-2a558aba45bacafe31b0aec30efa0e717070b8a4.tar.gz org.eclipse.sirius-2a558aba45bacafe31b0aec30efa0e717070b8a4.tar.xz org.eclipse.sirius-2a558aba45bacafe31b0aec30efa0e717070b8a4.zip | |
[518524] Page providing API creation
An API based on a registry and page providers has been created.
It allows to register providers of additional pages for the aird editor
with positioning information.
An ordering algorithm has been created to displays provided pages in
the right order defined by all page positioning information.
The default page now uses this API to be displayed in aird editor.
The Sirius debug plugin now provides an empty aird editor page by using
the new API when the Sirius debug view is active.
Bug: 518524
Change-Id: I60c65d6c36dacdf694e429eabd3c635a53fc0575
Signed-off-by: pguilet <pierre.guilet@obeo.fr>
16 files changed, 1511 insertions, 153 deletions
diff --git a/plugins/org.eclipse.sirius.ui.debug/.settings/org.eclipse.jdt.core.prefs b/plugins/org.eclipse.sirius.ui.debug/.settings/org.eclipse.jdt.core.prefs index 116ef2fd67..5250094488 100644 --- a/plugins/org.eclipse.sirius.ui.debug/.settings/org.eclipse.jdt.core.prefs +++ b/plugins/org.eclipse.sirius.ui.debug/.settings/org.eclipse.jdt.core.prefs @@ -8,5 +8,308 @@ org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled +org.eclipse.jdt.core.compiler.source=1.8 +org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=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_parameterized_type_references=0 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +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=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 +org.eclipse.jdt.core.formatter.alignment_for_type_parameters=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=1 +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_lambda_body=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=insert +org.eclipse.jdt.core.formatter.comment.line_length=120 +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=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +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_enum_constant=insert +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_after_type_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not 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=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not 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=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=do not 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=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=do not 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_lambda_arrow=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_lambda_arrow=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=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.lineSplit=200 +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.parentheses_positions_in_annotation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=false +org.eclipse.jdt.core.formatter.tabulation.char=space +org.eclipse.jdt.core.formatter.tabulation.size=4 +org.eclipse.jdt.core.formatter.use_on_off_tags=true +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false +org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true +org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true +org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true +org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/plugins/org.eclipse.sirius.ui.debug/.settings/org.eclipse.jdt.ui.prefs b/plugins/org.eclipse.sirius.ui.debug/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 0000000000..5fd48588ab --- /dev/null +++ b/plugins/org.eclipse.sirius.ui.debug/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,125 @@ +cleanup.add_default_serial_version_id=true +cleanup.add_generated_serial_version_id=false +cleanup.add_missing_annotations=true +cleanup.add_missing_deprecated_annotations=true +cleanup.add_missing_methods=false +cleanup.add_missing_nls_tags=false +cleanup.add_missing_override_annotations=true +cleanup.add_missing_override_annotations_interface_methods=true +cleanup.add_serial_version_id=false +cleanup.always_use_blocks=true +cleanup.always_use_parentheses_in_expressions=false +cleanup.always_use_this_for_non_static_field_access=false +cleanup.always_use_this_for_non_static_method_access=false +cleanup.convert_functional_interfaces=false +cleanup.convert_to_enhanced_for_loop=false +cleanup.correct_indentation=false +cleanup.format_source_code=false +cleanup.format_source_code_changes_only=false +cleanup.insert_inferred_type_arguments=false +cleanup.make_local_variable_final=true +cleanup.make_parameters_final=false +cleanup.make_private_fields_final=true +cleanup.make_type_abstract_if_missing_method=false +cleanup.make_variable_declarations_final=false +cleanup.never_use_blocks=false +cleanup.never_use_parentheses_in_expressions=true +cleanup.organize_imports=false +cleanup.qualify_static_field_accesses_with_declaring_class=false +cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +cleanup.qualify_static_member_accesses_with_declaring_class=true +cleanup.qualify_static_method_accesses_with_declaring_class=false +cleanup.remove_private_constructors=true +cleanup.remove_redundant_type_arguments=false +cleanup.remove_trailing_whitespaces=false +cleanup.remove_trailing_whitespaces_all=true +cleanup.remove_trailing_whitespaces_ignore_empty=false +cleanup.remove_unnecessary_casts=true +cleanup.remove_unnecessary_nls_tags=true +cleanup.remove_unused_imports=true +cleanup.remove_unused_local_variables=false +cleanup.remove_unused_private_fields=true +cleanup.remove_unused_private_members=false +cleanup.remove_unused_private_methods=true +cleanup.remove_unused_private_types=true +cleanup.sort_members=false +cleanup.sort_members_all=false +cleanup.use_anonymous_class_creation=false +cleanup.use_blocks=false +cleanup.use_blocks_only_for_return_and_throw=false +cleanup.use_lambda=true +cleanup.use_parentheses_in_expressions=false +cleanup.use_this_for_non_static_field_access=false +cleanup.use_this_for_non_static_field_access_only_if_necessary=true +cleanup.use_this_for_non_static_method_access=false +cleanup.use_this_for_non_static_method_access_only_if_necessary=true +cleanup_profile=org.eclipse.jdt.ui.default.eclipse_clean_up_profile +cleanup_settings_version=2 +eclipse.preferences.version=1 +editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +formatter_profile=_Sirius +formatter_settings_version=12 +org.eclipse.jdt.ui.ignorelowercasenames=true +org.eclipse.jdt.ui.importorder=java;javax;org;com; +org.eclipse.jdt.ui.javadoc=false +org.eclipse.jdt.ui.ondemandthreshold=99 +org.eclipse.jdt.ui.staticondemandthreshold=99 +org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates> +sp_cleanup.add_default_serial_version_id=false +sp_cleanup.add_generated_serial_version_id=false +sp_cleanup.add_missing_annotations=true +sp_cleanup.add_missing_deprecated_annotations=true +sp_cleanup.add_missing_methods=false +sp_cleanup.add_missing_nls_tags=false +sp_cleanup.add_missing_override_annotations=true +sp_cleanup.add_missing_override_annotations_interface_methods=true +sp_cleanup.add_serial_version_id=false +sp_cleanup.always_use_blocks=false +sp_cleanup.always_use_parentheses_in_expressions=false +sp_cleanup.always_use_this_for_non_static_field_access=false +sp_cleanup.always_use_this_for_non_static_method_access=false +sp_cleanup.convert_functional_interfaces=false +sp_cleanup.convert_to_enhanced_for_loop=false +sp_cleanup.correct_indentation=false +sp_cleanup.format_source_code=true +sp_cleanup.format_source_code_changes_only=false +sp_cleanup.insert_inferred_type_arguments=false +sp_cleanup.make_local_variable_final=false +sp_cleanup.make_parameters_final=false +sp_cleanup.make_private_fields_final=false +sp_cleanup.make_type_abstract_if_missing_method=false +sp_cleanup.make_variable_declarations_final=false +sp_cleanup.never_use_blocks=false +sp_cleanup.never_use_parentheses_in_expressions=false +sp_cleanup.on_save_use_additional_actions=true +sp_cleanup.organize_imports=true +sp_cleanup.qualify_static_field_accesses_with_declaring_class=false +sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=false +sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=false +sp_cleanup.qualify_static_member_accesses_with_declaring_class=false +sp_cleanup.qualify_static_method_accesses_with_declaring_class=false +sp_cleanup.remove_private_constructors=false +sp_cleanup.remove_redundant_type_arguments=false +sp_cleanup.remove_trailing_whitespaces=false +sp_cleanup.remove_trailing_whitespaces_all=false +sp_cleanup.remove_trailing_whitespaces_ignore_empty=false +sp_cleanup.remove_unnecessary_casts=true +sp_cleanup.remove_unnecessary_nls_tags=false +sp_cleanup.remove_unused_imports=false +sp_cleanup.remove_unused_local_variables=false +sp_cleanup.remove_unused_private_fields=false +sp_cleanup.remove_unused_private_members=false +sp_cleanup.remove_unused_private_methods=false +sp_cleanup.remove_unused_private_types=false +sp_cleanup.sort_members=false +sp_cleanup.sort_members_all=false +sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_blocks=false +sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_lambda=false +sp_cleanup.use_parentheses_in_expressions=false +sp_cleanup.use_this_for_non_static_field_access=false +sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=false +sp_cleanup.use_this_for_non_static_method_access=false +sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=false diff --git a/plugins/org.eclipse.sirius.ui.debug/META-INF/MANIFEST.MF b/plugins/org.eclipse.sirius.ui.debug/META-INF/MANIFEST.MF index f4ceefc572..9684dfe064 100644 --- a/plugins/org.eclipse.sirius.ui.debug/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.sirius.ui.debug/META-INF/MANIFEST.MF @@ -14,11 +14,13 @@ Require-Bundle: org.eclipse.gmf.runtime.diagram.ui.properties, org.eclipse.sirius.diagram.sequence.ui, com.google.guava;bundle-version="[15.0,22.0)", org.eclipse.sirius.editor, - org.eclipse.sirius.tests.sample.component;bundle-version="0.1.0" + org.eclipse.sirius.tests.sample.component;bundle-version="0.1.0", + org.eclipse.sirius.ui.editor;bundle-version="5.0.1" Bundle-ActivationPolicy: lazy Eclipse-LazyStart: true Bundle-Vendor: %providerName Export-Package: org.eclipse.sirius.ui.debug, + org.eclipse.sirius.ui.debug.pages, org.eclipse.sirius.ui.debug.properties, org.eclipse.sirius.ui.debug.statusline Import-Package: org.eclipse.sirius.ext.base;version="1.0.0", diff --git a/plugins/org.eclipse.sirius.ui.debug/src/org/eclipse/sirius/ui/debug/AbstractDebugView.java b/plugins/org.eclipse.sirius.ui.debug/src/org/eclipse/sirius/ui/debug/AbstractDebugView.java index e6f9549333..a728195d4a 100644 --- a/plugins/org.eclipse.sirius.ui.debug/src/org/eclipse/sirius/ui/debug/AbstractDebugView.java +++ b/plugins/org.eclipse.sirius.ui.debug/src/org/eclipse/sirius/ui/debug/AbstractDebugView.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2010, 2015 THALES GLOBAL SERVICES. + * Copyright (c) 2010, 2017 THALES GLOBAL SERVICES. * 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 @@ -25,6 +25,8 @@ import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.window.Window; import org.eclipse.sirius.ext.base.Option; import org.eclipse.sirius.ext.base.Options; +import org.eclipse.sirius.ui.debug.pages.DebugPageProvider; +import org.eclipse.sirius.ui.editor.SessionEditorPlugin; import org.eclipse.sirius.viewpoint.provider.ViewpointItemProviderAdapterFactory; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; @@ -51,125 +53,131 @@ import org.eclipse.ui.part.ViewPart; */ public abstract class AbstractDebugView extends ViewPart implements ISelectionListener { - /** - * The text area in which information is placed. - */ - private Text info; - - /** - * The group of action buttons. - */ - private Group buttons; - - /** - * The currently selection object. - */ - protected Object selection; - - @Override - public void createPartControl(Composite parent) { - getSite().getPage().addSelectionListener(this); - GridLayout layout = new GridLayout(1, false); - parent.setLayout(layout); - - info = new Text(parent, SWT.MULTI | SWT.READ_ONLY | SWT.WRAP | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); - info.setText("Sirius/GMF Debug View"); - info.setLayoutData(new GridData(GridData.FILL_BOTH)); - info.setFont(JFaceResources.getFont("org.eclipse.debug.ui.consoleFont")); - - buttons = new Group(parent, SWT.SHADOW_ETCHED_IN); - buttons.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - buttons.setLayout(new RowLayout(SWT.HORIZONTAL)); - createActionButtons(); - } - - /** - * Helper method to add an action button to the view. - */ - protected void addAction(String name, final Runnable body) { - Button button = new Button(buttons, SWT.PUSH); - button.setText(name); - button.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - body.run(); - } - }); - } - - @Override - public void dispose() { - getSite().getPage().removeSelectionListener(this); - super.dispose(); - } - - @Override - public void setFocus() { - // Do nothing. - } - - /** - * Update the <code>selection</code> field and fill the info area with the - * corresponding details. - */ - public void selectionChanged(IWorkbenchPart part, ISelection selection) { - Option<Object> selected = getSelectedElement(selection); - if (selected.some()) { - this.selection = selected.get(); - this.info.setText(getTextFor(this.selection)); - } - } - - /** - * Get the main object selected from the Eclipse ISelection. - */ - private Option<Object> getSelectedElement(ISelection selection) { - if (selection instanceof IStructuredSelection) { - IStructuredSelection iss = (IStructuredSelection) selection; - return Options.newSome(iss.getFirstElement()); - } - return Options.newNone(); - } - - /** - * Opens a dialog box to ask the user for a string. Useful for actions which - * need some additional data. - */ - protected String askStringFromUser(String title, String message, String initialValue) { - InputDialog dlg = new InputDialog(getSite().getShell(), title, message, initialValue, null); - if (dlg.open() == Window.OK) { - return dlg.getValue(); - } else { - return null; - } - } - - protected AdapterFactory getAdapterFactory() { - List<AdapterFactory> factories = new ArrayList<AdapterFactory>(); - factories.add(new ViewpointItemProviderAdapterFactory()); - factories.add(new ResourceItemProviderAdapterFactory()); - factories.add(new EcoreItemProviderAdapterFactory()); - factories.add(new ReflectiveItemProviderAdapterFactory()); - return new ComposedAdapterFactory(factories); - } - - /** - * Sets the text shown in the view's text area. - * - * @param text - * the text to show in the view's text area. - */ - protected void setText(String text) { - info.setText(text); - } - - /** - * Returns the text to show in the main text area for the specified object. - */ - protected abstract String getTextFor(Object obj); - - /** - * Contribute the action buttons using {@link #addAction(String, Runnable)}. - */ - protected abstract void createActionButtons(); + /** + * The text area in which information is placed. + */ + private Text info; + + /** + * The group of action buttons. + */ + private Group buttons; + + /** + * The currently selection object. + */ + protected Object selection; + + private DebugPageProvider debugPageProvider; + + @Override + public void createPartControl(Composite parent) { + debugPageProvider = new DebugPageProvider(); + SessionEditorPlugin.getPlugin().getPageRegistry().addPageProvider(debugPageProvider); + getSite().getPage().addSelectionListener(this); + GridLayout layout = new GridLayout(1, false); + parent.setLayout(layout); + + info = new Text(parent, SWT.MULTI | SWT.READ_ONLY | SWT.WRAP | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); + info.setText("Sirius/GMF Debug View"); + info.setLayoutData(new GridData(GridData.FILL_BOTH)); + info.setFont(JFaceResources.getFont("org.eclipse.debug.ui.consoleFont")); + + buttons = new Group(parent, SWT.SHADOW_ETCHED_IN); + buttons.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + buttons.setLayout(new RowLayout(SWT.HORIZONTAL)); + createActionButtons(); + } + + /** + * Helper method to add an action button to the view. + */ + protected void addAction(String name, final Runnable body) { + Button button = new Button(buttons, SWT.PUSH); + button.setText(name); + button.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + body.run(); + } + }); + } + + @Override + public void dispose() { + SessionEditorPlugin.getPlugin().getPageRegistry().removePageProvider(debugPageProvider); + getSite().getPage().removeSelectionListener(this); + super.dispose(); + } + + @Override + public void setFocus() { + // Do nothing. + } + + /** + * Update the <code>selection</code> field and fill the info area with the + * corresponding details. + */ + @Override + public void selectionChanged(IWorkbenchPart part, ISelection selection) { + Option<Object> selected = getSelectedElement(selection); + if (selected.some()) { + this.selection = selected.get(); + this.info.setText(getTextFor(this.selection)); + } + } + + /** + * Get the main object selected from the Eclipse ISelection. + */ + private Option<Object> getSelectedElement(ISelection selection) { + if (selection instanceof IStructuredSelection) { + IStructuredSelection iss = (IStructuredSelection) selection; + return Options.newSome(iss.getFirstElement()); + } + return Options.newNone(); + } + + /** + * Opens a dialog box to ask the user for a string. Useful for actions which + * need some additional data. + */ + protected String askStringFromUser(String title, String message, String initialValue) { + InputDialog dlg = new InputDialog(getSite().getShell(), title, message, initialValue, null); + if (dlg.open() == Window.OK) { + return dlg.getValue(); + } else { + return null; + } + } + + protected AdapterFactory getAdapterFactory() { + List<AdapterFactory> factories = new ArrayList<AdapterFactory>(); + factories.add(new ViewpointItemProviderAdapterFactory()); + factories.add(new ResourceItemProviderAdapterFactory()); + factories.add(new EcoreItemProviderAdapterFactory()); + factories.add(new ReflectiveItemProviderAdapterFactory()); + return new ComposedAdapterFactory(factories); + } + + /** + * Sets the text shown in the view's text area. + * + * @param text + * the text to show in the view's text area. + */ + protected void setText(String text) { + info.setText(text); + } + + /** + * Returns the text to show in the main text area for the specified object. + */ + protected abstract String getTextFor(Object obj); + + /** + * Contribute the action buttons using {@link #addAction(String, Runnable)}. + */ + protected abstract void createActionButtons(); } diff --git a/plugins/org.eclipse.sirius.ui.debug/src/org/eclipse/sirius/ui/debug/pages/DebugPage.java b/plugins/org.eclipse.sirius.ui.debug/src/org/eclipse/sirius/ui/debug/pages/DebugPage.java new file mode 100644 index 0000000000..d30b575623 --- /dev/null +++ b/plugins/org.eclipse.sirius.ui.debug/src/org/eclipse/sirius/ui/debug/pages/DebugPage.java @@ -0,0 +1,84 @@ +/******************************************************************************* + * Copyright (c) 2017 Obeo + * 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: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.ui.debug.pages; + +import org.eclipse.jface.layout.GridLayoutFactory; +import org.eclipse.sirius.business.api.session.Session; +import org.eclipse.sirius.ui.editor.SessionEditor; +import org.eclipse.sirius.ui.editor.api.pages.AbstractSessionEditorPage; +import org.eclipse.sirius.ui.editor.api.pages.DefaultSessionEditorPage; +import org.eclipse.sirius.ui.editor.api.pages.PageProviderRegistry.PositioningKind; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.forms.IManagedForm; +import org.eclipse.ui.forms.widgets.FormToolkit; +import org.eclipse.ui.forms.widgets.ScrolledForm; + +/** + * This page shows various information regarding a Sirius session. + * + * @author <a href="mailto:pierre.guilet@obeo.fr">Pierre Guilet</a> + * + */ +public class DebugPage extends AbstractSessionEditorPage { + + /** + * This page id. + */ + public static final String PAGE_ID = "org.eclipse.sirius.ui.debug.page"; + + private Session session; + + public DebugPage(SessionEditor editor, String id, String title) { + super(editor, id, title); + this.session = editor.getSession(); + } + + /* + * (non-Javadoc) + * @see org.eclipse.ui.forms.editor.FormPage#dispose() + */ + @Override + public void dispose() { + // TODO Auto-generated method stub + super.dispose(); + } + + @Override + protected void createFormContent(IManagedForm managedForm) { + super.createFormContent(managedForm); + final ScrolledForm scrolledForm = managedForm.getForm(); + + FormToolkit toolkit = managedForm.getToolkit(); + + scrolledForm.setText("Debug me"); // $NON-NLS-1$ + toolkit.decorateFormHeading(scrolledForm.getForm()); + + Composite body = managedForm.getForm().getBody(); + body.setLayout(GridLayoutFactory.swtDefaults().create()); + + Composite subBody = toolkit.createComposite(body); + subBody.setLayout(GridLayoutFactory.swtDefaults().numColumns(2).equalWidth(false).create()); + subBody.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + } + + @Override + public String getLocationId() { + return DefaultSessionEditorPage.PAGE_ID; + } + + @Override + public PositioningKind getPositioning() { + return PositioningKind.AFTER; + } + +} diff --git a/plugins/org.eclipse.sirius.ui.debug/src/org/eclipse/sirius/ui/debug/pages/DebugPageProvider.java b/plugins/org.eclipse.sirius.ui.debug/src/org/eclipse/sirius/ui/debug/pages/DebugPageProvider.java new file mode 100644 index 0000000000..9b5e0feb64 --- /dev/null +++ b/plugins/org.eclipse.sirius.ui.debug/src/org/eclipse/sirius/ui/debug/pages/DebugPageProvider.java @@ -0,0 +1,42 @@ +/******************************************************************************* + * Copyright (c) 2017 Obeo + * 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: + * Obeo - initial API and implementation + *******************************************************************************/ + +package org.eclipse.sirius.ui.debug.pages; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Supplier; + +import org.eclipse.sirius.ui.editor.SessionEditor; +import org.eclipse.sirius.ui.editor.api.pages.AbstractSessionEditorPage; +import org.eclipse.sirius.ui.editor.api.pages.DefaultSessionEditorPage; +import org.eclipse.sirius.ui.editor.api.pages.PageProvider; + +/** + * Provides a custom debug page for aird editor showing different information about the session and its elements. + * + * @author <a href="mailto:pierre.guilet@obeo.fr">Pierre Guilet</a> + * + */ +public class DebugPageProvider extends PageProvider { + + private static final String DEBUG_PAGE_TITLE = "Debug"; + + @Override + public Map<String, Supplier<AbstractSessionEditorPage>> getPages(SessionEditor editor) { + Map<String, Supplier<AbstractSessionEditorPage>> resultMap = new HashMap<>(); + resultMap.put(DefaultSessionEditorPage.PAGE_ID, () -> { + return new DebugPage(editor, DebugPage.PAGE_ID, DEBUG_PAGE_TITLE); + }); + return resultMap; + } + +} diff --git a/plugins/org.eclipse.sirius.ui.editor/META-INF/MANIFEST.MF b/plugins/org.eclipse.sirius.ui.editor/META-INF/MANIFEST.MF index e4d8ef3b7a..cecee57ae8 100644 --- a/plugins/org.eclipse.sirius.ui.editor/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.sirius.ui.editor/META-INF/MANIFEST.MF @@ -37,7 +37,8 @@ Import-Package: org.eclipse.sirius.ext.base;version="2.1.0", org.eclipse.sirius.ext.jface.viewers;version="3.1.0", org.eclipse.sirius.ext.swt;version="2.0.0" Bundle-Activator: org.eclipse.sirius.ui.editor.SessionEditorPlugin$Implementation -Export-Package: org.eclipse.sirius.ui.editor;version="5.0.0", - org.eclipse.sirius.ui.editor.internal.graphicalcomponents;version="5.0.0";x-internal:=true, - org.eclipse.sirius.ui.editor.internal.pages;version="5.0.0";x-internal:=true, - org.eclipse.sirius.ui.editor.internal.preferences;version="5.0.0";x-internal:=true +Export-Package: org.eclipse.sirius.ui.editor;version="5.1.0", + org.eclipse.sirius.ui.editor.api.pages;version="5.1.0", + org.eclipse.sirius.ui.editor.internal.graphicalcomponents;version="5.1.0";x-internal:=true, + org.eclipse.sirius.ui.editor.internal.pages;version="5.1.0";x-internal:=true, + org.eclipse.sirius.ui.editor.internal.preferences;version="5.1.0";x-internal:=true diff --git a/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/SessionEditor.java b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/SessionEditor.java index 7d8a9f35b8..b54fc2e5e3 100644 --- a/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/SessionEditor.java +++ b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/SessionEditor.java @@ -13,6 +13,8 @@ package org.eclipse.sirius.ui.editor; import java.lang.reflect.InvocationTargetException; import java.text.MessageFormat; import java.util.EventObject; +import java.util.List; +import java.util.stream.Collectors; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; @@ -34,9 +36,14 @@ import org.eclipse.sirius.business.api.session.SessionManager; import org.eclipse.sirius.ui.business.api.editor.ISiriusEditor; import org.eclipse.sirius.ui.business.api.session.IEditingSession; import org.eclipse.sirius.ui.business.api.session.SessionUIManager; -import org.eclipse.sirius.ui.editor.internal.pages.DefaultSessionEditorPage; +import org.eclipse.sirius.ui.editor.api.pages.AbstractSessionEditorPage; +import org.eclipse.sirius.ui.editor.api.pages.PageProviderRegistry; +import org.eclipse.sirius.ui.editor.internal.pages.PageProviderListener; import org.eclipse.sirius.ui.tools.api.views.modelexplorerview.IModelExplorerView; import org.eclipse.sirius.viewpoint.provider.SiriusEditPlugin; +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.CTabFolder; +import org.eclipse.swt.custom.CTabItem; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorSite; @@ -65,7 +72,7 @@ import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage; * @author <a href="mailto:pierre.guilet@obeo.fr">Pierre Guilet</a> * */ -public class SessionEditor extends SharedHeaderFormEditor implements ITabbedPropertySheetPageContributor, IModelExplorerView, SessionListener, ISiriusEditor { +public class SessionEditor extends SharedHeaderFormEditor implements ITabbedPropertySheetPageContributor, IModelExplorerView, SessionListener, ISiriusEditor, PageProviderListener { /** * The editor's id. */ @@ -77,12 +84,6 @@ public class SessionEditor extends SharedHeaderFormEditor implements ITabbedProp private Session session; /** - * The default page of the session editor showing the content of the session - * with means to update it. - */ - private DefaultSessionEditorPage defaultPage; - - /** * The property sheet page used by this editor. */ private TabbedPropertySheetPage propertySheetPage; @@ -95,20 +96,80 @@ public class SessionEditor extends SharedHeaderFormEditor implements ITabbedProp private int choice = ISaveablePart2.DEFAULT; + /** + * The registry providing custom pages to this editor. + */ + private PageProviderRegistry pageRegistry; + @Override protected void addPages() { - try { - defaultPage = new DefaultSessionEditorPage(this, session); - addPage(0, defaultPage); - } catch (PartInitException e) { - ErrorDialog.openError(getSite().getShell(), MessageFormat.format(Messages.UI_SessionEditor_page_loading_error_message, new Object[0]), e.getMessage(), e.getStatus()); // $NON-NLS-1$ + updatePages(); + } + + /** + * Remove obsolete page, add new pages and reorder all pages currently + * displayed like the new list. + * + */ + private void updatePages() { + List<AbstractSessionEditorPage> newOrderedPages = pageRegistry.getPagesOrdered(this, session, + pages.stream().filter(AbstractSessionEditorPage.class::isInstance).map(AbstractSessionEditorPage.class::cast).collect(Collectors.toList())); + + CTabFolder cTabF = (CTabFolder) this.getContainer(); + IFormPage activePage = getActivePageInstance(); + for (int i = 0; i < newOrderedPages.size(); i++) { + AbstractSessionEditorPage page = newOrderedPages.get(i); + int pageIndex = pages.indexOf(page); + if (pageIndex != -1) { + if (pageIndex != i) { + // page already exists so we reuse its control in a new + // tab to avoid loosing states like expanded items. + cTabF.getItem(pageIndex).dispose(); + pages.remove(pageIndex); + page.setIndex(i); + + CTabItem item = new CTabItem(cTabF, SWT.NONE, i); + item.setText(page.getTitle()); + item.setControl(page.getPartControl()); + pages.add(i, page); + } + } else { + try { + addPage(i, page); + } catch (PartInitException e) { + String errorMessage = MessageFormat.format(Messages.UI_SessionEditor_page_loading_error_message, new Object[0]); + SessionEditorPlugin.getPlugin().error(errorMessage, e); + ErrorDialog.openError(getSite().getShell(), errorMessage, e.getMessage(), e.getStatus()); + } + } + } + if (newOrderedPages.size() < pages.size()) { + // obsolete pages must be removed. + for (int i = newOrderedPages.size(); i < pages.size(); i++) { + removePage(i); + + } + } + + cTabF.getParent().layout(); + if (activePage != null) { + int activePageIndex = pages.indexOf(activePage); + if (activePageIndex != -1) { + this.setActivePage(activePageIndex); + } else { + this.setActivePage(0); + } } } @Override + public void pageProviderChanged() { + updatePages(); + } + + @Override public void init(IEditorSite site, IEditorInput input) throws PartInitException { super.init(site, input); - IEditorInput editorInput = this.getEditorInput(); URI sessionResourceURI = null; if (editorInput instanceof FileEditorInput) { @@ -180,13 +241,19 @@ public class SessionEditor extends SharedHeaderFormEditor implements ITabbedProp session.getTransactionalEditingDomain().getCommandStack().addCommandStackListener(listener); } } catch (InvocationTargetException | InterruptedException e) { - ErrorDialog.openError(getSite().getShell(), MessageFormat.format(Messages.UI_SessionEditor_session_loading_error_message, new Object[0]), e.getMessage(), Status.CANCEL_STATUS); // $NON-NLS-1$ + ErrorDialog.openError(getSite().getShell(), MessageFormat.format(Messages.UI_SessionEditor_session_loading_error_message, new Object[0]), e.getMessage(), Status.CANCEL_STATUS); } + pageRegistry = SessionEditorPlugin.getPlugin().getPageRegistry(); + pageRegistry.addRegistryListener(this); } @Override public void dispose() { super.dispose(); + if (pageRegistry != null) { + pageRegistry.removeRegistryListener(this); + pageRegistry = null; + } if (session != null) { final IEditingSession editingSession = SessionUIManager.INSTANCE.getUISession(session); if (editingSession != null) { @@ -296,7 +363,15 @@ public class SessionEditor extends SharedHeaderFormEditor implements ITabbedProp choice = uiSession.promptToSaveOnClose(); } } - return choice; } + + /** + * Returns the {@link Session} edited by this editor. + * + * @return the {@link Session} edited by this editor. + */ + public Session getSession() { + return session; + } } diff --git a/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/SessionEditorPlugin.java b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/SessionEditorPlugin.java index def012e29f..042534cef1 100644 --- a/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/SessionEditorPlugin.java +++ b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/SessionEditorPlugin.java @@ -20,6 +20,8 @@ import org.eclipse.emf.common.ui.EclipseUIPlugin; import org.eclipse.emf.common.util.ResourceLocator; import org.eclipse.emf.common.util.URI; import org.eclipse.sirius.business.api.session.Session; +import org.eclipse.sirius.ui.editor.api.pages.PageProviderRegistry; +import org.eclipse.sirius.ui.editor.internal.pages.DefaultPageProvider; import org.eclipse.sirius.ui.tools.internal.views.modelexplorer.resourcelistener.ISessionFileLoadingListener; import org.eclipse.sirius.viewpoint.provider.SiriusEditPlugin; import org.eclipse.ui.PartInitException; @@ -32,7 +34,7 @@ public class SessionEditorPlugin extends EMFPlugin { * This plug-in's identifier. */ public static final String ID = "org.eclipse.sirius.ui.editor"; //$NON-NLS-1$ - + /** * Keep track of the singleton. */ @@ -80,12 +82,26 @@ public class SessionEditorPlugin extends EMFPlugin { private ISessionFileLoadingListener modelingProjectExpansionListener; /** + * The registry providing custom pages to aird editor. + */ + private PageProviderRegistry pageRegistry; + + /** * Creates an instance. */ public Implementation() { plugin = this; } + /** + * Returns the registry providing custom pages to aird editor. + * + * @return the registry providing custom pages to aird editor. + */ + public PageProviderRegistry getPageRegistry() { + return pageRegistry; + } + @Override public void start(BundleContext context) throws Exception { super.start(context); @@ -108,12 +124,15 @@ public class SessionEditorPlugin extends EMFPlugin { } }; SiriusEditPlugin.getPlugin().addSessionFileLoadingListener(modelingProjectExpansionListener); + pageRegistry = new PageProviderRegistry(); + pageRegistry.addPageProvider(new DefaultPageProvider()); } @Override public void stop(BundleContext context) throws Exception { SiriusEditPlugin.getPlugin().removeSessionFileLoadingListener(modelingProjectExpansionListener); modelingProjectExpansionListener = null; + pageRegistry = null; super.stop(context); } diff --git a/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/api/pages/AbstractSessionEditorPage.java b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/api/pages/AbstractSessionEditorPage.java new file mode 100644 index 0000000000..9fb62a7af6 --- /dev/null +++ b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/api/pages/AbstractSessionEditorPage.java @@ -0,0 +1,71 @@ +/******************************************************************************* + * Copyright (c) 2017 Obeo + * 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: + * Obeo - initial API and implementation + *******************************************************************************/ + +package org.eclipse.sirius.ui.editor.api.pages; + +import org.eclipse.sirius.ui.editor.api.pages.PageProviderRegistry.PositioningKind; +import org.eclipse.ui.forms.editor.FormEditor; +import org.eclipse.ui.forms.editor.FormPage; + +/** + * Custom page provided to aird editor must extends this class. + * + * @author <a href="mailto:pierre.guilet@obeo.fr">Pierre Guilet</a> + * + */ +public abstract class AbstractSessionEditorPage extends FormPage { + + /** + * A constructor that creates the page and initializes it with the editor. + * + * @param editor + * the parent editor + * @param id + * the unique identifier + * @param title + * the page title + */ + public AbstractSessionEditorPage(FormEditor editor, String id, String title) { + super(editor, id, title); + } + + /** + * The constructor. The parent editor need to be passed in the + * <code>initialize</code> method if this constructor is used. + * + * @param id + * a unique page identifier + * @param title + * a user-friendly page title + */ + public AbstractSessionEditorPage(String id, String title) { + super(id, title); + } + + /** + * Returns the id of the page to take in consideration when positioning this + * page. + * + * @return the id of the page to take in consideration when positioning this + * page. + */ + public abstract String getLocationId(); + + /** + * Returns the kind of positioning to apply regarding the target page + * returned by {@link AbstractSessionEditorPage#getLocationId()}. + * + * @return the kind of positioning to apply regarding the target page + * returned by {@link AbstractSessionEditorPage#getLocationId()}. + */ + public abstract PositioningKind getPositioning(); + +} diff --git a/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/pages/DefaultSessionEditorPage.java b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/api/pages/DefaultSessionEditorPage.java index 69ea72b260..bc1f20a1b0 100644 --- a/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/pages/DefaultSessionEditorPage.java +++ b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/api/pages/DefaultSessionEditorPage.java @@ -8,7 +8,7 @@ * Contributors: * Obeo - initial API and implementation *******************************************************************************/ -package org.eclipse.sirius.ui.editor.internal.pages; +package org.eclipse.sirius.ui.editor.api.pages; import java.net.MalformedURLException; import java.net.URL; @@ -32,6 +32,7 @@ import org.eclipse.sirius.business.api.session.SessionStatus; import org.eclipse.sirius.ui.editor.Messages; import org.eclipse.sirius.ui.editor.SessionEditor; import org.eclipse.sirius.ui.editor.SessionEditorPlugin; +import org.eclipse.sirius.ui.editor.api.pages.PageProviderRegistry.PositioningKind; import org.eclipse.sirius.ui.editor.internal.graphicalcomponents.GraphicalSemanticModelsHandler; import org.eclipse.sirius.ui.tools.internal.actions.session.CloseSessionsAction; import org.eclipse.sirius.ui.tools.internal.graphicalcomponents.GraphicalRepresentationHandler; @@ -46,7 +47,6 @@ import org.eclipse.ui.IEditorSite; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.forms.IManagedForm; -import org.eclipse.ui.forms.editor.FormPage; import org.eclipse.ui.forms.events.HyperlinkEvent; import org.eclipse.ui.forms.events.IHyperlinkListener; import org.eclipse.ui.forms.widgets.FormText; @@ -69,12 +69,12 @@ import org.eclipse.ui.plugin.AbstractUIPlugin; * @author <a href="mailto:pierre.guilet@obeo.fr">Pierre Guilet</a> * */ -public class DefaultSessionEditorPage extends FormPage implements SessionListener { +public class DefaultSessionEditorPage extends AbstractSessionEditorPage implements SessionListener { /** * The page's unique id. */ - private static final String PAGE_ID = "org.eclipse.sirius.ui.editor.DefaultSessionEditorPage"; //$NON-NLS-1$ + public static final String PAGE_ID = "org.eclipse.sirius.ui.editor.DefaultSessionEditorPage"; //$NON-NLS-1$ /** * Delimiter used to separate text part for the page title. @@ -120,12 +120,10 @@ public class DefaultSessionEditorPage extends FormPage implements SessionListene * * @param theEditor * the editor. - * @param theSession - * the session. */ - public DefaultSessionEditorPage(SessionEditor theEditor, Session theSession) { + public DefaultSessionEditorPage(SessionEditor theEditor) { super(theEditor, PAGE_ID, Messages.UI_SessionEditor_default_page_tab_label); - this.session = theSession; + this.session = theEditor.getSession(); this.editor = theEditor; } @@ -381,4 +379,14 @@ public class DefaultSessionEditorPage extends FormPage implements SessionListene filterActionGroup = null; } } + + @Override + public String getLocationId() { + return null; + } + + @Override + public PositioningKind getPositioning() { + return null; + } } diff --git a/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/api/pages/PageProvider.java b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/api/pages/PageProvider.java new file mode 100644 index 0000000000..9860d85e75 --- /dev/null +++ b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/api/pages/PageProvider.java @@ -0,0 +1,42 @@ +/******************************************************************************* + * Copyright (c) 2017 Obeo + * 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: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.ui.editor.api.pages; + +import java.util.Map; +import java.util.function.Supplier; + +import org.eclipse.sirius.ui.editor.SessionEditor; +import org.eclipse.ui.part.MultiPageEditorPart; + +/** + * This component provides instances of {@link AbstractSessionEditorPage} that + * are pages identified by the same id used by a {@link PageProvider} instance. + * This pages created by this component can be used in any different + * {@link MultiPageEditorPart}. + * + * @author <a href="mailto:pierre.guilet@obeo.fr">Pierre Guilet</a> + * + */ +public abstract class PageProvider { + /** + * Returns a map of page id to the @link Supplier} initializing the + * corresponding page {@link AbstractSessionEditorPage} to display in a + * multi-page editor. + * + * @param editor + * the aird editor's session from which page request is done. + * + * @return a map of page id to the @link Supplier} initializing the + * corresponding page {@link AbstractSessionEditorPage} to display + * in a multi-page editor. + */ + public abstract Map<String, Supplier<AbstractSessionEditorPage>> getPages(SessionEditor editor); +} diff --git a/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/api/pages/PageProviderRegistry.java b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/api/pages/PageProviderRegistry.java new file mode 100644 index 0000000000..c56f6369da --- /dev/null +++ b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/api/pages/PageProviderRegistry.java @@ -0,0 +1,150 @@ +/******************************************************************************* + * Copyright (c) 2017 Obeo + * 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: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.ui.editor.api.pages; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.CopyOnWriteArrayList; + +import org.eclipse.sirius.business.api.session.Session; +import org.eclipse.sirius.ui.editor.SessionEditor; +import org.eclipse.sirius.ui.editor.internal.pages.PageOrderer; +import org.eclipse.sirius.ui.editor.internal.pages.PageProviderListener; + +/** + * This component provides {@link PageProvider}. + * + * @author <a href="mailto:pierre.guilet@obeo.fr">Pierre Guilet</a> + * + */ +public class PageProviderRegistry { + /** + * Listener to notify when page providers are added or removed from this + * registry. + */ + private final Set<PageProviderListener> pageProviderListeners; + + /** + * A set of all {@link PageProvider} registered and usable to create new + * pages for multi-page editor. + */ + private final List<PageProvider> pageProviders; + + private final PageOrderer pageOrderer; + + /** + * This enum specifies positioning type to apply when initializing an + * {@link AbstractSessionEditorPage} in an Editor. + * + * @author <a href="mailto:pierre.guilet@obeo.fr">Pierre Guilet</a> + * + */ + public enum PositioningKind { + /** + * The produced {@link AbstractAirdEditorCustomPage} should be placed + * before the page with the id {@link PageProvider#locationId}. + */ + BEFORE, + /** + * The produced {@link AbstractAirdEditorCustomPage} should be placed + * after the page with the id {@link PageProvider#locationId}. + */ + AFTER, + /** + * The produced {@link AbstractAirdEditorCustomPage} should replace the + * page with the id {@link PageProvider#locationId}. + */ + REPLACE; + }; + + /** + * Default constructor. Initialize the set of page providers. + */ + public PageProviderRegistry() { + pageProviders = new CopyOnWriteArrayList<>(); + pageProviderListeners = new HashSet<>(); + pageOrderer = new PageOrderer(); + } + + /** + * Adds a new page provider to this registry available for any editor. + * + * @param newPageProvider + * the new page provider to add. + */ + public void addPageProvider(PageProvider newPageProvider) { + pageProviders.add(newPageProvider); + for (PageProviderListener pageProviderListener : pageProviderListeners) { + pageProviderListener.pageProviderChanged(); + } + + } + + /** + * Register the given listener to this registry to be notified when page + * providers are added or removed from this registry. + * + * @param pageProviderListener + * the listener that will be notified when a {@link PageProvider} + * will be added or removed from this registry. + */ + public void addRegistryListener(PageProviderListener pageProviderListener) { + pageProviderListeners.add(pageProviderListener); + } + + /** + * Remove the given listener from this registry. + * + * @param pageProviderListener + * the listener to remove. + */ + public void removeRegistryListener(PageProviderListener pageProviderListener) { + pageProviderListeners.remove(pageProviderListener); + } + + /** + * Remove the given page provider from thios registry. + * + * @param pageProvider + * the page provider to remove from this registry. + */ + public void removePageProvider(PageProvider pageProvider) { + pageProviders.remove(pageProvider); + for (PageProviderListener pageProviderListener : pageProviderListeners) { + pageProviderListener.pageProviderChanged(); + } + } + + /** + * Returns a list of {@link AbstractSessionEditorPage} in the order computed + * from all their location information retrieved from their parent creators + * {@link PageProvider}. Obsolete pages are not returned. New available + * pages fitting current context are returned. + * + * @param editor + * the aird editor requesting custom pages. + * @param session + * the aird editor's session from which page request is done. + * @param displayedPages + * pages already dysplayed by the editor. + * @return a list of {@link AbstractSessionEditorPage} in the order computed + * from all their location information retrieved from their parent + * creators {@link PageProvider}. Obsolete pages are not returned. + * New available pages fitting current context are returned. + */ + public List<AbstractSessionEditorPage> getPagesOrdered(SessionEditor editor, Session session, List<AbstractSessionEditorPage> displayedPages) { + List<AbstractSessionEditorPage> pagesOrdered = pageOrderer.getOrderedPages(pageProviders, editor, displayedPages); + return pagesOrdered; + + } + +} diff --git a/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/pages/DefaultPageProvider.java b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/pages/DefaultPageProvider.java new file mode 100644 index 0000000000..912b1264f2 --- /dev/null +++ b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/pages/DefaultPageProvider.java @@ -0,0 +1,39 @@ +/******************************************************************************* + * Copyright (c) 2017 Obeo + * 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: + * Obeo - initial API and implementation + *******************************************************************************/ + +package org.eclipse.sirius.ui.editor.internal.pages; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Supplier; + +import org.eclipse.sirius.ui.editor.SessionEditor; +import org.eclipse.sirius.ui.editor.api.pages.AbstractSessionEditorPage; +import org.eclipse.sirius.ui.editor.api.pages.DefaultSessionEditorPage; +import org.eclipse.sirius.ui.editor.api.pages.PageProvider; + +/** + * The page provider providing the default page of the aird editor. + * + * @author <a href="mailto:pierre.guilet@obeo.fr">Pierre Guilet</a> + * + */ +public class DefaultPageProvider extends PageProvider { + + @Override + public Map<String, Supplier<AbstractSessionEditorPage>> getPages(SessionEditor editor) { + Map<String, Supplier<AbstractSessionEditorPage>> resultMap = new HashMap<>(); + resultMap.put(DefaultSessionEditorPage.PAGE_ID, () -> { + return new DefaultSessionEditorPage(editor); + }); + return resultMap; + } +} diff --git a/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/pages/PageOrderer.java b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/pages/PageOrderer.java new file mode 100644 index 0000000000..bc2f07121c --- /dev/null +++ b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/pages/PageOrderer.java @@ -0,0 +1,360 @@ +/******************************************************************************* + * Copyright (c) 2017 Obeo + * 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: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.ui.editor.internal.pages; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +import org.eclipse.sirius.ui.editor.SessionEditor; +import org.eclipse.sirius.ui.editor.api.pages.AbstractSessionEditorPage; +import org.eclipse.sirius.ui.editor.api.pages.PageProvider; +import org.eclipse.sirius.ui.editor.api.pages.PageProviderRegistry.PositioningKind; + +/** + * Components ordering aird editor pages regarding positioning information + * provided by this pages. + * + * @author <a href="mailto:pierre.guilet@obeo.fr">Pierre Guilet</a> + * + */ +public class PageOrderer { + /** + * A page wrapper with positioning information regarding other page and the + * pages that should be to the left or the right of it. + * + * @author <a href="mailto:pierre.guilet@obeo.fr">Pierre Guilet</a> + * + */ + private class PagePositioning { + /** + * The page positioned. + */ + AbstractSessionEditorPage page; + + /** + * The id of the page to its left. + */ + String leftPortPageId; + + /** + * The id of the page to its right. + */ + String rightPortPageId; + + /** + * The id of the page this page should replace. + */ + String replacePortPageId; + + /** + * The real page to its left. + */ + PagePositioning leftPortPage; + + /** + * The real page to its right. + */ + PagePositioning rightPortPage; + + /** + * The real page to replace. + */ + PagePositioning replacePortPage; + + @Override + public String toString() { + String toString = "Page: " + page.getClass().getSimpleName(); //$NON-NLS-1$ + toString += leftPortPageId != null ? "\nLeft id: " + leftPortPageId : ""; //$NON-NLS-1$//$NON-NLS-2$ + toString += rightPortPageId != null ? "\nRight id: " + rightPortPageId : ""; //$NON-NLS-1$//$NON-NLS-2$ + toString += replacePortPageId != null ? "\nReplace id: " + replacePortPageId : ""; //$NON-NLS-1$//$NON-NLS-2$ + return toString; + } + } + + /** + * Returns all pages the caller should display in the order defined by all + * their positioning information. + * + * @param pageProviders + * the {@link PageProvider} to consider to know what pages can be + * displayed. + * @param editor + * the aird editor asking for ordered pages. + * + * @param alreadyInitializedPages + * the pages the editor currently contains. + * @return all pages the caller should display in the order defined by all + * their positioning information. + */ + public List<AbstractSessionEditorPage> getOrderedPages(List<PageProvider> pageProviders, SessionEditor editor, List<AbstractSessionEditorPage> alreadyInitializedPages) { + List<AbstractSessionEditorPage> pagesToKeep = new ArrayList<>(); + List<PagePositioning> pagePositioningElements = new ArrayList<>(); + Map<String, PagePositioning> pageIdToPageMap = new HashMap<>(); + initializePagePositioning(pageProviders, editor, alreadyInitializedPages, pagesToKeep, pagePositioningElements, pageIdToPageMap); + positionPagesRegardingOthers(pagePositioningElements, pageIdToPageMap); + Set<PagePositioning> replacedPages = new HashSet<>(); + replacePages(pagePositioningElements, pageIdToPageMap, replacedPages); + LinkedList<PagePositioning> newPageOrdered = linkAllPageRoot(pagePositioningElements, replacedPages); + // we extract pages in the computed order of their PagePositioning + // container. + List<AbstractSessionEditorPage> pagesResult = newPageOrdered.stream().map(pageP -> pageP.page).collect(Collectors.toList()); + return pagesResult; + } + + /** + * This method returns a flattened list of all isolated PagePositioning and + * trees of PagePositioning linked to other PagePositioning to have an + * ordered list of page to display in their right order. + * + * @param pagePositioningElements + * the list containing elements isolated or related to others or + * replaced by others. + * @param replacedPages + * all pages replaced to ignore when building the ordered list to + * return. + * @return a flattened list of all isolated PagePositioning and trees of + * PagePositioning linked to other PagePositioning to have an + * ordered list of page to display in their right order. + */ + private LinkedList<PagePositioning> linkAllPageRoot(List<PagePositioning> pagePositioningElements, Set<PagePositioning> replacedPages) { + LinkedList<PagePositioning> newPageOrdered = new LinkedList<>(); + for (PagePositioning pagePositioning : pagePositioningElements) { + if (!replacedPages.contains(pagePositioning)) { + if (pagePositioning.leftPortPage == null && pagePositioning.rightPortPage != null) { + // a root page having other pages attached to its right but + // not to its left. + recursivelyAddLinkedPages(newPageOrdered, pagePositioning); + } else if (pagePositioning.leftPortPage == null && pagePositioning.rightPortPage == null) { + // isolated page. + newPageOrdered.addLast(pagePositioning); + } else if (pagePositioning.leftPortPage.rightPortPage != pagePositioning) { + // in case of conflict a page can be related to another one + // but not on the right of this one because it has been + // replaced because of left of right positioning + // information conflict. Still we want to display it because + // it has not been replaced by a replace information. + newPageOrdered.addLast(pagePositioning); + } + } + } + return newPageOrdered; + } + + /** + * Pages target of other pages wanting to replace it are effectively + * replaced. A page replacing another page takes its left and right + * relations. + * + * @param pagePositioningElements + * the list containing elements isolated or related to others or + * replaced by others. + * @param pageIdToPageMap + * a map of page id to the corresponding {@link PagePositioning} + * @param replacedPages + * all pages replaced to ignore when building the ordered list to + * return. + */ + private void replacePages(List<PagePositioning> pagePositioningElements, Map<String, PagePositioning> pageIdToPageMap, Set<PagePositioning> replacedPages) { + for (PagePositioning pagePositioning : pagePositioningElements) { + if (pagePositioning.replacePortPageId != null) { + PagePositioning replacedPage = pageIdToPageMap.get(pagePositioning.replacePortPageId); + pagePositioning.replacePortPage = replacedPage; + // the page replace the target. I.e it connects to target + // left and right pages. + pagePositioning.leftPortPage = pagePositioning.replacePortPage.leftPortPage; + pagePositioning.rightPortPage = pagePositioning.replacePortPage.rightPortPage; + replacedPages.add(pagePositioning.replacePortPage); + } + } + } + + /** + * We build relations between pages by replacing the positioning kind + id + * by the real pages at the left and right of each {@link PagePositioning}. + * + * Pages without positioning information and without other pages placed + * regarding it are isolated without left and right pages. + * + * This can be the case for pages placed regarding another one that are not + * provided by providers or for pages without positioning information + * pointing on it or on other pages. + * + * @param pagePositioningElements + * the list containing all {@link PagePositioning} with + * positioning information as id and {@link PositioningKind}. + * @param pageIdToPageMap + * a map of page id to the corresponding {@link PagePositioning} + */ + private void positionPagesRegardingOthers(List<PagePositioning> pagePositioningElements, Map<String, PagePositioning> pageIdToPageMap) { + // for all pages to display, we replace their target location page id + // for left and right positioning computed before. This + // create a tree with many roots because some pages can have no + // location. All roots cannot have a page to its left. Only to its + // right. In case of conflict (a page A is placed after page B and + // a page C is placed before A), the last positioned element will have + // its location fulfilled to the cost of the other that becomes + // isolated. + for (PagePositioning pagePositioning : pagePositioningElements) { + if (pagePositioning.leftPortPageId != null) { + PagePositioning targetPagePositioning = pageIdToPageMap.get(pagePositioning.leftPortPageId); + pagePositioning.leftPortPage = targetPagePositioning; + if (targetPagePositioning.rightPortPage != null) { + // We put this page in between the target page and the page + // already to its right. This is a conflict. + targetPagePositioning.rightPortPage.leftPortPage = pagePositioning; + pagePositioning.rightPortPage = targetPagePositioning.rightPortPage; + + } + targetPagePositioning.rightPortPage = pagePositioning; + } + if (pagePositioning.rightPortPageId != null) { + PagePositioning targetPagePositioning = pageIdToPageMap.get(pagePositioning.rightPortPageId); + pagePositioning.rightPortPage = targetPagePositioning; + if (targetPagePositioning.leftPortPage != null) { + // We put this page in between the target page and the page + // already to its left. This is a conflict. + targetPagePositioning.leftPortPage.rightPortPage = pagePositioning; + pagePositioning.leftPortPage = targetPagePositioning.leftPortPage; + } + targetPagePositioning.leftPortPage = pagePositioning; + + } + } + } + + /** + * Constructs {@link PagePositioning} containing the page that should be + * displayed by the given editor and fills pagePositioningElements Set and + * pageIdToPageMap map with it. Also fill the pagesToKeep set with the pages + * of the editor that should be kept. All {@link PagePositioning} have their + * corresponding page and the the positioning information if such + * information exists (if the page should be placed to the left or right of + * another one or replace it and the id of this concerned page.) + * + * @param pageProviders + * providers use to know what pages should be displayed. + * @param editor + * the editor from which we compute pages that should be + * displayed. + * @param alreadyInitializedPages + * the pages already initialized by the editor. + * @param pagesToKeep + * the pages of the editor that should be kept. + * @param pagePositioningElements + * the set containing all {@link PagePositioning} containing the + * pages to display in the given editor. + * @param pageIdToPageMap + * a map of page id to the corresponding {@link PagePositioning} + * containing a page to display in the given editor. + */ + private void initializePagePositioning(List<PageProvider> pageProviders, SessionEditor editor, List<AbstractSessionEditorPage> alreadyInitializedPages, List<AbstractSessionEditorPage> pagesToKeep, + List<PagePositioning> pagePositioningElements, Map<String, PagePositioning> pageIdToPageMap) { + Set<String> alreadyInitializedPagesId = alreadyInitializedPages.stream().map(page -> page.getId()).collect(Collectors.toSet()); + for (PageProvider pageProvider : pageProviders) { + Map<String, Supplier<AbstractSessionEditorPage>> pagesToAdd = pageProvider.getPages(editor); + if (pagesToAdd != null) { + // For each page provided by the provider we initialize a + // PagePositionning defining the page and the location it + // should have regarding other page. + for (Entry<String, Supplier<AbstractSessionEditorPage>> pageEntry : pagesToAdd.entrySet()) { + if (!alreadyInitializedPagesId.contains(pageEntry.getKey())) { + AbstractSessionEditorPage page = pageEntry.getValue().get(); + PositioningKind positioningKind = page.getPositioning(); + String locationId = page.getLocationId(); + PagePositioning pagePositioning = new PagePositioning(); + pageIdToPageMap.put(page.getId(), pagePositioning); + pagePositioningElements.add(pagePositioning); + setPortsId(positioningKind, locationId, pagePositioning); + pagePositioning.page = page; + } + } + } + if (pagesToKeep.size() != alreadyInitializedPages.size()) { + // if we have not yet confirm that all pages of the editor + // should be kept, we ask this provider to know if some + // additional already initialized pages should be kept. + for (AbstractSessionEditorPage page : alreadyInitializedPages) { + if (pagesToAdd.get(page.getId()) != null) { + pagesToKeep.add(page); + PositioningKind positioningKind = page.getPositioning(); + String locationId = page.getLocationId(); + PagePositioning pagePositioning = new PagePositioning(); + pageIdToPageMap.put(page.getId(), pagePositioning); + setPortsId(positioningKind, locationId, pagePositioning); + pagePositioning.page = page; + pagePositioningElements.add(pagePositioning); + } + } + } + } + } + + /** + * Set the given id to the right port id of the given + * {@link PagePositioning}. + * + * @param positioningKind + * the {@link PositioningKind} to set for the given + * {@link PagePositioning}. + * @param targetPageId + * the id of the page that will be poisitionned regarding the + * given {@link PagePositioning} 's page. + * @param pagePositioning + * the component containing the page to position regarding the + * given page id. + */ + private void setPortsId(PositioningKind positioningKind, String targetPageId, PagePositioning pagePositioning) { + if (positioningKind != null && !targetPageId.isEmpty()) { + switch (positioningKind) { + case BEFORE: + pagePositioning.rightPortPageId = targetPageId; + break; + case AFTER: + pagePositioning.leftPortPageId = targetPageId; + break; + case REPLACE: + pagePositioning.replacePortPageId = targetPageId; + break; + default: + break; + } + } + } + + /** + * Recursively constructs the ordered page list by putting the roots and + * their sub tree next to the others. Roots not positioned regarding another + * page are placed at the beginning of the list. + * + * @param newPageOrdered + * the list containing pages in the order specified by all + * positioning information. + * @param pagePositioning + * a page to add to the list that can contains pages to its right + */ + private void recursivelyAddLinkedPages(LinkedList<PagePositioning> newPageOrdered, PagePositioning pagePositioning) { + if (pagePositioning.rightPortPage != null) { + recursivelyAddLinkedPages(newPageOrdered, pagePositioning.rightPortPage); + } + if (!newPageOrdered.contains(pagePositioning)) { + newPageOrdered.addFirst(pagePositioning); + } + } + +} diff --git a/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/pages/PageProviderListener.java b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/pages/PageProviderListener.java new file mode 100644 index 0000000000..1bc7f1a87a --- /dev/null +++ b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/pages/PageProviderListener.java @@ -0,0 +1,29 @@ +/******************************************************************************* + * Copyright (c) 2017 Obeo + * 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: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.ui.editor.internal.pages; + +import org.eclipse.sirius.ui.editor.api.pages.PageProvider; +import org.eclipse.sirius.ui.editor.api.pages.PageProviderRegistry; + +/** + * The components implementing this interface will be notified when + * {@link PageProviderRegistry} is added or removed a {@link PageProvider}. + * + * @author <a href="mailto:pierre.guilet@obeo.fr">Pierre Guilet</a> + * + */ +public interface PageProviderListener { + /** + * Invoked after that a {@link PageProvider} has been added or removed from + * {@link PageProviderRegistry}. + */ + void pageProviderChanged(); +} |
