X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAlignViewport.java;h=954cfcc64f880da7b1e412956c8f5fc3d8a29668;hb=6200addf078b7f7ace90597dc056dafc7fc602c1;hp=e0efa7ca91bc285e1ade8cefe8f3a17ceb141a0f;hpb=c00cfcb9f2223f1225fba57e5de85141cfa4570c;p=jalview.git diff --git a/src/jalview/gui/AlignViewport.java b/src/jalview/gui/AlignViewport.java index e0efa7c..954cfcc 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; @@ -46,10 +44,10 @@ import jalview.schemes.ColourSchemeI; import jalview.schemes.ColourSchemeProperty; import jalview.schemes.ResidueColourScheme; import jalview.schemes.UserColourScheme; -import jalview.structure.CommandListener; 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.ws.params.AutoCalcSetting; @@ -57,11 +55,12 @@ 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.Iterator; import java.util.List; -import java.util.Vector; import javax.swing.JInternalFrame; @@ -71,20 +70,18 @@ import javax.swing.JInternalFrame; * @author $author$ * @version $Revision: 1.141 $ */ -public class AlignViewport extends AlignmentViewport implements - SelectionSource, CommandListener +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 +102,7 @@ public class AlignViewport extends AlignmentViewport implements */ public AlignViewport(AlignmentI al) { - setAlignment(al); + super(al); init(); } @@ -123,20 +120,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) { - Cache.log.debug("Setting viewport's sequence set id : " - + sequenceSetID); + Cache.log.debug( + "Setting viewport's sequence set id : " + sequenceSetID); } if (Cache.log != null && Cache.log.isDebugEnabled() && viewId != null) { Cache.log.debug("Setting viewport's view id : " + viewId); } - setAlignment(al); init(); + } /** @@ -147,12 +145,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 +163,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 +179,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) { - Cache.log.debug("Setting viewport's sequence set id : " - + sequenceSetID); + Cache.log.debug( + "Setting viewport's sequence set id : " + sequenceSetID); } if (Cache.log != null && Cache.log.isDebugEnabled() && viewId != null) { Cache.log.debug("Setting viewport's view id : " + viewId); } - setAlignment(al); + if (hiddenColumns != null) { - colSel = hiddenColumns; + al.setHiddenColumns(hiddenColumns); } init(); } @@ -209,44 +208,46 @@ public class AlignViewport extends AlignmentViewport implements */ private void applyViewProperties() { - antiAlias = Cache.getDefault("ANTI_ALIAS", false); - - viewStyle.setShowJVSuffix(Cache.getDefault("SHOW_JVSUFFIX", true)); - setShowAnnotation(Cache.getDefault("SHOW_ANNOTATIONS", true)); - - setRightAlignIds(Cache.getDefault("RIGHT_ALIGN_IDS", false)); - setCentreColumnLabels(Cache.getDefault("CENTRE_COLUMN_LABELS", false)); - autoCalculateConsensus = Cache.getDefault("AUTO_CALC_CONSENSUS", true); - - setPadGaps(Cache.getDefault("PAD_GAPS", true)); - setShowNPFeats(Cache.getDefault("SHOW_NPFEATS_TOOLTIP", true)); - 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)); - 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)); + // BH! using final static strings here because we also use these in + // JS version startup api + // BH was false + antiAlias = Cache.getDefault(Preferences.ANTI_ALIAS, true); + + viewStyle.setShowJVSuffix( + Cache.getDefault(Preferences.SHOW_JVSUFFIX, true)); + setShowAnnotation(Cache.getDefault(Preferences.SHOW_ANNOTATIONS, true)); + + setRightAlignIds(Cache.getDefault(Preferences.RIGHT_ALIGN_IDS, false)); + setCentreColumnLabels(Cache.getDefault(Preferences.CENTRE_COLUMN_LABELS, false)); + autoCalculateConsensusAndConservation = Cache.getDefault(Preferences.AUTO_CALC_CONSENSUS, true); + + setPadGaps(Cache.getDefault(Preferences.PAD_GAPS, true)); + setShowNPFeats(Cache.getDefault(Preferences.SHOW_NPFEATS_TOOLTIP, true)); + setShowDBRefs(Cache.getDefault(Preferences.SHOW_DBREFS_TOOLTIP, true)); + viewStyle.setSeqNameItalics(Cache.getDefault(Preferences.ID_ITALICS, true)); + viewStyle.setWrapAlignment( + Cache.getDefault(Preferences.WRAP_ALIGNMENT, false)); + viewStyle.setShowUnconserved( + Cache.getDefault(Preferences.SHOW_UNCONSERVED, false)); + sortByTree = Cache.getDefault(Preferences.SORT_BY_TREE, false); + followSelection = Cache.getDefault(Preferences.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)); } void init() { - this.startRes = 0; - this.endRes = alignment.getWidth() - 1; - this.startSeq = 0; - this.endSeq = alignment.getHeight() - 1; applyViewProperties(); - String fontName = Cache.getDefault("FONT_NAME", "SansSerif"); - String fontStyle = Cache.getDefault("FONT_STYLE", Font.PLAIN + ""); - String fontSize = Cache.getDefault("FONT_SIZE", "10"); + String fontName = Cache.getDefault(Preferences.FONT_NAME, "SansSerif"); + String fontStyle = Cache.getDefault(Preferences.FONT_STYLE, + Font.PLAIN + ""); + String fontSize = Cache.getDefault(Preferences.FONT_SIZE, "10"); int style = 0; @@ -262,7 +263,8 @@ public class AlignViewport extends AlignmentViewport implements setFont(new Font(fontName, style, Integer.parseInt(fontSize)), true); alignment - .setGapCharacter(Cache.getDefault("GAP_SYMBOL", "-").charAt(0)); + .setGapCharacter(Cache.getDefault(Preferences.GAP_SYMBOL, "-") + .charAt(0)); // We must set conservation and consensus before setting colour, // as Blosum and Clustal require this to be done @@ -270,21 +272,28 @@ public class AlignViewport extends AlignmentViewport implements { if (!alignment.isNucleotide()) { - showConservation = Cache.getDefault("SHOW_CONSERVATION", true); - showQuality = Cache.getDefault("SHOW_QUALITY", true); - showGroupConservation = Cache.getDefault("SHOW_GROUP_CONSERVATION", - false); + showConservation = Cache.getDefault(Preferences.SHOW_CONSERVATION, + true); + showQuality = Cache.getDefault(Preferences.SHOW_QUALITY, true); + showGroupConservation = Cache + .getDefault(Preferences.SHOW_GROUP_CONSERVATION, false); } - showConsensusHistogram = Cache.getDefault("SHOW_CONSENSUS_HISTOGRAM", - true); - showSequenceLogo = Cache.getDefault("SHOW_CONSENSUS_LOGO", false); - normaliseSequenceLogo = Cache.getDefault("NORMALISE_CONSENSUS_LOGO", + showConsensusHistogram = Cache + .getDefault(Preferences.SHOW_CONSENSUS_HISTOGRAM, true); + showSequenceLogo = Cache.getDefault(Preferences.SHOW_CONSENSUS_LOGO, false); - showGroupConsensus = Cache.getDefault("SHOW_GROUP_CONSENSUS", false); - showConsensus = Cache.getDefault("SHOW_IDENTITY", true); + + normaliseSequenceLogo = Cache + .getDefault(Preferences.NORMALISE_CONSENSUS_LOGO, false); + showGroupConsensus = Cache + .getDefault(Preferences.SHOW_GROUP_CONSENSUS, false); + showConsensus = Cache.getDefault(Preferences.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) @@ -293,8 +302,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) @@ -308,66 +317,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); } @@ -428,9 +396,8 @@ public class AlignViewport extends AlignmentViewport implements */ if (align != null) { - StructureSelectionManager ssm = StructureSelectionManager - .getStructureSelectionManager(Desktop.instance); - ssm.registerMappings(align.getCodonFrames()); + Desktop.getStructureSelectionManager() + .registerMappings(align.getCodonFrames()); } /* @@ -450,8 +417,8 @@ public class AlignViewport extends AlignmentViewport implements List mappings = al.getCodonFrames(); if (mappings != null) { - StructureSelectionManager ssm = StructureSelectionManager - .getStructureSelectionManager(Desktop.instance); + StructureSelectionManager ssm = Desktop + .getStructureSelectionManager(); for (AlignedCodonFrame acf : mappings) { if (noReferencesTo(acf)) @@ -489,27 +456,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 @@ -517,10 +463,10 @@ public class AlignViewport extends AlignmentViewport implements * area * @return */ - public int[] getViewAsVisibleContigs(boolean selectedRegionOnly) + public Iterator getViewAsVisibleContigs(boolean selectedRegionOnly) { - int[] viscontigs = null; - int start = 0, end = 0; + int start = 0; + int end = 0; if (selectedRegionOnly && selectionGroup != null) { start = selectionGroup.getStartRes(); @@ -530,8 +476,8 @@ public class AlignViewport extends AlignmentViewport implements { end = alignment.getWidth(); } - viscontigs = colSel.getVisibleContigs(start, end); - return viscontigs; + return (alignment.getHiddenColumns().getVisContigsIterator(start, end, + false)); } /** @@ -597,10 +543,10 @@ public class AlignViewport extends AlignmentViewport implements @Override public void sendSelection() { - jalview.structure.StructureSelectionManager - .getStructureSelectionManager(Desktop.instance).sendSelection( - new SequenceGroup(getSelectionGroup()), - new ColumnSelection(getColumnSelection()), this); + Desktop.getStructureSelectionManager().sendSelection( + new SequenceGroup(getSelectionGroup()), + new ColumnSelection(getColumnSelection()), + new HiddenColumns(getAlignment().getHiddenColumns()), this); } /** @@ -613,8 +559,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) @@ -641,61 +587,7 @@ public class AlignViewport extends AlignmentViewport implements @Override public StructureSelectionManager getStructureSelectionManager() { - return StructureSelectionManager - .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()][]); + return Desktop.getStructureSelectionManager(); } @Override @@ -719,7 +611,7 @@ public class AlignViewport extends AlignmentViewport implements return validCharWidth; } - private Hashtable calcIdParams = new Hashtable(); + private Hashtable calcIdParams = new Hashtable<>(); public AutoCalcSetting getCalcIdSettingsFor(String calcId) { @@ -749,7 +641,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 @@ -824,16 +717,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 @@ -855,10 +752,16 @@ public class AlignViewport extends AlignmentViewport implements } } - setEndSeq(getAlignment().getHeight()); + ranges.setEndSeq(getAlignment().getHeight() - 1); // BH 2019.04.18 firePropertyChange("alignment", null, getAlignment().getSequences()); } + public final static int NO_SPLIT = 0; + + public final static int SPLIT_FRAME = 1; + + public final static int NEW_WINDOW = 2; + /** * Show a dialog with the option to open and link (cDNA <-> protein) as a new * alignment, either as a standalone alignment or in a split frame. Returns @@ -868,34 +771,69 @@ 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, + + /* + * 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.getDesktopPane()) + .setResponseHandler(NO_SPLIT, new Runnable() + { + @Override + public void run() + { + addDataToAlignment(al); + } + }).setResponseHandler(SPLIT_FRAME, new Runnable() + { + @Override + public void run() + { + openLinkedAlignmentAs(getAlignPanel().alignFrame, + new Alignment(getAlignment()), al, title, + SPLIT_FRAME); + } + }).setResponseHandler(NEW_WINDOW, new Runnable() + { + @Override + public void run() + { + openLinkedAlignmentAs(null, getAlignment(), al, title, + NEW_WINDOW); + } + }); + dialog.showDialog(question, MessageManager.getString("label.open_split_window"), JvOptionPane.DEFAULT_OPTION, JvOptionPane.PLAIN_MESSAGE, null, options, options[0]); + } - if (response != 1 && response != 2) - { - 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()) - : getAlignment(); + /** + * Open a split frame or a new window + * + * @param al + * @param title + * @param mode + * SPLIT_FRAME or NEW_WINDOW + */ + public static void openLinkedAlignmentAs(AlignFrame thisFrame, + AlignmentI thisAlignment, AlignmentI al, String title, int mode) + { + // BH: thisAlignment is already a copy if mode == SPLIT_FRAME + // Identify protein and dna alignments. Make a copy of this one if opening + // in a new split pane. + AlignmentI protein = al.isNucleotide() ? thisAlignment : al; - final AlignmentI cdna = al.isNucleotide() ? al : thisAlignment; + AlignmentI cdna = al.isNucleotide() ? al : thisAlignment; /* * Map sequences. At least one should get mapped as we have already passed @@ -913,8 +851,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. @@ -923,7 +862,7 @@ public class AlignViewport extends AlignmentViewport implements // alignFrame.setFileName(file, format); // } - if (openInNewWindow) + if (mode == NEW_WINDOW) { Desktop.addInternalFrame(newAlignFrame, title, AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT); @@ -931,19 +870,16 @@ public class AlignViewport extends AlignmentViewport implements try { - newAlignFrame.setMaximum(jalview.bin.Cache.getDefault( - "SHOW_FULLSCREEN", false)); + newAlignFrame.setMaximum(Cache.getDefault(Preferences.SHOW_FULLSCREEN, false)); } catch (java.beans.PropertyVetoException ex) { } - if (openSplitPane) + if (mode == SPLIT_FRAME) { al.alignAs(thisAlignment); - protein = openSplitFrame(newAlignFrame, thisAlignment); + openSplitFrame(thisFrame, newAlignFrame, thisAlignment); } - - return true; } /** @@ -956,17 +892,17 @@ public class AlignViewport extends AlignmentViewport implements * cdna/protein complement alignment to show in the other split half * @return the protein alignment in the split frame */ - protected AlignmentI openSplitFrame(AlignFrame newAlignFrame, - AlignmentI complement) + static protected AlignmentI openSplitFrame(AlignFrame thisFrame, + AlignFrame newAlignFrame, AlignmentI complement) { /* * Make a new frame with a copy of the alignment we are adding to. If this * 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); - copyMe.setTitle(getAlignPanel().alignFrame.getTitle()); + AlignFrame copyMe = new AlignFrame(complement, AlignFrame.DEFAULT_WIDTH, + AlignFrame.DEFAULT_HEIGHT); + copyMe.setTitle(thisFrame.getTitle()); AlignmentI al = newAlignFrame.viewport.getAlignment(); final AlignFrame proteinFrame = al.isNucleotide() ? copyMe @@ -1005,10 +941,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); } } @@ -1050,8 +985,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.setToScrollComplementPanel(true); } } @@ -1096,6 +1032,35 @@ 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; @@ -1103,12 +1068,24 @@ public class AlignViewport extends AlignmentViewport implements FeatureRenderer fr = getAlignPanel().getSeqPanel().seqCanvas .getFeatureRenderer(); + List origRenderOrder = new ArrayList<>(), + 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(); + if (!mergeOnly) + { + // only clear displayed features if we are merging 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 @@ -1117,6 +1094,16 @@ public class AlignViewport extends AlignmentViewport implements { FeatureColourI preferredColour = featureSettings .getFeatureColour(type); + FeatureColourI origColour = fr.getFeatureStyle(type); + if (!mergeOnly || (!origRenderOrder.contains(type) + || origColour == null + || (!origColour.isGraduatedColour() + && origColour.getColour() != null + && origColour.getColour().equals( + ColorUtils.createColourFromName(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); @@ -1126,13 +1113,19 @@ public class AlignViewport extends AlignmentViewport implements displayed.setVisible(type); } } + } /* * set visibility of feature groups */ 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)); + } } /* @@ -1149,4 +1142,13 @@ public class AlignViewport extends AlignmentViewport implements fr.setTransparency(featureSettings.getTransparency()); } + public String getViewName() + { + return viewName; + } + + public void setViewName(String viewName) + { + this.viewName = viewName; + } }