X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FFeatureRenderer.java;h=83badd0da33d0fa9ebbc71b6d8a4e6b00e32903b;hb=afe4b88500a5d61bc8d312909cfdde2b7cdd53df;hp=358798d8932450d5b89a7b9461af35c43709b345;hpb=3d0101179759ef157b088ea135423cd909512d9f;p=jalview.git
diff --git a/src/jalview/gui/FeatureRenderer.java b/src/jalview/gui/FeatureRenderer.java
index 358798d..83badd0 100644
--- a/src/jalview/gui/FeatureRenderer.java
+++ b/src/jalview/gui/FeatureRenderer.java
@@ -20,62 +20,12 @@
*/
package jalview.gui;
-import jalview.api.FeatureColourI;
-import jalview.datamodel.SearchResults;
-import jalview.datamodel.SearchResultsI;
-import jalview.datamodel.SequenceFeature;
-import jalview.datamodel.SequenceI;
-import jalview.io.FeaturesFile;
-import jalview.schemes.FeatureColour;
-import jalview.util.ColorUtils;
-import jalview.util.MessageManager;
-
-import java.awt.BorderLayout;
-import java.awt.Color;
-import java.awt.Dimension;
-import java.awt.Font;
-import java.awt.GridLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.List;
-
-import javax.swing.JColorChooser;
-import javax.swing.JComboBox;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JSpinner;
-import javax.swing.JTextArea;
-import javax.swing.JTextField;
-import javax.swing.SwingConstants;
-import javax.swing.event.DocumentEvent;
-import javax.swing.event.DocumentListener;
-
/**
- * DOCUMENT ME!
- *
- * @author $author$
- * @version $Revision$
+ * A class that manages drawing of sequence features for the Swing gui
*/
public class FeatureRenderer
extends jalview.renderer.seqfeatures.FeatureRenderer
{
- /*
- * defaults for creating a new feature are the last created
- * feature type and group
- */
- static String lastFeatureAdded = "feature_1";
-
- static String lastFeatureGroupAdded = "Jalview";
-
- Color resBoxColour;
-
AlignmentPanel ap;
/**
@@ -94,466 +44,4 @@ public class FeatureRenderer
transferSettings(alignPanel.getSeqPanel().seqCanvas.fr);
}
}
-
- FeatureColourI oldcol, fcol;
-
- int featureIndex = 0;
-
- /**
- * Presents a dialog allowing the user to add new features, or amend or delete
- * existing features. Currently this can be on
- *
- * - double-click on a sequence - Amend/Delete features at position
- * - Create sequence feature from pop-up menu on selected region
- * - Create features for pattern matches from Find
- *
- * If the supplied feature type is null, show (and update on confirm) the type
- * and group of the last new feature created (with initial defaults of
- * "feature_1" and "Jalview").
- *
- * @param sequences
- * the sequences features are to be created on (if creating
- * features), or a single sequence (if amending features)
- * @param features
- * the current features at the position (if amending), or template
- * new feature(s) with start/end position set (if creating)
- * @param create
- * true to create features, false to amend or delete
- * @param alignPanel
- * @return
- */
- protected boolean amendFeatures(final List sequences,
- final List features, boolean create,
- final AlignmentPanel alignPanel)
- {
- featureIndex = 0;
-
- final JPanel mainPanel = new JPanel(new BorderLayout());
-
- final JTextField name = new JTextField(25);
- name.getDocument().addDocumentListener(new DocumentListener()
- {
- @Override
- public void insertUpdate(DocumentEvent e)
- {
- warnIfTypeHidden(mainPanel, name.getText());
- }
-
- @Override
- public void removeUpdate(DocumentEvent e)
- {
- warnIfTypeHidden(mainPanel, name.getText());
- }
-
- @Override
- public void changedUpdate(DocumentEvent e)
- {
- warnIfTypeHidden(mainPanel, name.getText());
- }
- });
-
- final JTextField group = new JTextField(25);
- group.getDocument().addDocumentListener(new DocumentListener()
- {
- @Override
- public void insertUpdate(DocumentEvent e)
- {
- warnIfGroupHidden(mainPanel, group.getText());
- }
-
- @Override
- public void removeUpdate(DocumentEvent e)
- {
- warnIfGroupHidden(mainPanel, group.getText());
- }
-
- @Override
- public void changedUpdate(DocumentEvent e)
- {
- warnIfGroupHidden(mainPanel, group.getText());
- }
- });
-
- final JTextArea description = new JTextArea(3, 25);
- final JSpinner start = new JSpinner();
- final JSpinner end = new JSpinner();
- start.setPreferredSize(new Dimension(80, 20));
- end.setPreferredSize(new Dimension(80, 20));
- final FeatureRenderer me = this;
- final JLabel colour = new JLabel();
- colour.setOpaque(true);
- // colour.setBorder(BorderFactory.createEtchedBorder());
- colour.setMaximumSize(new Dimension(30, 16));
- colour.addMouseListener(new MouseAdapter()
- {
- FeatureColourChooser fcc = null;
-
- @Override
- public void mousePressed(MouseEvent evt)
- {
- if (fcol.isSimpleColour())
- {
- Color col = JColorChooser.showDialog(Desktop.desktop,
- MessageManager.getString("label.select_feature_colour"),
- fcol.getColour());
- if (col != null)
- {
- fcol = new FeatureColour(col);
- updateColourButton(mainPanel, colour, fcol);
- }
- }
- else
- {
- if (fcc == null)
- {
- final String ft = features.get(featureIndex).getType();
- final String type = ft == null ? lastFeatureAdded : ft;
- fcc = new FeatureColourChooser(me, type);
- fcc.setRequestFocusEnabled(true);
- fcc.requestFocus();
-
- fcc.addActionListener(new ActionListener()
- {
-
- @Override
- public void actionPerformed(ActionEvent e)
- {
- fcol = fcc.getLastColour();
- fcc = null;
- setColour(type, fcol);
- updateColourButton(mainPanel, colour, fcol);
- }
- });
-
- }
- }
- }
- });
- JPanel gridPanel = new JPanel(new GridLayout(3, 1));
-
- if (!create && features.size() > 1)
- {
- /*
- * more than one feature at selected position - add a drop-down
- * to choose the feature to amend
- */
- gridPanel = new JPanel(new GridLayout(4, 1));
- JPanel choosePanel = new JPanel();
- choosePanel.add(new JLabel(
- MessageManager.getString("label.select_feature") + ":"));
- final JComboBox overlaps = new JComboBox();
- for (SequenceFeature sf : features)
- {
- String text = sf.getType() + "/" + sf.getBegin() + "-" + sf.getEnd()
- + " (" + sf.getFeatureGroup() + ")";
- overlaps.addItem(text);
- }
- choosePanel.add(overlaps);
-
- overlaps.addItemListener(new ItemListener()
- {
- @Override
- public void itemStateChanged(ItemEvent e)
- {
- int index = overlaps.getSelectedIndex();
- if (index != -1)
- {
- featureIndex = index;
- SequenceFeature sf = features.get(index);
- name.setText(sf.getType());
- description.setText(sf.getDescription());
- group.setText(sf.getFeatureGroup());
- start.setValue(new Integer(sf.getBegin()));
- end.setValue(new Integer(sf.getEnd()));
-
- SearchResultsI highlight = new SearchResults();
- highlight.addResult(sequences.get(0), sf.getBegin(),
- sf.getEnd());
-
- alignPanel.getSeqPanel().seqCanvas
- .highlightSearchResults(highlight);
-
- }
- FeatureColourI col = getFeatureStyle(name.getText());
- if (col == null)
- {
- col = new FeatureColour(
- ColorUtils.createColourFromName(name.getText()));
- }
- oldcol = fcol = col;
- updateColourButton(mainPanel, colour, col);
- }
- });
-
- gridPanel.add(choosePanel);
- }
-
- JPanel namePanel = new JPanel();
- gridPanel.add(namePanel);
- namePanel.add(new JLabel(MessageManager.getString("label.name:"),
- JLabel.RIGHT));
- namePanel.add(name);
-
- JPanel groupPanel = new JPanel();
- gridPanel.add(groupPanel);
- groupPanel.add(new JLabel(MessageManager.getString("label.group:"),
- JLabel.RIGHT));
- groupPanel.add(group);
-
- JPanel colourPanel = new JPanel();
- gridPanel.add(colourPanel);
- colourPanel.add(new JLabel(MessageManager.getString("label.colour"),
- JLabel.RIGHT));
- colourPanel.add(colour);
- colour.setPreferredSize(new Dimension(150, 15));
- colour.setFont(new java.awt.Font("Verdana", Font.PLAIN, 9));
- colour.setForeground(Color.black);
- colour.setHorizontalAlignment(SwingConstants.CENTER);
- colour.setVerticalAlignment(SwingConstants.CENTER);
- colour.setHorizontalTextPosition(SwingConstants.CENTER);
- colour.setVerticalTextPosition(SwingConstants.CENTER);
- mainPanel.add(gridPanel, BorderLayout.NORTH);
-
- JPanel descriptionPanel = new JPanel();
- descriptionPanel.add(new JLabel(
- MessageManager.getString("label.description:"), JLabel.RIGHT));
- description.setFont(JvSwingUtils.getTextAreaFont());
- description.setLineWrap(true);
- descriptionPanel.add(new JScrollPane(description));
-
- if (!create)
- {
- mainPanel.add(descriptionPanel, BorderLayout.SOUTH);
-
- JPanel startEndPanel = new JPanel();
- startEndPanel.add(new JLabel(MessageManager.getString("label.start"),
- JLabel.RIGHT));
- startEndPanel.add(start);
- startEndPanel.add(new JLabel(MessageManager.getString("label.end"),
- JLabel.RIGHT));
- startEndPanel.add(end);
- mainPanel.add(startEndPanel, BorderLayout.CENTER);
- }
- else
- {
- mainPanel.add(descriptionPanel, BorderLayout.CENTER);
- }
-
- /*
- * default feature type and group to that of the first feature supplied,
- * or to the last feature created if not supplied (null value)
- */
- SequenceFeature firstFeature = features.get(0);
- boolean useLastDefaults = firstFeature.getType() == null;
- final String featureType = useLastDefaults ? lastFeatureAdded
- : firstFeature.getType();
- final String featureGroup = useLastDefaults ? lastFeatureGroupAdded
- : firstFeature.getFeatureGroup();
- name.setText(featureType);
- group.setText(featureGroup);
-
- start.setValue(new Integer(firstFeature.getBegin()));
- end.setValue(new Integer(firstFeature.getEnd()));
- description.setText(firstFeature.getDescription());
- updateColourButton(mainPanel, colour,
- (oldcol = fcol = getFeatureStyle(featureType)));
- Object[] options;
- if (!create)
- {
- options = new Object[] { MessageManager.getString("label.amend"),
- MessageManager.getString("action.delete"),
- MessageManager.getString("action.cancel") };
- }
- else
- {
- options = new Object[] { MessageManager.getString("action.ok"),
- MessageManager.getString("action.cancel") };
- }
-
- String title = create
- ? MessageManager.getString("label.create_new_sequence_features")
- : MessageManager.formatMessage("label.amend_delete_features",
- new String[]
- { sequences.get(0).getName() });
-
- /*
- * show the dialog
- */
- int reply = JvOptionPane.showInternalOptionDialog(Desktop.desktop,
- mainPanel, title, JvOptionPane.YES_NO_CANCEL_OPTION,
- JvOptionPane.QUESTION_MESSAGE, null, options,
- MessageManager.getString("action.ok"));
-
- FeaturesFile ffile = new FeaturesFile();
-
- String enteredType = name.getText().trim();
- if (reply == JvOptionPane.OK_OPTION && enteredType.length() > 0)
- {
- /*
- * update default values only if creating using default values
- */
- if (useLastDefaults)
- {
- lastFeatureAdded = enteredType;
- lastFeatureGroupAdded = group.getText().trim();
- // TODO: determine if the null feature group is valid
- if (lastFeatureGroupAdded.length() < 1)
- {
- lastFeatureGroupAdded = null;
- }
- }
- }
-
- if (!create)
- {
- SequenceFeature sf = features.get(featureIndex);
-
- if (reply == JvOptionPane.NO_OPTION)
- {
- /*
- * NO_OPTION corresponds to the Delete button
- */
- sequences.get(0).getDatasetSequence().deleteFeature(sf);
- // update Feature Settings for removal of feature / group
- featuresAdded();
- }
- else if (reply == JvOptionPane.YES_OPTION)
- {
- /*
- * YES_OPTION corresponds to the Amend button
- * need to refresh Feature Settings if type, group or colour changed
- */
- sf.type = enteredType;
- sf.featureGroup = group.getText().trim();
- sf.description = description.getText().replaceAll("\n", " ");
- boolean refreshSettings = (!featureType.equals(sf.type)
- || !featureGroup.equals(sf.featureGroup));
- refreshSettings |= (fcol != oldcol);
-
- setColour(sf.type, fcol);
-
- try
- {
- sf.begin = ((Integer) start.getValue()).intValue();
- sf.end = ((Integer) end.getValue()).intValue();
- } catch (NumberFormatException ex)
- {
- }
-
- ffile.parseDescriptionHTML(sf, false);
- if (refreshSettings)
- {
- featuresAdded();
- }
- }
- }
- else
- // NEW FEATURES ADDED
- {
- if (reply == JvOptionPane.OK_OPTION && enteredType.length() > 0)
- {
- for (int i = 0; i < sequences.size(); i++)
- {
- SequenceFeature sf = features.get(i);
- sf.type = enteredType;
- // fix for JAL-1538 - always set feature group here
- sf.featureGroup = group.getText().trim();
- sf.description = description.getText().replaceAll("\n", " ");
- sequences.get(i).addSequenceFeature(sf);
- ffile.parseDescriptionHTML(sf, false);
- }
-
- setColour(enteredType, fcol);
-
- featuresAdded();
-
- alignPanel.paintAlignment(true);
-
- return true;
- }
- else
- {
- return false;
- }
- }
-
- alignPanel.paintAlignment(true);
-
- return true;
- }
-
- /**
- * Show a warning message if the entered type is one that is currently hidden
- *
- * @param panel
- * @param type
- */
- protected void warnIfTypeHidden(JPanel panel, String type)
- {
- if (getRenderOrder().contains(type))
- {
- if (!showFeatureOfType(type))
- {
- String msg = MessageManager.formatMessage("label.warning_hidden",
- MessageManager.getString("label.feature_type"), type);
- JvOptionPane.showMessageDialog(panel, msg, "",
- JvOptionPane.OK_OPTION);
- }
- }
- }
-
- /**
- * Show a warning message if the entered group is one that is currently hidden
- *
- * @param panel
- * @param group
- */
- protected void warnIfGroupHidden(JPanel panel, String group)
- {
- if (featureGroups.containsKey(group) && !featureGroups.get(group))
- {
- String msg = MessageManager.formatMessage("label.warning_hidden",
- MessageManager.getString("label.group"), group);
- JvOptionPane.showMessageDialog(panel, msg, "",
- JvOptionPane.OK_OPTION);
- }
- }
-
- /**
- * update the amend feature button dependent on the given style
- *
- * @param bigPanel
- * @param col
- * @param col
- */
- protected void updateColourButton(JPanel bigPanel, JLabel colour,
- FeatureColourI col)
- {
- colour.removeAll();
- colour.setIcon(null);
- colour.setToolTipText(null);
- colour.setText("");
-
- if (col.isSimpleColour())
- {
- colour.setBackground(col.getColour());
- }
- else
- {
- colour.setBackground(bigPanel.getBackground());
- colour.setForeground(Color.black);
- FeatureSettings.renderGraduatedColor(colour, col);
- }
- }
-
- /**
- * Orders features in render precedence (last in order is last to render, so
- * displayed on top of other features)
- *
- * @param order
- */
- public void orderFeatures(Comparator order)
- {
- Arrays.sort(renderOrder, order);
- }
}