import jalview.structure.SelectionSource;
import jalview.structure.StructureSelectionManager;
import jalview.structure.VamsasSource;
+import jalview.util.ColorUtils;
import jalview.util.MessageManager;
-import jalview.util.dialogrunner.RunResponse;
import jalview.viewmodel.AlignmentViewport;
import jalview.ws.params.AutoCalcSetting;
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;
public class AlignViewport extends AlignmentViewport
implements SelectionSource
{
+
+ public final static int NO_SPLIT = 0;
+
+ public final static int SPLIT_FRAME = 1;
+
+ public final static int NEW_WINDOW = 2;
+
+
Font font;
boolean cursorMode = false;
boolean antiAlias = false;
- private Rectangle explodedGeometry;
+ private Rectangle explodedGeometry = null;
- private String viewName;
+ private String viewName = null;
/*
* Flag set true on the view that should 'gather' multiple views of the same
* @param hiddenColumns
* @param seqsetid
* (may be null)
- */
+f */
public AlignViewport(AlignmentI al, HiddenColumns hiddenColumns,
String seqsetid)
{
*/
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));
ResidueColourScheme.NONE);
}
ColourSchemeI colourScheme = ColourSchemeProperty
- .getColourScheme(alignment, schemeName);
+ .getColourScheme(this, alignment, schemeName);
residueShading = new ResidueShader(colourScheme);
if (colourScheme instanceof UserColourScheme)
{
residueShading.setConsensus(hconsensus);
}
+ setColourAppliesToAllGroups(true);
}
boolean validCharWidth;
}
}
- ranges.setEndSeq(getAlignment().getHeight());
+ ranges.setEndSeq(getAlignment().getHeight() - 1); // BH 2019.04.18
firePropertyChange("alignment", null, getAlignment().getSequences());
}
* in reverse order)
*/
JvOptionPane dialog = JvOptionPane.newOptionDialog(Desktop.desktop)
- .addResponse(0, new RunResponse(0)
+ .setResponseHandler(NO_SPLIT, new Runnable()
{
@Override
public void run()
{
addDataToAlignment(al);
}
- }).addResponse(1, new RunResponse(1)
+ }).setResponseHandler(SPLIT_FRAME, new Runnable()
{
@Override
public void run()
{
- us.openLinkedAlignmentAs(al, title, true);
+ openLinkedAlignmentAs(getAlignPanel().alignFrame,
+ new Alignment(getAlignment()), al, title,
+ SPLIT_FRAME);
+// us.openLinkedAlignmentAs(al, title, true);
}
- }).addResponse(2, new RunResponse(2)
+ }).setResponseHandler(NEW_WINDOW, new Runnable()
{
@Override
public void run()
{
- us.openLinkedAlignmentAs(al, title, false);
+ openLinkedAlignmentAs(null, getAlignment(), al, title,
+ NEW_WINDOW);
}
});
- dialog.showDialog(question,
+ dialog.showDialog(question,
MessageManager.getString("label.open_split_window"),
JvOptionPane.DEFAULT_OPTION, JvOptionPane.PLAIN_MESSAGE, null,
options, options[0]);
}
-
- protected void openLinkedAlignmentAs(AlignmentI al, String title,
- boolean newWindowOrSplitPane)
- {
+ /**
+ * 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)
+ {
/*
* Identify protein and dna alignments. Make a copy of this one if opening
* in a new split pane.
*/
- AlignmentI thisAlignment = newWindowOrSplitPane
- ? new Alignment(getAlignment())
- : getAlignment();
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
* the test for 'mappability'. Any mappings made will be added to the
// alignFrame.setFileName(file, format);
// }
- if (!newWindowOrSplitPane)
+ if (mode == NEW_WINDOW)
{
Desktop.addInternalFrame(newAlignFrame, title,
AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT);
{
}
- if (newWindowOrSplitPane)
+ if (mode == SPLIT_FRAME)
{
al.alignAs(thisAlignment);
- protein = openSplitFrame(newAlignFrame, thisAlignment);
+ openSplitFrame(thisFrame, newAlignFrame, thisAlignment);
}
}
* 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
*/
AlignFrame copyMe = new AlignFrame(complement, AlignFrame.DEFAULT_WIDTH,
AlignFrame.DEFAULT_HEIGHT);
- copyMe.setTitle(getAlignPanel().alignFrame.getTitle());
+ copyMe.setTitle(thisFrame.getTitle());
+
AlignmentI al = newAlignFrame.viewport.getAlignment();
final AlignFrame proteinFrame = al.isNucleotide() ? copyMe
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);
}
}
@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<String> 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<String> 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
{
FeatureColourI preferredColour = featureSettings
.getFeatureColour(type);
- if (preferredColour != null)
+ FeatureColourI origColour = fr.getFeatureStyle(type);
+ if (!mergeOnly || (!origRenderOrder.contains(type)
+ || origColour == null
+ || (!origColour.isGraduatedColour()
+ && origColour.getColour() != null
+ && origColour.getColour().equals(
+ ColorUtils.createColourFromName(type)))))
{
- fr.setColour(type, preferredColour);
- }
- if (featureSettings.isFeatureDisplayed(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);
+ }
}
}
*/
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));
+ }
}
/*