/* * 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. * * ViaTablePanel.java * * Created on 4. April 2005, 07:05 */ package gui; import rules.ViaInfo; import rules.ViaInfos; import rules.BoardRules; /** * Edit window for the table of available vias. * * @author Alfons Wirtz */ public class WindowEditVias extends BoardSavableSubWindow { /** Creates a new instance of ViaTablePanel */ public WindowEditVias(BoardFrame p_board_frame) { this.resources = java.util.ResourceBundle.getBundle("gui.resources.WindowEditVias", p_board_frame.get_locale()); this.setTitle(resources.getString("title")); this.board_frame = p_board_frame; this.main_panel = new javax.swing.JPanel(); this.main_panel.setLayout(new java.awt.BorderLayout()); this.cl_class_combo_box = new javax.swing.JComboBox(); this.padstack_combo_box = new javax.swing.JComboBox(); add_combobox_items(); add_table(); javax.swing.JPanel via_info_button_panel = new javax.swing.JPanel(); via_info_button_panel.setLayout(new java.awt.FlowLayout()); this.main_panel.add(via_info_button_panel,java.awt.BorderLayout.SOUTH); final javax.swing.JButton add_via_button = new javax.swing.JButton(resources.getString("add")); add_via_button.setToolTipText(resources.getString("add_tooltip")); add_via_button.addActionListener(new AddViaListener()); via_info_button_panel.add(add_via_button); final javax.swing.JButton remove_via_button = new javax.swing.JButton(resources.getString("remove")); remove_via_button.setToolTipText(resources.getString("remove_tooltip")); remove_via_button.addActionListener(new RemoveViaListener()); via_info_button_panel.add(remove_via_button); p_board_frame.set_context_sensitive_help(this, "WindowVia_EditVia"); this.add(main_panel); this.pack(); } /** * Recalculates all values displayed in the parent window */ public void refresh() { this.padstack_combo_box.removeAllItems(); this.cl_class_combo_box.removeAllItems(); this.add_combobox_items(); this.table_model.set_values(); } private void add_table() { this.table_model = new ViaTableModel(); this.table = new javax.swing.JTable(this.table_model); this.scroll_pane = new javax.swing.JScrollPane(this.table); int table_height = TEXTFIELD_HEIGHT * this.table_model.getRowCount(); int table_width = TEXTFIELD_WIDTH * this.table_model.getColumnCount(); this.table.setPreferredScrollableViewportSize(new java.awt.Dimension(table_width, table_height)); this.table.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); this.main_panel.add(scroll_pane, java.awt.BorderLayout.CENTER); this.table.getColumnModel().getColumn(ColumnName.CLEARANCE_CLASS.ordinal()).setCellEditor(new javax.swing.DefaultCellEditor(cl_class_combo_box)); this.table.getColumnModel().getColumn(ColumnName.PADSTACK.ordinal()).setCellEditor(new javax.swing.DefaultCellEditor(padstack_combo_box)); } private void add_combobox_items() { board.RoutingBoard routing_board = board_frame.board_panel.board_handling.get_routing_board(); for (int i = 0; i < routing_board.rules.clearance_matrix.get_class_count(); ++i) { cl_class_combo_box.addItem(routing_board.rules.clearance_matrix.get_name(i)); } for (int i = 0; i < routing_board.library.via_padstack_count(); ++i) { padstack_combo_box.addItem(routing_board.library.get_via_padstack(i).name); } } /** * Adjusts the displayed window with the via table after the size of the table has been changed. */ private void adjust_table() { this.table_model = new ViaTableModel(); this.table = new javax.swing.JTable(this.table_model); this.main_panel.remove(this.scroll_pane); this.add_table(); this.pack(); this.board_frame.refresh_windows(); } private final BoardFrame board_frame; private final javax.swing.JPanel main_panel; private javax.swing.JScrollPane scroll_pane; private javax.swing.JTable table; private ViaTableModel table_model; private final javax.swing.JComboBox cl_class_combo_box; private final javax.swing.JComboBox padstack_combo_box; private final java.util.ResourceBundle resources; private static final int TEXTFIELD_HEIGHT = 16; private static final int TEXTFIELD_WIDTH = 100; private class AddViaListener implements java.awt.event.ActionListener { public void actionPerformed(java.awt.event.ActionEvent p_evt) { board.RoutingBoard routing_board = board_frame.board_panel.board_handling.get_routing_board(); ViaInfos via_infos = routing_board.rules.via_infos; Integer no = 1; String new_name = null; final String name_start = resources.getString("new_via"); for (;;) { new_name = name_start + no.toString(); if (!via_infos.name_exists(new_name)) { break; } ++no; } rules.NetClass default_net_class = routing_board.rules.get_default_net_class(); ViaInfo new_via = new ViaInfo(new_name, routing_board.library.get_via_padstack(0), default_net_class.default_item_clearance_classes.get(rules.DefaultItemClearanceClasses.ItemClass.VIA), false, routing_board.rules); via_infos.add(new_via); adjust_table(); } } private class RemoveViaListener implements java.awt.event.ActionListener { public void actionPerformed(java.awt.event.ActionEvent p_evt) { if (table_model.getRowCount() <= 1) { board_frame.screen_messages.set_status_message(resources.getString("message_1")); return; } int selected_row = table.getSelectedRow(); if (selected_row < 0) { return; } Object via_name = table_model.getValueAt(selected_row, ColumnName.NAME.ordinal()); if (!(via_name instanceof String)) { return; } BoardRules board_rules = board_frame.board_panel.board_handling.get_routing_board().rules; ViaInfo via_info = board_rules.via_infos.get((String) via_name); // Check, if via_info is used in a via rule. for (rules.ViaRule curr_rule : board_rules.via_rules) { if (curr_rule.contains(via_info)) { String message = resources.getString("message_2") + " " + curr_rule.name; board_frame.screen_messages.set_status_message(message); return; } } if (board_rules.via_infos.remove(via_info)) { adjust_table(); String message = resources.getString("via") + "via " + via_info.get_name() + " " + resources.getString("removed"); board_frame.screen_messages.set_status_message(message); } } } /** * Table model of the via table. */ private class ViaTableModel extends javax.swing.table.AbstractTableModel { public ViaTableModel() { column_names = new String[ColumnName.values().length]; for (int i = 0; i < column_names.length; ++i) { column_names[i] = resources.getString((ColumnName.values()[i]).toString()); } rules.BoardRules board_rules = board_frame.board_panel.board_handling.get_routing_board().rules; data = new Object[board_rules.via_infos.count()][]; for (int i = 0; i < data.length; ++i) { this.data[i] = new Object[ColumnName.values().length]; } set_values(); } /** Calculates the the valus in this table */ public void set_values() { rules.BoardRules board_rules = board_frame.board_panel.board_handling.get_routing_board().rules; for (int i = 0; i < data.length; ++i) { ViaInfo curr_via = board_rules.via_infos.get(i); this.data[i][ColumnName.NAME.ordinal()] = curr_via.get_name(); this.data[i][ColumnName.PADSTACK.ordinal()] = curr_via.get_padstack().name; this.data[i] [ColumnName.CLEARANCE_CLASS.ordinal()] = board_rules.clearance_matrix.get_name(curr_via.get_clearance_class()); this.data[i] [ColumnName.ATTACH_SMD.ordinal()] = curr_via.attach_smd_allowed(); } } public String getColumnName(int p_col) { return column_names[p_col]; } public int getRowCount() { return data.length; } public int getColumnCount() { return column_names.length; } public Object getValueAt(int p_row, int p_col) { return data[p_row][p_col]; } public void setValueAt(Object p_value, int p_row, int p_col) { board.RoutingBoard routing_board = board_frame.board_panel.board_handling.get_routing_board(); BoardRules board_rules = routing_board.rules; Object via_name = getValueAt(p_row, ColumnName.NAME.ordinal()); if (!(via_name instanceof String)) { System.out.println("ViaVindow.setValueAt: String expected"); return; } ViaInfo via_info = board_rules.via_infos.get((String) via_name); if (via_info == null) { System.out.println("ViaVindow.setValueAt: via_info not found"); return; } if (p_col == ColumnName.NAME.ordinal()) { if (!(p_value instanceof String)) { return; } String new_name = (String) p_value; if (board_rules.via_infos.name_exists(new_name)) { return; } via_info.set_name(new_name); board_frame.via_window.refresh(); } else if (p_col == ColumnName.PADSTACK.ordinal()) { if (!(p_value instanceof String)) { return; } String new_name = (String) p_value; library.Padstack new_padstack = routing_board.library.get_via_padstack(new_name); if (new_padstack == null) { System.out.println("ViaVindow.setValueAt: via padstack not found"); return; } via_info.set_padstack(new_padstack); } else if (p_col == ColumnName.CLEARANCE_CLASS.ordinal()) { if (!(p_value instanceof String)) { return; } String new_name = (String) p_value; int new_cl_class_index = board_rules.clearance_matrix.get_no(new_name); { if (new_cl_class_index < 0) { System.out.println("ViaVindow.setValueAt: clearance class not found"); return; } } via_info.set_clearance_class(new_cl_class_index); } else if (p_col == ColumnName.ATTACH_SMD.ordinal()) { if (!(p_value instanceof Boolean)) { System.out.println("ViaVindow.setValueAt: Boolean expected"); return; } Boolean attach_smd = (Boolean) p_value; via_info.set_attach_smd_allowed(attach_smd); } this.data[p_row][p_col] = p_value; fireTableCellUpdated(p_row, p_col); } public boolean isCellEditable(int p_row, int p_col) { return true; } public Class<?> getColumnClass(int p_col) { return getValueAt(0, p_col).getClass(); } private Object[][] data = null; private String[] column_names = null; } private enum ColumnName { NAME, PADSTACK, CLEARANCE_CLASS, ATTACH_SMD } }