X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAnnotationChooser.java;h=791421dfeb32c0abb421f50a1e0f84f263dc4902;hb=5a313aa466ac046c5ab901eaa9e1d62518a50e69;hp=bb940e8e5544ba0f7fb0420acaca5ece8ed325f6;hpb=76d3286a73053be49a8cfd6842fffba4db111e08;p=jalview.git diff --git a/src/jalview/gui/AnnotationChooser.java b/src/jalview/gui/AnnotationChooser.java index bb940e8..791421d 100644 --- a/src/jalview/gui/AnnotationChooser.java +++ b/src/jalview/gui/AnnotationChooser.java @@ -1,3 +1,23 @@ +/* + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors + * + * This file is part of Jalview. + * + * 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 Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. + */ package jalview.gui; import jalview.datamodel.AlignmentAnnotation; @@ -21,7 +41,6 @@ import java.util.List; import java.util.Map; import javax.swing.JButton; -import javax.swing.JCheckBox; import javax.swing.JInternalFrame; import javax.swing.JLayeredPane; import javax.swing.JPanel; @@ -33,10 +52,12 @@ import javax.swing.JPanel; * @author gmcarstairs * */ +@SuppressWarnings("serial") public class AnnotationChooser extends JPanel { - private static final Font CHECKBOX_FONT = new Font("Serif", Font.BOLD, 12); + private static final Font CHECKBOX_FONT = new Font("Serif", Font.BOLD, + 12); private static final int MY_FRAME_WIDTH = 600; @@ -61,8 +82,8 @@ public class AnnotationChooser extends JPanel private boolean applyToUnselectedSequences; // currently selected 'annotation type' checkboxes - private Map selectedTypes = new HashMap(); - + private Map selectedTypes = new HashMap<>(); + /** * Constructor. * @@ -137,7 +158,7 @@ public class AnnotationChooser extends JPanel for (final String type : annotationTypes) { - final JCheckBox check = new JCheckBox(type); + final Checkbox check = new Checkbox(type); check.setFont(CHECKBOX_FONT); check.addItemListener(new ItemListener() { @@ -152,7 +173,7 @@ public class AnnotationChooser extends JPanel { AnnotationChooser.this.selectedTypes.remove(type); } - repaintAnnotations(false); + changeTypeSelected_actionPerformed(type); } }); jp.add(check); @@ -161,17 +182,70 @@ public class AnnotationChooser extends JPanel } /** - * Set visibility flags on annotation rows then repaint the alignment panel. + * Update display when scope (All/Selected sequences/Unselected) is changed. *

- * Optionally, update all rows, including those not in the 'apply to' scope. - * This makes more sense when switching between selected and unselected - * sequences. When selecting annotation types, or show/hide, we only apply the - * settings to the selected sequences. + * Set annotations (with one of the selected types) to the selected Show/Hide + * visibility, if they are in the new application scope. Set to the opposite + * if outside the scope. *

* Note this only affects sequence-specific annotations, others are left * unchanged. */ - protected void repaintAnnotations(boolean updateAllRows) + protected void changeApplyTo_actionPerformed() + { + setAnnotationVisibility(true); + + ap.updateAnnotation(); + } + + /** + * Update display when an annotation type is selected or deselected. + *

+ * If the type is selected, set visibility of annotations of that type which + * are in the application scope (all, selected or unselected sequences). + *

+ * If the type is unselected, set visibility to the opposite value. That is, + * treat select/deselect as a 'toggle' operation. + * + * @param type + */ + protected void changeTypeSelected_actionPerformed(String type) + { + boolean typeSelected = this.selectedTypes.containsKey(type); + for (AlignmentAnnotation aa : this.ap.getAlignment() + .getAlignmentAnnotation()) + { + if (aa.sequenceRef != null && type.equals(aa.label) + && isInActionScope(aa)) + { + aa.visible = typeSelected ? this.showSelected : !this.showSelected; + } + } + ap.updateAnnotation(); + } + + /** + * Update display on change of choice of Show or Hide + *

+ * For annotations of any selected type, set visibility of annotations of that + * type which are in the application scope (all, selected or unselected + * sequences). + * + * @param dataSourceType + */ + protected void changeShowHide_actionPerformed() + { + setAnnotationVisibility(false); + + ap.updateAnnotation(); + } + + /** + * Update visibility flags on annotation rows as per the current user choices. + * + * @param updateAllRows + */ + protected void setAnnotationVisibility(boolean updateAllRows) { for (AlignmentAnnotation aa : this.ap.getAlignment() .getAlignmentAnnotation()) @@ -181,27 +255,17 @@ public class AnnotationChooser extends JPanel setAnnotationVisibility(aa, updateAllRows); } } - // copied from AnnotationLabel.actionPerformed (after show/hide row)... - // TODO should drive this functionality into AlignmentPanel - ap.updateAnnotation(); - this.ap.annotationPanel.adjustPanelHeight(); - this.ap.alabels.setSize(this.ap.alabels.getSize().width, - this.ap.annotationPanel.getSize().height); - this.ap.validate(); - this.ap.paintAlignment(true); } /** * Determine and set the visibility of the given annotation from the currently * selected options. *

- * If its sequence is in the selected application scope - * (all/selected/unselected sequences), then we set its visibility. + * Only update annotations whose type is one of the selected types. *

- * If the annotation type is one of those currently selected by checkbox, set - * its visibility to the selected value. If it is not currently selected, set - * it to the opposite value. So, unselecting an annotation type with 'hide' - * selected, will cause those annotations to be unhidden. + * If its sequence is in the selected application scope + * (all/selected/unselected sequences), then we set its visibility according + * to the current choice of Show or Hide. *

* If force update of all rows is wanted, then set rows not in the sequence * selection scope to the opposite visibility to those in scope. @@ -212,22 +276,16 @@ public class AnnotationChooser extends JPanel protected void setAnnotationVisibility(AlignmentAnnotation aa, boolean updateAllRows) { - boolean setToVisible = false; if (this.selectedTypes.containsKey(aa.label)) { - setToVisible = this.showSelected; - } - else - { - setToVisible = !this.showSelected; - } - if (isInActionScope(aa)) - { - aa.visible = setToVisible; - } - else if (updateAllRows) - { - aa.visible = !setToVisible; + if (isInActionScope(aa)) + { + aa.visible = this.showSelected; + } + else if (updateAllRows) + { + aa.visible = !this.showSelected; + } } // TODO force not visible if associated sequence is hidden? // currently hiding a sequence does not hide its annotation rows @@ -252,6 +310,11 @@ public class AnnotationChooser extends JPanel // we don't care if the annotation's sequence is selected or not result = true; } + else if (this.sg == null) + { + // shouldn't happen - defensive programming + result = true; + } else if (this.sg.getSequences().contains(aa.sequenceRef)) { // annotation is for a member of the selection group @@ -279,8 +342,7 @@ public class AnnotationChooser extends JPanel public static List getAnnotationTypes(AlignmentI alignment, boolean sequenceSpecificOnly) { - // stub - List result = new ArrayList(); + List result = new ArrayList<>(); for (AlignmentAnnotation aa : alignment.getAlignmentAnnotation()) { if (!sequenceSpecificOnly || aa.sequenceRef != null) @@ -333,7 +395,7 @@ public class AnnotationChooser extends JPanel final boolean wholeAlignment = this.sg == null; JPanel applyToOptions = new JPanel(new FlowLayout(FlowLayout.LEFT)); CheckboxGroup actingOn = new CheckboxGroup(); - + String forAll = MessageManager.getString("label.all_sequences"); final Checkbox allSequences = new Checkbox(forAll, actingOn, wholeAlignment); @@ -342,15 +404,16 @@ public class AnnotationChooser extends JPanel @Override public void itemStateChanged(ItemEvent evt) { - if (evt.getStateChange() == ItemEvent.SELECTED) { + if (evt.getStateChange() == ItemEvent.SELECTED) + { AnnotationChooser.this.setApplyToSelectedSequences(true); AnnotationChooser.this.setApplyToUnselectedSequences(true); - AnnotationChooser.this.repaintAnnotations(true); + AnnotationChooser.this.changeApplyTo_actionPerformed(); } } }); applyToOptions.add(allSequences); - + String forSelected = MessageManager .getString("label.selected_sequences"); final Checkbox selectedSequences = new Checkbox(forSelected, actingOn, @@ -365,15 +428,16 @@ public class AnnotationChooser extends JPanel { AnnotationChooser.this.setApplyToSelectedSequences(true); AnnotationChooser.this.setApplyToUnselectedSequences(false); - AnnotationChooser.this.repaintAnnotations(true); + AnnotationChooser.this.changeApplyTo_actionPerformed(); } } }); applyToOptions.add(selectedSequences); - + String exceptSelected = MessageManager .getString("label.except_selected_sequences"); - final Checkbox unselectedSequences = new Checkbox(exceptSelected, actingOn, false); + final Checkbox unselectedSequences = new Checkbox(exceptSelected, + actingOn, false); unselectedSequences.setEnabled(!wholeAlignment); unselectedSequences.addItemListener(new ItemListener() { @@ -384,12 +448,12 @@ public class AnnotationChooser extends JPanel { AnnotationChooser.this.setApplyToSelectedSequences(false); AnnotationChooser.this.setApplyToUnselectedSequences(true); - AnnotationChooser.this.repaintAnnotations(true); + AnnotationChooser.this.changeApplyTo_actionPerformed(); } } }); applyToOptions.add(unselectedSequences); - + // set member variables to match the initial selection state this.applyToSelectedSequences = selectedSequences.getState() || allSequences.getState(); @@ -400,7 +464,7 @@ public class AnnotationChooser extends JPanel } /** - * Build a panel with radio buttons options to show or hide selected + * Build a panel with radio button options to show or hide selected * annotations. * * @return @@ -421,9 +485,10 @@ public class AnnotationChooser extends JPanel @Override public void itemStateChanged(ItemEvent evt) { - if (evt.getStateChange() == ItemEvent.SELECTED) { + if (evt.getStateChange() == ItemEvent.SELECTED) + { AnnotationChooser.this.setShowSelected(true); - AnnotationChooser.this.repaintAnnotations(false); + AnnotationChooser.this.changeShowHide_actionPerformed(); } } }); @@ -443,7 +508,7 @@ public class AnnotationChooser extends JPanel if (evt.getStateChange() == ItemEvent.SELECTED) { AnnotationChooser.this.setShowSelected(false); - AnnotationChooser.this.repaintAnnotations(false); + AnnotationChooser.this.changeShowHide_actionPerformed(); } } }); @@ -466,7 +531,7 @@ public class AnnotationChooser extends JPanel { JPanel jp = new JPanel(); final Font labelFont = JvSwingUtils.getLabelFont(); - + JButton ok = new JButton(MessageManager.getString("action.ok")); ok.setFont(labelFont); ok.addActionListener(new ActionListener() @@ -478,7 +543,7 @@ public class AnnotationChooser extends JPanel } }); jp.add(ok); - + JButton cancel = new JButton(MessageManager.getString("action.cancel")); cancel.setFont(labelFont); cancel.addActionListener(new ActionListener() @@ -561,4 +626,19 @@ public class AnnotationChooser extends JPanel this.applyToUnselectedSequences = applyToUnselectedSequences; } + protected boolean isShowSelected() + { + return showSelected; + } + + protected boolean isApplyToSelectedSequences() + { + return applyToSelectedSequences; + } + + protected boolean isApplyToUnselectedSequences() + { + return applyToUnselectedSequences; + } + }