1 package net.sf.openrocket.gui.dialogs.preset;
4 import java.awt.Dialog;
5 import java.awt.Window;
6 import java.awt.event.ActionEvent;
7 import java.awt.event.ActionListener;
10 import javax.swing.JButton;
11 import javax.swing.JDialog;
12 import javax.swing.JLabel;
13 import javax.swing.JPanel;
14 import javax.swing.JScrollPane;
15 import javax.swing.JTable;
16 import javax.swing.JTextField;
17 import javax.swing.ListSelectionModel;
18 import javax.swing.RowFilter;
19 import javax.swing.event.DocumentEvent;
20 import javax.swing.event.DocumentListener;
21 import javax.swing.table.TableModel;
22 import javax.swing.table.TableRowSorter;
24 import net.miginfocom.swing.MigLayout;
25 import net.sf.openrocket.gui.adaptors.Column;
26 import net.sf.openrocket.gui.adaptors.ColumnTableModel;
27 import net.sf.openrocket.gui.util.GUIUtil;
28 import net.sf.openrocket.l10n.Translator;
29 import net.sf.openrocket.preset.ComponentPreset;
30 import net.sf.openrocket.preset.TypedKey;
31 import net.sf.openrocket.rocketcomponent.RocketComponent;
32 import net.sf.openrocket.startup.Application;
33 import net.sf.openrocket.unit.Value;
35 public class ComponentPresetChooserDialog extends JDialog {
37 private static final Translator trans = Application.getTranslator();
39 private final JTable componentSelectionTable;
40 private final TableRowSorter<TableModel> sorter;
41 private final JTextField filterText;
43 private final List<ComponentPreset> presets;
45 private boolean okClicked = false;
48 public ComponentPresetChooserDialog(Window owner, RocketComponent component) {
49 super(owner, trans.get("title"), Dialog.ModalityType.APPLICATION_MODAL);
51 final TypedKey<?>[] columnKeys = component.getPresetType().getDisplayedColumns();
53 presets = Application.getComponentPresetDao().listForType(component.getPresetType());
55 JPanel panel = new JPanel(new MigLayout("fill"));
56 JLabel filterLabel = new JLabel(trans.get("ComponentPresetChooserDialog.filter.label"));
57 panel.add(filterLabel);
58 filterText = new JTextField(15);
59 panel.add(filterText,"growx, growy 0, wrap");
60 filterText.getDocument().addDocumentListener(new DocumentListener() {
62 public void changedUpdate(DocumentEvent e) {
63 newFilter(filterText.getText());
66 public void insertUpdate(DocumentEvent e) {
67 newFilter(filterText.getText());
70 public void removeUpdate(DocumentEvent e) {
71 newFilter(filterText.getText());
75 final Column[] columns = new Column[columnKeys.length+1];
77 columns[0] = new Column(trans.get("table.column.Favorite") ) {
79 public Object getValueAt(int row) {
80 return Boolean.valueOf(ComponentPresetChooserDialog.this.presets.get(row).isFavorite());
84 public void setValueAt(int row, Object value) {
85 Application.getComponentPresetDao().setFavorite(ComponentPresetChooserDialog.this.presets.get(row), (Boolean) value);
89 public Class<?> getColumnClass() {
94 for (int i = 0; i < columnKeys.length; i++) {
95 final TypedKey<?> key = columnKeys[i];
96 columns[i+1] = new Column(trans.get("table.column." + columnKeys[i].getName())) {
98 public Object getValueAt(int row) {
99 if (key.getType() == Double.class && key.getUnitGroup() != null) {
100 double v = (Double) ComponentPresetChooserDialog.this.presets.get(row).get(key);
101 return new Value( v, key.getUnitGroup() );
103 return ComponentPresetChooserDialog.this.presets.get(row).get(key);
109 ColumnTableModel tableModel = new ColumnTableModel(columns) {
111 public int getRowCount() {
112 return ComponentPresetChooserDialog.this.presets.size();
116 public boolean isCellEditable(int rowIndex, int columnIndex) {
117 return columnIndex == 0;
122 componentSelectionTable = new JTable( tableModel );
124 componentSelectionTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
126 sorter = new TableRowSorter<TableModel>(tableModel);
127 componentSelectionTable.setRowSorter(sorter);
129 JScrollPane scrollpane = new JScrollPane();
130 scrollpane.setViewportView(componentSelectionTable);
131 panel.add(scrollpane, "grow, width :500:, height :300:, spanx, wrap para");
134 // OK / Cancel buttons
135 JButton okButton = new JButton(trans.get("dlg.but.ok"));
136 okButton.addActionListener(new ActionListener() {
138 public void actionPerformed(ActionEvent e) {
142 panel.add(okButton, "tag ok, spanx, split");
145 JButton cancelButton = new JButton(trans.get("dlg.but.cancel"));
146 cancelButton.addActionListener(new ActionListener() {
148 public void actionPerformed(ActionEvent e) {
152 panel.add(cancelButton, "tag cancel");
158 this.setLocationByPlatform(true);
159 GUIUtil.setDisposableDialogOptions(this, okButton);
161 //JComponent focus = selectionPanel.getDefaultFocus();
162 //if (focus != null) {
163 // focus.grabFocus();
166 // Set the closeable dialog after all initialization
167 //selectionPanel.setCloseableDialog(this);
171 * Return the motor selected by this chooser dialog, or <code>null</code> if the selection has been aborted.
173 * @return the selected motor, or <code>null</code> if no motor has been selected or the selection was canceled.
175 public ComponentPreset getSelectedComponentPreset() {
178 int row = componentSelectionTable.getSelectedRow();
179 row = componentSelectionTable.convertRowIndexToModel(row);
180 return presets.get(row);
183 public void close(boolean ok) {
185 this.setVisible(false);
188 private void newFilter(String regex) {
189 RowFilter<TableModel,Object> filter = null;
191 // The "(?iu)" magic turns on case insensitivity with unicode chars
192 filter = RowFilter.regexFilter("(?iu)"+regex);
193 } catch ( java.util.regex.PatternSyntaxException e ) {
194 // FIXME - do we want to remove the filter?
197 sorter.setRowFilter(filter);