/* * Copyright (C) 2014 Alfons Wirtz * website www.freerouting.net * * 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 3 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 at <http://www.gnu.org/licenses/> * for more details. * * GUIDefaultsFile.java * * Created on 26. Dezember 2004, 08:29 */ package gui; import datastructures.IndentFileWriter; import board.ItemSelectionFilter; /** * Description of a text file, where the board independent interactive settings are stored. * * @author Alfons Wirtz */ public class GUIDefaultsFile { /** * Keywords in the gui defaults file. */ enum Keyword { ALL_VISIBLE, ASSIGN_NET_RULES, AUTOMATIC_LAYER_DIMMING, BACKGROUND, BOARD_FRAME, BOUNDS, CLEARANCE_COMPENSATION, CLEARANCE_MATRIX, CLOSED_BRACKET, COLOR_MANAGER, COLORS, COMPONENT_BACK, COMPONENT_FRONT, COMPONENT_GRID, COMPONENT_INFO, CONDUCTION, CURRENT_LAYER, CURRENT_ONLY, DESELECTED_SNAPSHOT_ATTRIBUTES, DISPLAY_MISCELLANIOUS, DISPLAY_REGION, DRAG_COMPONENTS_ENABLED, DYNAMIC, EDIT_VIAS, EDIT_NET_RULES, FIXED, FIXED_TRACES, FIXED_VIAS, FORTYFIVE_DEGREE, GUI_DEFAULTS,HILIGHT, HILIGHT_ROUTING_OBSTACLE, IGNORE_CONDUCTION_AREAS, INCOMPLETES, INCOMPLETES_INFO, INTERACTIVE_STATE, KEEPOUT, LAYER_VISIBILITY, LENGTH_MATCHING, MANUAL_RULES, MANUAL_RULE_SETTINGS, MOVE_PARAMETER, NET_INFO, NINETY_DEGREE, NONE, NOT_VISIBLE, OBJECT_COLORS, OBJECT_VISIBILITY, OPEN_BRACKET, OFF, ON, OUTLINE, PARAMETER, PACKAGE_INFO, PADSTACK_INFO, PINS, PULL_TIGHT_ACCURACY, PULL_TIGHT_REGION, PUSH_AND_SHOVE_ENABLED, ROUTE_DETAILS, ROUTE_MODE, ROUTE_PARAMETER, RULE_SELECTION, SELECT_PARAMETER, SELECTABLE_ITEMS, SELECTION_LAYERS, SNAPSHOTS, SHOVE_ENABLED, STITCHING, TRACES, UNFIXED, VIA_KEEPOUT, VISIBLE, VIA_RULES, VIA_SNAP_TO_SMD_CENTER, VIAS, VIOLATIONS, VIOLATIONS_INFO, WINDOWS } /** * Writes the GUI setting of p_board_frame as default to p_file. * Returns false, if an error occured. */ public static boolean write(gui.BoardFrame p_board_frame, interactive.BoardHandling p_board_handling, java.io.OutputStream p_output_stream) { if (p_output_stream == null) { return false; } IndentFileWriter output_file = new IndentFileWriter(p_output_stream); GUIDefaultsFile result = new GUIDefaultsFile(p_board_frame, p_board_handling, null, output_file); try { result.write_defaults_scope(); } catch (java.io.IOException e) { System.out.println("unable to write defaults file"); return false; } try { output_file.close(); } catch (java.io.IOException e) { System.out.println("unable to close defaults file"); return false; } return true; } /** * Reads the GUI setting of p_board_frame from file. * Returns false, if an error occured while reading the file. */ public static boolean read(gui.BoardFrame p_board_frame, interactive.BoardHandling p_board_handling, java.io.InputStream p_input_stream) { if (p_input_stream == null) { return false; } GUIDefaultsScanner scanner = new GUIDefaultsScanner(p_input_stream); GUIDefaultsFile new_instance = new GUIDefaultsFile(p_board_frame, p_board_handling, scanner, null); boolean result = true; try { result = new_instance.read_defaults_scope(); } catch (java.io.IOException e) { System.out.println("unable to read defaults file"); result = false; } return result; } private GUIDefaultsFile(gui.BoardFrame p_board_frame, interactive.BoardHandling p_board_handling, GUIDefaultsScanner p_scanner, IndentFileWriter p_output_file) { board_frame = p_board_frame; board_handling = p_board_handling; scanner = p_scanner; out_file = p_output_file; } private void write_defaults_scope() throws java.io.IOException { out_file.start_scope(); out_file.write("gui_defaults"); write_windows_scope(); write_colors_scope(); write_parameter_scope(); out_file.end_scope(); } private boolean read_defaults_scope() throws java.io.IOException { Object next_token = this.scanner.next_token(); if (next_token != Keyword.OPEN_BRACKET) { return false; } next_token = this.scanner.next_token(); if (next_token != Keyword.GUI_DEFAULTS) { return false; } // read the direct subscopes of the gui_defaults scope for (;;) { Object prev_token = next_token; next_token = this.scanner.next_token(); if (next_token == null) { // end of file return true; } if (next_token == Keyword.CLOSED_BRACKET) { // end of scope break; } if (prev_token == Keyword.OPEN_BRACKET) { if (next_token == Keyword.COLORS) { if (!read_colors_scope()) { return false; } } else if (next_token == Keyword.WINDOWS) { if (!read_windows_scope()) { return false; } } else if (next_token == Keyword.PARAMETER) { if (!read_parameter_scope()) { return false; } } else { // overread all scopes except the routes scope for the time being skip_scope(this.scanner); } } } this.board_frame.refresh_windows(); return true; } private boolean read_windows_scope() throws java.io.IOException { // read the direct subscopes of the windows scope Object next_token = null; for (;;) { Object prev_token = next_token; next_token = this.scanner.next_token(); if (next_token == null) { // unexpected end of file return false; } if (next_token == Keyword.CLOSED_BRACKET) { // end of scope break; } if (prev_token == Keyword.OPEN_BRACKET) { if (!(next_token instanceof Keyword)) { System.out.println("GUIDefaultsFile.windows: Keyword expected"); return false; } if (!read_frame_scope((Keyword) next_token)) { return false; } } } return true; } private void write_windows_scope() throws java.io.IOException { out_file.start_scope(); out_file.write("windows"); write_frame_scope(this.board_frame, "board_frame"); write_frame_scope(this.board_frame.color_manager, "color_manager"); write_frame_scope(this.board_frame.layer_visibility_window, "layer_visibility"); write_frame_scope(this.board_frame.object_visibility_window, "object_visibility"); write_frame_scope(this.board_frame.display_misc_window, "display_miscellanious"); write_frame_scope(this.board_frame.snapshot_window, "snapshots"); write_frame_scope(this.board_frame.select_parameter_window, "select_parameter"); write_frame_scope(this.board_frame.route_parameter_window, "route_parameter"); write_frame_scope(this.board_frame.route_parameter_window.manual_rule_window, "manual_rules"); write_frame_scope(this.board_frame.route_parameter_window.detail_window, "route_details"); write_frame_scope(this.board_frame.move_parameter_window, "move_parameter"); write_frame_scope(this.board_frame.clearance_matrix_window, "clearance_matrix"); write_frame_scope(this.board_frame.via_window, "via_rules"); write_frame_scope(this.board_frame.edit_vias_window, "edit_vias"); write_frame_scope(this.board_frame.edit_net_rules_window, "edit_net_rules"); write_frame_scope(this.board_frame.assign_net_classes_window, "assign_net_rules"); write_frame_scope(this.board_frame.padstacks_window, "padstack_info"); write_frame_scope(this.board_frame.packages_window, "package_info"); write_frame_scope(this.board_frame.components_window, "component_info"); write_frame_scope(this.board_frame.net_info_window, "net_info"); write_frame_scope(this.board_frame.incompletes_window, "incompletes_info"); write_frame_scope(this.board_frame.clearance_violations_window, "violations_info"); out_file.end_scope(); } private boolean read_frame_scope(Keyword p_frame) throws java.io.IOException { boolean is_visible; Object next_token = this.scanner.next_token(); if (next_token == Keyword.VISIBLE) { is_visible = true; } else if (next_token == Keyword.NOT_VISIBLE) { is_visible = false; } else { System.out.println("GUIDefaultsFile.read_frame_scope: visible or not_visible expected"); return false; } next_token = this.scanner.next_token(); if (next_token != Keyword.OPEN_BRACKET) { System.out.println("GUIDefaultsFile.read_frame_scope: open_bracket expected"); return false; } next_token = this.scanner.next_token(); if (next_token != Keyword.BOUNDS) { System.out.println("GUIDefaultsFile.read_frame_scope: bounds expected"); return false; } java.awt.Rectangle bounds = read_rectangle(); if (bounds == null) { return false; } for (int i = 0; i < 2; ++i) { next_token = this.scanner.next_token(); if (next_token != Keyword.CLOSED_BRACKET) { System.out.println("GUIDefaultsFile.read_frame_scope: closing bracket expected"); return false; } } javax.swing.JFrame curr_frame; if (p_frame == Keyword.BOARD_FRAME) { curr_frame = this.board_frame; } else if (p_frame == Keyword.COLOR_MANAGER) { curr_frame = this.board_frame.color_manager; } else if (p_frame == Keyword.OBJECT_VISIBILITY) { curr_frame = this.board_frame.object_visibility_window; } else if (p_frame == Keyword.LAYER_VISIBILITY) { curr_frame = this.board_frame.layer_visibility_window; } else if (p_frame == Keyword.DISPLAY_MISCELLANIOUS) { curr_frame = this.board_frame.display_misc_window; } else if (p_frame == Keyword.SNAPSHOTS) { curr_frame = this.board_frame.snapshot_window; } else if (p_frame == Keyword.SELECT_PARAMETER) { curr_frame = this.board_frame.select_parameter_window; } else if (p_frame == Keyword.ROUTE_PARAMETER) { curr_frame = this.board_frame.route_parameter_window; } else if (p_frame == Keyword.MANUAL_RULES) { curr_frame = this.board_frame.route_parameter_window.manual_rule_window; } else if (p_frame == Keyword.ROUTE_DETAILS) { curr_frame = this.board_frame.route_parameter_window.detail_window; } else if (p_frame == Keyword.MOVE_PARAMETER) { curr_frame = this.board_frame.move_parameter_window; } else if (p_frame == Keyword.CLEARANCE_MATRIX) { curr_frame = this.board_frame.clearance_matrix_window; } else if (p_frame == Keyword.VIA_RULES) { curr_frame = this.board_frame.via_window; } else if (p_frame == Keyword.EDIT_VIAS) { curr_frame = this.board_frame.edit_vias_window; } else if (p_frame == Keyword.EDIT_NET_RULES) { curr_frame = this.board_frame.edit_net_rules_window; } else if (p_frame == Keyword.ASSIGN_NET_RULES) { curr_frame = this.board_frame.assign_net_classes_window; } else if (p_frame == Keyword.PADSTACK_INFO) { curr_frame = this.board_frame.padstacks_window; } else if (p_frame == Keyword.PACKAGE_INFO) { curr_frame = this.board_frame.packages_window; } else if (p_frame == Keyword.COMPONENT_INFO) { curr_frame = this.board_frame.components_window; } else if (p_frame == Keyword.NET_INFO) { curr_frame = this.board_frame.net_info_window; } else if (p_frame == Keyword.INCOMPLETES_INFO) { curr_frame = this.board_frame.incompletes_window; } else if (p_frame == Keyword.VIOLATIONS_INFO) { curr_frame = this.board_frame.clearance_violations_window; } else { System.out.println("GUIDefaultsFile.read_frame_scope: unknown frame"); return false; } curr_frame.setVisible(is_visible); if (p_frame == Keyword.BOARD_FRAME) { curr_frame.setBounds(bounds); } else { // Set only the location. // Do not change the size of the frame because it depends on the layer count. curr_frame.setLocation(bounds.getLocation()); } return true; } private java.awt.Rectangle read_rectangle() throws java.io.IOException { int[] coor = new int [4]; for (int i = 0; i < 4; ++i) { Object next_token = this.scanner.next_token(); if (!(next_token instanceof Integer)) { System.out.println("GUIDefaultsFile.read_rectangle: Integer expected"); return null; } coor[i] = (Integer) next_token; } return new java.awt.Rectangle(coor[0],coor[1],coor[2],coor[3]); } private void write_frame_scope(javax.swing.JFrame p_frame, String p_frame_name) throws java.io.IOException { out_file.start_scope(); out_file.write(p_frame_name); out_file.new_line(); if (p_frame.isVisible()) { out_file.write("visible"); } else { out_file.write("not_visible"); } write_bounds(p_frame.getBounds()); out_file.end_scope(); } private void write_bounds(java.awt.Rectangle p_bounds) throws java.io.IOException { out_file.start_scope(); out_file.write("bounds"); out_file.new_line(); Integer x = (int) p_bounds.getX(); out_file.write(x.toString()); Integer y = (int) p_bounds.getY(); out_file.write(" "); out_file.write(y.toString()); Integer width = (int) p_bounds.getWidth(); out_file.write(" "); out_file.write(width.toString()); Integer height = (int) p_bounds.getHeight(); out_file.write(" "); out_file.write(height.toString()); out_file.end_scope(); } private boolean read_colors_scope() throws java.io.IOException { // read the direct subscopes of the colors scope Object next_token = null; for (;;) { Object prev_token = next_token; next_token = this.scanner.next_token(); if (next_token == null) { // unexpected end of file return false; } if (next_token == Keyword.CLOSED_BRACKET) { // end of scope break; } if (prev_token == Keyword.OPEN_BRACKET) { if (next_token == Keyword.BACKGROUND) { if (!read_background_color()) { return false; } } else if (next_token == Keyword.CONDUCTION) { if (!read_conduction_colors()) { return false; } } else if (next_token == Keyword.HILIGHT) { if (!read_hilight_color()) { return false; } } else if (next_token == Keyword.INCOMPLETES) { if (!read_incompletes_color()) { return false; } } else if (next_token == Keyword.KEEPOUT) { if (!read_keepout_colors()) { return false; } } else if (next_token == Keyword.OUTLINE) { if (!read_outline_color()) { return false; } } else if (next_token == Keyword.COMPONENT_FRONT) { if (!read_component_color(true)) { return false; } } else if (next_token == Keyword.COMPONENT_BACK) { if (!read_component_color(false)) { return false; } } else if (next_token == Keyword.LENGTH_MATCHING) { if (!read_length_matching_color()) { return false; } } else if (next_token == Keyword.PINS) { if (!read_pin_colors()) { return false; } } else if (next_token == Keyword.TRACES) { if (!read_trace_colors(false)) { return false; } } else if (next_token == Keyword.FIXED_TRACES) { if (!read_trace_colors(true)) { return false; } } else if (next_token == Keyword.VIA_KEEPOUT) { if (!read_via_keepout_colors()) { return false; } } else if (next_token == Keyword.VIAS) { if (!read_via_colors(false)) { return false; } } else if (next_token == Keyword.FIXED_VIAS) { if (!read_via_colors(true)) { return false; } } else if (next_token == Keyword.VIOLATIONS) { if (!read_violations_color()) { return false; } } else { // skip unknown scope skip_scope(this.scanner); } } } return true; } private boolean read_trace_colors(boolean p_fixed) throws java.io.IOException { double intensity = read_color_intensity(); if (intensity < 0) { return false; } this.board_handling.graphics_context.set_trace_color_intensity(intensity); java.awt.Color[] curr_colors = read_color_array(); if (curr_colors.length < 1) { return false; } this.board_handling.graphics_context.item_color_table.set_trace_colors(curr_colors, p_fixed); return true; } private boolean read_via_colors(boolean p_fixed) throws java.io.IOException { double intensity = read_color_intensity(); if (intensity < 0) { return false; } this.board_handling.graphics_context.set_via_color_intensity(intensity); java.awt.Color[] curr_colors = read_color_array(); if (curr_colors.length < 1) { return false; } this.board_handling.graphics_context.item_color_table.set_via_colors(curr_colors, p_fixed); return true; } private boolean read_pin_colors() throws java.io.IOException { double intensity = read_color_intensity(); if (intensity < 0) { return false; } this.board_handling.graphics_context.set_pin_color_intensity(intensity); java.awt.Color[] curr_colors = read_color_array(); if (curr_colors.length < 1) { return false; } this.board_handling.graphics_context.item_color_table.set_pin_colors(curr_colors); return true; } private boolean read_conduction_colors() throws java.io.IOException { double intensity = read_color_intensity(); if (intensity < 0) { return false; } this.board_handling.graphics_context.set_conduction_color_intensity(intensity); java.awt.Color[] curr_colors = read_color_array(); if (curr_colors.length < 1) { return false; } this.board_handling.graphics_context.item_color_table.set_conduction_colors(curr_colors); return true; } private boolean read_keepout_colors() throws java.io.IOException { double intensity = read_color_intensity(); if (intensity < 0) { return false; } this.board_handling.graphics_context.set_obstacle_color_intensity(intensity); java.awt.Color[] curr_colors = read_color_array(); if (curr_colors.length < 1) { return false; } this.board_handling.graphics_context.item_color_table.set_keepout_colors(curr_colors); return true; } private boolean read_via_keepout_colors() throws java.io.IOException { double intensity = read_color_intensity(); if (intensity < 0) { return false; } this.board_handling.graphics_context.set_via_obstacle_color_intensity(intensity); java.awt.Color[] curr_colors = read_color_array(); if (curr_colors.length < 1) { return false; } this.board_handling.graphics_context.item_color_table.set_via_keepout_colors(curr_colors); return true; } private boolean read_background_color() throws java.io.IOException { java.awt.Color curr_color = read_color(); if (curr_color == null) { return false; } this.board_handling.graphics_context.other_color_table.set_background_color(curr_color); this.board_frame.set_board_background(curr_color); Object next_token = this.scanner.next_token(); if (next_token != Keyword.CLOSED_BRACKET) { System.out.println("GUIDefaultsFile.read_background_color: closing bracket expected"); return false; } return true; } private boolean read_hilight_color() throws java.io.IOException { double intensity = read_color_intensity(); if (intensity < 0) { return false; } this.board_handling.graphics_context.set_hilight_color_intensity(intensity); java.awt.Color curr_color = read_color(); if (curr_color == null) { return false; } this.board_handling.graphics_context.other_color_table.set_hilight_color(curr_color); Object next_token = this.scanner.next_token(); if (next_token != Keyword.CLOSED_BRACKET) { System.out.println("GUIDefaultsFile.read_higlight_color: closing bracket expected"); return false; } return true; } private boolean read_incompletes_color() throws java.io.IOException { double intensity = read_color_intensity(); if (intensity < 0) { return false; } this.board_handling.graphics_context.set_incomplete_color_intensity(intensity); java.awt.Color curr_color = read_color(); if (curr_color == null) { return false; } this.board_handling.graphics_context.other_color_table.set_incomplete_color(curr_color); Object next_token = this.scanner.next_token(); if (next_token != Keyword.CLOSED_BRACKET) { System.out.println("GUIDefaultsFile.read_incompletes_color: closing bracket expected"); return false; } return true; } private boolean read_length_matching_color() throws java.io.IOException { double intensity = read_color_intensity(); if (intensity < 0) { return false; } this.board_handling.graphics_context.set_length_matching_area_color_intensity(intensity); java.awt.Color curr_color = read_color(); if (curr_color == null) { return false; } this.board_handling.graphics_context.other_color_table.set_length_matching_area_color(curr_color); Object next_token = this.scanner.next_token(); if (next_token != Keyword.CLOSED_BRACKET) { System.out.println("GUIDefaultsFile.read_length_matching_color: closing bracket expected"); return false; } return true; } private boolean read_violations_color() throws java.io.IOException { java.awt.Color curr_color = read_color(); if (curr_color == null) { return false; } this.board_handling.graphics_context.other_color_table.set_violations_color(curr_color); Object next_token = this.scanner.next_token(); if (next_token != Keyword.CLOSED_BRACKET) { System.out.println("GUIDefaultsFile.read_violations_color: closing bracket expected"); return false; } return true; } private boolean read_outline_color() throws java.io.IOException { java.awt.Color curr_color = read_color(); if (curr_color == null) { return false; } this.board_handling.graphics_context.other_color_table.set_outline_color(curr_color); Object next_token = this.scanner.next_token(); if (next_token != Keyword.CLOSED_BRACKET) { System.out.println("GUIDefaultsFile.read_outline_color: closing bracket expected"); return false; } return true; } private boolean read_component_color(boolean p_front) throws java.io.IOException { java.awt.Color curr_color = read_color(); if (curr_color == null) { return false; } this.board_handling.graphics_context.other_color_table.set_component_color(curr_color, p_front); Object next_token = this.scanner.next_token(); if (next_token != Keyword.CLOSED_BRACKET) { System.out.println("GUIDefaultsFile.read_component_color: closing bracket expected"); return false; } return true; } private double read_color_intensity() throws java.io.IOException { double result; Object next_token = this.scanner.next_token(); if (next_token instanceof Double) { result = (Double) next_token; } else if (next_token instanceof Integer) { result = (Integer) next_token; } else { System.out.println("GUIDefaultsFile.read_color_intensity: Number expected"); result = -1; } return result; } /** * reads a java.awt.Color from the defaults file. * Returns null, if no valid color was found. */ private java.awt.Color read_color() throws java.io.IOException { int [] rgb_color_arr = new int [3]; for (int i = 0; i < 3; ++i) { Object next_token = this.scanner.next_token(); if (!(next_token instanceof Integer)) { if (next_token != Keyword.CLOSED_BRACKET) { System.out.println("GUIDefaultsFile.read_color: closing bracket expected"); } return null; } rgb_color_arr[i] = (Integer)next_token; } return new java.awt.Color(rgb_color_arr[0], rgb_color_arr[1],rgb_color_arr[2]); } /** * reads a n array java.awt.Color from the defaults file. * Returns null, if no valid colors were found. */ private java.awt.Color[] read_color_array() throws java.io.IOException { java.util.Collection<java.awt.Color> color_list = new java.util.LinkedList<java.awt.Color>(); for(;;) { java.awt.Color curr_color = read_color(); if (curr_color == null) { break; } color_list.add(curr_color); } java.awt.Color[] result = new java.awt.Color[color_list.size()]; java.util.Iterator<java.awt.Color> it = color_list.iterator(); for (int i = 0; i < result.length; ++i) { result[i] = it.next(); } return result; } private void write_colors_scope() throws java.io.IOException { boardgraphics.GraphicsContext graphics_context = this.board_handling.graphics_context; out_file.start_scope(); out_file.write("colors"); out_file.start_scope(); out_file.write("background"); write_color_scope(graphics_context.get_background_color()); out_file.end_scope(); out_file.start_scope(); out_file.write("hilight"); write_color_intensity(graphics_context.get_hilight_color_intensity()); write_color_scope(graphics_context.get_hilight_color()); out_file.end_scope(); out_file.start_scope(); out_file.write("incompletes"); write_color_intensity(graphics_context.get_incomplete_color_intensity()); write_color_scope(graphics_context.get_incomplete_color()); out_file.end_scope(); out_file.start_scope(); out_file.write("outline"); write_color_scope(graphics_context.get_outline_color()); out_file.end_scope(); out_file.start_scope(); out_file.write("component_front"); write_color_scope(graphics_context.get_component_color(true)); out_file.end_scope(); out_file.start_scope(); out_file.write("component_back"); write_color_scope(graphics_context.get_component_color(false)); out_file.end_scope(); out_file.start_scope(); out_file.write("violations"); write_color_scope(graphics_context.get_violations_color()); out_file.end_scope(); out_file.start_scope(); out_file.write("length_matching"); write_color_intensity(graphics_context.get_length_matching_area_color_intensity()); write_color_scope(graphics_context.get_length_matching_area_color()); out_file.end_scope(); out_file.start_scope(); out_file.write("traces"); write_color_intensity(graphics_context.get_trace_color_intensity()); write_color(graphics_context.get_trace_colors(false)); out_file.end_scope(); out_file.start_scope(); out_file.write("fixed_traces"); write_color_intensity(graphics_context.get_trace_color_intensity()); write_color(graphics_context.get_trace_colors(true)); out_file.end_scope(); out_file.start_scope(); out_file.write("vias"); write_color_intensity(graphics_context.get_via_color_intensity()); write_color(graphics_context.get_via_colors(false)); out_file.end_scope(); out_file.start_scope(); out_file.write("fixed_vias"); write_color_intensity(graphics_context.get_via_color_intensity()); write_color(graphics_context.get_via_colors(true)); out_file.end_scope(); out_file.start_scope(); out_file.write("pins"); write_color_intensity(graphics_context.get_pin_color_intensity()); write_color(graphics_context.get_pin_colors()); out_file.end_scope(); out_file.start_scope(); out_file.write("conduction"); write_color_intensity(graphics_context.get_conduction_color_intensity()); write_color(graphics_context.get_conduction_colors()); out_file.end_scope(); out_file.start_scope(); out_file.write("keepout"); write_color_intensity(graphics_context.get_obstacle_color_intensity()); write_color(graphics_context.get_obstacle_colors()); out_file.end_scope(); out_file.start_scope(); out_file.write("via_keepout"); write_color_intensity(graphics_context.get_via_obstacle_color_intensity()); write_color(graphics_context.get_via_obstacle_colors()); out_file.end_scope(); out_file.end_scope(); } private void write_color_intensity(double p_value)throws java.io.IOException { out_file.write(" "); Float value = (float) p_value; out_file.write(value.toString()); } private void write_color_scope(java.awt.Color p_color) throws java.io.IOException { out_file.new_line(); Integer red = p_color.getRed(); out_file.write(red.toString()); out_file.write(" "); Integer green = p_color.getGreen(); out_file.write(green.toString()); out_file.write(" "); Integer blue = p_color.getBlue(); out_file.write(blue.toString()); } private void write_color(java.awt.Color[] p_colors) throws java.io.IOException { for (int i = 0; i < p_colors.length; ++i) { write_color_scope(p_colors[i]); } } private boolean read_parameter_scope() throws java.io.IOException { // read the subscopes of the parameter scope Object next_token = null; for (;;) { Object prev_token = next_token; next_token = this.scanner.next_token(); if (next_token == null) { // unexpected end of file return false; } if (next_token == Keyword.CLOSED_BRACKET) { // end of scope break; } if (prev_token == Keyword.OPEN_BRACKET) { if (next_token == Keyword.SELECTION_LAYERS) { if (!read_selection_layer_scope()) { return false; } } else if (next_token == Keyword.VIA_SNAP_TO_SMD_CENTER) { if (!read_via_snap_to_smd_center_scope()) { return false; } } else if (next_token == Keyword.SHOVE_ENABLED) { if (!read_shove_enabled_scope()) { return false; } } else if (next_token == Keyword.DRAG_COMPONENTS_ENABLED) { if (!read_drag_components_enabled_scope()) { return false; } } else if (next_token == Keyword.ROUTE_MODE) { if (!read_route_mode_scope()) { return false; } } else if (next_token == Keyword.PULL_TIGHT_REGION) { if (!read_pull_tight_region_scope()) { return false; } } else if (next_token == Keyword.PULL_TIGHT_ACCURACY) { if (!read_pull_tight_accuracy_scope()) { return false; } } else if (next_token == Keyword.IGNORE_CONDUCTION_AREAS) { if (!read_ignore_conduction_scope()) { return false; } } else if (next_token == Keyword.AUTOMATIC_LAYER_DIMMING) { if (!read_automatic_layer_dimming_scope()) { return false; } } else if (next_token == Keyword.CLEARANCE_COMPENSATION) { if (!read_clearance_compensation_scope()) { return false; } } else if (next_token == Keyword.HILIGHT_ROUTING_OBSTACLE) { if (!read_hilight_routing_obstacle_scope()) { return false; } } else if (next_token == Keyword.SELECTABLE_ITEMS) { if (!read_selectable_item_scope()) { return false; } } else if (next_token == Keyword.DESELECTED_SNAPSHOT_ATTRIBUTES) { if (!read_deselected_snapshot_attributes()) { return false; } } else { // skip unknown scope skip_scope(this.scanner); } } } return true; } private void write_parameter_scope() throws java.io.IOException { out_file.start_scope(); out_file.write("parameter"); write_selection_layer_scope(); write_selectable_item_scope(); write_via_snap_to_smd_center_scope(); write_route_mode_scope(); write_shove_enabled_scope(); write_drag_components_enabled_scope(); write_hilight_routing_obstacle_scope(); write_pull_tight_region_scope(); write_pull_tight_accuracy_scope(); write_clearance_compensation_scope(); write_ignore_conduction_scope(); write_automatic_layer_dimming_scope(); write_deselected_snapshot_attributes(); out_file.end_scope(); } private boolean read_selection_layer_scope() throws java.io.IOException { Object next_token = this.scanner.next_token(); boolean select_on_all_layers; if (next_token == Keyword.ALL_VISIBLE) { select_on_all_layers = true; } else if (next_token == Keyword.CURRENT_ONLY) { select_on_all_layers = false; } else { System.out.println("GUIDefaultsFile.read_selection_layer_scope: unexpected token"); return false; } next_token = this.scanner.next_token(); if (next_token != Keyword.CLOSED_BRACKET) { System.out.println("GUIDefaultsFile.read_selection_layer_scop: closing bracket expected"); return false; } this.board_handling.settings.set_select_on_all_visible_layers(select_on_all_layers); return true; } private boolean read_shove_enabled_scope() throws java.io.IOException { Object next_token = this.scanner.next_token(); boolean shove_enabled; if (next_token == Keyword.ON) { shove_enabled = true; } else if (next_token == Keyword.OFF) { shove_enabled = false; } else { System.out.println("GUIDefaultsFile.read_shove_enabled_scope: unexpected token"); return false; } next_token = this.scanner.next_token(); if (next_token != Keyword.CLOSED_BRACKET) { System.out.println("GUIDefaultsFile.read_shove_enabled_scope: closing bracket expected"); return false; } this.board_handling.settings.set_push_enabled(shove_enabled); return true; } private boolean read_drag_components_enabled_scope() throws java.io.IOException { Object next_token = this.scanner.next_token(); boolean drag_components_enabled; if (next_token == Keyword.ON) { drag_components_enabled = true; } else if (next_token == Keyword.OFF) { drag_components_enabled = false; } else { System.out.println("GUIDefaultsFile.read_drag_components_enabled_scope: unexpected token"); return false; } next_token = this.scanner.next_token(); if (next_token != Keyword.CLOSED_BRACKET) { System.out.println("GUIDefaultsFile.read_drag_components_enabled_scope: closing bracket expected"); return false; } this.board_handling.settings.set_drag_components_enabled(drag_components_enabled); return true; } private boolean read_ignore_conduction_scope() throws java.io.IOException { Object next_token = this.scanner.next_token(); boolean ignore_conduction; if (next_token == Keyword.ON) { ignore_conduction = true; } else if (next_token == Keyword.OFF) { ignore_conduction = false; } else { System.out.println("GUIDefaultsFile.read_ignore_conduction_scope: unexpected token"); return false; } next_token = this.scanner.next_token(); if (next_token != Keyword.CLOSED_BRACKET) { System.out.println("GUIDefaultsFile.read_ignore_conduction_scope: closing bracket expected"); return false; } this.board_handling.set_ignore_conduction(ignore_conduction); return true; } private void write_shove_enabled_scope() throws java.io.IOException { out_file.start_scope(); out_file.write("shove_enabled "); out_file.new_line(); if (this.board_handling.settings.get_push_enabled()) { out_file.write("on"); } else { out_file.write("off"); } out_file.end_scope(); } private void write_drag_components_enabled_scope() throws java.io.IOException { out_file.start_scope(); out_file.write("drag_components_enabled "); out_file.new_line(); if (this.board_handling.settings.get_drag_components_enabled()) { out_file.write("on"); } else { out_file.write("off"); } out_file.end_scope(); } private void write_ignore_conduction_scope() throws java.io.IOException { out_file.start_scope(); out_file.write("ignore_conduction_areas "); out_file.new_line(); if (this.board_handling.get_routing_board().rules.get_ignore_conduction()) { out_file.write("on"); } else { out_file.write("off"); } out_file.end_scope(); } private void write_selection_layer_scope() throws java.io.IOException { out_file.start_scope(); out_file.write("selection_layers "); out_file.new_line(); if (this.board_handling.settings.get_select_on_all_visible_layers()) { out_file.write("all_visible"); } else { out_file.write("current_only"); } out_file.end_scope(); } private boolean read_route_mode_scope() throws java.io.IOException { Object next_token = this.scanner.next_token(); boolean is_stitch_mode; if (next_token == Keyword.STITCHING) { is_stitch_mode = true; } else if (next_token == Keyword.DYNAMIC) { is_stitch_mode = false; } else { System.out.println("GUIDefaultsFile.read_roude_mode_scope: unexpected token"); return false; } next_token = this.scanner.next_token(); if (next_token != Keyword.CLOSED_BRACKET) { System.out.println("GUIDefaultsFile.read_selection_layer_scope: closing bracket expected"); return false; } this.board_handling.settings.set_stitch_route(is_stitch_mode); return true; } private void write_route_mode_scope() throws java.io.IOException { out_file.start_scope(); out_file.write("route_mode "); out_file.new_line(); if (this.board_handling.settings.get_is_stitch_route()) { out_file.write("stitching"); } else { out_file.write("dynamic"); } out_file.end_scope(); } private boolean read_pull_tight_region_scope() throws java.io.IOException { Object next_token = this.scanner.next_token(); if (!(next_token instanceof Integer) ) { System.out.println("GUIDefaultsFile.read_pull_tight_region_scope: Integer expected"); return false; } int pull_tight_region = (Integer) next_token; next_token = this.scanner.next_token(); if (next_token != Keyword.CLOSED_BRACKET) { System.out.println("GUIDefaultsFile.read_pull_tight_region_scope: closing bracket expected"); return false; } this.board_handling.settings.set_current_pull_tight_region_width(pull_tight_region); return true; } private void write_pull_tight_region_scope() throws java.io.IOException { out_file.start_scope(); out_file.write("pull_tight_region "); out_file.new_line(); Integer pull_tight_region = this.board_handling.settings.get_trace_pull_tight_region_width(); out_file.write(pull_tight_region.toString()); out_file.end_scope(); } private boolean read_pull_tight_accuracy_scope() throws java.io.IOException { Object next_token = this.scanner.next_token(); if (!(next_token instanceof Integer) ) { System.out.println("GUIDefaultsFile.read_pull_tight_accuracy_scope: Integer expected"); return false; } int pull_tight_accuracy = (Integer) next_token; next_token = this.scanner.next_token(); if (next_token != Keyword.CLOSED_BRACKET) { System.out.println("GUIDefaultsFile.read_pull_tight_accuracy_scope: closing bracket expected"); return false; } this.board_handling.settings.set_current_pull_tight_accuracy(pull_tight_accuracy); return true; } private void write_pull_tight_accuracy_scope() throws java.io.IOException { out_file.start_scope(); out_file.write("pull_tight_accuracy "); out_file.new_line(); Integer pull_tight_accuracy = this.board_handling.settings.get_trace_pull_tight_accuracy(); out_file.write(pull_tight_accuracy.toString()); out_file.end_scope(); } private boolean read_automatic_layer_dimming_scope() throws java.io.IOException { Object next_token = this.scanner.next_token(); double intensity; if (next_token instanceof Double) { intensity = (Double) next_token; } else if (next_token instanceof Integer) { intensity = (Integer) next_token; } else { System.out.println("GUIDefaultsFile.read_automatic_layer_dimming_scope: Integer expected"); return false; } next_token = this.scanner.next_token(); if (next_token != Keyword.CLOSED_BRACKET) { System.out.println("GUIDefaultsFile.read_automatic_layer_dimming_scope: closing bracket expected"); return false; } this.board_handling.graphics_context.set_auto_layer_dim_factor(intensity); return true; } private void write_automatic_layer_dimming_scope() throws java.io.IOException { out_file.start_scope(); out_file.write("automatic_layer_dimming "); out_file.new_line(); Float layer_dimming = (float) this.board_handling.graphics_context.get_auto_layer_dim_factor(); out_file.write(layer_dimming.toString()); out_file.end_scope(); } private boolean read_hilight_routing_obstacle_scope() throws java.io.IOException { Object next_token = this.scanner.next_token(); boolean hilight_obstacle; if (next_token == Keyword.ON) { hilight_obstacle = true; } else if (next_token == Keyword.OFF) { hilight_obstacle = false; } else { System.out.println("GUIDefaultsFile.read_hilight_routing_obstacle_scope: unexpected token"); return false; } next_token = this.scanner.next_token(); if (next_token != Keyword.CLOSED_BRACKET) { System.out.println("GUIDefaultsFile.read_hilight_routing_obstacle_scope: closing bracket expected"); return false; } this.board_handling.settings.set_hilight_routing_obstacle(hilight_obstacle); return true; } private void write_hilight_routing_obstacle_scope() throws java.io.IOException { out_file.start_scope(); out_file.write("hilight_routing_obstacle "); out_file.new_line(); if (this.board_handling.settings.get_hilight_routing_obstacle()) { out_file.write("on"); } else { out_file.write("off"); } out_file.end_scope(); } private boolean read_clearance_compensation_scope() throws java.io.IOException { Object next_token = this.scanner.next_token(); boolean clearance_compensation; if (next_token == Keyword.ON) { clearance_compensation = true; } else if (next_token == Keyword.OFF) { clearance_compensation = false; } else { System.out.println("GUIDefaultsFile.read_clearance_compensation_scope: unexpected token"); return false; } next_token = this.scanner.next_token(); if (next_token != Keyword.CLOSED_BRACKET) { System.out.println("GUIDefaultsFile.read_clearance_compensation_scope: closing bracket expected"); return false; } this.board_handling.set_clearance_compensation(clearance_compensation); return true; } private void write_clearance_compensation_scope() throws java.io.IOException { out_file.start_scope(); out_file.write("clearance_compensation "); out_file.new_line(); if (this.board_handling.get_routing_board().search_tree_manager.is_clearance_compensation_used()) { out_file.write("on"); } else { out_file.write("off"); } out_file.end_scope(); } private boolean read_via_snap_to_smd_center_scope() throws java.io.IOException { Object next_token = this.scanner.next_token(); boolean snap; if (next_token == Keyword.ON) { snap = true; } else if (next_token == Keyword.OFF) { snap = false; } else { System.out.println("GUIDefaultsFile.read_via_snap_to_smd_center_scope: unexpected token"); return false; } next_token = this.scanner.next_token(); if (next_token != Keyword.CLOSED_BRACKET) { System.out.println("GUIDefaultsFile.read_via_snap_to_smd_center_scope: closing bracket expected"); return false; } this.board_handling.settings.set_via_snap_to_smd_center(snap); return true; } private void write_via_snap_to_smd_center_scope() throws java.io.IOException { out_file.start_scope(); out_file.write("via_snap_to_smd_center "); out_file.new_line(); if (this.board_handling.settings.get_via_snap_to_smd_center()) { out_file.write("on"); } else { out_file.write("off"); } out_file.end_scope(); } private boolean read_selectable_item_scope() throws java.io.IOException { ItemSelectionFilter item_selection_filter = this.board_handling.settings.get_item_selection_filter(); item_selection_filter.deselect_all(); for (;;) { Object next_token = this.scanner.next_token(); if (next_token == Keyword.CLOSED_BRACKET) { break; } if (next_token == Keyword.TRACES) { item_selection_filter.set_selected(ItemSelectionFilter.SelectableChoices.TRACES, true); } else if (next_token == Keyword.VIAS) { item_selection_filter.set_selected(ItemSelectionFilter.SelectableChoices.VIAS, true); } else if (next_token == Keyword.PINS) { item_selection_filter.set_selected(ItemSelectionFilter.SelectableChoices.PINS, true); } else if (next_token == Keyword.CONDUCTION) { item_selection_filter.set_selected(ItemSelectionFilter.SelectableChoices.CONDUCTION, true); } else if (next_token == Keyword.KEEPOUT) { item_selection_filter.set_selected(ItemSelectionFilter.SelectableChoices.KEEPOUT, true); } else if (next_token == Keyword.VIA_KEEPOUT) { item_selection_filter.set_selected(ItemSelectionFilter.SelectableChoices.VIA_KEEPOUT, true); } else if (next_token == Keyword.FIXED) { item_selection_filter.set_selected(ItemSelectionFilter.SelectableChoices.FIXED, true); } else if (next_token == Keyword.UNFIXED) { item_selection_filter.set_selected(ItemSelectionFilter.SelectableChoices.UNFIXED, true); } else if (next_token == Keyword.VIAS) { item_selection_filter.set_selected(ItemSelectionFilter.SelectableChoices.VIAS, true); } else { System.out.println("GUIDefaultsFile.read_selectable_item_scope: unexpected token"); return false; } } return true; } private void write_selectable_item_scope() throws java.io.IOException { out_file.start_scope(); out_file.write("selectable_items "); out_file.new_line(); ItemSelectionFilter item_selection_filter = this.board_handling.settings.get_item_selection_filter(); ItemSelectionFilter.SelectableChoices [] selectable_choices = ItemSelectionFilter.SelectableChoices.values(); for (int i = 0; i < selectable_choices.length; ++i) { if (item_selection_filter.is_selected(selectable_choices[i])) { out_file.write(selectable_choices[i].toString()); out_file.write(" "); } } out_file.end_scope(); } private void write_deselected_snapshot_attributes() throws java.io.IOException { interactive.SnapShot.Attributes attributes = this.board_handling.settings.get_snapshot_attributes(); out_file.start_scope(); out_file.write("deselected_snapshot_attributes "); if (!attributes.object_colors) { out_file.new_line(); out_file.write("object_colors "); } if (!attributes.object_visibility) { out_file.new_line(); out_file.write("object_visibility "); } if (!attributes.layer_visibility) { out_file.new_line(); out_file.write("layer_visibility "); } if (!attributes.display_region) { out_file.new_line(); out_file.write("display_region "); } if (!attributes.interactive_state) { out_file.new_line(); out_file.write("interactive_state "); } if (!attributes.selection_layers) { out_file.new_line(); out_file.write("selection_layers "); } if (!attributes.selectable_items) { out_file.new_line(); out_file.write("selectable_items "); } if (!attributes.current_layer) { out_file.new_line(); out_file.write("current_layer "); } if (!attributes.rule_selection) { out_file.new_line(); out_file.write("rule_selection "); } if (!attributes.manual_rule_settings) { out_file.new_line(); out_file.write("manual_rule_settings "); } if (!attributes.push_and_shove_enabled) { out_file.new_line(); out_file.write("push_and_shove_enabled "); } if (!attributes.drag_components_enabled) { out_file.new_line(); out_file.write("drag_components_enabled "); } if (!attributes.pull_tight_region) { out_file.new_line(); out_file.write("pull_tight_region "); } if (!attributes.component_grid) { out_file.new_line(); out_file.write("component_grid "); } out_file.end_scope(); } private boolean read_deselected_snapshot_attributes() throws java.io.IOException { interactive.SnapShot.Attributes attributes = this.board_handling.settings.get_snapshot_attributes(); for (;;) { Object next_token = this.scanner.next_token(); if (next_token == Keyword.CLOSED_BRACKET) { break; } if (next_token == Keyword.OBJECT_COLORS) { attributes.object_colors = false; } else if (next_token == Keyword.OBJECT_VISIBILITY) { attributes.object_visibility = false; } else if (next_token == Keyword.LAYER_VISIBILITY) { attributes.layer_visibility = false; } else if (next_token == Keyword.DISPLAY_REGION) { attributes.display_region = false; } else if (next_token == Keyword.INTERACTIVE_STATE) { attributes.interactive_state = false; } else if (next_token == Keyword.SELECTION_LAYERS) { attributes.selection_layers = false; } else if (next_token == Keyword.SELECTABLE_ITEMS) { attributes.selectable_items = false; } else if (next_token == Keyword.CURRENT_LAYER) { attributes.current_layer = false; } else if (next_token == Keyword.RULE_SELECTION) { attributes.rule_selection = false; } else if (next_token == Keyword.MANUAL_RULE_SETTINGS) { attributes.manual_rule_settings = false; } else if (next_token == Keyword.PUSH_AND_SHOVE_ENABLED) { attributes.push_and_shove_enabled = false; } else if (next_token == Keyword.DRAG_COMPONENTS_ENABLED) { attributes.drag_components_enabled = false; } else if (next_token == Keyword.PULL_TIGHT_REGION) { attributes.pull_tight_region = false; } else if (next_token == Keyword.COMPONENT_GRID) { attributes.component_grid = false; } else { System.out.println("GUIDefaultsFile.read_deselected_snapshot_attributes: unexpected token"); return false; } } return true; } /** * Skips the current scope. * Returns false, if no legal scope was found. */ private static boolean skip_scope(GUIDefaultsScanner p_scanner) { int open_bracked_count = 1; while (open_bracked_count > 0) { Object curr_token = null; try { curr_token = p_scanner.next_token(); } catch (Exception e) { System.out.println("GUIDefaultsFile.skip_scope: Error while scanning file"); System.out.println(e); return false; } if (curr_token == null) { return false; // end of file } if (curr_token == Keyword.OPEN_BRACKET) { ++open_bracked_count; } else if (curr_token == Keyword.CLOSED_BRACKET) { --open_bracked_count; } } System.out.println("GUIDefaultsFile.skip_spope: unknown scope skipped"); return true; } private final gui.BoardFrame board_frame; private final interactive.BoardHandling board_handling; /** Used, when reading a defaults file, null otherwise. */ private final GUIDefaultsScanner scanner; /** Used, when writing a defaults file; null otherwise. */ private final IndentFileWriter out_file; }