/* * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1) * Copyright (C) 2009 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ package jalview.gui; import java.util.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import jalview.datamodel.*; import jalview.schemes.*; import java.awt.Dimension; public class FeatureColourChooser extends JPanel { JInternalFrame frame; FeatureRenderer fr; FeatureSettings fs; GraduatedColor cs; Object oldcs; Hashtable oldgroupColours; AlignmentPanel ap; boolean adjusting = false; private float min; private float max; String type = null; public FeatureColourChooser(FeatureSettings fsettings, String type) { this.fs = fsettings; this.type = type; fr = fsettings.fr; ap = fr.ap; frame = new JInternalFrame(); frame.setContentPane(this); frame.setLayer(JLayeredPane.PALETTE_LAYER); Desktop.addInternalFrame(frame, "Graduated Feature Colour for "+type, 480, 145); slider.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent evt) { if (!adjusting) { thresholdValue.setText(((float) slider.getValue() / 1000f) + ""); valueChanged(); } } }); slider.addMouseListener(new MouseAdapter() { public void mouseReleased(MouseEvent evt) { if (fr.ap!=null) { fr.ap.paintAlignment(true); }; } }); float mm[] = ((float[][]) fr.minmax.get(type))[0]; min = mm[0]; max = mm[1]; oldcs = fr.featureColours.get(type); if (oldcs instanceof GraduatedColor) { if (((GraduatedColor)oldcs).isAutoScale()) { // update the scale cs = new GraduatedColor((GraduatedColor) oldcs, min, max); } else { cs = new GraduatedColor((GraduatedColor) oldcs); } } else { // promote original color to a graduated color Color bl = Color.black; if (oldcs instanceof Color) { bl = (Color) oldcs; } // original colour becomes the maximum colour cs = new GraduatedColor(Color.white,bl,mm[0],mm[1]); } minColour.setBackground(cs.getMinColor()); maxColour.setBackground(cs.getMaxColor()); adjusting = true; try { jbInit(); } catch (Exception ex) { } // update the gui from threshold state thresholdIsMin.setSelected(!cs.isAutoScale()); if (cs.getThreshType()!=AnnotationColourGradient.NO_THRESHOLD) { // initialise threshold slider and selector threshold.setSelectedIndex(cs.getThreshType()==AnnotationColourGradient.ABOVE_THRESHOLD ? 1 : 2); slider.setEnabled(true); thresholdValue.setEnabled(true); threshline = new jalview.datamodel.GraphLine( (max - min) / 2f, "Threshold", Color.black); } adjusting = false; changeColour(); } public FeatureColourChooser() { try { jbInit(); } catch (Exception ex) { ex.printStackTrace(); } } private void jbInit() throws Exception { minColour.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11)); minColour.setBorder(BorderFactory.createEtchedBorder()); minColour.setPreferredSize(new Dimension(40, 20)); minColour.setToolTipText("Minimum Colour"); minColour.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { if (minColour.isEnabled()) { minColour_actionPerformed(); } } }); maxColour.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11)); maxColour.setBorder(BorderFactory.createEtchedBorder()); maxColour.setPreferredSize(new Dimension(40, 20)); maxColour.setToolTipText("Maximum Colour"); maxColour.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { if (maxColour.isEnabled()) { maxColour_actionPerformed(); } } }); ok.setOpaque(false); ok.setText("OK"); ok.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ok_actionPerformed(e); } }); cancel.setOpaque(false); cancel.setText("Cancel"); cancel.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { cancel_actionPerformed(e); } }); this.setLayout(borderLayout1); jPanel2.setLayout(flowLayout1); jPanel1.setBackground(Color.white); jPanel2.setBackground(Color.white); threshold.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { threshold_actionPerformed(e); } }); threshold.addItem("No Threshold"); // index 0 threshold.addItem("Above Threshold"); // index 1 threshold.addItem("Below Threshold"); // index 2 jPanel3.setLayout(flowLayout2); thresholdValue.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { thresholdValue_actionPerformed(e); } }); slider.setPaintLabels(false); slider.setPaintTicks(true); slider.setBackground(Color.white); slider.setEnabled(false); slider.setOpaque(false); slider.setPreferredSize(new Dimension(100, 32)); thresholdValue.setEnabled(false); thresholdValue.setColumns(7); jPanel3.setBackground(Color.white); currentColours.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11)); currentColours.setOpaque(false); currentColours.setText("Use Original Colours"); currentColours.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { currentColours_actionPerformed(e); } }); thresholdIsMin.setBackground(Color.white); thresholdIsMin.setText("Threshold is Min/Max"); thresholdIsMin.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { thresholdIsMin_actionPerformed(actionEvent); } }); jPanel1.add(ok); jPanel1.add(cancel); // jPanel2.add(currentColours); jPanel2.add(minColour); jPanel2.add(maxColour); this.add(jPanel3, java.awt.BorderLayout.CENTER); jPanel3.add(threshold); jPanel3.add(slider); jPanel3.add(thresholdValue); jPanel3.add(thresholdIsMin); this.add(jPanel1, java.awt.BorderLayout.SOUTH); this.add(jPanel2, java.awt.BorderLayout.NORTH); } JPanel minColour = new JPanel(); JPanel maxColour = new JPanel(); JButton ok = new JButton(); JButton cancel = new JButton(); JPanel jPanel1 = new JPanel(); JPanel jPanel2 = new JPanel(); BorderLayout borderLayout1 = new BorderLayout(); JComboBox threshold = new JComboBox(); FlowLayout flowLayout1 = new FlowLayout(); JPanel jPanel3 = new JPanel(); FlowLayout flowLayout2 = new FlowLayout(); JSlider slider = new JSlider(); JTextField thresholdValue = new JTextField(20); // TODO refactor to tolower flag JCheckBox currentColours = new JCheckBox(); JCheckBox thresholdIsMin = new JCheckBox(); private GraphLine threshline; public void minColour_actionPerformed() { Color col = JColorChooser.showDialog(this, "Select Colour for Minimum Value", minColour.getBackground()); if (col != null) { minColour.setBackground(col); } minColour.repaint(); changeColour(); } public void maxColour_actionPerformed() { Color col = JColorChooser.showDialog(this, "Select Colour for Maximum Value", maxColour.getBackground()); if (col != null) { maxColour.setBackground(col); } maxColour.repaint(); changeColour(); } void changeColour() { // Check if combobox is still adjusting if (adjusting) { return; } int aboveThreshold = AnnotationColourGradient.NO_THRESHOLD; if (threshold.getSelectedItem().equals("Above Threshold")) { aboveThreshold = AnnotationColourGradient.ABOVE_THRESHOLD; } else if (threshold.getSelectedItem().equals("Below Threshold")) { aboveThreshold = AnnotationColourGradient.BELOW_THRESHOLD; } slider.setEnabled(true); thresholdValue.setEnabled(true); GraduatedColor acg = new GraduatedColor(minColour.getBackground(), maxColour.getBackground(), min, max); if (aboveThreshold == AnnotationColourGradient.NO_THRESHOLD) { slider.setEnabled(false); thresholdValue.setEnabled(false); thresholdValue.setText(""); } else if (aboveThreshold != AnnotationColourGradient.NO_THRESHOLD && threshline == null) { // todo visual indication of feature threshold threshline = new jalview.datamodel.GraphLine( (max - min) / 2f, "Threshold", Color.black); } if (aboveThreshold != AnnotationColourGradient.NO_THRESHOLD) { adjusting = true; acg.setThresh(threshline.value); float range = max * 1000f - min * 1000f; slider.setMinimum((int) (min * 1000)); slider.setMaximum((int) (max * 1000)); slider.setValue((int) (threshline.value * 1000)); thresholdValue.setText(threshline.value + ""); slider.setMajorTickSpacing((int) (range / 10f)); slider.setEnabled(true); thresholdValue.setEnabled(true); adjusting = false; } acg.setThreshType(aboveThreshold); if (thresholdIsMin.isSelected() && aboveThreshold != AnnotationColourGradient.NO_THRESHOLD) { acg.setAutoScaled(false); if (aboveThreshold==AnnotationColourGradient.ABOVE_THRESHOLD) { acg = new GraduatedColor(acg, threshline.value, max); } else { acg = new GraduatedColor(acg, min,threshline.value); } } else { acg.setAutoScaled(true); } fr.featureColours.put(type,acg); cs = acg; ap.paintAlignment(false); } public void ok_actionPerformed(ActionEvent e) { changeColour(); try { frame.setClosed(true); } catch (Exception ex) { } } public void cancel_actionPerformed(ActionEvent e) { reset(); try { frame.setClosed(true); } catch (Exception ex) { } } void reset() { fr.featureColours.put(type, oldcs); } public void thresholdCheck_actionPerformed(ActionEvent e) { changeColour(); } public void annotations_actionPerformed(ActionEvent e) { changeColour(); } public void threshold_actionPerformed(ActionEvent e) { changeColour(); } public void thresholdValue_actionPerformed(ActionEvent e) { try { float f = Float.parseFloat(thresholdValue.getText()); slider.setValue((int) (f * 1000)); threshline.value = f; } catch (NumberFormatException ex) { } } public void valueChanged() { threshline.value = (float) slider.getValue() / 1000f; cs.setThresh(threshline.value); changeColour(); ap.paintAlignment(false); } public void currentColours_actionPerformed(ActionEvent e) { if (currentColours.isSelected()) { reset(); } maxColour.setEnabled(!currentColours.isSelected()); minColour.setEnabled(!currentColours.isSelected()); changeColour(); } public void thresholdIsMin_actionPerformed(ActionEvent actionEvent) { changeColour(); } }