X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FFeatureColourChooser.java;h=25527dc7e37bc403ec9bb92966adad6b6c923da1;hb=17e77c3f2949a0729322b4a8d907f3f34b6a9914;hp=fedcbc5c3c0b7970a191f8b1b817c88e20e625bc;hpb=65810f683363c5c33d01b8f952ea140210745fe9;p=jalview.git diff --git a/src/jalview/gui/FeatureColourChooser.java b/src/jalview/gui/FeatureColourChooser.java index fedcbc5..25527dc 100644 --- a/src/jalview/gui/FeatureColourChooser.java +++ b/src/jalview/gui/FeatureColourChooser.java @@ -1,66 +1,103 @@ /* - * 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 + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.9) + * Copyright (C) 2015 The Jalview Authors * - * 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 file is part of Jalview. * - * 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. + * Jalview 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 3 + * of the License, or (at your option) any later version. + * + * Jalview 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 + * along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. */ package jalview.gui; -import java.util.*; - -import java.awt.*; -import java.awt.event.*; -import javax.swing.*; -import javax.swing.event.*; +import jalview.datamodel.GraphLine; +import jalview.schemes.AnnotationColourGradient; +import jalview.schemes.GraduatedColor; +import jalview.util.MessageManager; -import jalview.datamodel.*; -import jalview.schemes.*; +import java.awt.BorderLayout; +import java.awt.Color; import java.awt.Dimension; - -public class FeatureColourChooser extends JPanel +import java.awt.FlowLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.Hashtable; + +import javax.swing.BorderFactory; +import javax.swing.JCheckBox; +import javax.swing.JColorChooser; +import javax.swing.JComboBox; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JSlider; +import javax.swing.JTextField; +import javax.swing.border.LineBorder; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; + +public class FeatureColourChooser extends JalviewDialog { - JInternalFrame frame; - + // FeatureSettings fs; FeatureRenderer fr; - FeatureSettings fs; + private GraduatedColor cs; + + private Object oldcs; - GraduatedColor cs; - Object oldcs; + /** + * + * @return the last colour setting selected by user - either oldcs (which may + * be a java.awt.Color) or the new GraduatedColor + */ + public Object getLastColour() + { + if (cs == null) + { + return oldcs; + } + return cs; + } Hashtable oldgroupColours; - + AlignmentPanel ap; - boolean adjusting = false; private float min; private float max; + String type = null; - public FeatureColourChooser(FeatureSettings fsettings, String type) + + public FeatureColourChooser(FeatureRenderer frender, String type) { - this.fs = fsettings; + this(frender, false, type); + } + + public FeatureColourChooser(FeatureRenderer frender, boolean block, + String type) + { + this.fr = frender; 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); + initDialogFrame(this, true, block, "Graduated Feature Colour for " + + type, 480, 185); + // frame.setLayer(JLayeredPane.PALETTE_LAYER); + // Desktop.addInternalFrame(frame, "Graduated Feature Colour for "+type, + // 480, 145); slider.addChangeListener(new ChangeListener() { @@ -77,24 +114,32 @@ public class FeatureColourChooser extends JPanel { public void mouseReleased(MouseEvent evt) { - if (fr.ap!=null) { fr.ap.paintAlignment(true); }; + if (ap != null) + { + ap.paintAlignment(true); + } + ; } }); - float mm[] = ((float[][]) fr.minmax.get(type))[0]; + float mm[] = ((float[][]) fr.getMinMax().get(type))[0]; min = mm[0]; max = mm[1]; - oldcs = fr.featureColours.get(type); + oldcs = fr.getFeatureColours().get(type); if (oldcs instanceof GraduatedColor) { - if (((GraduatedColor)oldcs).isAutoScale()) + if (((GraduatedColor) oldcs).isAutoScale()) { // update the scale cs = new GraduatedColor((GraduatedColor) oldcs, min, max); - } else { + } + else + { cs = new GraduatedColor((GraduatedColor) oldcs); } - } else { + } + else + { // promote original color to a graduated color Color bl = Color.black; if (oldcs instanceof Color) @@ -102,13 +147,13 @@ public class FeatureColourChooser extends JPanel bl = (Color) oldcs; } // original colour becomes the maximum colour - cs = new GraduatedColor(Color.white,bl,mm[0],mm[1]); + cs = new GraduatedColor(Color.white, bl, mm[0], mm[1]); cs.setColourByLabel(false); } - minColour.setBackground(cs.getMinColor()); - maxColour.setBackground(cs.getMaxColor()); + minColour.setBackground(oldminColour = cs.getMinColor()); + maxColour.setBackground(oldmaxColour = cs.getMaxColor()); adjusting = true; - + try { jbInit(); @@ -118,22 +163,23 @@ public class FeatureColourChooser extends JPanel // update the gui from threshold state thresholdIsMin.setSelected(!cs.isAutoScale()); colourByLabel.setSelected(cs.isColourByLabel()); - if (cs.getThreshType()!=AnnotationColourGradient.NO_THRESHOLD) + if (cs.getThreshType() != AnnotationColourGradient.NO_THRESHOLD) { // initialise threshold slider and selector - threshold.setSelectedIndex(cs.getThreshType()==AnnotationColourGradient.ABOVE_THRESHOLD ? 1 : 2); - slider.setEnabled(true); + 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); - + threshline = new jalview.datamodel.GraphLine((max - min) / 2f, + "Threshold", Color.black); + } adjusting = false; changeColour(); - + waitForInput(); } public FeatureColourChooser() @@ -149,10 +195,11 @@ public class FeatureColourChooser extends JPanel private void jbInit() throws Exception { - minColour.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11)); - minColour.setBorder(BorderFactory.createEtchedBorder()); + + minColour.setFont(JvSwingUtils.getLabelFont()); + minColour.setBorder(BorderFactory.createLineBorder(Color.black)); minColour.setPreferredSize(new Dimension(40, 20)); - minColour.setToolTipText("Minimum Colour"); + minColour.setToolTipText(MessageManager.getString("label.min_colour")); minColour.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) @@ -163,10 +210,10 @@ public class FeatureColourChooser extends JPanel } } }); - maxColour.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11)); - maxColour.setBorder(BorderFactory.createEtchedBorder()); + maxColour.setFont(JvSwingUtils.getLabelFont()); + maxColour.setBorder(BorderFactory.createLineBorder(Color.black)); maxColour.setPreferredSize(new Dimension(40, 20)); - maxColour.setToolTipText("Maximum Colour"); + maxColour.setToolTipText(MessageManager.getString("label.max_colour")); maxColour.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) @@ -177,24 +224,11 @@ public class FeatureColourChooser extends JPanel } } }); - 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); - } - }); + maxColour.setBorder(new LineBorder(Color.black)); + minText.setText(MessageManager.getString("label.min")); + minText.setFont(JvSwingUtils.getLabelFont()); + maxText.setText(MessageManager.getString("label.max")); + maxText.setFont(JvSwingUtils.getLabelFont()); this.setLayout(borderLayout1); jPanel2.setLayout(flowLayout1); jPanel1.setBackground(Color.white); @@ -206,9 +240,14 @@ public class FeatureColourChooser extends JPanel threshold_actionPerformed(e); } }); - threshold.addItem("No Threshold"); // index 0 - threshold.addItem("Above Threshold"); // index 1 - threshold.addItem("Below Threshold"); // index 2 + threshold.setToolTipText(MessageManager + .getString("label.threshold_feature_display_by_score")); + threshold.addItem(MessageManager + .getString("label.threshold_feature_no_thereshold")); // index 0 + threshold.addItem(MessageManager + .getString("label.threshold_feature_above_thereshold")); // index 1 + threshold.addItem(MessageManager + .getString("label.threshold_feature_below_thereshold")); // index 2 jPanel3.setLayout(flowLayout2); thresholdValue.addActionListener(new ActionListener() { @@ -223,21 +262,16 @@ public class FeatureColourChooser extends JPanel slider.setEnabled(false); slider.setOpaque(false); slider.setPreferredSize(new Dimension(100, 32)); + slider.setToolTipText(MessageManager + .getString("label.adjust_thereshold")); 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.setText(MessageManager + .getString("label.threshold_minmax")); + thresholdIsMin.setToolTipText(MessageManager + .getString("label.toggle_absolute_relative_display_threshold")); thresholdIsMin.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent actionEvent) @@ -246,7 +280,11 @@ public class FeatureColourChooser extends JPanel } }); colourByLabel.setBackground(Color.white); - colourByLabel.setText("Colour by Label"); + colourByLabel + .setText(MessageManager.getString("label.colour_by_label")); + colourByLabel + .setToolTipText(MessageManager + .getString("label.display_features_same_type_different_label_using_different_colour")); colourByLabel.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent actionEvent) @@ -254,29 +292,33 @@ public class FeatureColourChooser extends JPanel colourByLabel_actionPerformed(actionEvent); } }); + colourPanel.setBackground(Color.white); jPanel1.add(ok); jPanel1.add(cancel); - // jPanel2.add(currentColours); - jPanel2.add(minColour); - jPanel2.add(maxColour); + jPanel2.add(colourByLabel, java.awt.BorderLayout.WEST); + jPanel2.add(colourPanel, java.awt.BorderLayout.EAST); + colourPanel.add(minText); + colourPanel.add(minColour); + colourPanel.add(maxText); + colourPanel.add(maxColour); this.add(jPanel3, java.awt.BorderLayout.CENTER); jPanel3.add(threshold); jPanel3.add(slider); jPanel3.add(thresholdValue); jPanel3.add(thresholdIsMin); - jPanel3.add(colourByLabel); this.add(jPanel1, java.awt.BorderLayout.SOUTH); this.add(jPanel2, java.awt.BorderLayout.NORTH); } + JLabel minText = new JLabel(); + + JLabel maxText = new JLabel(); JPanel minColour = new JPanel(); JPanel maxColour = new JPanel(); - JButton ok = new JButton(); - - JButton cancel = new JButton(); + JPanel colourPanel = new JPanel(); JPanel jPanel1 = new JPanel(); @@ -295,21 +337,29 @@ public class FeatureColourChooser extends JPanel JSlider slider = new JSlider(); JTextField thresholdValue = new JTextField(20); - // TODO refactor to tolower flag - JCheckBox currentColours = new JCheckBox(); + + // TODO implement GUI for tolower flag + // JCheckBox toLower = new JCheckBox(); JCheckBox thresholdIsMin = new JCheckBox(); + JCheckBox colourByLabel = new JCheckBox(); private GraphLine threshline; + private Color oldmaxColour; + + private Color oldminColour; + public void minColour_actionPerformed() { Color col = JColorChooser.showDialog(this, - "Select Colour for Minimum Value", minColour.getBackground()); + MessageManager.getString("label.select_colour_minimum_value"), + minColour.getBackground()); if (col != null) { minColour.setBackground(col); + minColour.setForeground(col); } minColour.repaint(); changeColour(); @@ -318,10 +368,12 @@ public class FeatureColourChooser extends JPanel public void maxColour_actionPerformed() { Color col = JColorChooser.showDialog(this, - "Select Colour for Maximum Value", maxColour.getBackground()); + MessageManager.getString("label.select_colour_maximum_value"), + maxColour.getBackground()); if (col != null) { maxColour.setBackground(col); + maxColour.setForeground(col); } maxColour.repaint(); changeColour(); @@ -335,34 +387,44 @@ public class FeatureColourChooser extends JPanel return; } - int aboveThreshold = AnnotationColourGradient.NO_THRESHOLD; - if (threshold.getSelectedItem().equals("Above Threshold")) + if (threshold.getSelectedIndex() == 1) { aboveThreshold = AnnotationColourGradient.ABOVE_THRESHOLD; } - else if (threshold.getSelectedItem().equals("Below Threshold")) + else if (threshold.getSelectedIndex() == 2) { aboveThreshold = AnnotationColourGradient.BELOW_THRESHOLD; - } + } slider.setEnabled(true); thresholdValue.setEnabled(true); - GraduatedColor acg = new GraduatedColor(minColour.getBackground(), maxColour.getBackground(), min, max); + + GraduatedColor acg; + if (cs.isColourByLabel()) + { + acg = new GraduatedColor(oldminColour, oldmaxColour, min, max); + } + else + { + acg = new GraduatedColor(oldminColour = minColour.getBackground(), + oldmaxColour = maxColour.getBackground(), min, max); + + } if (aboveThreshold == AnnotationColourGradient.NO_THRESHOLD) { slider.setEnabled(false); thresholdValue.setEnabled(false); thresholdValue.setText(""); + thresholdIsMin.setEnabled(false); } 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); + threshline = new jalview.datamodel.GraphLine((max - min) / 2f, + "Threshold", Color.black); } if (aboveThreshold != AnnotationColourGradient.NO_THRESHOLD) @@ -370,8 +432,7 @@ public class FeatureColourChooser extends JPanel adjusting = true; acg.setThresh(threshline.value); - float range = max * 1000f - - min * 1000f; + float range = max * 1000f - min * 1000f; slider.setMinimum((int) (min * 1000)); slider.setMaximum((int) (max * 1000)); @@ -380,53 +441,76 @@ public class FeatureColourChooser extends JPanel slider.setMajorTickSpacing((int) (range / 10f)); slider.setEnabled(true); thresholdValue.setEnabled(true); + thresholdIsMin.setEnabled(!colourByLabel.isSelected()); adjusting = false; } acg.setThreshType(aboveThreshold); - if (thresholdIsMin.isSelected() && aboveThreshold != AnnotationColourGradient.NO_THRESHOLD) + if (thresholdIsMin.isSelected() + && aboveThreshold != AnnotationColourGradient.NO_THRESHOLD) { acg.setAutoScaled(false); - if (aboveThreshold==AnnotationColourGradient.ABOVE_THRESHOLD) - { + if (aboveThreshold == AnnotationColourGradient.ABOVE_THRESHOLD) + { acg = new GraduatedColor(acg, threshline.value, max); - } else { - acg = new GraduatedColor(acg, min,threshline.value); } - } else { + else + { + acg = new GraduatedColor(acg, min, threshline.value); + } + } + else + { acg.setAutoScaled(true); } acg.setColourByLabel(colourByLabel.isSelected()); - fr.featureColours.put(type,acg); + if (acg.isColourByLabel()) + { + maxColour.setEnabled(false); + minColour.setEnabled(false); + maxColour.setBackground(this.getBackground()); + maxColour.setForeground(this.getBackground()); + minColour.setBackground(this.getBackground()); + minColour.setForeground(this.getBackground()); + + } + else + { + maxColour.setEnabled(true); + minColour.setEnabled(true); + maxColour.setBackground(oldmaxColour); + minColour.setBackground(oldminColour); + maxColour.setForeground(oldmaxColour); + minColour.setForeground(oldminColour); + } + fr.setColour(type, acg); cs = acg; ap.paintAlignment(false); } - public void ok_actionPerformed(ActionEvent e) + protected void raiseClosed() { - changeColour(); - try - { - frame.setClosed(true); - } catch (Exception ex) + if (this.colourEditor != null) { + colourEditor.actionPerformed(new ActionEvent(this, 0, "CLOSED")); } } - public void cancel_actionPerformed(ActionEvent e) + public void okPressed() + { + changeColour(); + } + + public void cancelPressed() { reset(); - try - { - frame.setClosed(true); - } catch (Exception ex) - { - } } void reset() { - fr.featureColours.put(type, oldcs); + fr.setColour(type, oldcs); + ap.paintAlignment(false); + cs = null; } public void thresholdCheck_actionPerformed(ActionEvent e) @@ -464,26 +548,26 @@ public class FeatureColourChooser extends JPanel ap.paintAlignment(false); } - public void currentColours_actionPerformed(ActionEvent e) + public void thresholdIsMin_actionPerformed(ActionEvent actionEvent) { - if (currentColours.isSelected()) - { - reset(); - } - - maxColour.setEnabled(!currentColours.isSelected()); - minColour.setEnabled(!currentColours.isSelected()); - changeColour(); } - public void thresholdIsMin_actionPerformed(ActionEvent actionEvent) + public void colourByLabel_actionPerformed(ActionEvent actionEvent) { changeColour(); } - public void colourByLabel_actionPerformed(ActionEvent actionEvent) + + ActionListener colourEditor = null; + + public void addActionListener(ActionListener graduatedColorEditor) { - changeColour(); + if (colourEditor != null) + { + System.err + .println("IMPLEMENTATION ISSUE: overwriting action listener for FeatureColourChooser"); + } + colourEditor = graduatedColorEditor; } }