X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAlignFrame.java;h=3e24e67342a14e649d2c2cd900d8680c666fc5d1;hb=078d3939810e3be7d0ed9452df7db6b29e7b8e70;hp=9013416294550d8dbf359bfd96386fc5e3c72cc4;hpb=8dadf27423ca69874dc6a3c9d416974ba5ae767f;p=jalview.git diff --git a/src/jalview/gui/AlignFrame.java b/src/jalview/gui/AlignFrame.java index 9013416..3e24e67 100644 --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@ -21,6 +21,7 @@ package jalview.gui; import java.awt.BorderLayout; +import java.awt.Color; import java.awt.Component; import java.awt.Rectangle; import java.awt.Toolkit; @@ -56,18 +57,23 @@ import java.util.Deque; import java.util.Enumeration; import java.util.Hashtable; import java.util.List; +import java.util.Locale; import java.util.Vector; import javax.swing.ButtonGroup; import javax.swing.JCheckBoxMenuItem; +import javax.swing.JComponent; import javax.swing.JEditorPane; import javax.swing.JInternalFrame; +import javax.swing.JLabel; import javax.swing.JLayeredPane; import javax.swing.JMenu; import javax.swing.JMenuItem; +import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.SwingUtilities; +import ext.vamsas.ServiceHandle; import jalview.analysis.AlignmentSorter; import jalview.analysis.AlignmentUtils; import jalview.analysis.CrossRef; @@ -75,7 +81,7 @@ import jalview.analysis.Dna; import jalview.analysis.GeneticCodeI; import jalview.analysis.ParseProperties; import jalview.analysis.SequenceIdMatcher; -import jalview.api.AlignExportSettingI; +import jalview.api.AlignExportSettingsI; import jalview.api.AlignViewControllerGuiI; import jalview.api.AlignViewControllerI; import jalview.api.AlignViewportI; @@ -86,6 +92,7 @@ import jalview.api.SplitContainerI; import jalview.api.ViewStyleI; import jalview.api.analysis.SimilarityParamsI; import jalview.bin.Cache; +import jalview.bin.Console; import jalview.bin.Jalview; import jalview.commands.CommandI; import jalview.commands.EditCommand; @@ -95,6 +102,7 @@ import jalview.commands.RemoveGapColCommand; import jalview.commands.RemoveGapsCommand; import jalview.commands.SlideSequencesCommand; import jalview.commands.TrimRegionCommand; +import jalview.datamodel.AlignExportSettingsAdapter; import jalview.datamodel.AlignedCodonFrame; import jalview.datamodel.Alignment; import jalview.datamodel.AlignmentAnnotation; @@ -103,8 +111,8 @@ import jalview.datamodel.AlignmentI; import jalview.datamodel.AlignmentOrder; import jalview.datamodel.AlignmentView; import jalview.datamodel.ColumnSelection; +import jalview.datamodel.ContactMatrixI; import jalview.datamodel.HiddenColumns; -import jalview.datamodel.HiddenSequences; import jalview.datamodel.PDBEntry; import jalview.datamodel.SeqCigar; import jalview.datamodel.Sequence; @@ -132,15 +140,19 @@ import jalview.io.JnetAnnotationMaker; import jalview.io.NewickFile; import jalview.io.ScoreMatrixFile; import jalview.io.TCoffeeScoreFile; +import jalview.io.exceptions.ImageOutputException; import jalview.io.vcf.VCFLoader; import jalview.jbgui.GAlignFrame; +import jalview.project.Jalview2XML; import jalview.schemes.ColourSchemeI; import jalview.schemes.ColourSchemes; import jalview.schemes.ResidueColourScheme; import jalview.schemes.TCoffeeColourScheme; import jalview.util.HttpUtils; +import jalview.util.ImageMaker.TYPE; import jalview.util.MessageManager; import jalview.util.Platform; +import jalview.util.imagemaker.BitmapImageSizing; import jalview.viewmodel.AlignmentViewport; import jalview.viewmodel.ViewportRanges; import jalview.ws.DBRefFetcher; @@ -156,6 +168,7 @@ import jalview.ws.seqfetcher.DbSourceProxy; * @author $author$ * @version $Revision$ */ +@SuppressWarnings("serial") public class AlignFrame extends GAlignFrame implements DropTargetListener, IProgressIndicator, AlignViewControllerGuiI, ColourChangeListener { @@ -185,6 +198,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, */ String fileName = null; + File fileObject; + /** * Creates a new AlignFrame object with specific width and height. * @@ -337,6 +352,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, */ void init() { + setFrameIcon(null); + + // setBackground(Color.white); // BH 2019 + if (!Jalview.isHeadlessMode()) { progressBar = new ProgressBar(this.statusPanel, this.statusBar); @@ -354,8 +373,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, // modifyPID.setEnabled(false); } - String sortby = jalview.bin.Cache.getDefault("SORT_ALIGNMENT", - "No sort"); + String sortby = Cache.getDefault("SORT_ALIGNMENT", "No sort"); if (sortby.equals("Id")) { @@ -385,7 +403,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (Desktop.desktop != null) { this.setDropTarget(new java.awt.dnd.DropTarget(this, this)); - addServiceListeners(); + if (!Platform.isJS()) + { + addServiceListeners(); + } setGUINucleotide(); } @@ -394,14 +415,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, wrapMenuItem_actionPerformed(null); } - if (jalview.bin.Cache.getDefault("SHOW_OVERVIEW", false)) + if (Cache.getDefault("SHOW_OVERVIEW", false)) { this.overviewMenuItem_actionPerformed(null); } addKeyListener(); - final List selviews = new ArrayList<>(); + final List selviews = new ArrayList<>(); final List origview = new ArrayList<>(); final String menuLabel = MessageManager .getString("label.copy_format_from"); @@ -469,10 +490,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } } }); - if (Cache.getDefault("VERSION", "DEVELOPMENT").toLowerCase() + if (Cache.getDefault("VERSION", "DEVELOPMENT").toLowerCase(Locale.ROOT) .indexOf("devel") > -1 - || Cache.getDefault("VERSION", "DEVELOPMENT").toLowerCase() - .indexOf("test") > -1) + || Cache.getDefault("VERSION", "DEVELOPMENT") + .toLowerCase(Locale.ROOT).indexOf("test") > -1) { formatMenu.add(vsel); } @@ -504,6 +525,17 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } /** + * JavaScript will have this, maybe others. More dependable than a file name + * and maintains a reference to the actual bytes loaded. + * + * @param file + */ + public void setFileObject(File file) + { + this.fileObject = file; + } + + /** * Add a KeyListener with handlers for various KeyPressed and KeyReleased * events */ @@ -539,8 +571,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } if (viewport.cursorMode) { - alignPanel.getSeqPanel().moveCursor(0, 1, - evt.isShiftDown() && !evt.isAltDown()); + alignPanel.getSeqPanel().moveCursor(0, 1, evt.isShiftDown()); } break; @@ -551,9 +582,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } if (viewport.cursorMode) { - alignPanel.getSeqPanel().moveCursor(0, -1, - evt.isShiftDown() && !evt.isAltDown()); + alignPanel.getSeqPanel().moveCursor(0, -1, evt.isShiftDown()); } + break; case KeyEvent.VK_LEFT: @@ -603,7 +634,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, case KeyEvent.VK_BACK_SPACE: if (!viewport.cursorMode) { - cut_actionPerformed(null); + cut_actionPerformed(); } else { @@ -655,7 +686,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, case KeyEvent.VK_F2: viewport.cursorMode = !viewport.cursorMode; - statusBar.setText(MessageManager + setStatus(MessageManager .formatMessage("label.keyboard_editing_mode", new String[] { (viewport.cursorMode ? "on" : "off") })); if (viewport.cursorMode) @@ -826,7 +857,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, Desktop.instance.removeJalviewPropertyChangeListener("services", thisListener); closeMenuItem_actionPerformed(true); - }; + } }); // Finally, build the menu once to get current service state new Thread(new Runnable() @@ -951,14 +982,16 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void setProgressBar(String message, long id) { - progressBar.setProgressBar(message, id); + if (!Platform.isHeadless() && progressBar != null) + progressBar.setProgressBar(message, id); } @Override public void registerHandler(final long id, final IProgressIndicatorHandler handler) { - progressBar.registerHandler(id, handler); + if (progressBar != null) + progressBar.registerHandler(id, handler); } /** @@ -968,7 +1001,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public boolean operationInProgress() { - return progressBar.operationInProgress(); + return progressBar == null ? false : progressBar.operationInProgress(); } /** @@ -987,7 +1020,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, */ public String getVersion() { - return jalview.bin.Cache.getProperty("VERSION"); + return Cache.getProperty("VERSION"); } public FeatureRenderer getFeatureRenderer() @@ -996,9 +1029,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } @Override - public void fetchSequence_actionPerformed(ActionEvent e) + public void fetchSequence_actionPerformed() { - new jalview.gui.SequenceFetcher(this); + new SequenceFetcher(this); } @Override @@ -1048,11 +1081,22 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, Rectangle bounds = this.getBounds(); FileLoader loader = new FileLoader(); - DataSourceType protocol = HttpUtils.startsWithHttpOrHttps(fileName) - ? DataSourceType.URL - : DataSourceType.FILE; - AlignFrame newframe = loader.LoadFileWaitTillLoaded(fileName, - protocol, currentFileFormat); + + AlignFrame newframe = null; + + if (fileObject == null) + { + + DataSourceType protocol = HttpUtils.startsWithHttpOrHttps( + fileName) ? DataSourceType.URL : DataSourceType.FILE; + newframe = loader.LoadFileWaitTillLoaded(fileName, protocol, + currentFileFormat); + } + else + { + newframe = loader.LoadFileWaitTillLoaded(fileObject, + DataSourceType.FILE, currentFileFormat); + } newframe.setBounds(bounds); if (featureSettings != null && featureSettings.isShowing()) @@ -1097,7 +1141,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (fileName == null || (currentFileFormat == null) || HttpUtils.startsWithHttpOrHttps(fileName)) { - saveAs_actionPerformed(null); + saveAs_actionPerformed(); } else { @@ -1106,13 +1150,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } /** - * DOCUMENT ME! - * - * @param e - * DOCUMENT ME! + * Saves the alignment to a file with a name chosen by the user, if necessary + * warning if a file would be overwritten */ @Override - public void saveAs_actionPerformed(ActionEvent e) + public void saveAs_actionPerformed() { String format = currentFileFormat == null ? null : currentFileFormat.getName(); @@ -1126,159 +1168,281 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, int value = chooser.showSaveDialog(this); - if (value == JalviewFileChooser.APPROVE_OPTION) + if (value != JalviewFileChooser.APPROVE_OPTION) { + return; + } + currentFileFormat = chooser.getSelectedFormat(); + // todo is this (2005) test now obsolete - value is never null? + while (currentFileFormat == null) + { + JvOptionPane.showInternalMessageDialog(Desktop.desktop, + MessageManager + .getString("label.select_file_format_before_saving"), + MessageManager.getString("label.file_format_not_specified"), + JvOptionPane.WARNING_MESSAGE); currentFileFormat = chooser.getSelectedFormat(); - while (currentFileFormat == null) + value = chooser.showSaveDialog(this); + if (value != JalviewFileChooser.APPROVE_OPTION) { - JvOptionPane.showInternalMessageDialog(Desktop.desktop, - MessageManager.getString( - "label.select_file_format_before_saving"), - MessageManager.getString("label.file_format_not_specified"), - JvOptionPane.WARNING_MESSAGE); - currentFileFormat = chooser.getSelectedFormat(); - value = chooser.showSaveDialog(this); - if (value != JalviewFileChooser.APPROVE_OPTION) - { - return; - } + return; } + } - fileName = chooser.getSelectedFile().getPath(); + fileName = chooser.getSelectedFile().getPath(); - Cache.setProperty("DEFAULT_FILE_FORMAT", currentFileFormat.getName()); + Cache.setProperty("DEFAULT_FILE_FORMAT", currentFileFormat.getName()); + Cache.setProperty("LAST_DIRECTORY", fileName); + saveAlignment(fileName, currentFileFormat); + } - Cache.setProperty("LAST_DIRECTORY", fileName); - saveAlignment(fileName, currentFileFormat); + boolean lastSaveSuccessful = false; + + FileFormatI lastFormatSaved; + + String lastFilenameSaved; + + /** + * Raise a dialog or status message for the last call to saveAlignment. + * + * @return true if last call to saveAlignment(file, format) was successful. + */ + public boolean isSaveAlignmentSuccessful() + { + + if (!lastSaveSuccessful) + { + if (!Platform.isHeadless()) + { + JvOptionPane.showInternalMessageDialog(this, MessageManager + .formatMessage("label.couldnt_save_file", new Object[] + { lastFilenameSaved }), + MessageManager.getString("label.error_saving_file"), + JvOptionPane.WARNING_MESSAGE); + } + else + { + Console.error(MessageManager + .formatMessage("label.couldnt_save_file", new Object[] + { lastFilenameSaved })); + } } + else + { + + setStatus(MessageManager.formatMessage( + "label.successfully_saved_to_file_in_format", new Object[] + { lastFilenameSaved, lastFormatSaved })); + + } + return lastSaveSuccessful; } - public boolean saveAlignment(String file, FileFormatI format) + /** + * Saves the alignment to the specified file path, in the specified format, + * which may be an alignment format, or Jalview project format. If the + * alignment has hidden regions, or the format is one capable of including + * non-sequence data (features, annotations, groups), then the user may be + * prompted to specify what to include in the output. + * + * @param file + * @param format + */ + public void saveAlignment(String file, FileFormatI format) { - boolean success = true; + lastSaveSuccessful = true; + lastFilenameSaved = file; + lastFormatSaved = format; if (FileFormat.Jalview.equals(format)) { String shortName = title; - - if (shortName.indexOf(java.io.File.separatorChar) > -1) + if (shortName.indexOf(File.separatorChar) > -1) { - shortName = shortName.substring( - shortName.lastIndexOf(java.io.File.separatorChar) + 1); + shortName = shortName + .substring(shortName.lastIndexOf(File.separatorChar) + 1); } - - success = new jalview.project.Jalview2XML().saveAlignment(this, file, + lastSaveSuccessful = new Jalview2XML().saveAlignment(this, file, shortName); + Console.debug("lastSaveSuccessful=" + lastSaveSuccessful); + if (lastSaveSuccessful) + { + this.getViewport().setSavedUpToDate(true); + } + statusBar.setText(MessageManager.formatMessage( "label.successfully_saved_to_file_in_format", new Object[] { file, format })); + return; } - else - { - AlignmentExportData exportData = getAlignmentForExport(format, - viewport, null); - if (exportData.getSettings().isCancelled()) - { - return false; - } - FormatAdapter f = new FormatAdapter(alignPanel, - exportData.getSettings()); - String output = f.formatSequences(format, exportData.getAlignment(), // class - // cast - // exceptions - // will - // occur in the distant future - exportData.getOmitHidden(), exportData.getStartEndPostions(), - f.getCacheSuffixDefault(format), - viewport.getAlignment().getHiddenColumns()); + AlignExportSettingsI options = new AlignExportSettingsAdapter(false); + Runnable cancelAction = () -> { + lastSaveSuccessful = false; + }; + Runnable outputAction = () -> { + // todo defer this to inside formatSequences (or later) + AlignmentExportData exportData = viewport.getAlignExportData(options); + String output = new FormatAdapter(alignPanel, options) + .formatSequences(format, exportData.getAlignment(), + exportData.getOmitHidden(), + exportData.getStartEndPostions(), + viewport.getAlignment().getHiddenColumns()); if (output == null) { - success = false; + lastSaveSuccessful = false; } else { // create backupfiles object and get new temp filename destination - Cache.log.trace("ALIGNFRAME making backupfiles object for " + file); - BackupFiles backupfiles = new BackupFiles(file); - + boolean doBackup = BackupFiles.getEnabled(); + BackupFiles backupfiles = null; + if (doBackup) + { + Console.trace("ALIGNFRAME making backupfiles object for " + file); + backupfiles = new BackupFiles(file); + } try { - String tempFilePath = backupfiles.getTempFilePath(); - Cache.log.trace( - "ALIGNFRAME setting PrintWriter to " + tempFilePath); + String tempFilePath = doBackup ? backupfiles.getTempFilePath() + : file; + Console.trace("ALIGNFRAME setting PrintWriter"); PrintWriter out = new PrintWriter(new FileWriter(tempFilePath)); - Cache.log.trace( - "ALIGNFRAME about to write to temp file " + tempFilePath); + if (backupfiles != null) + { + Console.trace("ALIGNFRAME about to write to temp file " + + backupfiles.getTempFilePath()); + } out.print(output); - Cache.log.trace("ALIGNFRAME about to close file"); + Console.trace("ALIGNFRAME about to close file"); out.close(); - Cache.log.trace("ALIGNFRAME closed file"); - this.setTitle(file); + Console.trace("ALIGNFRAME closed file"); + AlignFrame.this.setTitle(file); statusBar.setText(MessageManager.formatMessage( "label.successfully_saved_to_file_in_format", new Object[] - { file, format.getName() })); + { fileName, format.getName() })); + lastSaveSuccessful = true; } catch (IOException e) { - success = false; - Cache.log.error( + lastSaveSuccessful = false; + Console.error( "ALIGNFRAME Something happened writing the temp file"); - Cache.log.error(e.getMessage()); - Cache.log.debug(Cache.getStackTraceString(e)); - + Console.error(e.getMessage()); + Console.debug(Cache.getStackTraceString(e)); } catch (Exception ex) { - success = false; - Cache.log.error( + lastSaveSuccessful = false; + Console.error( "ALIGNFRAME Something unexpected happened writing the temp file"); - Cache.log.error(ex.getMessage()); - Cache.log.debug(Cache.getStackTraceString(ex)); + Console.error(ex.getMessage()); + Console.debug(Cache.getStackTraceString(ex)); } - backupfiles.setWriteSuccess(success); - Cache.log.debug("ALIGNFRAME writing temp file was " - + (success ? "" : "NOT ") + "successful"); - // do the backup file roll and rename the temp file to actual file - Cache.log.trace("ALIGNFRAME about to rollBackupsAndRenameTempFile"); - success = backupfiles.rollBackupsAndRenameTempFile(); - Cache.log.debug("ALIGNFRAME performed rollBackupsAndRenameTempFile " - + (success ? "" : "un") + "successfully"); + if (doBackup) + { + backupfiles.setWriteSuccess(lastSaveSuccessful); + Console.debug("ALIGNFRAME writing temp file was " + + (lastSaveSuccessful ? "" : "NOT ") + "successful"); + // do the backup file roll and rename the temp file to actual file + Console.trace("ALIGNFRAME about to rollBackupsAndRenameTempFile"); + lastSaveSuccessful = backupfiles.rollBackupsAndRenameTempFile(); + Console.debug("ALIGNFRAME performed rollBackupsAndRenameTempFile " + + (lastSaveSuccessful ? "" : "un") + "successfully"); + } + Console.debug("lastSaveSuccessful=" + lastSaveSuccessful); + if (lastSaveSuccessful) + { + AlignFrame.this.getViewport().setSavedUpToDate(true); + } } - } + }; - if (!success) + /* + * show dialog with export options if applicable; else just do it + */ + if (AlignExportOptions.isNeeded(viewport, format)) { - if (!Platform.isHeadless()) + AlignExportOptions choices = new AlignExportOptions( + alignPanel.getAlignViewport(), format, options); + choices.setResponseAction(0, outputAction); + choices.setResponseAction(1, cancelAction); + choices.showDialog(); + } + else + { + try { - JvOptionPane.showInternalMessageDialog(this, MessageManager - .formatMessage("label.couldnt_save_file", new Object[] - { file }), - MessageManager.getString("label.error_saving_file"), - JvOptionPane.WARNING_MESSAGE); + outputAction.run(); + } catch (Exception e) + { + // TODO Auto-generated catch block + e.printStackTrace(); } } - - return success; } - private void warningMessage(String warning, String title) + /** + * Outputs the alignment to textbox in the requested format, if necessary + * first prompting the user for whether to include hidden regions or + * non-sequence data + * + * @param fileFormatName + */ + @Override + protected void outputText_actionPerformed(String fileFormatName) { - if (new jalview.util.Platform().isHeadless()) - { - System.err.println("Warning: " + title + "\nWarning: " + warning); + FileFormatI fileFormat = FileFormats.getInstance() + .forName(fileFormatName); + AlignExportSettingsI options = new AlignExportSettingsAdapter(false); + Runnable outputAction = () -> { + // todo defer this to inside formatSequences (or later) + AlignmentExportData exportData = viewport.getAlignExportData(options); + CutAndPasteTransfer cap = new CutAndPasteTransfer(); + cap.setForInput(null); + try + { + FileFormatI format = fileFormat; + cap.setText(new FormatAdapter(alignPanel, options).formatSequences( + format, exportData.getAlignment(), + exportData.getOmitHidden(), + exportData.getStartEndPostions(), + viewport.getAlignment().getHiddenColumns())); + Desktop.addInternalFrame(cap, MessageManager.formatMessage( + "label.alignment_output_command", new Object[] + { fileFormat.getName() }), 600, 500); + } catch (OutOfMemoryError oom) + { + new OOMWarning("Outputting alignment as " + fileFormat.getName(), + oom); + cap.dispose(); + } + }; + /* + * show dialog with export options if applicable; else just do it + */ + if (AlignExportOptions.isNeeded(viewport, fileFormat)) + { + AlignExportOptions choices = new AlignExportOptions( + alignPanel.getAlignViewport(), fileFormat, options); + choices.setResponseAction(0, outputAction); + choices.showDialog(); } else { - JvOptionPane.showInternalMessageDialog(this, warning, title, - JvOptionPane.WARNING_MESSAGE); + try + { + outputAction.run(); + } catch (Exception e) + { + e.printStackTrace(); + } } - return; } /** @@ -1288,134 +1452,127 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! */ @Override - protected void outputText_actionPerformed(ActionEvent e) + protected void htmlMenuItem_actionPerformed(ActionEvent e) { - FileFormatI fileFormat = FileFormats.getInstance() - .forName(e.getActionCommand()); - AlignmentExportData exportData = getAlignmentForExport(fileFormat, - viewport, null); - if (exportData.getSettings().isCancelled()) + HtmlSvgOutput htmlSVG = new HtmlSvgOutput(alignPanel); + try { - return; + htmlSVG.exportHTML(null); + } catch (ImageOutputException x) + { + // report problem to console and raise dialog } - CutAndPasteTransfer cap = new CutAndPasteTransfer(); - cap.setForInput(null); + } + + @Override + public void bioJSMenuItem_actionPerformed(ActionEvent e) + { + BioJsHTMLOutput bjs = new BioJsHTMLOutput(alignPanel); try { - FileFormatI format = fileFormat; - cap.setText(new FormatAdapter(alignPanel, exportData.getSettings()) - .formatSequences(format, exportData.getAlignment(), - exportData.getOmitHidden(), - exportData.getStartEndPostions(), - viewport.getAlignment().getHiddenColumns())); - Desktop.addInternalFrame(cap, MessageManager - .formatMessage("label.alignment_output_command", new Object[] - { e.getActionCommand() }), 600, 500); - } catch (OutOfMemoryError oom) + bjs.exportHTML(null); + } catch (ImageOutputException x) { - new OOMWarning("Outputting alignment as " + e.getActionCommand(), - oom); - cap.dispose(); + // report problem to console and raise dialog } - } - public static AlignmentExportData getAlignmentForExport( - FileFormatI format, AlignViewportI viewport, - AlignExportSettingI exportSettings) + public void createImageMap(File file, String image) { - AlignmentI alignmentToExport = null; - AlignExportSettingI settings = exportSettings; - String[] omitHidden = null; - - HiddenSequences hiddenSeqs = viewport.getAlignment() - .getHiddenSequences(); - - alignmentToExport = viewport.getAlignment(); - - boolean hasHiddenSeqs = hiddenSeqs.getSize() > 0; - if (settings == null) + try + { + alignPanel.makePNGImageMap(file, image); + } catch (ImageOutputException x) { - settings = new AlignExportSettings(hasHiddenSeqs, - viewport.hasHiddenColumns(), format); + // report problem to console and raise dialog } - // settings.isExportAnnotations(); + } - if (viewport.hasHiddenColumns() && !settings.isExportHiddenColumns()) + @Override + public void createPNG_actionPerformed(ActionEvent e) + { + try + { + createPNG(null); + } catch (ImageOutputException ioex) { - omitHidden = viewport.getViewAsString(false, - settings.isExportHiddenSequences()); + // raise dialog, and report via console } + } - int[] alignmentStartEnd = new int[2]; - if (hasHiddenSeqs && settings.isExportHiddenSequences()) + @Override + public void createEPS_actionPerformed(ActionEvent e) + { + try { - alignmentToExport = hiddenSeqs.getFullAlignment(); - } - else + createEPS(null); + } catch (ImageOutputException ioex) { - alignmentToExport = viewport.getAlignment(); + // raise dialog, and report via console } - alignmentStartEnd = viewport.getAlignment().getHiddenColumns() - .getVisibleStartAndEndIndex(alignmentToExport.getWidth()); - AlignmentExportData ed = new AlignmentExportData(alignmentToExport, - omitHidden, alignmentStartEnd, settings); - return ed; + } - /** - * DOCUMENT ME! - * - * @param e - * DOCUMENT ME! - */ @Override - protected void htmlMenuItem_actionPerformed(ActionEvent e) + public void createSVG_actionPerformed(ActionEvent e) { - HtmlSvgOutput htmlSVG = new HtmlSvgOutput(alignPanel); - htmlSVG.exportHTML(null); + try + { + createSVG(null); + } catch (ImageOutputException ioex) + { + // raise dialog, and report via console + } + } - @Override - public void bioJSMenuItem_actionPerformed(ActionEvent e) + /** + * Creates a PNG image of the alignment and writes it to the given file. If + * the file is null, the user is prompted to choose a file. + * + * @param f + */ + public void createPNG(File f) throws ImageOutputException { - BioJsHTMLOutput bjs = new BioJsHTMLOutput(alignPanel); - bjs.exportHTML(null); + createPNG(f, null, BitmapImageSizing.nullBitmapImageSizing()); } - public void createImageMap(File file, String image) + public void createPNG(File f, String renderer, BitmapImageSizing userBis) + throws ImageOutputException { - alignPanel.makePNGImageMap(file, image); + alignPanel.makeAlignmentImage(TYPE.PNG, f, renderer, userBis); } /** - * DOCUMENT ME! + * Creates an EPS image of the alignment and writes it to the given file. If + * the file is null, the user is prompted to choose a file. * - * @param e - * DOCUMENT ME! + * @param f */ - @Override - public void createPNG(File f) + public void createEPS(File f) throws ImageOutputException { - alignPanel.makePNG(f); + createEPS(f, null); + } + + public void createEPS(File f, String renderer) throws ImageOutputException + { + alignPanel.makeAlignmentImage(TYPE.EPS, f, renderer); } /** - * DOCUMENT ME! + * Creates an SVG image of the alignment and writes it to the given file. If + * the file is null, the user is prompted to choose a file. * - * @param e - * DOCUMENT ME! + * @param f */ - @Override - public void createEPS(File f) + public void createSVG(File f) throws ImageOutputException { - alignPanel.makeEPS(f); + createSVG(f, null); } - @Override - public void createSVG(File f) + public void createSVG(File f, String renderer) throws ImageOutputException { - alignPanel.makeSVG(f); + alignPanel.makeAlignmentImage(TYPE.SVG, f, renderer); } @Override @@ -1454,24 +1611,20 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void associatedData_actionPerformed(ActionEvent e) { - // Pick the tree file - JalviewFileChooser chooser = new JalviewFileChooser( - jalview.bin.Cache.getProperty("LAST_DIRECTORY")); + final JalviewFileChooser chooser = new JalviewFileChooser( + Cache.getProperty("LAST_DIRECTORY")); chooser.setFileView(new JalviewFileView()); - chooser.setDialogTitle( - MessageManager.getString("label.load_jalview_annotations")); - chooser.setToolTipText( - MessageManager.getString("label.load_jalview_annotations")); - - int value = chooser.showOpenDialog(null); - - if (value == JalviewFileChooser.APPROVE_OPTION) - { + String tooltip = MessageManager + .getString("label.load_jalview_annotations"); + chooser.setDialogTitle(tooltip); + chooser.setToolTipText(tooltip); + chooser.setResponseHandler(0, () -> { String choice = chooser.getSelectedFile().getPath(); - jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice); - loadJalviewDataFile(choice, null, null, null); - } + Cache.setProperty("LAST_DIRECTORY", choice); + loadJalviewDataFile(chooser.getSelectedFile(), null, null, null); + }); + chooser.showOpenDialog(this); } /** @@ -1653,7 +1806,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { if (originalSource != viewport) { - Cache.log.warn( + Console.warn( "Implementation worry: mismatch of viewport origin for undo"); } originalSource.updateHiddenColumns(); @@ -1693,7 +1846,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (originalSource != viewport) { - Cache.log.warn( + Console.warn( "Implementation worry: mismatch of viewport origin for redo"); } originalSource.updateHiddenColumns(); @@ -1789,18 +1942,18 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, synchronized void slideSequences(boolean right, int size) { List sg = new ArrayList<>(); - if (viewport.getSelectionGroup() != null && viewport.getSelectionGroup() - .getSize() != viewport.getAlignment().getHeight()) - { - sg = viewport.getSelectionGroup() - .getSequences(viewport.getHiddenRepSequences()); - } - - if (sg.size() == 0 && viewport.cursorMode) + if (viewport.cursorMode) { sg.add(viewport.getAlignment() .getSequenceAt(alignPanel.getSeqPanel().seqCanvas.cursorY)); } + else if (viewport.getSelectionGroup() != null + && viewport.getSelectionGroup().getSize() != viewport + .getAlignment().getHeight()) + { + sg = viewport.getSelectionGroup() + .getSequences(viewport.getHiddenRepSequences()); + } if (sg.size() < 1) { @@ -1898,7 +2051,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! */ @Override - protected void copy_actionPerformed(ActionEvent e) + protected void copy_actionPerformed() { if (viewport.getSelectionGroup() == null) { @@ -1950,7 +2103,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, Desktop.jalviewClipboard = new Object[] { seqs, viewport.getAlignment().getDataset(), hiddenColumns }; - statusBar.setText(MessageManager.formatMessage( + setStatus(MessageManager.formatMessage( "label.copied_sequences_to_clipboard", new Object[] { Integer.valueOf(seqs.length).toString() })); } @@ -2073,7 +2226,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, && Desktop.jalviewClipboard[1] != alignment.getDataset(); // importDs==true instructs us to copy over new dataset sequences from // an existing alignment - Vector newDs = (importDs) ? new Vector() : null; // used to create + Vector newDs = (importDs) ? new Vector<>() : null; // used to + // create // minimum dataset set for (int i = 0; i < sequences.length; i++) @@ -2199,10 +2353,17 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, .intValue(); } } - alignment.addAnnotation(sequences[i].getAnnotation()[a]); // annotation - // was - // duplicated - // earlier + // annotation was duplicated earlier + alignment.addAnnotation(sequences[i].getAnnotation()[a]); + // take care of contact matrix too + ContactMatrixI cm = sequences[i] + .getContactMatrixFor(sequences[i].getAnnotation()[a]); + if (cm != null) + { + alignment.addContactListFor(sequences[i].getAnnotation()[a], + cm); + } + alignment.setAnnotationIndex(sequences[i].getAnnotation()[a], a); } @@ -2212,7 +2373,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { // propagate alignment changed. - viewport.getRanges().setEndSeq(alignment.getHeight()); + viewport.getRanges().setEndSeq(alignment.getHeight() - 1); if (annotationAdded) { // Duplicate sequence annotation in all views. @@ -2367,26 +2528,20 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } /** - * DOCUMENT ME! - * - * @param e - * DOCUMENT ME! + * Action Cut (delete and copy) the selected region */ @Override - protected void cut_actionPerformed(ActionEvent e) + protected void cut_actionPerformed() { - copy_actionPerformed(null); - delete_actionPerformed(null); + copy_actionPerformed(); + delete_actionPerformed(); } /** - * DOCUMENT ME! - * - * @param e - * DOCUMENT ME! + * Performs menu option to Delete the currently selected region */ @Override - protected void delete_actionPerformed(ActionEvent evt) + protected void delete_actionPerformed() { SequenceGroup sg = viewport.getSelectionGroup(); @@ -2395,50 +2550,59 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, return; } - /* - * If the cut affects all sequences, warn, remove highlighted columns - */ - if (sg.getSize() == viewport.getAlignment().getHeight()) - { - boolean isEntireAlignWidth = (((sg.getEndRes() - sg.getStartRes()) - + 1) == viewport.getAlignment().getWidth()) ? true : false; - if (isEntireAlignWidth) - { - int confirm = JvOptionPane.showConfirmDialog(this, - MessageManager.getString("warn.delete_all"), // $NON-NLS-1$ - MessageManager.getString("label.delete_all"), // $NON-NLS-1$ - JvOptionPane.OK_CANCEL_OPTION); + Runnable okAction = () -> { + SequenceI[] cut = sg.getSequences() + .toArray(new SequenceI[sg.getSize()]); - if (confirm == JvOptionPane.CANCEL_OPTION - || confirm == JvOptionPane.CLOSED_OPTION) + addHistoryItem(new EditCommand( + MessageManager.getString("label.cut_sequences"), Action.CUT, + cut, sg.getStartRes(), sg.getEndRes() - sg.getStartRes() + 1, + viewport.getAlignment())); + + viewport.setSelectionGroup(null); + viewport.sendSelection(); + viewport.getAlignment().deleteGroup(sg); + + viewport.firePropertyChange("alignment", null, + viewport.getAlignment().getSequences()); + if (viewport.getAlignment().getHeight() < 1) + { + try + { + AlignFrame.this.setClosed(true); + } catch (Exception ex) { - return; } } - viewport.getColumnSelection().removeElements(sg.getStartRes(), - sg.getEndRes() + 1); - } - SequenceI[] cut = sg.getSequences() - .toArray(new SequenceI[sg.getSize()]); + }; - addHistoryItem(new EditCommand( - MessageManager.getString("label.cut_sequences"), Action.CUT, - cut, sg.getStartRes(), sg.getEndRes() - sg.getStartRes() + 1, - viewport.getAlignment())); - - viewport.setSelectionGroup(null); - viewport.sendSelection(); - viewport.getAlignment().deleteGroup(sg); - - viewport.firePropertyChange("alignment", null, - viewport.getAlignment().getSequences()); - if (viewport.getAlignment().getHeight() < 1) + /* + * If the cut affects all sequences, prompt for confirmation + */ + boolean wholeHeight = sg.getSize() == viewport.getAlignment() + .getHeight(); + boolean wholeWidth = (((sg.getEndRes() - sg.getStartRes()) + + 1) == viewport.getAlignment().getWidth()) ? true : false; + if (wholeHeight && wholeWidth) + { + JvOptionPane dialog = JvOptionPane.newOptionDialog(Desktop.desktop); + dialog.setResponseHandler(0, okAction); // 0 = OK_OPTION + Object[] options = new Object[] { + MessageManager.getString("action.ok"), + MessageManager.getString("action.cancel") }; + dialog.showDialog(MessageManager.getString("warn.delete_all"), + MessageManager.getString("label.delete_all"), + JvOptionPane.DEFAULT_OPTION, JvOptionPane.PLAIN_MESSAGE, null, + options, options[0]); + } + else { try { - this.setClosed(true); - } catch (Exception ex) + okAction.run(); + } catch (Exception e) { + e.printStackTrace(); } } } @@ -2545,6 +2709,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { viewport.invertColumnSelection(); alignPanel.paintAlignment(true, false); + PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId()); viewport.sendSelection(); } @@ -2612,8 +2777,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, column, viewport.getAlignment()); } - statusBar.setText(MessageManager - .formatMessage("label.removed_columns", new String[] + setStatus(MessageManager.formatMessage("label.removed_columns", + new String[] { Integer.valueOf(trimRegion.getSize()).toString() })); addHistoryItem(trimRegion); @@ -2662,8 +2827,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, addHistoryItem(removeGapCols); - statusBar.setText(MessageManager - .formatMessage("label.removed_empty_columns", new Object[] + setStatus(MessageManager.formatMessage("label.removed_empty_columns", + new Object[] { Integer.valueOf(removeGapCols.getSize()).toString() })); // This is to maintain viewport position on first residue @@ -2743,7 +2908,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void findMenuItem_actionPerformed(ActionEvent e) { - new Finder(alignPanel); + new Finder(alignPanel, false, null); } /** @@ -2825,6 +2990,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, viewport.setGatherViewsHere(true); } tabbedPane.setSelectedIndex(tabbedPane.getTabCount() - 1); + return newap; } @@ -2989,10 +3155,15 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void wrapMenuItem_actionPerformed(ActionEvent e) { - scaleAbove.setVisible(wrapMenuItem.isSelected()); - scaleLeft.setVisible(wrapMenuItem.isSelected()); - scaleRight.setVisible(wrapMenuItem.isSelected()); - viewport.setWrapAlignment(wrapMenuItem.isSelected()); + setWrapFormat(wrapMenuItem.isSelected()); + } + + public void setWrapFormat(boolean b) + { + scaleAbove.setVisible(b); + scaleLeft.setVisible(b); + scaleRight.setVisible(b); + viewport.setWrapAlignment(b); alignPanel.updateLayout(); } @@ -3022,7 +3193,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * @param toggleSeqs * @param toggleCols */ - private void toggleHiddenRegions(boolean toggleSeqs, boolean toggleCols) + protected void toggleHiddenRegions(boolean toggleSeqs, boolean toggleCols) { boolean hide = false; @@ -3297,15 +3468,42 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void alignmentProperties() { - JEditorPane editPane = new JEditorPane("text/html", ""); - editPane.setEditable(false); + JComponent pane; StringBuffer contents = new AlignmentProperties(viewport.getAlignment()) + .formatAsHtml(); - editPane.setText( - MessageManager.formatMessage("label.html_content", new Object[] - { contents.toString() })); + String content = MessageManager.formatMessage("label.html_content", + new Object[] + { contents.toString() }); + contents = null; + + if (Platform.isJS()) + { + JLabel textLabel = new JLabel(); + textLabel.setText(content); + textLabel.setBackground(Color.WHITE); + + pane = new JPanel(new BorderLayout()); + ((JPanel) pane).setOpaque(true); + pane.setBackground(Color.WHITE); + ((JPanel) pane).add(textLabel, BorderLayout.NORTH); + } + else + /** + * Java only + * + * @j2sIgnore + */ + { + JEditorPane editPane = new JEditorPane("text/html", ""); + editPane.setEditable(false); + editPane.setText(content); + pane = editPane; + } + JInternalFrame frame = new JInternalFrame(); - frame.getContentPane().add(new JScrollPane(editPane)); + + frame.getContentPane().add(new JScrollPane(pane)); Desktop.addInternalFrame(frame, MessageManager .formatMessage("label.alignment_properties", new Object[] @@ -3313,28 +3511,34 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } /** - * DOCUMENT ME! + * Opens an Overview panel for the alignment, unless one is open already * * @param e - * DOCUMENT ME! */ @Override public void overviewMenuItem_actionPerformed(ActionEvent e) { + boolean showHiddenRegions = Cache + .getDefault(Preferences.SHOW_OV_HIDDEN_AT_START, false); + openOverviewPanel(showHiddenRegions); + } + + public OverviewPanel openOverviewPanel(boolean showHidden) + { if (alignPanel.overviewPanel != null) { - return; + return alignPanel.overviewPanel; } - JInternalFrame frame = new JInternalFrame(); - final OverviewPanel overview = new OverviewPanel(alignPanel); + final OverviewPanel overview = new OverviewPanel(alignPanel, frame, + showHidden); frame.setContentPane(overview); - Desktop.addInternalFrame(frame, MessageManager - .formatMessage("label.overview_params", new Object[] - { this.getTitle() }), true, frame.getWidth(), frame.getHeight(), - true, true); + Desktop.addInternalFrame(frame, "", true, frame.getWidth(), + frame.getHeight(), true, true); + frame.setFrameIcon(null); frame.pack(); frame.setLayer(JLayeredPane.PALETTE_LAYER); + final AlignmentPanel thePanel = this.alignPanel; frame.addInternalFrameListener( new javax.swing.event.InternalFrameAdapter() { @@ -3343,8 +3547,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, javax.swing.event.InternalFrameEvent evt) { overview.dispose(); - alignPanel.setOverviewPanel(null); - }; + thePanel.setOverviewPanel(null); + } }); if (getKeyListeners().length > 0) { @@ -3352,6 +3556,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } alignPanel.setOverviewPanel(overview); + alignPanel.setOverviewTitle(this); + + return overview; } @Override @@ -3782,7 +3989,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { sortByAnnotScore.removeAll(); // almost certainly a quicker way to do this - but we keep it simple - Hashtable scoreSorts = new Hashtable(); + Hashtable scoreSorts = new Hashtable<>(); AlignmentAnnotation aann[]; for (SequenceI sqa : viewport.getAlignment().getSequences()) { @@ -3795,11 +4002,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } } } - Enumeration labels = scoreSorts.keys(); + Enumeration labels = scoreSorts.keys(); while (labels.hasMoreElements()) { - addSortByAnnotScoreMenuItem(sortByAnnotScore, - (String) labels.nextElement()); + addSortByAnnotScoreMenuItem(sortByAnnotScore, labels.nextElement()); } sortByAnnotScore.setVisible(scoreSorts.size() > 0); scoreSorts.clear(); @@ -3959,23 +4165,21 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { // Pick the tree file JalviewFileChooser chooser = new JalviewFileChooser( - jalview.bin.Cache.getProperty("LAST_DIRECTORY")); + Cache.getProperty("LAST_DIRECTORY")); chooser.setFileView(new JalviewFileView()); chooser.setDialogTitle( MessageManager.getString("label.select_newick_like_tree_file")); chooser.setToolTipText( MessageManager.getString("label.load_tree_file")); - int value = chooser.showOpenDialog(null); - - if (value == JalviewFileChooser.APPROVE_OPTION) - { + chooser.setResponseHandler(0, () -> { String filePath = chooser.getSelectedFile().getPath(); Cache.setProperty("LAST_DIRECTORY", filePath); NewickFile fin = null; try { - fin = new NewickFile(filePath, DataSourceType.FILE); + fin = new NewickFile(new FileParse(chooser.getSelectedFile(), + DataSourceType.FILE)); viewport.setCurrentTree(showNewickTree(fin, filePath).getTree()); } catch (Exception ex) { @@ -3992,7 +4196,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, .getString("label.possible_problem_with_tree_file"), JvOptionPane.WARNING_MESSAGE); } - } + }); + chooser.showOpenDialog(this); } public TreePanel showNewickTree(NewickFile nf, String treeTitle) @@ -4056,6 +4261,57 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, return tp; } + public void showContactMapTree(AlignmentAnnotation aa, ContactMatrixI cm) + { + int x = 4, y = 5; + int w = 400, h = 500; + + try + { + NewickFile fin = new NewickFile( + new FileParse(cm.getNewick(), DataSourceType.PASTE)); + String title = aa.label + " " + + cm.getTreeMethod() + " tree" + (aa.sequenceRef != null + ? (" for " + aa.sequenceRef.getDisplayId(false)) + : ""); + + showColumnWiseTree(fin, aa, title, w, h, x, y); + } catch (Throwable xx) + { + Console.error("Unexpected exception showing tree for contact matrix", + xx); + } + } + + public TreePanel showColumnWiseTree(NewickFile nf, AlignmentAnnotation aa, + String treeTitle, int w, int h, int x, int y) + { + try + { + nf.parse(); + if (nf.getTree() == null) + { + return null; + } + TreePanel tp = new TreePanel(alignPanel, nf, aa, treeTitle); + + tp.setSize(w, h); + + if (x > 0 && y > 0) + { + tp.setLocation(x, y); + } + + Desktop.addInternalFrame(tp, treeTitle, w, h); + return tp; + } catch (Throwable xx) + { + Console.error("Unexpected exception showing tree for contact matrix", + xx); + } + return null; + } + private boolean buildingMenu = false; /** @@ -4122,15 +4378,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, // No MSAWS used any more: // Vector msaws = null; // (Vector) // Discoverer.services.get("MsaWS"); - Vector secstrpr = (Vector) Discoverer.services + Vector secstrpr = Discoverer.services .get("SecStrPred"); if (secstrpr != null) { // Add any secondary structure prediction services for (int i = 0, j = secstrpr.size(); i < j; i++) { - final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) secstrpr - .get(i); + final ext.vamsas.ServiceHandle sh = secstrpr.get(i); jalview.ws.WSMenuEntryProviderI impl = jalview.ws.jws1.Discoverer .getServiceClient(sh); int p = secstrmenu.getItemCount(); @@ -4191,7 +4446,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, jws2servs.attachWSMenuEntry(webService, me); for (Jws2Instance sv : jws2servs.getServices()) { - if (sv.description.toLowerCase().contains("jpred")) + if (sv.description.toLowerCase(Locale.ROOT) + .contains("jpred")) { for (JMenuItem jmi : legacyItems) { @@ -4245,7 +4501,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } } catch (Exception e) { - Cache.log.debug( + Console.debug( "Exception during web service menu building process.", e); } @@ -4265,7 +4521,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * * @param webService */ - private void build_urlServiceMenu(JMenu webService) + protected void build_urlServiceMenu(JMenu webService) { // TODO: remove this code when 2.7 is released // DEBUG - alignmentView @@ -4342,7 +4598,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, showProducts.setEnabled(showp); } catch (Exception e) { - Cache.log.warn( + Console.warn( "canShowProducts threw an exception - please report to help@jalview.org", e); return false; @@ -4383,8 +4639,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, al = dna.translateCdna(codeTable); } catch (Exception ex) { - jalview.bin.Cache.log.error( - "Exception during translation. Please report this !", ex); + Console.error("Exception during translation. Please report this !", + ex); final String msg = MessageManager.getString( "label.error_when_translating_sequences_submit_bug_report"); final String errorTitle = MessageManager @@ -4438,13 +4694,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * Try to load a features file onto the alignment. * * @param file - * contents or path to retrieve file + * contents or path to retrieve file or a File object * @param sourceType * access mode of file (see jalview.io.AlignFile) * @return true if features file was parsed correctly. */ - public boolean parseFeaturesFile(String file, DataSourceType sourceType) + public boolean parseFeaturesFile(Object file, DataSourceType sourceType) { + // BH 2018 return avc.parseFeaturesFile(file, sourceType, Cache.getDefault("RELAXEDSEQIDMATCHING", false)); @@ -4491,8 +4748,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, // Java's Transferable for native dnd evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); Transferable t = evt.getTransferable(); + final AlignFrame thisaf = this; - final List files = new ArrayList<>(); + final List files = new ArrayList<>(); List protocols = new ArrayList<>(); try @@ -4520,20 +4778,33 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * Object[] { String,SequenceI} */ ArrayList filesmatched = new ArrayList<>(); - ArrayList filesnotmatched = new ArrayList<>(); + ArrayList filesnotmatched = new ArrayList<>(); for (int i = 0; i < files.size(); i++) { - String file = files.get(i).toString(); + // BH 2018 + Object file = files.get(i); + String fileName = file.toString(); String pdbfn = ""; - DataSourceType protocol = FormatAdapter.checkProtocol(file); + DataSourceType protocol = (file instanceof File + ? DataSourceType.FILE + : FormatAdapter.checkProtocol(fileName)); if (protocol == DataSourceType.FILE) { - File fl = new File(file); + File fl; + if (file instanceof File) + { + fl = (File) file; + Platform.cacheFileData(fl); + } + else + { + fl = new File(fileName); + } pdbfn = fl.getName(); } else if (protocol == DataSourceType.URL) { - URL url = new URL(file); + URL url = new URL(fileName); pdbfn = url.getFile(); } if (pdbfn.length() > 0) @@ -4555,7 +4826,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } if (mtch != null) { - FileFormatI type = null; + FileFormatI type; try { type = new IdentifyFile().identify(file, protocol); @@ -4602,13 +4873,13 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, for (SequenceI toassoc : (SequenceI[]) fm[2]) { PDBEntry pe = new AssociatePdbFileWithSeq() - .associatePdbWithSeq((String) fm[0], + .associatePdbWithSeq(fm[0].toString(), (DataSourceType) fm[1], toassoc, false, Desktop.instance); if (pe != null) { System.err.println("Associated file : " - + ((String) fm[0]) + " with " + + (fm[0].toString()) + " with " + toassoc.getDisplayId(true)); assocfiles++; } @@ -4625,7 +4896,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, */ for (Object[] o : filesmatched) { - filesnotmatched.add((String) o[0]); + filesnotmatched.add(o[0]); } } } @@ -4647,7 +4918,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { return; } - for (String fn : filesnotmatched) + for (Object fn : filesnotmatched) { loadJalviewDataFile(fn, null, null, null); } @@ -4674,9 +4945,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * @param file * either a filename or a URL string. */ - public void loadJalviewDataFile(String file, DataSourceType sourceType, + public void loadJalviewDataFile(Object file, DataSourceType sourceType, FileFormatI format, SequenceI assocSeq) { + // BH 2018 was String file try { if (sourceType == null) @@ -4707,7 +4979,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, changeColour( new TCoffeeColourScheme(viewport.getAlignment())); isAnnotation = true; - statusBar.setText(MessageManager.getString( + setStatus(MessageManager.getString( "label.successfully_pasted_tcoffee_scores_to_alignment")); } else @@ -4730,7 +5002,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } } catch (Exception x) { - Cache.log.debug( + Console.debug( "Exception when processing data source as T-COFFEE score file", x); tcf = null; @@ -4750,7 +5022,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, new FileParse(file, sourceType)); sm.parse(); // todo: i18n this message - statusBar.setText(MessageManager.formatMessage( + setStatus(MessageManager.formatMessage( "label.successfully_loaded_matrix", sm.getMatrixName())); } @@ -4828,7 +5100,19 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { if (index > -1) { + /* + * update current Overview window title (if there is one) + * to add view name "Original" if necessary + */ + alignPanel.setOverviewTitle(this); + + /* + * switch panels and set Overview title (if there is one + * because it was opened automatically) + */ alignPanel = alignPanels.get(index); + alignPanel.setOverviewTitle(this); + viewport = alignPanel.av; avc.setViewportAndAlignmentPanel(viewport, alignPanel); setMenusFromViewport(viewport); @@ -4899,8 +5183,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (e.isPopupTrigger()) { String msg = MessageManager.getString("label.enter_view_name"); - String reply = JvOptionPane.showInternalInputDialog(this, msg, msg, - JvOptionPane.QUESTION_MESSAGE); + String ttl = tabbedPane.getTitleAt(tabbedPane.getSelectedIndex()); + String reply = JvOptionPane.showInputDialog(msg, ttl); if (reply != null) { @@ -5015,7 +5299,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, trimrs.setSelected(trimrs.isSelected()); Cache.setProperty(DBRefFetcher.TRIM_RETRIEVED_SEQUENCES, Boolean.valueOf(trimrs.isSelected()).toString()); - }; + } }); rfetch.add(trimrs); JMenuItem fetchr = new JMenuItem( @@ -5062,22 +5346,19 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, }); rfetch.add(fetchr); - final AlignFrame me = this; new Thread(new Runnable() { @Override public void run() { final jalview.ws.SequenceFetcher sf = jalview.gui.SequenceFetcher - .getSequenceFetcherSingleton(me); + .getSequenceFetcherSingleton(); javax.swing.SwingUtilities.invokeLater(new Runnable() { @Override public void run() { - String[] dbclasses = sf.getOrderedSupportedSources(); - // sf.getDbInstances(jalview.ws.dbsources.DasSequenceSource.class); - // jalview.util.QuickSort.sort(otherdb, otherdb); + String[] dbclasses = sf.getNonAlignmentSources(); List otherdb; JMenu dfetch = new JMenu(); JMenu ifetch = new JMenu(); @@ -5094,12 +5375,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { continue; } - // List dbs=otherdb; - // otherdb=new ArrayList(); - // for (DbSourceProxy db:dbs) - // { - // if (!db.isA(DBRefSource.ALIGNMENTDB) - // } if (mname == null) { mname = "From " + dbclass; @@ -5501,7 +5776,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * update non-sequence-related annotations */ @Override - protected void setAnnotationsVisibility(boolean visible, + public void setAnnotationsVisibility(boolean visible, boolean forSequences, boolean forAlignment) { AlignmentAnnotation[] anns = alignPanel.getAlignment() @@ -5707,6 +5982,13 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, | ActionEvent.CTRL_MASK)) != 0); } + @Override + protected void copyHighlightedColumns_actionPerformed( + ActionEvent actionEvent) + { + avc.copyHighlightedRegionsToClipboard(); + } + /** * Rebuilds the Colour menu, including any user-defined colours which have * been loaded either on startup or during the session @@ -5754,16 +6036,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, chooser.setFileView(new JalviewFileView()); chooser.setDialogTitle(MessageManager.getString("label.load_vcf_file")); chooser.setToolTipText(MessageManager.getString("label.load_vcf_file")); - - int value = chooser.showOpenDialog(null); - - if (value == JalviewFileChooser.APPROVE_OPTION) - { + final AlignFrame us = this; + chooser.setResponseHandler(0, () -> { String choice = chooser.getSelectedFile().getPath(); Cache.setProperty("LAST_DIRECTORY", choice); SequenceI[] seqs = viewport.getAlignment().getSequencesArray(); - new VCFLoader(choice).loadVCF(seqs, this); - } + new VCFLoader(choice).loadVCF(seqs, us); + }); + chooser.showOpenDialog(null); } @@ -5780,6 +6060,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { return lastFeatureSettingsBounds; } + } class PrintThread extends Thread