create changelog entry
[debian/openrocket] / core / src / net / sf / openrocket / gui / customexpression / OperatorSelector.java
1 package net.sf.openrocket.gui.customexpression;
2
3 import java.awt.Point;
4 import java.awt.Window;
5 import java.awt.event.ActionEvent;
6 import java.awt.event.ActionListener;
7 import java.awt.event.KeyEvent;
8 import java.awt.event.MouseEvent;
9 import java.awt.event.MouseListener;
10 import java.awt.event.MouseMotionAdapter;
11
12 import javax.swing.AbstractAction;
13 import javax.swing.ActionMap;
14 import javax.swing.InputMap;
15 import javax.swing.JButton;
16 import javax.swing.JComponent;
17 import javax.swing.JDialog;
18 import javax.swing.JPanel;
19 import javax.swing.JScrollPane;
20 import javax.swing.JTable;
21 import javax.swing.KeyStroke;
22 import javax.swing.event.ListSelectionEvent;
23 import javax.swing.event.ListSelectionListener;
24
25 import net.miginfocom.swing.MigLayout;
26 import net.sf.openrocket.l10n.Translator;
27 import net.sf.openrocket.logging.LogHelper;
28 import net.sf.openrocket.startup.Application;
29 import net.sf.openrocket.util.TextUtil;
30
31 public class OperatorSelector extends JDialog {
32         
33         private static final Translator trans = Application.getTranslator();
34         private static final LogHelper log = Application.getLogger();
35
36         private final Window parentWindow;
37         
38         private final JTable table;
39         private final OperatorTableModel tableModel;
40         private final ExpressionBuilderDialog parentBuilder;
41         
42         public OperatorSelector(Window parent, final ExpressionBuilderDialog parentBuilder){
43                 
44                 super(parent, trans.get("CustomOperatorSelector.title"), JDialog.ModalityType.DOCUMENT_MODAL);
45                 
46                 this.parentWindow = parent;
47                 this.parentBuilder = parentBuilder;
48                 
49                 final JButton insertButton = new JButton(trans.get("ExpressionBuilderDialog.InsertOperator"));
50                 
51                 JPanel mainPanel = new JPanel(new MigLayout());
52                 
53                 //// Table of variables and model
54                 tableModel = new OperatorTableModel();
55                 table = new JTable(tableModel);
56                 
57                 table.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
58                 int width = table.getColumnModel().getTotalColumnWidth();
59                 table.getColumnModel().getColumn(0).setPreferredWidth( (int) (.1 * width));
60                 table.getColumnModel().getColumn(1).setPreferredWidth( (int) (.9 * width));
61                 table.setAutoCreateRowSorter(true);
62                 
63                 table.addMouseMotionListener(new MouseMotionAdapter(){
64                         @Override
65                         public void mouseMoved(MouseEvent e){
66                                 Point p = e.getPoint();
67                                 int row = table.rowAtPoint(p);
68                                 int col = table.columnAtPoint(p);
69                                 if (col == 1 && row > -1){
70                                         String description = String.valueOf(table.getValueAt(row, 1));
71                                         description = TextUtil.wrap(description, 60);
72                                         table.setToolTipText(description);
73                                 } else {
74                                         table.setToolTipText(null);
75                                 }
76                         }
77                 });
78                 
79                 table.addMouseListener(new MouseListener(){
80                         @Override
81                         public void mouseClicked(MouseEvent e){
82                                 if (e.getClickCount() == 2){
83                                         log.debug("Selected operator by double clicking.");
84                                         selectOperator();
85                                 }
86                         }
87                         @Override
88                         public void mouseEntered(MouseEvent e) {}
89                         @Override
90                         public void mouseExited(MouseEvent e) {}
91                         @Override
92                         public void mousePressed(MouseEvent e) {}
93                         @Override
94                         public void mouseReleased(MouseEvent e) {}
95                 } );
96                 
97                 InputMap inputMap = table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
98                 ActionMap actionMap = table.getActionMap();
99                 KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
100                 inputMap.put(enter, "select");
101                 actionMap.put("select", new AbstractAction(){
102                         @Override
103                         public void actionPerformed(ActionEvent arg0) {
104                                 log.debug("Selected operator by enter key");
105                                 selectOperator();
106                         }
107                 });
108                 
109                 JScrollPane scrollPane = new JScrollPane(table);
110                 table.setFillsViewportHeight(true);
111                 table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
112                                 @Override
113                                 public void valueChanged(ListSelectionEvent e){
114                                         if (table.getSelectedRowCount() == 1){
115                                                 insertButton.setEnabled(true);
116                                         }
117                                         else {
118                                                 insertButton.setEnabled(false);
119                                         }
120                                 }
121                         });
122                 
123                 mainPanel.add(scrollPane, "wrap, push, grow");
124                 
125                 //// Cancel button
126                 final JButton cancelButton = new JButton(trans.get("dlg.but.cancel"));
127                 cancelButton.addActionListener(new ActionListener() {
128                         @Override
129                         public void actionPerformed(ActionEvent e) {
130                                 OperatorSelector.this.dispose();
131                         }
132                 });
133                 mainPanel.add(cancelButton, "right, width :100:200, split 2");
134                 
135                 //// Insert button
136                 insertButton.addActionListener(new ActionListener() {
137                         @Override
138                         public void actionPerformed(ActionEvent e) {
139                                 selectOperator();
140                         }
141                 });
142                 insertButton.setEnabled(false); // disabled by default, only enable when a variable selected
143                 mainPanel.add(insertButton, "right, width :100:200, wrap");
144
145                 this.add(mainPanel);
146                 this.validate();
147                 this.pack();
148                 this.setLocationByPlatform(true);       
149         }
150         
151         private void selectOperator(){
152                 int row = table.getSelectedRow();
153                 String str = table.getValueAt(row, 0).toString();
154                 parentBuilder.pasteIntoExpression(str);
155                 OperatorSelector.this.dispose();
156         }
157 }