Merge commit '42b2e5ca519766e37ce6941ba4faecc9691cc403' into upstream
[debian/openrocket] / core / src / net / sf / openrocket / gui / customexpression / OperatorSelector.java
diff --git a/core/src/net/sf/openrocket/gui/customexpression/OperatorSelector.java b/core/src/net/sf/openrocket/gui/customexpression/OperatorSelector.java
new file mode 100644 (file)
index 0000000..d51af30
--- /dev/null
@@ -0,0 +1,157 @@
+package net.sf.openrocket.gui.customexpression;
+
+import java.awt.Point;
+import java.awt.Window;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionAdapter;
+
+import javax.swing.AbstractAction;
+import javax.swing.ActionMap;
+import javax.swing.InputMap;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JDialog;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+import javax.swing.KeyStroke;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+
+import net.miginfocom.swing.MigLayout;
+import net.sf.openrocket.l10n.Translator;
+import net.sf.openrocket.logging.LogHelper;
+import net.sf.openrocket.startup.Application;
+import net.sf.openrocket.util.TextUtil;
+
+public class OperatorSelector extends JDialog {
+       
+       private static final Translator trans = Application.getTranslator();
+       private static final LogHelper log = Application.getLogger();
+
+       private final Window parentWindow;
+       
+       private final JTable table;
+       private final OperatorTableModel tableModel;
+       private final ExpressionBuilderDialog parentBuilder;
+       
+       public OperatorSelector(Window parent, final ExpressionBuilderDialog parentBuilder){
+               
+               super(parent, trans.get("CustomOperatorSelector.title"), JDialog.ModalityType.DOCUMENT_MODAL);
+               
+               this.parentWindow = parent;
+               this.parentBuilder = parentBuilder;
+               
+               final JButton insertButton = new JButton(trans.get("ExpressionBuilderDialog.InsertOperator"));
+               
+               JPanel mainPanel = new JPanel(new MigLayout());
+               
+               //// Table of variables and model
+               tableModel = new OperatorTableModel();
+               table = new JTable(tableModel);
+               
+               table.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
+               int width = table.getColumnModel().getTotalColumnWidth();
+               table.getColumnModel().getColumn(0).setPreferredWidth( (int) (.1 * width));
+               table.getColumnModel().getColumn(1).setPreferredWidth( (int) (.9 * width));
+               table.setAutoCreateRowSorter(true);
+               
+               table.addMouseMotionListener(new MouseMotionAdapter(){
+                       @Override
+                       public void mouseMoved(MouseEvent e){
+                               Point p = e.getPoint();
+                               int row = table.rowAtPoint(p);
+                               int col = table.columnAtPoint(p);
+                               if (col == 1 && row > -1){
+                                       String description = String.valueOf(table.getValueAt(row, 1));
+                                       description = TextUtil.wrap(description, 60);
+                                       table.setToolTipText(description);
+                               } else {
+                                       table.setToolTipText(null);
+                               }
+                       }
+               });
+               
+               table.addMouseListener(new MouseListener(){
+                       @Override
+                       public void mouseClicked(MouseEvent e){
+                               if (e.getClickCount() == 2){
+                                       log.debug("Selected operator by double clicking.");
+                                       selectOperator();
+                               }
+                       }
+                       @Override
+                       public void mouseEntered(MouseEvent e) {}
+                       @Override
+                       public void mouseExited(MouseEvent e) {}
+                       @Override
+                       public void mousePressed(MouseEvent e) {}
+                       @Override
+                       public void mouseReleased(MouseEvent e) {}
+               } );
+               
+               InputMap inputMap = table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
+               ActionMap actionMap = table.getActionMap();
+               KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
+               inputMap.put(enter, "select");
+               actionMap.put("select", new AbstractAction(){
+                       @Override
+                       public void actionPerformed(ActionEvent arg0) {
+                               log.debug("Selected operator by enter key");
+                               selectOperator();
+                       }
+               });
+               
+               JScrollPane scrollPane = new JScrollPane(table);
+               table.setFillsViewportHeight(true);
+               table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
+                               @Override
+                               public void valueChanged(ListSelectionEvent e){
+                                       if (table.getSelectedRowCount() == 1){
+                                               insertButton.setEnabled(true);
+                                       }
+                                       else {
+                                               insertButton.setEnabled(false);
+                                       }
+                               }
+                       });
+               
+               mainPanel.add(scrollPane, "wrap, push, grow");
+               
+               //// Cancel button
+               final JButton cancelButton = new JButton(trans.get("dlg.but.cancel"));
+               cancelButton.addActionListener(new ActionListener() {
+                       @Override
+                       public void actionPerformed(ActionEvent e) {
+                               OperatorSelector.this.dispose();
+                       }
+               });
+               mainPanel.add(cancelButton, "right, width :100:200, split 2");
+               
+               //// Insert button
+               insertButton.addActionListener(new ActionListener() {
+                       @Override
+                       public void actionPerformed(ActionEvent e) {
+                               selectOperator();
+                       }
+               });
+               insertButton.setEnabled(false); // disabled by default, only enable when a variable selected
+               mainPanel.add(insertButton, "right, width :100:200, wrap");
+
+               this.add(mainPanel);
+               this.validate();
+               this.pack();
+               this.setLocationByPlatform(true);       
+       }
+       
+       private void selectOperator(){
+               int row = table.getSelectedRow();
+               String str = table.getValueAt(row, 0).toString();
+               parentBuilder.pasteIntoExpression(str);
+               OperatorSelector.this.dispose();
+       }
+}