mirror of
https://github.com/esp8266/Arduino.git
synced 2025-06-17 22:23:10 +03:00
Moving the processing-5503 branch (used for Arduino 0017) into the trunk.
This commit is contained in:
10
.classpath
Normal file
10
.classpath
Normal file
@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry excluding="processing/app/tools/format/|processing/app/tools/format/src/|processing/app/Trace.java|processing/app/RunnerClassLoader.java" kind="src" path="app/src"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/core"/>
|
||||
<classpathentry kind="lib" path="build/shared/lib/antlr.jar"/>
|
||||
<classpathentry kind="lib" path="build/shared/lib/registry.jar"/>
|
||||
<classpathentry kind="lib" path="build/shared/lib/apple.jar"/>
|
||||
<classpathentry kind="output" path="app/bin"/>
|
||||
</classpath>
|
17
.project
Normal file
17
.project
Normal file
@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>processing-head</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
263
.settings/org.eclipse.jdt.core.prefs
Normal file
263
.settings/org.eclipse.jdt.core.prefs
Normal file
@ -0,0 +1,263 @@
|
||||
#Thu Jan 10 10:50:38 PST 2008
|
||||
eclipse.preferences.version=1
|
||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
|
||||
org.eclipse.jdt.core.compiler.compliance=1.4
|
||||
org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
|
||||
org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
|
||||
org.eclipse.jdt.core.compiler.source=1.3
|
||||
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_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_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_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.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_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=false
|
||||
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_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.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.format_guardian_clause_on_one_line=false
|
||||
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=2
|
||||
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=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_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_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_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_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_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.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=80
|
||||
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=2
|
||||
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
|
||||
org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
|
4
.settings/org.eclipse.jdt.ui.prefs
Normal file
4
.settings/org.eclipse.jdt.ui.prefs
Normal file
@ -0,0 +1,4 @@
|
||||
#Thu Jan 10 10:50:38 PST 2008
|
||||
eclipse.preferences.version=1
|
||||
formatter_settings_version=11
|
||||
org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates/>
|
20
app/.classpath
Normal file
20
app/.classpath
Normal file
@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry excluding="processing/app/tools/format/" kind="src" path="src"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/core"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/dxf"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/net"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/opengl">
|
||||
<attributes>
|
||||
<attribute name="org.eclipse.jdt.launching.CLASSPATH_ATTR_LIBRARY_PATH_ENTRY" value="opengl/library"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/pdf"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/serial"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/video"/>
|
||||
<classpathentry kind="lib" path="lib/antlr.jar"/>
|
||||
<classpathentry kind="lib" path="lib/jna.jar"/>
|
||||
<classpathentry kind="lib" path="lib/ecj.jar"/>
|
||||
<classpathentry kind="output" path="bin"/>
|
||||
</classpath>
|
20
app/.classpath_macosx
Normal file
20
app/.classpath_macosx
Normal file
@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry excluding="processing/app/tools/format/" kind="src" path="src"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/core"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/dxf"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/net"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/opengl">
|
||||
<attributes>
|
||||
<attribute name="org.eclipse.jdt.launching.CLASSPATH_ATTR_LIBRARY_PATH_ENTRY" value="opengl/library"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/pdf"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/serial"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/video"/>
|
||||
<classpathentry kind="lib" path="lib/antlr.jar"/>
|
||||
<classpathentry kind="lib" path="lib/jna.jar"/>
|
||||
<classpathentry kind="lib" path="lib/ecj.jar"/>
|
||||
<classpathentry kind="output" path="bin"/>
|
||||
</classpath>
|
21
app/.classpath_vista
Executable file
21
app/.classpath_vista
Executable file
@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry excluding="processing/app/tools/format/|processing/app/macosx/" kind="src" path="src"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/core"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/dxf"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/net"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/opengl">
|
||||
<attributes>
|
||||
<attribute name="org.eclipse.jdt.launching.CLASSPATH_ATTR_LIBRARY_PATH_ENTRY" value="opengl/library"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/pdf"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/serial"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/video"/>
|
||||
<classpathentry kind="lib" path="lib/antlr.jar"/>
|
||||
<classpathentry kind="lib" path="lib/jna.jar"/>
|
||||
<classpathentry kind="lib" path="lib/ecj.jar"/>
|
||||
<classpathentry kind="lib" path="C:/Users/fry/processing/build/windows/work/java/lib/tools.jar"/>
|
||||
<classpathentry kind="output" path="bin"/>
|
||||
</classpath>
|
17
app/.project
Normal file
17
app/.project
Normal file
@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>processing</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
320
app/.settings/org.eclipse.jdt.core.prefs
Normal file
320
app/.settings/org.eclipse.jdt.core.prefs
Normal file
@ -0,0 +1,320 @@
|
||||
#Wed Jun 04 15:47:46 EDT 2008
|
||||
eclipse.preferences.version=1
|
||||
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
|
||||
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
|
||||
org.eclipse.jdt.core.compiler.compliance=1.5
|
||||
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
|
||||
org.eclipse.jdt.core.compiler.debug.localVariable=generate
|
||||
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
|
||||
org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
|
||||
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
||||
org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
|
||||
org.eclipse.jdt.core.compiler.problem.deprecation=warning
|
||||
org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
|
||||
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
|
||||
org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
|
||||
org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
|
||||
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
||||
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
|
||||
org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
|
||||
org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
|
||||
org.eclipse.jdt.core.compiler.problem.finalParameterBound=ignore
|
||||
org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
|
||||
org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
|
||||
org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
|
||||
org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
|
||||
org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
|
||||
org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
|
||||
org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
|
||||
org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
|
||||
org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
|
||||
org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
|
||||
org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
|
||||
org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
|
||||
org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
|
||||
org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
|
||||
org.eclipse.jdt.core.compiler.problem.nullReference=ignore
|
||||
org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
|
||||
org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
|
||||
org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
|
||||
org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
|
||||
org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
|
||||
org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
|
||||
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
|
||||
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
|
||||
org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
|
||||
org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
|
||||
org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
|
||||
org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
|
||||
org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
|
||||
org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
|
||||
org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
|
||||
org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
|
||||
org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
|
||||
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
|
||||
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
|
||||
org.eclipse.jdt.core.compiler.problem.unusedImport=warning
|
||||
org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
|
||||
org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
|
||||
org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
|
||||
org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
|
||||
org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
|
||||
org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
|
||||
org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
|
||||
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
|
||||
org.eclipse.jdt.core.compiler.source=1.5
|
||||
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_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=18
|
||||
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=18
|
||||
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
|
||||
org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=82
|
||||
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_multiple_fields=16
|
||||
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=18
|
||||
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=18
|
||||
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.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_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.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.format_guardian_clause_on_one_line=false
|
||||
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=2
|
||||
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=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_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_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_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_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_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.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=80
|
||||
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=2
|
||||
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
|
||||
org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
|
4
app/.settings/org.eclipse.jdt.ui.prefs
Normal file
4
app/.settings/org.eclipse.jdt.ui.prefs
Normal file
@ -0,0 +1,4 @@
|
||||
#Tue Jun 03 17:00:03 EDT 2008
|
||||
eclipse.preferences.version=1
|
||||
formatter_profile=_two spaces no tabs
|
||||
formatter_settings_version=11
|
@ -1,149 +0,0 @@
|
||||
/*
|
||||
Part of the Arduino project - http://arduino.berlios.de
|
||||
|
||||
This class reads from an input stream
|
||||
and flushes out everything to the System.out
|
||||
It can report interrupts back to the parent process
|
||||
|
||||
@author DojoDave
|
||||
@www http://www.0j0.org
|
||||
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
// TODO migrate codebase to arduino.app
|
||||
package processing.app;
|
||||
|
||||
import java.io.*;
|
||||
|
||||
class ArduinoMessageSiphon extends Thread
|
||||
{
|
||||
/** Stream to read from */
|
||||
InputStream is;
|
||||
|
||||
/** Process' parent in execution */
|
||||
Thread parent;
|
||||
|
||||
/** Output message from System.error */
|
||||
public String theMsg ="";
|
||||
|
||||
/** Result value to be sent back */
|
||||
public int result = -1;
|
||||
|
||||
/** Count errors and warnings to be sent back */
|
||||
public int totalErrors = 0;
|
||||
|
||||
/** Debug Errors and Warnings */
|
||||
public boolean debugWarning = false;
|
||||
public boolean debugError = false;
|
||||
public boolean logAllOutput = false;
|
||||
|
||||
/**
|
||||
* Creates the stream to flush
|
||||
* @param theIS is the input stream we will monitor
|
||||
* process is the parent process that called this
|
||||
*/
|
||||
public ArduinoMessageSiphon(InputStream theIS, Thread process)
|
||||
{
|
||||
// Assign to member variables
|
||||
is = theIS;
|
||||
parent = process;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the stream to flush
|
||||
* @param theIS is the input stream we will monitor
|
||||
* process is the parent process that called this
|
||||
* warnings will debug warnings when calling commands
|
||||
* errors will debug errors when calling commands
|
||||
*/
|
||||
|
||||
/**
|
||||
* The errors it will report are in the ranges
|
||||
* 49 - 0 for the programmer's errors
|
||||
* 99 - 50 for the compiler's errors
|
||||
*/
|
||||
public ArduinoMessageSiphon(InputStream theIS, Thread process, boolean warnings, boolean errors)
|
||||
{
|
||||
// Assign to member variables
|
||||
is = theIS;
|
||||
parent = process;
|
||||
debugWarning = warnings;
|
||||
debugError = errors;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* The errors it will report are in the ranges
|
||||
* 49 - 0 for the programmer's errors
|
||||
* 99 - 50 for the compiler's errors
|
||||
*/
|
||||
public ArduinoMessageSiphon(InputStream theIS, Thread process, boolean outlog)
|
||||
{
|
||||
// Assign to member variables
|
||||
is = theIS;
|
||||
parent = process;
|
||||
logAllOutput = outlog;
|
||||
|
||||
}
|
||||
|
||||
/** Performs system call specific code */
|
||||
public void run()
|
||||
{
|
||||
BufferedReader br = new BufferedReader(new InputStreamReader(is));
|
||||
|
||||
try {
|
||||
String theLine;
|
||||
while ((theLine = br.readLine()) != null) {
|
||||
if (logAllOutput) {
|
||||
theMsg += theLine + "\r\n";
|
||||
//System.out.println(theMsg);
|
||||
}
|
||||
if ((theLine.indexOf("warning:") != -1) && (theLine.indexOf("prog.c:") != -1) && (debugWarning)) {
|
||||
theMsg += theLine + "\r\n";
|
||||
totalErrors++;
|
||||
}
|
||||
if ((theLine.indexOf("error:") != -1) && (theLine.indexOf("prog.c:") != -1) && (debugError)) {
|
||||
result = 97;
|
||||
theMsg += theLine + "\r\n";
|
||||
totalErrors++;
|
||||
}
|
||||
if (theLine.indexOf("Errors: none") != -1) {
|
||||
result = 0;
|
||||
}
|
||||
if (theLine.indexOf("bytes transferred") != -1) {
|
||||
result = 0;
|
||||
}
|
||||
if (theLine.toLowerCase().indexOf("not responding") != -1) {
|
||||
result = 49;
|
||||
}
|
||||
}
|
||||
br.close();
|
||||
|
||||
// waits 20 secs until being killed by the
|
||||
// parent process or just dies, no zombies wanted!!
|
||||
try {
|
||||
Thread.currentThread().sleep(20000);
|
||||
} catch (InterruptedException ie) {
|
||||
}
|
||||
} catch (Exception err) {
|
||||
err.printStackTrace();
|
||||
result = 96;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
1111
app/Base.java
1111
app/Base.java
File diff suppressed because it is too large
Load Diff
153
app/Command.java
153
app/Command.java
@ -1,153 +0,0 @@
|
||||
/*
|
||||
Part of the Arduino project - http://arduino.berlios.de
|
||||
|
||||
This class creates a compilation thread
|
||||
this is needed for detecting time-outs
|
||||
in system calls. It may happen in
|
||||
windows whenever there is a syntax error
|
||||
that the compilation may hang the IDE
|
||||
|
||||
@author DojoDave
|
||||
@www http://www.0j0.org
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
// TODO migrate codebase to arduino.app
|
||||
package processing.app;
|
||||
|
||||
import java.io.*;
|
||||
|
||||
class Command extends Thread
|
||||
{
|
||||
/** Command to execute on command line */
|
||||
String command;
|
||||
|
||||
/** Process in execution */
|
||||
Process process;
|
||||
|
||||
/** Output message from System.out */
|
||||
public String outMsg ="";
|
||||
|
||||
/** Error message from System.error */
|
||||
public String errorMsg ="";
|
||||
|
||||
/** Result value to be sent back */
|
||||
public int outResult = -1;
|
||||
public int errorResult = -1;
|
||||
|
||||
/** Total errors and warnings to be sent back */
|
||||
public int totalErrors = 0;
|
||||
|
||||
/** Waiting value */
|
||||
public int waitResult = -1;
|
||||
|
||||
/** Debug Errors and Warnings */
|
||||
public boolean debugWarning = false;
|
||||
public boolean debugError = false;
|
||||
public boolean logAllOutput = false;
|
||||
|
||||
/**
|
||||
* Creates the compiler object with the
|
||||
* gnumake line to call
|
||||
* @param command name of the command line to call
|
||||
*/
|
||||
public Command (String co)
|
||||
{
|
||||
// Assign to member variable
|
||||
command = co;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the compiler object with the
|
||||
* gnumake line to call
|
||||
* @param command name of the command line to call
|
||||
* outlog will debug warnings when calling commands
|
||||
*/
|
||||
public Command (String co, boolean outlog)
|
||||
{
|
||||
// Assign to member variable
|
||||
command = co;
|
||||
logAllOutput = outlog;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the compiler object with the
|
||||
* gnumake line to call
|
||||
* @param command name of the command line to call
|
||||
* warnings will debug warnings when calling commands
|
||||
* errors will debug errors when calling commands
|
||||
*/
|
||||
public Command (String co, boolean warnings, boolean errors)
|
||||
{
|
||||
// Assign to member variable
|
||||
command = co;
|
||||
debugWarning = warnings;
|
||||
debugError = errors;
|
||||
}
|
||||
|
||||
/** Performs system call specific code */
|
||||
public void run()
|
||||
{
|
||||
try {
|
||||
process = Runtime.getRuntime().exec(command);
|
||||
ArduinoMessageSiphon input;
|
||||
ArduinoMessageSiphon error;
|
||||
if (logAllOutput) {
|
||||
input = new ArduinoMessageSiphon(process.getInputStream(), this, logAllOutput);
|
||||
error = new ArduinoMessageSiphon(process.getErrorStream(), this, logAllOutput);
|
||||
} else {
|
||||
input = new ArduinoMessageSiphon(process.getInputStream(), this, debugWarning, debugError);
|
||||
error = new ArduinoMessageSiphon(process.getErrorStream(), this, debugWarning, debugError);
|
||||
}
|
||||
input.start();
|
||||
error.start();
|
||||
|
||||
// wait for the process to finish. if interrupted
|
||||
// before waitFor returns, continue waiting
|
||||
//
|
||||
boolean compiling = true;
|
||||
while (compiling) {
|
||||
try {
|
||||
waitResult = process.waitFor();
|
||||
outResult = input.result;
|
||||
errorResult = error.result;
|
||||
compiling = false;
|
||||
} catch (InterruptedException ignored) { }
|
||||
}
|
||||
|
||||
try {
|
||||
waitResult = process.exitValue();
|
||||
} catch (IllegalThreadStateException ignored) { }
|
||||
|
||||
// trace the error and outout
|
||||
outMsg = input.theMsg;
|
||||
errorMsg = error.theMsg;
|
||||
totalErrors = error.totalErrors;
|
||||
|
||||
// waits 20 secs until being killed by the
|
||||
// parent process or just dies, no zombies wanted!!
|
||||
try {
|
||||
Thread.currentThread().sleep(20000);
|
||||
} catch (InterruptedException ie) {
|
||||
}
|
||||
|
||||
} catch (IOException ioe) {
|
||||
outResult = 99;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,600 +0,0 @@
|
||||
/* -*- mode: jde; c-basic-offset: 2; indent-tabs-mode: nil -*- */
|
||||
|
||||
/*
|
||||
Compiler - default compiler class that connects to avr-gcc
|
||||
Part of the Arduino project - http://www.arduino.cc/
|
||||
|
||||
Modified by David A. Mellis
|
||||
|
||||
Copyright (c) 2004-05 Hernando Barragan
|
||||
|
||||
Processing version
|
||||
Copyright (c) 2004-05 Ben Fry and Casey Reas
|
||||
Copyright (c) 2001-04 Massachusetts Institute of Technology
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
$Id$
|
||||
*/
|
||||
|
||||
package processing.app;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
import java.util.zip.*;
|
||||
import javax.swing.*;
|
||||
|
||||
public class Compiler implements MessageConsumer {
|
||||
static final String BUGS_URL =
|
||||
"https://developer.berlios.de/bugs/?group_id=3590";
|
||||
static final String SUPER_BADNESS =
|
||||
"Compiler error, please submit this code to " + BUGS_URL;
|
||||
|
||||
Sketch sketch;
|
||||
String buildPath;
|
||||
|
||||
//String buildPath;
|
||||
//String className;
|
||||
//File includeFolder;
|
||||
RunnerException exception;
|
||||
//Editor editor;
|
||||
|
||||
/*
|
||||
public Compiler(String buildPath, String className,
|
||||
File includeFolder, Editor editor) {
|
||||
this.buildPath = buildPath;
|
||||
this.includeFolder = includeFolder;
|
||||
this.className = className;
|
||||
this.editor = editor;
|
||||
}
|
||||
|
||||
|
||||
public boolean compile(PrintStream leechErr) {
|
||||
*/
|
||||
|
||||
public Compiler() { } // consider this a warning, you werkin soon.
|
||||
|
||||
|
||||
public boolean compile(Sketch sketch, String buildPath, Target target)
|
||||
throws RunnerException {
|
||||
|
||||
this.sketch = sketch;
|
||||
this.buildPath = buildPath;
|
||||
|
||||
// the pms object isn't used for anything but storage
|
||||
MessageStream pms = new MessageStream(this);
|
||||
|
||||
String userdir = System.getProperty("user.dir") + File.separator;
|
||||
|
||||
// LibraryManager libraryManager;
|
||||
//
|
||||
// try {
|
||||
// libraryManager = new LibraryManager();
|
||||
// } catch (IOException e) {
|
||||
// throw new RunnerException(e.getMessage());
|
||||
// }
|
||||
String avrBasePath;
|
||||
if(Base.isMacOS()) {
|
||||
avrBasePath = new String("hardware/tools/avr/bin/");
|
||||
}
|
||||
else if(Base.isLinux()) {
|
||||
avrBasePath = new String("");
|
||||
}
|
||||
else {
|
||||
avrBasePath = new String(userdir + "hardware/tools/avr/bin/");
|
||||
}
|
||||
|
||||
List includePaths = new ArrayList();
|
||||
includePaths.add(target.getPath());
|
||||
// use lib directories as include paths
|
||||
for (int i = 0; i < sketch.importedLibraries.size(); i++) {
|
||||
includePaths.add(
|
||||
((Library) sketch.importedLibraries.get(i)).getFolder().getPath());
|
||||
}
|
||||
|
||||
List baseCommandLinker = new ArrayList(Arrays.asList(new String[] {
|
||||
avrBasePath + "avr-gcc",
|
||||
"-Os",
|
||||
"-Wl,--gc-sections",
|
||||
"-mmcu=" + Preferences.get("boards." + Preferences.get("board") + ".build.mcu"),
|
||||
"-o",
|
||||
buildPath + File.separator + sketch.name + ".elf"
|
||||
}));
|
||||
|
||||
String runtimeLibraryName = buildPath + File.separator + "core.a";
|
||||
|
||||
List baseCommandAR = new ArrayList(Arrays.asList(new String[] {
|
||||
avrBasePath + "avr-ar",
|
||||
"rcs",
|
||||
runtimeLibraryName
|
||||
}));
|
||||
|
||||
// use lib object files
|
||||
for (Iterator i = sketch.importedLibraries.iterator(); i.hasNext(); ) {
|
||||
Library library = (Library) i.next();
|
||||
File[] objectFiles = library.getObjectFiles();
|
||||
for (int j = 0; j < objectFiles.length; j++)
|
||||
baseCommandLinker.add(objectFiles[j].getPath());
|
||||
}
|
||||
|
||||
List baseCommandObjcopy = new ArrayList(Arrays.asList(new String[] {
|
||||
avrBasePath + "avr-objcopy",
|
||||
"-O",
|
||||
"-R",
|
||||
}));
|
||||
|
||||
// make list of code files that need to be compiled and the object files
|
||||
// that they will be compiled to (includes code from the sketch and the
|
||||
// library for the target platform)
|
||||
List sourceNames = new ArrayList();
|
||||
List sourceNamesCPP = new ArrayList();
|
||||
List objectNames = new ArrayList();
|
||||
List objectNamesCPP = new ArrayList();
|
||||
List targetObjectNames = new ArrayList();
|
||||
List sketchObjectNames = new ArrayList();
|
||||
for (int i = 0; i < sketch.codeCount; i++) {
|
||||
if (sketch.code[i].preprocName != null) {
|
||||
if (sketch.code[i].preprocName.endsWith(".c")) {
|
||||
sourceNames.add(buildPath + File.separator + sketch.code[i].preprocName);
|
||||
objectNames.add(buildPath + File.separator + sketch.code[i].preprocName + ".o");
|
||||
sketchObjectNames.add(buildPath + File.separator + sketch.code[i].preprocName + ".o");
|
||||
} else if (sketch.code[i].preprocName.endsWith(".cpp")) {
|
||||
sourceNamesCPP.add(buildPath + File.separator + sketch.code[i].preprocName);
|
||||
objectNamesCPP.add(buildPath + File.separator + sketch.code[i].preprocName + ".o");
|
||||
sketchObjectNames.add(buildPath + File.separator + sketch.code[i].preprocName + ".o");
|
||||
}
|
||||
}
|
||||
}
|
||||
for (Iterator iter = target.getSourceFilenames().iterator(); iter.hasNext(); ) {
|
||||
String filename = (String) iter.next();
|
||||
if (filename != null) {
|
||||
targetObjectNames.add(buildPath + File.separator + filename + ".o");
|
||||
if (filename.endsWith(".c")) {
|
||||
sourceNames.add(target.getPath() + File.separator + filename);
|
||||
objectNames.add(buildPath + File.separator + filename + ".o");
|
||||
} else if (filename.endsWith(".cpp")) {
|
||||
sourceNamesCPP.add(target.getPath() + File.separator + filename);
|
||||
objectNamesCPP.add(buildPath + File.separator + filename + ".o");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
baseCommandLinker.addAll(sketchObjectNames);
|
||||
//baseCommandLinker.addAll(targetObjectNames);
|
||||
baseCommandLinker.add(runtimeLibraryName);
|
||||
baseCommandLinker.add("-L" + buildPath);
|
||||
baseCommandLinker.add("-lm");
|
||||
|
||||
firstErrorFound = false; // haven't found any errors yet
|
||||
secondErrorFound = false;
|
||||
|
||||
int result = 0; // pre-initialized to quiet a bogus warning from jikes
|
||||
try {
|
||||
// execute the compiler, and create threads to deal
|
||||
// with the input and error streams
|
||||
//
|
||||
|
||||
Process process;
|
||||
boolean compiling = true;
|
||||
for(int i = 0; i < sourceNames.size(); i++) {
|
||||
if (execAsynchronously(getCommandCompilerC(avrBasePath, includePaths,
|
||||
(String) sourceNames.get(i), (String) objectNames.get(i))) != 0)
|
||||
return false;
|
||||
}
|
||||
|
||||
for(int i = 0; i < sourceNamesCPP.size(); i++) {
|
||||
if (execAsynchronously(getCommandCompilerCPP(avrBasePath, includePaths,
|
||||
(String) sourceNamesCPP.get(i), (String) objectNamesCPP.get(i))) != 0)
|
||||
return false;
|
||||
}
|
||||
|
||||
for(int i = 0; i < targetObjectNames.size(); i++) {
|
||||
List commandAR = new ArrayList(baseCommandAR);
|
||||
commandAR.add(targetObjectNames.get(i));
|
||||
if (execAsynchronously(commandAR) != 0)
|
||||
return false;
|
||||
}
|
||||
|
||||
if (execAsynchronously(baseCommandLinker) != 0)
|
||||
return false;
|
||||
|
||||
List commandObjcopy;
|
||||
|
||||
// Extract EEPROM data (from EEMEM directive) to .eep file.
|
||||
commandObjcopy = new ArrayList(baseCommandObjcopy);
|
||||
commandObjcopy.add(2, "ihex");
|
||||
commandObjcopy.set(3, "-j");
|
||||
commandObjcopy.add(".eeprom");
|
||||
commandObjcopy.add("--set-section-flags=.eeprom=alloc,load");
|
||||
commandObjcopy.add("--no-change-warnings");
|
||||
commandObjcopy.add("--change-section-lma");
|
||||
commandObjcopy.add(".eeprom=0");
|
||||
commandObjcopy.add(buildPath + File.separator + sketch.name + ".elf");
|
||||
commandObjcopy.add(buildPath + File.separator + sketch.name + ".eep");
|
||||
if (execAsynchronously(commandObjcopy) != 0)
|
||||
return false;
|
||||
|
||||
commandObjcopy = new ArrayList(baseCommandObjcopy);
|
||||
commandObjcopy.add(2, "ihex");
|
||||
commandObjcopy.add(".eeprom"); // remove eeprom data
|
||||
commandObjcopy.add(buildPath + File.separator + sketch.name + ".elf");
|
||||
commandObjcopy.add(buildPath + File.separator + sketch.name + ".hex");
|
||||
if (execAsynchronously(commandObjcopy) != 0)
|
||||
return false;
|
||||
} catch (Exception e) {
|
||||
String msg = e.getMessage();
|
||||
if ((msg != null) && (msg.indexOf("avr-gcc: not found") != -1)) {
|
||||
//System.err.println("jikes is missing");
|
||||
Base.showWarning("Compiler error",
|
||||
"Could not find the compiler.\n" +
|
||||
"avr-gcc is missing from your PATH.", null);
|
||||
return false;
|
||||
|
||||
} else {
|
||||
e.printStackTrace();
|
||||
result = -1;
|
||||
}
|
||||
}
|
||||
|
||||
// an error was queued up by message(), barf this back to build()
|
||||
// which will barf it back to Editor. if you're having trouble
|
||||
// discerning the imagery, consider how cows regurgitate their food
|
||||
// to digest it, and the fact that they have five stomaches.
|
||||
//
|
||||
//System.out.println("throwing up " + exception);
|
||||
if (exception != null) throw exception;
|
||||
|
||||
// if the result isn't a known, expected value it means that something
|
||||
// is fairly wrong, one possibility is that jikes has crashed.
|
||||
//
|
||||
if (result != 0 && result != 1 ) {
|
||||
//exception = new RunnerException(SUPER_BADNESS);
|
||||
//editor.error(exception); // this will instead be thrown
|
||||
Base.openURL(BUGS_URL);
|
||||
throw new RunnerException(SUPER_BADNESS);
|
||||
}
|
||||
|
||||
// success would mean that 'result' is set to zero
|
||||
return (result == 0); // ? true : false;
|
||||
}
|
||||
|
||||
public int execAsynchronously(List commandList)
|
||||
throws RunnerException, IOException {
|
||||
String[] command = new String[commandList.size()];
|
||||
commandList.toArray(command);
|
||||
int result = 0;
|
||||
|
||||
if (Preferences.getBoolean("build.verbose")) {
|
||||
for(int j = 0; j < command.length; j++) {
|
||||
System.out.print(command[j] + " ");
|
||||
}
|
||||
System.out.println();
|
||||
}
|
||||
|
||||
Process process = Runtime.getRuntime().exec(command);
|
||||
|
||||
new MessageSiphon(process.getInputStream(), this);
|
||||
new MessageSiphon(process.getErrorStream(), this);
|
||||
|
||||
// wait for the process to finish. if interrupted
|
||||
// before waitFor returns, continue waiting
|
||||
boolean compiling = true;
|
||||
while (compiling) {
|
||||
try {
|
||||
result = process.waitFor();
|
||||
//System.out.println("result is " + result);
|
||||
compiling = false;
|
||||
} catch (InterruptedException ignored) { }
|
||||
}
|
||||
|
||||
if (exception != null) {
|
||||
exception.hideStackTrace = true;
|
||||
throw exception;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
boolean firstErrorFound;
|
||||
boolean secondErrorFound;
|
||||
|
||||
/**
|
||||
* Part of the MessageConsumer interface, this is called
|
||||
* whenever a piece (usually a line) of error message is spewed
|
||||
* out from the compiler. The errors are parsed for their contents
|
||||
* and line number, which is then reported back to Editor.
|
||||
*/
|
||||
public void message(String s) {
|
||||
// This receives messages as full lines, so a newline needs
|
||||
// to be added as they're printed to the console.
|
||||
//System.err.print(s);
|
||||
|
||||
// ignore cautions
|
||||
if (s.indexOf("warning") != -1) return;
|
||||
|
||||
// jikes always uses a forward slash character as its separator,
|
||||
// so replace any platform-specific separator characters before
|
||||
// attemping to compare
|
||||
//
|
||||
//String buildPathSubst = buildPath.replace(File.separatorChar, '/') + "/";
|
||||
String buildPathSubst = buildPath.replace(File.separatorChar,File.separatorChar) + File.separatorChar;
|
||||
|
||||
String partialTempPath = null;
|
||||
int partialStartIndex = -1; //s.indexOf(partialTempPath);
|
||||
int fileIndex = -1; // use this to build a better exception
|
||||
|
||||
// iterate through the project files to see who's causing the trouble
|
||||
for (int i = 0; i < sketch.codeCount; i++) {
|
||||
if (sketch.code[i].preprocName == null) continue;
|
||||
|
||||
partialTempPath = buildPathSubst + sketch.code[i].preprocName;
|
||||
partialStartIndex = s.indexOf(partialTempPath);
|
||||
if (partialStartIndex != -1) {
|
||||
fileIndex = i;
|
||||
//System.out.println("fileIndex is " + fileIndex);
|
||||
break;
|
||||
}
|
||||
}
|
||||
//+ className + ".java";
|
||||
|
||||
// if the partial temp path appears in the error message...
|
||||
//
|
||||
//int partialStartIndex = s.indexOf(partialTempPath);
|
||||
if (partialStartIndex != -1) {
|
||||
|
||||
// skip past the path and parse the int after the first colon
|
||||
//
|
||||
String s1 = s.substring(partialStartIndex +
|
||||
partialTempPath.length() + 1);
|
||||
//System.out.println(s1);
|
||||
int colon = s1.indexOf(':');
|
||||
|
||||
if (s1.indexOf("In function") != -1 || colon == -1) {
|
||||
System.err.print(s1);
|
||||
//firstErrorFound = true;
|
||||
return;
|
||||
}
|
||||
|
||||
int lineNumber;
|
||||
try {
|
||||
lineNumber = Integer.parseInt(s1.substring(0, colon));
|
||||
} catch (NumberFormatException e) {
|
||||
System.err.print(s1);
|
||||
return;
|
||||
}
|
||||
|
||||
// the "1" corresponds to the amount of lines written to the main code
|
||||
// file by PdePreprocessor's writeHeader() routine before prototypes
|
||||
if (fileIndex == 0)
|
||||
lineNumber -= 1;
|
||||
|
||||
//System.out.println("pde / line number: " + lineNumber);
|
||||
|
||||
if (fileIndex == 0) { // main class, figure out which tab
|
||||
for (int i = 1; i < sketch.codeCount; i++) {
|
||||
if (sketch.code[i].flavor == Sketch.PDE) {
|
||||
//System.out.println("preprocOffset "+ sketch.code[i].preprocOffset);
|
||||
if (sketch.code[i].preprocOffset < lineNumber) {
|
||||
fileIndex = i;
|
||||
//System.out.println("i'm thinkin file " + i);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (fileIndex != 0) { // if found another culprit
|
||||
lineNumber -= sketch.code[fileIndex].preprocOffset;
|
||||
//System.out.println("i'm sayin line " + lineNumber);
|
||||
}
|
||||
}
|
||||
|
||||
//String s2 = s1.substring(colon + 2);
|
||||
int err = s1.indexOf(":");
|
||||
if (err != -1) {
|
||||
|
||||
// if the first error has already been found, then this must be
|
||||
// (at least) the second error found
|
||||
if (firstErrorFound) {
|
||||
secondErrorFound = true;
|
||||
return;
|
||||
}
|
||||
|
||||
// if executing at this point, this is *at least* the first error
|
||||
firstErrorFound = true;
|
||||
|
||||
err += ":".length();
|
||||
String description = s1.substring(err);
|
||||
description = description.trim();
|
||||
System.err.print(description);
|
||||
|
||||
/* String hasLoop = "The method \"void loop();\" with default access";
|
||||
if (description.indexOf(hasLoop) != -1) {
|
||||
description =
|
||||
"Rename loop() to draw() in Processing 0070 and higher";
|
||||
}
|
||||
*/
|
||||
/* String constructorProblem =
|
||||
"No applicable overload was found for a constructor of type";
|
||||
if (description.indexOf(constructorProblem) != -1) {
|
||||
//"simong.particles.ParticleSystem". Perhaps you wanted the overloaded version "ParticleSystem();" instead?
|
||||
int nextSentence = description.indexOf("\".") + 3;
|
||||
description = description.substring(nextSentence);
|
||||
}
|
||||
*/
|
||||
/* String overloadProblem = "No applicable overload";
|
||||
if (description.indexOf(overloadProblem) != -1) {
|
||||
int nextSentence = description.indexOf("\".") + 3;
|
||||
description = description.substring(nextSentence);
|
||||
}
|
||||
*/
|
||||
// c:/fry/processing/build/windows/work/lib/build/Temporary_6858_2476.java:1:34:1:41: Semantic Error: You need to modify your classpath, sourcepath, bootclasspath, and/or extdirs setup. Package "poo/shoe" could not be found in:
|
||||
/* String classpathProblem = "You need to modify your classpath";
|
||||
if (description.indexOf(classpathProblem) != -1) {
|
||||
if (description.indexOf("quicktime/std") != -1) {
|
||||
// special case for the quicktime libraries
|
||||
description =
|
||||
"To run sketches that use the Processing video library, " +
|
||||
"you must first install QuickTime for Java.";
|
||||
|
||||
} else {
|
||||
int nextSentence = description.indexOf(". Package") + 2;
|
||||
description =
|
||||
description.substring(nextSentence, description.indexOf(':')) +
|
||||
" the code folder or in any libraries.";
|
||||
}
|
||||
}
|
||||
*/
|
||||
//System.out.println("description = " + description);
|
||||
//System.out.println("creating exception " + exception);
|
||||
exception = new RunnerException(description, fileIndex, lineNumber-1, -1);
|
||||
|
||||
// NOTE!! major change here, this exception will be queued
|
||||
// here to be thrown by the compile() function
|
||||
//editor.error(exception);
|
||||
|
||||
} else {
|
||||
System.err.println("i suck: " + s);
|
||||
}
|
||||
|
||||
} else {
|
||||
// this isn't the start of an error line, so don't attempt to parse
|
||||
// a line number out of it.
|
||||
|
||||
// if the second error hasn't been discovered yet, these lines
|
||||
// are probably associated with the first error message,
|
||||
// which is already in the status bar, and are likely to be
|
||||
// of interest to the user, so spit them to the console.
|
||||
//
|
||||
if (!secondErrorFound) {
|
||||
System.err.println(s);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static private List getCommandCompilerC(String avrBasePath, List includePaths,
|
||||
String sourceName, String objectName) {
|
||||
List baseCommandCompiler = new ArrayList(Arrays.asList(new String[] {
|
||||
avrBasePath + "avr-gcc",
|
||||
"-c", // compile, don't link
|
||||
"-g", // include debugging info (so errors include line numbers)
|
||||
"-Os", // optimize for size
|
||||
"-w", // surpress all warnings
|
||||
"-ffunction-sections", // place each function in its own section
|
||||
"-fdata-sections",
|
||||
"-mmcu=" + Preferences.get("boards." + Preferences.get("board") + ".build.mcu"),
|
||||
"-DF_CPU=" + Preferences.get("boards." + Preferences.get("board") + ".build.f_cpu"),
|
||||
}));
|
||||
|
||||
for (int i = 0; i < includePaths.size(); i++) {
|
||||
baseCommandCompiler.add("-I" + (String) includePaths.get(i));
|
||||
}
|
||||
|
||||
baseCommandCompiler.add(sourceName);
|
||||
baseCommandCompiler.add("-o"+ objectName);
|
||||
|
||||
return baseCommandCompiler;
|
||||
}
|
||||
|
||||
|
||||
static private List getCommandCompilerCPP(String avrBasePath,
|
||||
List includePaths, String sourceName, String objectName) {
|
||||
List baseCommandCompilerCPP = new ArrayList(Arrays.asList(new String[] {
|
||||
avrBasePath + "avr-g++",
|
||||
"-c", // compile, don't link
|
||||
"-g", // include debugging info (so errors include line numbers)
|
||||
"-Os", // optimize for size
|
||||
"-w", // surpress all warnings
|
||||
"-fno-exceptions",
|
||||
"-ffunction-sections", // place each function in its own section
|
||||
"-fdata-sections",
|
||||
"-mmcu=" + Preferences.get("boards." + Preferences.get("board") + ".build.mcu"),
|
||||
"-DF_CPU=" + Preferences.get("boards." + Preferences.get("board") + ".build.f_cpu"),
|
||||
}));
|
||||
|
||||
for (int i = 0; i < includePaths.size(); i++) {
|
||||
baseCommandCompilerCPP.add("-I" + (String) includePaths.get(i));
|
||||
}
|
||||
|
||||
baseCommandCompilerCPP.add(sourceName);
|
||||
baseCommandCompilerCPP.add("-o"+ objectName);
|
||||
|
||||
return baseCommandCompilerCPP;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
static String bootClassPath;
|
||||
|
||||
static public String calcBootClassPath() {
|
||||
if (bootClassPath == null) {
|
||||
String additional = "";
|
||||
if (Base.isMacOS()) {
|
||||
additional =
|
||||
contentsToClassPath(new File("/System/Library/Java/Extensions/"));
|
||||
}
|
||||
bootClassPath = System.getProperty("sun.boot.class.path") + additional;
|
||||
}
|
||||
return bootClassPath;
|
||||
}
|
||||
|
||||
|
||||
///
|
||||
|
||||
|
||||
/**
|
||||
* Return the path for a folder, with appended paths to
|
||||
* any .jar or .zip files inside that folder.
|
||||
* This will prepend a colon (or whatever the path separator is)
|
||||
* so that it can be directly appended to another path string.
|
||||
*
|
||||
* This will always add the root folder as well, and doesn't bother
|
||||
* checking to see if there are any .class files in the folder or
|
||||
* within a subfolder.
|
||||
*/
|
||||
static public String contentsToClassPath(File folder) {
|
||||
if (folder == null) return "";
|
||||
|
||||
StringBuffer abuffer = new StringBuffer();
|
||||
String sep = System.getProperty("path.separator");
|
||||
|
||||
try {
|
||||
// add the folder itself in case any unzipped files
|
||||
String path = folder.getCanonicalPath();
|
||||
abuffer.append(sep);
|
||||
abuffer.append(path);
|
||||
|
||||
if (!path.endsWith(File.separator)) {
|
||||
path += File.separator;
|
||||
}
|
||||
//System.out.println("path is " + path);
|
||||
|
||||
String list[] = folder.list();
|
||||
for (int i = 0; i < list.length; i++) {
|
||||
if (list[i].toLowerCase().endsWith(".o") ||
|
||||
list[i].toLowerCase().endsWith(".a")) {
|
||||
abuffer.append(sep);
|
||||
abuffer.append(path);
|
||||
abuffer.append(list[i]);
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace(); // this would be odd
|
||||
}
|
||||
//System.out.println("included path is " + abuffer.toString());
|
||||
//packageListFromClassPath(abuffer.toString()); // WHY?
|
||||
return abuffer.toString();
|
||||
}
|
||||
}
|
2422
app/Editor.java
2422
app/Editor.java
File diff suppressed because it is too large
Load Diff
@ -1,536 +0,0 @@
|
||||
/* -*- mode: jde; c-basic-offset: 2; indent-tabs-mode: nil -*- */
|
||||
|
||||
/*
|
||||
Part of the Processing project - http://processing.org
|
||||
|
||||
Copyright (c) 2004-05 Ben Fry and Casey Reas
|
||||
Copyright (c) 2001-04 Massachusetts Institute of Technology
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
$Id$
|
||||
*/
|
||||
|
||||
package processing.app;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
import javax.swing.*;
|
||||
|
||||
|
||||
/**
|
||||
* Panel just below the editing area that contains status messages.
|
||||
*/
|
||||
public class EditorStatus extends JPanel implements ActionListener {
|
||||
static Color bgcolor[];
|
||||
static Color fgcolor[];
|
||||
|
||||
static final int NOTICE = 0;
|
||||
static final int ERR = 1;
|
||||
static final int PROMPT = 2;
|
||||
static final int EDIT = 3;
|
||||
static final int SERIAL = 4;
|
||||
|
||||
static final int YES = 1;
|
||||
static final int NO = 2;
|
||||
static final int CANCEL = 3;
|
||||
static final int OK = 4;
|
||||
static final int SEND = 5;
|
||||
|
||||
static final String NO_MESSAGE = "";
|
||||
|
||||
Editor editor;
|
||||
|
||||
int mode;
|
||||
String message;
|
||||
|
||||
Font font;
|
||||
FontMetrics metrics;
|
||||
int ascent;
|
||||
|
||||
Image offscreen;
|
||||
int sizeW, sizeH;
|
||||
int imageW, imageH;
|
||||
|
||||
JButton yesButton;
|
||||
JButton noButton;
|
||||
JButton cancelButton;
|
||||
JButton okButton;
|
||||
JButton sendButton;
|
||||
JTextField editField;
|
||||
JTextField serialField;
|
||||
JComboBox serialRates;
|
||||
|
||||
//Thread promptThread;
|
||||
int response;
|
||||
|
||||
|
||||
public EditorStatus(Editor editor) {
|
||||
this.editor = editor;
|
||||
empty();
|
||||
|
||||
if (bgcolor == null) {
|
||||
bgcolor = new Color[5];
|
||||
// Arduino 0003 switched to a blue color scheme to visually distinguish
|
||||
// itself from Processing. Because the image files for certain interface
|
||||
// elements (e.g. buttons and tabs) are distributed with the application
|
||||
// while the preference file that specifies the IDE colors is stored in
|
||||
// the user's home directory and shared across all versions of Arduino,
|
||||
// we need to hardcode certain colors here to match the images.
|
||||
// Otherwise, users who used different multiple versions of the software
|
||||
// would sometimes see colors that didn't match the interface elements.
|
||||
// This is a hack and prevents users from customizing the IDE colors,
|
||||
// however, it obviates the need to provide for version-specific
|
||||
// preferences.
|
||||
//bgcolor[0] = Preferences.getColor("status.notice.bgcolor");
|
||||
bgcolor[0] = new Color(0x54, 0x91, 0x9e);
|
||||
bgcolor[1] = Preferences.getColor("status.error.bgcolor");
|
||||
bgcolor[2] = Preferences.getColor("status.prompt.bgcolor");
|
||||
bgcolor[3] = Preferences.getColor("status.prompt.bgcolor");
|
||||
bgcolor[4] = new Color(0x54, 0x91, 0x9e);
|
||||
|
||||
fgcolor = new Color[5];
|
||||
fgcolor[0] = Preferences.getColor("status.notice.fgcolor");
|
||||
fgcolor[1] = Preferences.getColor("status.error.fgcolor");
|
||||
fgcolor[2] = Preferences.getColor("status.prompt.fgcolor");
|
||||
fgcolor[3] = Preferences.getColor("status.prompt.fgcolor");
|
||||
fgcolor[4] = Preferences.getColor("status.notice.fgcolor");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void empty() {
|
||||
mode = NOTICE;
|
||||
message = NO_MESSAGE;
|
||||
//update();
|
||||
repaint();
|
||||
}
|
||||
|
||||
|
||||
public void notice(String message) {
|
||||
mode = NOTICE;
|
||||
this.message = message;
|
||||
//update();
|
||||
repaint();
|
||||
}
|
||||
|
||||
public void unnotice(String unmessage) {
|
||||
if (message.equals(unmessage)) empty();
|
||||
}
|
||||
|
||||
|
||||
public void error(String message) {
|
||||
mode = ERR;
|
||||
this.message = message;
|
||||
repaint();
|
||||
}
|
||||
|
||||
|
||||
public void prompt(String message) {
|
||||
mode = PROMPT;
|
||||
this.message = message;
|
||||
|
||||
response = 0;
|
||||
yesButton.setVisible(true);
|
||||
noButton.setVisible(true);
|
||||
cancelButton.setVisible(true);
|
||||
yesButton.requestFocus();
|
||||
|
||||
repaint();
|
||||
}
|
||||
|
||||
|
||||
// prompt has been handled, re-hide the buttons
|
||||
public void unprompt() {
|
||||
yesButton.setVisible(false);
|
||||
noButton.setVisible(false);
|
||||
cancelButton.setVisible(false);
|
||||
empty();
|
||||
}
|
||||
|
||||
|
||||
public void edit(String message, String dflt) {
|
||||
mode = EDIT;
|
||||
this.message = message;
|
||||
|
||||
response = 0;
|
||||
okButton.setVisible(true);
|
||||
cancelButton.setVisible(true);
|
||||
editField.setVisible(true);
|
||||
editField.setText(dflt);
|
||||
editField.selectAll();
|
||||
editField.requestFocus();
|
||||
|
||||
repaint();
|
||||
}
|
||||
|
||||
public void unedit() {
|
||||
okButton.setVisible(false);
|
||||
cancelButton.setVisible(false);
|
||||
editField.setVisible(false);
|
||||
empty();
|
||||
}
|
||||
|
||||
public void serial()
|
||||
{
|
||||
mode = SERIAL;
|
||||
this.message = NO_MESSAGE;
|
||||
|
||||
sendButton.setVisible(true);
|
||||
serialRates.setVisible(true);
|
||||
serialField.setVisible(true);
|
||||
serialField.setText("");
|
||||
serialField.requestFocus();
|
||||
|
||||
repaint();
|
||||
}
|
||||
|
||||
public void unserial()
|
||||
{
|
||||
sendButton.setVisible(false);
|
||||
serialField.setVisible(false);
|
||||
serialRates.setVisible(false);
|
||||
empty();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
public void update() {
|
||||
Graphics g = this.getGraphics();
|
||||
try {
|
||||
setBackground(bgcolor[mode]);
|
||||
} catch (NullPointerException e) { } // if not ready yet
|
||||
if (g != null) paint(g);
|
||||
}
|
||||
|
||||
public void update(Graphics g) {
|
||||
paint(g);
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
public void paintComponent(Graphics screen) {
|
||||
//if (screen == null) return;
|
||||
if (yesButton == null) setup();
|
||||
|
||||
//System.out.println("status.paintComponent");
|
||||
|
||||
Dimension size = getSize();
|
||||
if ((size.width != sizeW) || (size.height != sizeH)) {
|
||||
// component has been resized
|
||||
|
||||
if ((size.width > imageW) || (size.height > imageH)) {
|
||||
// nix the image and recreate, it's too small
|
||||
offscreen = null;
|
||||
|
||||
} else {
|
||||
// who cares, just resize
|
||||
sizeW = size.width;
|
||||
sizeH = size.height;
|
||||
setButtonBounds();
|
||||
}
|
||||
}
|
||||
|
||||
if (offscreen == null) {
|
||||
sizeW = size.width;
|
||||
sizeH = size.height;
|
||||
setButtonBounds();
|
||||
imageW = sizeW;
|
||||
imageH = sizeH;
|
||||
offscreen = createImage(imageW, imageH);
|
||||
}
|
||||
|
||||
Graphics g = offscreen.getGraphics();
|
||||
if (font == null) {
|
||||
font = Preferences.getFont("status.font");
|
||||
//new Font("SansSerif", Font.PLAIN, 12));
|
||||
g.setFont(font);
|
||||
metrics = g.getFontMetrics();
|
||||
ascent = metrics.getAscent();
|
||||
}
|
||||
|
||||
//setBackground(bgcolor[mode]); // does nothing
|
||||
|
||||
g.setColor(bgcolor[mode]);
|
||||
g.fillRect(0, 0, imageW, imageH);
|
||||
|
||||
g.setColor(fgcolor[mode]);
|
||||
g.setFont(font); // needs to be set each time on osx
|
||||
g.drawString(message, Preferences.GUI_SMALL, (sizeH + ascent) / 2);
|
||||
|
||||
screen.drawImage(offscreen, 0, 0, null);
|
||||
}
|
||||
|
||||
|
||||
protected void setup() {
|
||||
if (yesButton == null) {
|
||||
yesButton = new JButton(Preferences.PROMPT_YES);
|
||||
noButton = new JButton(Preferences.PROMPT_NO);
|
||||
cancelButton = new JButton(Preferences.PROMPT_CANCEL);
|
||||
okButton = new JButton(Preferences.PROMPT_OK);
|
||||
sendButton = new JButton(Preferences.PROMPT_SEND);
|
||||
|
||||
// !@#(* aqua ui #($*(( that turtle-neck wearing #(** (#$@)(
|
||||
// os9 seems to work if bg of component is set, but x still a bastard
|
||||
if (Base.isMacOS()) {
|
||||
yesButton.setBackground(bgcolor[PROMPT]);
|
||||
noButton.setBackground(bgcolor[PROMPT]);
|
||||
cancelButton.setBackground(bgcolor[PROMPT]);
|
||||
okButton.setBackground(bgcolor[PROMPT]);
|
||||
sendButton.setBackground(bgcolor[SERIAL]);
|
||||
}
|
||||
setLayout(null);
|
||||
|
||||
yesButton.addActionListener(this);
|
||||
noButton.addActionListener(this);
|
||||
cancelButton.addActionListener(this);
|
||||
okButton.addActionListener(this);
|
||||
sendButton.addActionListener(this);
|
||||
|
||||
add(yesButton);
|
||||
add(noButton);
|
||||
add(cancelButton);
|
||||
add(okButton);
|
||||
add(sendButton);
|
||||
|
||||
yesButton.setVisible(false);
|
||||
noButton.setVisible(false);
|
||||
cancelButton.setVisible(false);
|
||||
okButton.setVisible(false);
|
||||
sendButton.setVisible(false);
|
||||
|
||||
editField = new JTextField();
|
||||
editField.addActionListener(this);
|
||||
|
||||
//if (Base.platform != Base.MACOSX) {
|
||||
editField.addKeyListener(new KeyAdapter() {
|
||||
// no-op implemented because of a jikes bug
|
||||
//protected void noop() { }
|
||||
|
||||
//public void keyPressed(KeyEvent event) {
|
||||
//System.out.println("pressed " + event + " " + KeyEvent.VK_SPACE);
|
||||
//}
|
||||
|
||||
// use keyTyped to catch when the feller is actually
|
||||
// added to the text field. with keyTyped, as opposed to
|
||||
// keyPressed, the keyCode will be zero, even if it's
|
||||
// enter or backspace or whatever, so the keychar should
|
||||
// be used instead. grr.
|
||||
public void keyTyped(KeyEvent event) {
|
||||
//System.out.println("got event " + event + " " +
|
||||
// KeyEvent.VK_SPACE);
|
||||
int c = event.getKeyChar();
|
||||
|
||||
if (mode == EDIT) {
|
||||
if (c == KeyEvent.VK_ENTER) { // accept the input
|
||||
String answer = editField.getText();
|
||||
editor.sketch.nameCode(answer);
|
||||
unedit();
|
||||
event.consume();
|
||||
|
||||
// easier to test the affirmative case than the negative
|
||||
} else if ((c == KeyEvent.VK_BACK_SPACE) ||
|
||||
(c == KeyEvent.VK_DELETE) ||
|
||||
(c == KeyEvent.VK_RIGHT) ||
|
||||
(c == KeyEvent.VK_LEFT) ||
|
||||
(c == KeyEvent.VK_UP) ||
|
||||
(c == KeyEvent.VK_DOWN) ||
|
||||
(c == KeyEvent.VK_HOME) ||
|
||||
(c == KeyEvent.VK_END) ||
|
||||
(c == KeyEvent.VK_SHIFT)) {
|
||||
//System.out.println("nothing to see here");
|
||||
//noop();
|
||||
|
||||
} else if (c == KeyEvent.VK_ESCAPE) {
|
||||
unedit();
|
||||
editor.buttons.clear();
|
||||
event.consume();
|
||||
|
||||
} else if (c == KeyEvent.VK_SPACE) {
|
||||
//System.out.println("got a space");
|
||||
// if a space, insert an underscore
|
||||
//editField.insert("_", editField.getCaretPosition());
|
||||
/* tried to play nice and see where it got me
|
||||
editField.dispatchEvent(new KeyEvent(editField,
|
||||
KeyEvent.KEY_PRESSED,
|
||||
System.currentTimeMillis(),
|
||||
0, 45, '_'));
|
||||
*/
|
||||
//System.out.println("start/end = " +
|
||||
// editField.getSelectionStart() + " " +
|
||||
// editField.getSelectionEnd());
|
||||
String t = editField.getText();
|
||||
//int p = editField.getCaretPosition();
|
||||
//editField.setText(t.substring(0, p) + "_" + t.substring(p));
|
||||
//editField.setCaretPosition(p+1);
|
||||
int start = editField.getSelectionStart();
|
||||
int end = editField.getSelectionEnd();
|
||||
editField.setText(t.substring(0, start) + "_" +
|
||||
t.substring(end));
|
||||
editField.setCaretPosition(start+1);
|
||||
//System.out.println("consuming event");
|
||||
event.consume();
|
||||
|
||||
} else if ((c == '_') || (c == '.') || // allow .pde and .java
|
||||
((c >= 'A') && (c <= 'Z')) ||
|
||||
((c >= 'a') && (c <= 'z'))) {
|
||||
// everything fine, catches upper and lower
|
||||
//noop();
|
||||
|
||||
} else if ((c >= '0') && (c <= '9')) {
|
||||
// getCaretPosition == 0 means that it's the first char
|
||||
// and the field is empty.
|
||||
// getSelectionStart means that it *will be* the first
|
||||
// char, because the selection is about to be replaced
|
||||
// with whatever is typed.
|
||||
if ((editField.getCaretPosition() == 0) ||
|
||||
(editField.getSelectionStart() == 0)) {
|
||||
// number not allowed as first digit
|
||||
//System.out.println("bad number bad");
|
||||
event.consume();
|
||||
}
|
||||
} else {
|
||||
event.consume();
|
||||
//System.out.println("code is " + code + " char = " + c);
|
||||
}
|
||||
}
|
||||
//System.out.println("code is " + code + " char = " + c);
|
||||
}
|
||||
});
|
||||
add(editField);
|
||||
editField.setVisible(false);
|
||||
|
||||
serialField = new JTextField();
|
||||
serialField.addActionListener(this);
|
||||
|
||||
serialField.addKeyListener(new KeyAdapter() {
|
||||
public void keyTyped(KeyEvent event) {
|
||||
int c = event.getKeyChar();
|
||||
|
||||
if (c == KeyEvent.VK_ENTER) { // accept the input
|
||||
editor.serialPort.write(serialField.getText());
|
||||
event.consume();
|
||||
serialField.setText("");
|
||||
}
|
||||
}});
|
||||
|
||||
add(serialField);
|
||||
serialField.setVisible(false);
|
||||
|
||||
String[] serialRateStrings = {
|
||||
"300","1200","2400","4800","9600","14400",
|
||||
"19200","28800","38400","57600","115200"
|
||||
};
|
||||
|
||||
serialRates = new JComboBox();
|
||||
|
||||
if (Base.isMacOS())
|
||||
serialRates.setBackground(bgcolor[SERIAL]);
|
||||
|
||||
for (int i = 0; i < serialRateStrings.length; i++)
|
||||
serialRates.addItem(serialRateStrings[i] + " baud");
|
||||
|
||||
serialRates.setSelectedItem(
|
||||
Preferences.get("serial.debug_rate") + " baud");
|
||||
serialRates.addActionListener(this);
|
||||
add(serialRates);
|
||||
serialRates.setVisible(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
protected void setButtonBounds() {
|
||||
int top = (sizeH - Preferences.BUTTON_HEIGHT) / 2;
|
||||
int eachButton = Preferences.GUI_SMALL + Preferences.BUTTON_WIDTH;
|
||||
|
||||
int cancelLeft = sizeW - eachButton;
|
||||
int noLeft = cancelLeft - eachButton;
|
||||
int yesLeft = noLeft - eachButton;
|
||||
|
||||
yesButton.setLocation(yesLeft, top);
|
||||
noButton.setLocation(noLeft, top);
|
||||
cancelButton.setLocation(cancelLeft, top);
|
||||
editField.setLocation(yesLeft - Preferences.BUTTON_WIDTH, top);
|
||||
serialField.setLocation(yesLeft - Preferences.BUTTON_WIDTH, top);
|
||||
okButton.setLocation(noLeft, top);
|
||||
serialRates.setLocation(0, top);
|
||||
sendButton.setLocation(cancelLeft, top);
|
||||
|
||||
yesButton.setSize( Preferences.BUTTON_WIDTH, Preferences.BUTTON_HEIGHT);
|
||||
noButton.setSize( Preferences.BUTTON_WIDTH, Preferences.BUTTON_HEIGHT);
|
||||
cancelButton.setSize( Preferences.BUTTON_WIDTH, Preferences.BUTTON_HEIGHT);
|
||||
okButton.setSize( Preferences.BUTTON_WIDTH, Preferences.BUTTON_HEIGHT);
|
||||
sendButton.setSize( Preferences.BUTTON_WIDTH, Preferences.BUTTON_HEIGHT);
|
||||
serialRates.setSize( 3*Preferences.BUTTON_WIDTH/2, Preferences.BUTTON_HEIGHT);
|
||||
editField.setSize( 2*Preferences.BUTTON_WIDTH, Preferences.BUTTON_HEIGHT);
|
||||
serialField.setSize( 3*Preferences.BUTTON_WIDTH, Preferences.BUTTON_HEIGHT);
|
||||
}
|
||||
|
||||
|
||||
public Dimension getPreferredSize() {
|
||||
return getMinimumSize();
|
||||
}
|
||||
|
||||
public Dimension getMinimumSize() {
|
||||
return new Dimension(300, Preferences.GRID_SIZE);
|
||||
}
|
||||
|
||||
public Dimension getMaximumSize() {
|
||||
return new Dimension(3000, Preferences.GRID_SIZE);
|
||||
}
|
||||
|
||||
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
if (e.getSource() == noButton) {
|
||||
// shut everything down, clear status, and return
|
||||
unprompt();
|
||||
// don't need to save changes
|
||||
editor.checkModified2();
|
||||
|
||||
} else if (e.getSource() == yesButton) {
|
||||
// answer was in response to "save changes?"
|
||||
unprompt();
|
||||
editor.handleSave(true);
|
||||
editor.checkModified2();
|
||||
|
||||
} else if (e.getSource() == cancelButton) {
|
||||
// don't do anything, don't continue with checkModified2
|
||||
if (mode == PROMPT) unprompt();
|
||||
else if (mode == EDIT) unedit();
|
||||
editor.buttons.clear();
|
||||
|
||||
} else if (e.getSource() == okButton) {
|
||||
// answering to "save as..." question
|
||||
String answer = editField.getText();
|
||||
//editor.handleSaveAs2(answer);
|
||||
editor.sketch.nameCode(answer);
|
||||
unedit();
|
||||
} else if (e.getSource() == sendButton) {
|
||||
editor.serialPort.write(serialField.getText());
|
||||
serialField.setText("");
|
||||
} else if (e.getSource() == serialRates) {
|
||||
String wholeString = (String) serialRates.getSelectedItem();
|
||||
String rateString = wholeString.substring(0, wholeString.indexOf(' '));
|
||||
int rate = Integer.parseInt(rateString);
|
||||
Preferences.set("serial.debug_rate", rateString);
|
||||
editor.serialPort.dispose();
|
||||
try {
|
||||
editor.serialPort = new Serial(true);
|
||||
} catch (SerialException err) {
|
||||
editor.error(err);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
592
app/Library.java
592
app/Library.java
@ -1,592 +0,0 @@
|
||||
/*
|
||||
Library.java - Library System for Wiring
|
||||
Copyright (c) 2006 Nicholas Zambetti. All right reserved.
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package processing.app;
|
||||
|
||||
import processing.app.syntax.*;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
import java.util.zip.*;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.event.*;
|
||||
|
||||
import processing.core.*;
|
||||
|
||||
/*
|
||||
* Provides information about and builds a library
|
||||
*/
|
||||
public class Library implements MessageConsumer{
|
||||
|
||||
private File libFolder;
|
||||
private File utilityFolder;
|
||||
private LibraryManager libManager;
|
||||
RunnerException exception;
|
||||
|
||||
static final String BUGS_URL = "https://developer.berlios.de/bugs/?group_id=3590";
|
||||
static final String SUPER_BADNESS = "Compiler error, please submit this code to " + BUGS_URL;
|
||||
|
||||
/*
|
||||
* Create a Library
|
||||
*/
|
||||
public Library(LibraryManager manager, File folder)
|
||||
{
|
||||
libFolder = folder;
|
||||
libManager = manager;
|
||||
utilityFolder = getUtilityFolder();
|
||||
|
||||
// for debug output
|
||||
/*
|
||||
System.out.println("library: " + getName());
|
||||
System.out.println("folder: " + getFolder());
|
||||
System.out.println("utility: " + utilityFolder);
|
||||
System.out.println("built: " + isBuilt());
|
||||
System.out.println("buildable: " + isBuildable());
|
||||
System.out.println("o files: " + getObjectFiles().length);
|
||||
System.out.println("c files: " + getCSourceFiles().length);
|
||||
System.out.println("cpp files: " + getCPPSourceFiles().length);
|
||||
*/
|
||||
}
|
||||
|
||||
/*
|
||||
* Directory of library
|
||||
* @return File object of library's folder
|
||||
*/
|
||||
public File getFolder()
|
||||
{
|
||||
return libFolder;
|
||||
}
|
||||
|
||||
/*
|
||||
* The name of library
|
||||
* @return String with library name, derived from folder
|
||||
* note: this will be eventually taken from xml description file
|
||||
*/
|
||||
public String getName()
|
||||
{
|
||||
return libFolder.getName();
|
||||
}
|
||||
|
||||
/*
|
||||
* Tests if library is built
|
||||
* @return True if library has .o files, false otherwise
|
||||
*/
|
||||
public boolean isBuilt()
|
||||
{
|
||||
if(getObjectFiles().length >= (getCSourceFiles().length + getCPPSourceFiles().length)){
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Tests if library is buildable
|
||||
* @return True if library has source files, false otherwise
|
||||
*/
|
||||
public boolean isBuildable()
|
||||
{
|
||||
if(0 < (getCSourceFiles().length + getCPPSourceFiles().length)){
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Tests if library is unbuilt but buildable
|
||||
* @return True if library has .cpp files but no .o files, false otherwise
|
||||
*/
|
||||
public boolean isUnbuiltBuildable()
|
||||
{
|
||||
if(isBuildable()){
|
||||
if(!isBuilt()){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Scans for library "utility" folder
|
||||
* @return File object of library's "utility" folder, or null
|
||||
*/
|
||||
private File getUtilityFolder()
|
||||
{
|
||||
FileFilter filter = new FileFilter() {
|
||||
public boolean accept(File file) {
|
||||
if(file.isDirectory()){
|
||||
if((file.getName()).equalsIgnoreCase("utility")){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
File[] files = libFolder.listFiles(filter);
|
||||
if(files.length > 0){
|
||||
return files[0];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/*
|
||||
* Finds examples folder
|
||||
* @return "examples" folder as file object or null
|
||||
*/
|
||||
private File getExamplesFolder()
|
||||
{
|
||||
FileFilter filter = new FileFilter() {
|
||||
public boolean accept(File file) {
|
||||
if(file.isDirectory()){
|
||||
if((file.getName()).equalsIgnoreCase("examples")){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
File[] files = libFolder.listFiles(filter);
|
||||
if(files.length > 0){
|
||||
return files[0];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/*
|
||||
* Populates example menu or submenu with files
|
||||
*/
|
||||
private void populateWithExamples(File folder, JMenu menu, ActionListener listener) {
|
||||
FileFilter onlyfolders = new FileFilter() {
|
||||
public boolean accept(File file) {
|
||||
return file.isDirectory();
|
||||
}
|
||||
};
|
||||
File[] folders = folder.listFiles(onlyfolders);
|
||||
File file;
|
||||
JMenu submenu;
|
||||
JMenuItem item;
|
||||
for(int i = 0; i < folders.length; ++i){
|
||||
file = new File(folders[i], folders[i].getName() + ".pde");
|
||||
if(file.exists()){
|
||||
item = new JMenuItem(folders[i].getName());
|
||||
item.setActionCommand(file.getAbsolutePath());
|
||||
item.addActionListener(listener);
|
||||
menu.add(item);
|
||||
}else{
|
||||
submenu = new JMenu(folders[i].getName());
|
||||
populateWithExamples(folders[i], submenu, listener);
|
||||
menu.add(submenu);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Builds and returns an examples menu
|
||||
* @return JMenu object with example files, or null if none
|
||||
*/
|
||||
public JMenu getExamplesMenu(ActionListener listener) {
|
||||
JMenu submenu;
|
||||
File examplesFolder = getExamplesFolder();
|
||||
if(null != examplesFolder){
|
||||
submenu = new JMenu("Library-" + getName());
|
||||
populateWithExamples(examplesFolder, submenu, listener);
|
||||
return submenu;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/*
|
||||
* List of object files for linking
|
||||
* @return Array of object files as File objects
|
||||
*/
|
||||
private File[] getObjectFiles(File folder)
|
||||
{
|
||||
FileFilter onlyObjectFiles = new FileFilter() {
|
||||
public boolean accept(File file) {
|
||||
return (file.getName()).endsWith(".o");
|
||||
}
|
||||
};
|
||||
return folder.listFiles(onlyObjectFiles);
|
||||
}
|
||||
public File[] getObjectFiles()
|
||||
{
|
||||
if(null == utilityFolder){
|
||||
return getObjectFiles(libFolder);
|
||||
}
|
||||
File[] libraryObjects = getObjectFiles(libFolder);
|
||||
File[] utilityObjects = getObjectFiles(utilityFolder);
|
||||
File[] objects = new File[libraryObjects.length + utilityObjects.length];
|
||||
System.arraycopy(libraryObjects, 0, objects, 0, libraryObjects.length);
|
||||
System.arraycopy(utilityObjects, 0, objects, libraryObjects.length, utilityObjects.length);
|
||||
return objects;
|
||||
}
|
||||
|
||||
/*
|
||||
* List of header source files for inclusion
|
||||
* @return Array of header source files as File objects
|
||||
*/
|
||||
public File[] getHeaderFiles()
|
||||
{
|
||||
FileFilter onlyHFiles = new FileFilter() {
|
||||
public boolean accept(File file) {
|
||||
return (file.getName()).endsWith(".h");
|
||||
}
|
||||
};
|
||||
return libFolder.listFiles(onlyHFiles);
|
||||
}
|
||||
|
||||
/*
|
||||
* List of library's C source files for compiling
|
||||
* @return Array of C source files as File objects
|
||||
*/
|
||||
private File[] getCSourceFiles(File folder)
|
||||
{
|
||||
FileFilter onlyCFiles = new FileFilter() {
|
||||
public boolean accept(File file) {
|
||||
return (file.getName()).endsWith(".c");
|
||||
}
|
||||
};
|
||||
return folder.listFiles(onlyCFiles);
|
||||
}
|
||||
private File[] getCSourceFiles()
|
||||
{
|
||||
if(null == utilityFolder){
|
||||
return getCSourceFiles(libFolder);
|
||||
}
|
||||
File[] librarySources = getCSourceFiles(libFolder);
|
||||
File[] utilitySources = getCSourceFiles(utilityFolder);
|
||||
File[] sources = new File[librarySources.length + utilitySources.length];
|
||||
System.arraycopy(librarySources, 0, sources, 0, librarySources.length);
|
||||
System.arraycopy(utilitySources, 0, sources, librarySources.length, utilitySources.length);
|
||||
return sources;
|
||||
}
|
||||
|
||||
/*
|
||||
* List of C++ source files for compiling
|
||||
* @return Array of C++ source files as File objects
|
||||
*/
|
||||
private File[] getCPPSourceFiles(File folder)
|
||||
{
|
||||
FileFilter onlyCPPFiles = new FileFilter() {
|
||||
public boolean accept(File file) {
|
||||
return (file.getName()).endsWith(".cpp");
|
||||
}
|
||||
};
|
||||
return folder.listFiles(onlyCPPFiles);
|
||||
}
|
||||
private File[] getCPPSourceFiles()
|
||||
{
|
||||
if(null == utilityFolder){
|
||||
return getCPPSourceFiles(libFolder);
|
||||
}
|
||||
File[] librarySources = getCPPSourceFiles(libFolder);
|
||||
File[] utilitySources = getCPPSourceFiles(utilityFolder);
|
||||
File[] sources = new File[librarySources.length + utilitySources.length];
|
||||
System.arraycopy(librarySources, 0, sources, 0, librarySources.length);
|
||||
System.arraycopy(utilitySources, 0, sources, librarySources.length, utilitySources.length);
|
||||
return sources;
|
||||
}
|
||||
|
||||
/*
|
||||
* Attempt to build library
|
||||
* @return true on successful build, false otherwise
|
||||
*/
|
||||
public boolean build() throws RunnerException
|
||||
{
|
||||
// fail if library is not buildable (contains no sources)
|
||||
if(!isBuildable()){
|
||||
return false;
|
||||
}
|
||||
|
||||
String userdir = System.getProperty("user.dir") + File.separator;
|
||||
String avrBasePath;
|
||||
if(Base.isMacOS()) {
|
||||
avrBasePath = new String("hardware/tools/avr/bin/");
|
||||
}
|
||||
else if(Base.isLinux()) {
|
||||
avrBasePath = new String("");
|
||||
}
|
||||
else {
|
||||
avrBasePath = new String(userdir + "hardware/tools/avr/bin/");
|
||||
}
|
||||
|
||||
String[] baseCompileCommandC = new String[] {
|
||||
avrBasePath + "avr-gcc",
|
||||
"-c",
|
||||
"-g",
|
||||
"-Os",
|
||||
"-Wall",
|
||||
"-ffunction-sections", // place each function in its own section
|
||||
"-fdata-sections",
|
||||
"-mmcu=" + Preferences.get("boards." + Preferences.get("board") + ".build.mcu"),
|
||||
"-DF_CPU=" + Preferences.get("boards." + Preferences.get("board") + ".build.f_cpu"),
|
||||
"-I" + libManager.getTarget().getPath(),
|
||||
"-I" + getFolder(),
|
||||
};
|
||||
|
||||
String[] baseCompileCommandCPP = new String[] {
|
||||
avrBasePath + "avr-g++",
|
||||
"-c",
|
||||
"-g",
|
||||
"-Os",
|
||||
"-Wall",
|
||||
"-fno-exceptions",
|
||||
"-ffunction-sections", // place each function in its own section
|
||||
"-fdata-sections",
|
||||
"-mmcu=" + Preferences.get("boards." + Preferences.get("board") + ".build.mcu"),
|
||||
"-DF_CPU=" + Preferences.get("boards." + Preferences.get("board") + ".build.f_cpu"),
|
||||
"-I" + libManager.getTarget().getPath(),
|
||||
"-I" + getFolder(),
|
||||
};
|
||||
|
||||
// use built lib directories in include paths when searching for headers
|
||||
// this allows libs to use other libs easily
|
||||
int extraSpots = 2; // two spots for file path and -o portions
|
||||
utilityFolder = getUtilityFolder(); // refresh status of utility folder
|
||||
if(null != utilityFolder){
|
||||
extraSpots = 3; // an extra spot for utility folder as include
|
||||
}
|
||||
String[] libDirs = libManager.getFolderPaths();
|
||||
String[] compileCommandC = new String[baseCompileCommandC.length + libDirs.length + extraSpots];
|
||||
String[] compileCommandCPP = new String[baseCompileCommandCPP.length + libDirs.length + extraSpots];
|
||||
System.arraycopy(baseCompileCommandC, 0, compileCommandC, 0, baseCompileCommandC.length);
|
||||
System.arraycopy(baseCompileCommandCPP, 0, compileCommandCPP, 0, baseCompileCommandCPP.length);
|
||||
for (int i = 0; i < libDirs.length; ++i) {
|
||||
compileCommandC[baseCompileCommandC.length + i] = "-I" + libDirs[i];
|
||||
compileCommandCPP[baseCompileCommandCPP.length + i] = "-I" + libDirs[i];
|
||||
}
|
||||
|
||||
// add this library's "utility" folder to inclusion paths
|
||||
if(null != utilityFolder){
|
||||
compileCommandC[compileCommandC.length - 3] = "-I" + utilityFolder.getPath();
|
||||
compileCommandCPP[compileCommandCPP.length - 3] = "-I" + utilityFolder.getPath();
|
||||
}
|
||||
|
||||
File[] sourcesC = getCSourceFiles();
|
||||
File[] sourcesCPP = getCPPSourceFiles();
|
||||
|
||||
// execute the compiler, and create threads to deal
|
||||
// with the input and error streams
|
||||
//
|
||||
int result = 0;
|
||||
try {
|
||||
String pathSansExtension;
|
||||
Process process;
|
||||
boolean compiling = true;
|
||||
|
||||
// compile c sources
|
||||
for(int i = 0; i < sourcesC.length; ++i) {
|
||||
pathSansExtension = sourcesC[i].getPath();
|
||||
pathSansExtension = pathSansExtension.substring(0, pathSansExtension.length() - 2); // -2 because ".c"
|
||||
|
||||
compileCommandC[compileCommandC.length - 2] = sourcesC[i].getPath();
|
||||
compileCommandC[compileCommandC.length - 1] = "-o" + pathSansExtension + ".o";
|
||||
|
||||
process = Runtime.getRuntime().exec(compileCommandC);
|
||||
new MessageSiphon(process.getInputStream(), this);
|
||||
new MessageSiphon(process.getErrorStream(), this);
|
||||
|
||||
// wait for the process to finish. if interrupted
|
||||
// before waitFor returns, continue waiting
|
||||
//
|
||||
compiling = true;
|
||||
while (compiling) {
|
||||
try {
|
||||
result = process.waitFor();
|
||||
//System.out.println("result is " + result);
|
||||
compiling = false;
|
||||
} catch (InterruptedException ignored) { }
|
||||
}
|
||||
if (exception != null) {
|
||||
exception.hideStackTrace = true;
|
||||
throw exception;
|
||||
}
|
||||
if(result != 0){
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// compile c++ sources
|
||||
for(int i = 0; i < sourcesCPP.length; ++i) {
|
||||
pathSansExtension = sourcesCPP[i].getPath();
|
||||
pathSansExtension = pathSansExtension.substring(0, pathSansExtension.length() - 4); // -4 because ".cpp"
|
||||
|
||||
compileCommandCPP[compileCommandCPP.length - 2] = sourcesCPP[i].getPath();
|
||||
compileCommandCPP[compileCommandCPP.length - 1] = "-o" + pathSansExtension + ".o";
|
||||
|
||||
process = Runtime.getRuntime().exec(compileCommandCPP);
|
||||
new MessageSiphon(process.getInputStream(), this);
|
||||
new MessageSiphon(process.getErrorStream(), this);
|
||||
|
||||
// wait for the process to finish. if interrupted
|
||||
// before waitFor returns, continue waiting
|
||||
//
|
||||
compiling = true;
|
||||
while (compiling) {
|
||||
try {
|
||||
result = process.waitFor();
|
||||
//System.out.println("result is " + result);
|
||||
compiling = false;
|
||||
} catch (InterruptedException ignored) { }
|
||||
}
|
||||
if (exception != null) {
|
||||
exception.hideStackTrace = true;
|
||||
throw exception;
|
||||
}
|
||||
if(result != 0){
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
String msg = e.getMessage();
|
||||
if ((msg != null) && (msg.indexOf("avr-gcc: not found") != -1)) {
|
||||
Base.showWarning("Compiler error",
|
||||
"Could not find the compiler.\n" +
|
||||
"avr-gcc is missing from your PATH,\n" +
|
||||
"see readme.txt for help.", null);
|
||||
return false;
|
||||
|
||||
} else if ((msg != null) && (msg.indexOf("avr-g++: not found") != -1)) {
|
||||
Base.showWarning("Compiler error",
|
||||
"Could not find the compiler.\n" +
|
||||
"avr-g++ is missing from your PATH,\n" +
|
||||
"see readme.txt for help.", null);
|
||||
return false;
|
||||
|
||||
} else {
|
||||
e.printStackTrace();
|
||||
result = -1;
|
||||
}
|
||||
}
|
||||
|
||||
// an error was queued up by message()
|
||||
if (exception != null) {
|
||||
throw exception;
|
||||
}
|
||||
|
||||
if (result != 0 && result != 1 ) {
|
||||
Base.openURL(BUGS_URL);
|
||||
throw new RunnerException(SUPER_BADNESS);
|
||||
}
|
||||
|
||||
// success would mean that 'result' is set to zero
|
||||
return (result == 0); // ? true : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Part of the MessageConsumer interface, this is called
|
||||
* whenever a piece (usually a line) of error message is spewed
|
||||
* out from the compiler. The errors are parsed for their contents
|
||||
* and line number, which is then reported back to Editor.
|
||||
*/
|
||||
public void message(String inString) {
|
||||
// This receives messages as full lines, so a newline needs
|
||||
// to be added as they're printed to the console.
|
||||
|
||||
// always print all compilation output for library writers!
|
||||
String outString = "";
|
||||
|
||||
// shorten file paths so that they are friendlier
|
||||
int start = 0;
|
||||
int end = 0;
|
||||
String substring = libFolder.getPath() + File.separator;
|
||||
StringBuffer result = new StringBuffer();
|
||||
while ((end = inString.indexOf(substring, start)) >= 0) {
|
||||
result.append(inString.substring(start, end));
|
||||
start = end + substring.length();
|
||||
}
|
||||
result.append(inString.substring(start));
|
||||
outString = result.toString();
|
||||
|
||||
System.err.print(outString);
|
||||
|
||||
// prepare error for throwing
|
||||
if (inString.indexOf("error") != -1){
|
||||
exception = new RunnerException("Error building library \"" + getName() + "\"");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles loading of keywords file.
|
||||
* It is recommended that a # sign be used for comments
|
||||
* inside keywords.txt.
|
||||
*/
|
||||
public void addSyntaxColors(PdeKeywords keywords) {
|
||||
File keywordsFile = new File(libFolder.getPath() + File.separator + "keywords.txt");
|
||||
|
||||
// do not bother if no keywords file to read
|
||||
// should reprimand negligent library writers?!
|
||||
if(!keywordsFile.exists() || !keywordsFile.canRead()){
|
||||
return;
|
||||
}
|
||||
|
||||
try{
|
||||
// open file stream in the verbose java way
|
||||
InputStream input = new FileInputStream(keywordsFile);
|
||||
InputStreamReader isr = new InputStreamReader(input);
|
||||
BufferedReader reader = new BufferedReader(isr);
|
||||
|
||||
String line = null;
|
||||
while ((line = reader.readLine()) != null) {
|
||||
|
||||
// skip empty and whitespace lines
|
||||
if (line.trim().length() == 0){
|
||||
continue;
|
||||
}
|
||||
|
||||
// skip lines without tabs
|
||||
if (line.indexOf('\t') == -1){
|
||||
continue;
|
||||
}
|
||||
|
||||
String pieces[] = PApplet.split(line, '\t');
|
||||
|
||||
if (pieces.length >= 2) {
|
||||
String keyword = pieces[0].trim();
|
||||
String coloring = pieces[1].trim();
|
||||
|
||||
if (coloring.length() > 0) {
|
||||
// text will be KEYWORD or LITERAL
|
||||
boolean isKey = (coloring.charAt(0) == 'K');
|
||||
|
||||
// KEYWORD1 -> 0, KEYWORD2 -> 1, etc
|
||||
int num = coloring.charAt(coloring.length() - 1) - '1';
|
||||
|
||||
byte id = (byte)((isKey ? Token.KEYWORD1 : Token.LITERAL1) + num);
|
||||
|
||||
//System.out.println("got " + (isKey ? "keyword" : "literal") + (num+1) + " for " + keyword);
|
||||
|
||||
PdeKeywords.getKeywordColoring().add(keyword, id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// close file stream
|
||||
reader.close();
|
||||
} catch (Exception e) {
|
||||
Base.showError("Problem Loading Keywords",
|
||||
"Could not load or interpret 'keywords.txt' in " + getName() + " library.\n" +
|
||||
"This must be corrected before distributing.", e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -1,271 +0,0 @@
|
||||
/*
|
||||
LibraryManager.java - Library System for Wiring
|
||||
Copyright (c) 2006-07 Nicholas Zambetti. All right reserved.
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package processing.app;
|
||||
|
||||
import processing.app.syntax.*;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
import java.util.zip.*;
|
||||
|
||||
import java.awt.event.*;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
/*
|
||||
* Provides information about and builds libraries
|
||||
*/
|
||||
public class LibraryManager {
|
||||
|
||||
private File libDir;
|
||||
private List libraries = new ArrayList();
|
||||
private Target target;
|
||||
|
||||
/*
|
||||
* Create a LibraryManager.
|
||||
*/
|
||||
public LibraryManager() throws IOException
|
||||
{
|
||||
String userDir = System.getProperty("user.dir") + File.separator;
|
||||
libDir = new File(
|
||||
((!Base.isMacOS()) ? "" : userDir) + "hardware" + File.separator +
|
||||
"libraries");
|
||||
target = new Target(
|
||||
System.getProperty("user.dir") + File.separator + "hardware" +
|
||||
File.separator + "cores",
|
||||
Preferences.get("boards." + Preferences.get("board") + ".build.core"));
|
||||
refreshLibraries();
|
||||
}
|
||||
|
||||
public Target getTarget()
|
||||
{
|
||||
return target;
|
||||
}
|
||||
|
||||
/*
|
||||
* Scans for libraries and refreshes internal list
|
||||
*/
|
||||
private void refreshLibraries()
|
||||
{
|
||||
FileFilter onlyDirs = new FileFilter() {
|
||||
public boolean accept(File file) {
|
||||
return file.isDirectory();
|
||||
}
|
||||
};
|
||||
libraries.clear();
|
||||
File[] libs = libDir.listFiles(onlyDirs);
|
||||
for(int i = 0; i < libs.length; ++i){
|
||||
libraries.add(new Library(this, libs[i]));
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns a collection of all library objects
|
||||
* @return A read-only collection of Library objects
|
||||
*/
|
||||
public Collection getAll() {
|
||||
refreshLibraries();
|
||||
return Collections.unmodifiableList(libraries);
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns a collection of all built library objects
|
||||
* @return A read-only collection of built Library objects
|
||||
*/
|
||||
public Collection getBuiltLibraries() {
|
||||
refreshLibraries();
|
||||
List builtLibraries = new ArrayList();
|
||||
Library library;
|
||||
ListIterator libIterator = libraries.listIterator();
|
||||
while(libIterator.hasNext()){
|
||||
library = (Library)libIterator.next();
|
||||
if(library.isBuilt()){
|
||||
builtLibraries.add(library);
|
||||
}
|
||||
}
|
||||
return Collections.unmodifiableList(builtLibraries);
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns a collection of all buildable library objects
|
||||
* @return A read-only collection of built Library objects
|
||||
*/
|
||||
public Collection getLibrariesToBuild() {
|
||||
refreshLibraries();
|
||||
List buildableLibraries = new ArrayList();
|
||||
Library library;
|
||||
ListIterator libIterator = libraries.listIterator();
|
||||
while(libIterator.hasNext()){
|
||||
library = (Library)libIterator.next();
|
||||
if(library.isUnbuiltBuildable()){
|
||||
buildableLibraries.add(library);
|
||||
}
|
||||
}
|
||||
return Collections.unmodifiableList(buildableLibraries);
|
||||
}
|
||||
|
||||
/*
|
||||
* Rebuilds built libraries
|
||||
* @return Number of libraries built as int, -1 & exception on error
|
||||
*/
|
||||
public int rebuildAllBuilt() throws RunnerException {
|
||||
Collection builtLibraries = getBuiltLibraries();
|
||||
Library library;
|
||||
Iterator libIterator = builtLibraries.iterator();
|
||||
int countBuilt = 0;
|
||||
while(libIterator.hasNext()){
|
||||
library = (Library)libIterator.next();
|
||||
//System.out.println("Building library \"" + library.getName() + "\"");
|
||||
try {
|
||||
if(library.build()){
|
||||
++countBuilt;
|
||||
}else{
|
||||
return -1;
|
||||
}
|
||||
}catch (RunnerException re) {
|
||||
throw new RunnerException(re.getMessage());
|
||||
} catch (Exception ex) {
|
||||
throw new RunnerException(ex.toString());
|
||||
}
|
||||
}
|
||||
return countBuilt;
|
||||
}
|
||||
|
||||
/*
|
||||
* Gathers paths to object files
|
||||
* @return Array of strings of paths to object files
|
||||
*/
|
||||
public String[] getObjectFiles() {
|
||||
ArrayList filesArrayList = new ArrayList();
|
||||
Collection builtLibraries = getBuiltLibraries();
|
||||
Library library;
|
||||
File[] files;
|
||||
Iterator libIterator = builtLibraries.iterator();
|
||||
while(libIterator.hasNext()){
|
||||
library = (Library)libIterator.next();
|
||||
files = library.getObjectFiles();
|
||||
for(int i = 0; i < files.length; ++i){
|
||||
filesArrayList.add(files[i].getPath());
|
||||
}
|
||||
}
|
||||
String[] filesArray = new String[filesArrayList.size()];
|
||||
filesArrayList.toArray(filesArray);
|
||||
return filesArray;
|
||||
}
|
||||
|
||||
/*
|
||||
* Gathers filenames of header files
|
||||
* @return Array of strings of filenames of header files
|
||||
*/
|
||||
public String[] getHeaderFiles() {
|
||||
ArrayList filesArrayList = new ArrayList();
|
||||
Collection builtLibraries = getBuiltLibraries();
|
||||
Library library;
|
||||
File[] files;
|
||||
Iterator libIterator = builtLibraries.iterator();
|
||||
while(libIterator.hasNext()){
|
||||
library = (Library)libIterator.next();
|
||||
files = library.getHeaderFiles();
|
||||
for(int i = 0; i < files.length; ++i){
|
||||
filesArrayList.add(files[i].getName());
|
||||
}
|
||||
}
|
||||
String[] filesArray = new String[filesArrayList.size()];
|
||||
filesArrayList.toArray(filesArray);
|
||||
return filesArray;
|
||||
}
|
||||
|
||||
/*
|
||||
* Gathers paths to library folders
|
||||
* @return Array of strings of paths to library folders
|
||||
*/
|
||||
public String[] getFolderPaths() {
|
||||
ArrayList foldersArrayList = new ArrayList();
|
||||
//Collection builtLibraries = getBuiltLibraries();
|
||||
Collection libraries = getAll();
|
||||
Library library;
|
||||
//Iterator libIterator = builtLibraries.iterator();
|
||||
Iterator libIterator = libraries.iterator();
|
||||
while(libIterator.hasNext()){
|
||||
library = (Library)libIterator.next();
|
||||
foldersArrayList.add(library.getFolder().getPath());
|
||||
}
|
||||
String[] foldersArray = new String[foldersArrayList.size()];
|
||||
foldersArrayList.toArray(foldersArray);
|
||||
return foldersArray;
|
||||
}
|
||||
|
||||
/*
|
||||
* Builds unbuilt libraries
|
||||
* @return Number of libraries built as int, -1 & exception on error
|
||||
*/
|
||||
public int buildAllUnbuilt() throws RunnerException {
|
||||
Collection buildableLibraries = getLibrariesToBuild();
|
||||
Library library;
|
||||
Iterator libIterator = buildableLibraries.iterator();
|
||||
int countBuilt = 0;
|
||||
while(libIterator.hasNext()){
|
||||
library = (Library)libIterator.next();
|
||||
//System.out.println("Building library \"" + library.getName() + "\"");
|
||||
try {
|
||||
if(library.build()){
|
||||
++countBuilt;
|
||||
}else{
|
||||
return -1;
|
||||
}
|
||||
}catch (RunnerException re) {
|
||||
throw new RunnerException(re.getMessage());
|
||||
} catch (Exception ex) {
|
||||
throw new RunnerException(ex.toString());
|
||||
}
|
||||
}
|
||||
return countBuilt;
|
||||
}
|
||||
|
||||
/*
|
||||
* Populates examples menu with library folders
|
||||
*/
|
||||
public void populateExamplesMenu(JMenu examplesMenu, ActionListener listener) {
|
||||
Library library;
|
||||
Collection libraries = getBuiltLibraries();
|
||||
Iterator iterator = libraries.iterator();
|
||||
JMenu libraryExamples;
|
||||
while(iterator.hasNext()){
|
||||
library = (Library)iterator.next();
|
||||
libraryExamples = library.getExamplesMenu(listener);
|
||||
if(null != libraryExamples){
|
||||
examplesMenu.add(libraryExamples);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Add syntax coloring
|
||||
*/
|
||||
public void addSyntaxColoring(PdeKeywords keywords) {
|
||||
Library library;
|
||||
Collection libraries = getBuiltLibraries();
|
||||
Iterator iterator = libraries.iterator();
|
||||
while(iterator.hasNext()){
|
||||
library = (Library)iterator.next();
|
||||
library.addSyntaxColors(keywords);
|
||||
}
|
||||
}
|
||||
}
|
646
app/Runner.java
646
app/Runner.java
@ -1,646 +0,0 @@
|
||||
/* -*- mode: jde; c-basic-offset: 2; indent-tabs-mode: nil -*- */
|
||||
|
||||
/*
|
||||
Part of the Processing project - http://processing.org
|
||||
|
||||
Copyright (c) 2004-05 Ben Fry and Casey Reas
|
||||
Copyright (c) 2001-04 Massachusetts Institute of Technology
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
package processing.app;
|
||||
|
||||
import processing.core.*;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
import java.io.*;
|
||||
import java.lang.reflect.*;
|
||||
import java.util.*;
|
||||
|
||||
import com.oroinc.text.regex.*;
|
||||
|
||||
|
||||
/**
|
||||
* Runs a compiled java applet, whether as an external application
|
||||
* or internally as an applet object in a window.
|
||||
*/
|
||||
public class Runner implements MessageConsumer {
|
||||
|
||||
PApplet applet;
|
||||
RunnerException exception;
|
||||
Window window;
|
||||
PrintStream leechErr;
|
||||
//String className;
|
||||
|
||||
Editor editor;
|
||||
Sketch sketch;
|
||||
|
||||
boolean newMessage;
|
||||
int messageLineCount;
|
||||
boolean foundMessageSource;
|
||||
|
||||
Process process;
|
||||
SystemOutSiphon processInput;
|
||||
OutputStream processOutput;
|
||||
MessageSiphon processError;
|
||||
|
||||
|
||||
public Runner(Sketch sketch, Editor editor) {
|
||||
this.sketch = sketch;
|
||||
this.editor = editor;
|
||||
}
|
||||
|
||||
|
||||
public void start(Point windowLocation) throws RunnerException {
|
||||
//System.out.println(" externalRuntime is " + sketch.externalRuntime);
|
||||
/* this.leechErr = new PrintStream(new MessageStream(this));
|
||||
|
||||
try {
|
||||
if (editor.presenting) {
|
||||
startPresenting();
|
||||
|
||||
} else if (sketch.externalRuntime) {
|
||||
startExternalRuntime(windowLocation);
|
||||
|
||||
} else {
|
||||
startInternal(windowLocation);
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
// this will pass through to the first part of message
|
||||
// this handles errors that happen inside setup()
|
||||
e.printStackTrace();
|
||||
|
||||
// make sure applet is in use
|
||||
if (applet != null) applet.finished = true;
|
||||
|
||||
leechErr.println(PApplet.LEECH_WAKEUP);
|
||||
e.printStackTrace(this.leechErr);
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
public void startPresenting() throws Exception {
|
||||
Vector params = new Vector();
|
||||
|
||||
params.add("java");
|
||||
|
||||
String options = Preferences.get("run.options");
|
||||
/* if (options.length() > 0) {
|
||||
String pieces[] = PApplet.split(options, ' ');
|
||||
for (int i = 0; i < pieces.length; i++) {
|
||||
String p = pieces[i].trim();
|
||||
if (p.length() > 0) {
|
||||
params.add(p);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
params.add("-Djava.library.path=" +
|
||||
sketch.libraryPath +
|
||||
File.pathSeparator +
|
||||
System.getProperty("java.library.path"));
|
||||
|
||||
params.add("-cp");
|
||||
params.add(sketch.classPath + Sketchbook.librariesClassPath);
|
||||
|
||||
params.add("processing.core.PApplet");
|
||||
|
||||
params.add(PApplet.ARGS_EXTERNAL);
|
||||
params.add(PApplet.ARGS_PRESENT);
|
||||
params.add(PApplet.ARGS_PRESENT_STOP_COLOR + "=" +
|
||||
Preferences.get("run.present.stop.color"));
|
||||
params.add(PApplet.ARGS_BGCOLOR + "=" +
|
||||
Preferences.get("run.present.bgcolor"));
|
||||
params.add(PApplet.ARGS_DISPLAY + "=" +
|
||||
Preferences.get("run.display"));
|
||||
params.add(PApplet.ARGS_SKETCH_FOLDER + "=" +
|
||||
sketch.folder.getAbsolutePath());
|
||||
params.add(sketch.mainClassName);
|
||||
|
||||
String command[] = new String[params.size()];
|
||||
params.copyInto(command);
|
||||
//PApplet.println(command);
|
||||
|
||||
process = Runtime.getRuntime().exec(command);
|
||||
processInput = new SystemOutSiphon(process.getInputStream());
|
||||
processError = new MessageSiphon(process.getErrorStream(), this);
|
||||
processOutput = process.getOutputStream();
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
public void startExternalRuntime(Point windowLocation) throws Exception {
|
||||
// if there was a saved location (this guy has been run more than
|
||||
// once) then windowLocation will be set to the last position of
|
||||
// the sketch window. this will be passed to the PApplet runner
|
||||
// using something like --external=e30,20 where the e stands for
|
||||
// exact. otherwise --external=x,y for just the regular positioning.
|
||||
/* Point editorLocation = editor.getLocation();
|
||||
String location =
|
||||
(windowLocation != null) ?
|
||||
(PApplet.ARGS_LOCATION + "=" +
|
||||
windowLocation.x + "," + windowLocation.y) :
|
||||
(PApplet.ARGS_EDITOR_LOCATION + "=" +
|
||||
editorLocation.x + "," + editorLocation.y);
|
||||
|
||||
// this as prefix made the code folder bug go away, but killed stdio
|
||||
//"cmd", "/c", "start",
|
||||
|
||||
// all params have to be stored as separate items,
|
||||
// so a growable array needs to be used. i.e. -Xms128m -Xmx1024m
|
||||
// will throw an error if it's shoved into a single array element
|
||||
Vector params = new Vector();
|
||||
|
||||
params.add("java");
|
||||
|
||||
String options = Preferences.get("run.options");
|
||||
if (options.length() > 0) {
|
||||
String pieces[] = PApplet.split(options, ' ');
|
||||
for (int i = 0; i < pieces.length; i++) {
|
||||
String p = pieces[i].trim();
|
||||
if (p.length() > 0) {
|
||||
params.add(p);
|
||||
}
|
||||
}
|
||||
}
|
||||
// sketch.libraryPath might be ""
|
||||
// librariesClassPath will always have sep char prepended
|
||||
params.add("-Djava.library.path=" +
|
||||
sketch.libraryPath +
|
||||
File.pathSeparator +
|
||||
System.getProperty("java.library.path"));
|
||||
|
||||
params.add("-cp");
|
||||
params.add(sketch.classPath + Sketchbook.librariesClassPath);
|
||||
|
||||
params.add("processing.core.PApplet");
|
||||
|
||||
params.add(location);
|
||||
params.add(PApplet.ARGS_EXTERNAL);
|
||||
params.add(PApplet.ARGS_DISPLAY + "=" +
|
||||
Preferences.get("run.display"));
|
||||
params.add(PApplet.ARGS_SKETCH_FOLDER + "=" +
|
||||
sketch.folder.getAbsolutePath());
|
||||
params.add(sketch.mainClassName);
|
||||
|
||||
String command[] = new String[params.size()];
|
||||
params.copyInto(command);
|
||||
//PApplet.println(command);
|
||||
|
||||
process = Runtime.getRuntime().exec(command);
|
||||
processInput = new SystemOutSiphon(process.getInputStream());
|
||||
processError = new MessageSiphon(process.getErrorStream(), this);
|
||||
processOutput = process.getOutputStream();
|
||||
*/ }
|
||||
|
||||
|
||||
public void startInternal(Point windowLocation) throws Exception {
|
||||
/* Point editorLocation = editor.getLocation();
|
||||
//Insets editorInsets = editor.getInsets();
|
||||
|
||||
int windowX = editorLocation.x;
|
||||
int windowY = editorLocation.y + editor.getInsets().top;
|
||||
|
||||
RunnerClassLoader loader = new RunnerClassLoader();
|
||||
Class c = loader.loadClass(sketch.mainClassName);
|
||||
applet = (PApplet) c.newInstance();
|
||||
|
||||
window = new Frame(sketch.name); // use ugly window
|
||||
((Frame)window).setResizable(false);
|
||||
if (editor.icon != null) {
|
||||
((Frame)window).setIconImage(editor.icon);
|
||||
}
|
||||
window.pack(); // to get a peer, size set later, need for insets
|
||||
|
||||
applet.leechErr = leechErr;
|
||||
applet.folder = sketch.folder.getAbsolutePath();
|
||||
applet.frame = (Frame) window;
|
||||
|
||||
applet.init();
|
||||
//applet.start();
|
||||
|
||||
while ((applet.width == 0) && !applet.finished) {
|
||||
try {
|
||||
if (applet.exception != null) {
|
||||
throw new RunnerException(applet.exception.getMessage());
|
||||
}
|
||||
Thread.sleep(5);
|
||||
} catch (InterruptedException e) { }
|
||||
}
|
||||
|
||||
window.addWindowListener(new WindowAdapter() {
|
||||
public void windowClosing(WindowEvent e) {
|
||||
stop();
|
||||
editor.doClose();
|
||||
}
|
||||
});
|
||||
|
||||
applet.addKeyListener(new KeyAdapter() {
|
||||
public void keyPressed(KeyEvent e) {
|
||||
if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
|
||||
stop();
|
||||
editor.doClose();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
window.add(applet);
|
||||
|
||||
Dimension screen =
|
||||
Toolkit.getDefaultToolkit().getScreenSize();
|
||||
|
||||
window.setLayout(null);
|
||||
Insets insets = window.getInsets();
|
||||
|
||||
int minW = Preferences.getInteger("run.window.width.minimum");
|
||||
int minH = Preferences.getInteger("run.window.height.minimum");
|
||||
int windowW =
|
||||
Math.max(applet.width, minW) + insets.left + insets.right;
|
||||
int windowH =
|
||||
Math.max(applet.height, minH) + insets.top + insets.bottom;
|
||||
|
||||
if (windowX - windowW > 10) { // if it fits to the left of the window
|
||||
window.setBounds(windowX - windowW, windowY, windowW, windowH);
|
||||
|
||||
} else { // if it fits inside the editor window
|
||||
windowX = editorLocation.x + Preferences.GRID_SIZE * 2; // 66
|
||||
windowY = editorLocation.y + Preferences.GRID_SIZE * 2; // 66
|
||||
|
||||
if ((windowX + windowW > screen.width - Preferences.GRID_SIZE) ||
|
||||
(windowY + windowH > screen.height - Preferences.GRID_SIZE)) {
|
||||
// otherwise center on screen
|
||||
windowX = (screen.width - windowW) / 2;
|
||||
windowY = (screen.height - windowH) / 2;
|
||||
}
|
||||
window.setBounds(windowX, windowY, windowW, windowH); //ww, wh);
|
||||
}
|
||||
|
||||
Color windowBgColor = Preferences.getColor("run.window.bgcolor");
|
||||
window.setBackground(windowBgColor);
|
||||
|
||||
int usableH = windowH - insets.top - insets.bottom;
|
||||
applet.setBounds((windowW - applet.width)/2,
|
||||
insets.top + (usableH - applet.height) / 2,
|
||||
windowW, windowH);
|
||||
|
||||
applet.setVisible(true); // no effect
|
||||
if (windowLocation != null) {
|
||||
window.setLocation(windowLocation);
|
||||
}
|
||||
window.show();
|
||||
applet.requestFocus(); // necessary for key events
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
public void stop() {
|
||||
/* // check for null in case stop is called during compilation
|
||||
if (applet != null) {
|
||||
applet.stop();
|
||||
|
||||
// above avoids NullPointerExceptions
|
||||
// but still threading is too complex, and so
|
||||
// some boogers are being left behind
|
||||
applet = null;
|
||||
|
||||
} else if (process != null) { // running externally
|
||||
try {
|
||||
processOutput.write(PApplet.EXTERNAL_STOP);
|
||||
processOutput.flush();
|
||||
|
||||
} catch (IOException e) {
|
||||
close();
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
public void close() {
|
||||
/* //if (window != null) window.hide();
|
||||
if (window != null) {
|
||||
//System.err.println("disposing window");
|
||||
window.dispose();
|
||||
window = null;
|
||||
}
|
||||
|
||||
if (process != null) {
|
||||
try {
|
||||
process.destroy();
|
||||
} catch (Exception e) {
|
||||
//System.err.println("(ignored) error while destroying");
|
||||
//e.printStackTrace();
|
||||
}
|
||||
process = null;
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
// made synchronized for rev 87
|
||||
synchronized public void message(String s) {
|
||||
//System.out.println("M" + s.length() + ":" + s.trim()); // + "MMM" + s.length());
|
||||
|
||||
// this eats the CRLFs on the lines.. oops.. do it later
|
||||
//if (s.trim().length() == 0) return;
|
||||
|
||||
// this is PApplet sending a message (via System.out.println)
|
||||
// that signals that the applet has been quit.
|
||||
// if (s.indexOf(PApplet.EXTERNAL_QUIT) == 0) {
|
||||
//System.out.println("external: quit");
|
||||
// editor.doClose();
|
||||
// return;
|
||||
// }
|
||||
|
||||
// this is the PApplet sending us a message that the applet
|
||||
// is being moved to a new window location
|
||||
// if (s.indexOf(PApplet.EXTERNAL_MOVE) == 0) {
|
||||
// String nums = s.substring(s.indexOf(' ') + 1).trim();
|
||||
// int space = nums.indexOf(' ');
|
||||
// int left = Integer.parseInt(nums.substring(0, space));
|
||||
// int top = Integer.parseInt(nums.substring(space + 1));
|
||||
// editor.appletLocation = new Point(left, top);
|
||||
// //System.out.println("external: move to " + left + " " + top);
|
||||
//// return;
|
||||
// }
|
||||
|
||||
// this is PApplet sending a message saying "i'm about to spew
|
||||
// a stack trace because an error occurred during PApplet.run()"
|
||||
// if (s.indexOf(PApplet.LEECH_WAKEUP) == 0) {
|
||||
// newMessage being set to 'true' means that the next time
|
||||
// message() is called, expect the first line of the actual
|
||||
// // error message & stack trace to be sent from the applet.
|
||||
// newMessage = true;
|
||||
// return; // this line ignored
|
||||
// }
|
||||
|
||||
// these are used for debugging, in case there are concerns
|
||||
// that some errors aren't coming through properly
|
||||
/*
|
||||
if (s.length() > 2) {
|
||||
System.err.println(newMessage);
|
||||
System.err.println("message " + s.length() + ":" + s);
|
||||
}
|
||||
*/
|
||||
// always shove out the mesage, since it might not fall under
|
||||
// the same setup as we're expecting
|
||||
System.err.print(s);
|
||||
//System.err.println("[" + s.length() + "] " + s);
|
||||
System.err.flush();
|
||||
|
||||
// exit here because otherwise the exception name
|
||||
// may be titled with a blank string
|
||||
if (s.trim().length() == 0) return;
|
||||
|
||||
// annoying, because it seems as though the terminators
|
||||
// aren't being sent properly
|
||||
//System.err.println(s);
|
||||
|
||||
//if (newMessage && s.length() > 2) {
|
||||
if (newMessage) {
|
||||
exception = new RunnerException(s); // type of java ex
|
||||
exception.hideStackTrace = true;
|
||||
//System.out.println("setting ex type to " + s);
|
||||
newMessage = false;
|
||||
foundMessageSource = false;
|
||||
messageLineCount = 0;
|
||||
|
||||
} else {
|
||||
messageLineCount++;
|
||||
|
||||
/*
|
||||
java.lang.NullPointerException
|
||||
at javatest.<init>(javatest.java:5)
|
||||
at Temporary_2425_1153.draw(Temporary_2425_1153.java:11)
|
||||
at PApplet.nextFrame(PApplet.java:481)
|
||||
at PApplet.run(PApplet.java:428)
|
||||
at java.lang.Thread.run(Unknown Source)
|
||||
*/
|
||||
|
||||
if (!foundMessageSource) {
|
||||
// " at javatest.<init>(javatest.java:5)"
|
||||
// -> "javatest.<init>(javatest.java:5)"
|
||||
int afterAt = s.indexOf("at") + 3;
|
||||
//if (afterAt == -1) {
|
||||
if (afterAt == 2) { // means indexOf was -1
|
||||
//System.err.println(s); // stop double-printing exceptions
|
||||
return;
|
||||
}
|
||||
s = s.substring(afterAt + 1);
|
||||
|
||||
// "javatest.<init>(javatest.java:5)"
|
||||
// -> "javatest.<init>" and "(javatest.java:5)"
|
||||
int startParen = s.indexOf('(');
|
||||
// at javatest.<init>(javatest.java:5)
|
||||
String pkgClassFxn = null;
|
||||
//String fileLine = null;
|
||||
int codeIndex = -1;
|
||||
int lineNumber = -1;
|
||||
|
||||
if (startParen == -1) {
|
||||
pkgClassFxn = s;
|
||||
|
||||
} else {
|
||||
pkgClassFxn = s.substring(0, startParen);
|
||||
// "(javatest.java:5)"
|
||||
String fileAndLine = s.substring(startParen + 1);
|
||||
int stopParen = fileAndLine.indexOf(')');
|
||||
//fileAndLine = fileAndLine.substring(0, fileAndLine.length() - 1);
|
||||
fileAndLine = fileAndLine.substring(0, stopParen);
|
||||
//System.out.println("file 'n line " + fileAndLine);
|
||||
|
||||
//if (!fileAndLine.equals("Unknown Source")) {
|
||||
// "javatest.java:5"
|
||||
int colonIndex = fileAndLine.indexOf(':');
|
||||
if (colonIndex != -1) {
|
||||
String filename = fileAndLine.substring(0, colonIndex);
|
||||
// "javatest.java" and "5"
|
||||
//System.out.println("filename = " + filename);
|
||||
//System.out.println("pre0 = " + sketch.code[0].preprocName);
|
||||
//for (int i = 0; i < sketch.codeCount; i++) {
|
||||
//System.out.println(i + " " + sketch.code[i].lineOffset + " " +
|
||||
// sketch.code[i].preprocName);
|
||||
//}
|
||||
lineNumber =
|
||||
Integer.parseInt(fileAndLine.substring(colonIndex + 1)) - 1;
|
||||
|
||||
for (int i = 0; i < sketch.codeCount; i++) {
|
||||
SketchCode code = sketch.code[i];
|
||||
//System.out.println(code.preprocName + " " + lineNumber + " " +
|
||||
// code.preprocOffset);
|
||||
if (((code.preprocName == null) &&
|
||||
(lineNumber >= code.preprocOffset)) ||
|
||||
((code.preprocName != null) &&
|
||||
code.preprocName.equals(filename))) {
|
||||
codeIndex = i;
|
||||
//System.out.println("got codeindex " + codeIndex);
|
||||
//break;
|
||||
//} else if (
|
||||
}
|
||||
}
|
||||
|
||||
if (codeIndex != -1) {
|
||||
//System.out.println("got line num " + lineNumber);
|
||||
// in case this was a tab that got embedded into the main .java
|
||||
lineNumber -= sketch.code[codeIndex].preprocOffset;
|
||||
|
||||
// this may have a paren on the end, if so need to strip
|
||||
// down to just the digits
|
||||
/*
|
||||
int lastNumberIndex = colonIndex + 1;
|
||||
while ((lastNumberIndex < fileAndLine.length()) &&
|
||||
Character.isDigit(fileAndLine.charAt(lastNumberIndex))) {
|
||||
lastNumberIndex++;
|
||||
}
|
||||
*/
|
||||
|
||||
// lineNumber is 1-indexed, but editor wants zero-indexed
|
||||
// getMessage() will be what's shown in the editor
|
||||
exception =
|
||||
new RunnerException(exception.getMessage(),
|
||||
codeIndex, lineNumber, -1);
|
||||
exception.hideStackTrace = true;
|
||||
foundMessageSource = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
editor.error(exception);
|
||||
|
||||
/*
|
||||
int index = s.indexOf(className + ".java");
|
||||
if (index != -1) {
|
||||
int len = (className + ".java").length();
|
||||
String lineNumberStr = s.substring(index + len + 1);
|
||||
index = lineNumberStr.indexOf(')');
|
||||
lineNumberStr = lineNumberStr.substring(0, index);
|
||||
try {
|
||||
exception.line = Integer.parseInt(lineNumberStr) - 1; //2;
|
||||
} catch (NumberFormatException e) { }
|
||||
//e.printStackTrace(); // a recursive error waiting to happen?
|
||||
// if nfe occurs, who cares, still send the error on up
|
||||
editor.error(exception);
|
||||
*/
|
||||
|
||||
/*
|
||||
// WARNING THESE ARE DISABLED!!
|
||||
} else if ((index = s.indexOf(className + ".class")) != -1) {
|
||||
// code to check for:
|
||||
// at Temporary_484_3845.loop(Compiled Code)
|
||||
// would also probably get:
|
||||
// at Temporary_484_3845.loop
|
||||
// which (i believe) is used by the mac and/or jview
|
||||
String functionStr = s.substring(index +
|
||||
(className + ".class").length() + 1);
|
||||
index = functionStr.indexOf('(');
|
||||
if (index != -1) {
|
||||
functionStr = functionStr.substring(0, index);
|
||||
}
|
||||
exception = new RunnerException(//"inside \"" + functionStr + "()\": " +
|
||||
exception.getMessage() +
|
||||
" inside " + functionStr + "() " +
|
||||
"[add Compiler.disable() to setup()]");
|
||||
editor.error(exception);
|
||||
// this will fall through in tihs example:
|
||||
// at Temporary_4636_9696.pootie(Compiled Code)
|
||||
// at Temporary_4636_9696.loop(Temporary_4636_9696.java:24)
|
||||
// because pootie() (re)sets the exception title
|
||||
// and throws it, but then the line number gets set
|
||||
// because of the line that comes after
|
||||
*/
|
||||
|
||||
} else if (messageLineCount > 10) { // 5 -> 10 for 0088
|
||||
// this means the class name may not be mentioned
|
||||
// in the stack trace.. this is just a general purpose
|
||||
// error, but needs to make it through anyway.
|
||||
// so if five lines have gone past, might as well signal
|
||||
messageLineCount = -100;
|
||||
exception = new RunnerException(exception.getMessage());
|
||||
exception.hideStackTrace = true;
|
||||
editor.error(exception);
|
||||
|
||||
} else {
|
||||
//System.err.print(s);
|
||||
}
|
||||
//System.out.println("got it " + s);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/**
|
||||
* Siphons from an InputStream of System.out (from a Process)
|
||||
* and sends it to the real System.out.
|
||||
*/
|
||||
class SystemOutSiphon implements Runnable {
|
||||
InputStream input;
|
||||
Thread thread;
|
||||
|
||||
public SystemOutSiphon(InputStream input) {
|
||||
this.input = input;
|
||||
|
||||
thread = new Thread(this);
|
||||
// unless this is set to min, it seems to hork the app
|
||||
// since it's in charge of stuffing the editor console with strings
|
||||
// maybe it's time to get rid of/fix that friggin console
|
||||
// ...disabled for 0075, with 0074's fix for code folder hanging
|
||||
// this only seems to make the console unresponsive
|
||||
//thread.setPriority(Thread.MIN_PRIORITY);
|
||||
thread.start();
|
||||
}
|
||||
|
||||
public void run() {
|
||||
byte boofer[] = new byte[256];
|
||||
|
||||
while (Thread.currentThread() == thread) {
|
||||
try {
|
||||
// can't use a buffered reader here because incremental
|
||||
// print statements are interesting too.. causes some
|
||||
// disparity with how System.err gets spewed, oh well.
|
||||
int count = input.read(boofer, 0, boofer.length);
|
||||
if (count == -1) {
|
||||
thread = null;
|
||||
|
||||
} else {
|
||||
System.out.print(new String(boofer, 0, count));
|
||||
//System.out.flush();
|
||||
}
|
||||
|
||||
} catch (IOException e) {
|
||||
// this is prolly because the app was quit & the stream broken
|
||||
//e.printStackTrace(System.out);
|
||||
//e.printStackTrace();
|
||||
thread = null;
|
||||
|
||||
} catch (Exception e) {
|
||||
//System.out.println("SystemOutSiphon: i just died in your arms tonight");
|
||||
// on mac os x, this will spew a "Bad File Descriptor" ex
|
||||
// each time an external app is shut down.
|
||||
//e.printStackTrace();
|
||||
thread = null;
|
||||
//System.out.println("");
|
||||
}
|
||||
//System.out.println("SystemOutSiphon: out");
|
||||
//thread = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,128 +0,0 @@
|
||||
/* -*- mode: jde; c-basic-offset: 2; indent-tabs-mode: nil -*- */
|
||||
|
||||
/*
|
||||
Based on Simple1.2ClassLoader.java - simple Java 1.2 class loader
|
||||
Copyright (c) 1999 Ken McCrary, All Rights Reserved.
|
||||
|
||||
Permission to use, copy, modify, and distribute this software
|
||||
and its documentation for NON-COMMERCIAL purposes and without
|
||||
fee is hereby granted provided that this copyright notice
|
||||
appears in all copies.
|
||||
|
||||
KEN MCCRARY MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE
|
||||
SUITABILITY OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING
|
||||
BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. KEN MCCRARY
|
||||
SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT
|
||||
OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
|
||||
*/
|
||||
package processing.app;
|
||||
|
||||
import java.io.*;
|
||||
import java.net.*;
|
||||
import java.util.*;
|
||||
import java.util.jar.*;
|
||||
|
||||
|
||||
/**
|
||||
* Simple class loader adapted for Processing.
|
||||
* <P>
|
||||
* Based on code from Ken McCrary.
|
||||
*/
|
||||
public class RunnerClassLoader extends ClassLoader {
|
||||
String buildFolderPath;
|
||||
|
||||
RunnerClassLoader() {
|
||||
buildFolderPath = Base.getBuildFolder().getAbsolutePath();
|
||||
}
|
||||
|
||||
/**
|
||||
* This is the method where the task of class loading
|
||||
* is delegated to our custom loader.
|
||||
*
|
||||
* @param name the name of the class
|
||||
* @return the resulting <code>Class</code> object
|
||||
* @exception ClassNotFoundException if the class could not be found
|
||||
*/
|
||||
protected Class findClass(String name) throws ClassNotFoundException {
|
||||
FileInputStream fi = null;
|
||||
|
||||
try {
|
||||
String path =
|
||||
buildFolderPath + File.separator + name.replace('.', '/');
|
||||
//System.out.println("(from " + path + ")");
|
||||
fi = new FileInputStream(path + ".class");
|
||||
byte[] classBytes = new byte[fi.available()];
|
||||
fi.read(classBytes);
|
||||
//definePackage(name);
|
||||
return defineClass(name, classBytes, 0, classBytes.length);
|
||||
|
||||
} catch (Exception e) {
|
||||
// could not find the class, so indicate the problem with an exception
|
||||
throw new ClassNotFoundException(name);
|
||||
|
||||
} finally {
|
||||
if (fi != null) {
|
||||
try {
|
||||
fi.close();
|
||||
} catch (Exception e) { }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Identify where to load a resource from, resources for
|
||||
* this simple ClassLoader are in a directory name "store"
|
||||
*
|
||||
* @param name the resource name
|
||||
* @return URL for resource or null if not found
|
||||
*/
|
||||
protected URL findResource(String name) {
|
||||
String path =
|
||||
buildFolderPath + File.separator + name.replace('.', '/');
|
||||
File searchResource = new File(path, name);
|
||||
//URL result = null;
|
||||
|
||||
if (searchResource.exists()) {
|
||||
try {
|
||||
return searchResource.toURL();
|
||||
} catch (MalformedURLException mfe) { }
|
||||
}
|
||||
//return result;
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Used for identifying resources from multiple URLS
|
||||
* Since our simple Classloader only has one repository
|
||||
* the returned Enumeration contains 0 to 1 items
|
||||
*
|
||||
* @param name the resource name
|
||||
* @return Enumeration of one URL
|
||||
*/
|
||||
protected Enumeration findResources(final String name) throws IOException {
|
||||
// Since we only have a single repository we will only have one
|
||||
// resource of a particular name, the Enumeration will just return
|
||||
// this single URL
|
||||
|
||||
return new Enumeration() {
|
||||
URL resource = findResource(name);
|
||||
|
||||
public boolean hasMoreElements() {
|
||||
return ( resource != null ? true : false);
|
||||
}
|
||||
|
||||
public Object nextElement() {
|
||||
if (!hasMoreElements()) {
|
||||
throw new NoSuchElementException();
|
||||
} else {
|
||||
URL result = resource;
|
||||
resource = null;
|
||||
return result;
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
@ -1,85 +0,0 @@
|
||||
/* -*- mode: jde; c-basic-offset: 2; indent-tabs-mode: nil -*- */
|
||||
|
||||
/*
|
||||
Part of the Processing project - http://processing.org
|
||||
|
||||
Copyright (c) 2004-05 Ben Fry and Casey Reas
|
||||
Copyright (c) 2001-04 Massachusetts Institute of Technology
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
package processing.app;
|
||||
|
||||
/**
|
||||
* An exception with a line number attached that occurs
|
||||
* during either compile time or run time.
|
||||
*/
|
||||
public class RunnerException extends Exception {
|
||||
public int file = -1;
|
||||
public int line = -1;
|
||||
public int column = -1;
|
||||
public boolean hideStackTrace;
|
||||
|
||||
public RunnerException() { }
|
||||
|
||||
public RunnerException(String message) {
|
||||
super(massage(message));
|
||||
}
|
||||
|
||||
public RunnerException(String message, int line) {
|
||||
super(massage(message));
|
||||
this.line = line;
|
||||
}
|
||||
|
||||
public RunnerException(String message, int line, int column) {
|
||||
super(massage(message));
|
||||
this.line = line;
|
||||
this.column = column;
|
||||
}
|
||||
|
||||
public RunnerException(String message, int file, int line, int column) {
|
||||
super(massage(message));
|
||||
this.file = file;
|
||||
this.line = line;
|
||||
this.column = column;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Nix the java.lang crap out of an exception message
|
||||
* because it scares the children.
|
||||
* <P>
|
||||
* This function must be static to be used with super()
|
||||
* in each of the constructors above.
|
||||
*/
|
||||
static public final String massage(String msg) {
|
||||
if (msg == null)
|
||||
return "";
|
||||
if (msg.indexOf("java.lang.") == 0) {
|
||||
//int dot = msg.lastIndexOf('.');
|
||||
msg = msg.substring("java.lang.".length());
|
||||
}
|
||||
return msg;
|
||||
//return (dot == -1) ? msg : msg.substring(dot+1);
|
||||
}
|
||||
|
||||
|
||||
public void printStackTrace() {
|
||||
if (!hideStackTrace) {
|
||||
super.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
2280
app/Sketch.java
2280
app/Sketch.java
File diff suppressed because it is too large
Load Diff
@ -1,105 +0,0 @@
|
||||
/* -*- mode: jde; c-basic-offset: 2; indent-tabs-mode: nil -*- */
|
||||
|
||||
/*
|
||||
SketchCode - data class for a single file inside a sketch
|
||||
Part of the Processing project - http://processing.org
|
||||
|
||||
Copyright (c) 2004-05 Ben Fry and Casey Reas
|
||||
Copyright (c) 2001-04 Massachusetts Institute of Technology
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
package processing.app;
|
||||
import processing.app.syntax.*;
|
||||
|
||||
import java.io.*;
|
||||
import javax.swing.text.*;
|
||||
import javax.swing.undo.*;
|
||||
|
||||
|
||||
public class SketchCode {
|
||||
/** Pretty name (no extension), not the full file name */
|
||||
public String name;
|
||||
|
||||
/** File object for where this code is located */
|
||||
public File file;
|
||||
|
||||
/** Type of code in this tab, Sketch.PDE or Sketch.JAVA */
|
||||
public int flavor;
|
||||
|
||||
/** Text of the program text for this tab */
|
||||
public String program;
|
||||
|
||||
/** Document object for this tab */
|
||||
public SyntaxDocument document;
|
||||
|
||||
/** Undo Manager for this tab, each tab keeps track of their own */
|
||||
public UndoManager undo; // = new UndoManager();
|
||||
|
||||
// saved positions from last time this tab was used
|
||||
public int selectionStart;
|
||||
public int selectionStop;
|
||||
public int scrollPosition;
|
||||
|
||||
public boolean modified;
|
||||
//SketchHistory history; // TODO add history information
|
||||
|
||||
String preprocName; // name of .java file after preproc
|
||||
int preprocOffset; // where this code starts relative to the concat'd code
|
||||
|
||||
|
||||
public SketchCode(String name, File file, int flavor) {
|
||||
this.name = name;
|
||||
this.file = file;
|
||||
this.flavor = flavor;
|
||||
|
||||
try {
|
||||
load();
|
||||
} catch (IOException e) {
|
||||
System.err.println("error while loading code " + name);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Load this piece of code from a file.
|
||||
*/
|
||||
public void load() throws IOException {
|
||||
program = Base.loadFile(file);
|
||||
modified = false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Save this piece of code, regardless of whether the modified
|
||||
* flag is set or not.
|
||||
*/
|
||||
public void save() throws IOException {
|
||||
// TODO re-enable history
|
||||
//history.record(s, SketchHistory.SAVE);
|
||||
|
||||
Base.saveFile(program, file);
|
||||
modified = false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Save this file to another location, used by Sketch.saveAs()
|
||||
*/
|
||||
public void saveAs(File newFile) throws IOException {
|
||||
Base.saveFile(program, newFile);
|
||||
}
|
||||
}
|
@ -1,357 +0,0 @@
|
||||
/* -*- mode: jde; c-basic-offset: 2; indent-tabs-mode: nil -*- */
|
||||
|
||||
/*
|
||||
SketchHistory - handler for storing history information about a project
|
||||
Part of the Processing project - http://processing.org
|
||||
|
||||
Copyright (c) 2004-05 Ben Fry and Casey Reas
|
||||
Copyright (c) 2001-04 Massachusetts Institute of Technology
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
import java.util.zip.*;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
|
||||
public class SketchHistory {
|
||||
Editor editor;
|
||||
|
||||
// why things have been saved for history
|
||||
static final int RUN = 5;
|
||||
static final int SAVE = 6;
|
||||
static final int AUTOSAVE = 7;
|
||||
static final int BEAUTIFY = 8;
|
||||
|
||||
static final String HISTORY_SEPARATOR =
|
||||
"#################################################";
|
||||
|
||||
JMenu menu;
|
||||
|
||||
// true if the sketch is read-only,
|
||||
// meaning that no history will be recorded
|
||||
boolean readOnlySketch;
|
||||
|
||||
File historyFile;
|
||||
String lastRecorded;
|
||||
|
||||
ActionListener menuListener;
|
||||
|
||||
|
||||
//public SketchHistory(Editor editor) {
|
||||
//this.editor = editor;
|
||||
//}
|
||||
|
||||
public SketchHistory(Sketch sketch) {
|
||||
menu = new JMenu("History");
|
||||
|
||||
menuListener = new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
retrieve(e.getActionCommand());
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// Set the path for the current sketch
|
||||
|
||||
public void setPath(String path, boolean readOnlySketch) {
|
||||
this.readOnlySketch = true;
|
||||
|
||||
if (readOnlySketch) return;
|
||||
historyFile = new File(path, "history.gz");
|
||||
}
|
||||
|
||||
|
||||
public void attachMenu(JMenu parent) {
|
||||
//if (Preferences.getBoolean("history.recording")) {
|
||||
parent.add(menu);
|
||||
|
||||
// should leave enabled, since can still get old history
|
||||
// even if the new stuff isn't being recorded
|
||||
//menu.setEnabled(Preferences.getBoolean("history.recording"));
|
||||
//}
|
||||
}
|
||||
|
||||
|
||||
/// Check to see if history should be recorded.
|
||||
/// mode is RUN, SAVE, AUTOSAVE, or BEAUTIFY
|
||||
public void record(String program, int mode) {
|
||||
if (readOnlySketch) return;
|
||||
|
||||
if (!Preferences.getBoolean("history.recording")) return;
|
||||
|
||||
if ((lastRecorded != null) &&
|
||||
(lastRecorded.equals(program))) return;
|
||||
|
||||
String modeStr = null;
|
||||
switch (mode) {
|
||||
case RUN: modeStr = "run"; break;
|
||||
case SAVE: modeStr = "save"; break;
|
||||
case AUTOSAVE: modeStr = "autosave"; break;
|
||||
case BEAUTIFY: modeStr = "beautify"; break;
|
||||
}
|
||||
|
||||
try {
|
||||
boolean noPreviousHistory = false;
|
||||
|
||||
ByteArrayOutputStream old = null;
|
||||
if (historyFile.exists()) {
|
||||
InputStream oldStream = new GZIPInputStream(new BufferedInputStream(new FileInputStream(historyFile)));
|
||||
old = new ByteArrayOutputStream();
|
||||
|
||||
int c = oldStream.read();
|
||||
while (c != -1) {
|
||||
old.write(c);
|
||||
c = oldStream.read();
|
||||
}
|
||||
//return out.toByteArray();
|
||||
oldStream.close();
|
||||
|
||||
} else {
|
||||
noPreviousHistory = true; // rebuild menu
|
||||
}
|
||||
|
||||
OutputStream historyStream =
|
||||
new GZIPOutputStream(new FileOutputStream(historyFile));
|
||||
|
||||
if (old != null) {
|
||||
historyStream.write(old.toByteArray());
|
||||
}
|
||||
PrintWriter historyWriter =
|
||||
new PrintWriter(new OutputStreamWriter(historyStream));
|
||||
|
||||
historyWriter.println();
|
||||
historyWriter.println(HISTORY_SEPARATOR);
|
||||
|
||||
Calendar now = Calendar.getInstance();
|
||||
// 2002 06 18 11 43 29
|
||||
// when listing, study for descrepancies.. if all are
|
||||
// 2002, then don't list the year and soforth.
|
||||
// for the other end, if all minutes are unique,
|
||||
// then don't show seconds
|
||||
int year = now.get(Calendar.YEAR);
|
||||
int month = now.get(Calendar.MONTH) + 1;
|
||||
int day = now.get(Calendar.DAY_OF_MONTH);
|
||||
int hour = now.get(Calendar.HOUR_OF_DAY);
|
||||
int minute = now.get(Calendar.MINUTE);
|
||||
int second = now.get(Calendar.SECOND);
|
||||
String parseDate = year + " " + month + " " + day + " " +
|
||||
hour + " " + minute + " " + second;
|
||||
|
||||
String readableDate = now.getTime().toString();
|
||||
|
||||
// increment this so sketchbook won't be mangled
|
||||
// each time this format has to change
|
||||
String historyVersion = "1";
|
||||
//Date date = new Date();
|
||||
//String datestamp = date.toString();
|
||||
|
||||
historyWriter.println(historyVersion + " " + modeStr + " - " +
|
||||
parseDate + " - " + readableDate);
|
||||
historyWriter.println();
|
||||
historyWriter.println(program);
|
||||
historyWriter.flush(); // ??
|
||||
lastRecorded = program;
|
||||
|
||||
//JMenuItem menuItem = new JMenuItem(modeStr + " - " + readableDate);
|
||||
JMenuItem menuItem = new JMenuItem(modeStr + " - " + readableDate);
|
||||
menuItem.addActionListener(menuListener);
|
||||
menu.insert(menuItem, 2);
|
||||
|
||||
historyWriter.flush();
|
||||
historyWriter.close();
|
||||
|
||||
if (noPreviousHistory) {
|
||||
// to get add the actual menu, to get the 'clear' item in there
|
||||
//rebuildMenu(historyFile.getPath());
|
||||
rebuildMenu();
|
||||
}
|
||||
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void retrieve(String selection) {
|
||||
//System.out.println("sel '" + selection + "'");
|
||||
String readableDate =
|
||||
selection.substring(selection.indexOf("-") + 2);
|
||||
|
||||
// make history for the current guy
|
||||
record(editor.textarea.getText(), AUTOSAVE);
|
||||
// mark editor text as having been edited
|
||||
|
||||
try {
|
||||
BufferedReader reader = new BufferedReader(new InputStreamReader(new GZIPInputStream(new FileInputStream(historyFile))));
|
||||
String line = null;
|
||||
|
||||
int historyCount = 0;
|
||||
String historyList[] = new String[100];
|
||||
|
||||
try {
|
||||
boolean found = false;
|
||||
while ((line = reader.readLine()) != null) {
|
||||
//System.out.println("->" + line);
|
||||
if (line.equals(HISTORY_SEPARATOR)) {
|
||||
line = reader.readLine();
|
||||
if (line.indexOf(readableDate) != -1) { // this is the one
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (found) {
|
||||
// read lines until the next separator
|
||||
line = reader.readLine(); // ignored
|
||||
//String sep = System.getProperty("line.separator");
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
while ((line = reader.readLine()) != null) {
|
||||
if (line.equals(HISTORY_SEPARATOR)) break;
|
||||
//textarea.append(line + sep);
|
||||
//buffer.append(line + sep); // JTextPane wants only \n going in
|
||||
buffer.append(line + "\n");
|
||||
//System.out.println("'" + line + "'");
|
||||
}
|
||||
//textarea.editorSetText(buffer.toString());
|
||||
editor.changeText(buffer.toString(), true);
|
||||
lastRecorded = editor.textarea.getText();
|
||||
editor.setSketchModified(false);
|
||||
|
||||
} else {
|
||||
System.err.println("couldn't find history entry for " +
|
||||
"'" + readableDate + "'");
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// class HistoryMenuListener implements ActionListener {
|
||||
// public void actionPerformed(ActionEvent e) {
|
||||
// editor.selectHistory(e.getActionCommand);
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
//public void rebuildHistoryMenu(String path) {
|
||||
//rebuildHistoryMenu(historyMenu, path);
|
||||
//}
|
||||
|
||||
|
||||
//public void rebuildHistoryMenu(Menu menu, String path) {
|
||||
public void rebuildMenu() { //String path) {
|
||||
//if (!recordingHistory) return;
|
||||
//if (!Preferences.getBoolean("history.recording")) return;
|
||||
|
||||
menu.removeAll();
|
||||
|
||||
//File hfile = new File(path);
|
||||
//if (!hfile.exists()) return; // no history yet
|
||||
if (!historyFile.exists()) return;
|
||||
|
||||
JMenuItem item = new JMenuItem("Clear History");
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
if (!historyFile.delete()) {
|
||||
//System.err.println("couldn't erase history");
|
||||
Base.showWarning("History Problem",
|
||||
"Could not erase history", null);
|
||||
}
|
||||
rebuildMenu();
|
||||
//SketchHistory.this.rebuildMenu(historyFile.getPath());
|
||||
}
|
||||
});
|
||||
menu.add(item);
|
||||
menu.addSeparator();
|
||||
|
||||
try {
|
||||
BufferedReader reader = new BufferedReader(new InputStreamReader(new GZIPInputStream(new FileInputStream(historyFile))));
|
||||
String line = null;
|
||||
|
||||
int historyCount = 0;
|
||||
String historyList[] = new String[100];
|
||||
|
||||
try {
|
||||
while ((line = reader.readLine()) != null) {
|
||||
//while (line = reader.readLine()) {
|
||||
//while (true) { line = reader.readLine();
|
||||
//if (line == null) continue;
|
||||
//System.out.println("line: " + line);
|
||||
if (line.equals(HISTORY_SEPARATOR)) {
|
||||
// next line is the good stuff
|
||||
line = reader.readLine();
|
||||
int version =
|
||||
Integer.parseInt(line.substring(0, line.indexOf(' ')));
|
||||
if (version == 1) {
|
||||
String whysub = line.substring(2); // after "1 "
|
||||
String why = whysub.substring(0, whysub.indexOf(" -"));
|
||||
//System.out.println("'" + why + "'");
|
||||
|
||||
String readable = line.substring(line.lastIndexOf("-") + 2);
|
||||
if (historyList.length == historyCount) {
|
||||
String temp[] = new String[historyCount*2];
|
||||
System.arraycopy(historyList, 0, temp, 0, historyCount);
|
||||
historyList = temp;
|
||||
}
|
||||
historyList[historyCount++] = why + " - " + readable;
|
||||
|
||||
} // otherwise don't know what to do
|
||||
}
|
||||
}
|
||||
//System.out.println(line);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
// add the items to the menu in reverse order
|
||||
|
||||
//ActionListener historyMenuListener =
|
||||
// new ActionListener() {
|
||||
// public void actionPerformed(ActionEvent e) {
|
||||
// editor.retrieveHistory(e.getActionCommand());
|
||||
//}
|
||||
//};
|
||||
|
||||
for (int i = historyCount-1; i >= 0; --i) {
|
||||
JMenuItem mi = new JMenuItem(historyList[i]);
|
||||
mi.addActionListener(menuListener);
|
||||
menu.add(mi);
|
||||
}
|
||||
|
||||
reader.close();
|
||||
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
*/
|
@ -1,683 +0,0 @@
|
||||
/* -*- mode: jde; c-basic-offset: 2; indent-tabs-mode: nil -*- */
|
||||
|
||||
/*
|
||||
Part of the Processing project - http://processing.org
|
||||
|
||||
Copyright (c) 2004-05 Ben Fry and Casey Reas
|
||||
Copyright (c) 2001-04 Massachusetts Institute of Technology
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
package processing.app;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
import java.io.*;
|
||||
import java.net.*;
|
||||
import java.text.*;
|
||||
import java.util.*;
|
||||
import java.util.zip.*;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.event.*;
|
||||
import javax.swing.text.*;
|
||||
import javax.swing.undo.*;
|
||||
|
||||
import com.apple.mrj.*;
|
||||
|
||||
|
||||
/**
|
||||
* Handles sketchbook mechanics for the sketch menu and file I/O.
|
||||
*/
|
||||
public class Sketchbook {
|
||||
Editor editor;
|
||||
|
||||
JMenu openMenu;
|
||||
JMenu popupMenu;
|
||||
//JMenu examples;
|
||||
JMenu importMenu;
|
||||
|
||||
// set to true after the first time it's built.
|
||||
// so that the errors while building don't show up again.
|
||||
boolean builtOnce;
|
||||
|
||||
//File sketchbookFolder;
|
||||
//String sketchbookPath; // canonical path
|
||||
|
||||
// last file/directory used for file opening
|
||||
//String handleOpenDirectory;
|
||||
// opted against this.. in imovie, apple always goes
|
||||
// to the "Movies" folder, even if that wasn't the last used
|
||||
|
||||
// these are static because they're used by Sketch
|
||||
static File examplesFolder;
|
||||
static String examplesPath; // canonical path (for comparison)
|
||||
|
||||
static File librariesFolder;
|
||||
static String librariesPath;
|
||||
|
||||
// maps imported packages to their library folder
|
||||
static Hashtable importToLibraryTable = new Hashtable();
|
||||
|
||||
// classpath for all known libraries for p5
|
||||
// (both those in the p5/libs folder and those with lib subfolders
|
||||
// found in the sketchbook)
|
||||
static String librariesClassPath;
|
||||
|
||||
|
||||
public Sketchbook(Editor editor) {
|
||||
this.editor = editor;
|
||||
|
||||
// this shouldn't change throughout.. it may as well be static
|
||||
// but only one instance of sketchbook will be built so who cares
|
||||
examplesFolder = new File(System.getProperty("user.dir"), "examples");
|
||||
examplesPath = examplesFolder.getAbsolutePath();
|
||||
|
||||
librariesFolder = new File(System.getProperty("user.dir"),
|
||||
"hardware" + File.separator + "libraries");
|
||||
librariesPath = librariesFolder.getAbsolutePath();
|
||||
|
||||
String sketchbookPath = Preferences.get("sketchbook.path");
|
||||
|
||||
// if a value is at least set, first check to see if the
|
||||
// folder exists. if it doesn't, warn the user that the
|
||||
// sketchbook folder is being reset.
|
||||
if (sketchbookPath != null) {
|
||||
File skechbookFolder = new File(sketchbookPath);
|
||||
if (!skechbookFolder.exists()) {
|
||||
Base.showWarning("Sketchbook folder disappeared",
|
||||
"The sketchbook folder no longer exists,\n" +
|
||||
"so a new sketchbook will be created in the\n" +
|
||||
"default location.", null);
|
||||
sketchbookPath = null;
|
||||
}
|
||||
}
|
||||
|
||||
if (sketchbookPath == null) {
|
||||
// by default, set default sketchbook path to the user's
|
||||
// home folder with 'sketchbook' as a subdirectory of that
|
||||
|
||||
/*
|
||||
File home = new File(System.getProperty("user.home"));
|
||||
|
||||
if (Base.platform == Base.MACOSX) {
|
||||
// on macosx put the sketchbook in the "Documents" folder
|
||||
home = new File(home, "Documents");
|
||||
|
||||
} else if (Base.platform == Base.WINDOWS) {
|
||||
// on windows put the sketchbook in the "My Documents" folder
|
||||
home = new File(home, "My Documents");
|
||||
}
|
||||
*/
|
||||
|
||||
// use a subfolder called 'sketchbook'
|
||||
//File home = Preferences.getProcessingHome();
|
||||
//String folderName = Preferences.get("sketchbook.name.default");
|
||||
//File sketchbookFolder = new File(home, folderName);
|
||||
|
||||
//System.out.println("resetting sketchbook path");
|
||||
File sketchbookFolder = Base.getDefaultSketchbookFolder();
|
||||
//System.out.println("default is " + sketchbookFolder);
|
||||
Preferences.set("sketchbook.path",
|
||||
sketchbookFolder.getAbsolutePath());
|
||||
|
||||
if (!sketchbookFolder.exists()) sketchbookFolder.mkdirs();
|
||||
}
|
||||
openMenu = new JMenu("Sketchbook");
|
||||
popupMenu = new JMenu("Sketchbook");
|
||||
importMenu = new JMenu("Import Library");
|
||||
}
|
||||
|
||||
|
||||
static public String getSketchbookPath() {
|
||||
return Preferences.get("sketchbook.path");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Handle creating a sketch folder, return its base .pde file
|
||||
* or null if the operation was cancelled.
|
||||
*/
|
||||
public String handleNew(boolean noPrompt,
|
||||
boolean shift,
|
||||
boolean library) throws IOException {
|
||||
File newbieDir = null;
|
||||
String newbieName = null;
|
||||
|
||||
boolean prompt = Preferences.getBoolean("sketchbook.prompt");
|
||||
if (shift) prompt = !prompt; // reverse behavior if shift is down
|
||||
|
||||
// no sketch has been started, don't prompt for the name if it's
|
||||
// starting up, just make the farker. otherwise if the person hits
|
||||
// 'cancel' i'd have to add a thing to make p5 quit, which is silly.
|
||||
// instead give them an empty sketch, and they can look at examples.
|
||||
// i hate it when imovie makes you start with that goofy dialog box.
|
||||
// unless, ermm, they user tested it and people preferred that as
|
||||
// a way to get started. shite. now i hate myself.
|
||||
//
|
||||
if (noPrompt) prompt = false;
|
||||
|
||||
if (prompt) {
|
||||
// prompt for the filename and location for the new sketch
|
||||
FileDialog fd = new FileDialog(editor,
|
||||
"Create sketch folder named:",
|
||||
FileDialog.SAVE);
|
||||
fd.setDirectory(getSketchbookPath());
|
||||
fd.show();
|
||||
|
||||
String newbieParentDir = fd.getDirectory();
|
||||
newbieName = fd.getFile();
|
||||
if (newbieName == null) return null;
|
||||
|
||||
newbieName = sanitizeName(newbieName);
|
||||
newbieDir = new File(newbieParentDir, newbieName);
|
||||
|
||||
} else {
|
||||
// use a generic name like sketch_031008a, the date plus a char
|
||||
String newbieParentDir = getSketchbookPath();
|
||||
|
||||
int index = 0;
|
||||
SimpleDateFormat formatter = new SimpleDateFormat("yyMMdd");
|
||||
String purty = formatter.format(new Date());
|
||||
do {
|
||||
newbieName = "sketch_" + purty + ((char) ('a' + index));
|
||||
newbieDir = new File(newbieParentDir, newbieName);
|
||||
index++;
|
||||
} while (newbieDir.exists());
|
||||
}
|
||||
|
||||
// make the directory for the new sketch
|
||||
newbieDir.mkdirs();
|
||||
|
||||
// if it's a library, make a library subfolder to tag it as such
|
||||
if (library) {
|
||||
new File(newbieDir, "library").mkdirs();
|
||||
}
|
||||
|
||||
// make an empty pde file
|
||||
File newbieFile = new File(newbieDir, newbieName + ".pde");
|
||||
new FileOutputStream(newbieFile); // create the file
|
||||
|
||||
// TODO this wouldn't be needed if i could figure out how to
|
||||
// associate document icons via a dot-extension/mime-type scenario
|
||||
// help me steve jobs, you're my only hope.
|
||||
|
||||
// jdk13 on osx, or jdk11
|
||||
// though apparently still available for 1.4
|
||||
if (Base.isMacOS()) {
|
||||
MRJFileUtils.setFileTypeAndCreator(newbieFile,
|
||||
MRJOSType.kTypeTEXT,
|
||||
new MRJOSType("Pde1"));
|
||||
// thank you apple, for changing this @#$)(*
|
||||
//com.apple.eio.setFileTypeAndCreator(String filename, int, int)
|
||||
}
|
||||
|
||||
// make a note of a newly added sketch in the sketchbook menu
|
||||
rebuildMenusAsync();
|
||||
|
||||
// now open it up
|
||||
//handleOpen(newbieName, newbieFile, newbieDir);
|
||||
//return newSketch;
|
||||
return newbieFile.getAbsolutePath();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Convert to sanitized name and alert the user
|
||||
* if changes were made.
|
||||
*/
|
||||
static public String sanitizeName(String origName) {
|
||||
String newName = sanitizedName(origName);
|
||||
|
||||
if (!newName.equals(origName)) {
|
||||
Base.showMessage("Naming issue",
|
||||
"The sketch name had to be modified.\n" +
|
||||
"You can only use basic letters and numbers\n" +
|
||||
"to name a sketch (ascii only and no spaces,\n" +
|
||||
"it can't start with a number, and should be\n" +
|
||||
"less than 64 characters long)");
|
||||
}
|
||||
return newName;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return true if the name is valid for a Processing sketch.
|
||||
*/
|
||||
static public boolean isSanitary(String name) {
|
||||
return sanitizedName(name).equals(name);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Produce a sanitized name that fits our standards for likely to work.
|
||||
* <p/>
|
||||
* Java classes have a wider range of names that are technically allowed
|
||||
* (supposedly any Unicode name) than what we support. The reason for
|
||||
* going more narrow is to avoid situations with text encodings and
|
||||
* converting during the process of moving files between operating
|
||||
* systems, i.e. uploading from a Windows machine to a Linux server,
|
||||
* or reading a FAT32 partition in OS X and using a thumb drive.
|
||||
* <p/>
|
||||
* This helper function replaces everything but A-Z, a-z, and 0-9 with
|
||||
* underscores. Also disallows starting the sketch name with a digit.
|
||||
*/
|
||||
static public String sanitizedName(String origName) {
|
||||
char c[] = origName.toCharArray();
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
|
||||
// can't lead with a digit, so start with an underscore
|
||||
if ((c[0] >= '0') && (c[0] <= '9')) {
|
||||
buffer.append('_');
|
||||
}
|
||||
for (int i = 0; i < c.length; i++) {
|
||||
if (((c[i] >= '0') && (c[i] <= '9')) ||
|
||||
((c[i] >= 'a') && (c[i] <= 'z')) ||
|
||||
((c[i] >= 'A') && (c[i] <= 'Z'))) {
|
||||
buffer.append(c[i]);
|
||||
|
||||
} else {
|
||||
buffer.append('_');
|
||||
}
|
||||
}
|
||||
// let's not be ridiculous about the length of filenames.
|
||||
// in fact, Mac OS 9 can handle 255 chars, though it can't really
|
||||
// deal with filenames longer than 31 chars in the Finder.
|
||||
// but limiting to that for sketches would mean setting the
|
||||
// upper-bound on the character limit here to 25 characters
|
||||
// (to handle the base name + ".class")
|
||||
if (buffer.length() > 63) {
|
||||
buffer.setLength(63);
|
||||
}
|
||||
return buffer.toString();
|
||||
}
|
||||
|
||||
|
||||
public String handleOpen() {
|
||||
// swing's file choosers are ass ugly, so we use the
|
||||
// native (awt peered) dialogs where possible
|
||||
FileDialog fd = new FileDialog(editor, //new Frame(),
|
||||
"Open a Processing sketch...",
|
||||
FileDialog.LOAD);
|
||||
//fd.setDirectory(Preferences.get("sketchbook.path"));
|
||||
//fd.setDirectory(getSketchbookPath());
|
||||
|
||||
// only show .pde files as eligible bachelors
|
||||
// TODO this doesn't seem to ever be used. AWESOME.
|
||||
fd.setFilenameFilter(new FilenameFilter() {
|
||||
public boolean accept(File dir, String name) {
|
||||
//System.out.println("check filter on " + dir + " " + name);
|
||||
return name.toLowerCase().endsWith(".pde");
|
||||
}
|
||||
});
|
||||
|
||||
// gimme some money
|
||||
fd.show();
|
||||
|
||||
// what in the hell yu want, boy?
|
||||
String directory = fd.getDirectory();
|
||||
String filename = fd.getFile();
|
||||
|
||||
// user cancelled selection
|
||||
if (filename == null) return null;
|
||||
|
||||
// this may come in handy sometime
|
||||
//handleOpenDirectory = directory;
|
||||
|
||||
File selection = new File(directory, filename);
|
||||
return selection.getAbsolutePath();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Asynchronous version of menu rebuild to be used on 'new' and 'save',
|
||||
* to prevent the interface from locking up until the menus are done.
|
||||
*/
|
||||
public void rebuildMenusAsync() {
|
||||
// disabling the async option for actual release, this hasn't been tested
|
||||
/*
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
public void run() {
|
||||
rebuildMenus();
|
||||
}
|
||||
});
|
||||
*/
|
||||
rebuildMenus();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Rebuild the menu full of sketches based on the
|
||||
* contents of the sketchbook.
|
||||
*
|
||||
* Creates a separate JMenu object for the popup,
|
||||
* because it seems that after calling "getPopupMenu"
|
||||
* the menu will disappear from its original location.
|
||||
*/
|
||||
public void rebuildMenus() {
|
||||
//EditorConsole.systemOut.println("rebuilding menus");
|
||||
try {
|
||||
// rebuild file/open and the toolbar popup menus
|
||||
buildMenu(openMenu);
|
||||
builtOnce = true; // disable error messages while loading
|
||||
buildMenu(popupMenu);
|
||||
|
||||
// rebuild the "import library" menu
|
||||
librariesClassPath = "";
|
||||
importMenu.removeAll();
|
||||
/*
|
||||
if (addLibraries(importMenu, new File(getSketchbookPath()))) {
|
||||
importMenu.addSeparator();
|
||||
}
|
||||
*/
|
||||
if (addLibraries(importMenu, examplesFolder)) {
|
||||
importMenu.addSeparator();
|
||||
}
|
||||
addLibraries(importMenu, librariesFolder);
|
||||
//System.out.println("libraries cp is now " + librariesClassPath);
|
||||
|
||||
} catch (IOException e) {
|
||||
Base.showWarning("Problem while building sketchbook menu",
|
||||
"There was a problem with building the\n" +
|
||||
"sketchbook menu. Things might get a little\n" +
|
||||
"kooky around here.", e);
|
||||
}
|
||||
//EditorConsole.systemOut.println("done rebuilding menus");
|
||||
}
|
||||
|
||||
|
||||
public void buildMenu(JMenu menu) {
|
||||
JMenuItem item;
|
||||
|
||||
// rebuild the popup menu
|
||||
menu.removeAll();
|
||||
|
||||
//item = new JMenuItem("Open...");
|
||||
item = Editor.newJMenuItem("Open...", 'O', false);
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
editor.handleOpen(null);
|
||||
}
|
||||
});
|
||||
menu.add(item);
|
||||
menu.addSeparator();
|
||||
|
||||
try {
|
||||
boolean sketches =
|
||||
addSketches(menu, new File(getSketchbookPath()));
|
||||
if (sketches) menu.addSeparator();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
ActionListener listener = new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
editor.handleOpen(e.getActionCommand());
|
||||
}
|
||||
};
|
||||
|
||||
try {
|
||||
LibraryManager libManager = new LibraryManager();
|
||||
JMenu examplesMenu = new JMenu("Examples");
|
||||
addSketches(examplesMenu, examplesFolder);
|
||||
libManager.populateExamplesMenu(examplesMenu, listener);
|
||||
menu.add(examplesMenu);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
/*
|
||||
// don't do this until it's finished
|
||||
// libraries don't show up as proper sketches anyway
|
||||
try {
|
||||
if (Preferences.getBoolean("export.library")) {
|
||||
JMenu librariesMenu = new JMenu("Libraries");
|
||||
addSketches(librariesMenu, librariesFolder);
|
||||
menu.add(librariesMenu);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
public JMenu getOpenMenu() {
|
||||
if (openMenu == null) rebuildMenus();
|
||||
return openMenu;
|
||||
}
|
||||
|
||||
|
||||
public JPopupMenu getPopupMenu() {
|
||||
if (popupMenu == null) rebuildMenus();
|
||||
return popupMenu.getPopupMenu();
|
||||
}
|
||||
|
||||
|
||||
public JMenu getImportMenu() {
|
||||
return importMenu;
|
||||
}
|
||||
|
||||
|
||||
protected boolean addSketches(JMenu menu, File folder) throws IOException {
|
||||
// skip .DS_Store files, etc
|
||||
if (!folder.isDirectory()) return false;
|
||||
|
||||
String list[] = folder.list();
|
||||
// if a bad folder or something like that, this might come back null
|
||||
if (list == null) return false;
|
||||
|
||||
// alphabetize list, since it's not always alpha order
|
||||
// replaced hella slow bubble sort with this feller for 0093
|
||||
Arrays.sort(list, String.CASE_INSENSITIVE_ORDER);
|
||||
|
||||
ActionListener listener = new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
editor.handleOpen(e.getActionCommand());
|
||||
}
|
||||
};
|
||||
|
||||
boolean ifound = false;
|
||||
|
||||
for (int i = 0; i < list.length; i++) {
|
||||
if ((list[i].charAt(0) == '.') ||
|
||||
list[i].equals("CVS")) continue;
|
||||
|
||||
File subfolder = new File(folder, list[i]);
|
||||
if (!subfolder.isDirectory()) continue;
|
||||
|
||||
File entry = new File(subfolder, list[i] + ".pde");
|
||||
// if a .pde file of the same prefix as the folder exists..
|
||||
if (entry.exists()) {
|
||||
//String sanityCheck = sanitizedName(list[i]);
|
||||
//if (!sanityCheck.equals(list[i])) {
|
||||
if (!Sketchbook.isSanitary(list[i])) {
|
||||
if (!builtOnce) {
|
||||
String complaining =
|
||||
"The sketch \"" + list[i] + "\" cannot be used.\n" +
|
||||
"Sketch names must contain only basic letters and numbers\n" +
|
||||
"(ASCII-only with no spaces, " +
|
||||
"and it cannot start with a number).\n" +
|
||||
"To get rid of this message, remove the sketch from\n" +
|
||||
entry.getAbsolutePath();
|
||||
Base.showMessage("Ignoring sketch with bad name", complaining);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
JMenuItem item = new JMenuItem(list[i]);
|
||||
item.addActionListener(listener);
|
||||
item.setActionCommand(entry.getAbsolutePath());
|
||||
menu.add(item);
|
||||
ifound = true;
|
||||
|
||||
} else {
|
||||
// not a sketch folder, but maybe a subfolder containing sketches
|
||||
JMenu submenu = new JMenu(list[i]);
|
||||
// needs to be separate var
|
||||
// otherwise would set ifound to false
|
||||
boolean found = addSketches(submenu, subfolder); //, false);
|
||||
if (found) {
|
||||
menu.add(submenu);
|
||||
ifound = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return ifound; // actually ignored, but..
|
||||
}
|
||||
|
||||
|
||||
protected boolean addLibraries(JMenu menu, File folder) throws IOException {
|
||||
// skip .DS_Store files, etc
|
||||
if (!folder.isDirectory()) return false;
|
||||
|
||||
String list[] = folder.list();
|
||||
// if a bad folder or something like that, this might come back null
|
||||
if (list == null) return false;
|
||||
|
||||
// alphabetize list, since it's not always alpha order
|
||||
// replaced hella slow bubble sort with this feller for 0093
|
||||
Arrays.sort(list, String.CASE_INSENSITIVE_ORDER);
|
||||
|
||||
ActionListener listener = new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
editor.sketch.importLibrary(e.getActionCommand());
|
||||
}
|
||||
};
|
||||
|
||||
boolean ifound = false;
|
||||
|
||||
for (int i = 0; i < list.length; i++) {
|
||||
if ((list[i].charAt(0) == '.') ||
|
||||
list[i].equals("CVS")) continue;
|
||||
|
||||
File subfolder = new File(folder, list[i]);
|
||||
if (!subfolder.isDirectory()) continue;
|
||||
|
||||
//File exported = new File(subfolder, "library");
|
||||
//File entry = new File(exported, list[i] + ".o");
|
||||
FileFilter onlyHFiles = new FileFilter() {
|
||||
public boolean accept(File file) {
|
||||
return (file.getName()).endsWith(".h");
|
||||
}
|
||||
};
|
||||
|
||||
// if the folder has header files
|
||||
if (subfolder.listFiles(onlyHFiles).length > 0) {
|
||||
// if a .jar file of the same prefix as the folder exists
|
||||
// inside the 'library' subfolder of the sketch
|
||||
//if (entry.exists()) {
|
||||
/*
|
||||
String sanityCheck = sanitizedName(list[i]);
|
||||
if (!sanityCheck.equals(list[i])) {
|
||||
String mess =
|
||||
"The library \"" + list[i] + "\" cannot be used.\n" +
|
||||
"Library names must contain only basic letters and numbers.\n" +
|
||||
"(ascii only and no spaces, and it cannot start with a number)";
|
||||
Base.showMessage("Ignoring bad sketch name", mess);
|
||||
continue;
|
||||
}
|
||||
*/
|
||||
/*
|
||||
// get the path for all .jar files in this code folder
|
||||
String libraryClassPath =
|
||||
Compiler.contentsToClassPath(exported);
|
||||
// grab all jars and classes from this folder,
|
||||
// and append them to the library classpath
|
||||
librariesClassPath +=
|
||||
File.pathSeparatorChar + libraryClassPath;
|
||||
// need to associate each import with a library folder
|
||||
String packages[] =
|
||||
Compiler.packageListFromClassPath(libraryClassPath);
|
||||
for (int k = 0; k < packages.length; k++) {
|
||||
//System.out.println(packages[k] + " -> " + exported);
|
||||
//String already = (String) importToLibraryTable.get(packages[k]);
|
||||
importToLibraryTable.put(packages[k], exported);
|
||||
}
|
||||
*/
|
||||
JMenuItem item = new JMenuItem(list[i]);
|
||||
item.addActionListener(listener);
|
||||
item.setActionCommand(subfolder.getAbsolutePath());
|
||||
menu.add(item);
|
||||
ifound = true;
|
||||
|
||||
} else { // not a library, but is still a folder, so recurse
|
||||
JMenu submenu = new JMenu(list[i]);
|
||||
// needs to be separate var, otherwise would set ifound to false
|
||||
boolean found = addLibraries(submenu, subfolder);
|
||||
if (found) {
|
||||
menu.add(submenu);
|
||||
ifound = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return ifound;
|
||||
/*return false;*/ }
|
||||
|
||||
|
||||
/**
|
||||
* Clear out projects that are empty.
|
||||
*/
|
||||
public void clean() {
|
||||
//if (!Preferences.getBoolean("sketchbook.auto_clean")) return;
|
||||
|
||||
File sketchbookFolder = new File(getSketchbookPath());
|
||||
if (!sketchbookFolder.exists()) return;
|
||||
|
||||
//String entries[] = new File(userPath).list();
|
||||
String entries[] = sketchbookFolder.list();
|
||||
if (entries != null) {
|
||||
for (int j = 0; j < entries.length; j++) {
|
||||
//System.out.println(entries[j] + " " + entries.length);
|
||||
if (entries[j].charAt(0) == '.') continue;
|
||||
|
||||
//File prey = new File(userPath, entries[j]);
|
||||
File prey = new File(sketchbookFolder, entries[j]);
|
||||
File pde = new File(prey, entries[j] + ".pde");
|
||||
|
||||
// make sure this is actually a sketch folder with a .pde,
|
||||
// not a .DS_Store file or another random user folder
|
||||
|
||||
if (pde.exists() &&
|
||||
(Base.calcFolderSize(prey) == 0)) {
|
||||
//System.out.println("i want to remove " + prey);
|
||||
|
||||
if (Preferences.getBoolean("sketchbook.auto_clean")) {
|
||||
Base.removeDir(prey);
|
||||
|
||||
} else { // otherwise prompt the user
|
||||
String prompt =
|
||||
"Remove empty sketch titled \"" + entries[j] + "\"?";
|
||||
|
||||
Object[] options = { "Yes", "No" };
|
||||
int result =
|
||||
JOptionPane.showOptionDialog(editor,
|
||||
prompt,
|
||||
"Housekeeping",
|
||||
JOptionPane.YES_NO_OPTION,
|
||||
JOptionPane.QUESTION_MESSAGE,
|
||||
null,
|
||||
options,
|
||||
options[0]);
|
||||
if (result == JOptionPane.YES_OPTION) {
|
||||
Base.removeDir(prey);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,131 +0,0 @@
|
||||
package processing.app;
|
||||
|
||||
import javax.swing.SwingUtilities;
|
||||
|
||||
/**
|
||||
* This is the 3rd version of SwingWorker (also known as
|
||||
* SwingWorker 3), an abstract class that you subclass to
|
||||
* perform GUI-related work in a dedicated thread. For
|
||||
* instructions on and examples of using this class, see:
|
||||
*
|
||||
* http://java.sun.com/docs/books/tutorial/uiswing/misc/threads.html
|
||||
*
|
||||
* Note that the API changed slightly in the 3rd version:
|
||||
* You must now invoke start() on the SwingWorker after
|
||||
* creating it.
|
||||
*/
|
||||
public abstract class SwingWorker {
|
||||
private Object value; // see getValue(), setValue()
|
||||
|
||||
/**
|
||||
* Class to maintain reference to current worker thread
|
||||
* under separate synchronization control.
|
||||
*/
|
||||
private static class ThreadVar {
|
||||
private Thread thread;
|
||||
ThreadVar(Thread t) { thread = t; }
|
||||
synchronized Thread get() { return thread; }
|
||||
synchronized void clear() { thread = null; }
|
||||
}
|
||||
|
||||
private ThreadVar threadVar;
|
||||
|
||||
/**
|
||||
* Get the value produced by the worker thread, or null if it
|
||||
* hasn't been constructed yet.
|
||||
*/
|
||||
protected synchronized Object getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the value produced by worker thread
|
||||
*/
|
||||
private synchronized void setValue(Object x) {
|
||||
value = x;
|
||||
}
|
||||
|
||||
/**
|
||||
* Compute the value to be returned by the <code>get</code> method.
|
||||
*/
|
||||
public abstract Object construct();
|
||||
|
||||
/**
|
||||
* Called on the event dispatching thread (not on the worker thread)
|
||||
* after the <code>construct</code> method has returned.
|
||||
*/
|
||||
public void finished() {
|
||||
}
|
||||
|
||||
/**
|
||||
* A new method that interrupts the worker thread. Call this method
|
||||
* to force the worker to stop what it's doing.
|
||||
*/
|
||||
public void interrupt() {
|
||||
Thread t = threadVar.get();
|
||||
if (t != null) {
|
||||
t.interrupt();
|
||||
}
|
||||
threadVar.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the value created by the <code>construct</code> method.
|
||||
* Returns null if either the constructing thread or the current
|
||||
* thread was interrupted before a value was produced.
|
||||
*
|
||||
* @return the value created by the <code>construct</code> method
|
||||
*/
|
||||
public Object get() {
|
||||
while (true) {
|
||||
Thread t = threadVar.get();
|
||||
if (t == null) {
|
||||
return getValue();
|
||||
}
|
||||
try {
|
||||
t.join();
|
||||
}
|
||||
catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt(); // propagate
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Start a thread that will call the <code>construct</code> method
|
||||
* and then exit.
|
||||
*/
|
||||
public SwingWorker() {
|
||||
final Runnable doFinished = new Runnable() {
|
||||
public void run() { finished(); }
|
||||
};
|
||||
|
||||
Runnable doConstruct = new Runnable() {
|
||||
public void run() {
|
||||
try {
|
||||
setValue(construct());
|
||||
}
|
||||
finally {
|
||||
threadVar.clear();
|
||||
}
|
||||
|
||||
SwingUtilities.invokeLater(doFinished);
|
||||
}
|
||||
};
|
||||
|
||||
Thread t = new Thread(doConstruct);
|
||||
threadVar = new ThreadVar(t);
|
||||
}
|
||||
|
||||
/**
|
||||
* Start the worker thread.
|
||||
*/
|
||||
public void start() {
|
||||
Thread t = threadVar.get();
|
||||
if (t != null) {
|
||||
t.start();
|
||||
}
|
||||
}
|
||||
}
|
BIN
app/lib/antlr.jar
Normal file
BIN
app/lib/antlr.jar
Normal file
Binary file not shown.
BIN
app/lib/apple.jar
Executable file
BIN
app/lib/apple.jar
Executable file
Binary file not shown.
BIN
app/lib/ecj.jar
Normal file
BIN
app/lib/ecj.jar
Normal file
Binary file not shown.
BIN
app/lib/jna.jar
Normal file
BIN
app/lib/jna.jar
Normal file
Binary file not shown.
@ -1,15 +0,0 @@
|
||||
/CSymbolTable.java/1.1.1.1/Thu Sep 22 15:32:54 2005//
|
||||
/CToken.java/1.1.1.1/Thu Sep 22 15:32:54 2005//
|
||||
/ExtendedCommonASTWithHiddenTokens.java/1.1.1.1/Thu Sep 22 15:32:55 2005//
|
||||
/LineObject.java/1.1.1.1/Thu Sep 22 15:32:55 2005//
|
||||
/Makefile/1.1.1.1/Thu Sep 22 15:32:55 2005//
|
||||
/PreprocessorInfoChannel.java/1.1.1.1/Thu Sep 22 15:32:55 2005//
|
||||
/StdCParser.g/1.1.1.1/Thu Sep 22 15:32:56 2005//
|
||||
/TNode.java/1.1.1.1/Thu Sep 22 15:32:56 2005//
|
||||
/TNodeFactory.java/1.1.1.1/Thu Sep 22 15:32:56 2005//
|
||||
/WEmitter.g/1.4/Thu Sep 22 15:32:56 2005//
|
||||
/WParser.g/1.4/Thu Sep 22 15:32:57 2005//
|
||||
/WTreeParser.g/1.2/Thu Sep 22 15:32:57 2005//
|
||||
/whitespace_test.pde/1.1.1.1/Thu Sep 22 15:32:56 2005//
|
||||
/PdePreprocessor.java/1.13/Sat Sep 24 11:26:19 2005//
|
||||
D
|
@ -1 +0,0 @@
|
||||
wiring/app/preproc
|
@ -1 +0,0 @@
|
||||
:ext:dmellis@wcvs.uniandes.edu.co:/home/cvs/cvsrep
|
@ -1,21 +0,0 @@
|
||||
int encoder = 4;
|
||||
unsigned long speed = 0;
|
||||
|
||||
void setup()
|
||||
{
|
||||
pinMode(encoder, INPUT);
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
speed = getspeed();
|
||||
delay(1000);
|
||||
}
|
||||
|
||||
unsigned long getspeed()
|
||||
{
|
||||
unsigned long duration = 0;
|
||||
duration = pulseIn(encoder, HIGH);
|
||||
return(duration);
|
||||
}
|
||||
|
@ -1,3 +0,0 @@
|
||||
void setup();
|
||||
void loop();
|
||||
unsigned long getspeed();
|
@ -1,8 +0,0 @@
|
||||
void playMessage(prog_uchar* message){
|
||||
|
||||
maxStringSize = sizeof(message); // find message size
|
||||
}
|
||||
|
||||
void loop() {
|
||||
playMessage(signMessage);
|
||||
}
|
@ -1,2 +0,0 @@
|
||||
void playMessage(prog_uchar* message);
|
||||
void loop();
|
@ -1,19 +0,0 @@
|
||||
void setup() // run once, when the sketch starts
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
void loop() // run over and over again
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
/*
|
||||
void loop(){
|
||||
if (1){
|
||||
;
|
||||
}
|
||||
else if(0){
|
||||
;
|
||||
}
|
||||
} */
|
@ -1,2 +0,0 @@
|
||||
void setup();
|
||||
void loop();
|
@ -1,132 +0,0 @@
|
||||
//
|
||||
// Continually measures temperatures at three points using the Dallas DS18B20 on three
|
||||
// separate Arduino pins.
|
||||
//
|
||||
// Uses the parasitic power mode
|
||||
//
|
||||
// Displays to a serial LCD operating at 9600 baud.
|
||||
//
|
||||
// Arduino Board DS18B20
|
||||
//
|
||||
// +5 VDC
|
||||
// |
|
||||
// 4.7K
|
||||
// 8 ---------------- |----- 2 (DQ) Note that terms 1 and 3 are grounded.
|
||||
//
|
||||
// 7 ---- same as above
|
||||
// 6 ---- same as above
|
||||
//
|
||||
// Tx ---------------------------- To Serial LCD (LCD #117)
|
||||
//
|
||||
// Peter H Anderson, Baltimore, MD, May 5, '07
|
||||
|
||||
|
||||
void setup()
|
||||
{
|
||||
int n, dev_channel[3] = {8, 7, 6}, _1W_Pin;
|
||||
|
||||
for (n=0; n<1; n++)
|
||||
{
|
||||
_1W_Pin = dev_channel[n];
|
||||
digitalWrite(_1W_Pin, LOW);
|
||||
pinMode(_1W_Pin, INPUT); // sets the digital pin as input (logic 1)
|
||||
}
|
||||
Serial.begin(9600);
|
||||
delay(100);
|
||||
Serial.print("?B40"); // set backlight intensity
|
||||
delay(100);
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
int n, dev_channel[3] = {8, 7, 6}, _1W_Pin;
|
||||
int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;
|
||||
|
||||
for (n=0; n<3; n++)
|
||||
{
|
||||
_1W_Pin = dev_channel[n];
|
||||
OneWireReset(_1W_Pin);
|
||||
OneWireOutByte(_1W_Pin, 0xcc, 0);
|
||||
OneWireOutByte(_1W_Pin, 0x44, 1); // perform temperature conversion, strong pullup for one sec
|
||||
|
||||
OneWireReset(_1W_Pin);
|
||||
OneWireOutByte(_1W_Pin, 0xcc, 0);
|
||||
OneWireOutByte(_1W_Pin, 0xbe, 0);
|
||||
|
||||
LowByte = OneWireInByte(_1W_Pin);
|
||||
HighByte = OneWireInByte(_1W_Pin);
|
||||
TReading = (HighByte << 8) + LowByte;
|
||||
SignBit = TReading & 0x8000; // test most sig bit
|
||||
if (SignBit) // negative
|
||||
{
|
||||
TReading = (TReading ^ 0xffff) + 1; // 2's comp
|
||||
}
|
||||
Tc_100 = (6 * TReading) + TReading / 4; // multiply by (100 * 0.0625) or 6.25
|
||||
|
||||
Whole = Tc_100 / 100; // separate off the whole and fractional portions
|
||||
Fract = Tc_100 % 100;
|
||||
|
||||
if (n==0) // if its the first time, clear the LCD
|
||||
{
|
||||
Serial.print("?f");
|
||||
delay(100);
|
||||
}
|
||||
|
||||
if (SignBit) // If its negative
|
||||
{
|
||||
Serial.print("-");
|
||||
}
|
||||
Serial.print(Whole);
|
||||
Serial.print(".");
|
||||
if (Fract < 10)
|
||||
{
|
||||
Serial.print("0");
|
||||
}
|
||||
Serial.print(Fract);
|
||||
Serial.print("?n");
|
||||
}
|
||||
delay(5000); // 5 second delay. Adjust as necessary
|
||||
}
|
||||
|
||||
void OneWireReset(int _1W_Pin) // reset. Should improve to act as a presence pulse
|
||||
{
|
||||
digitalWrite(_1W_Pin, LOW);
|
||||
pinMode(_1W_Pin, OUTPUT); // bring low for 500 us
|
||||
delayMicroseconds(500);
|
||||
pinMode(_1W_Pin, INPUT);
|
||||
delayMicroseconds(500);
|
||||
}
|
||||
|
||||
void OneWireOutByte(int _1W_Pin, byte d, byte strong) // output byte d (least sig bit first).
|
||||
{
|
||||
byte n;
|
||||
|
||||
for(n=8; n!=0; n--)
|
||||
{
|
||||
if ((d & 0x01) == 1) // test least sig bit
|
||||
{
|
||||
digitalWrite(_1W_Pin, LOW);
|
||||
pinMode(_1W_Pin, OUTPUT);
|
||||
delayMicroseconds(5);
|
||||
pinMode(_1W_Pin, INPUT);
|
||||
delayMicroseconds(60);
|
||||
}
|
||||
else
|
||||
{
|
||||
digitalWrite(_1W_Pin, LOW);
|
||||
pinMode(_1W_Pin, OUTPUT);
|
||||
delayMicroseconds(60);
|
||||
pinMode(_1W_Pin, INPUT);
|
||||
}
|
||||
|
||||
d=d>>1; // now the next bit is in the least sig bit position.
|
||||
}
|
||||
if(strong)
|
||||
{
|
||||
digitalWrite(_1W_Pin, HIGH); // One sec of strong +5 VDC
|
||||
pinMode(_1W_Pin, OUTPUT);
|
||||
delay(1000);
|
||||
pinMode(_1W_Pin, INPUT);
|
||||
digitalWrite(_1W_Pin, LOW);
|
||||
}
|
||||
}
|
@ -1,4 +0,0 @@
|
||||
void setup();
|
||||
void loop();
|
||||
void OneWireReset(int _1W_Pin);
|
||||
void OneWireOutByte(int _1W_Pin, byte d, byte strong);
|
@ -1,16 +0,0 @@
|
||||
void setup()
|
||||
{
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
char cmd[16];
|
||||
int pin;
|
||||
pin = atoi(&cmd[1]);
|
||||
}
|
||||
|
||||
/*
|
||||
// convert string to numeric value
|
||||
int atoi(char *array) {
|
||||
}
|
||||
*/
|
@ -1,2 +0,0 @@
|
||||
void setup();
|
||||
void loop();
|
@ -1,11 +0,0 @@
|
||||
void setup()
|
||||
{
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
}
|
||||
|
||||
void foo(int x, int y, char *z)
|
||||
{
|
||||
}
|
@ -1,3 +0,0 @@
|
||||
void setup();
|
||||
void loop();
|
||||
void foo(int x, int y, char *z);
|
@ -1,35 +0,0 @@
|
||||
#include "hello" /* for blah */
|
||||
|
||||
int x[] = { 1, 2, 3 };
|
||||
int y[2] = { 1, 2 };
|
||||
|
||||
class Foo {
|
||||
public:
|
||||
Foo();
|
||||
Foo(int x);
|
||||
int bar() { return x; }
|
||||
private:
|
||||
int x;
|
||||
};
|
||||
|
||||
Foo::Foo(int x) : x(x) {}
|
||||
|
||||
Foo::Foo() {
|
||||
x = 0;
|
||||
}
|
||||
|
||||
Foo foo(3);
|
||||
Foo bar = Foo(2);
|
||||
|
||||
void setup() {
|
||||
}
|
||||
|
||||
void
|
||||
loop (
|
||||
|
||||
)
|
||||
|
||||
|
||||
|
||||
{
|
||||
}
|
@ -1,5 +0,0 @@
|
||||
void setup();
|
||||
void
|
||||
loop (
|
||||
|
||||
);
|
@ -1,5 +0,0 @@
|
||||
abc/* def */ghi
|
||||
jkl// mno
|
||||
pqr"stu"vwx
|
||||
#yz
|
||||
123
|
@ -1,5 +0,0 @@
|
||||
abc ghi
|
||||
jkl
|
||||
pqr vwx
|
||||
|
||||
123
|
@ -1 +0,0 @@
|
||||
abc"d\nef\\\"ghi"jkl//"
|
@ -1 +0,0 @@
|
||||
abc jkl
|
@ -1 +0,0 @@
|
||||
abc"d\\nef\\\"ghi"jkl//"
|
@ -1 +0,0 @@
|
||||
abc jkl
|
@ -1 +0,0 @@
|
||||
abc"dnef\\\\\"ghi"jkl//"
|
@ -1 +0,0 @@
|
||||
abc jkl
|
@ -1 +0,0 @@
|
||||
abc'"'def'"'ghi
|
@ -1 +0,0 @@
|
||||
abc def ghi
|
@ -1,2 +0,0 @@
|
||||
# abc /* def
|
||||
ghi */ jkl
|
@ -1 +0,0 @@
|
||||
jkl
|
@ -1 +0,0 @@
|
||||
abc /* def * ghi */ jkl
|
@ -1 +0,0 @@
|
||||
abc jkl
|
@ -1 +0,0 @@
|
||||
abc /* def * ghi **/ jkl
|
@ -1 +0,0 @@
|
||||
abc jkl
|
@ -1 +0,0 @@
|
||||
abc /* def ** ghi **/ jkl
|
@ -1 +0,0 @@
|
||||
abc jkl
|
@ -1,3 +0,0 @@
|
||||
abc /* def ** ghi ***
|
||||
jkl *
|
||||
* // mno **/ pqr
|
@ -1 +0,0 @@
|
||||
abc pqr
|
@ -1,3 +0,0 @@
|
||||
abc // def /*
|
||||
ghi
|
||||
jlk // mno */
|
@ -1,3 +0,0 @@
|
||||
abc
|
||||
ghi
|
||||
jlk
|
@ -1,3 +0,0 @@
|
||||
// /* // */ "
|
||||
asdf
|
||||
// /* // */ "
|
@ -1,3 +0,0 @@
|
||||
|
||||
asdf
|
||||
|
@ -1,7 +0,0 @@
|
||||
/*
|
||||
abc
|
||||
/*
|
||||
def
|
||||
*/
|
||||
ghi
|
||||
*/
|
@ -1,3 +0,0 @@
|
||||
|
||||
ghi
|
||||
*/
|
@ -1 +0,0 @@
|
||||
abc"def//ghi"jkl
|
@ -1 +0,0 @@
|
||||
abc jkl
|
@ -1,3 +0,0 @@
|
||||
abc // def " ghi
|
||||
jkl
|
||||
mno // pqr " stu
|
@ -1,3 +0,0 @@
|
||||
abc
|
||||
jkl
|
||||
mno
|
@ -1 +0,0 @@
|
||||
abc"def\\"ghi"jkl//"
|
@ -1 +0,0 @@
|
||||
abc ghi
|
@ -1 +0,0 @@
|
||||
abc"def\"ghi"jkl
|
@ -1 +0,0 @@
|
||||
abc jkl
|
@ -1 +0,0 @@
|
||||
abc"def\\\"ghi"jkl//"
|
@ -1 +0,0 @@
|
||||
abc jkl
|
@ -1,5 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
javac -classpath ../../../build/shared/lib/oro.jar test_PdePreprocessor.java
|
||||
for i in data/t*.cpp; do echo $i; java -classpath ../../../build/shared/lib/oro.jar:. test_PdePreprocessor strip $i | diff - $i.out; done
|
||||
for i in data/foo*.cpp; do echo $i; java -classpath ../../../build/shared/lib/oro.jar:. test_PdePreprocessor prototypes $i | diff - $i.out; done
|
@ -1,44 +0,0 @@
|
||||
import java.io.Reader;
|
||||
import java.io.File;
|
||||
import java.io.FileReader;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import com.oroinc.text.regex.*;
|
||||
|
||||
public class test_PdePreprocessor {
|
||||
/************************************************************************
|
||||
Paste from PdePreprocessor.java: strip(), collapseBraces(), prototypes()
|
||||
************************************************************************/
|
||||
|
||||
public static void main(String[] args) {
|
||||
if (args.length < 2) {
|
||||
System.err.println("Usage: PreProc [strip|prototypes] <file>");
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
test_PdePreprocessor preproc = new test_PdePreprocessor();
|
||||
Reader reader = new FileReader(new File(args[1]));
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
char[] buf = new char[1024];
|
||||
int n;
|
||||
|
||||
while ((n = reader.read(buf, 0, 1024)) != -1) {
|
||||
buffer.append(buf, 0, n);
|
||||
}
|
||||
|
||||
if (args[0].equals("strip")) {
|
||||
System.out.print(preproc.strip(buffer.toString()));
|
||||
} else {
|
||||
List prototypes = preproc.prototypes(buffer.toString());
|
||||
for (int i = 0; i < prototypes.size(); i++) {
|
||||
System.out.println((String) prototypes.get(i));
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
System.err.println(e);
|
||||
}
|
||||
}
|
||||
}
|
132
app/src/antlr/ExtendedCommonASTWithHiddenTokens.java
Normal file
132
app/src/antlr/ExtendedCommonASTWithHiddenTokens.java
Normal file
@ -0,0 +1,132 @@
|
||||
package antlr;
|
||||
|
||||
/* ANTLR Translator Generator
|
||||
* Project led by Terence Parr at http://www.jGuru.com
|
||||
* Software rights: http://www.antlr.org/RIGHTS.html
|
||||
*
|
||||
* $Id: ExtendedCommonASTWithHiddenTokens.java 3419 2007-07-16 14:02:05Z fry $
|
||||
*/
|
||||
|
||||
import java.io.*;
|
||||
//import antlr.*;
|
||||
import antlr.collections.*;
|
||||
//import antlr.collections.impl.*;
|
||||
|
||||
/** A CommonAST whose initialization copies hidden token
|
||||
* information from the Token used to create a node.
|
||||
*/
|
||||
public class ExtendedCommonASTWithHiddenTokens
|
||||
extends CommonASTWithHiddenTokens {
|
||||
|
||||
public ExtendedCommonASTWithHiddenTokens() {
|
||||
super();
|
||||
}
|
||||
|
||||
public ExtendedCommonASTWithHiddenTokens(Token tok) {
|
||||
super(tok);
|
||||
}
|
||||
|
||||
public void initialize(AST ast) {
|
||||
ExtendedCommonASTWithHiddenTokens a =
|
||||
(ExtendedCommonASTWithHiddenTokens)ast;
|
||||
super.initialize(a);
|
||||
hiddenBefore = a.getHiddenBefore();
|
||||
hiddenAfter = a.getHiddenAfter();
|
||||
}
|
||||
|
||||
public String getHiddenAfterString() {
|
||||
|
||||
CommonHiddenStreamToken t;
|
||||
StringBuffer hiddenAfterString = new StringBuffer(100);
|
||||
|
||||
for ( t = hiddenAfter ; t != null ; t = t.getHiddenAfter() ) {
|
||||
hiddenAfterString.append(t.getText());
|
||||
}
|
||||
|
||||
return hiddenAfterString.toString();
|
||||
}
|
||||
|
||||
public String getHiddenBeforeString() {
|
||||
|
||||
antlr.CommonHiddenStreamToken
|
||||
child = null,
|
||||
parent = hiddenBefore;
|
||||
|
||||
// if there aren't any hidden tokens here, quietly return
|
||||
//
|
||||
if (parent == null) {
|
||||
return "";
|
||||
}
|
||||
|
||||
// traverse back to the head of the list of tokens before this node
|
||||
do {
|
||||
child = parent;
|
||||
parent = child.getHiddenBefore();
|
||||
} while (parent != null);
|
||||
|
||||
// dump that list
|
||||
|
||||
StringBuffer hiddenBeforeString = new StringBuffer(100);
|
||||
|
||||
for ( CommonHiddenStreamToken t = child; t != null ;
|
||||
t = t.getHiddenAfter() ) {
|
||||
hiddenBeforeString.append(t.getText());
|
||||
}
|
||||
|
||||
return hiddenBeforeString.toString();
|
||||
}
|
||||
|
||||
public void xmlSerializeNode(Writer out)
|
||||
throws IOException {
|
||||
StringBuffer buf = new StringBuffer(100);
|
||||
buf.append("<");
|
||||
buf.append(getClass().getName() + " ");
|
||||
|
||||
buf.append("hiddenBeforeString=\"" +
|
||||
encode(getHiddenBeforeString()) +
|
||||
"\" text=\"" + encode(getText()) + "\" type=\"" +
|
||||
getType() + "\" hiddenAfterString=\"" +
|
||||
encode(getHiddenAfterString()) + "\"/>");
|
||||
out.write(buf.toString());
|
||||
}
|
||||
|
||||
public void xmlSerializeRootOpen(Writer out)
|
||||
throws IOException {
|
||||
StringBuffer buf = new StringBuffer(100);
|
||||
buf.append("<");
|
||||
buf.append(getClass().getName() + " ");
|
||||
buf.append("hiddenBeforeString=\"" +
|
||||
encode(getHiddenBeforeString()) +
|
||||
"\" text=\"" + encode(getText()) + "\" type=\"" +
|
||||
getType() + "\" hiddenAfterString=\"" +
|
||||
encode(getHiddenAfterString()) + "\">\n");
|
||||
out.write(buf.toString());
|
||||
}
|
||||
|
||||
public void xmlSerializeRootClose(Writer out)
|
||||
throws IOException {
|
||||
out.write("</" + getClass().getName() + ">\n");
|
||||
}
|
||||
|
||||
public void xmlSerialize(Writer out) throws IOException {
|
||||
// print out this node and all siblings
|
||||
for (AST node = this;
|
||||
node != null;
|
||||
node = node.getNextSibling()) {
|
||||
if (node.getFirstChild() == null) {
|
||||
// print guts (class name, attributes)
|
||||
((BaseAST)node).xmlSerializeNode(out);
|
||||
}
|
||||
else {
|
||||
((BaseAST)node).xmlSerializeRootOpen(out);
|
||||
|
||||
// print children
|
||||
((BaseAST)node.getFirstChild()).xmlSerialize(out);
|
||||
|
||||
// print end tag
|
||||
((BaseAST)node).xmlSerializeRootClose(out);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
221
app/src/antlr/TokenStreamCopyingHiddenTokenFilter.java
Normal file
221
app/src/antlr/TokenStreamCopyingHiddenTokenFilter.java
Normal file
@ -0,0 +1,221 @@
|
||||
/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */
|
||||
|
||||
package antlr;
|
||||
//package processing.app.preproc;
|
||||
|
||||
|
||||
//import antlr.*;
|
||||
import antlr.collections.impl.BitSet;
|
||||
|
||||
/**
|
||||
* This class provides TokenStreamHiddenTokenFilters with the concept of
|
||||
* tokens which can be copied so that they are seen by both the hidden token
|
||||
* stream as well as the parser itself. This is useful when one wants to use
|
||||
* an existing parser (like the Java parser included with ANTLR) that throws
|
||||
* away some tokens to create a parse tree which can be used to spit out
|
||||
* a copy of the code with only minor modifications.
|
||||
*
|
||||
* This code is partially derived from the public domain ANLTR TokenStream
|
||||
*/
|
||||
public class TokenStreamCopyingHiddenTokenFilter
|
||||
extends TokenStreamHiddenTokenFilter
|
||||
implements TokenStream {
|
||||
|
||||
protected BitSet copyMask;
|
||||
CommonHiddenStreamToken hiddenCopy = null;
|
||||
|
||||
public TokenStreamCopyingHiddenTokenFilter(TokenStream input) {
|
||||
super(input);
|
||||
copyMask = new BitSet();
|
||||
}
|
||||
|
||||
/**
|
||||
* Indicate that all tokens of type tokenType should be copied. The copy
|
||||
* is put in the stream of hidden tokens, and the original is returned in the
|
||||
* stream of normal tokens.
|
||||
*
|
||||
* @param tokenType integer representing the token type to copied
|
||||
*/
|
||||
public void copy(int tokenType) {
|
||||
copyMask.add(tokenType);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a clone of the important parts of the given token. Note that this
|
||||
* does NOT copy the hiddenBefore and hiddenAfter fields.
|
||||
*
|
||||
* @param t token to partially clone
|
||||
* @return newly created partial clone
|
||||
*/
|
||||
public CommonHiddenStreamToken partialCloneToken(CommonHiddenStreamToken t) {
|
||||
|
||||
CommonHiddenStreamToken u = new CommonHiddenStreamToken(t.getType(),
|
||||
t.getText());
|
||||
u.setColumn(t.getColumn());
|
||||
u.setLine(t.getLine());
|
||||
u.setFilename(t.getFilename());
|
||||
|
||||
return u;
|
||||
}
|
||||
|
||||
public void linkAndCopyToken(CommonHiddenStreamToken prev,
|
||||
CommonHiddenStreamToken monitored) {
|
||||
// create a copy of the token in the lookahead for use as hidden token
|
||||
hiddenCopy = partialCloneToken(LA(1));
|
||||
|
||||
// attach copy to the previous token, whether hidden or monitored
|
||||
prev.setHiddenAfter(hiddenCopy);
|
||||
|
||||
// if previous token was hidden, set the hiddenBefore pointer of the
|
||||
// copy to point back to it
|
||||
if (prev != monitored) {
|
||||
hiddenCopy.setHiddenBefore(prev);
|
||||
}
|
||||
|
||||
// we don't want the non-hidden copy to link back to the hidden
|
||||
// copy on the next pass through this function, so we leave
|
||||
// lastHiddenToken alone
|
||||
|
||||
//System.err.println("hidden copy: " + hiddenCopy.toString());
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
private void consumeFirst() throws TokenStreamException {
|
||||
consume(); // get first token of input stream
|
||||
|
||||
// Handle situation where hidden or discarded tokens
|
||||
// appear first in input stream
|
||||
CommonHiddenStreamToken p=null;
|
||||
|
||||
// while hidden, copied, or discarded scarf tokens
|
||||
while ( hideMask.member(LA(1).getType()) ||
|
||||
discardMask.member(LA(1).getType()) ||
|
||||
copyMask.member(LA(1).getType()) ) {
|
||||
|
||||
// if we've hit one of the tokens that needs to be copied, we copy it
|
||||
// and then break out of the loop, because the parser needs to see it
|
||||
// too
|
||||
//
|
||||
if (copyMask.member(LA(1).getType())) {
|
||||
|
||||
// copy the token in the lookahead
|
||||
hiddenCopy = partialCloneToken(LA(1));
|
||||
|
||||
// if there's an existing token before this, link that and the
|
||||
// copy together
|
||||
if (p != null) {
|
||||
p.setHiddenAfter(hiddenCopy);
|
||||
hiddenCopy.setHiddenBefore(p); // double-link
|
||||
}
|
||||
|
||||
lastHiddenToken = hiddenCopy;
|
||||
if (firstHidden == null) {
|
||||
firstHidden = hiddenCopy;
|
||||
}
|
||||
|
||||
// we don't want to consume this token, because it also needs to
|
||||
// be passed through to the parser, so break out of the while look
|
||||
// entirely
|
||||
//
|
||||
break;
|
||||
} else if (hideMask.member(LA(1).getType())) {
|
||||
if (p != null) {
|
||||
p.setHiddenAfter(LA(1));
|
||||
LA(1).setHiddenBefore(p); // double-link
|
||||
}
|
||||
p = LA(1);
|
||||
|
||||
lastHiddenToken = p;
|
||||
if (firstHidden == null) {
|
||||
firstHidden = p; // record hidden token if first
|
||||
}
|
||||
}
|
||||
consume();
|
||||
}
|
||||
}
|
||||
|
||||
/** Return the next monitored token.
|
||||
* Test the token following the monitored token.
|
||||
* If following is another monitored token, save it
|
||||
* for the next invocation of nextToken (like a single
|
||||
* lookahead token) and return it then.
|
||||
* If following is unmonitored, nondiscarded (hidden)
|
||||
* channel token, add it to the monitored token.
|
||||
*
|
||||
* Note: EOF must be a monitored Token.
|
||||
*/
|
||||
public Token nextToken() throws TokenStreamException {
|
||||
// handle an initial condition; don't want to get lookahead
|
||||
// token of this splitter until first call to nextToken
|
||||
if (LA(1) == null) {
|
||||
consumeFirst();
|
||||
}
|
||||
|
||||
//System.err.println();
|
||||
|
||||
// we always consume hidden tokens after monitored, thus,
|
||||
// upon entry LA(1) is a monitored token.
|
||||
CommonHiddenStreamToken monitored = LA(1);
|
||||
|
||||
// point to hidden tokens found during last invocation
|
||||
monitored.setHiddenBefore(lastHiddenToken);
|
||||
lastHiddenToken = null;
|
||||
|
||||
// Look for hidden tokens, hook them into list emanating
|
||||
// from the monitored tokens.
|
||||
consume();
|
||||
CommonHiddenStreamToken prev = monitored;
|
||||
|
||||
// deal with as many not-purely-monitored tokens as possible
|
||||
while ( hideMask.member(LA(1).getType()) ||
|
||||
discardMask.member(LA(1).getType()) ||
|
||||
copyMask.member(LA(1).getType()) ) {
|
||||
|
||||
if (copyMask.member(LA(1).getType())) {
|
||||
|
||||
// copy the token and link it backwards
|
||||
if (hiddenCopy != null) {
|
||||
linkAndCopyToken(hiddenCopy, monitored);
|
||||
} else {
|
||||
linkAndCopyToken(prev, monitored);
|
||||
}
|
||||
|
||||
// we now need to parse it as a monitored token, so we return, which
|
||||
// avoids the consume() call at the end of this loop. the next call
|
||||
// will parse it as a monitored token.
|
||||
//System.err.println("returned: " + monitored.toString());
|
||||
return monitored;
|
||||
|
||||
} else if (hideMask.member(LA(1).getType())) {
|
||||
|
||||
// attach the hidden token to the monitored in a chain
|
||||
// link forwards
|
||||
prev.setHiddenAfter(LA(1));
|
||||
|
||||
// link backwards
|
||||
if (prev != monitored) { //hidden cannot point to monitored tokens
|
||||
LA(1).setHiddenBefore(prev);
|
||||
} else if (hiddenCopy != null) {
|
||||
hiddenCopy.setHiddenAfter(LA(1));
|
||||
LA(1).setHiddenBefore(hiddenCopy);
|
||||
hiddenCopy = null;
|
||||
}
|
||||
|
||||
//System.err.println("hidden: " + prev.getHiddenAfter().toString() + "\" after: " + prev.toString());
|
||||
prev = lastHiddenToken = LA(1);
|
||||
}
|
||||
|
||||
consume();
|
||||
}
|
||||
|
||||
// remember the last hidden token for next time around
|
||||
if (hiddenCopy != null) {
|
||||
lastHiddenToken = hiddenCopy;
|
||||
hiddenCopy = null;
|
||||
}
|
||||
|
||||
//System.err.println("returned: " + monitored.toString());
|
||||
return monitored;
|
||||
}
|
||||
}
|
1277
app/src/antlr/java/java.g
Normal file
1277
app/src/antlr/java/java.g
Normal file
File diff suppressed because it is too large
Load Diff
2002
app/src/antlr/java/java.g.java15
Normal file
2002
app/src/antlr/java/java.g.java15
Normal file
File diff suppressed because it is too large
Load Diff
326
app/src/antlr/java/java.tree.g
Normal file
326
app/src/antlr/java/java.tree.g
Normal file
@ -0,0 +1,326 @@
|
||||
package antlr;
|
||||
|
||||
|
||||
/** Java 1.3 AST Recognizer Grammar
|
||||
*
|
||||
* Author: (see java.g preamble)
|
||||
*
|
||||
* This grammar is in the PUBLIC DOMAIN
|
||||
*/
|
||||
class JavaTreeParser extends TreeParser;
|
||||
|
||||
options {
|
||||
importVocab = Java;
|
||||
}
|
||||
|
||||
compilationUnit
|
||||
: (packageDefinition)?
|
||||
(importDefinition)*
|
||||
(typeDefinition)*
|
||||
;
|
||||
|
||||
packageDefinition
|
||||
: #( PACKAGE_DEF identifier )
|
||||
;
|
||||
|
||||
importDefinition
|
||||
: #( IMPORT identifierStar )
|
||||
;
|
||||
|
||||
typeDefinition
|
||||
: #(CLASS_DEF modifiers IDENT extendsClause implementsClause objBlock )
|
||||
| #(INTERFACE_DEF modifiers IDENT extendsClause interfaceBlock )
|
||||
;
|
||||
|
||||
typeSpec
|
||||
: #(TYPE typeSpecArray)
|
||||
;
|
||||
|
||||
typeSpecArray
|
||||
: #( ARRAY_DECLARATOR typeSpecArray )
|
||||
| type
|
||||
;
|
||||
|
||||
type: identifier
|
||||
| builtInType
|
||||
;
|
||||
|
||||
builtInType
|
||||
: "void"
|
||||
| "boolean"
|
||||
| "byte"
|
||||
| "char"
|
||||
| "short"
|
||||
| "int"
|
||||
| "float"
|
||||
| "long"
|
||||
| "double"
|
||||
;
|
||||
|
||||
modifiers
|
||||
: #( MODIFIERS (modifier)* )
|
||||
;
|
||||
|
||||
modifier
|
||||
: "private"
|
||||
| "public"
|
||||
| "protected"
|
||||
| "static"
|
||||
| "transient"
|
||||
| "final"
|
||||
| "abstract"
|
||||
| "native"
|
||||
| "threadsafe"
|
||||
| "synchronized"
|
||||
| "const"
|
||||
| "volatile"
|
||||
| "strictfp"
|
||||
;
|
||||
|
||||
extendsClause
|
||||
: #(EXTENDS_CLAUSE (identifier)* )
|
||||
;
|
||||
|
||||
implementsClause
|
||||
: #(IMPLEMENTS_CLAUSE (identifier)* )
|
||||
;
|
||||
|
||||
|
||||
interfaceBlock
|
||||
: #( OBJBLOCK
|
||||
( methodDecl
|
||||
| variableDef
|
||||
)*
|
||||
)
|
||||
;
|
||||
|
||||
objBlock
|
||||
: #( OBJBLOCK
|
||||
( ctorDef
|
||||
| methodDef
|
||||
| variableDef
|
||||
| typeDefinition
|
||||
| #(STATIC_INIT slist)
|
||||
| #(INSTANCE_INIT slist)
|
||||
)*
|
||||
)
|
||||
;
|
||||
|
||||
ctorDef
|
||||
: #(CTOR_DEF modifiers methodHead (slist)?)
|
||||
;
|
||||
|
||||
methodDecl
|
||||
: #(METHOD_DEF modifiers typeSpec methodHead)
|
||||
;
|
||||
|
||||
methodDef
|
||||
: #(METHOD_DEF modifiers typeSpec methodHead (slist)?)
|
||||
;
|
||||
|
||||
variableDef
|
||||
: #(VARIABLE_DEF modifiers typeSpec variableDeclarator varInitializer)
|
||||
;
|
||||
|
||||
parameterDef
|
||||
: #(PARAMETER_DEF modifiers typeSpec IDENT )
|
||||
;
|
||||
|
||||
objectinitializer
|
||||
: #(INSTANCE_INIT slist)
|
||||
;
|
||||
|
||||
variableDeclarator
|
||||
: IDENT
|
||||
| LBRACK variableDeclarator
|
||||
;
|
||||
|
||||
varInitializer
|
||||
: #(ASSIGN initializer)
|
||||
|
|
||||
;
|
||||
|
||||
initializer
|
||||
: expression
|
||||
| arrayInitializer
|
||||
;
|
||||
|
||||
arrayInitializer
|
||||
: #(ARRAY_INIT (initializer)*)
|
||||
;
|
||||
|
||||
methodHead
|
||||
: IDENT #( PARAMETERS (parameterDef)* ) (throwsClause)?
|
||||
;
|
||||
|
||||
throwsClause
|
||||
: #( "throws" (identifier)* )
|
||||
;
|
||||
|
||||
identifier
|
||||
: IDENT
|
||||
| #( DOT identifier IDENT )
|
||||
;
|
||||
|
||||
identifierStar
|
||||
: IDENT
|
||||
| #( DOT identifier (STAR|IDENT) )
|
||||
;
|
||||
|
||||
slist
|
||||
: #( SLIST (stat)* )
|
||||
;
|
||||
|
||||
stat: typeDefinition
|
||||
| variableDef
|
||||
| expression
|
||||
| #(LABELED_STAT IDENT stat)
|
||||
| #("if" expression stat (stat)? )
|
||||
| #( "for"
|
||||
#(FOR_INIT (variableDef | elist)?)
|
||||
#(FOR_CONDITION (expression)?)
|
||||
#(FOR_ITERATOR (elist)?)
|
||||
stat
|
||||
)
|
||||
| #("while" expression stat)
|
||||
| #("do" stat expression)
|
||||
| #("break" (IDENT)? )
|
||||
| #("continue" (IDENT)? )
|
||||
| #("return" (expression)? )
|
||||
| #("switch" expression (caseGroup)*)
|
||||
| #("throw" expression)
|
||||
| #("synchronized" expression stat)
|
||||
| tryBlock
|
||||
| slist // nested SLIST
|
||||
// uncomment to make assert JDK 1.4 stuff work
|
||||
| #("assert" expression (expression)?)
|
||||
| EMPTY_STAT
|
||||
;
|
||||
|
||||
caseGroup
|
||||
: #(CASE_GROUP (#("case" expression) | "default")+ slist)
|
||||
;
|
||||
|
||||
tryBlock
|
||||
: #( "try" slist (handler)* (#("finally" slist))? )
|
||||
;
|
||||
|
||||
handler
|
||||
: #( "catch" parameterDef slist )
|
||||
;
|
||||
|
||||
elist
|
||||
: #( ELIST (expression)* )
|
||||
;
|
||||
|
||||
expression
|
||||
: #(EXPR expr)
|
||||
;
|
||||
|
||||
expr: #(QUESTION expr expr expr) // trinary operator
|
||||
| #(ASSIGN expr expr) // binary operators...
|
||||
| #(PLUS_ASSIGN expr expr)
|
||||
| #(MINUS_ASSIGN expr expr)
|
||||
| #(STAR_ASSIGN expr expr)
|
||||
| #(DIV_ASSIGN expr expr)
|
||||
| #(MOD_ASSIGN expr expr)
|
||||
| #(SR_ASSIGN expr expr)
|
||||
| #(BSR_ASSIGN expr expr)
|
||||
| #(SL_ASSIGN expr expr)
|
||||
| #(BAND_ASSIGN expr expr)
|
||||
| #(BXOR_ASSIGN expr expr)
|
||||
| #(BOR_ASSIGN expr expr)
|
||||
| #(LOR expr expr)
|
||||
| #(LAND expr expr)
|
||||
| #(BOR expr expr)
|
||||
| #(BXOR expr expr)
|
||||
| #(BAND expr expr)
|
||||
| #(NOT_EQUAL expr expr)
|
||||
| #(EQUAL expr expr)
|
||||
| #(LT expr expr)
|
||||
| #(GT expr expr)
|
||||
| #(LE expr expr)
|
||||
| #(GE expr expr)
|
||||
| #(SL expr expr)
|
||||
| #(SR expr expr)
|
||||
| #(BSR expr expr)
|
||||
| #(PLUS expr expr)
|
||||
| #(MINUS expr expr)
|
||||
| #(DIV expr expr)
|
||||
| #(MOD expr expr)
|
||||
| #(STAR expr expr)
|
||||
| #(INC expr)
|
||||
| #(DEC expr)
|
||||
| #(POST_INC expr)
|
||||
| #(POST_DEC expr)
|
||||
| #(BNOT expr)
|
||||
| #(LNOT expr)
|
||||
| #("instanceof" expr expr)
|
||||
| #(UNARY_MINUS expr)
|
||||
| #(UNARY_PLUS expr)
|
||||
| primaryExpression
|
||||
;
|
||||
|
||||
primaryExpression
|
||||
: IDENT
|
||||
| #( DOT
|
||||
( expr
|
||||
( IDENT
|
||||
| arrayIndex
|
||||
| "this"
|
||||
| "class"
|
||||
| #( "new" IDENT elist )
|
||||
| "super"
|
||||
)
|
||||
| #(ARRAY_DECLARATOR typeSpecArray)
|
||||
| builtInType ("class")?
|
||||
)
|
||||
)
|
||||
| arrayIndex
|
||||
| #(METHOD_CALL primaryExpression elist)
|
||||
| ctorCall
|
||||
| #(TYPECAST typeSpec expr)
|
||||
| newExpression
|
||||
| constant
|
||||
| "super"
|
||||
| "true"
|
||||
| "false"
|
||||
| "this"
|
||||
| "null"
|
||||
| typeSpec // type name used with instanceof
|
||||
;
|
||||
|
||||
ctorCall
|
||||
: #( CTOR_CALL elist )
|
||||
| #( SUPER_CTOR_CALL
|
||||
( elist
|
||||
| primaryExpression elist
|
||||
)
|
||||
)
|
||||
;
|
||||
|
||||
arrayIndex
|
||||
: #(INDEX_OP expr expression)
|
||||
;
|
||||
|
||||
constant
|
||||
: NUM_INT
|
||||
| CHAR_LITERAL
|
||||
| STRING_LITERAL
|
||||
| NUM_FLOAT
|
||||
| NUM_DOUBLE
|
||||
| NUM_LONG
|
||||
;
|
||||
|
||||
newExpression
|
||||
: #( "new" type
|
||||
( newArrayDeclarator (arrayInitializer)?
|
||||
| elist (objBlock)?
|
||||
)
|
||||
)
|
||||
|
||||
;
|
||||
|
||||
newArrayDeclarator
|
||||
: #( ARRAY_DECLARATOR (newArrayDeclarator)? (expression)? )
|
||||
;
|
2091
app/src/processing/app/Base.java
Normal file
2091
app/src/processing/app/Base.java
Normal file
File diff suppressed because it is too large
Load Diff
297
app/src/processing/app/Commander.java.disabled
Normal file
297
app/src/processing/app/Commander.java.disabled
Normal file
@ -0,0 +1,297 @@
|
||||
/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */
|
||||
|
||||
/*
|
||||
Part of the Processing project - http://processing.org
|
||||
|
||||
Copyright (c) 2008 Ben Fry and Casey Reas
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
package processing.app;
|
||||
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.PrintStream;
|
||||
|
||||
import processing.core.PApplet;
|
||||
|
||||
import processing.app.debug.*;
|
||||
|
||||
|
||||
/**
|
||||
* Class to handle running Processing from the command line.
|
||||
* <PRE>
|
||||
* --help Show the help text.
|
||||
*
|
||||
* --sketch=<name&rt; Specify the sketch folder (required)
|
||||
* --output=<name&rt; Specify the output folder (required and
|
||||
* cannot be the same as the sketch folder.)
|
||||
*
|
||||
* --preprocess Preprocess a sketch into .java files.
|
||||
* --build Preprocess and compile a sketch into .class files.
|
||||
* --run Preprocess, compile, and run a sketch.
|
||||
* --present Preprocess, compile, and run a sketch full screen.
|
||||
*
|
||||
* --export-applet Export an applet.
|
||||
* --export-application Export an application.
|
||||
* --platform Specify the platform (export to application only).
|
||||
* Should be one of 'windows', 'macosx', or 'linux'.
|
||||
*
|
||||
* --preferences=<file&rt; Specify a preferences file to use (optional).
|
||||
* </PRE>
|
||||
*
|
||||
* To build the command line version, first build for your platform,
|
||||
* then cd to processing/build/cmd and type 'dist.sh'. This will create a
|
||||
* usable installation plus a zip file of the same.
|
||||
*
|
||||
* @author fry
|
||||
*/
|
||||
public class Commander implements RunnerListener {
|
||||
static final String helpArg = "--help";
|
||||
static final String preprocArg = "--preprocess";
|
||||
static final String buildArg = "--build";
|
||||
static final String runArg = "--run";
|
||||
static final String presentArg = "--present";
|
||||
static final String sketchArg = "--sketch=";
|
||||
static final String outputArg = "--output=";
|
||||
static final String exportAppletArg = "--export-applet";
|
||||
static final String exportApplicationArg = "--export-application";
|
||||
static final String platformArg = "--platform=";
|
||||
static final String preferencesArg = "--preferences=";
|
||||
|
||||
static final int HELP = -1;
|
||||
static final int PREPROCESS = 0;
|
||||
static final int BUILD = 1;
|
||||
static final int RUN = 2;
|
||||
static final int PRESENT = 3;
|
||||
static final int EXPORT_APPLET = 4;
|
||||
static final int EXPORT_APPLICATION = 5;
|
||||
|
||||
Sketch sketch;
|
||||
|
||||
|
||||
static public void main(String[] args) {
|
||||
// init the platform so that prefs and other native code is ready to go
|
||||
Base.initPlatform();
|
||||
// make sure a full JDK is installed
|
||||
Base.initRequirements();
|
||||
// run static initialization that grabs all the prefs
|
||||
//Preferences.init(null);
|
||||
// launch command line handler
|
||||
new Commander(args);
|
||||
}
|
||||
|
||||
|
||||
public Commander(String[] args) {
|
||||
String sketchFolder = null;
|
||||
String pdePath = null; // path to the .pde file
|
||||
String outputPath = null;
|
||||
String preferencesPath = null;
|
||||
int platformIndex = PApplet.platform; // default to this platform
|
||||
int mode = HELP;
|
||||
|
||||
for (String arg : args) {
|
||||
if (arg.length() == 0) {
|
||||
// ignore it, just the crappy shell script
|
||||
|
||||
} else if (arg.equals(helpArg)) {
|
||||
// mode already set to HELP
|
||||
|
||||
} else if (arg.equals(buildArg)) {
|
||||
mode = BUILD;
|
||||
|
||||
} else if (arg.equals(runArg)) {
|
||||
mode = RUN;
|
||||
|
||||
} else if (arg.equals(presentArg)) {
|
||||
mode = PRESENT;
|
||||
|
||||
} else if (arg.equals(preprocArg)) {
|
||||
mode = PREPROCESS;
|
||||
|
||||
} else if (arg.equals(exportAppletArg)) {
|
||||
mode = EXPORT_APPLET;
|
||||
|
||||
} else if (arg.equals(exportApplicationArg)) {
|
||||
mode = EXPORT_APPLICATION;
|
||||
|
||||
} else if (arg.startsWith(platformArg)) {
|
||||
String platformStr = arg.substring(platformArg.length());
|
||||
platformIndex = Base.getPlatformIndex(platformStr);
|
||||
if (platformIndex == -1) {
|
||||
complainAndQuit(platformStr + " should instead be " +
|
||||
"'windows', 'macosx', or 'linux'.");
|
||||
}
|
||||
} else if (arg.startsWith(sketchArg)) {
|
||||
sketchFolder = arg.substring(sketchArg.length());
|
||||
File sketchy = new File(sketchFolder);
|
||||
File pdeFile = new File(sketchy, sketchy.getName() + ".pde");
|
||||
pdePath = pdeFile.getAbsolutePath();
|
||||
|
||||
} else if (arg.startsWith(outputArg)) {
|
||||
outputPath = arg.substring(outputArg.length());
|
||||
|
||||
} else {
|
||||
complainAndQuit("I don't know anything about " + arg + ".");
|
||||
}
|
||||
}
|
||||
|
||||
if ((outputPath == null) &&
|
||||
(mode == PREPROCESS || mode == BUILD ||
|
||||
mode == RUN || mode == PRESENT)) {
|
||||
complainAndQuit("An output path must be specified when using " +
|
||||
preprocArg + ", " + buildArg + ", " +
|
||||
runArg + ", or " + presentArg + ".");
|
||||
}
|
||||
|
||||
if (mode == HELP) {
|
||||
printCommandLine(System.out);
|
||||
System.exit(0);
|
||||
}
|
||||
|
||||
// --present --platform=windows "--sketch=/Applications/Processing 0148/examples/Basics/Arrays/Array" --output=test-build
|
||||
|
||||
File outputFolder = new File(outputPath);
|
||||
if (!outputFolder.exists()) {
|
||||
if (!outputFolder.mkdirs()) {
|
||||
complainAndQuit("Could not create the output folder.");
|
||||
}
|
||||
}
|
||||
|
||||
// run static initialization that grabs all the prefs
|
||||
// (also pass in a prefs path if that was specified)
|
||||
Preferences.init(preferencesPath);
|
||||
|
||||
if (sketchFolder == null) {
|
||||
complainAndQuit("No sketch path specified.");
|
||||
|
||||
} else if (outputPath.equals(pdePath)) {
|
||||
complainAndQuit("The sketch path and output path cannot be identical.");
|
||||
|
||||
} else if (!pdePath.toLowerCase().endsWith(".pde")) {
|
||||
complainAndQuit("Sketch path must point to the main .pde file.");
|
||||
|
||||
} else {
|
||||
//Sketch sketch = null;
|
||||
boolean success = false;
|
||||
|
||||
try {
|
||||
sketch = new Sketch(null, pdePath);
|
||||
if (mode == PREPROCESS) {
|
||||
success = sketch.preprocess(outputPath) != null;
|
||||
|
||||
} else if (mode == BUILD) {
|
||||
success = sketch.build(outputPath) != null;
|
||||
|
||||
} else if (mode == RUN || mode == PRESENT) {
|
||||
String className = sketch.build(outputPath);
|
||||
if (className != null) {
|
||||
success = true;
|
||||
Runner runner =
|
||||
new Runner(sketch, className, mode == PRESENT, this);
|
||||
runner.launch();
|
||||
|
||||
} else {
|
||||
success = false;
|
||||
}
|
||||
|
||||
} else if (mode == EXPORT_APPLET) {
|
||||
if (outputPath != null) {
|
||||
success = sketch.exportApplet(outputPath);
|
||||
} else {
|
||||
String target = sketchFolder + File.separatorChar + "applet";
|
||||
success = sketch.exportApplet(target);
|
||||
}
|
||||
} else if (mode == EXPORT_APPLICATION) {
|
||||
if (outputPath != null) {
|
||||
success = sketch.exportApplication(outputPath, platformIndex);
|
||||
} else {
|
||||
//String sketchFolder =
|
||||
// pdePath.substring(0, pdePath.lastIndexOf(File.separatorChar));
|
||||
outputPath =
|
||||
sketchFolder + File.separatorChar +
|
||||
"application." + Base.getPlatformName(platformIndex);
|
||||
success = sketch.exportApplication(outputPath, platformIndex);
|
||||
}
|
||||
}
|
||||
System.exit(success ? 0 : 1);
|
||||
|
||||
} catch (RunnerException re) {
|
||||
statusError(re);
|
||||
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
System.exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void statusError(String message) {
|
||||
System.err.println(message);
|
||||
}
|
||||
|
||||
|
||||
public void statusError(Exception exception) {
|
||||
if (exception instanceof RunnerException) {
|
||||
RunnerException re = (RunnerException) exception;
|
||||
|
||||
// format the runner exception like emacs
|
||||
//blah.java:2:10:2:13: Syntax Error: This is a big error message
|
||||
String filename = sketch.getCode(re.getCodeIndex()).getFileName();
|
||||
int line = re.getCodeLine();
|
||||
int column = re.getCodeColumn();
|
||||
if (column == -1) column = 0;
|
||||
// TODO if column not specified, should just select the whole line.
|
||||
System.err.println(filename + ":" +
|
||||
line + ":" + column + ":" +
|
||||
line + ":" + column + ":" + " " + re.getMessage());
|
||||
} else {
|
||||
exception.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void complainAndQuit(String lastWords) {
|
||||
printCommandLine(System.err);
|
||||
System.err.println(lastWords);
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
|
||||
static void printCommandLine(PrintStream out) {
|
||||
out.println("Processing " + Base.VERSION_NAME + " rocks the console.");
|
||||
out.println();
|
||||
out.println("--help Show this help text.");
|
||||
out.println();
|
||||
out.println("--sketch=<name> Specify the sketch folder (required)");
|
||||
out.println("--output=<name> Specify the output folder (required and");
|
||||
out.println(" cannot be the same as the sketch folder.)");
|
||||
out.println();
|
||||
out.println("--preprocess Preprocess a sketch into .java files.");
|
||||
out.println("--build Preprocess and compile a sketch into .class files.");
|
||||
out.println("--run Preprocess, compile, and run a sketch.");
|
||||
out.println("--present Preprocess, compile, and run a sketch full screen.");
|
||||
out.println();
|
||||
out.println("--export-applet Export an applet.");
|
||||
out.println("--export-application Export an application.");
|
||||
out.println("--platform Specify the platform (export to application only).");
|
||||
out.println(" Should be one of 'windows', 'macosx', or 'linux'.");
|
||||
out.println();
|
||||
out.println("--preferences=<file> Specify a preferences file to use (optional).");
|
||||
}
|
||||
}
|
2514
app/src/processing/app/Editor.java
Normal file
2514
app/src/processing/app/Editor.java
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,9 +1,9 @@
|
||||
/* -*- mode: jde; c-basic-offset: 2; indent-tabs-mode: nil -*- */
|
||||
/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */
|
||||
|
||||
/*
|
||||
Part of the Processing project - http://processing.org
|
||||
|
||||
Copyright (c) 2004-05 Ben Fry and Casey Reas
|
||||
Copyright (c) 2004-06 Ben Fry and Casey Reas
|
||||
Copyright (c) 2001-04 Massachusetts Institute of Technology
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
@ -30,6 +30,7 @@ import javax.swing.*;
|
||||
import javax.swing.text.*;
|
||||
import java.util.*;
|
||||
|
||||
|
||||
/**
|
||||
* Message console that sits below the editing area.
|
||||
* <P>
|
||||
@ -48,15 +49,18 @@ public class EditorConsole extends JScrollPane {
|
||||
|
||||
boolean cerror;
|
||||
|
||||
//int maxCharCount;
|
||||
int maxLineCount;
|
||||
|
||||
static File errFile;
|
||||
static File outFile;
|
||||
static File tempFolder;
|
||||
|
||||
static PrintStream systemOut;
|
||||
static PrintStream systemErr;
|
||||
// Single static instance shared because there's only one real System.out.
|
||||
// Within the input handlers, the currentConsole variable will be used to
|
||||
// echo things to the correct location.
|
||||
|
||||
static public PrintStream systemOut;
|
||||
static public PrintStream systemErr;
|
||||
|
||||
static PrintStream consoleOut;
|
||||
static PrintStream consoleErr;
|
||||
@ -64,6 +68,8 @@ public class EditorConsole extends JScrollPane {
|
||||
static OutputStream stdoutFile;
|
||||
static OutputStream stderrFile;
|
||||
|
||||
static EditorConsole currentConsole;
|
||||
|
||||
|
||||
public EditorConsole(Editor editor) {
|
||||
this.editor = editor;
|
||||
@ -80,10 +86,10 @@ public class EditorConsole extends JScrollPane {
|
||||
consoleDoc.setParagraphAttributes(0, 0, standard, true);
|
||||
|
||||
// build styles for different types of console output
|
||||
Color bgColor = Preferences.getColor("console.color");
|
||||
Color fgColorOut = Preferences.getColor("console.output.color");
|
||||
Color fgColorErr = Preferences.getColor("console.error.color");
|
||||
Font font = Preferences.getFont("console.font");
|
||||
Color bgColor = Theme.getColor("console.color");
|
||||
Color fgColorOut = Theme.getColor("console.output.color");
|
||||
Color fgColorErr = Theme.getColor("console.error.color");
|
||||
Font font = Theme.getFont("console.font");
|
||||
|
||||
stdStyle = new SimpleAttributeSet();
|
||||
StyleConstants.setForeground(stdStyle, fgColorOut);
|
||||
@ -119,32 +125,32 @@ public class EditorConsole extends JScrollPane {
|
||||
systemOut = System.out;
|
||||
systemErr = System.err;
|
||||
|
||||
// Create a temporary folder which will have a randomized name. Has to
|
||||
// be randomized otherwise another instance of Processing (or one of its
|
||||
// sister IDEs) might collide with the file causing permissions problems.
|
||||
// The files and folders are not deleted on exit because they may be
|
||||
// needed for debugging or bug reporting.
|
||||
tempFolder = Base.createTempFolder("console");
|
||||
try {
|
||||
String outFileName = Preferences.get("console.output.file");
|
||||
if (outFileName != null) {
|
||||
outFile = new File(tempFolder, outFileName);
|
||||
stdoutFile = new FileOutputStream(outFile);
|
||||
//outFile.deleteOnExit();
|
||||
}
|
||||
|
||||
String errFileName = Preferences.get("console.error.file");
|
||||
if (errFileName != null) {
|
||||
errFile = new File(tempFolder, errFileName);
|
||||
stderrFile = new FileOutputStream(errFile);
|
||||
//errFile.deleteOnExit();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
Base.showWarning("Console Error",
|
||||
"A problem occurred while trying to open the\n" +
|
||||
"files used to store the console output.", e);
|
||||
}
|
||||
|
||||
consoleOut =
|
||||
new PrintStream(new EditorConsoleStream(this, false, stdoutFile));
|
||||
consoleErr =
|
||||
new PrintStream(new EditorConsoleStream(this, true, stderrFile));
|
||||
|
||||
consoleOut = new PrintStream(new EditorConsoleStream(false));
|
||||
consoleErr = new PrintStream(new EditorConsoleStream(true));
|
||||
|
||||
if (Preferences.getBoolean("console")) {
|
||||
try {
|
||||
System.setOut(consoleOut);
|
||||
@ -176,6 +182,11 @@ public class EditorConsole extends JScrollPane {
|
||||
}).start();
|
||||
}
|
||||
|
||||
|
||||
static public void setEditor(Editor editor) {
|
||||
currentConsole = editor.console;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Close the streams so that the temporary files can be deleted.
|
||||
@ -229,8 +240,10 @@ public class EditorConsole extends JScrollPane {
|
||||
synchronized public void message(String what, boolean err, boolean advance) {
|
||||
if (err) {
|
||||
systemErr.print(what);
|
||||
//systemErr.print("CE" + what);
|
||||
} else {
|
||||
systemOut.print(what);
|
||||
//systemOut.print("CO" + what);
|
||||
}
|
||||
|
||||
if (advance) {
|
||||
@ -242,14 +255,14 @@ public class EditorConsole extends JScrollPane {
|
||||
}
|
||||
}
|
||||
|
||||
// to console display
|
||||
// to console display
|
||||
appendText(what, err);
|
||||
// moved down here since something is punting
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* append a piece of text to the console.
|
||||
* Append a piece of text to the console.
|
||||
* <P>
|
||||
* Swing components are NOT thread-safe, and since the MessageSiphon
|
||||
* instantiates new threads, and in those callbacks, they often print
|
||||
@ -264,6 +277,7 @@ public class EditorConsole extends JScrollPane {
|
||||
consoleDoc.appendString(txt, e ? errStyle : stdStyle);
|
||||
}
|
||||
|
||||
|
||||
public void clear() {
|
||||
try {
|
||||
consoleDoc.remove(0, consoleDoc.getLength());
|
||||
@ -272,68 +286,96 @@ public class EditorConsole extends JScrollPane {
|
||||
// maybe not a good idea in the long run?
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||||
|
||||
|
||||
class EditorConsoleStream extends OutputStream {
|
||||
//static EditorConsole current;
|
||||
boolean err; // whether stderr or stdout
|
||||
byte single[] = new byte[1];
|
||||
|
||||
public EditorConsoleStream(boolean err) {
|
||||
this.err = err;
|
||||
}
|
||||
|
||||
class EditorConsoleStream extends OutputStream {
|
||||
EditorConsole parent;
|
||||
boolean err; // whether stderr or stdout
|
||||
byte single[] = new byte[1];
|
||||
OutputStream echo;
|
||||
public void close() { }
|
||||
|
||||
public EditorConsoleStream(EditorConsole parent,
|
||||
boolean err, OutputStream echo) {
|
||||
this.parent = parent;
|
||||
this.err = err;
|
||||
this.echo = echo;
|
||||
}
|
||||
public void flush() { }
|
||||
|
||||
public void close() { }
|
||||
public void write(byte b[]) { // appears never to be used
|
||||
// if (currentConsole.isDisplayable()) {
|
||||
currentConsole.write(b, 0, b.length, err);
|
||||
// } else {
|
||||
// systemOut.println("not displayable");
|
||||
// if (err) {
|
||||
// systemErr.write(b, 0, b.length);
|
||||
// } else {
|
||||
// systemOut.write(b, 0, b.length);
|
||||
// }
|
||||
// }
|
||||
|
||||
public void flush() { }
|
||||
|
||||
public void write(byte b[]) { // appears never to be used
|
||||
parent.write(b, 0, b.length, err);
|
||||
if (echo != null) {
|
||||
try {
|
||||
echo.write(b); //, 0, b.length);
|
||||
echo.flush();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
echo = null;
|
||||
OutputStream echo = err ? stderrFile : stdoutFile;
|
||||
if (echo != null) {
|
||||
try {
|
||||
echo.write(b);
|
||||
echo.flush();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
echo = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void write(byte b[], int offset, int length) {
|
||||
parent.write(b, offset, length, err);
|
||||
if (echo != null) {
|
||||
try {
|
||||
echo.write(b, offset, length);
|
||||
echo.flush();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
echo = null;
|
||||
public void write(byte b[], int offset, int length) {
|
||||
currentConsole.write(b, offset, length, err);
|
||||
// if (currentConsole.isDisplayable()) {
|
||||
// systemOut.println("is displayable");
|
||||
// currentConsole.write(b, offset, length, err);
|
||||
// } else {
|
||||
// systemOut.println("not displayable");
|
||||
// if (err) {
|
||||
// systemErr.write(b, offset, length);
|
||||
// } else {
|
||||
// systemOut.write(b, offset, length);
|
||||
// }
|
||||
// }
|
||||
|
||||
OutputStream echo = err ? stderrFile : stdoutFile;
|
||||
if (echo != null) {
|
||||
try {
|
||||
echo.write(b, offset, length);
|
||||
echo.flush();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
echo = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void write(int b) {
|
||||
single[0] = (byte)b;
|
||||
parent.write(single, 0, 1, err);
|
||||
if (echo != null) {
|
||||
try {
|
||||
echo.write(b);
|
||||
echo.flush();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
echo = null;
|
||||
public void write(int b) {
|
||||
single[0] = (byte)b;
|
||||
currentConsole.write(single, 0, 1, err);
|
||||
|
||||
OutputStream echo = err ? stderrFile : stdoutFile;
|
||||
if (echo != null) {
|
||||
try {
|
||||
echo.write(b);
|
||||
echo.flush();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
echo = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||||
|
||||
|
||||
/**
|
||||
* Buffer updates to the console and output them in batches. For info, see:
|
||||
* http://java.sun.com/products/jfc/tsc/articles/text/element_buffer and
|
@ -1,9 +1,9 @@
|
||||
/* -*- mode: jde; c-basic-offset: 2; indent-tabs-mode: nil -*- */
|
||||
/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */
|
||||
|
||||
/*
|
||||
Part of the Processing project - http://processing.org
|
||||
|
||||
Copyright (c) 2004-05 Ben Fry and Casey Reas
|
||||
Copyright (c) 2004-08 Ben Fry and Casey Reas
|
||||
Copyright (c) 2001-04 Massachusetts Institute of Technology
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
@ -25,10 +25,8 @@ package processing.app;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
import java.io.*;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.event.*;
|
||||
|
||||
|
||||
/**
|
||||
@ -50,8 +48,6 @@ public class EditorHeader extends JComponent {
|
||||
JMenu menu;
|
||||
JPopupMenu popup;
|
||||
|
||||
JMenuItem hideItem;
|
||||
|
||||
int menuLeft;
|
||||
int menuRight;
|
||||
|
||||
@ -69,7 +65,7 @@ public class EditorHeader extends JComponent {
|
||||
|
||||
static final int PIECE_WIDTH = 4;
|
||||
|
||||
Image[][] pieces;
|
||||
static Image[][] pieces;
|
||||
|
||||
//
|
||||
|
||||
@ -81,24 +77,23 @@ public class EditorHeader extends JComponent {
|
||||
public EditorHeader(Editor eddie) {
|
||||
this.editor = eddie; // weird name for listener
|
||||
|
||||
pieces = new Image[STATUS.length][WHERE.length];
|
||||
for (int i = 0; i < STATUS.length; i++) {
|
||||
for (int j = 0; j < WHERE.length; j++) {
|
||||
pieces[i][j] = Base.getImage("tab-" + STATUS[i] + "-" +
|
||||
WHERE[j] + ".gif", this);
|
||||
if (pieces == null) {
|
||||
pieces = new Image[STATUS.length][WHERE.length];
|
||||
for (int i = 0; i < STATUS.length; i++) {
|
||||
for (int j = 0; j < WHERE.length; j++) {
|
||||
String path = "tab-" + STATUS[i] + "-" + WHERE[j] + ".gif";
|
||||
pieces[i][j] = Base.getThemeImage(path, this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (backgroundColor == null) {
|
||||
//backgroundColor =
|
||||
//Preferences.getColor("header.bgcolor");
|
||||
// hardcoding new blue color scheme for consistency with images,
|
||||
// see EditorStatus.java for details.
|
||||
backgroundColor = new Color(0x21, 0x68, 0x86);
|
||||
backgroundColor =
|
||||
Theme.getColor("header.bgcolor");
|
||||
textColor[SELECTED] =
|
||||
Preferences.getColor("header.text.selected.color");
|
||||
Theme.getColor("header.text.selected.color");
|
||||
textColor[UNSELECTED] =
|
||||
Preferences.getColor("header.text.unselected.color");
|
||||
Theme.getColor("header.text.unselected.color");
|
||||
}
|
||||
|
||||
addMouseListener(new MouseAdapter() {
|
||||
@ -110,9 +105,10 @@ public class EditorHeader extends JComponent {
|
||||
popup.show(EditorHeader.this, x, y);
|
||||
|
||||
} else {
|
||||
for (int i = 0; i < editor.sketch.codeCount; i++) {
|
||||
Sketch sketch = editor.getSketch();
|
||||
for (int i = 0; i < sketch.getCodeCount(); i++) {
|
||||
if ((x > tabLeft[i]) && (x < tabRight[i])) {
|
||||
editor.sketch.setCurrent(i);
|
||||
sketch.setCurrentCode(i);
|
||||
repaint();
|
||||
}
|
||||
}
|
||||
@ -125,7 +121,7 @@ public class EditorHeader extends JComponent {
|
||||
public void paintComponent(Graphics screen) {
|
||||
if (screen == null) return;
|
||||
|
||||
Sketch sketch = editor.sketch;
|
||||
Sketch sketch = editor.getSketch();
|
||||
if (sketch == null) return; // ??
|
||||
|
||||
Dimension size = getSize();
|
||||
@ -140,7 +136,6 @@ public class EditorHeader extends JComponent {
|
||||
// who cares, just resize
|
||||
sizeW = size.width;
|
||||
sizeH = size.height;
|
||||
//userLeft = 0; // reset
|
||||
}
|
||||
}
|
||||
|
||||
@ -154,7 +149,7 @@ public class EditorHeader extends JComponent {
|
||||
|
||||
Graphics g = offscreen.getGraphics();
|
||||
if (font == null) {
|
||||
font = Preferences.getFont("header.text.font");
|
||||
font = Theme.getFont("header.text.font");
|
||||
}
|
||||
g.setFont(font); // need to set this each time through
|
||||
metrics = g.getFontMetrics();
|
||||
@ -169,28 +164,22 @@ public class EditorHeader extends JComponent {
|
||||
g.setColor(backgroundColor);
|
||||
g.fillRect(0, 0, imageW, imageH);
|
||||
|
||||
if ((tabLeft == null) ||
|
||||
(tabLeft.length < sketch.codeCount)) {
|
||||
tabLeft = new int[sketch.codeCount];
|
||||
tabRight = new int[sketch.codeCount];
|
||||
int codeCount = sketch.getCodeCount();
|
||||
if ((tabLeft == null) || (tabLeft.length < codeCount)) {
|
||||
tabLeft = new int[codeCount];
|
||||
tabRight = new int[codeCount];
|
||||
}
|
||||
|
||||
// disable hide on the first tab
|
||||
hideItem.setEnabled(sketch.current != sketch.code[0]);
|
||||
|
||||
//int x = 0; //Preferences.GUI_SMALL;
|
||||
//int x = (Base.platform == Base.MACOSX) ? 0 : 1;
|
||||
int x = 6; // offset from left edge of the component
|
||||
for (int i = 0; i < sketch.codeCount; i++) {
|
||||
SketchCode code = sketch.code[i];
|
||||
for (int i = 0; i < sketch.getCodeCount(); i++) {
|
||||
SketchCode code = sketch.getCode(i);
|
||||
|
||||
String codeName = (code.flavor == Sketch.PDE) ?
|
||||
code.name : code.file.getName();
|
||||
String codeName = sketch.hideExtension(code.getExtension()) ?
|
||||
code.getPrettyName() : code.getFileName();
|
||||
|
||||
// if modified, add the li'l glyph next to the name
|
||||
String text = " " + codeName + (code.modified ? " \u00A7" : " ");
|
||||
String text = " " + codeName + (code.isModified() ? " \u00A7" : " ");
|
||||
|
||||
//int textWidth = metrics.stringWidth(text);
|
||||
Graphics2D g2 = (Graphics2D) g;
|
||||
int textWidth = (int)
|
||||
font.getStringBounds(text, g2.getFontRenderContext()).getWidth();
|
||||
@ -198,7 +187,7 @@ public class EditorHeader extends JComponent {
|
||||
int pieceCount = 2 + (textWidth / PIECE_WIDTH);
|
||||
int pieceWidth = pieceCount * PIECE_WIDTH;
|
||||
|
||||
int state = (code == sketch.current) ? SELECTED : UNSELECTED;
|
||||
int state = (code == sketch.getCurrentCode()) ? SELECTED : UNSELECTED;
|
||||
g.drawImage(pieces[state][LEFT], x, 0, null);
|
||||
x += PIECE_WIDTH;
|
||||
|
||||
@ -237,6 +226,7 @@ public class EditorHeader extends JComponent {
|
||||
//System.out.println("rebuilding editor header");
|
||||
rebuildMenu();
|
||||
repaint();
|
||||
Toolkit.getDefaultToolkit().sync();
|
||||
}
|
||||
|
||||
|
||||
@ -297,10 +287,11 @@ public class EditorHeader extends JComponent {
|
||||
menu.addSeparator();
|
||||
*/
|
||||
|
||||
item = new JMenuItem("New Tab");
|
||||
//item = new JMenuItem("New Tab");
|
||||
item = Editor.newJMenuItemShift("New Tab", 'N');
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
editor.sketch.newCode();
|
||||
editor.getSketch().handleNewCode();
|
||||
}
|
||||
});
|
||||
menu.add(item);
|
||||
@ -308,10 +299,13 @@ public class EditorHeader extends JComponent {
|
||||
item = new JMenuItem("Rename");
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
editor.sketch.renameCode();
|
||||
editor.getSketch().handleRenameCode();
|
||||
/*
|
||||
// this is already being called by nameCode(), the second stage of rename
|
||||
if (editor.sketch.current == editor.sketch.code[0]) {
|
||||
editor.sketchbook.rebuildMenus();
|
||||
}
|
||||
*/
|
||||
}
|
||||
});
|
||||
menu.add(item);
|
||||
@ -319,59 +313,19 @@ public class EditorHeader extends JComponent {
|
||||
item = new JMenuItem("Delete");
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
editor.sketch.deleteCode();
|
||||
editor.getSketch().handleDeleteCode();
|
||||
}
|
||||
});
|
||||
menu.add(item);
|
||||
|
||||
item = new JMenuItem("Hide");
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
editor.sketch.hideCode();
|
||||
}
|
||||
});
|
||||
menu.add(item);
|
||||
hideItem = item;
|
||||
|
||||
JMenu unhide = new JMenu("Unhide");
|
||||
ActionListener unhideListener = new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
String which = (String) e.getActionCommand();
|
||||
editor.sketch.unhideCode(which);
|
||||
rebuildMenu();
|
||||
}
|
||||
};
|
||||
Sketch sketch = editor.sketch;
|
||||
if (sketch != null) {
|
||||
for (int i = 0; i < sketch.hiddenCount; i++) {
|
||||
item = new JMenuItem(sketch.hidden[i].name +
|
||||
Sketch.flavorExtensionsShown[sketch.hidden[i].flavor]);
|
||||
item.setActionCommand(sketch.hidden[i].name +
|
||||
Sketch.flavorExtensionsShown[sketch.hidden[i].flavor]);
|
||||
item.addActionListener(unhideListener);
|
||||
unhide.add(item);
|
||||
}
|
||||
}
|
||||
if (unhide.getItemCount() == 0) {
|
||||
unhide.setEnabled(false);
|
||||
}
|
||||
|
||||
menu.add(unhide);
|
||||
menu.addSeparator();
|
||||
|
||||
// KeyEvent.VK_LEFT and VK_RIGHT will make Windows beep
|
||||
|
||||
int ctrlAlt = ActionEvent.ALT_MASK |
|
||||
Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
|
||||
|
||||
//item = Editor.newJMenuItem("Previous Tab", '[', true);
|
||||
item = new JMenuItem("Previous Tab");
|
||||
//int shortcut = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
|
||||
KeyStroke ctrlAltLeft = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, ctrlAlt);
|
||||
KeyStroke ctrlAltLeft =
|
||||
KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, Editor.SHORTCUT_ALT_KEY_MASK);
|
||||
item.setAccelerator(ctrlAltLeft);
|
||||
//int modifiers = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
|
||||
//KeyStroke tabby = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, modifiers);
|
||||
|
||||
// this didn't want to work consistently
|
||||
/*
|
||||
item.addActionListener(new ActionListener() {
|
||||
@ -382,9 +336,9 @@ public class EditorHeader extends JComponent {
|
||||
*/
|
||||
menu.add(item);
|
||||
|
||||
//item = Editor.newJMenuItem("Next Tab", ']', true);
|
||||
item = new JMenuItem("Next Tab");
|
||||
KeyStroke ctrlAltRight = KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, ctrlAlt);
|
||||
KeyStroke ctrlAltRight =
|
||||
KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, Editor.SHORTCUT_ALT_KEY_MASK);
|
||||
item.setAccelerator(ctrlAltRight);
|
||||
/*
|
||||
item.addActionListener(new ActionListener() {
|
||||
@ -395,17 +349,17 @@ public class EditorHeader extends JComponent {
|
||||
*/
|
||||
menu.add(item);
|
||||
|
||||
Sketch sketch = editor.getSketch();
|
||||
if (sketch != null) {
|
||||
menu.addSeparator();
|
||||
|
||||
ActionListener jumpListener = new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
editor.sketch.setCurrent(e.getActionCommand());
|
||||
editor.getSketch().setCurrentCode(e.getActionCommand());
|
||||
}
|
||||
};
|
||||
for (int i = 0; i < sketch.codeCount; i++) {
|
||||
item = new JMenuItem(sketch.code[i].name +
|
||||
Sketch.flavorExtensionsShown[sketch.code[i].flavor]);
|
||||
for (SketchCode code : sketch.getCode()) {
|
||||
item = new JMenuItem(code.getPrettyName());
|
||||
item.addActionListener(jumpListener);
|
||||
menu.add(item);
|
||||
}
|
||||
@ -417,10 +371,12 @@ public class EditorHeader extends JComponent {
|
||||
repaint();
|
||||
}
|
||||
|
||||
|
||||
public Dimension getPreferredSize() {
|
||||
return getMinimumSize();
|
||||
}
|
||||
|
||||
|
||||
public Dimension getMinimumSize() {
|
||||
if (Base.isMacOS()) {
|
||||
return new Dimension(300, Preferences.GRID_SIZE);
|
||||
@ -428,6 +384,7 @@ public class EditorHeader extends JComponent {
|
||||
return new Dimension(300, Preferences.GRID_SIZE - 1);
|
||||
}
|
||||
|
||||
|
||||
public Dimension getMaximumSize() {
|
||||
if (Base.isMacOS()) {
|
||||
return new Dimension(3000, Preferences.GRID_SIZE);
|
@ -1,9 +1,9 @@
|
||||
/* -*- mode: jde; c-basic-offset: 2; indent-tabs-mode: nil -*- */
|
||||
/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */
|
||||
|
||||
/*
|
||||
Part of the Processing project - http://processing.org
|
||||
|
||||
Copyright (c) 2005 Ben Fry and Casey Reas
|
||||
Copyright (c) 2005-07 Ben Fry and Casey Reas
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@ -25,10 +25,7 @@ package processing.app;
|
||||
import processing.app.syntax.*;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.event.*;
|
||||
|
||||
|
||||
/**
|
||||
@ -52,16 +49,13 @@ public class EditorLineStatus extends JComponent {
|
||||
this.textarea = textarea;
|
||||
textarea.editorLineStatus = this;
|
||||
|
||||
// hardcoding new blue color scheme for consistency with images,
|
||||
// see EditorStatus.java for details.
|
||||
//background = Preferences.getColor("linestatus.bgcolor");
|
||||
background = new Color(0x04, 0x4F, 0x6F);
|
||||
font = Preferences.getFont("linestatus.font");
|
||||
foreground = Preferences.getColor("linestatus.color");
|
||||
high = Preferences.getInteger("linestatus.height");
|
||||
background = Theme.getColor("linestatus.bgcolor");
|
||||
font = Theme.getFont("linestatus.font");
|
||||
foreground = Theme.getColor("linestatus.color");
|
||||
high = Theme.getInteger("linestatus.height");
|
||||
|
||||
if (Base.isMacOS()) {
|
||||
resize = Base.getImage("resize.gif", this);
|
||||
resize = Base.getThemeImage("resize.gif", this);
|
||||
}
|
||||
//linestatus.bgcolor = #000000
|
||||
//linestatus.font = SansSerif,plain,10
|
@ -1,9 +1,9 @@
|
||||
/* -*- mode: jde; c-basic-offset: 2; indent-tabs-mode: nil -*- */
|
||||
/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */
|
||||
|
||||
/*
|
||||
Part of the Processing project - http://processing.org
|
||||
|
||||
Copyright (c) 2004-05 Ben Fry and Casey Reas
|
||||
Copyright (c) 2004-08 Ben Fry and Casey Reas
|
||||
Copyright (c) 2001-04 Massachusetts Institute of Technology
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
@ -28,10 +28,6 @@ import processing.app.syntax.*;
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.text.*;
|
||||
import javax.swing.event.*;
|
||||
|
||||
|
||||
/**
|
||||
* Filters key events for tab expansion/indent/etc.
|
||||
@ -47,18 +43,18 @@ import javax.swing.event.*;
|
||||
* smarter parser/formatter, rather than continuing to hack this class.
|
||||
*/
|
||||
public class EditorListener {
|
||||
Editor editor;
|
||||
JEditTextArea textarea;
|
||||
private Editor editor;
|
||||
private JEditTextArea textarea;
|
||||
|
||||
boolean externalEditor;
|
||||
boolean tabsExpand;
|
||||
boolean tabsIndent;
|
||||
int tabSize;
|
||||
String tabString;
|
||||
boolean autoIndent;
|
||||
private boolean externalEditor;
|
||||
private boolean tabsExpand;
|
||||
private boolean tabsIndent;
|
||||
private int tabSize;
|
||||
private String tabString;
|
||||
private boolean autoIndent;
|
||||
|
||||
int selectionStart, selectionEnd;
|
||||
int position;
|
||||
// private int selectionStart, selectionEnd;
|
||||
// private int position;
|
||||
|
||||
/** ctrl-alt on windows and linux, cmd-alt on mac os x */
|
||||
static final int CTRL_ALT = ActionEvent.ALT_MASK |
|
||||
@ -97,6 +93,7 @@ public class EditorListener {
|
||||
* Called by JEditTextArea inside processKeyEvent(). Note that this
|
||||
* won't intercept actual characters, because those are fired on
|
||||
* keyTyped().
|
||||
* @return true if the event has been handled (to remove it from the queue)
|
||||
*/
|
||||
public boolean keyPressed(KeyEvent event) {
|
||||
// don't do things if the textarea isn't editable
|
||||
@ -106,15 +103,17 @@ public class EditorListener {
|
||||
char c = event.getKeyChar();
|
||||
int code = event.getKeyCode();
|
||||
|
||||
//System.out.println(c + " " + code + " " + event);
|
||||
//System.out.println((int)c + " " + code + " " + event);
|
||||
//System.out.println();
|
||||
|
||||
Sketch sketch = editor.getSketch();
|
||||
|
||||
if ((event.getModifiers() & CTRL_ALT) == CTRL_ALT) {
|
||||
if (code == KeyEvent.VK_LEFT) {
|
||||
editor.sketch.prevCode();
|
||||
sketch.handlePrevCode();
|
||||
return true;
|
||||
} else if (code == KeyEvent.VK_RIGHT) {
|
||||
editor.sketch.nextCode();
|
||||
sketch.handleNextCode();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -125,10 +124,10 @@ public class EditorListener {
|
||||
}
|
||||
|
||||
// TODO i don't like these accessors. clean em up later.
|
||||
if (!editor.sketch.modified) {
|
||||
if (!editor.getSketch().isModified()) {
|
||||
if ((code == KeyEvent.VK_BACK_SPACE) || (code == KeyEvent.VK_TAB) ||
|
||||
(code == KeyEvent.VK_ENTER) || ((c >= 32) && (c < 128))) {
|
||||
editor.sketch.setModified(true);
|
||||
sketch.setModified(true);
|
||||
}
|
||||
}
|
||||
|
||||
@ -209,8 +208,12 @@ public class EditorListener {
|
||||
|
||||
switch ((int) c) {
|
||||
|
||||
case 9:
|
||||
if (tabsExpand) { // expand tabs
|
||||
case 9: // TAB
|
||||
if (textarea.isSelectionActive()) {
|
||||
boolean outdent = (event.getModifiers() & KeyEvent.SHIFT_MASK) != 0;
|
||||
editor.handleIndentOutdent(!outdent);
|
||||
|
||||
} else if (tabsExpand) { // expand tabs
|
||||
textarea.setSelectedText(tabString);
|
||||
event.consume();
|
||||
return true;
|
||||
@ -371,11 +374,11 @@ public class EditorListener {
|
||||
if (spaceCount < 0) {
|
||||
// for rev 0122, actually delete extra space
|
||||
//textarea.setSelectionStart(origIndex + 1);
|
||||
textarea.setSelectionEnd(textarea.getSelectionEnd() - spaceCount);
|
||||
textarea.setSelectionEnd(textarea.getSelectionStop() - spaceCount);
|
||||
textarea.setSelectedText("\n");
|
||||
} else {
|
||||
String insertion = "\n" + Editor.EMPTY.substring(0, spaceCount);
|
||||
textarea.setSelectedText(insertion);
|
||||
String insertion = "\n" + Editor.EMPTY.substring(0, spaceCount);
|
||||
textarea.setSelectedText(insertion);
|
||||
}
|
||||
|
||||
// not gonna bother handling more than one brace
|
||||
@ -394,19 +397,22 @@ public class EditorListener {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// mark this event as already handled
|
||||
event.consume();
|
||||
return true;
|
||||
} else {
|
||||
// Enter/Return was being consumed by somehow even if false
|
||||
// was returned, so this is a band-aid to simply fire the event again.
|
||||
// http://dev.processing.org/bugs/show_bug.cgi?id=1073
|
||||
textarea.setSelectedText(String.valueOf(c));
|
||||
}
|
||||
break;
|
||||
// mark this event as already handled (all but ignored)
|
||||
event.consume();
|
||||
return true;
|
||||
|
||||
case '}':
|
||||
if (autoIndent) {
|
||||
// first remove anything that was there (in case this multiple
|
||||
// characters are selected, so that it's not in the way of the
|
||||
// spaces for the auto-indent
|
||||
if (textarea.getSelectionStart() != textarea.getSelectionEnd()) {
|
||||
if (textarea.getSelectionStart() != textarea.getSelectionStop()) {
|
||||
textarea.setSelectedText("");
|
||||
}
|
||||
|
||||
@ -435,59 +441,9 @@ public class EditorListener {
|
||||
if (!finished) return false; // brace with no start
|
||||
int lineStartIndex = index;
|
||||
|
||||
/*
|
||||
// now that we know things are ok to be indented, walk
|
||||
// backwards to the last { to see how far its line is indented.
|
||||
// this isn't perfect cuz it'll pick up commented areas,
|
||||
// but that's not really a big deal and can be fixed when
|
||||
// this is all given a more complete (proper) solution.
|
||||
index = prevCharIndex;
|
||||
int braceDepth = 1;
|
||||
finished = false;
|
||||
while ((index != -1) && (!finished)) {
|
||||
if (contents[index] == '}') {
|
||||
// aww crap, this means we're one deeper
|
||||
// and will have to find one more extra {
|
||||
braceDepth++;
|
||||
index--;
|
||||
} else if (contents[index] == '{') {
|
||||
braceDepth--;
|
||||
if (braceDepth == 0) {
|
||||
finished = true;
|
||||
} // otherwise just teasing, keep going..
|
||||
} else {
|
||||
index--;
|
||||
}
|
||||
}
|
||||
// never found a proper brace, be safe and don't do anything
|
||||
if (!finished) return false;
|
||||
|
||||
// check how many spaces on the line with the matching open brace
|
||||
int pairedSpaceCount = calcSpaceCount(index, contents);
|
||||
//System.out.println(pairedSpaceCount);
|
||||
*/
|
||||
int pairedSpaceCount = calcBraceIndent(prevCharIndex, contents); //, 1);
|
||||
if (pairedSpaceCount == -1) return false;
|
||||
|
||||
/*
|
||||
// now walk forward and figure out how many spaces there are
|
||||
while ((index < contents.length) && (index >= 0) &&
|
||||
(contents[index++] == ' ')) {
|
||||
spaceCount++;
|
||||
}
|
||||
*/
|
||||
|
||||
// number of spaces found on this line
|
||||
//int newSpaceCount = Math.max(0, spaceCount - tabSize);
|
||||
// number of spaces on this current line
|
||||
//int spaceCount = calcSpaces(caretIndex, contents);
|
||||
//System.out.println("spaces is " + spaceCount);
|
||||
//String insertion = "\n" + Editor.EMPTY.substring(0, spaceCount);
|
||||
//int differential = newSpaceCount - spaceCount;
|
||||
//System.out.println("diff is " + differential);
|
||||
//int newStart = textarea.getSelectionStart() + differential;
|
||||
//textarea.setSelectionStart(newStart);
|
||||
//textarea.setSelectedText("}");
|
||||
textarea.setSelectionStart(lineStartIndex);
|
||||
textarea.setSelectedText(Editor.EMPTY.substring(0, pairedSpaceCount));
|
||||
|
||||
@ -501,32 +457,19 @@ public class EditorListener {
|
||||
}
|
||||
|
||||
|
||||
/** Cmd-Shift or Ctrl-Shift depending on the platform */
|
||||
//static final int CMD_SHIFT = ActionEvent.SHIFT_MASK |
|
||||
// Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
|
||||
/** ctrl-alt on windows and linux, cmd-alt on mac os x */
|
||||
//static final int CTRL_ALT = ActionEvent.ALT_MASK |
|
||||
// Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
|
||||
|
||||
/*
|
||||
public boolean keyTyped(KeyEvent event) {
|
||||
char c = event.getKeyChar();
|
||||
int code = event.getKeyCode();
|
||||
|
||||
if ((event.getModifiers() & CMD_ALT) == CMD_ALT) {
|
||||
if (code == KeyEvent.VK_LEFT) {
|
||||
//if (c == '[') {
|
||||
editor.sketch.prevCode();
|
||||
return true;
|
||||
} else if (code == KeyEvent.VK_RIGHT) {
|
||||
//} else if (c == ']') {
|
||||
editor.sketch.nextCode();
|
||||
if ((event.getModifiers() & KeyEvent.CTRL_MASK) != 0) {
|
||||
// on linux, ctrl-comma (prefs) being passed through to the editor
|
||||
if (c == KeyEvent.VK_COMMA) {
|
||||
event.consume();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/**
|
||||
@ -535,7 +478,7 @@ public class EditorListener {
|
||||
protected int calcLineStart(int index, char contents[]) {
|
||||
// backup from the current caret position to the last newline,
|
||||
// so that we can figure out how far this line was indented
|
||||
int spaceCount = 0;
|
||||
/*int spaceCount = 0;*/
|
||||
boolean finished = false;
|
||||
while ((index != -1) && (!finished)) {
|
||||
if ((contents[index] == 10) ||
|
431
app/src/processing/app/EditorStatus.java
Normal file
431
app/src/processing/app/EditorStatus.java
Normal file
@ -0,0 +1,431 @@
|
||||
/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */
|
||||
|
||||
/*
|
||||
Part of the Processing project - http://processing.org
|
||||
|
||||
Copyright (c) 2004-08 Ben Fry and Casey Reas
|
||||
Copyright (c) 2001-04 Massachusetts Institute of Technology
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
package processing.app;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
import javax.swing.*;
|
||||
|
||||
|
||||
/**
|
||||
* Panel just below the editing area that contains status messages.
|
||||
*/
|
||||
public class EditorStatus extends JPanel /*implements ActionListener*/ {
|
||||
static Color bgcolor[];
|
||||
static Color fgcolor[];
|
||||
|
||||
static final int NOTICE = 0;
|
||||
static final int ERR = 1;
|
||||
//static final int PROMPT = 2;
|
||||
//static final int EDIT = 3;
|
||||
static final int EDIT = 2;
|
||||
|
||||
static final int YES = 1;
|
||||
static final int NO = 2;
|
||||
static final int CANCEL = 3;
|
||||
static final int OK = 4;
|
||||
|
||||
static final String NO_MESSAGE = "";
|
||||
|
||||
Editor editor;
|
||||
|
||||
int mode;
|
||||
String message;
|
||||
|
||||
Font font;
|
||||
FontMetrics metrics;
|
||||
int ascent;
|
||||
|
||||
Image offscreen;
|
||||
int sizeW, sizeH;
|
||||
int imageW, imageH;
|
||||
|
||||
//JButton yesButton;
|
||||
//JButton noButton;
|
||||
JButton cancelButton;
|
||||
JButton okButton;
|
||||
JTextField editField;
|
||||
|
||||
//Thread promptThread;
|
||||
int response;
|
||||
|
||||
|
||||
public EditorStatus(Editor editor) {
|
||||
this.editor = editor;
|
||||
empty();
|
||||
|
||||
if (bgcolor == null) {
|
||||
bgcolor = new Color[3]; //4];
|
||||
bgcolor[0] = Theme.getColor("status.notice.bgcolor");
|
||||
bgcolor[1] = Theme.getColor("status.error.bgcolor");
|
||||
bgcolor[2] = Theme.getColor("status.edit.bgcolor");
|
||||
|
||||
fgcolor = new Color[3]; //4];
|
||||
fgcolor[0] = Theme.getColor("status.notice.fgcolor");
|
||||
fgcolor[1] = Theme.getColor("status.error.fgcolor");
|
||||
fgcolor[2] = Theme.getColor("status.edit.fgcolor");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void empty() {
|
||||
mode = NOTICE;
|
||||
message = NO_MESSAGE;
|
||||
//update();
|
||||
repaint();
|
||||
}
|
||||
|
||||
|
||||
public void notice(String message) {
|
||||
mode = NOTICE;
|
||||
this.message = message;
|
||||
//update();
|
||||
repaint();
|
||||
}
|
||||
|
||||
public void unnotice(String unmessage) {
|
||||
if (message.equals(unmessage)) empty();
|
||||
}
|
||||
|
||||
|
||||
public void error(String message) {
|
||||
mode = ERR;
|
||||
this.message = message;
|
||||
repaint();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
public void prompt(String message) {
|
||||
mode = PROMPT;
|
||||
this.message = message;
|
||||
|
||||
response = 0;
|
||||
yesButton.setVisible(true);
|
||||
noButton.setVisible(true);
|
||||
cancelButton.setVisible(true);
|
||||
yesButton.requestFocus();
|
||||
|
||||
repaint();
|
||||
}
|
||||
|
||||
|
||||
// prompt has been handled, re-hide the buttons
|
||||
public void unprompt() {
|
||||
yesButton.setVisible(false);
|
||||
noButton.setVisible(false);
|
||||
cancelButton.setVisible(false);
|
||||
empty();
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
public void edit(String message, String dflt) {
|
||||
mode = EDIT;
|
||||
this.message = message;
|
||||
|
||||
response = 0;
|
||||
okButton.setVisible(true);
|
||||
cancelButton.setVisible(true);
|
||||
editField.setVisible(true);
|
||||
editField.setText(dflt);
|
||||
editField.selectAll();
|
||||
editField.requestFocus();
|
||||
|
||||
repaint();
|
||||
}
|
||||
|
||||
public void unedit() {
|
||||
okButton.setVisible(false);
|
||||
cancelButton.setVisible(false);
|
||||
editField.setVisible(false);
|
||||
empty();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
public void update() {
|
||||
Graphics g = this.getGraphics();
|
||||
try {
|
||||
setBackground(bgcolor[mode]);
|
||||
} catch (NullPointerException e) { } // if not ready yet
|
||||
if (g != null) paint(g);
|
||||
}
|
||||
|
||||
public void update(Graphics g) {
|
||||
paint(g);
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
public void paintComponent(Graphics screen) {
|
||||
//if (screen == null) return;
|
||||
if (okButton == null) setup();
|
||||
|
||||
//System.out.println("status.paintComponent");
|
||||
|
||||
Dimension size = getSize();
|
||||
if ((size.width != sizeW) || (size.height != sizeH)) {
|
||||
// component has been resized
|
||||
|
||||
if ((size.width > imageW) || (size.height > imageH)) {
|
||||
// nix the image and recreate, it's too small
|
||||
offscreen = null;
|
||||
|
||||
} else {
|
||||
// who cares, just resize
|
||||
sizeW = size.width;
|
||||
sizeH = size.height;
|
||||
setButtonBounds();
|
||||
}
|
||||
}
|
||||
|
||||
if (offscreen == null) {
|
||||
sizeW = size.width;
|
||||
sizeH = size.height;
|
||||
setButtonBounds();
|
||||
imageW = sizeW;
|
||||
imageH = sizeH;
|
||||
offscreen = createImage(imageW, imageH);
|
||||
}
|
||||
|
||||
Graphics g = offscreen.getGraphics();
|
||||
if (font == null) {
|
||||
font = Theme.getFont("status.font");
|
||||
//new Font("SansSerif", Font.PLAIN, 12));
|
||||
g.setFont(font);
|
||||
metrics = g.getFontMetrics();
|
||||
ascent = metrics.getAscent();
|
||||
}
|
||||
|
||||
//setBackground(bgcolor[mode]); // does nothing
|
||||
|
||||
g.setColor(bgcolor[mode]);
|
||||
g.fillRect(0, 0, imageW, imageH);
|
||||
|
||||
g.setColor(fgcolor[mode]);
|
||||
g.setFont(font); // needs to be set each time on osx
|
||||
g.drawString(message, Preferences.GUI_SMALL, (sizeH + ascent) / 2);
|
||||
|
||||
screen.drawImage(offscreen, 0, 0, null);
|
||||
}
|
||||
|
||||
|
||||
protected void setup() {
|
||||
if (okButton == null) {
|
||||
cancelButton = new JButton(Preferences.PROMPT_CANCEL);
|
||||
okButton = new JButton(Preferences.PROMPT_OK);
|
||||
|
||||
cancelButton.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
if (mode == EDIT) {
|
||||
unedit();
|
||||
//editor.toolbar.clear();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
okButton.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
// answering to rename/new code question
|
||||
if (mode == EDIT) { // this if() isn't (shouldn't be?) necessary
|
||||
String answer = editField.getText();
|
||||
editor.getSketch().nameCode(answer);
|
||||
unedit();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// !@#(* aqua ui #($*(( that turtle-neck wearing #(** (#$@)(
|
||||
// os9 seems to work if bg of component is set, but x still a bastard
|
||||
if (Base.isMacOS()) {
|
||||
//yesButton.setBackground(bgcolor[EDIT]);
|
||||
//noButton.setBackground(bgcolor[EDIT]);
|
||||
cancelButton.setBackground(bgcolor[EDIT]);
|
||||
okButton.setBackground(bgcolor[EDIT]);
|
||||
}
|
||||
setLayout(null);
|
||||
|
||||
/*
|
||||
yesButton.addActionListener(this);
|
||||
noButton.addActionListener(this);
|
||||
cancelButton.addActionListener(this);
|
||||
okButton.addActionListener(this);
|
||||
*/
|
||||
|
||||
//add(yesButton);
|
||||
//add(noButton);
|
||||
add(cancelButton);
|
||||
add(okButton);
|
||||
|
||||
//yesButton.setVisible(false);
|
||||
//noButton.setVisible(false);
|
||||
cancelButton.setVisible(false);
|
||||
okButton.setVisible(false);
|
||||
|
||||
editField = new JTextField();
|
||||
// disabling, was not in use
|
||||
//editField.addActionListener(this);
|
||||
|
||||
//if (Base.platform != Base.MACOSX) {
|
||||
editField.addKeyListener(new KeyAdapter() {
|
||||
|
||||
// Grab ESC with keyPressed, because it's not making it to keyTyped
|
||||
public void keyPressed(KeyEvent event) {
|
||||
if (event.getKeyChar() == KeyEvent.VK_ESCAPE) {
|
||||
unedit();
|
||||
//editor.toolbar.clear();
|
||||
event.consume();
|
||||
}
|
||||
}
|
||||
|
||||
// use keyTyped to catch when the feller is actually
|
||||
// added to the text field. with keyTyped, as opposed to
|
||||
// keyPressed, the keyCode will be zero, even if it's
|
||||
// enter or backspace or whatever, so the keychar should
|
||||
// be used instead. grr.
|
||||
public void keyTyped(KeyEvent event) {
|
||||
//System.out.println("got event " + event);
|
||||
int c = event.getKeyChar();
|
||||
|
||||
if (c == KeyEvent.VK_ENTER) { // accept the input
|
||||
String answer = editField.getText();
|
||||
editor.getSketch().nameCode(answer);
|
||||
unedit();
|
||||
event.consume();
|
||||
|
||||
// easier to test the affirmative case than the negative
|
||||
} else if ((c == KeyEvent.VK_BACK_SPACE) ||
|
||||
(c == KeyEvent.VK_DELETE) ||
|
||||
(c == KeyEvent.VK_RIGHT) ||
|
||||
(c == KeyEvent.VK_LEFT) ||
|
||||
(c == KeyEvent.VK_UP) ||
|
||||
(c == KeyEvent.VK_DOWN) ||
|
||||
(c == KeyEvent.VK_HOME) ||
|
||||
(c == KeyEvent.VK_END) ||
|
||||
(c == KeyEvent.VK_SHIFT)) {
|
||||
// these events are ignored
|
||||
|
||||
/*
|
||||
} else if (c == KeyEvent.VK_ESCAPE) {
|
||||
unedit();
|
||||
editor.toolbar.clear();
|
||||
event.consume();
|
||||
*/
|
||||
|
||||
} else if (c == KeyEvent.VK_SPACE) {
|
||||
String t = editField.getText();
|
||||
int start = editField.getSelectionStart();
|
||||
int end = editField.getSelectionEnd();
|
||||
editField.setText(t.substring(0, start) + "_" +
|
||||
t.substring(end));
|
||||
editField.setCaretPosition(start+1);
|
||||
event.consume();
|
||||
|
||||
} else if ((c == '_') || (c == '.') || // allow .pde and .java
|
||||
((c >= 'A') && (c <= 'Z')) ||
|
||||
((c >= 'a') && (c <= 'z'))) {
|
||||
// these are ok, allow them through
|
||||
|
||||
} else if ((c >= '0') && (c <= '9')) {
|
||||
// getCaretPosition == 0 means that it's the first char
|
||||
// and the field is empty.
|
||||
// getSelectionStart means that it *will be* the first
|
||||
// char, because the selection is about to be replaced
|
||||
// with whatever is typed.
|
||||
if ((editField.getCaretPosition() == 0) ||
|
||||
(editField.getSelectionStart() == 0)) {
|
||||
// number not allowed as first digit
|
||||
//System.out.println("bad number bad");
|
||||
event.consume();
|
||||
}
|
||||
} else {
|
||||
event.consume();
|
||||
//System.out.println("code is " + code + " char = " + c);
|
||||
}
|
||||
//System.out.println("code is " + code + " char = " + c);
|
||||
}
|
||||
});
|
||||
add(editField);
|
||||
editField.setVisible(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
protected void setButtonBounds() {
|
||||
int top = (sizeH - Preferences.BUTTON_HEIGHT) / 2;
|
||||
int eachButton = Preferences.GUI_SMALL + Preferences.BUTTON_WIDTH;
|
||||
|
||||
int cancelLeft = sizeW - eachButton;
|
||||
int noLeft = cancelLeft - eachButton;
|
||||
int yesLeft = noLeft - eachButton;
|
||||
|
||||
//yesButton.setLocation(yesLeft, top);
|
||||
//noButton.setLocation(noLeft, top);
|
||||
cancelButton.setLocation(cancelLeft, top);
|
||||
okButton.setLocation(noLeft, top);
|
||||
|
||||
//yesButton.setSize(Preferences.BUTTON_WIDTH, Preferences.BUTTON_HEIGHT);
|
||||
//noButton.setSize(Preferences.BUTTON_WIDTH, Preferences.BUTTON_HEIGHT);
|
||||
cancelButton.setSize(Preferences.BUTTON_WIDTH, Preferences.BUTTON_HEIGHT);
|
||||
okButton.setSize(Preferences.BUTTON_WIDTH, Preferences.BUTTON_HEIGHT);
|
||||
|
||||
// edit field height is awkward, and very different between mac and pc,
|
||||
// so use at least the preferred height for now.
|
||||
int editWidth = 2*Preferences.BUTTON_WIDTH;
|
||||
int editHeight = editField.getPreferredSize().height;
|
||||
int editTop = (1 + sizeH - editHeight) / 2; // add 1 for ceil
|
||||
editField.setBounds(yesLeft - Preferences.BUTTON_WIDTH, editTop,
|
||||
editWidth, editHeight);
|
||||
}
|
||||
|
||||
|
||||
public Dimension getPreferredSize() {
|
||||
return getMinimumSize();
|
||||
}
|
||||
|
||||
public Dimension getMinimumSize() {
|
||||
return new Dimension(300, Preferences.GRID_SIZE);
|
||||
}
|
||||
|
||||
public Dimension getMaximumSize() {
|
||||
return new Dimension(3000, Preferences.GRID_SIZE);
|
||||
}
|
||||
|
||||
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
if (e.getSource() == cancelButton) {
|
||||
if (mode == EDIT) unedit();
|
||||
//editor.toolbar.clear();
|
||||
|
||||
} else if (e.getSource() == okButton) {
|
||||
// answering to rename/new code question
|
||||
if (mode == EDIT) { // this if() isn't (shouldn't be?) necessary
|
||||
String answer = editField.getText();
|
||||
editor.getSketch().nameCode(answer);
|
||||
unedit();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user