--- /dev/null
+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();
+ }
+}