/*
* 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.
*
* ViaRuleWindow.java
*
* Created on 5. April 2005, 06:29
*/
package gui;
import rules.ViaRule;
import rules.ViaInfo;
import rules.ViaInfos;
/**
* Window for editing a single via rule.
*
* @author Alfons Wirtz
*/
public class WindowViaRule extends javax.swing.JFrame
{
/** Creates a new instance of ViaRuleWindow */
public WindowViaRule(ViaRule p_via_rule, ViaInfos p_via_list, BoardFrame p_board_frame)
{
this.via_rule = p_via_rule;
this.via_list = p_via_list;
this.resources = java.util.ResourceBundle.getBundle("gui.resources.WindowViaRule", p_board_frame.get_locale());
this.setTitle(resources.getString("title") + " " + p_via_rule.name);
this.main_panel = new javax.swing.JPanel();
main_panel.setBorder(javax.swing.BorderFactory.createEmptyBorder(20,20,20,20));
main_panel.setLayout(new java.awt.BorderLayout());
this.rule_list_model = new javax.swing.DefaultListModel();
this.rule_list = new javax.swing.JList(this.rule_list_model);
this.rule_list.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
this.rule_list.setVisibleRowCount(10);
javax.swing.JScrollPane list_scroll_pane = new javax.swing.JScrollPane(this.rule_list);
list_scroll_pane.setPreferredSize(new java.awt.Dimension(200, 100));
this.main_panel.add(list_scroll_pane, java.awt.BorderLayout.CENTER);
// fill the list
for (int i = 0; i < p_via_rule.via_count(); ++i)
{
this.rule_list_model.addElement(p_via_rule.get_via(i));
}
// Add a panel with buttons for editing the via list.
javax.swing.JPanel button_panel = new javax.swing.JPanel();
this.main_panel.add(button_panel,java.awt.BorderLayout.SOUTH);
java.awt.GridBagLayout gridbag = new java.awt.GridBagLayout();
button_panel.setLayout(gridbag);
java.awt.GridBagConstraints gridbag_constraints = new java.awt.GridBagConstraints();
final javax.swing.JButton add_button = new javax.swing.JButton(resources.getString("append"));
gridbag_constraints.gridwidth = java.awt.GridBagConstraints.RELATIVE;
gridbag.setConstraints(add_button, gridbag_constraints);
add_button.setToolTipText(resources.getString("append_tooltip"));
add_button.addActionListener(new AppendListener());
button_panel.add(add_button);
final javax.swing.JButton delete_button = new javax.swing.JButton(resources.getString("remove"));
gridbag_constraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridbag.setConstraints(delete_button, gridbag_constraints);
delete_button.setToolTipText(resources.getString("remove_tooltip"));
delete_button.addActionListener(new DeleteListener());
button_panel.add(delete_button);
final javax.swing.JButton move_up_button = new javax.swing.JButton(resources.getString("move_up"));
gridbag_constraints.gridwidth = java.awt.GridBagConstraints.RELATIVE;
gridbag.setConstraints(move_up_button, gridbag_constraints);
move_up_button.setToolTipText(resources.getString("move_up_tooltip"));
move_up_button.addActionListener(new MoveUpListener());
button_panel.add(move_up_button);
final javax.swing.JButton move_down_button = new javax.swing.JButton(resources.getString("move_down"));
gridbag_constraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridbag.setConstraints(move_down_button, gridbag_constraints);
move_down_button.setToolTipText(resources.getString("move_down_tooltip"));
move_down_button.addActionListener(new MoveDownListener());
button_panel.add(move_down_button);
p_board_frame.set_context_sensitive_help(this, "WindowVia_EditViaRule");
this.add(main_panel);
this.pack();
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE );
this.setVisible(true);
}
/**
* Swaps the position of the vias with index p_1 and p_2.
*/
private void swap_position(int p_1, int p_2)
{
ViaInfo via_1 = (ViaInfo) this.rule_list_model.get(p_1);
ViaInfo via_2 = (ViaInfo) this.rule_list_model.get(p_2);
if (via_1 == null || via_2 == null)
{
return;
}
this.rule_list_model.set(p_1, via_2);
this.rule_list_model.set(p_2, via_1);
this.via_rule.swap(via_1, via_2);
}
private final ViaRule via_rule;
/** the list of possible vias in a rule */
private final ViaInfos via_list;
private final javax.swing.JPanel main_panel;
private final javax.swing.JList rule_list;
private final javax.swing.DefaultListModel rule_list_model;
private final java.util.ResourceBundle resources;
private class AppendListener implements java.awt.event.ActionListener
{
public void actionPerformed(java.awt.event.ActionEvent p_evt)
{
Object[] possible_values = new Object[via_list.count() - via_rule.via_count()];
if (possible_values.length <= 0)
{
return;
}
int curr_index = 0;
for (int i = 0; i < via_list.count(); ++i)
{
ViaInfo curr_via = via_list.get(i);
if (!via_rule.contains(curr_via))
{
if (curr_index >= possible_values.length)
{
System.out.println("ViaRuleWindow.AppendListener.actionPerformed: index inconsistent");
break;
}
possible_values[curr_index] = curr_via;
++curr_index;
}
}
assert (curr_index == possible_values.length);
Object selected_value = javax.swing.JOptionPane.showInputDialog(null,
resources.getString("choose_via_to_append"), resources.getString("append_via_to_rule"),
javax.swing.JOptionPane.INFORMATION_MESSAGE, null, possible_values, possible_values[0]);
if (selected_value != null)
{
ViaInfo selected_via = (ViaInfo)selected_value;
via_rule.append_via(selected_via);
rule_list_model.addElement(selected_via);
}
}
}
private class DeleteListener implements java.awt.event.ActionListener
{
public void actionPerformed(java.awt.event.ActionEvent p_evt)
{
ViaInfo selected_via = (ViaInfo) rule_list.getSelectedValue();
if (selected_via != null)
{
String message = resources.getString("remove_2") + " " + selected_via.get_name() +
" " + resources.getString("from_the_rule") + " " + via_rule.name + "?";
if (WindowMessage.confirm(message))
{
rule_list_model.removeElement(selected_via);
via_rule.remove_via(selected_via);
}
}
}
}
private class MoveUpListener implements java.awt.event.ActionListener
{
public void actionPerformed(java.awt.event.ActionEvent p_evt)
{
int selected_index = rule_list.getSelectedIndex();
if (selected_index <= 0)
{
return;
}
swap_position(selected_index - 1, selected_index);
rule_list.setSelectedIndex(selected_index - 1);
}
}
private class MoveDownListener implements java.awt.event.ActionListener
{
public void actionPerformed(java.awt.event.ActionEvent p_evt)
{
int selected_index = rule_list.getSelectedIndex();
if (selected_index < 0 || selected_index >= rule_list_model.getSize() - 1)
{
return;
}
swap_position(selected_index, selected_index + 1);
rule_list.setSelectedIndex(selected_index + 1);
}
}
}