X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAlignFrame.java;h=83fb7c00207f05a4377eb83e39ef20ba5b5cc3a3;hb=43d326c3a7616aedecfce6f7980b3831ec25243a;hp=90b9f6a786ec1526a5f8faf1ec3ba1dc108efaac;hpb=7ba92fd0e87b8155e656cfb9562d024a2524086d;p=jalview.git diff --git a/src/jalview/gui/AlignFrame.java b/src/jalview/gui/AlignFrame.java index 90b9f6a..83fb7c0 100644 --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@ -32,9 +32,12 @@ import jalview.api.AlignViewControllerGuiI; import jalview.api.AlignViewControllerI; import jalview.api.AlignViewportI; import jalview.api.AlignmentViewPanel; +import jalview.api.FeatureSettingsControllerI; +import jalview.api.SplitContainerI; import jalview.api.ViewStyleI; import jalview.api.analysis.ScoreModelI; import jalview.bin.Cache; +import jalview.bin.Jalview; import jalview.commands.CommandI; import jalview.commands.EditCommand; import jalview.commands.EditCommand.Action; @@ -46,10 +49,12 @@ import jalview.commands.TrimRegionCommand; import jalview.datamodel.AlignedCodonFrame; import jalview.datamodel.Alignment; import jalview.datamodel.AlignmentAnnotation; +import jalview.datamodel.AlignmentExportData; import jalview.datamodel.AlignmentI; import jalview.datamodel.AlignmentOrder; import jalview.datamodel.AlignmentView; import jalview.datamodel.ColumnSelection; +import jalview.datamodel.HiddenSequences; import jalview.datamodel.PDBEntry; import jalview.datamodel.SeqCigar; import jalview.datamodel.Sequence; @@ -237,6 +242,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, this(al, hiddenColumns, width, height, null); } + /** * Create alignment frame for al with hiddenColumns, a specific width and * height, and specific sequenceId @@ -286,6 +292,28 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, init(); } + public AlignFrame(AlignmentI al, SequenceI[] hiddenSeqs, + ColumnSelection hiddenColumns, int width, int height) + { + setSize(width, height); + + if (al.getDataset() == null) + { + al.setDataset(null); + } + + viewport = new AlignViewport(al, hiddenColumns); + + if (hiddenSeqs != null && hiddenSeqs.length > 0) + { + viewport.hideSequence(hiddenSeqs); + } + alignPanel = new AlignmentPanel(this, viewport); + addAlignmentPanel(alignPanel, true); + init(); + } + + /** * Make a new AlignFrame from existing alignmentPanels * @@ -308,7 +336,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, */ void init() { - progressBar = new ProgressBar(this.statusPanel, this.statusBar); + if (!Jalview.isHeadlessMode()) + { + progressBar = new ProgressBar(this.statusPanel, this.statusBar); + } avc = new jalview.controller.AlignViewController(this, viewport, alignPanel); @@ -1095,11 +1126,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, .lastIndexOf(java.io.File.separatorChar) + 1); } - /* - * First save any linked Chimera session. - */ - Desktop.instance.saveChimeraSessions(file); - success = new Jalview2XML().saveAlignment(this, file, shortName); statusBar.setText(MessageManager.formatMessage( @@ -1113,37 +1139,25 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { warningMessage("Cannot save file " + fileName + " using format " + format, "Alignment output format not supported"); - saveAs_actionPerformed(null); - // JBPNote need to have a raise_gui flag here + if (!Jalview.isHeadlessMode()) + { + saveAs_actionPerformed(null); + } return false; } - String[] omitHidden = null; - - if (viewport.hasHiddenColumns()) + AlignmentExportData exportData = getAlignmentForExport(format, viewport); + if (exportData.getSettings().isCancelled()) { - int reply = JOptionPane - .showInternalConfirmDialog( - Desktop.desktop, - MessageManager - .getString("label.alignment_contains_hidden_columns"), - MessageManager - .getString("action.save_omit_hidden_columns"), - JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE); - - if (reply == JOptionPane.YES_OPTION) - { - omitHidden = viewport.getViewAsString(false); - } + return false; } - FeatureRenderer fr = new FeatureRenderer(this.alignPanel); - viewport.setFeatureRenderer(fr); - FormatAdapter f = new FormatAdapter(viewport); + FormatAdapter f = new FormatAdapter(alignPanel, + exportData.getSettings()); String output = f.formatSequences(format, - viewport.getAlignment(), // class cast exceptions will + exportData.getAlignment(), // class cast exceptions will // occur in the distant future - omitHidden, f.getCacheSuffixDefault(format), + exportData.getOmitHidden(), exportData.getStartEndPostions(), + f.getCacheSuffixDefault(format), viewport.getColumnSelection()); if (output == null) @@ -1184,6 +1198,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, return success; } + private void warningMessage(String warning, String title) { if (new jalview.util.Platform().isHeadless()) @@ -1208,35 +1223,22 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override protected void outputText_actionPerformed(ActionEvent e) { - String[] omitHidden = null; - FeatureRenderer fr = new FeatureRenderer(this.alignPanel); - viewport.setFeatureRenderer(fr); - if (viewport.hasHiddenColumns()) - { - int reply = JOptionPane - .showInternalConfirmDialog( - Desktop.desktop, - MessageManager - .getString("label.alignment_contains_hidden_columns"), - MessageManager - .getString("action.save_omit_hidden_columns"), - JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE); - if (reply == JOptionPane.YES_OPTION) - { - omitHidden = viewport.getViewAsString(false); - } + AlignmentExportData exportData = getAlignmentForExport( + e.getActionCommand(), viewport); + if (exportData.getSettings().isCancelled()) + { + return; } - CutAndPasteTransfer cap = new CutAndPasteTransfer(); cap.setForInput(null); - try { - cap.setText(new FormatAdapter(viewport).formatSequences( + cap.setText(new FormatAdapter(alignPanel, exportData.getSettings()) + .formatSequences( e.getActionCommand(), - viewport.getAlignment(), omitHidden, + exportData.getAlignment(), + exportData.getOmitHidden(), exportData.getStartEndPostions(), viewport.getColumnSelection())); Desktop.addInternalFrame(cap, MessageManager.formatMessage( "label.alignment_output_command", new Object[] @@ -1249,6 +1251,106 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } + public static AlignmentExportData getAlignmentForExport(String exportFomat, + AlignViewportI viewport) + { + AlignmentI alignmentToExport = null; + String[] omitHidden = null; + int[] alignmentStartEnd = new int[2]; + + HiddenSequences hiddenSeqs = viewport.getAlignment() + .getHiddenSequences(); + + + alignmentToExport = viewport.getAlignment(); + alignmentStartEnd = new int[] + { 0, alignmentToExport.getWidth() - 1 }; + + boolean hasHiddenSeqs = hiddenSeqs.getSize() > 0; + AlignExportSettings settings = new AlignExportSettings(hasHiddenSeqs, + viewport.hasHiddenColumns(), exportFomat); + settings.isExportAnnotations(); + + if (viewport.hasHiddenColumns() && !settings.isExportHiddenColumns()) + { + omitHidden = viewport.getViewAsString(false); + } + + if (hasHiddenSeqs && settings.isExportHiddenSequences()) + { + alignmentToExport = hiddenSeqs.getFullAlignment(); + } + else + { + alignmentToExport = viewport.getAlignment(); + alignmentStartEnd = getStartEnd(alignmentStartEnd, viewport + .getColumnSelection().getHiddenColumns()); + } + AlignmentExportData ed = new AlignmentExportData(alignmentToExport, omitHidden, alignmentStartEnd, + settings); + return ed; + } + + public static int[] getStartEnd(int[] aligmentStartEnd, + List hiddenCols) + { + int startPos = aligmentStartEnd[0]; + int endPos = aligmentStartEnd[1]; + + int[] lowestRange = new int[2]; + int[] higestRange = new int[2]; + + for (int[] hiddenCol : hiddenCols) + { + // System.out.println("comparing : " + hiddenCol[0] + "-" + hiddenCol[1]); + lowestRange = (hiddenCol[0] <= startPos) ? hiddenCol : lowestRange; + higestRange = (hiddenCol[1] >= endPos) ? hiddenCol : higestRange; + } + // System.out.println("min : " + lowestRange[0] + "-" + lowestRange[1]); + // System.out.println("max : " + higestRange[0] + "-" + higestRange[1]); + + if (lowestRange[0] == 0 && lowestRange[1] == 0) + { + startPos = aligmentStartEnd[0]; + } + else + { + startPos = lowestRange[1] + 1; + } + + if (higestRange[0] == 0 && higestRange[1] == 0) + { + endPos = aligmentStartEnd[1]; + } + else + { + endPos = higestRange[0]; + } + + // System.out.println("Export range : " + minPos + " - " + maxPos); + return new int[] + { startPos, endPos }; + } + + public static void main(String[] args) + { + ArrayList hiddenCols = new ArrayList(); + hiddenCols.add(new int[] + { 0, 4 }); + hiddenCols.add(new int[] + { 6, 9 }); + hiddenCols.add(new int[] + { 11, 12 }); + hiddenCols.add(new int[] + { 33, 33 }); + hiddenCols.add(new int[] + { 45, 50 }); + + int[] x = getStartEnd(new int[] + { 0, 50 }, hiddenCols); + // System.out.println("Export range : " + x[0] + " - " + x[1]); + } + /** * DOCUMENT ME! * @@ -1258,17 +1360,13 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override protected void htmlMenuItem_actionPerformed(ActionEvent e) { - // new HTMLOutput(alignPanel, - // alignPanel.getSeqPanel().seqCanvas.getSequenceRenderer(), - // alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer()); new HtmlSvgOutput(null, alignPanel); } @Override public void bioJSMenuItem_actionPerformed(ActionEvent e) { - BioJsHTMLOutput bjs = new BioJsHTMLOutput(alignPanel, - alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer()); + BioJsHTMLOutput bjs = new BioJsHTMLOutput(alignPanel); bjs.exportJalviewAlignmentAsBioJsHtmlFile(); } public void createImageMap(File file, String image) @@ -1399,6 +1497,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (closeAllTabs) { + /* + * this will raise an INTERNAL_FRAME_CLOSED event and this method will + * be called recursively, with the frame now in 'closed' state + */ this.setClosed(true); } } catch (Exception ex) @@ -1729,9 +1831,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, viewport.getSelectionGroup().getEndRes() + groupAdjustment); } + /* + * just extend the last slide command if compatible; but not if in + * SplitFrame mode (to ensure all edits are broadcast - JAL-1802) + */ boolean appendHistoryItem = false; Deque historyList = viewport.getHistoryList(); - if (historyList != null + boolean inSplitFrame = getSplitViewContainer() != null; + if (!inSplitFrame && historyList != null && historyList.size() > 0 && historyList.peek() instanceof SlideSequencesCommand) { @@ -1773,7 +1880,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } String output = new FormatAdapter().formatSequences("Fasta", seqs, - omitHidden); + omitHidden, null); StringSelection ss = new StringSelection(output); @@ -2646,12 +2753,17 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } /* - * Views share the same edits, undo and redo stacks, mappings. + * Views share the same edits undo and redo stacks */ newap.av.setHistoryList(viewport.getHistoryList()); newap.av.setRedoList(viewport.getRedoList()); - newap.av.getAlignment().setCodonFrames( - viewport.getAlignment().getCodonFrames()); + + /* + * Views share the same mappings; need to deregister any new mappings + * created by copyAlignPanel, and register the new reference to the shared + * mappings + */ + newap.av.replaceMappings(viewport.getAlignment()); newap.av.viewName = getNewViewName(viewTitle); @@ -4757,7 +4869,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, // temporary flag until SplitFrame is released boolean asSplitFrame = Cache.getDefault( - Preferences.ENABLE_SPLIT_FRAME, false); + Preferences.ENABLE_SPLIT_FRAME, true); if (asSplitFrame) { /* @@ -4865,10 +4977,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, "Exception during translation. Please report this !", ex); final String msg = MessageManager .getString("label.error_when_translating_sequences_submit_bug_report"); - final String title = MessageManager + final String errorTitle = MessageManager .getString("label.implementation_error") + MessageManager.getString("translation_failed"); - JOptionPane.showMessageDialog(Desktop.desktop, msg, title, + JOptionPane.showMessageDialog(Desktop.desktop, msg, errorTitle, JOptionPane.ERROR_MESSAGE); return; } @@ -4876,9 +4988,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { final String msg = MessageManager .getString("label.select_at_least_three_bases_in_at_least_one_sequence_to_cDNA_translation"); - final String title = MessageManager + final String errorTitle = MessageManager .getString("label.translation_failed"); - JOptionPane.showMessageDialog(Desktop.desktop, msg, title, + JOptionPane.showMessageDialog(Desktop.desktop, msg, errorTitle, JOptionPane.WARNING_MESSAGE); } else @@ -4889,11 +5001,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, "label.translation_of_params", new Object[] { this.getTitle() }); af.setTitle(newTitle); - if (Cache.getDefault(Preferences.ENABLE_SPLIT_FRAME, false)) + if (Cache.getDefault(Preferences.ENABLE_SPLIT_FRAME, true)) { final SequenceI[] seqs = viewport.getSelectionAsNewSequence(); - viewport.openSplitFrame(af, new Alignment(seqs), - al.getCodonFrames()); + viewport.openSplitFrame(af, new Alignment(seqs)); } else { @@ -5898,7 +6009,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, aa.visible = visible; } } - alignPanel.validateAnnotationDimensions(false); + alignPanel.validateAnnotationDimensions(true); alignPanel.alignmentChanged(); }