mev-4.0.01/source/org/tigr/microarray/mev/cluster/gui/impl/lem/LEMColorRangeSelector.java

Code
Comments
Other
Rev Date Author Line
2 26 Feb 07 jari 1 /*
2 26 Feb 07 jari 2 Copyright @ 1999-2006, The Institute for Genomic Research (TIGR).
2 26 Feb 07 jari 3 All rights reserved.
2 26 Feb 07 jari 4 */
2 26 Feb 07 jari 5 package org.tigr.microarray.mev.cluster.gui.impl.lem;
2 26 Feb 07 jari 6
2 26 Feb 07 jari 7 import java.awt.AlphaComposite;
2 26 Feb 07 jari 8 import java.awt.Color;
2 26 Feb 07 jari 9 import java.awt.Component;
2 26 Feb 07 jari 10 import java.awt.Dimension;
2 26 Feb 07 jari 11 import java.awt.Graphics;
2 26 Feb 07 jari 12 import java.awt.Graphics2D;
2 26 Feb 07 jari 13 import java.awt.GridBagConstraints;
2 26 Feb 07 jari 14 import java.awt.GridBagLayout;
2 26 Feb 07 jari 15 import java.awt.Insets;
2 26 Feb 07 jari 16 import java.awt.Point;
2 26 Feb 07 jari 17 import java.awt.Toolkit;
2 26 Feb 07 jari 18 import java.awt.event.ActionEvent;
2 26 Feb 07 jari 19 import java.awt.event.ActionListener;
2 26 Feb 07 jari 20 import java.awt.event.FocusEvent;
2 26 Feb 07 jari 21 import java.awt.event.FocusListener;
2 26 Feb 07 jari 22
2 26 Feb 07 jari 23 import javax.swing.BorderFactory;
2 26 Feb 07 jari 24 import javax.swing.JButton;
2 26 Feb 07 jari 25 import javax.swing.JColorChooser;
2 26 Feb 07 jari 26 import javax.swing.JDialog;
2 26 Feb 07 jari 27 import javax.swing.JFrame;
2 26 Feb 07 jari 28 import javax.swing.JOptionPane;
2 26 Feb 07 jari 29 import javax.swing.JPanel;
2 26 Feb 07 jari 30 import javax.swing.JTextField;
2 26 Feb 07 jari 31 import javax.swing.border.BevelBorder;
2 26 Feb 07 jari 32 import javax.swing.colorchooser.AbstractColorChooserPanel;
2 26 Feb 07 jari 33
2 26 Feb 07 jari 34 import org.tigr.microarray.mev.cluster.gui.impl.dialogs.AlgorithmDialog;
2 26 Feb 07 jari 35 import org.tigr.microarray.mev.cluster.gui.impl.dialogs.ParameterPanel;
2 26 Feb 07 jari 36 import org.tigr.microarray.mev.cluster.gui.impl.dialogs.dialogHelpUtil.HelpWindow;
2 26 Feb 07 jari 37
2 26 Feb 07 jari 38 /*
2 26 Feb 07 jari 39  * @author braisted
2 26 Feb 07 jari 40  * 
2 26 Feb 07 jari 41  * Dialog to set the colors and bin ranges for LEM
2 26 Feb 07 jari 42  * 
2 26 Feb 07 jari 43  */
2 26 Feb 07 jari 44 public class LEMColorRangeSelector extends AlgorithmDialog {
2 26 Feb 07 jari 45
2 26 Feb 07 jari 46   private LinearExpressionMapViewer lem;
2 26 Feb 07 jari 47   
2 26 Feb 07 jari 48   private int result = JOptionPane.CANCEL_OPTION;
2 26 Feb 07 jari 49     
2 26 Feb 07 jari 50   private JButton lowest, lower, higher, highest;
2 26 Feb 07 jari 51   private float limit1, limit2, limit3, limit4, midPoint;
2 26 Feb 07 jari 52
2 26 Feb 07 jari 53   private Color origColor1, origColor2, origColor3, origColor4;
2 26 Feb 07 jari 54   private float origLimit1, origLimit2, origLimit3, origLimit4, origMidPoint;
2 26 Feb 07 jari 55
2 26 Feb 07 jari 56   private int buttonW = 100;
2 26 Feb 07 jari 57   private int buttonH = 40;
2 26 Feb 07 jari 58   
2 26 Feb 07 jari 59   private JTextField c1Field;
2 26 Feb 07 jari 60   private JTextField c2Field;
2 26 Feb 07 jari 61   private JTextField midField;
2 26 Feb 07 jari 62   private JTextField c3Field;
2 26 Feb 07 jari 63   private JTextField c4Field;
2 26 Feb 07 jari 64   
2 26 Feb 07 jari 65   private int fieldW = 80;
2 26 Feb 07 jari 66   private int fieldH = 30;
2 26 Feb 07 jari 67     
2 26 Feb 07 jari 68   public LEMColorRangeSelector(JFrame parent, LinearExpressionMapViewer lem, Color c1, Color c2, Color c3, Color c4,
2 26 Feb 07 jari 69       float lim1, float lim2, float mid, float lim3, float lim4) {
2 26 Feb 07 jari 70     
2 26 Feb 07 jari 71     super(parent, "LEM Bin Range and Color Selection", false);
2 26 Feb 07 jari 72     this.lem = lem;
2 26 Feb 07 jari 73     //capture original settings
2 26 Feb 07 jari 74     origColor1 = c1;
2 26 Feb 07 jari 75     origColor2 = c2;
2 26 Feb 07 jari 76     origColor3 = c3;
2 26 Feb 07 jari 77     origColor4 = c4;    
2 26 Feb 07 jari 78     limit1 = origLimit1 = lim1;
2 26 Feb 07 jari 79     limit2 = origLimit2 = lim2;
2 26 Feb 07 jari 80     limit3 = origLimit3 = lim3; 
2 26 Feb 07 jari 81     limit4 = origLimit4 = lim4;
2 26 Feb 07 jari 82     midPoint = origMidPoint = mid;
2 26 Feb 07 jari 83
2 26 Feb 07 jari 84     ButtonListener listener = new ButtonListener();
2 26 Feb 07 jari 85     
2 26 Feb 07 jari 86     ParameterPanel panel = new ParameterPanel("Color and Range Settings");
2 26 Feb 07 jari 87     panel.setLayout(new GridBagLayout());
2 26 Feb 07 jari 88
2 26 Feb 07 jari 89     Dimension buttonDim = new Dimension(buttonW, buttonH);
2 26 Feb 07 jari 90
2 26 Feb 07 jari 91     lowest = createColorButton(c1, listener, buttonDim, "lowest");
2 26 Feb 07 jari 92     lower = createColorButton(c2, listener, buttonDim, "lower");
2 26 Feb 07 jari 93     higher = createColorButton(c3, listener, buttonDim, "higher");
2 26 Feb 07 jari 94     highest = createColorButton(c4, listener, buttonDim, "highest");
2 26 Feb 07 jari 95     
2 26 Feb 07 jari 96     JPanel midPanel = new JPanel();
2 26 Feb 07 jari 97     midPanel.setBackground(Color.white);
2 26 Feb 07 jari 98     midPanel.setPreferredSize(new Dimension(buttonW, buttonH));
2 26 Feb 07 jari 99     midPanel.setBorder(BorderFactory.createLineBorder(Color.black, 1));
2 26 Feb 07 jari 100     
2 26 Feb 07 jari 101     JPanel midPanel2 = new JPanel();
2 26 Feb 07 jari 102     midPanel2.setBackground(Color.white);
2 26 Feb 07 jari 103     midPanel2.setPreferredSize(new Dimension(buttonW, buttonH));
2 26 Feb 07 jari 104     midPanel2.setBorder(BorderFactory.createLineBorder(Color.black, 1));    
2 26 Feb 07 jari 105
2 26 Feb 07 jari 106     JPanel buttonPanel = new JPanel(new GridBagLayout());
2 26 Feb 07 jari 107     
2 26 Feb 07 jari 108     buttonPanel.add(lowest, new GridBagConstraints(0,0,2,1,0,0,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0), 0,0));
2 26 Feb 07 jari 109     buttonPanel.add(lower, new GridBagConstraints(2,0,2,1,0,0,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0), 0,0));
2 26 Feb 07 jari 110     buttonPanel.add(midPanel, new GridBagConstraints(4,0,2,1,0,0,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0), 0,0));
2 26 Feb 07 jari 111     buttonPanel.add(midPanel2, new GridBagConstraints(6,0,2,1,0,0,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0), 0,0));
2 26 Feb 07 jari 112     buttonPanel.add(higher, new GridBagConstraints(8,0,2,1,0,0,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0), 0,0));
2 26 Feb 07 jari 113     buttonPanel.add(highest, new GridBagConstraints(10,0,2,1,0,0,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0), 0,0));
2 26 Feb 07 jari 114
2 26 Feb 07 jari 115     
2 26 Feb 07 jari 116     //text field panel
2 26 Feb 07 jari 117     JPanel textPanel = new JPanel(new GridBagLayout());
2 26 Feb 07 jari 118     textPanel.setBackground(Color.WHITE);
2 26 Feb 07 jari 119
2 26 Feb 07 jari 120     c1Field = createField(limit1, listener);
2 26 Feb 07 jari 121     c2Field = createField(limit2,listener);
2 26 Feb 07 jari 122     midField = createField(midPoint,listener);
2 26 Feb 07 jari 123     c3Field = createField(limit3,listener);
2 26 Feb 07 jari 124     c4Field = createField(limit4,listener);
2 26 Feb 07 jari 125
2 26 Feb 07 jari 126     textPanel.add(createFillPanel(buttonW/2, fieldH), new GridBagConstraints(0,1,1,1,0,0,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0), 0,0));
2 26 Feb 07 jari 127     textPanel.add(c1Field, new GridBagConstraints(1,1,2,1,0,0,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,10,0,10), 0,0));
2 26 Feb 07 jari 128     textPanel.add(c2Field, new GridBagConstraints(3,1,2,1,0,0,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,10,0,10), 0,0));
2 26 Feb 07 jari 129     textPanel.add(midField, new GridBagConstraints(5,1,2,1,0,0,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,10,0,10), 0,0));    
2 26 Feb 07 jari 130     textPanel.add(c3Field, new GridBagConstraints(7,1,2,1,0,0,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,10,0,10), 0,0));
2 26 Feb 07 jari 131     textPanel.add(c4Field, new GridBagConstraints(9,1,2,1,0,0,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,10,0,10), 0,0));
2 26 Feb 07 jari 132     textPanel.add(createFillPanel(buttonW/2, fieldH), new GridBagConstraints(11,1,1,1,0,0,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0), 0,0));    
2 26 Feb 07 jari 133     
2 26 Feb 07 jari 134     panel.add(buttonPanel, new GridBagConstraints(0,0,1,1,0,0,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(5,5,0,5), 0,0));
2 26 Feb 07 jari 135     panel.add(new ArrowPanel(), new GridBagConstraints(0,1,1,1,0,0,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(1,5,1,5), 0,0));    
2 26 Feb 07 jari 136     panel.add(textPanel, new GridBagConstraints(0,2,1,1,0,0,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,5,5,5), 0,0));
2 26 Feb 07 jari 137
2 26 Feb 07 jari 138     addContent(panel);
2 26 Feb 07 jari 139   
2 26 Feb 07 jari 140     reconfigureButtons(listener);
2 26 Feb 07 jari 141     setActionListeners(listener);
2 26 Feb 07 jari 142     pack();
2 26 Feb 07 jari 143     
2 26 Feb 07 jari 144   }
2 26 Feb 07 jari 145   
2 26 Feb 07 jari 146   /**
2 26 Feb 07 jari 147    * Sets up dialog buttons
2 26 Feb 07 jari 148    * @param listener
2 26 Feb 07 jari 149    */
2 26 Feb 07 jari 150   private void reconfigureButtons(ButtonListener listener) {
2 26 Feb 07 jari 151     JButton previewButton = new JButton("Preview");    
2 26 Feb 07 jari 152     previewButton.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
2 26 Feb 07 jari 153     previewButton.setFocusPainted(false);
2 26 Feb 07 jari 154     previewButton.setActionCommand("preview-command");
2 26 Feb 07 jari 155     previewButton.addActionListener(listener);
2 26 Feb 07 jari 156     Dimension dim = new Dimension(65, 30);
2 26 Feb 07 jari 157     previewButton.setPreferredSize(dim);
2 26 Feb 07 jari 158     previewButton.setSize(dim);
2 26 Feb 07 jari 159     
2 26 Feb 07 jari 160     okButton.setText("Apply");
2 26 Feb 07 jari 161     
2 26 Feb 07 jari 162     Component [] comp = buttonPanel.getComponents();
2 26 Feb 07 jari 163     
2 26 Feb 07 jari 164     //remove buttons
2 26 Feb 07 jari 165     for(int i = 0; i < comp.length; i++) {
2 26 Feb 07 jari 166       buttonPanel.remove(comp[i]);
2 26 Feb 07 jari 167     }
2 26 Feb 07 jari 168
2 26 Feb 07 jari 169     buttonPanel.add(comp[0], new GridBagConstraints(0,0,1,1,1,0,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(2,5,2,0), 0,0));
2 26 Feb 07 jari 170     buttonPanel.add(comp[1], new GridBagConstraints(1,0,1,1,1,0,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(2,10,2,0), 0,0));
2 26 Feb 07 jari 171     buttonPanel.add(previewButton, new GridBagConstraints(2,0,1,1,1,0,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(2,5,2,0), 0,0));
2 26 Feb 07 jari 172     buttonPanel.add(comp[2], new GridBagConstraints(3,0,1,1,1,0,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(2,5,2,0), 0,0));
2 26 Feb 07 jari 173     buttonPanel.add(comp[3], new GridBagConstraints(4,0,1,1,1,0,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(2,5,2,0), 0,0));
2 26 Feb 07 jari 174     buttonPanel.add(comp[4], new GridBagConstraints(5,0,1,1,1,0,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(2,5,2,5), 0,0));
2 26 Feb 07 jari 175   }
2 26 Feb 07 jari 176   
2 26 Feb 07 jari 177   /**
2 26 Feb 07 jari 178    * displays the dialog, returns OK or Cancel (JOptionPane)
2 26 Feb 07 jari 179    * @return close status
2 26 Feb 07 jari 180    */
2 26 Feb 07 jari 181   public int showModal() {
2 26 Feb 07 jari 182         Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
2 26 Feb 07 jari 183         setLocation((screenSize.width - getSize().width)/2, (screenSize.height - getSize().height)/2);
2 26 Feb 07 jari 184         show();
2 26 Feb 07 jari 185         return result;
2 26 Feb 07 jari 186     }
2 26 Feb 07 jari 187   
2 26 Feb 07 jari 188   /**
2 26 Feb 07 jari 189    * Returns the color for the specified bin
2 26 Feb 07 jari 190    * @param bin bin index 
2 26 Feb 07 jari 191    * @return bin color
2 26 Feb 07 jari 192    */
2 26 Feb 07 jari 193   public Color getColor(int bin) {
2 26 Feb 07 jari 194     Color color = null;
2 26 Feb 07 jari 195     if(bin == 0)
2 26 Feb 07 jari 196       color = lowest.getBackground();
2 26 Feb 07 jari 197     else if(bin == 1)
2 26 Feb 07 jari 198       color = lower.getBackground();
2 26 Feb 07 jari 199     else if(bin == 2)
2 26 Feb 07 jari 200       color = Color.white;    
2 26 Feb 07 jari 201     else if(bin == 3)
2 26 Feb 07 jari 202       color = higher.getBackground();
2 26 Feb 07 jari 203     else if(bin == 4)
2 26 Feb 07 jari 204       color = highest.getBackground();    
2 26 Feb 07 jari 205     return color;
2 26 Feb 07 jari 206   }
2 26 Feb 07 jari 207
2 26 Feb 07 jari 208   /**
2 26 Feb 07 jari 209    * Returns cutoff for a given bin
2 26 Feb 07 jari 210    * @param index bin index
2 26 Feb 07 jari 211    * @return cutoff value
2 26 Feb 07 jari 212    */
2 26 Feb 07 jari 213   public float getCutoff(int index) {
2 26 Feb 07 jari 214     float limit = 0;
2 26 Feb 07 jari 215     if(index == 0)
2 26 Feb 07 jari 216       limit = Float.parseFloat(c1Field.getText());
2 26 Feb 07 jari 217     else if(index == 1)
2 26 Feb 07 jari 218       limit = Float.parseFloat(c2Field.getText());
2 26 Feb 07 jari 219     else if(index == 2)
2 26 Feb 07 jari 220       limit = Float.parseFloat(midField.getText());
2 26 Feb 07 jari 221     else if(index == 3)
2 26 Feb 07 jari 222       limit = Float.parseFloat(c3Field.getText());
2 26 Feb 07 jari 223     else if(index == 4)
2 26 Feb 07 jari 224       limit = Float.parseFloat(c4Field.getText());
2 26 Feb 07 jari 225     return limit;
2 26 Feb 07 jari 226   }
2 26 Feb 07 jari 227   
2 26 Feb 07 jari 228   /**
2 26 Feb 07 jari 229    * applies current settings to lem, preview
2 26 Feb 07 jari 230    * @return
2 26 Feb 07 jari 231    */
2 26 Feb 07 jari 232   private boolean applySettings() {
2 26 Feb 07 jari 233     boolean valid = validateValues();
2 26 Feb 07 jari 234     if(valid) {
2 26 Feb 07 jari 235       lem.setBinLimitsAndColors(getCutoff(0), getCutoff(1),getCutoff(2),getCutoff(3),getCutoff(4),
2 26 Feb 07 jari 236           getColor(0), getColor(1), getColor(3), getColor(4));
2 26 Feb 07 jari 237     }
2 26 Feb 07 jari 238     return valid;
2 26 Feb 07 jari 239   }
2 26 Feb 07 jari 240   
2 26 Feb 07 jari 241   /**
2 26 Feb 07 jari 242    * Returns true if cutoffs are valid
2 26 Feb 07 jari 243    * @return validity state
2 26 Feb 07 jari 244    */
2 26 Feb 07 jari 245   public boolean validateValues() {
2 26 Feb 07 jari 246     float v0, v1, v2, v3, v4;
2 26 Feb 07 jari 247     try {
2 26 Feb 07 jari 248       v0 = Float.parseFloat(c1Field.getText());
2 26 Feb 07 jari 249       v1 = Float.parseFloat(c2Field.getText());
2 26 Feb 07 jari 250       v2 = Float.parseFloat(midField.getText());
2 26 Feb 07 jari 251       v3 = Float.parseFloat(c3Field.getText());
2 26 Feb 07 jari 252       v4 = Float.parseFloat(c4Field.getText());      
2 26 Feb 07 jari 253     } catch (NumberFormatException nfe) {
2 26 Feb 07 jari 254       JOptionPane.showMessageDialog(this, "An entered value seems to be in an invalid format. Please try again.", "Number Format Error", JOptionPane.ERROR_MESSAGE);
2 26 Feb 07 jari 255       return false;
2 26 Feb 07 jari 256     }
2 26 Feb 07 jari 257      if (v0 <= v1 && v1 <= v2 && v2 <= v3 && v3 <= v4)
2 26 Feb 07 jari 258        return true;
2 26 Feb 07 jari 259      else {
2 26 Feb 07 jari 260       JOptionPane.showMessageDialog(this, "The cutoff values should be in asscending value from left to right. Please try again.", "Cutoff Value Error", JOptionPane.ERROR_MESSAGE);
2 26 Feb 07 jari 261       return false;     
2 26 Feb 07 jari 262      }
2 26 Feb 07 jari 263   }
2 26 Feb 07 jari 264   
2 26 Feb 07 jari 265
2 26 Feb 07 jari 266   /**
2 26 Feb 07 jari 267    * Constructs a JButton to render a bin.
2 26 Feb 07 jari 268    * @param color
2 26 Feb 07 jari 269    * @param listener
2 26 Feb 07 jari 270    * @param buttonDim
2 26 Feb 07 jari 271    * @param buttonName
2 26 Feb 07 jari 272    * @return
2 26 Feb 07 jari 273    */
2 26 Feb 07 jari 274
2 26 Feb 07 jari 275   private JButton createColorButton(Color color, ButtonListener listener, Dimension buttonDim, String buttonName) {
2 26 Feb 07 jari 276     JButton b;
2 26 Feb 07 jari 277     b = new JButton("<html><center>Select<br>Color</center></html>");
2 26 Feb 07 jari 278     b.setBackground(color);
2 26 Feb 07 jari 279     b.setFocusPainted(false);
2 26 Feb 07 jari 280     b.setBorder(BorderFactory.createLineBorder(Color.black,1));
2 26 Feb 07 jari 281     b.setPreferredSize(buttonDim);
2 26 Feb 07 jari 282     b.setSize(buttonDim);
2 26 Feb 07 jari 283     //b.setMaximumSize(buttonDim);
2 26 Feb 07 jari 284     //b.setMinimumSize(buttonDim);
2 26 Feb 07 jari 285     b.setActionCommand("color-button-hit-command");
2 26 Feb 07 jari 286     b.addActionListener(listener);
2 26 Feb 07 jari 287     return b;  
2 26 Feb 07 jari 288   }
2 26 Feb 07 jari 289   
2 26 Feb 07 jari 290   /**
2 26 Feb 07 jari 291    * Constructs text field
2 26 Feb 07 jari 292    * @param val current limit
2 26 Feb 07 jari 293    * @param listener event listener
2 26 Feb 07 jari 294    * @return
2 26 Feb 07 jari 295    */
2 26 Feb 07 jari 296   private JTextField createField(float val, ButtonListener listener) {
2 26 Feb 07 jari 297     JTextField field = new JTextField();
2 26 Feb 07 jari 298     field.setText(String.valueOf(val));
2 26 Feb 07 jari 299     Dimension dim = new Dimension(fieldW, fieldH);
2 26 Feb 07 jari 300     field.setPreferredSize(dim);
2 26 Feb 07 jari 301     field.setSize(dim);
2 26 Feb 07 jari 302     field.setActionCommand("field-focus-command");
2 26 Feb 07 jari 303     field.addFocusListener(listener);
2 26 Feb 07 jari 304     return field;
2 26 Feb 07 jari 305   }
2 26 Feb 07 jari 306   
2 26 Feb 07 jari 307   /**
2 26 Feb 07 jari 308    * Filler panel
2 26 Feb 07 jari 309    * @param w
2 26 Feb 07 jari 310    * @param h
2 26 Feb 07 jari 311    * @return
2 26 Feb 07 jari 312    */
2 26 Feb 07 jari 313   private JPanel createFillPanel(int w, int h) {
2 26 Feb 07 jari 314     JPanel panel = new JPanel();
2 26 Feb 07 jari 315     panel.setBackground(Color.white);
2 26 Feb 07 jari 316     Dimension dim = new Dimension(w,h);
2 26 Feb 07 jari 317     panel.setPreferredSize(dim);
2 26 Feb 07 jari 318     panel.setSize(dim);    
2 26 Feb 07 jari 319     return panel;
2 26 Feb 07 jari 320   }
2 26 Feb 07 jari 321   
2 26 Feb 07 jari 322   /**
2 26 Feb 07 jari 323    * gets a new color and assigns it to button
2 26 Feb 07 jari 324    * @param button button to recieve new color
2 26 Feb 07 jari 325    */
2 26 Feb 07 jari 326   private void assignColor(JButton button) {
2 26 Feb 07 jari 327     Color color = button.getBackground();
2 26 Feb 07 jari 328
2 26 Feb 07 jari 329     /*
2 26 Feb 07 jari 330      * I want the HSB panel to be default so reorder the panels
2 26 Feb 07 jari 331      */
2 26 Feb 07 jari 332     JColorChooser chooser = new JColorChooser(color);
2 26 Feb 07 jari 333     AbstractColorChooserPanel [] panels = chooser.getChooserPanels();
2 26 Feb 07 jari 334     AbstractColorChooserPanel [] newPanels = new  AbstractColorChooserPanel[panels.length];
2 26 Feb 07 jari 335     int hsbIndex = 0;    
2 26 Feb 07 jari 336     for(int i = 0; i < panels.length; i++) {
2 26 Feb 07 jari 337       if(panels[i].getClass().getName().equals("javax.swing.colorchooser.DefaultHSBChooserPanel"))
2 26 Feb 07 jari 338         hsbIndex = i;
2 26 Feb 07 jari 339     }    
2 26 Feb 07 jari 340     newPanels[0] = panels[hsbIndex];    
2 26 Feb 07 jari 341     int cnt = 1;
2 26 Feb 07 jari 342     for(int i = 0; i < panels.length; i++) {
2 26 Feb 07 jari 343       if( i != hsbIndex) {
2 26 Feb 07 jari 344         newPanels[cnt] = panels[i];
2 26 Feb 07 jari 345         cnt++;
2 26 Feb 07 jari 346       }        
2 26 Feb 07 jari 347     }
2 26 Feb 07 jari 348     chooser.setChooserPanels(newPanels);
2 26 Feb 07 jari 349
2 26 Feb 07 jari 350     /*
2 26 Feb 07 jari 351      *  Special listener to pair a button with a particular chooser
2 26 Feb 07 jari 352      */
2 26 Feb 07 jari 353     ButtonListener listener = new ButtonListener(button, chooser);
2 26 Feb 07 jari 354     JDialog dialog = JColorChooser.createDialog(this, "Bin Color Selection", true, chooser, listener, new ButtonListener());
2 26 Feb 07 jari 355     dialog.show();
2 26 Feb 07 jari 356
2 26 Feb 07 jari 357     button.setBorder(BorderFactory.createLineBorder(Color.black, 1));
2 26 Feb 07 jari 358   }
2 26 Feb 07 jari 359   
2 26 Feb 07 jari 360   /**
2 26 Feb 07 jari 361    * resets controls to original state.
2 26 Feb 07 jari 362    */
2 26 Feb 07 jari 363   private void resetControls() {
2 26 Feb 07 jari 364     lowest.setBackground(this.origColor1);
2 26 Feb 07 jari 365     lower.setBackground(this.origColor2);
2 26 Feb 07 jari 366     higher.setBackground(this.origColor3);
2 26 Feb 07 jari 367     highest.setBackground(this.origColor4);
2 26 Feb 07 jari 368
2 26 Feb 07 jari 369     c1Field.setText(String.valueOf(this.origLimit1));
2 26 Feb 07 jari 370     c2Field.setText(String.valueOf(this.origLimit2));
2 26 Feb 07 jari 371     midField.setText(String.valueOf(this.origMidPoint));
2 26 Feb 07 jari 372     c3Field.setText(String.valueOf(this.origLimit3));
2 26 Feb 07 jari 373     c4Field.setText(String.valueOf(this.origLimit4));
2 26 Feb 07 jari 374   }
2 26 Feb 07 jari 375   
2 26 Feb 07 jari 376   /**
2 26 Feb 07 jari 377    * 
2 26 Feb 07 jari 378    * @author braisted
2 26 Feb 07 jari 379    *
2 26 Feb 07 jari 380    * Widget to render an arrow selectable/focusable to indicate
2 26 Feb 07 jari 381    * current bin limit being adjusted
2 26 Feb 07 jari 382    */
2 26 Feb 07 jari 383   public class ArrowPanel extends JPanel {
2 26 Feb 07 jari 384     int [] x;
2 26 Feb 07 jari 385     int [] y;
2 26 Feb 07 jari 386     
2 26 Feb 07 jari 387     Point p;
2 26 Feb 07 jari 388     
2 26 Feb 07 jari 389     public ArrowPanel () {
2 26 Feb 07 jari 390       setLayout(new GridBagLayout());
2 26 Feb 07 jari 391       setBackground(Color.white);
2 26 Feb 07 jari 392       Dimension dim = new Dimension(6*buttonW, 60);
2 26 Feb 07 jari 393       setPreferredSize(dim);
2 26 Feb 07 jari 394       setSize(dim);
2 26 Feb 07 jari 395       x = new int[3];
2 26 Feb 07 jari 396       y = new int[3];
2 26 Feb 07 jari 397     }
2 26 Feb 07 jari 398     
2 26 Feb 07 jari 399     public void paint(Graphics g) {
2 26 Feb 07 jari 400       g.setColor(Color.blue);
2 26 Feb 07 jari 401       Graphics2D g2 = (Graphics2D)g;
2 26 Feb 07 jari 402         
2 26 Feb 07 jari 403       y[0] = 0;
2 26 Feb 07 jari 404       y[1] = getHeight();
2 26 Feb 07 jari 405       y[2] = getHeight();
2 26 Feb 07 jari 406       
2 26 Feb 07 jari 407       p =  lowest.getLocation();      
2 26 Feb 07 jari 408       x[0] = p.x + buttonW;
2 26 Feb 07 jari 409       
2 26 Feb 07 jari 410       p = c1Field.getLocation();
2 26 Feb 07 jari 411       x[1] = p.x;
2 26 Feb 07 jari 412       x[2] = p.x + fieldW;
2 26 Feb 07 jari 413
2 26 Feb 07 jari 414       if(c1Field.hasFocus())
2 26 Feb 07 jari 415         g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.6f));              
2 26 Feb 07 jari 416       else
2 26 Feb 07 jari 417         g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.1f));
2 26 Feb 07 jari 418               
2 26 Feb 07 jari 419       g.fillPolygon(x,y,3);
2 26 Feb 07 jari 420
2 26 Feb 07 jari 421       
2 26 Feb 07 jari 422       p =  lower.getLocation();      
2 26 Feb 07 jari 423       x[0] = p.x + buttonW;
2 26 Feb 07 jari 424       
2 26 Feb 07 jari 425       p = c2Field.getLocation();
2 26 Feb 07 jari 426       x[1] = p.x;
2 26 Feb 07 jari 427       x[2] = p.x + fieldW;
2 26 Feb 07 jari 428       
2 26 Feb 07 jari 429       if(c2Field.hasFocus())
2 26 Feb 07 jari 430         g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.6f));              
2 26 Feb 07 jari 431       else
2 26 Feb 07 jari 432         g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.1f));
2 26 Feb 07 jari 433         
2 26 Feb 07 jari 434       g.fillPolygon(x,y,3);
2 26 Feb 07 jari 435        
2 26 Feb 07 jari 436       
2 26 Feb 07 jari 437       p =  lower.getLocation();      
2 26 Feb 07 jari 438       x[0] = p.x+2*buttonW;
2 26 Feb 07 jari 439       
2 26 Feb 07 jari 440       p = midField.getLocation();
2 26 Feb 07 jari 441       x[1] = p.x;
2 26 Feb 07 jari 442       x[2] = p.x + fieldW;
2 26 Feb 07 jari 443       
2 26 Feb 07 jari 444       if(midField.hasFocus())
2 26 Feb 07 jari 445         g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.6f));              
2 26 Feb 07 jari 446       else
2 26 Feb 07 jari 447         g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.1f));
2 26 Feb 07 jari 448         
2 26 Feb 07 jari 449       g.fillPolygon(x,y,3);
2 26 Feb 07 jari 450       
2 26 Feb 07 jari 451       
2 26 Feb 07 jari 452       p =  higher.getLocation();      
2 26 Feb 07 jari 453       x[0] = p.x;
2 26 Feb 07 jari 454       
2 26 Feb 07 jari 455       p = c3Field.getLocation();
2 26 Feb 07 jari 456       x[1] = p.x;
2 26 Feb 07 jari 457       x[2] = p.x + fieldW;
2 26 Feb 07 jari 458
2 26 Feb 07 jari 459       if(c3Field.hasFocus())
2 26 Feb 07 jari 460         g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.6f));              
2 26 Feb 07 jari 461       else
2 26 Feb 07 jari 462         g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.1f));
2 26 Feb 07 jari 463   
2 26 Feb 07 jari 464       g.fillPolygon(x,y,3);
2 26 Feb 07 jari 465       
2 26 Feb 07 jari 466       
2 26 Feb 07 jari 467       p =  highest.getLocation();      
2 26 Feb 07 jari 468       x[0] = p.x;
2 26 Feb 07 jari 469       
2 26 Feb 07 jari 470       p = c4Field.getLocation();
2 26 Feb 07 jari 471       x[1] = p.x;
2 26 Feb 07 jari 472       x[2] = p.x + fieldW;
2 26 Feb 07 jari 473
2 26 Feb 07 jari 474       if(c4Field.hasFocus())
2 26 Feb 07 jari 475         g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.6f));              
2 26 Feb 07 jari 476       else
2 26 Feb 07 jari 477         g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.1f));
2 26 Feb 07 jari 478   
2 26 Feb 07 jari 479       g.fillPolygon(x,y,3);
2 26 Feb 07 jari 480     }
2 26 Feb 07 jari 481   }
2 26 Feb 07 jari 482   
2 26 Feb 07 jari 483   public class ButtonListener implements ActionListener, FocusListener {
2 26 Feb 07 jari 484
2 26 Feb 07 jari 485     JButton button;
2 26 Feb 07 jari 486     JColorChooser chooser;
2 26 Feb 07 jari 487     
2 26 Feb 07 jari 488     public ButtonListener() { }
2 26 Feb 07 jari 489
2 26 Feb 07 jari 490     public ButtonListener(JButton button, JColorChooser chooser) {
2 26 Feb 07 jari 491       this.button = button;
2 26 Feb 07 jari 492       this.chooser = chooser;
2 26 Feb 07 jari 493     }
2 26 Feb 07 jari 494     
2 26 Feb 07 jari 495     public void actionPerformed(ActionEvent ae) {
2 26 Feb 07 jari 496       String command = ae.getActionCommand();
2 26 Feb 07 jari 497
2 26 Feb 07 jari 498       if(ae.getSource() instanceof JTextField)
2 26 Feb 07 jari 499         repaint();
2 26 Feb 07 jari 500       
2 26 Feb 07 jari 501       //ok from color chooser
2 26 Feb 07 jari 502       if(command.equals("OK")) {        
2 26 Feb 07 jari 503         button.setBackground(chooser.getColor());
2 26 Feb 07 jari 504
2 26 Feb 07 jari 505         //cancel from color chooser
2 26 Feb 07 jari 506       } else if (command.equals("cancel")){
2 26 Feb 07 jari 507         
2 26 Feb 07 jari 508       } else if (command.equals("color-button-hit-command")){
2 26 Feb 07 jari 509         JButton sourceButton = (JButton)ae.getSource();
2 26 Feb 07 jari 510         sourceButton.setBorder(BorderFactory.createLineBorder(Color.black, 3));
2 26 Feb 07 jari 511         assignColor(sourceButton);
2 26 Feb 07 jari 512       } else if (command.equals("ok-command")) {
2 26 Feb 07 jari 513         if(applySettings()) {
2 26 Feb 07 jari 514           result = JOptionPane.OK_OPTION;
2 26 Feb 07 jari 515           dispose();
2 26 Feb 07 jari 516         }        
2 26 Feb 07 jari 517       } else if (command.equals("cancel-command")) {
2 26 Feb 07 jari 518         result = JOptionPane.CANCEL_OPTION;
2 26 Feb 07 jari 519         dispose();
2 26 Feb 07 jari 520       } else if (command.equals("reset-command")) {
2 26 Feb 07 jari 521         resetControls();
2 26 Feb 07 jari 522       } else if (command.equals("preview-command")) {
2 26 Feb 07 jari 523         applySettings();
2 26 Feb 07 jari 524       } else if (command.equals("info-command")) {
2 26 Feb 07 jari 525                 HelpWindow hw = new HelpWindow(LEMColorRangeSelector.this, "LEM Bin Color and Limits Selection Dialog");
2 26 Feb 07 jari 526                 result = JOptionPane.CANCEL_OPTION;
2 26 Feb 07 jari 527                 if(hw.getWindowContent()){
2 26 Feb 07 jari 528                     hw.setSize(450,500);
2 26 Feb 07 jari 529                     hw.setLocation();
2 26 Feb 07 jari 530                     hw.show();
2 26 Feb 07 jari 531                 }
2 26 Feb 07 jari 532                 else {
2 26 Feb 07 jari 533                     hw.setVisible(false);
2 26 Feb 07 jari 534                     hw.dispose();
2 26 Feb 07 jari 535                 }        
2 26 Feb 07 jari 536       }
2 26 Feb 07 jari 537     }
2 26 Feb 07 jari 538
2 26 Feb 07 jari 539
2 26 Feb 07 jari 540     public void focusGained(FocusEvent e) {
2 26 Feb 07 jari 541       repaint();
2 26 Feb 07 jari 542     }
2 26 Feb 07 jari 543
2 26 Feb 07 jari 544     public void focusLost(FocusEvent e) {
2 26 Feb 07 jari 545       repaint();
2 26 Feb 07 jari 546     }    
2 26 Feb 07 jari 547   }
2 26 Feb 07 jari 548   
2 26 Feb 07 jari 549   
2 26 Feb 07 jari 550   
2 26 Feb 07 jari 551   
2 26 Feb 07 jari 552 }