simplification of FeatureSettings inner classes
[jalview.git] / src / jalview / gui / FeatureSettings.java
index 44265ed..93b5f31 100644 (file)
@@ -46,7 +46,6 @@ import java.awt.BorderLayout;
 import java.awt.Color;
 import java.awt.Component;
 import java.awt.Dimension;
-import java.awt.FlowLayout;
 import java.awt.Font;
 import java.awt.Graphics;
 import java.awt.GridLayout;
@@ -99,6 +98,7 @@ import javax.swing.ToolTipManager;
 import javax.swing.border.Border;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
+import javax.swing.plaf.TableUI;
 import javax.swing.table.AbstractTableModel;
 import javax.swing.table.TableCellEditor;
 import javax.swing.table.TableCellRenderer;
@@ -209,6 +209,33 @@ public class FeatureSettings extends JPanel
 
     table = new JTable()
     {
+       
+//     @Override
+//     public void repaint() {
+//       System.out.println("FS repaint");
+//       super.repaint();
+//       
+//     }
+//     
+//     @Override
+//        public void repaint(long tm, int x, int y, int width, int height) {
+//       System.out.println("FS repaint " + x  + " " + y + " " + width + " " + height);
+//       super.repaint(tm, x, y, width, height);
+//       
+//     }
+//     @Override
+//     public void invalidate() {
+//             if (isValid())
+//               System.out.println("FS invalidating ");
+//            super.invalidate();
+//     }
+//     
+//     @Override
+//     public void validate() {
+//            System.out.println("FS validating "  + isValid());
+//            super.validate();
+//     }
+
       @Override
       public String getToolTipText(MouseEvent e)
       {
@@ -240,6 +267,7 @@ public class FeatureSettings extends JPanel
         
         return tip;
       }
+      
 
       /**
        * Position the tooltip near the bottom edge of, and half way across, the
@@ -256,21 +284,27 @@ public class FeatureSettings extends JPanel
         return loc;
       }
     };
+    
+    // next line is needed to avoid (quiet) exceptions thrown
+    // when column ordering changes so that the above constants
+    // no longer apply.
+    table.getTableHeader().setReorderingAllowed(false); // BH 2018
+    
     table.getTableHeader().setFont(new Font("Verdana", Font.PLAIN, 12));
     ToolTipManager.sharedInstance().registerComponent(table);
 
-    table.setDefaultEditor(FeatureColour.class, new ColorEditor(this));
+    table.setDefaultEditor(FeatureColour.class, new ColorEditor());
     table.setDefaultRenderer(FeatureColour.class, new ColorRenderer());
 
-    table.setDefaultEditor(FeatureMatcherSet.class, new FilterEditor(this));
+    table.setDefaultEditor(FeatureMatcherSet.class, new FilterEditor());
     table.setDefaultRenderer(FeatureMatcherSet.class, new FilterRenderer());
     
     TableColumn colourColumn = new TableColumn(COLOUR_COLUMN, 75,
-            new ColorRenderer(), new ColorEditor(this));
+            new ColorRenderer(), new ColorEditor());
     table.addColumn(colourColumn);
 
     TableColumn filterColumn = new TableColumn(FILTER_COLUMN, 75,
-            new FilterRenderer(), new FilterEditor(this));
+            new FilterRenderer(), new FilterEditor());
     table.addColumn(filterColumn);
 
     table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
@@ -285,8 +319,7 @@ public class FeatureSettings extends JPanel
         if (evt.isPopupTrigger())
         {
           Object colour = table.getValueAt(selectedRow, COLOUR_COLUMN);
-          popupSort(selectedRow, type, colour, fr.getMinMax(), evt.getX(),
-                  evt.getY());
+          showPopupMenu(selectedRow, type, colour, evt.getPoint());
         }
         else if (evt.getClickCount() == 2)
         {
@@ -307,8 +340,7 @@ public class FeatureSettings extends JPanel
         {
           String type = (String) table.getValueAt(selectedRow, TYPE_COLUMN);
           Object colour = table.getValueAt(selectedRow, COLOUR_COLUMN);
-          popupSort(selectedRow, type, colour, fr.getMinMax(), evt.getX(),
-                  evt.getY());
+          showPopupMenu(selectedRow, type, colour, evt.getPoint());
         }
       }
     });
@@ -399,9 +431,17 @@ public class FeatureSettings extends JPanel
     inConstruction = false;
   }
 
-  protected void popupSort(final int rowSelected, final String type,
-          final Object typeCol, final Map<String, float[][]> minmax, int x,
-          int y)
+       /**
+        * Constructs and shows a popup menu of possible actions on the selected row and
+        * feature type
+        * 
+        * @param rowSelected
+        * @param type
+        * @param typeCol
+        * @param pt
+        */
+  protected void showPopupMenu(final int rowSelected, final String type,
+          final Object typeCol, final Point pt)
   {
     final FeatureColourI featureColour = (FeatureColourI) typeCol;
 
@@ -422,7 +462,6 @@ public class FeatureSettings extends JPanel
                 .sortAlignmentByFeatureScore(Arrays.asList(new String[]
                 { type }));
       }
-
     });
     JMenuItem dens = new JMenuItem(
             MessageManager.getString("label.sort_by_density"));
@@ -436,7 +475,6 @@ public class FeatureSettings extends JPanel
                 .sortAlignmentByFeatureDensity(Arrays.asList(new String[]
                 { type }));
       }
-
     });
     men.add(dens);
 
@@ -460,6 +498,8 @@ public class FeatureSettings extends JPanel
       {
         if (e.getSource() == variableColourCB)
         {
+          men.setVisible(true); // BH 2018 for JavaScript because this is a checkbox
+          men.setVisible(false); // BH 2018 for JavaScript because this is a checkbox
           if (featureColour.isSimpleColour())
           {
             /*
@@ -473,7 +513,7 @@ public class FeatureSettings extends JPanel
             /*
              * toggle variable to simple colour - show colour chooser
              */
-            String title = MessageManager.getString("label.select_colour");
+            String title = MessageManager.formatMessage("label.select_colour_for", type);
             ColourChooserListener listener = new ColourChooserListener()
             {
               @Override
@@ -490,7 +530,8 @@ public class FeatureSettings extends JPanel
             JalviewColourChooser.showColourChooser(me, title, featureColour.getMaxColour(), listener);
           }
         }
-        else    {
+        else    
+        {
           if (e.getSource() instanceof FeatureTypeSettings)
           {
             /*
@@ -499,11 +540,12 @@ public class FeatureSettings extends JPanel
              */
             FeatureColourI fci = fr.getFeatureColours().get(type);
             table.setValueAt(fci, rowSelected, COLOUR_COLUMN);
-            table.validate();
+            // BH 2018 setting a table value does not invalidate it.
+            System.out.println("FeatureSettings is valied" + table.isValid());
+//            table.validate();
           }
         }
       }
-
     });
 
     JMenuItem selCols = new JMenuItem(
@@ -552,7 +594,7 @@ public class FeatureSettings extends JPanel
     men.add(clearCols);
     men.add(hideCols);
     men.add(hideOtherCols);
-    men.show(table, x, y);
+    men.show(table, pt.x, pt.y);
   }
 
   @Override
@@ -880,23 +922,22 @@ public class FeatureSettings extends JPanel
    */
   void load()
   {
-    // TODO: JAL-3048 relies on Castor XML parsing: not needed for JS-jalview core
-    // functionalty
-
     JalviewFileChooser chooser = new JalviewFileChooser("fc",
             SEQUENCE_FEATURE_COLOURS);
     chooser.setFileView(new JalviewFileView());
     chooser.setDialogTitle(
             MessageManager.getString("label.load_feature_colours"));
     chooser.setToolTipText(MessageManager.getString("action.load"));
-
-    int value = chooser.showOpenDialog(this);
-
-    if (value == JalviewFileChooser.APPROVE_OPTION)
-    {
-      File file = chooser.getSelectedFile();
-      load(file);
-    }
+    chooser.setResponseHandler(0, new Runnable()
+    {
+         @Override
+         public void run() 
+         {
+           File file = chooser.getSelectedFile();
+               load(file);
+         }
+       });
+    chooser.showOpenDialog(this);
   }
 
   /**
@@ -974,20 +1015,18 @@ public class FeatureSettings extends JPanel
    */
   void save()
   {
-    // TODO: JAL-3048 not needed for Jalview-JS - save colours
     JalviewFileChooser chooser = new JalviewFileChooser("fc",
             SEQUENCE_FEATURE_COLOURS);
     chooser.setFileView(new JalviewFileView());
     chooser.setDialogTitle(
             MessageManager.getString("label.save_feature_colours"));
     chooser.setToolTipText(MessageManager.getString("action.save"));
-
-    int value = chooser.showSaveDialog(this);
-
-    if (value == JalviewFileChooser.APPROVE_OPTION)
-    {
-      save(chooser.getSelectedFile());
-    }
+    int option = chooser.showSaveDialog(this);
+       if (option == JalviewFileChooser.APPROVE_OPTION) 
+       {
+         File file = chooser.getSelectedFile();
+         save(file);
+       }
   }
 
   /**
@@ -1370,14 +1409,8 @@ public class FeatureSettings extends JPanel
     JPanel buttonPanel = new JPanel();
     buttonPanel.add(ok);
     buttonPanel.add(cancel);
-    if (!Jalview.isJS())
-    {
-      /*
-       * no save/load XML in JalviewJS for now
-       */
-      buttonPanel.add(loadColours);
-      buttonPanel.add(saveColours);
-    }
+    buttonPanel.add(loadColours);
+    buttonPanel.add(saveColours);
     bigPanel.add(scrollPane, BorderLayout.CENTER);
     settingsPane.add(bigPanel, BorderLayout.CENTER);
     settingsPane.add(buttonPanel, BorderLayout.SOUTH);
@@ -1676,10 +1709,11 @@ public class FeatureSettings extends JPanel
     renderGraduatedColor(comp, gcol, w, h);
   }
 
-  class ColorEditor extends AbstractCellEditor
+  @SuppressWarnings("serial")
+class ColorEditor extends AbstractCellEditor
           implements TableCellEditor, ActionListener
   {
-    FeatureSettings me;
+//    FeatureSettings me;
 
     FeatureColourI currentColor;
 
@@ -1693,9 +1727,8 @@ public class FeatureSettings extends JPanel
 
     int rowSelected = 0;
 
-    public ColorEditor(FeatureSettings fs)
+    public ColorEditor()
     {
-      this.me = fs;
       // Set up the editor (from the table's point of view),
       // which is a button.
       // This button brings up the color chooser dialog,
@@ -1720,14 +1753,21 @@ public class FeatureSettings extends JPanel
           /*
            * simple colour chooser
            */
-          String ttl = MessageManager.getString("label.select_colour");
-          ColourChooserListener listener = new ColourChooserListener() {
+          String ttl = MessageManager.formatMessage("label.select_colour_for", type);
+          ColourChooserListener listener = new ColourChooserListener() 
+          {
             @Override
             public void colourSelected(Color c)
             {
               currentColor = new FeatureColour(c);
-              me.table.setValueAt(currentColor, rowSelected, COLOUR_COLUMN);
+              table.setValueAt(currentColor, rowSelected, COLOUR_COLUMN);
+              fireEditingStopped();
             }
+                       @Override
+                       public void cancel() 
+                       {
+                 fireEditingStopped();
+                       }
           };
           JalviewColourChooser.showColourChooser(button,  ttl,  currentColor.getColour(), listener);
         }
@@ -1736,16 +1776,13 @@ public class FeatureSettings extends JPanel
           /*
            * variable colour and filters dialog
            */
-          chooser = new FeatureTypeSettings(me.fr, type);
-          /**
-           * @j2sNative
-           */
+          chooser = new FeatureTypeSettings(fr, type);
+          if (!Jalview.isJS())
           {
             chooser.setRequestFocusEnabled(true);
             chooser.requestFocus();
           }
           chooser.addActionListener(this);
-          // Make the renderer reappear.
           fireEditingStopped();
         }
       }
@@ -1757,7 +1794,7 @@ public class FeatureSettings extends JPanel
          * update table data without triggering updateFeatureRenderer
          */
         currentColor = fr.getFeatureColours().get(type);
-        FeatureMatcherSetI currentFilter = me.fr.getFeatureFilter(type);
+        FeatureMatcherSetI currentFilter = fr.getFeatureFilter(type);
         if (currentFilter == null)
         {
           currentFilter = new FeatureMatcherSet();
@@ -1766,9 +1803,13 @@ public class FeatureSettings extends JPanel
                 .getData()[rowSelected];
         data[COLOUR_COLUMN] = currentColor;
         data[FILTER_COLUMN] = currentFilter;
-
         fireEditingStopped();
-        me.table.validate();
+        // SwingJS needs an explicit repaint() here, 
+        // rather than relying upon no validation having
+        // occurred since the stopEditing call was made.
+        // Its laying out has not been stopped by the modal frame
+        table.validate();
+        table.repaint();
       }
     }
 
@@ -1786,9 +1827,9 @@ public class FeatureSettings extends JPanel
     {
       currentColor = (FeatureColourI) value;
       this.rowSelected = row;
-      type = me.table.getValueAt(row, TYPE_COLUMN).toString();
+      type = table.getValueAt(row, TYPE_COLUMN).toString();
       button.setOpaque(true);
-      button.setBackground(me.getBackground());
+      button.setBackground(getBackground());
       if (!currentColor.isSimpleColour())
       {
         JLabel btn = new JLabel();
@@ -1814,10 +1855,10 @@ public class FeatureSettings extends JPanel
    * as display text). On click in the cell, opens the Feature Display Settings
    * dialog at the Filters tab.
    */
-  class FilterEditor extends AbstractCellEditor
+  @SuppressWarnings("serial")
+class FilterEditor extends AbstractCellEditor
           implements TableCellEditor, ActionListener
   {
-    FeatureSettings me;
 
     FeatureMatcherSetI currentFilter;
 
@@ -1831,9 +1872,8 @@ public class FeatureSettings extends JPanel
 
     int rowSelected = 0;
 
-    public FilterEditor(FeatureSettings me)
+    public FilterEditor()
     {
-      this.me = me;
       button = new JButton();
       button.setActionCommand(EDIT);
       button.addActionListener(this);
@@ -1848,7 +1888,7 @@ public class FeatureSettings extends JPanel
     {
       if (button == e.getSource())
       {
-        FeatureTypeSettings chooser = new FeatureTypeSettings(me.fr, type);
+        FeatureTypeSettings chooser = new FeatureTypeSettings(fr, type);
         chooser.addActionListener(this);
         chooser.setRequestFocusEnabled(true);
         chooser.requestFocus();
@@ -1870,17 +1910,23 @@ public class FeatureSettings extends JPanel
          * update table data without triggering updateFeatureRenderer
          */
         FeatureColourI currentColor = fr.getFeatureColours().get(type);
-        currentFilter = me.fr.getFeatureFilter(type);
+        currentFilter = fr.getFeatureFilter(type);
         if (currentFilter == null)
         {
           currentFilter = new FeatureMatcherSet();
         }
+        
         Object[] data = ((FeatureTableModel) table.getModel())
                 .getData()[rowSelected];
         data[COLOUR_COLUMN] = currentColor;
         data[FILTER_COLUMN] = currentFilter;
         fireEditingStopped();
-        me.table.validate();
+        // SwingJS needs an explicit repaint() here, 
+        // rather than relying upon no validation having
+        // occurred since the stopEditing call was made.
+        // Its laying out has not been stopped by the modal frame
+        table.validate();
+        table.repaint();
       }
     }
 
@@ -1896,9 +1942,9 @@ public class FeatureSettings extends JPanel
     {
       currentFilter = (FeatureMatcherSetI) value;
       this.rowSelected = row;
-      type = me.table.getValueAt(row, TYPE_COLUMN).toString();
+      type = table.getValueAt(row, TYPE_COLUMN).toString();
       button.setOpaque(true);
-      button.setBackground(me.getBackground());
+      button.setBackground(getBackground());
       button.setText(currentFilter.toString());
       button.setIcon(null);
       return button;
@@ -1983,7 +2029,8 @@ class FeatureIcon implements Icon
         g.fillRect(s1, 0, e1 - s1, height);
       }
       g.setColor(gcol.getMaxColour());
-      g.fillRect(0, e1, width - e1, height);
+//      g.fillRect(0, e1, width - e1, height);  // BH 2018
+      g.fillRect(e1, 0, width - e1, height);
     }
   }
 }