--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" output="target/classes" path="src/main/java"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+ <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"/>
+ <classpathentry kind="output" path="target/classes"/>
+</classpath>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>instantlauncher</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.m2e.core.maven2Builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.m2e.core.maven2Nature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
--- /dev/null
+#Sat Feb 25 12:11:19 EET 2012
+eclipse.preferences.version=1
+encoding//src/main/java=UTF-8
--- /dev/null
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+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_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+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_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+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=80
+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=true
+org.eclipse.jdt.core.formatter.indentation.size=8
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=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=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=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=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=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=true
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
--- /dev/null
+eclipse.preferences.version=1
+formatter_profile=_Svjatoslav
+formatter_settings_version=12
--- /dev/null
+#Sat Feb 25 12:11:08 EET 2012
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=false
+version=1
--- /dev/null
+#!/bin/bash
+
+#sudo apt-get install "maven2"
+
+mvn clean package
+
+sudo mkdir /opt/instantlauncher
+sudo cp target/instantlauncher-1.0.jar /opt/instantlauncher/
+sudo cp instantlauncher /opt/instantlauncher/
+sudo ln -s /opt/instantlauncher/instantlauncher /usr/bin/
+
+
+
--- /dev/null
+#!/bin/bash
+
+set -f
+
+java -jar /opt/instantlauncher/instantlauncher-1.0.jar $@
+
+
--- /dev/null
+<project
+ xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>eu.svjatoslav</groupId>
+ <artifactId>instantlauncher</artifactId>
+ <version>1.0</version>
+ <packaging>jar</packaging>
+ <name>Instant Launcher</name>
+ <description>popup panel with shortcuts for quick application launching</description>
+
+ <dependencies>
+ <dependency>
+ <groupId>eu.svjatoslav</groupId>
+ <artifactId>svjatoslavcommons</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </dependency>
+
+ <dependency>
+ <groupId>log4j</groupId>
+ <artifactId>log4j</artifactId>
+ <version>1.2.16</version>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>2.3.1</version>
+ <configuration>
+ <source>1.6</source>
+ <target>1.6</target>
+ <optimize>true</optimize>
+ <encoding>UTF-8</encoding>
+ </configuration>
+ </plugin>
+
+ <plugin>
+ <artifactId>maven-assembly-plugin</artifactId>
+ <configuration>
+ <archive>
+ <manifest>
+ <mainClass>eu.svjatoslav.instantlauncher.Main</mainClass>
+ </manifest>
+ </archive>
+ <descriptorRefs>
+ <descriptorRef>jar-with-dependencies</descriptorRef>
+ </descriptorRefs>
+ </configuration>
+
+ <executions>
+
+ <execution>
+ <id>package-jar-with-dependencies</id>
+ <phase>package</phase>
+ <goals>
+ <goal>single</goal>
+ </goals>
+ <configuration>
+ <appendAssemblyId>false</appendAssemblyId>
+ <descriptorRefs>
+ <descriptorRef>jar-with-dependencies</descriptorRef>
+ </descriptorRefs>
+ <archive>
+ <manifest>
+ <mainClass>eu.svjatoslav.instantlauncher.Main</mainClass>
+ </manifest>
+ </archive>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+
+ </plugins>
+ </build>
+
+ <repositories>
+ <repository>
+ <id>svjatoslav.eu</id>
+ <name>Svjatoslav repository</name>
+ <url>http://svjatoslav.eu/static/maven/</url>
+ </repository>
+ </repositories>
+
+ <organization>
+ <name>svjatoslav.eu</name>
+ <url>http://svjatoslav.eu</url>
+ </organization>
+
+
+
+</project>
\ No newline at end of file
--- /dev/null
+cd ~/workspace/instantlauncher
+
+# For faster subsequent startup we use offline mode
+mvn -o exec:java -Dexec.mainClass="eu.svjatoslav.instantlauncher.Main"
+
--- /dev/null
+package eu.svjatoslav.instantlauncher;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Properties;
+
+public class Configuration {
+
+ private static final String KEY_ROOT_DIRECTORY = "KEY_ROOT_DIRECTORY";
+ private static final String CONFIG_FILE_NAME = ".instantlauncher";
+ Properties properties = new Properties();
+
+ boolean propertiesChanged = false;
+
+ public Configuration() throws FileNotFoundException, IOException {
+ initialize();
+ }
+
+ public File getPropertiesFile() {
+ return new File(System.getProperty("user.home") + "/" + CONFIG_FILE_NAME);
+ }
+
+ public File getRootDirectory() {
+
+ if (properties.containsKey(KEY_ROOT_DIRECTORY)) {
+ return new File(properties.getProperty(KEY_ROOT_DIRECTORY));
+ } else {
+ properties.put(KEY_ROOT_DIRECTORY, System.getProperty("user.home") + "/");
+ propertiesChanged = true;
+ return getRootDirectory();
+ }
+
+ }
+
+ public void initialize() throws FileNotFoundException, IOException {
+
+ loadIfFileExists();
+
+ validatePropertiesFile();
+
+ if (propertiesChanged) {
+ saveFile();
+ }
+ }
+
+ public void loadIfFileExists() throws FileNotFoundException, IOException {
+ final File propertiesFile = getPropertiesFile();
+
+ if (propertiesFile.exists()) {
+ final FileInputStream inStream = new FileInputStream(propertiesFile);
+ properties.load(inStream);
+ inStream.close();
+ }
+ }
+
+ public void saveFile() throws FileNotFoundException, IOException {
+ properties.store(new FileOutputStream(getPropertiesFile()), "Instantlauncher configuration file.");
+ }
+
+ public void validatePropertiesFile() {
+ getRootDirectory();
+ }
+
+}
--- /dev/null
+package eu.svjatoslav.instantlauncher;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+
+import eu.svjatoslav.commons.gui.dialog.ExceptionDialog;
+
+public class FileAssociationManager {
+
+ private static final String TEXT_EDITOR = "kwrite";
+
+ private static final String FILE_INDICATOR = "<FILE>";
+
+ public static HashMap<String, String[]> extensionToApplication = new HashMap<String, String[]>();
+
+ public FileAssociationManager() {
+
+ extensionToApplication.put("txt", new String[] { TEXT_EDITOR, FILE_INDICATOR });
+ extensionToApplication.put("xml", new String[] { TEXT_EDITOR, FILE_INDICATOR });
+ extensionToApplication.put("properties", new String[] { TEXT_EDITOR, FILE_INDICATOR });
+ extensionToApplication.put("ini", new String[] { TEXT_EDITOR, FILE_INDICATOR });
+ extensionToApplication.put("", new String[] { TEXT_EDITOR, FILE_INDICATOR });
+
+ extensionToApplication.put("jpg", new String[] { "eog", FILE_INDICATOR });
+ extensionToApplication.put("jpeg", new String[] { "eog", FILE_INDICATOR });
+ extensionToApplication.put("png", new String[] { "eog", FILE_INDICATOR });
+
+ extensionToApplication.put("pdf", new String[] { "evince", FILE_INDICATOR });
+
+ extensionToApplication.put("mp3", new String[] { "banshee", FILE_INDICATOR });
+ extensionToApplication.put("ogg", new String[] { "banshee", FILE_INDICATOR });
+
+ extensionToApplication.put("avi", new String[] { "vlc", FILE_INDICATOR });
+ extensionToApplication.put("mkv", new String[] { "vlc", FILE_INDICATOR });
+ extensionToApplication.put("ogv", new String[] { "vlc", FILE_INDICATOR });
+ extensionToApplication.put("mp4", new String[] { "vlc", FILE_INDICATOR });
+ extensionToApplication.put("flv", new String[] { "vlc", FILE_INDICATOR });
+ extensionToApplication.put("wmv", new String[] { "vlc", FILE_INDICATOR });
+
+ extensionToApplication.put("ods", new String[] { "localc", FILE_INDICATOR });
+
+ }
+
+ public static boolean openFile(final File file) {
+
+ final String fileExtension = Utils.getFileExtension(file);
+
+ System.out.println("About to open file with extension: " + fileExtension);
+
+ if (extensionToApplication.containsKey(fileExtension)) {
+
+ System.out.println("Commands found");
+
+ final String[] commands = extensionToApplication.get(fileExtension);
+
+ final String[] c = new String[commands.length];
+
+ for (int i = 0; i < commands.length; i++) {
+
+ if (commands[i].equals(FILE_INDICATOR)) {
+ c[i] = file.getAbsolutePath();
+ } else {
+ c[i] = commands[i];
+ }
+ }
+
+ try {
+ Runtime.getRuntime().exec(c);
+ InstantLauncher.exitProgram();
+
+ } catch (final IOException e) {
+ ExceptionDialog.showException(e);
+ }
+
+ return true;
+ } else {
+ return false;
+ }
+
+ }
+
+}
--- /dev/null
+package eu.svjatoslav.instantlauncher;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+import org.apache.log4j.Logger;
+
+public class InstantLauncher {
+
+ public Configuration configuration;
+
+ FileAssociationManager associationManager = new FileAssociationManager();
+
+ public static final Logger LOGGER = Logger.getLogger(InstantLauncher.class);
+
+ public void run() throws FileNotFoundException, IOException {
+ configuration = new Configuration();
+
+ final MainFrame mainFrame = new MainFrame(this);
+ mainFrame.show();
+ }
+
+ public static void exitProgram() {
+ LOGGER.info("Closing InstantLauncher");
+ System.exit(0);
+ }
+
+}
--- /dev/null
+package eu.svjatoslav.instantlauncher;
+
+import eu.svjatoslav.commons.gui.dialog.ExceptionDialog;
+
+public class Main {
+
+ public static void main(final String[] args) {
+
+ try {
+ final InstantLauncher instantLauncher = new InstantLauncher();
+ instantLauncher.run();
+ } catch (final Exception e) {
+ ExceptionDialog.showException(e);
+ }
+ }
+
+}
--- /dev/null
+package eu.svjatoslav.instantlauncher;
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.Point;
+import java.awt.event.WindowEvent;
+import java.awt.event.WindowListener;
+
+import javax.swing.JFrame;
+
+import eu.svjatoslav.instantlauncher.menu.MultiLevelMenu;
+
+public class MainFrame {
+
+ public static class FrameWindowListener implements WindowListener {
+
+ @Override
+ public void windowActivated(final WindowEvent e) {
+ }
+
+ @Override
+ public void windowClosed(final WindowEvent e) {
+ }
+
+ @Override
+ public void windowClosing(final WindowEvent e) {
+ InstantLauncher.exitProgram();
+ }
+
+ @Override
+ public void windowDeactivated(final WindowEvent e) {
+ }
+
+ @Override
+ public void windowDeiconified(final WindowEvent e) {
+ }
+
+ @Override
+ public void windowIconified(final WindowEvent e) {
+ }
+
+ @Override
+ public void windowOpened(final WindowEvent e) {
+ }
+
+ }
+
+ private JFrame frame;
+
+ private boolean isShowing;
+
+ public static final Dimension CONTENT_PANEL_SIZE = new Dimension(1100, 850);
+ public static final Point INITIAL_LOCATION = new Point(100, 30);
+
+ private final InstantLauncher instantLauncher;
+
+ public MainFrame(final InstantLauncher instantLauncher) {
+ this.instantLauncher = instantLauncher;
+ }
+
+ private void buildContentPane() {
+
+ final MultiLevelMenu multiLevelMenu = new MultiLevelMenu(instantLauncher);
+ frame.getContentPane().add(multiLevelMenu.buildContentPanel(), BorderLayout.CENTER);
+
+ }
+
+ public void show() {
+
+ if (!isShowing) {
+ // initialize frame
+ frame = new JFrame("InstantLauncher");
+
+ buildContentPane();
+
+ frame.setSize(CONTENT_PANEL_SIZE);
+ frame.setVisible(true);
+ frame.setLocation(INITIAL_LOCATION);
+
+ // registor window listener
+ final FrameWindowListener windowListener = new FrameWindowListener();
+ frame.addWindowListener(windowListener);
+
+ // maximize window
+ frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
+
+ isShowing = true;
+ }
+
+ }
+
+}
--- /dev/null
+package eu.svjatoslav.instantlauncher;
+
+import java.awt.Dimension;
+import java.io.File;
+
+import javax.swing.JComponent;
+
+public class Utils {
+
+ public static String getFileExtension(File file) {
+ // extract file name without file name extension
+ String fullFileName = file.getName();
+
+ int dot = fullFileName.lastIndexOf('.');
+ String fileExtension;
+ if (dot == -1) {
+ fileExtension = "";
+ } else {
+ fileExtension = fullFileName.substring(dot + 1);
+ fileExtension = fileExtension.toLowerCase();
+ }
+
+ return fileExtension;
+ }
+
+ public static final void setComponentSize(JComponent component, Dimension size) {
+ component.setMinimumSize(size);
+ component.setMaximumSize(size);
+ component.setSize(size);
+ component.setPreferredSize(size);
+
+ }
+
+}
--- /dev/null
+package eu.svjatoslav.instantlauncher.menu;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.io.File;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.swing.Box;
+import javax.swing.BoxLayout;
+import javax.swing.JButton;
+import javax.swing.JPanel;
+import javax.swing.SwingConstants;
+import javax.swing.border.EmptyBorder;
+
+import eu.svjatoslav.commons.gui.dialog.ExceptionDialog;
+import eu.svjatoslav.instantlauncher.Utils;
+
+public class Menu {
+
+ public static final Color BUTTON_BG_DIRECTORY = new Color(0, 0, 60);
+ public static final Color BUTTON_BG_DIRECTORY_SELECTED = new Color(0, 0, 100);
+
+ public static final Color BUTTON_BG_LINK = new Color(60, 60, 0);
+ public static final Color BUTTON_BG_LINK_SELECTED = new Color(100, 100, 0);
+
+ public static final Color BUTTON_BG_EXECUTABLE_FILE = new Color(60, 0, 0);
+ public static final Color BUTTON_BG_EXECUTABLE_FILE_SELECTED = new Color(100, 0, 0);
+
+ public static final Color BUTTON_BG_NONEXECUTABLE_FILE = new Color(0, 60, 0);
+ public static final Color BUTTON_BG_NONEXECUTABLE_FILE_SELECTED = new Color(0, 100, 0);
+
+ public static final Dimension SIZE_BUTTON = new Dimension(200, 30);
+ public static final Dimension SIZE_MENU_PANEL = new Dimension(210, 900);
+
+ private JPanel menuPanel;
+
+ public JButton selectedButton;
+ public File selectedFile;
+
+ private final Set<MenuListener> menuListeners = new HashSet<MenuListener>();
+
+ public Menu(final File directory) {
+ buildContentPanel(directory);
+ };
+
+ /**
+ * <pre>
+ * Assign specific colors to:
+ * Directory
+ * Executable file
+ * Non executable file
+ * </pre>
+ */
+ public static Color getFileColor(final File file, final boolean selected) {
+ if (file.isDirectory()) {
+ if (selected) {
+ return BUTTON_BG_DIRECTORY_SELECTED;
+ } else {
+ return BUTTON_BG_DIRECTORY;
+ }
+ }
+
+ if (file.isFile()) {
+ if (file.canExecute()) {
+ if (selected) {
+ return BUTTON_BG_EXECUTABLE_FILE_SELECTED;
+ } else {
+ return BUTTON_BG_EXECUTABLE_FILE;
+ }
+ } else {
+ if (selected) {
+ return BUTTON_BG_NONEXECUTABLE_FILE_SELECTED;
+ } else {
+ return BUTTON_BG_NONEXECUTABLE_FILE;
+ }
+ }
+ }
+
+ if (selected) {
+ return BUTTON_BG_LINK_SELECTED;
+ } else {
+ return BUTTON_BG_LINK;
+ }
+ }
+
+ public void addMenuListener(final MenuListener menuListener) {
+ menuListeners.add(menuListener);
+ }
+
+ public JButton buildButton(final File file) {
+ JButton button;
+ if (file.isDirectory()) {
+ button = new JButton("[ " + file.getName() + " ]");
+ } else {
+ button = new JButton(file.getName());
+ }
+
+ button.setBackground(getFileColor(file, false));
+ button.setForeground(new Color(255, 255, 255));
+
+ button.setBorder(new EmptyBorder(5, 10, 5, 10));
+
+ final Menu.ButtonMouseListener mouseListener = new ButtonMouseListener(button, this, file);
+ button.addMouseListener(mouseListener);
+
+ button.setHorizontalTextPosition(SwingConstants.CENTER);
+
+ // set button size
+ Utils.setComponentSize(button, SIZE_BUTTON);
+
+ return button;
+ }
+
+ private void buildContentPanel(final File directory) {
+ menuPanel = new JPanel();
+
+ Utils.setComponentSize(menuPanel, SIZE_MENU_PANEL);
+
+ final BoxLayout layout = new BoxLayout(menuPanel, BoxLayout.Y_AXIS);
+ menuPanel.setLayout(layout);
+ menuPanel.setBackground(Color.BLACK);
+
+ final File[] listFiles = directory.listFiles();
+
+ // Sort files by name
+ Arrays.sort(listFiles, new Comparator<File>() {
+ @Override
+ public int compare(final File f1, final File f2) {
+
+ // directories come before files
+ if (f1.isFile() && f2.isDirectory()) {
+ return 1;
+ }
+ if (f2.isFile() && f1.isDirectory()) {
+ return -1;
+ }
+
+ // order by file name
+ return f1.getName().toUpperCase().compareTo(f2.getName().toUpperCase());
+ }
+ });
+
+ // add files to the panel
+ for (final File file : listFiles) {
+ // ignore hidden files
+ if (!file.getName().startsWith(".")) {
+ menuPanel.add(Box.createVerticalStrut(10));
+ menuPanel.add(buildButton(file));
+ }
+ }
+ }
+
+ public JPanel getMenuPanel() {
+ return menuPanel;
+ }
+
+ public JButton getSelectedButton() {
+ return selectedButton;
+ }
+
+ public File getSelectedFile() {
+ return selectedFile;
+ }
+
+ public void notifyAlternativeEventListeners(final File chosenFile) {
+ for (final MenuListener menuListener : menuListeners) {
+ menuListener.menuItemSelectedAlternative(this, chosenFile);
+ }
+ }
+
+ public void notifyEventListeners(final File chosenFile) {
+ for (final MenuListener menuListener : menuListeners) {
+ menuListener.menuItemSelected(this, chosenFile);
+ }
+ }
+
+ public void setSelected(final JButton selectedButton, final File selectedFile) {
+ this.selectedButton = selectedButton;
+ this.selectedFile = selectedFile;
+ }
+
+ public static class ButtonMouseListener implements MouseListener {
+
+ JButton parentButton;
+ Menu parentMenu;
+ File file;
+
+ public ButtonMouseListener(final JButton button, final Menu parentMenu, final File file) {
+ parentButton = button;
+ this.parentMenu = parentMenu;
+ this.file = file;
+ }
+
+ @Override
+ public void mouseClicked(final MouseEvent e) {
+ try {
+
+ if (e.getButton() == 1) {
+ parentMenu.notifyEventListeners(file);
+ }
+ if (e.getButton() == 3) {
+ parentMenu.notifyAlternativeEventListeners(file);
+ }
+ } catch (final Exception ex) {
+ ExceptionDialog.showException(ex);
+ }
+ }
+
+ @Override
+ public void mouseEntered(final MouseEvent e) {
+ try {
+ if (parentButton != parentMenu.getSelectedButton()) {
+
+ if (parentMenu.getSelectedButton() != null) {
+ parentMenu.getSelectedButton().setBackground(getFileColor(parentMenu.getSelectedFile(), false));
+ }
+
+ parentMenu.setSelected(parentButton, file);
+ parentButton.setBackground(getFileColor(file, true));
+
+ if (file.isDirectory()) {
+ parentMenu.notifyEventListeners(file);
+ }
+ }
+ } catch (final Exception ex) {
+ ExceptionDialog.showException(ex);
+ }
+ }
+
+ @Override
+ public void mouseExited(final MouseEvent e) {
+ }
+
+ @Override
+ public void mousePressed(final MouseEvent e) {
+ }
+
+ @Override
+ public void mouseReleased(final MouseEvent e) {
+ }
+
+ }
+
+}
\ No newline at end of file
--- /dev/null
+package eu.svjatoslav.instantlauncher.menu;
+
+public interface MenuListener {
+
+ public void menuItemSelected(Menu menu, java.io.File chosenFile);
+
+ public void menuItemSelectedAlternative(Menu menu, java.io.File chosenFile);
+
+}
--- /dev/null
+package eu.svjatoslav.instantlauncher.menu;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+
+import javax.swing.Box;
+import javax.swing.BoxLayout;
+import javax.swing.JPanel;
+
+import eu.svjatoslav.commons.gui.dialog.ExceptionDialog;
+import eu.svjatoslav.instantlauncher.FileAssociationManager;
+import eu.svjatoslav.instantlauncher.InstantLauncher;
+import eu.svjatoslav.instantlauncher.Utils;
+
+public class MultiLevelMenu implements MenuListener {
+
+ private final InstantLauncher instantLauncher;
+
+ private static final int VERTICAL_MENUS_COUNT = 5;
+
+ public static final Dimension CONTENT_PANEL_SIZE = new Dimension(1024, 900);
+
+ ArrayList<Menu> menus = new ArrayList<Menu>();
+
+ ArrayList<JPanel> panels = new ArrayList<JPanel>();
+ JPanel contentPane;
+
+ public MultiLevelMenu(final InstantLauncher instantLauncher) {
+ this.instantLauncher = instantLauncher;
+ }
+
+ /**
+ * Adds new vertical menu.
+ *
+ * @return <code>true</code> if operation succeeded, or <code>false</code>
+ * if there was not enough space left for a new menu.
+ */
+ public boolean addMenu(final File directory) {
+ final int newMenuHorizontalIndex = menus.size();
+
+ if (newMenuHorizontalIndex >= VERTICAL_MENUS_COUNT)
+ return false;
+
+ final Menu menu = new Menu(directory);
+ menu.addMenuListener(this);
+
+ final JPanel placeholderPanel = panels.get(newMenuHorizontalIndex);
+ final JPanel menuPanel = menu.getMenuPanel();
+ placeholderPanel.add(menuPanel, BorderLayout.CENTER);
+
+ menus.add(menu);
+ return true;
+ }
+
+ public JPanel buildContentPanel() {
+
+ contentPane = new JPanel();
+ contentPane.setBackground(Color.BLACK);
+ contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.X_AXIS));
+ Utils.setComponentSize(contentPane, CONTENT_PANEL_SIZE);
+
+ // initialize panels
+ for (int i = 0; i < VERTICAL_MENUS_COUNT; i++) {
+ contentPane.add(Box.createHorizontalStrut(10));
+
+ final JPanel panel = new JPanel(new BorderLayout());
+ panel.setBackground(Color.BLACK);
+
+ Utils.setComponentSize(panel, Menu.SIZE_MENU_PANEL);
+
+ panels.add(panel);
+ contentPane.add(panel);
+ }
+
+ final File directory = instantLauncher.configuration.getRootDirectory();
+ addMenu(directory);
+
+ return contentPane;
+ }
+
+ public int getMenuIndex(final Menu menu) {
+ int i = 0;
+ for (final Menu m : menus) {
+ if (m == menu)
+ return i;
+ i++;
+ }
+ return -1;
+ }
+
+ @Override
+ public void menuItemSelected(final Menu menu, final File chosenFile) {
+
+ if (chosenFile.isDirectory()) {
+ final int menuIndex = getMenuIndex(menu);
+
+ if (menuIndex >= 0) {
+ removeMenus(menuIndex + 1);
+ if (addMenu(chosenFile)) {
+ contentPane.validate();
+ contentPane.repaint();
+ }
+ }
+ }
+
+ if (chosenFile.isFile()) {
+
+ if (chosenFile.canExecute()) {
+ try {
+ // Execute a command without arguments
+ final String command = chosenFile.getAbsolutePath();
+
+ final String[] c = new String[1];
+ c[0] = command;
+
+ Runtime.getRuntime().exec(c);
+ InstantLauncher.exitProgram();
+ } catch (final IOException e) {
+ ExceptionDialog.showException(e);
+ }
+
+ } else {
+ final boolean fileOpened = FileAssociationManager.openFile(chosenFile);
+ if (fileOpened) {
+ InstantLauncher.exitProgram();
+ }
+ }
+ }
+ }
+
+ @Override
+ public void menuItemSelectedAlternative(final Menu menu, final File chosenFile) {
+ if (chosenFile.isDirectory()) {
+ // Execute a command without arguments
+ final String directoryPath = chosenFile.getAbsolutePath();
+
+ final String[] c = new String[2];
+ c[0] = "nautilus";
+ c[1] = directoryPath;
+
+ try {
+ Runtime.getRuntime().exec(c);
+ InstantLauncher.exitProgram();
+
+ } catch (final IOException e) {
+ ExceptionDialog.showException(e);
+ }
+ } else {
+ chosenFile.setExecutable(!chosenFile.canExecute());
+ }
+ }
+
+ public void removeMenus(final int fromIndex) {
+
+ for (int i = fromIndex; i < menus.size(); i++) {
+ final JPanel jPanel = panels.get(i);
+ jPanel.removeAll();
+ }
+
+ while (menus.size() > fromIndex) {
+ menus.remove(fromIndex);
+ }
+ }
+
+}
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
+<log4j:configuration>
+ <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
+ <layout class="org.apache.log4j.PatternLayout">
+ <param name="ConversionPattern" value="%d{ABSOLUTE}
+ %5p %c{1}:%L - %m%n" />
+
+ </layout>
+ </appender>
+ <root>
+ <!-- possible values are: debug, info, error -->
+ <priority value="debug"></priority>
+ <appender-ref ref="stdout" />
+ </root>
+</log4j:configuration>
\ No newline at end of file