*/
package jalview.gui;
+import jalview.api.AlignViewportI;
import jalview.api.AlignmentViewPanel;
import jalview.api.FeatureColourI;
import jalview.bin.Cache;
import jalview.datamodel.features.FeatureMatcherI;
import jalview.datamodel.features.FeatureMatcherSet;
import jalview.datamodel.features.FeatureMatcherSetI;
+import jalview.gui.JalviewColourChooser.ColourChooserListener;
import jalview.schemes.FeatureColour;
import jalview.util.ColorUtils;
import jalview.util.MessageManager;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
-import javax.swing.JColorChooser;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
/*
* the view panel to update when settings change
*/
- private final AlignmentViewPanel ap;
+ final AlignmentViewPanel ap;
- private final String featureType;
+ final String featureType;
/*
* the colour and filters to reset to on Cancel
* set flag to true when setting values programmatically,
* to avoid invocation of action handlers
*/
- private boolean adjusting = false;
+ boolean adjusting = false;
/*
* minimum of the value range for graduated colour
* radio button group, to select what to colour by:
* simple colour, by category (text), or graduated
*/
- private JRadioButton simpleColour = new JRadioButton();
+ JRadioButton simpleColour = new JRadioButton();
- private JRadioButton byCategory = new JRadioButton();
+ JRadioButton byCategory = new JRadioButton();
- private JRadioButton graduatedColour = new JRadioButton();
+ JRadioButton graduatedColour = new JRadioButton();
- /**
- * colours and filters are shown in tabbed view or single content pane
- */
- JPanel coloursPanel, filtersPanel;
+ JPanel coloursPanel;
+
+ JPanel filtersPanel;
JPanel singleColour = new JPanel();
- private JPanel minColour = new JPanel();
+ JPanel minColour = new JPanel();
- private JPanel maxColour = new JPanel();
+ JPanel maxColour = new JPanel();
private JComboBox<Object> threshold = new JComboBox<>();
private Slider slider;
- private JTextField thresholdValue = new JTextField(20);
+ JTextField thresholdValue = new JTextField(20);
private JCheckBox thresholdIsMin = new JCheckBox();
/*
* filters for the currently selected feature type
*/
- private List<FeatureMatcherI> filters;
+ List<FeatureMatcherI> filters;
private JPanel chooseFiltersPanel;
return;
}
- updateColoursTab();
+ updateColoursPanel();
- updateFiltersTab();
+ updateFiltersPanel();
adjusting = false;
}
/**
- * Configures the widgets on the Colours tab according to the current feature
+ * Configures the widgets on the Colours panel according to the current feature
* colour scheme
*/
- private void updateColoursTab()
+ private void updateColoursPanel()
{
FeatureColourI fc = fr.getFeatureColours().get(featureType);
};
/*
- * first panel/tab: colour options
+ * first panel: colour options
*/
JPanel coloursPanel = initialiseColoursPanel();
this.add(coloursPanel, BorderLayout.NORTH);
/*
- * second panel/tab: filter options
+ * second panel: filter options
*/
JPanel filtersPanel = initialiseFiltersPanel();
this.add(filtersPanel, BorderLayout.CENTER);
graduatedColour = new JRadioButton(
MessageManager.getString("label.by_range_of") + COLON);
graduatedColour.setPreferredSize(new Dimension(RADIO_WIDTH, 20));
+ graduatedColour.setOpaque(false);
graduatedColour.addItemListener(new ItemListener()
{
@Override
{
if (minColour.isEnabled())
{
- showColourChooser(minColour, "label.select_colour_minimum_value");
+ String ttl = MessageManager.getString("label.select_colour_minimum_value");
+ showColourChooser(minColour, ttl);
}
}
});
{
if (maxColour.isEnabled())
{
- showColourChooser(maxColour, "label.select_colour_maximum_value");
+ String ttl = MessageManager.getString("label.select_colour_maximum_value");
+ showColourChooser(maxColour, ttl);
}
}
});
*/
if (ap != null)
{
- ap.paintAlignment(true, true);
+ refreshDisplay(true);
}
}
});
simpleColour = new JRadioButton(
MessageManager.getString("label.simple_colour"));
simpleColour.setPreferredSize(new Dimension(RADIO_WIDTH, 20));
+ simpleColour.setOpaque(false);
simpleColour.addItemListener(new ItemListener()
{
@Override
{
if (simpleColour.isSelected())
{
- showColourChooser(singleColour, "label.select_colour");
+ String ttl = MessageManager.formatMessage("label.select_colour_for", featureType);
+ showColourChooser(singleColour, ttl);
}
}
});
byCategory = new JRadioButton(
MessageManager.getString("label.by_text_of") + COLON);
byCategory.setPreferredSize(new Dimension(RADIO_WIDTH, 20));
+ byCategory.setOpaque(false);
byCategory.addItemListener(new ItemListener()
{
@Override
return colourByPanel;
}
- private void showColourChooser(JPanel colourPanel, String key)
+ /**
+ * Shows a colour chooser dialog, and if a selection is made, updates the
+ * colour of the given panel
+ *
+ * @param colourPanel
+ * the panel whose background colour is being picked
+ * @param title
+ */
+ void showColourChooser(JPanel colourPanel, String title)
{
- Color col = JColorChooser.showDialog(this,
- MessageManager.getString(key), colourPanel.getBackground());
- if (col != null)
+ ColourChooserListener listener = new ColourChooserListener()
{
- colourPanel.setBackground(col);
- colourPanel.setForeground(col);
- }
- colourPanel.repaint();
- colourChanged(true);
+ @Override
+ public void colourSelected(Color col)
+ {
+ colourPanel.setBackground(col);
+ colourPanel.setForeground(col);
+ colourPanel.repaint();
+ colourChanged(true);
+ }
+ };
+ JalviewColourChooser.showColourChooser(this, title,
+ colourPanel.getBackground(), listener);
}
/**
* save the colour, and repaint stuff
*/
fr.setColour(featureType, acg);
- ap.paintAlignment(updateStructsAndOverview, updateStructsAndOverview);
+ refreshDisplay(updateStructsAndOverview);
- updateColoursTab();
+ updateColoursPanel();
}
/**
}
float minValue = min;
float maxValue = max;
- final int thresholdOption = threshold.getSelectedIndex();
+ int thresholdOption = threshold.getSelectedIndex();
if (thresholdIsMin.isSelected()
&& thresholdOption == ABOVE_THRESHOLD_OPTION)
{
{
fr.setColour(featureType, originalColour);
fr.setFeatureFilter(featureType, originalFilter);
- ap.paintAlignment(true, true);
+ refreshDisplay(true);
}
/**
andOrPanel.setBackground(Color.white);
andFilters = new JRadioButton(MessageManager.getString("label.and"));
orFilters = new JRadioButton(MessageManager.getString("label.or"));
+ andFilters.setOpaque(false);
+ orFilters.setOpaque(false);
ActionListener actionListener = new ActionListener()
{
@Override
* for adding a condition. This should be called after a filter has been
* removed, added or amended.
*/
- private void updateFiltersTab()
+ private void updateFiltersPanel()
{
/*
* clear the panel and list of filter conditions
{
orFilters.setSelected(true);
}
- featureFilters.getMatchers().forEach(matcher -> filters.add(matcher));
+ // avoid use of lambda expression to keep SwingJS happy
+ // featureFilters.getMatchers().forEach(item -> filters.add(item));
+ for (FeatureMatcherI matcher : featureFilters.getMatchers())
+ {
+ filters.add(matcher);
+ }
}
/*
if (!patternField.isEnabled()
|| (pattern != null && pattern.trim().length() > 0))
{
- JButton removeCondition = new JButton("\u2717"); // Dingbats cursive x
+ JButton removeCondition = new JButton("\u2717");
+ // Dingbats cursive x
+ removeCondition.setBorder(new EmptyBorder(0, 0, 0, 0));
+ removeCondition.setBackground(Color.WHITE);
+ removeCondition.setPreferredSize(new Dimension(23, 17));
removeCondition.setToolTipText(
MessageManager.getString("label.delete_condition"));
- removeCondition.setBorder(new EmptyBorder(0, 0, 0, 0));
removeCondition.addActionListener(new ActionListener()
{
@Override
* @param condCombo
* @param patternField
*/
- private void populateConditions(String attName, Condition cond,
+ void populateConditions(String attName, Condition cond,
JComboBox<Condition> condCombo, JTextField patternField)
{
Datatype type = FeatureAttributes.getInstance().getDatatype(featureType,
* (note this might now be an empty filter with no conditions)
*/
fr.setFeatureFilter(featureType, combined.isEmpty() ? null : combined);
- ap.paintAlignment(true, true);
+ refreshDisplay(true);
- updateFiltersTab();
+ updateFiltersPanel();
+ }
+
+ /**
+ * Repaints alignment, structure and overview (if shown). If there is a
+ * complementary view which is showing this view's features, then also
+ * repaints that.
+ *
+ * @param updateStructsAndOverview
+ */
+ void refreshDisplay(boolean updateStructsAndOverview)
+ {
+ ap.paintAlignment(true, updateStructsAndOverview);
+ AlignViewportI complement = ap.getAlignViewport().getCodingComplement();
+ if (complement != null && complement.isShowComplementFeatures())
+ {
+ AlignFrame af2 = Desktop.getAlignFrameFor(complement);
+ af2.alignPanel.paintAlignment(true, updateStructsAndOverview);
+ }
}
}