X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAlignViewport.java;h=ea0afe1b1f3f938473114946f952e28a523ef87f;hb=a1984b1c8c273ed33c7ce9283039f4027dcae2de;hp=56533400d3ed67d5cc617f0e9725cd6ca00bace4;hpb=fbbcbaf726e00adcae8a55d3342abffbe74b8b52;p=jalview.git diff --git a/src/jalview/gui/AlignViewport.java b/src/jalview/gui/AlignViewport.java index 5653340..ea0afe1 100644 --- a/src/jalview/gui/AlignViewport.java +++ b/src/jalview/gui/AlignViewport.java @@ -22,7 +22,6 @@ package jalview.gui; import jalview.analysis.AlignmentUtils; import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder; -import jalview.analysis.NJTree; import jalview.api.AlignViewportI; import jalview.api.AlignmentViewPanel; import jalview.api.FeatureColourI; @@ -35,10 +34,9 @@ import jalview.datamodel.AlignedCodonFrame; import jalview.datamodel.Alignment; import jalview.datamodel.AlignmentI; import jalview.datamodel.ColumnSelection; -import jalview.datamodel.PDBEntry; +import jalview.datamodel.HiddenColumns; import jalview.datamodel.SearchResults; import jalview.datamodel.SearchResultsI; -import jalview.datamodel.Sequence; import jalview.datamodel.SequenceGroup; import jalview.datamodel.SequenceI; import jalview.renderer.ResidueShader; @@ -49,19 +47,19 @@ import jalview.schemes.UserColourScheme; import jalview.structure.SelectionSource; import jalview.structure.StructureSelectionManager; import jalview.structure.VamsasSource; +import jalview.util.ColorUtils; import jalview.util.MessageManager; import jalview.viewmodel.AlignmentViewport; -import jalview.viewmodel.ViewportRanges; import jalview.ws.params.AutoCalcSetting; import java.awt.Container; import java.awt.Dimension; import java.awt.Font; +import java.awt.FontMetrics; import java.awt.Rectangle; import java.util.ArrayList; import java.util.Hashtable; import java.util.List; -import java.util.Vector; import javax.swing.JInternalFrame; @@ -71,20 +69,18 @@ import javax.swing.JInternalFrame; * @author $author$ * @version $Revision: 1.141 $ */ -public class AlignViewport extends AlignmentViewport implements - SelectionSource +public class AlignViewport extends AlignmentViewport + implements SelectionSource { Font font; - NJTree currentTree = null; - boolean cursorMode = false; boolean antiAlias = false; - private Rectangle explodedGeometry; + private Rectangle explodedGeometry = null; - String viewName; + private String viewName = null; /* * Flag set true on the view that should 'gather' multiple views of the same @@ -105,7 +101,7 @@ public class AlignViewport extends AlignmentViewport implements */ public AlignViewport(AlignmentI al) { - setAlignment(al); + super(al); init(); } @@ -123,20 +119,21 @@ public class AlignViewport extends AlignmentViewport implements public AlignViewport(AlignmentI al, String seqsetid, String viewid) { + super(al); sequenceSetID = seqsetid; viewId = viewid; // TODO remove these once 2.4.VAMSAS release finished - if (Cache.log != null && Cache.log.isDebugEnabled() && seqsetid != null) + if (seqsetid != null) { - Cache.log.debug("Setting viewport's sequence set id : " - + sequenceSetID); + Cache.debug( + "Setting viewport's sequence set id : " + sequenceSetID); } - if (Cache.log != null && Cache.log.isDebugEnabled() && viewId != null) + if (viewId != null) { - Cache.log.debug("Setting viewport's view id : " + viewId); + Cache.debug("Setting viewport's view id : " + viewId); } - setAlignment(al); init(); + } /** @@ -147,12 +144,12 @@ public class AlignViewport extends AlignmentViewport implements * @param hiddenColumns * ColumnSelection */ - public AlignViewport(AlignmentI al, ColumnSelection hiddenColumns) + public AlignViewport(AlignmentI al, HiddenColumns hiddenColumns) { - setAlignment(al); + super(al); if (hiddenColumns != null) { - colSel = hiddenColumns; + al.setHiddenColumns(hiddenColumns); } init(); } @@ -165,7 +162,7 @@ public class AlignViewport extends AlignmentViewport implements * @param seqsetid * (may be null) */ - public AlignViewport(AlignmentI al, ColumnSelection hiddenColumns, + public AlignViewport(AlignmentI al, HiddenColumns hiddenColumns, String seqsetid) { this(al, hiddenColumns, seqsetid, null); @@ -181,25 +178,26 @@ public class AlignViewport extends AlignmentViewport implements * @param viewid * (may be null) */ - public AlignViewport(AlignmentI al, ColumnSelection hiddenColumns, + public AlignViewport(AlignmentI al, HiddenColumns hiddenColumns, String seqsetid, String viewid) { + super(al); sequenceSetID = seqsetid; viewId = viewid; // TODO remove these once 2.4.VAMSAS release finished - if (Cache.log != null && Cache.log.isDebugEnabled() && seqsetid != null) + if (seqsetid != null) { - Cache.log.debug("Setting viewport's sequence set id : " - + sequenceSetID); + Cache.debug( + "Setting viewport's sequence set id : " + sequenceSetID); } - if (Cache.log != null && Cache.log.isDebugEnabled() && viewId != null) + if (viewId != null) { - Cache.log.debug("Setting viewport's view id : " + viewId); + Cache.debug("Setting viewport's view id : " + viewId); } - setAlignment(al); + if (hiddenColumns != null) { - colSel = hiddenColumns; + al.setHiddenColumns(hiddenColumns); } init(); } @@ -209,7 +207,7 @@ public class AlignViewport extends AlignmentViewport implements */ private void applyViewProperties() { - antiAlias = Cache.getDefault("ANTI_ALIAS", false); + antiAlias = Cache.getDefault("ANTI_ALIAS", true); viewStyle.setShowJVSuffix(Cache.getDefault("SHOW_JVSUFFIX", true)); setShowAnnotation(Cache.getDefault("SHOW_ANNOTATIONS", true)); @@ -223,22 +221,21 @@ public class AlignViewport extends AlignmentViewport implements setShowDBRefs(Cache.getDefault("SHOW_DBREFS_TOOLTIP", true)); viewStyle.setSeqNameItalics(Cache.getDefault("ID_ITALICS", true)); viewStyle.setWrapAlignment(Cache.getDefault("WRAP_ALIGNMENT", false)); - viewStyle.setShowUnconserved(Cache - .getDefault("SHOW_UNCONSERVED", false)); + viewStyle.setShowUnconserved( + Cache.getDefault("SHOW_UNCONSERVED", false)); sortByTree = Cache.getDefault("SORT_BY_TREE", false); followSelection = Cache.getDefault("FOLLOW_SELECTIONS", true); - sortAnnotationsBy = SequenceAnnotationOrder.valueOf(Cache.getDefault( - Preferences.SORT_ANNOTATIONS, - SequenceAnnotationOrder.NONE.name())); - showAutocalculatedAbove = Cache.getDefault( - Preferences.SHOW_AUTOCALC_ABOVE, false); - viewStyle.setScaleProteinAsCdna(Cache.getDefault( - Preferences.SCALE_PROTEIN_TO_CDNA, true)); + sortAnnotationsBy = SequenceAnnotationOrder + .valueOf(Cache.getDefault(Preferences.SORT_ANNOTATIONS, + SequenceAnnotationOrder.NONE.name())); + showAutocalculatedAbove = Cache + .getDefault(Preferences.SHOW_AUTOCALC_ABOVE, false); + viewStyle.setScaleProteinAsCdna( + Cache.getDefault(Preferences.SCALE_PROTEIN_TO_CDNA, true)); } void init() { - ranges = new ViewportRanges(this.alignment); applyViewProperties(); String fontName = Cache.getDefault("FONT_NAME", "SansSerif"); @@ -279,9 +276,12 @@ public class AlignViewport extends AlignmentViewport implements false); showGroupConsensus = Cache.getDefault("SHOW_GROUP_CONSENSUS", false); showConsensus = Cache.getDefault("SHOW_IDENTITY", true); + + showOccupancy = Cache.getDefault(Preferences.SHOW_OCCUPANCY, true); } initAutoAnnotation(); - String colourProperty = alignment.isNucleotide() ? Preferences.DEFAULT_COLOUR_NUC + String colourProperty = alignment.isNucleotide() + ? Preferences.DEFAULT_COLOUR_NUC : Preferences.DEFAULT_COLOUR_PROT; String schemeName = Cache.getProperty(colourProperty); if (schemeName == null) @@ -290,8 +290,8 @@ public class AlignViewport extends AlignmentViewport implements schemeName = Cache.getDefault(Preferences.DEFAULT_COLOUR, ResidueColourScheme.NONE); } - ColourSchemeI colourScheme = ColourSchemeProperty.getColourScheme( - alignment, schemeName); + ColourSchemeI colourScheme = ColourSchemeProperty + .getColourScheme(this, alignment, schemeName); residueShading = new ResidueShader(colourScheme); if (colourScheme instanceof UserColourScheme) @@ -305,66 +305,25 @@ public class AlignViewport extends AlignmentViewport implements { residueShading.setConsensus(hconsensus); } - } - - /** - * get the consensus sequence as displayed under the PID consensus annotation - * row. - * - * @return consensus sequence as a new sequence object - */ - public SequenceI getConsensusSeq() - { - if (consensus == null) - { - updateConsensus(null); - } - if (consensus == null) - { - return null; - } - StringBuffer seqs = new StringBuffer(); - for (int i = 0; i < consensus.annotations.length; i++) - { - if (consensus.annotations[i] != null) - { - if (consensus.annotations[i].description.charAt(0) == '[') - { - seqs.append(consensus.annotations[i].description.charAt(1)); - } - else - { - seqs.append(consensus.annotations[i].displayCharacter); - } - } - } - - SequenceI sq = new Sequence("Consensus", seqs.toString()); - sq.setDescription("Percentage Identity Consensus " - + ((ignoreGapsInConsensusCalculation) ? " without gaps" : "")); - return sq; + setColourAppliesToAllGroups(true); } boolean validCharWidth; /** - * update view settings with the given font. You may need to call - * alignPanel.fontChanged to update the layout geometry - * - * @param setGrid - * when true, charWidth/height is set according to font mentrics + * {@inheritDoc} */ + @Override public void setFont(Font f, boolean setGrid) { font = f; Container c = new Container(); - java.awt.FontMetrics fm = c.getFontMetrics(font); - int w = viewStyle.getCharWidth(), ww = fm.charWidth('M'), h = viewStyle - .getCharHeight(); if (setGrid) { + FontMetrics fm = c.getFontMetrics(font); + int ww = fm.charWidth('M'); setCharHeight(fm.getHeight()); setCharWidth(ww); } @@ -486,52 +445,6 @@ public class AlignViewport extends AlignmentViewport implements } /** - * DOCUMENT ME! - * - * @param tree - * DOCUMENT ME! - */ - public void setCurrentTree(NJTree tree) - { - currentTree = tree; - } - - /** - * DOCUMENT ME! - * - * @return DOCUMENT ME! - */ - public NJTree getCurrentTree() - { - return currentTree; - } - - /** - * returns the visible column regions of the alignment - * - * @param selectedRegionOnly - * true to just return the contigs intersecting with the selected - * area - * @return - */ - public int[] getViewAsVisibleContigs(boolean selectedRegionOnly) - { - int[] viscontigs = null; - int start = 0, end = 0; - if (selectedRegionOnly && selectionGroup != null) - { - start = selectionGroup.getStartRes(); - end = selectionGroup.getEndRes() + 1; - } - else - { - end = alignment.getWidth(); - } - viscontigs = colSel.getVisibleContigs(start, end); - return viscontigs; - } - - /** * get hash of undo and redo list for the alignment * * @return long[] { historyList.hashCode, redoList.hashCode }; @@ -595,9 +508,11 @@ public class AlignViewport extends AlignmentViewport implements public void sendSelection() { jalview.structure.StructureSelectionManager - .getStructureSelectionManager(Desktop.instance).sendSelection( - new SequenceGroup(getSelectionGroup()), - new ColumnSelection(getColumnSelection()), this); + .getStructureSelectionManager(Desktop.instance) + .sendSelection(new SequenceGroup(getSelectionGroup()), + new ColumnSelection(getColumnSelection()), + new HiddenColumns(getAlignment().getHiddenColumns()), + this); } /** @@ -610,8 +525,8 @@ public class AlignViewport extends AlignmentViewport implements */ public AlignmentPanel getAlignPanel() { - AlignmentPanel[] aps = PaintRefresher.getAssociatedPanels(this - .getSequenceSetId()); + AlignmentPanel[] aps = PaintRefresher + .getAssociatedPanels(this.getSequenceSetId()); for (int p = 0; aps != null && p < aps.length; p++) { if (aps[p].av == this) @@ -642,59 +557,6 @@ public class AlignViewport extends AlignmentViewport implements .getStructureSelectionManager(Desktop.instance); } - /** - * - * @param pdbEntries - * @return an array of SequenceI arrays, one for each PDBEntry, listing which - * sequences in the alignment hold a reference to it - */ - public SequenceI[][] collateForPDB(PDBEntry[] pdbEntries) - { - List seqvectors = new ArrayList(); - for (PDBEntry pdb : pdbEntries) - { - List choosenSeqs = new ArrayList(); - for (SequenceI sq : alignment.getSequences()) - { - Vector pdbRefEntries = sq.getDatasetSequence() - .getAllPDBEntries(); - if (pdbRefEntries == null) - { - continue; - } - for (PDBEntry pdbRefEntry : pdbRefEntries) - { - if (pdbRefEntry.getId().equals(pdb.getId())) - { - if (pdbRefEntry.getChainCode() != null - && pdb.getChainCode() != null) - { - if (pdbRefEntry.getChainCode().equalsIgnoreCase( - pdb.getChainCode()) - && !choosenSeqs.contains(sq)) - { - choosenSeqs.add(sq); - continue; - } - } - else - { - if (!choosenSeqs.contains(sq)) - { - choosenSeqs.add(sq); - continue; - } - } - - } - } - } - seqvectors - .add(choosenSeqs.toArray(new SequenceI[choosenSeqs.size()])); - } - return seqvectors.toArray(new SequenceI[seqvectors.size()][]); - } - @Override public boolean isNormaliseSequenceLogo() { @@ -716,7 +578,7 @@ public class AlignViewport extends AlignmentViewport implements return validCharWidth; } - private Hashtable calcIdParams = new Hashtable(); + private Hashtable calcIdParams = new Hashtable<>(); public AutoCalcSetting getCalcIdSettingsFor(String calcId) { @@ -732,7 +594,7 @@ public class AlignViewport extends AlignmentViewport implements // calculator.getRegisteredWorkersOfClass(settings.getWorkerClass()) if (needsUpdate) { - Cache.log.debug("trigger update for " + calcId); + Cache.debug("trigger update for " + calcId); } } @@ -746,7 +608,8 @@ public class AlignViewport extends AlignmentViewport implements *
    *
  • compute the equivalent edit on the mapped sequences
  • *
  • apply the mapped edit
  • - *
  • 'apply' the source edit to the working copy of the source sequences
  • + *
  • 'apply' the source edit to the working copy of the source + * sequences
  • *
* * @param command @@ -821,16 +684,20 @@ public class AlignViewport extends AlignmentViewport implements { if (AlignmentUtils.isMappable(toAdd, getAlignment())) { - if (openLinkedAlignment(toAdd, title)) - { - return; - } + openLinkedAlignment(toAdd, title); + return; } } + addDataToAlignment(toAdd); + } - /* - * No mappings, or offer declined - add sequences to this alignment - */ + /** + * adds sequences to this alignment + * + * @param toAdd + */ + void addDataToAlignment(AlignmentI toAdd) + { // TODO: JAL-407 regardless of above - identical sequences (based on ID and // provenance) should share the same dataset sequence @@ -852,7 +719,7 @@ public class AlignViewport extends AlignmentViewport implements } } - ranges.setEndSeq(getAlignment().getHeight()); + ranges.setEndSeq(getAlignment().getHeight() - 1); // BH 2019.04.18 firePropertyChange("alignment", null, getAlignment().getSequences()); } @@ -865,31 +732,58 @@ public class AlignViewport extends AlignmentViewport implements * @param al * @param title */ - protected boolean openLinkedAlignment(AlignmentI al, String title) + protected void openLinkedAlignment(AlignmentI al, String title) { - String[] options = new String[] { - MessageManager.getString("action.no"), + String[] options = new String[] { MessageManager.getString("action.no"), MessageManager.getString("label.split_window"), MessageManager.getString("label.new_window"), }; final String question = JvSwingUtils.wrapTooltip(true, MessageManager.getString("label.open_split_window?")); - int response = JvOptionPane.showOptionDialog(Desktop.desktop, question, + final AlignViewport us = this; + + /* + * options No, Split Window, New Window correspond to + * dialog responses 0, 1, 2 (even though JOptionPane shows them + * in reverse order) + */ + JvOptionPane dialog = JvOptionPane.newOptionDialog(Desktop.desktop) + .setResponseHandler(0, new Runnable() + { + @Override + public void run() + { + addDataToAlignment(al); + } + }).setResponseHandler(1, new Runnable() + { + @Override + public void run() + { + us.openLinkedAlignmentAs(al, title, true); + } + }).setResponseHandler(2, new Runnable() + { + @Override + public void run() + { + us.openLinkedAlignmentAs(al, title, false); + } + }); + dialog.showDialog(question, MessageManager.getString("label.open_split_window"), JvOptionPane.DEFAULT_OPTION, JvOptionPane.PLAIN_MESSAGE, null, options, options[0]); + } - if (response != 1 && response != 2) + protected void openLinkedAlignmentAs(AlignmentI al, String title, + boolean newWindowOrSplitPane) { - return false; - } - final boolean openSplitPane = (response == 1); - final boolean openInNewWindow = (response == 2); - /* * Identify protein and dna alignments. Make a copy of this one if opening * in a new split pane. */ - AlignmentI thisAlignment = openSplitPane ? new Alignment(getAlignment()) + AlignmentI thisAlignment = newWindowOrSplitPane + ? new Alignment(getAlignment()) : getAlignment(); AlignmentI protein = al.isNucleotide() ? thisAlignment : al; final AlignmentI cdna = al.isNucleotide() ? al : thisAlignment; @@ -910,8 +804,9 @@ public class AlignViewport extends AlignmentViewport implements AlignFrame newAlignFrame = new AlignFrame(al, AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT); newAlignFrame.setTitle(title); - newAlignFrame.statusBar.setText(MessageManager.formatMessage( - "label.successfully_loaded_file", new Object[] { title })); + newAlignFrame.setStatus(MessageManager + .formatMessage("label.successfully_loaded_file", new Object[] + { title })); // TODO if we want this (e.g. to enable reload of the alignment from file), // we will need to add parameters to the stack. @@ -920,7 +815,7 @@ public class AlignViewport extends AlignmentViewport implements // alignFrame.setFileName(file, format); // } - if (openInNewWindow) + if (!newWindowOrSplitPane) { Desktop.addInternalFrame(newAlignFrame, title, AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT); @@ -928,19 +823,17 @@ public class AlignViewport extends AlignmentViewport implements try { - newAlignFrame.setMaximum(jalview.bin.Cache.getDefault( - "SHOW_FULLSCREEN", false)); + newAlignFrame.setMaximum( + Cache.getDefault("SHOW_FULLSCREEN", false)); } catch (java.beans.PropertyVetoException ex) { } - if (openSplitPane) + if (newWindowOrSplitPane) { al.alignAs(thisAlignment); protein = openSplitFrame(newAlignFrame, thisAlignment); } - - return true; } /** @@ -961,8 +854,8 @@ public class AlignViewport extends AlignmentViewport implements * is protein, the mappings to cDNA will be registered with * StructureSelectionManager as a side-effect. */ - AlignFrame copyMe = new AlignFrame(complement, - AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT); + AlignFrame copyMe = new AlignFrame(complement, AlignFrame.DEFAULT_WIDTH, + AlignFrame.DEFAULT_HEIGHT); copyMe.setTitle(getAlignPanel().alignFrame.getTitle()); AlignmentI al = newAlignFrame.viewport.getAlignment(); @@ -1002,10 +895,9 @@ public class AlignViewport extends AlignmentViewport implements if (ap != null) { // modify GUI elements to reflect geometry change - Dimension idw = getAlignPanel().getIdPanel().getIdCanvas() - .getPreferredSize(); + Dimension idw = ap.getIdPanel().getIdCanvas().getPreferredSize(); idw.width = i; - getAlignPanel().getIdPanel().getIdCanvas().setPreferredSize(idw); + ap.getIdPanel().getIdCanvas().setPreferredSize(idw); } } @@ -1047,9 +939,9 @@ public class AlignViewport extends AlignmentViewport implements // TODO would like next line without cast but needs more refactoring... final AlignmentPanel complementPanel = ((AlignViewport) getCodingComplement()) .getAlignPanel(); - complementPanel.setDontScrollComplement(true); + complementPanel.setToScrollComplementPanel(false); complementPanel.scrollToCentre(sr, verticalOffset); - complementPanel.setDontScrollComplement(false); + complementPanel.setToScrollComplementPanel(true); } } @@ -1094,19 +986,60 @@ public class AlignViewport extends AlignmentViewport implements @Override public void applyFeaturesStyle(FeatureSettingsModelI featureSettings) { + transferFeaturesStyles(featureSettings, false); + } + + /** + * Applies the supplied feature settings descriptor to currently known features. + * This supports an 'initial configuration' of feature colouring based on a + * preset or user favourite. This may then be modified in the usual way using + * the Feature Settings dialogue. + * + * @param featureSettings + */ + @Override + public void mergeFeaturesStyle(FeatureSettingsModelI featureSettings) + { + transferFeaturesStyles(featureSettings, true); + } + + /** + * when mergeOnly is set, then group and feature visibility or feature colours + * are not modified for features and groups already known to the feature + * renderer. Feature ordering is always adjusted, and transparency is always set + * regardless. + * + * @param featureSettings + * @param mergeOnly + */ + private void transferFeaturesStyles(FeatureSettingsModelI featureSettings, + boolean mergeOnly) + { if (featureSettings == null) { return; } - + FeatureRenderer fr = getAlignPanel().getSeqPanel().seqCanvas .getFeatureRenderer(); + List origRenderOrder = new ArrayList<>(); + List origGroups = new ArrayList<>(); + // preserve original render order - allows differentiation between user configured colours and autogenerated ones + origRenderOrder.addAll(fr.getRenderOrder()); + origGroups.addAll(fr.getFeatureGroups()); + fr.findAllFeatures(true); List renderOrder = fr.getRenderOrder(); FeaturesDisplayedI displayed = fr.getFeaturesDisplayed(); - displayed.clear(); + if (!mergeOnly) + { + // only clear displayed features if we are mergeing + // displayed.clear(); + } // TODO this clears displayed.featuresRegistered - do we care? - + // + // JAL-3330 - JBP - yes we do - calling applyFeatureStyle to a view where + // feature visibility has already been configured is not very friendly /* * set feature colour if specified by feature settings * set visibility of all features @@ -1115,13 +1048,28 @@ public class AlignViewport extends AlignmentViewport implements { FeatureColourI preferredColour = featureSettings .getFeatureColour(type); - if (preferredColour != null) - { - fr.setColour(type, preferredColour); - } - if (featureSettings.isFeatureDisplayed(type)) + FeatureColourI origColour = fr.getFeatureStyle(type); + if (!mergeOnly || (!origRenderOrder.contains(type) + || origColour == null + || (!origColour.isGraduatedColour() + && origColour.getColour() != null + && origColour.getColour().equals( + ColorUtils.createColourFromName(type))))) { - displayed.setVisible(type); + // if we are merging, only update if there wasn't already a colour defined for + // this type + if (preferredColour != null) + { + fr.setColour(type, preferredColour); + } + if (featureSettings.isFeatureDisplayed(type)) + { + displayed.setVisible(type); + } + else if (featureSettings.isFeatureHidden(type)) + { + displayed.setHidden(type); + } } } @@ -1130,7 +1078,12 @@ public class AlignViewport extends AlignmentViewport implements */ for (String group : fr.getFeatureGroups()) { - fr.setGroupVisibility(group, featureSettings.isGroupDisplayed(group)); + if (!mergeOnly || !origGroups.contains(group)) + { + // when merging, display groups only if the aren't already marked as not visible + fr.setGroupVisibility(group, + featureSettings.isGroupDisplayed(group)); + } } /* @@ -1145,6 +1098,17 @@ public class AlignViewport extends AlignmentViewport implements fr.orderFeatures(featureSettings); } fr.setTransparency(featureSettings.getTransparency()); + + fr.notifyFeaturesChanged(); + } + + public String getViewName() + { + return viewName; } + public void setViewName(String viewName) + { + this.viewName = viewName; + } }