2 * Jalview - A Sequence Alignment Editor and Viewer (Version 2.5)
3 * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
11 * Jalview is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty
13 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14 * PURPOSE. See the GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along with Jalview. If not, see <http://www.gnu.org/licenses/>.
25 import java.awt.datatransfer.*;
26 import java.awt.dnd.*;
27 import java.awt.event.*;
28 import java.awt.print.*;
30 import javax.swing.event.MenuEvent;
32 import jalview.analysis.*;
33 import jalview.commands.*;
34 import jalview.datamodel.*;
36 import jalview.jbgui.*;
37 import jalview.schemes.*;
46 public class AlignFrame extends GAlignFrame implements DropTargetListener,
51 public static final int DEFAULT_WIDTH = 700;
54 public static final int DEFAULT_HEIGHT = 500;
56 public AlignmentPanel alignPanel;
58 AlignViewport viewport;
60 Vector alignPanels = new Vector();
63 * Last format used to load or save alignments in this window
65 String currentFileFormat = null;
68 * Current filename for this alignment
70 String fileName = null;
73 * Creates a new AlignFrame object with specific width and height.
79 public AlignFrame(AlignmentI al, int width, int height)
81 this(al, null, width, height);
85 * Creates a new AlignFrame object with specific width, height and
91 * @param sequenceSetId
93 public AlignFrame(AlignmentI al, int width, int height,
96 this(al, null, width, height, sequenceSetId);
100 * Creates a new AlignFrame object with specific width, height and
106 * @param sequenceSetId
109 public AlignFrame(AlignmentI al, int width, int height,
110 String sequenceSetId, String viewId)
112 this(al, null, width, height, sequenceSetId, viewId);
116 * new alignment window with hidden columns
120 * @param hiddenColumns
121 * ColumnSelection or null
123 * Width of alignment frame
127 public AlignFrame(AlignmentI al, ColumnSelection hiddenColumns,
128 int width, int height)
130 this(al, hiddenColumns, width, height, null);
134 * Create alignment frame for al with hiddenColumns, a specific width and
135 * height, and specific sequenceId
138 * @param hiddenColumns
141 * @param sequenceSetId
144 public AlignFrame(AlignmentI al, ColumnSelection hiddenColumns,
145 int width, int height, String sequenceSetId)
147 this(al, hiddenColumns, width, height, sequenceSetId, null);
151 * Create alignment frame for al with hiddenColumns, a specific width and
152 * height, and specific sequenceId
155 * @param hiddenColumns
158 * @param sequenceSetId
163 public AlignFrame(AlignmentI al, ColumnSelection hiddenColumns,
164 int width, int height, String sequenceSetId, String viewId)
166 setSize(width, height);
167 viewport = new AlignViewport(al, hiddenColumns, sequenceSetId, viewId);
169 alignPanel = new AlignmentPanel(this, viewport);
171 if (al.getDataset() == null)
176 addAlignmentPanel(alignPanel, true);
181 * Make a new AlignFrame from exisiting alignmentPanels
188 public AlignFrame(AlignmentPanel ap)
192 addAlignmentPanel(ap, false);
197 * initalise the alignframe from the underlying viewport data and the
202 if (viewport.conservation == null)
204 BLOSUM62Colour.setEnabled(false);
205 conservationMenuItem.setEnabled(false);
206 modifyConservation.setEnabled(false);
207 // PIDColour.setEnabled(false);
208 // abovePIDThreshold.setEnabled(false);
209 // modifyPID.setEnabled(false);
212 String sortby = jalview.bin.Cache.getDefault("SORT_ALIGNMENT",
215 if (sortby.equals("Id"))
217 sortIDMenuItem_actionPerformed(null);
219 else if (sortby.equals("Pairwise Identity"))
221 sortPairwiseMenuItem_actionPerformed(null);
224 if (Desktop.desktop != null)
226 this.setDropTarget(new java.awt.dnd.DropTarget(this, this));
227 addServiceListeners();
228 setGUINucleotide(viewport.alignment.isNucleotide());
231 setMenusFromViewport(viewport);
232 buildSortByAnnotationScoresMenu();
233 if (viewport.wrapAlignment)
235 wrapMenuItem_actionPerformed(null);
238 if (jalview.bin.Cache.getDefault("SHOW_OVERVIEW", false))
240 this.overviewMenuItem_actionPerformed(null);
248 * Change the filename and format for the alignment, and enable the 'reload'
249 * button functionality.
256 public void setFileName(String file, String format)
259 currentFileFormat = format;
260 reload.setEnabled(true);
263 void addKeyListener()
265 addKeyListener(new KeyAdapter()
267 public void keyPressed(KeyEvent evt)
269 if (viewport.cursorMode
270 && ((evt.getKeyCode() >= KeyEvent.VK_0 && evt.getKeyCode() <= KeyEvent.VK_9) || (evt
271 .getKeyCode() >= KeyEvent.VK_NUMPAD0 && evt
272 .getKeyCode() <= KeyEvent.VK_NUMPAD9))
273 && Character.isDigit(evt.getKeyChar()))
274 alignPanel.seqPanel.numberPressed(evt.getKeyChar());
276 switch (evt.getKeyCode())
279 case 27: // escape key
280 deselectAllSequenceMenuItem_actionPerformed(null);
284 case KeyEvent.VK_DOWN:
285 if (evt.isAltDown() || !viewport.cursorMode)
286 moveSelectedSequences(false);
287 if (viewport.cursorMode)
288 alignPanel.seqPanel.moveCursor(0, 1);
292 if (evt.isAltDown() || !viewport.cursorMode)
293 moveSelectedSequences(true);
294 if (viewport.cursorMode)
295 alignPanel.seqPanel.moveCursor(0, -1);
299 case KeyEvent.VK_LEFT:
300 if (evt.isAltDown() || !viewport.cursorMode)
301 slideSequences(false, alignPanel.seqPanel.getKeyboardNo1());
303 alignPanel.seqPanel.moveCursor(-1, 0);
307 case KeyEvent.VK_RIGHT:
308 if (evt.isAltDown() || !viewport.cursorMode)
309 slideSequences(true, alignPanel.seqPanel.getKeyboardNo1());
311 alignPanel.seqPanel.moveCursor(1, 0);
314 case KeyEvent.VK_SPACE:
315 if (viewport.cursorMode)
317 alignPanel.seqPanel.insertGapAtCursor(evt.isControlDown()
318 || evt.isShiftDown() || evt.isAltDown());
322 case KeyEvent.VK_DELETE:
323 case KeyEvent.VK_BACK_SPACE:
324 if (!viewport.cursorMode)
326 cut_actionPerformed(null);
330 alignPanel.seqPanel.deleteGapAtCursor(evt.isControlDown()
331 || evt.isShiftDown() || evt.isAltDown());
337 if (viewport.cursorMode)
339 alignPanel.seqPanel.setCursorRow();
343 if (viewport.cursorMode && !evt.isControlDown())
345 alignPanel.seqPanel.setCursorColumn();
349 if (viewport.cursorMode)
351 alignPanel.seqPanel.setCursorPosition();
355 case KeyEvent.VK_ENTER:
356 case KeyEvent.VK_COMMA:
357 if (viewport.cursorMode)
359 alignPanel.seqPanel.setCursorRowAndColumn();
364 if (viewport.cursorMode)
366 alignPanel.seqPanel.setSelectionAreaAtCursor(true);
370 if (viewport.cursorMode)
372 alignPanel.seqPanel.setSelectionAreaAtCursor(false);
377 viewport.cursorMode = !viewport.cursorMode;
378 statusBar.setText("Keyboard editing mode is "
379 + (viewport.cursorMode ? "on" : "off"));
380 if (viewport.cursorMode)
382 alignPanel.seqPanel.seqCanvas.cursorX = viewport.startRes;
383 alignPanel.seqPanel.seqCanvas.cursorY = viewport.startSeq;
385 alignPanel.seqPanel.seqCanvas.repaint();
391 ClassLoader cl = jalview.gui.Desktop.class.getClassLoader();
392 java.net.URL url = javax.help.HelpSet.findHelpSet(cl,
394 javax.help.HelpSet hs = new javax.help.HelpSet(cl, url);
396 javax.help.HelpBroker hb = hs.createHelpBroker();
397 hb.setCurrentID("home");
398 hb.setDisplayed(true);
399 } catch (Exception ex)
401 ex.printStackTrace();
406 boolean toggleSeqs = !evt.isControlDown();
407 boolean toggleCols = !evt.isShiftDown();
408 toggleHiddenRegions(toggleSeqs, toggleCols);
411 case KeyEvent.VK_PAGE_UP:
412 if (viewport.wrapAlignment)
414 alignPanel.scrollUp(true);
418 alignPanel.setScrollValues(viewport.startRes, viewport.startSeq
419 - viewport.endSeq + viewport.startSeq);
422 case KeyEvent.VK_PAGE_DOWN:
423 if (viewport.wrapAlignment)
425 alignPanel.scrollUp(false);
429 alignPanel.setScrollValues(viewport.startRes, viewport.startSeq
430 + viewport.endSeq - viewport.startSeq);
436 public void keyReleased(KeyEvent evt)
438 switch (evt.getKeyCode())
440 case KeyEvent.VK_LEFT:
441 if (evt.isAltDown() || !viewport.cursorMode)
442 viewport.firePropertyChange("alignment", null, viewport
443 .getAlignment().getSequences());
446 case KeyEvent.VK_RIGHT:
447 if (evt.isAltDown() || !viewport.cursorMode)
448 viewport.firePropertyChange("alignment", null, viewport
449 .getAlignment().getSequences());
456 public void addAlignmentPanel(final AlignmentPanel ap, boolean newPanel)
458 ap.alignFrame = this;
460 alignPanels.addElement(ap);
462 PaintRefresher.Register(ap, ap.av.getSequenceSetId());
464 int aSize = alignPanels.size();
466 tabbedPane.setVisible(aSize > 1 || ap.av.viewName != null);
468 if (aSize == 1 && ap.av.viewName == null)
470 this.getContentPane().add(ap, BorderLayout.CENTER);
476 setInitialTabVisible();
479 expandViews.setEnabled(true);
480 gatherViews.setEnabled(true);
481 tabbedPane.addTab(ap.av.viewName, ap);
483 ap.setVisible(false);
490 ap.av.alignment.padGaps();
492 ap.av.updateConservation(ap);
493 ap.av.updateConsensus(ap);
497 public void setInitialTabVisible()
499 expandViews.setEnabled(true);
500 gatherViews.setEnabled(true);
501 tabbedPane.setVisible(true);
502 AlignmentPanel first = (AlignmentPanel) alignPanels.firstElement();
503 tabbedPane.addTab(first.av.viewName, first);
504 this.getContentPane().add(tabbedPane, BorderLayout.CENTER);
507 public AlignViewport getViewport()
512 /* Set up intrinsic listeners for dynamically generated GUI bits. */
513 private void addServiceListeners()
515 final java.beans.PropertyChangeListener thisListener;
516 // Do this once to get current state
517 BuildWebServiceMenu();
519 .addPropertyChangeListener(thisListener = new java.beans.PropertyChangeListener()
521 public void propertyChange(PropertyChangeEvent evt)
523 // System.out.println("Discoverer property change.");
524 if (evt.getPropertyName().equals("services"))
526 // System.out.println("Rebuilding web service menu");
527 BuildWebServiceMenu();
532 addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
534 public void internalFrameClosed(
535 javax.swing.event.InternalFrameEvent evt)
537 // System.out.println("deregistering discoverer listener");
538 Desktop.discoverer.removePropertyChangeListener(thisListener);
539 closeMenuItem_actionPerformed(true);
544 public void setGUINucleotide(boolean nucleotide)
546 showTranslation.setVisible(nucleotide);
547 conservationMenuItem.setEnabled(!nucleotide);
548 modifyConservation.setEnabled(!nucleotide);
549 showGroupConservation.setEnabled(!nucleotide);
550 // Remember AlignFrame always starts as protein
553 calculateMenu.remove(calculateMenu.getItemCount() - 2);
558 * set up menus for the currently viewport. This may be called after any
559 * operation that affects the data in the current view (selection changed,
560 * etc) to update the menus to reflect the new state.
562 public void setMenusForViewport()
564 setMenusFromViewport(viewport);
568 * Need to call this method when tabs are selected for multiple views, or when
569 * loading from Jalview2XML.java
574 void setMenusFromViewport(AlignViewport av)
576 padGapsMenuitem.setSelected(av.padGaps);
577 colourTextMenuItem.setSelected(av.showColourText);
578 abovePIDThreshold.setSelected(av.getAbovePIDThreshold());
579 conservationMenuItem.setSelected(av.getConservationSelected());
580 seqLimits.setSelected(av.getShowJVSuffix());
581 idRightAlign.setSelected(av.rightAlignIds);
582 centreColumnLabelsMenuItem.setState(av.centreColumnLabels);
583 renderGapsMenuItem.setSelected(av.renderGaps);
584 wrapMenuItem.setSelected(av.wrapAlignment);
585 scaleAbove.setVisible(av.wrapAlignment);
586 scaleLeft.setVisible(av.wrapAlignment);
587 scaleRight.setVisible(av.wrapAlignment);
588 annotationPanelMenuItem.setState(av.showAnnotation);
589 viewBoxesMenuItem.setSelected(av.showBoxes);
590 viewTextMenuItem.setSelected(av.showText);
591 showUnconservedMenuItem.setSelected(av.showUnconserved);
592 showGroupConsensus.setSelected(av.showGroupConsensus);
593 showGroupConservation.setSelected(av.showGroupConservation);
594 showConsensusHistogram.setSelected(av.showConsensusHistogram);
595 showSequenceLogo.setSelected(av.showSequenceLogo);
596 setColourSelected(ColourSchemeProperty.getColourName(av
597 .getGlobalColourScheme()));
599 showSeqFeatures.setSelected(av.showSequenceFeatures);
600 hiddenMarkers.setState(av.showHiddenMarkers);
601 applyToAllGroups.setState(av.colourAppliesToAllGroups);
602 showNpFeatsMenuitem.setSelected(av.isShowNpFeats());
603 showDbRefsMenuitem.setSelected(av.isShowDbRefs());
605 setShowProductsEnabled();
610 Hashtable progressBars, progressBarHandlers;
615 * @see jalview.gui.IProgressIndicator#setProgressBar(java.lang.String, long)
617 public void setProgressBar(String message, long id)
619 if (progressBars == null)
621 progressBars = new Hashtable();
622 progressBarHandlers = new Hashtable();
625 JPanel progressPanel;
626 Long lId = new Long(id);
627 GridLayout layout = (GridLayout) statusPanel.getLayout();
628 if (progressBars.get(lId) != null)
630 progressPanel = (JPanel) progressBars.get(new Long(id));
631 statusPanel.remove(progressPanel);
632 progressBars.remove(lId);
633 progressPanel = null;
636 statusBar.setText(message);
638 if (progressBarHandlers.contains(lId))
640 progressBarHandlers.remove(lId);
642 layout.setRows(layout.getRows() - 1);
646 progressPanel = new JPanel(new BorderLayout(10, 5));
648 JProgressBar progressBar = new JProgressBar();
649 progressBar.setIndeterminate(true);
651 progressPanel.add(new JLabel(message), BorderLayout.WEST);
652 progressPanel.add(progressBar, BorderLayout.CENTER);
654 layout.setRows(layout.getRows() + 1);
655 statusPanel.add(progressPanel);
657 progressBars.put(lId, progressPanel);
660 setMenusForViewport();
664 public void registerHandler(final long id,
665 final IProgressIndicatorHandler handler)
667 if (progressBarHandlers == null || !progressBars.contains(new Long(id)))
670 "call setProgressBar before registering the progress bar's handler.");
672 progressBarHandlers.put(new Long(id), handler);
673 final JPanel progressPanel = (JPanel) progressBars.get(new Long(id));
674 if (handler.canCancel())
676 JButton cancel = new JButton("Cancel");
677 final IProgressIndicator us = this;
678 cancel.addActionListener(new ActionListener()
681 public void actionPerformed(ActionEvent e)
683 handler.cancelActivity(id);
684 us.setProgressBar("Cancelled "
685 + ((JLabel) progressPanel.getComponent(0)).getText(), id);
688 progressPanel.add(cancel, BorderLayout.EAST);
694 * @return true if any progress bars are still active
696 public boolean operationInProgress()
698 if (progressBars != null && progressBars.size() > 0)
706 * Added so Castor Mapping file can obtain Jalview Version
708 public String getVersion()
710 return jalview.bin.Cache.getProperty("VERSION");
713 public FeatureRenderer getFeatureRenderer()
715 return alignPanel.seqPanel.seqCanvas.getFeatureRenderer();
718 public void fetchSequence_actionPerformed(ActionEvent e)
720 new SequenceFetcher(this);
723 public void addFromFile_actionPerformed(ActionEvent e)
725 Desktop.instance.inputLocalFileMenuItem_actionPerformed(viewport);
728 public void reload_actionPerformed(ActionEvent e)
730 if (fileName != null)
732 // TODO: work out how to recover feature settings for correct view(s) when
734 if (currentFileFormat.equals("Jalview"))
736 JInternalFrame[] frames = Desktop.desktop.getAllFrames();
737 for (int i = 0; i < frames.length; i++)
739 if (frames[i] instanceof AlignFrame && frames[i] != this
740 && ((AlignFrame) frames[i]).fileName.equals(fileName))
744 frames[i].setSelected(true);
745 Desktop.instance.closeAssociatedWindows();
746 } catch (java.beans.PropertyVetoException ex)
752 Desktop.instance.closeAssociatedWindows();
754 FileLoader loader = new FileLoader();
755 String protocol = fileName.startsWith("http:") ? "URL" : "File";
756 loader.LoadFile(viewport, fileName, protocol, currentFileFormat);
760 Rectangle bounds = this.getBounds();
762 FileLoader loader = new FileLoader();
763 String protocol = fileName.startsWith("http:") ? "URL" : "File";
764 AlignFrame newframe = loader.LoadFileWaitTillLoaded(fileName,
765 protocol, currentFileFormat);
767 newframe.setBounds(bounds);
768 if (featureSettings != null && featureSettings.isShowing())
770 final Rectangle fspos = featureSettings.frame.getBounds();
771 // TODO: need a 'show feature settings' function that takes bounds -
772 // need to refactor Desktop.addFrame
773 newframe.featureSettings_actionPerformed(null);
774 final FeatureSettings nfs = newframe.featureSettings;
775 SwingUtilities.invokeLater(new Runnable()
779 nfs.frame.setBounds(fspos);
782 this.featureSettings.close();
783 this.featureSettings = null;
785 this.closeMenuItem_actionPerformed(true);
790 public void addFromText_actionPerformed(ActionEvent e)
792 Desktop.instance.inputTextboxMenuItem_actionPerformed(viewport);
795 public void addFromURL_actionPerformed(ActionEvent e)
797 Desktop.instance.inputURLMenuItem_actionPerformed(viewport);
800 public void save_actionPerformed(ActionEvent e)
803 || (currentFileFormat == null || !jalview.io.FormatAdapter
804 .isValidIOFormat(currentFileFormat, true))
805 || fileName.startsWith("http"))
807 saveAs_actionPerformed(null);
811 saveAlignment(fileName, currentFileFormat);
821 public void saveAs_actionPerformed(ActionEvent e)
823 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache
824 .getProperty("LAST_DIRECTORY"),
825 jalview.io.AppletFormatAdapter.WRITABLE_EXTENSIONS,
826 jalview.io.AppletFormatAdapter.WRITABLE_FNAMES,
827 currentFileFormat, false);
829 chooser.setFileView(new JalviewFileView());
830 chooser.setDialogTitle("Save Alignment to file");
831 chooser.setToolTipText("Save");
833 int value = chooser.showSaveDialog(this);
835 if (value == JalviewFileChooser.APPROVE_OPTION)
837 currentFileFormat = chooser.getSelectedFormat();
838 if (currentFileFormat == null)
840 JOptionPane.showInternalMessageDialog(Desktop.desktop,
841 "You must select a file format before saving!",
842 "File format not specified", JOptionPane.WARNING_MESSAGE);
843 value = chooser.showSaveDialog(this);
847 fileName = chooser.getSelectedFile().getPath();
849 jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT",
852 jalview.bin.Cache.setProperty("LAST_DIRECTORY", fileName);
853 if (currentFileFormat.indexOf(" ") > -1)
855 currentFileFormat = currentFileFormat.substring(0,
856 currentFileFormat.indexOf(" "));
858 saveAlignment(fileName, currentFileFormat);
862 public boolean saveAlignment(String file, String format)
864 boolean success = true;
866 if (format.equalsIgnoreCase("Jalview"))
868 String shortName = title;
870 if (shortName.indexOf(java.io.File.separatorChar) > -1)
872 shortName = shortName.substring(shortName
873 .lastIndexOf(java.io.File.separatorChar) + 1);
876 success = new Jalview2XML().SaveAlignment(this, file, shortName);
878 statusBar.setText("Successfully saved to file: " + fileName + " in "
879 + format + " format.");
884 if (!jalview.io.AppletFormatAdapter.isValidFormat(format, true))
886 warningMessage("Cannot save file " + fileName + " using format "
887 + format, "Alignment output format not supported");
888 saveAs_actionPerformed(null);
889 // JBPNote need to have a raise_gui flag here
893 String[] omitHidden = null;
895 if (viewport.hasHiddenColumns)
897 int reply = JOptionPane
898 .showInternalConfirmDialog(
900 "The Alignment contains hidden columns."
901 + "\nDo you want to save only the visible alignment?",
902 "Save / Omit Hidden Columns",
903 JOptionPane.YES_NO_OPTION,
904 JOptionPane.QUESTION_MESSAGE);
906 if (reply == JOptionPane.YES_OPTION)
908 omitHidden = viewport.getViewAsString(false);
911 FormatAdapter f = new FormatAdapter();
912 String output = f.formatSequences(format,
913 (Alignment) viewport.alignment, // class cast exceptions will
914 // occur in the distant future
915 omitHidden, f.getCacheSuffixDefault(format), viewport.colSel);
925 java.io.PrintWriter out = new java.io.PrintWriter(
926 new java.io.FileWriter(file));
931 statusBar.setText("Successfully saved to file: " + fileName
932 + " in " + format + " format.");
933 } catch (Exception ex)
936 ex.printStackTrace();
943 JOptionPane.showInternalMessageDialog(this, "Couldn't save file: "
944 + fileName, "Error Saving File", JOptionPane.WARNING_MESSAGE);
950 private void warningMessage(String warning, String title)
952 if (new jalview.util.Platform().isHeadless())
954 System.err.println("Warning: " + title + "\nWarning: " + warning);
959 JOptionPane.showInternalMessageDialog(this, warning, title,
960 JOptionPane.WARNING_MESSAGE);
971 protected void outputText_actionPerformed(ActionEvent e)
973 String[] omitHidden = null;
975 if (viewport.hasHiddenColumns)
977 int reply = JOptionPane
978 .showInternalConfirmDialog(
980 "The Alignment contains hidden columns."
981 + "\nDo you want to output only the visible alignment?",
982 "Save / Omit Hidden Columns",
983 JOptionPane.YES_NO_OPTION,
984 JOptionPane.QUESTION_MESSAGE);
986 if (reply == JOptionPane.YES_OPTION)
988 omitHidden = viewport.getViewAsString(false);
992 CutAndPasteTransfer cap = new CutAndPasteTransfer();
993 cap.setForInput(null);
994 Desktop.addInternalFrame(cap, "Alignment output - "
995 + e.getActionCommand(), 600, 500);
997 cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(),
998 viewport.alignment, omitHidden, viewport.colSel));
1007 protected void htmlMenuItem_actionPerformed(ActionEvent e)
1009 new HTMLOutput(alignPanel, alignPanel.seqPanel.seqCanvas
1010 .getSequenceRenderer(), alignPanel.seqPanel.seqCanvas
1011 .getFeatureRenderer());
1014 public void createImageMap(File file, String image)
1016 alignPanel.makePNGImageMap(file, image);
1025 public void createPNG(File f)
1027 alignPanel.makePNG(f);
1036 public void createEPS(File f)
1038 alignPanel.makeEPS(f);
1041 public void pageSetup_actionPerformed(ActionEvent e)
1043 PrinterJob printJob = PrinterJob.getPrinterJob();
1044 PrintThread.pf = printJob.pageDialog(printJob.defaultPage());
1053 public void printMenuItem_actionPerformed(ActionEvent e)
1055 // Putting in a thread avoids Swing painting problems
1056 PrintThread thread = new PrintThread(alignPanel);
1060 public void exportFeatures_actionPerformed(ActionEvent e)
1062 new AnnotationExporter().exportFeatures(alignPanel);
1065 public void exportAnnotations_actionPerformed(ActionEvent e)
1067 new AnnotationExporter().exportAnnotations(alignPanel,
1068 viewport.showAnnotation ? viewport.alignment
1069 .getAlignmentAnnotation() : null, viewport.alignment
1071 ((Alignment) viewport.alignment).alignmentProperties);
1074 public void associatedData_actionPerformed(ActionEvent e)
1076 // Pick the tree file
1077 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache
1078 .getProperty("LAST_DIRECTORY"));
1079 chooser.setFileView(new JalviewFileView());
1080 chooser.setDialogTitle("Load Jalview Annotations or Features File");
1081 chooser.setToolTipText("Load Jalview Annotations / Features file");
1083 int value = chooser.showOpenDialog(null);
1085 if (value == JalviewFileChooser.APPROVE_OPTION)
1087 String choice = chooser.getSelectedFile().getPath();
1088 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
1089 loadJalviewDataFile(choice);
1095 * Close the current view or all views in the alignment frame. If the frame
1096 * only contains one view then the alignment will be removed from memory.
1098 * @param closeAllTabs
1100 public void closeMenuItem_actionPerformed(boolean closeAllTabs)
1102 if (alignPanels != null && alignPanels.size() < 2)
1104 closeAllTabs = true;
1109 if (alignPanels != null)
1113 if (this.isClosed())
1115 // really close all the windows - otherwise wait till
1116 // setClosed(true) is called
1117 for (int i = 0; i < alignPanels.size(); i++)
1119 AlignmentPanel ap = (AlignmentPanel) alignPanels.elementAt(i);
1126 closeView(alignPanel);
1132 this.setClosed(true);
1134 } catch (Exception ex)
1136 ex.printStackTrace();
1141 * close alignPanel2 and shuffle tabs appropriately.
1143 * @param alignPanel2
1145 public void closeView(AlignmentPanel alignPanel2)
1147 int index = tabbedPane.getSelectedIndex();
1148 int closedindex = tabbedPane.indexOfComponent(alignPanel2);
1149 alignPanels.removeElement(alignPanel2);
1151 // if (viewport == alignPanel2.av)
1155 alignPanel2.closePanel();
1158 tabbedPane.removeTabAt(closedindex);
1159 tabbedPane.validate();
1161 if (index > closedindex || index == tabbedPane.getTabCount())
1163 // modify currently selected tab index if necessary.
1167 this.tabSelectionChanged(index);
1173 void updateEditMenuBar()
1176 if (viewport.historyList.size() > 0)
1178 undoMenuItem.setEnabled(true);
1179 CommandI command = (CommandI) viewport.historyList.peek();
1180 undoMenuItem.setText("Undo " + command.getDescription());
1184 undoMenuItem.setEnabled(false);
1185 undoMenuItem.setText("Undo");
1188 if (viewport.redoList.size() > 0)
1190 redoMenuItem.setEnabled(true);
1192 CommandI command = (CommandI) viewport.redoList.peek();
1193 redoMenuItem.setText("Redo " + command.getDescription());
1197 redoMenuItem.setEnabled(false);
1198 redoMenuItem.setText("Redo");
1202 public void addHistoryItem(CommandI command)
1204 if (command.getSize() > 0)
1206 viewport.historyList.push(command);
1207 viewport.redoList.clear();
1208 updateEditMenuBar();
1209 viewport.hasHiddenColumns = (viewport.colSel != null
1210 && viewport.colSel.getHiddenColumns() != null && viewport.colSel
1211 .getHiddenColumns().size() > 0);
1217 * @return alignment objects for all views
1219 AlignmentI[] getViewAlignments()
1221 if (alignPanels != null)
1223 Enumeration e = alignPanels.elements();
1224 AlignmentI[] als = new AlignmentI[alignPanels.size()];
1225 for (int i = 0; e.hasMoreElements(); i++)
1227 als[i] = ((AlignmentPanel) e.nextElement()).av.getAlignment();
1231 if (viewport != null)
1233 return new AlignmentI[]
1234 { viewport.alignment };
1245 protected void undoMenuItem_actionPerformed(ActionEvent e)
1247 if (viewport.historyList.empty())
1249 CommandI command = (CommandI) viewport.historyList.pop();
1250 viewport.redoList.push(command);
1251 command.undoCommand(getViewAlignments());
1253 AlignViewport originalSource = getOriginatingSource(command);
1254 updateEditMenuBar();
1256 if (originalSource != null)
1258 originalSource.hasHiddenColumns = (viewport.colSel != null
1259 && viewport.colSel.getHiddenColumns() != null && viewport.colSel
1260 .getHiddenColumns().size() > 0);
1261 originalSource.firePropertyChange("alignment", null,
1262 originalSource.alignment.getSequences());
1272 protected void redoMenuItem_actionPerformed(ActionEvent e)
1274 if (viewport.redoList.size() < 1)
1279 CommandI command = (CommandI) viewport.redoList.pop();
1280 viewport.historyList.push(command);
1281 command.doCommand(getViewAlignments());
1283 AlignViewport originalSource = getOriginatingSource(command);
1284 updateEditMenuBar();
1286 if (originalSource != null)
1288 originalSource.hasHiddenColumns = (viewport.colSel != null
1289 && viewport.colSel.getHiddenColumns() != null && viewport.colSel
1290 .getHiddenColumns().size() > 0);
1291 originalSource.firePropertyChange("alignment", null,
1292 originalSource.alignment.getSequences());
1296 AlignViewport getOriginatingSource(CommandI command)
1298 AlignViewport originalSource = null;
1299 // For sequence removal and addition, we need to fire
1300 // the property change event FROM the viewport where the
1301 // original alignment was altered
1302 AlignmentI al = null;
1303 if (command instanceof EditCommand)
1305 EditCommand editCommand = (EditCommand) command;
1306 al = editCommand.getAlignment();
1307 Vector comps = (Vector) PaintRefresher.components.get(viewport
1308 .getSequenceSetId());
1310 for (int i = 0; i < comps.size(); i++)
1312 if (comps.elementAt(i) instanceof AlignmentPanel)
1314 if (al == ((AlignmentPanel) comps.elementAt(i)).av.alignment)
1316 originalSource = ((AlignmentPanel) comps.elementAt(i)).av;
1323 if (originalSource == null)
1325 // The original view is closed, we must validate
1326 // the current view against the closed view first
1329 PaintRefresher.validateSequences(al, viewport.alignment);
1332 originalSource = viewport;
1335 return originalSource;
1344 public void moveSelectedSequences(boolean up)
1346 SequenceGroup sg = viewport.getSelectionGroup();
1355 for (int i = 1; i < viewport.alignment.getHeight(); i++)
1357 SequenceI seq = viewport.alignment.getSequenceAt(i);
1359 if (!sg.getSequences(null).contains(seq))
1364 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
1366 if (sg.getSequences(null).contains(temp))
1371 viewport.alignment.getSequences().setElementAt(temp, i);
1372 viewport.alignment.getSequences().setElementAt(seq, i - 1);
1377 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
1379 SequenceI seq = viewport.alignment.getSequenceAt(i);
1381 if (!sg.getSequences(null).contains(seq))
1386 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
1388 if (sg.getSequences(null).contains(temp))
1393 viewport.alignment.getSequences().setElementAt(temp, i);
1394 viewport.alignment.getSequences().setElementAt(seq, i + 1);
1398 alignPanel.paintAlignment(true);
1401 synchronized void slideSequences(boolean right, int size)
1403 Vector sg = new Vector();
1404 if (viewport.cursorMode)
1406 sg.addElement(viewport.alignment
1407 .getSequenceAt(alignPanel.seqPanel.seqCanvas.cursorY));
1409 else if (viewport.getSelectionGroup() != null
1410 && viewport.getSelectionGroup().getSize() != viewport.alignment
1413 sg = viewport.getSelectionGroup().getSequences(
1414 viewport.hiddenRepSequences);
1422 Vector invertGroup = new Vector();
1424 for (int i = 0; i < viewport.alignment.getHeight(); i++)
1426 if (!sg.contains(viewport.alignment.getSequenceAt(i)))
1427 invertGroup.add(viewport.alignment.getSequenceAt(i));
1430 SequenceI[] seqs1 = new SequenceI[sg.size()];
1431 for (int i = 0; i < sg.size(); i++)
1432 seqs1[i] = (SequenceI) sg.elementAt(i);
1434 SequenceI[] seqs2 = new SequenceI[invertGroup.size()];
1435 for (int i = 0; i < invertGroup.size(); i++)
1436 seqs2[i] = (SequenceI) invertGroup.elementAt(i);
1438 SlideSequencesCommand ssc;
1440 ssc = new SlideSequencesCommand("Slide Sequences", seqs2, seqs1,
1441 size, viewport.getGapCharacter());
1443 ssc = new SlideSequencesCommand("Slide Sequences", seqs1, seqs2,
1444 size, viewport.getGapCharacter());
1446 int groupAdjustment = 0;
1447 if (ssc.getGapsInsertedBegin() && right)
1449 if (viewport.cursorMode)
1450 alignPanel.seqPanel.moveCursor(size, 0);
1452 groupAdjustment = size;
1454 else if (!ssc.getGapsInsertedBegin() && !right)
1456 if (viewport.cursorMode)
1457 alignPanel.seqPanel.moveCursor(-size, 0);
1459 groupAdjustment = -size;
1462 if (groupAdjustment != 0)
1464 viewport.getSelectionGroup().setStartRes(
1465 viewport.getSelectionGroup().getStartRes() + groupAdjustment);
1466 viewport.getSelectionGroup().setEndRes(
1467 viewport.getSelectionGroup().getEndRes() + groupAdjustment);
1470 boolean appendHistoryItem = false;
1471 if (viewport.historyList != null && viewport.historyList.size() > 0
1472 && viewport.historyList.peek() instanceof SlideSequencesCommand)
1474 appendHistoryItem = ssc
1475 .appendSlideCommand((SlideSequencesCommand) viewport.historyList
1479 if (!appendHistoryItem)
1480 addHistoryItem(ssc);
1491 protected void copy_actionPerformed(ActionEvent e)
1494 if (viewport.getSelectionGroup() == null)
1498 // TODO: preserve the ordering of displayed alignment annotation in any
1499 // internal paste (particularly sequence associated annotation)
1500 SequenceI[] seqs = viewport.getSelectionAsNewSequence();
1501 String[] omitHidden = null;
1503 if (viewport.hasHiddenColumns)
1505 omitHidden = viewport.getViewAsString(true);
1508 String output = new FormatAdapter().formatSequences("Fasta", seqs,
1511 StringSelection ss = new StringSelection(output);
1515 jalview.gui.Desktop.internalCopy = true;
1516 // Its really worth setting the clipboard contents
1517 // to empty before setting the large StringSelection!!
1518 Toolkit.getDefaultToolkit().getSystemClipboard().setContents(
1519 new StringSelection(""), null);
1521 Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss,
1523 } catch (OutOfMemoryError er)
1525 new OOMWarning("copying region", er);
1529 Vector hiddenColumns = null;
1530 if (viewport.hasHiddenColumns)
1532 hiddenColumns = new Vector();
1533 int hiddenOffset = viewport.getSelectionGroup().getStartRes();
1534 for (int i = 0; i < viewport.getColumnSelection().getHiddenColumns()
1537 int[] region = (int[]) viewport.getColumnSelection()
1538 .getHiddenColumns().elementAt(i);
1540 hiddenColumns.addElement(new int[]
1541 { region[0] - hiddenOffset, region[1] - hiddenOffset });
1545 Desktop.jalviewClipboard = new Object[]
1546 { seqs, viewport.alignment.getDataset(), hiddenColumns };
1547 statusBar.setText("Copied " + seqs.length + " sequences to clipboard.");
1556 protected void pasteNew_actionPerformed(ActionEvent e)
1567 protected void pasteThis_actionPerformed(ActionEvent e)
1573 * Paste contents of Jalview clipboard
1575 * @param newAlignment
1576 * true to paste to a new alignment, otherwise add to this.
1578 void paste(boolean newAlignment)
1580 boolean externalPaste = true;
1583 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
1584 Transferable contents = c.getContents(this);
1586 if (contents == null)
1594 str = (String) contents.getTransferData(DataFlavor.stringFlavor);
1595 if (str.length() < 1)
1600 format = new IdentifyFile().Identify(str, "Paste");
1602 } catch (OutOfMemoryError er)
1604 new OOMWarning("Out of memory pasting sequences!!", er);
1608 SequenceI[] sequences;
1609 boolean annotationAdded = false;
1610 AlignmentI alignment = null;
1612 if (Desktop.jalviewClipboard != null)
1614 // The clipboard was filled from within Jalview, we must use the
1616 // And dataset from the copied alignment
1617 SequenceI[] newseq = (SequenceI[]) Desktop.jalviewClipboard[0];
1618 // be doubly sure that we create *new* sequence objects.
1619 sequences = new SequenceI[newseq.length];
1620 for (int i = 0; i < newseq.length; i++)
1622 sequences[i] = new Sequence(newseq[i]);
1624 alignment = new Alignment(sequences);
1625 externalPaste = false;
1629 // parse the clipboard as an alignment.
1630 alignment = new FormatAdapter().readFile(str, "Paste", format);
1631 sequences = alignment.getSequencesArray();
1639 if (Desktop.jalviewClipboard != null)
1641 // dataset is inherited
1642 alignment.setDataset((Alignment) Desktop.jalviewClipboard[1]);
1646 // new dataset is constructed
1647 alignment.setDataset(null);
1649 alwidth = alignment.getWidth() + 1;
1653 AlignmentI pastedal = alignment; // preserve pasted alignment object
1654 // Add pasted sequences and dataset into existing alignment.
1655 alignment = viewport.getAlignment();
1656 alwidth = alignment.getWidth() + 1;
1657 // decide if we need to import sequences from an existing dataset
1658 boolean importDs = Desktop.jalviewClipboard != null
1659 && Desktop.jalviewClipboard[1] != alignment.getDataset();
1660 // importDs==true instructs us to copy over new dataset sequences from
1661 // an existing alignment
1662 Vector newDs = (importDs) ? new Vector() : null; // used to create
1663 // minimum dataset set
1665 for (int i = 0; i < sequences.length; i++)
1669 newDs.addElement(null);
1671 SequenceI ds = sequences[i].getDatasetSequence(); // null for a simple
1673 if (importDs && ds != null)
1675 if (!newDs.contains(ds))
1677 newDs.setElementAt(ds, i);
1678 ds = new Sequence(ds);
1679 // update with new dataset sequence
1680 sequences[i].setDatasetSequence(ds);
1684 ds = sequences[newDs.indexOf(ds)].getDatasetSequence();
1689 // copy and derive new dataset sequence
1690 sequences[i] = sequences[i].deriveSequence();
1691 alignment.getDataset().addSequence(
1692 sequences[i].getDatasetSequence());
1693 // TODO: avoid creation of duplicate dataset sequences with a
1694 // 'contains' method using SequenceI.equals()/SequenceI.contains()
1696 alignment.addSequence(sequences[i]); // merges dataset
1700 newDs.clear(); // tidy up
1702 if (pastedal.getAlignmentAnnotation() != null)
1704 // Add any annotation attached to alignment.
1705 AlignmentAnnotation[] alann = pastedal.getAlignmentAnnotation();
1706 for (int i = 0; i < alann.length; i++)
1708 annotationAdded = true;
1709 if (alann[i].sequenceRef == null && !alann[i].autoCalculated)
1711 AlignmentAnnotation newann = new AlignmentAnnotation(alann[i]);
1712 newann.padAnnotation(alwidth);
1713 alignment.addAnnotation(newann);
1723 addHistoryItem(new EditCommand("Add sequences", EditCommand.PASTE,
1724 sequences, 0, alignment.getWidth(), alignment));
1726 // Add any annotations attached to sequences
1727 for (int i = 0; i < sequences.length; i++)
1729 if (sequences[i].getAnnotation() != null)
1731 for (int a = 0; a < sequences[i].getAnnotation().length; a++)
1733 annotationAdded = true;
1734 sequences[i].getAnnotation()[a].adjustForAlignment();
1735 sequences[i].getAnnotation()[a].padAnnotation(alwidth);
1736 alignment.addAnnotation(sequences[i].getAnnotation()[a]); // annotation
1741 .setAnnotationIndex(sequences[i].getAnnotation()[a], a);
1748 // propagate alignment changed.
1749 viewport.setEndSeq(alignment.getHeight());
1750 if (annotationAdded)
1752 // Duplicate sequence annotation in all views.
1753 AlignmentI[] alview = this.getViewAlignments();
1754 for (int i = 0; i < sequences.length; i++)
1756 AlignmentAnnotation sann[] = sequences[i].getAnnotation();
1759 for (int avnum = 0; avnum < alview.length; avnum++)
1761 if (alview[avnum] != alignment)
1763 // duplicate in a view other than the one with input focus
1764 int avwidth = alview[avnum].getWidth() + 1;
1765 // this relies on sann being preserved after we
1766 // modify the sequence's annotation array for each duplication
1767 for (int a = 0; a < sann.length; a++)
1769 AlignmentAnnotation newann = new AlignmentAnnotation(
1771 sequences[i].addAlignmentAnnotation(newann);
1772 newann.padAnnotation(avwidth);
1773 alview[avnum].addAnnotation(newann); // annotation was
1774 // duplicated earlier
1775 alview[avnum].setAnnotationIndex(newann, a);
1780 buildSortByAnnotationScoresMenu();
1782 viewport.firePropertyChange("alignment", null, alignment
1788 AlignFrame af = new AlignFrame(alignment, DEFAULT_WIDTH,
1790 String newtitle = new String("Copied sequences");
1792 if (Desktop.jalviewClipboard != null
1793 && Desktop.jalviewClipboard[2] != null)
1795 Vector hc = (Vector) Desktop.jalviewClipboard[2];
1796 for (int i = 0; i < hc.size(); i++)
1798 int[] region = (int[]) hc.elementAt(i);
1799 af.viewport.hideColumns(region[0], region[1]);
1803 // >>>This is a fix for the moment, until a better solution is
1805 af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer()
1807 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
1809 // TODO: maintain provenance of an alignment, rather than just make the
1810 // title a concatenation of operations.
1813 if (title.startsWith("Copied sequences"))
1819 newtitle = newtitle.concat("- from " + title);
1824 newtitle = new String("Pasted sequences");
1827 Desktop.addInternalFrame(af, newtitle, DEFAULT_WIDTH,
1832 } catch (Exception ex)
1834 ex.printStackTrace();
1835 System.out.println("Exception whilst pasting: " + ex);
1836 // could be anything being pasted in here
1847 protected void cut_actionPerformed(ActionEvent e)
1849 copy_actionPerformed(null);
1850 delete_actionPerformed(null);
1859 protected void delete_actionPerformed(ActionEvent evt)
1862 SequenceGroup sg = viewport.getSelectionGroup();
1868 Vector seqs = new Vector();
1870 for (int i = 0; i < sg.getSize(); i++)
1872 seq = sg.getSequenceAt(i);
1873 seqs.addElement(seq);
1876 // If the cut affects all sequences, remove highlighted columns
1877 if (sg.getSize() == viewport.alignment.getHeight())
1879 viewport.getColumnSelection().removeElements(sg.getStartRes(),
1880 sg.getEndRes() + 1);
1883 SequenceI[] cut = new SequenceI[seqs.size()];
1884 for (int i = 0; i < seqs.size(); i++)
1886 cut[i] = (SequenceI) seqs.elementAt(i);
1890 * //ADD HISTORY ITEM
1892 addHistoryItem(new EditCommand("Cut Sequences", EditCommand.CUT, cut,
1893 sg.getStartRes(), sg.getEndRes() - sg.getStartRes() + 1,
1894 viewport.alignment));
1896 viewport.setSelectionGroup(null);
1897 viewport.sendSelection();
1898 viewport.alignment.deleteGroup(sg);
1900 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
1902 if (viewport.getAlignment().getHeight() < 1)
1906 this.setClosed(true);
1907 } catch (Exception ex)
1919 protected void deleteGroups_actionPerformed(ActionEvent e)
1921 viewport.alignment.deleteAllGroups();
1922 viewport.sequenceColours = null;
1923 viewport.setSelectionGroup(null);
1924 PaintRefresher.Refresh(this, viewport.getSequenceSetId());
1925 alignPanel.updateAnnotation();
1926 alignPanel.paintAlignment(true);
1935 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
1937 SequenceGroup sg = new SequenceGroup();
1939 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
1941 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
1944 sg.setEndRes(viewport.alignment.getWidth() - 1);
1945 viewport.setSelectionGroup(sg);
1946 viewport.sendSelection();
1947 alignPanel.paintAlignment(true);
1948 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1957 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
1959 if (viewport.cursorMode)
1961 alignPanel.seqPanel.keyboardNo1 = null;
1962 alignPanel.seqPanel.keyboardNo2 = null;
1964 viewport.setSelectionGroup(null);
1965 viewport.getColumnSelection().clear();
1966 viewport.setSelectionGroup(null);
1967 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
1968 alignPanel.idPanel.idCanvas.searchResults = null;
1969 alignPanel.paintAlignment(true);
1970 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1979 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
1981 SequenceGroup sg = viewport.getSelectionGroup();
1985 selectAllSequenceMenuItem_actionPerformed(null);
1990 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
1992 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
1995 alignPanel.paintAlignment(true);
1996 viewport.sendSelection();
1997 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
2000 public void invertColSel_actionPerformed(ActionEvent e)
2002 viewport.invertColumnSelection();
2003 alignPanel.paintAlignment(true);
2012 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
2014 trimAlignment(true);
2023 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
2025 trimAlignment(false);
2028 void trimAlignment(boolean trimLeft)
2030 ColumnSelection colSel = viewport.getColumnSelection();
2033 if (colSel.size() > 0)
2037 column = colSel.getMin();
2041 column = colSel.getMax();
2045 if (viewport.getSelectionGroup() != null)
2047 seqs = viewport.getSelectionGroup().getSequencesAsArray(
2048 viewport.hiddenRepSequences);
2052 seqs = viewport.alignment.getSequencesArray();
2055 TrimRegionCommand trimRegion;
2058 trimRegion = new TrimRegionCommand("Remove Left",
2059 TrimRegionCommand.TRIM_LEFT, seqs, column,
2060 viewport.alignment, viewport.colSel,
2061 viewport.selectionGroup);
2062 viewport.setStartRes(0);
2066 trimRegion = new TrimRegionCommand("Remove Right",
2067 TrimRegionCommand.TRIM_RIGHT, seqs, column,
2068 viewport.alignment, viewport.colSel,
2069 viewport.selectionGroup);
2072 statusBar.setText("Removed " + trimRegion.getSize() + " columns.");
2074 addHistoryItem(trimRegion);
2076 Vector groups = viewport.alignment.getGroups();
2078 for (int i = 0; i < groups.size(); i++)
2080 SequenceGroup sg = (SequenceGroup) groups.get(i);
2082 if ((trimLeft && !sg.adjustForRemoveLeft(column))
2083 || (!trimLeft && !sg.adjustForRemoveRight(column)))
2085 viewport.alignment.deleteGroup(sg);
2089 viewport.firePropertyChange("alignment", null, viewport
2090 .getAlignment().getSequences());
2100 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
2102 int start = 0, end = viewport.alignment.getWidth() - 1;
2105 if (viewport.getSelectionGroup() != null)
2107 seqs = viewport.getSelectionGroup().getSequencesAsArray(
2108 viewport.hiddenRepSequences);
2109 start = viewport.getSelectionGroup().getStartRes();
2110 end = viewport.getSelectionGroup().getEndRes();
2114 seqs = viewport.alignment.getSequencesArray();
2117 RemoveGapColCommand removeGapCols = new RemoveGapColCommand(
2118 "Remove Gapped Columns", seqs, start, end, viewport.alignment);
2120 addHistoryItem(removeGapCols);
2122 statusBar.setText("Removed " + removeGapCols.getSize()
2123 + " empty columns.");
2125 // This is to maintain viewport position on first residue
2126 // of first sequence
2127 SequenceI seq = viewport.alignment.getSequenceAt(0);
2128 int startRes = seq.findPosition(viewport.startRes);
2129 // ShiftList shifts;
2130 // viewport.getAlignment().removeGaps(shifts=new ShiftList());
2131 // edit.alColumnChanges=shifts.getInverse();
2132 // if (viewport.hasHiddenColumns)
2133 // viewport.getColumnSelection().compensateForEdits(shifts);
2134 viewport.setStartRes(seq.findIndex(startRes) - 1);
2135 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
2146 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
2148 int start = 0, end = viewport.alignment.getWidth() - 1;
2151 if (viewport.getSelectionGroup() != null)
2153 seqs = viewport.getSelectionGroup().getSequencesAsArray(
2154 viewport.hiddenRepSequences);
2155 start = viewport.getSelectionGroup().getStartRes();
2156 end = viewport.getSelectionGroup().getEndRes();
2160 seqs = viewport.alignment.getSequencesArray();
2163 // This is to maintain viewport position on first residue
2164 // of first sequence
2165 SequenceI seq = viewport.alignment.getSequenceAt(0);
2166 int startRes = seq.findPosition(viewport.startRes);
2168 addHistoryItem(new RemoveGapsCommand("Remove Gaps", seqs, start, end,
2169 viewport.alignment));
2171 viewport.setStartRes(seq.findIndex(startRes) - 1);
2173 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
2184 public void padGapsMenuitem_actionPerformed(ActionEvent e)
2186 viewport.padGaps = padGapsMenuitem.isSelected();
2187 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
2193 // if (justifySeqs>0)
2195 // alignment.justify(justifySeqs!=RIGHT_JUSTIFY);
2207 public void findMenuItem_actionPerformed(ActionEvent e)
2212 public void newView_actionPerformed(ActionEvent e)
2214 AlignmentPanel newap = new Jalview2XML().copyAlignPanel(alignPanel,
2217 newap.av.gatherViewsHere = false;
2219 if (viewport.viewName == null)
2221 viewport.viewName = "Original";
2224 newap.av.historyList = viewport.historyList;
2225 newap.av.redoList = viewport.redoList;
2227 int index = Desktop.getViewCount(viewport.getSequenceSetId());
2228 String newViewName = "View " + index;
2230 Vector comps = (Vector) PaintRefresher.components.get(viewport
2231 .getSequenceSetId());
2232 Vector existingNames = new Vector();
2233 for (int i = 0; i < comps.size(); i++)
2235 if (comps.elementAt(i) instanceof AlignmentPanel)
2237 AlignmentPanel ap = (AlignmentPanel) comps.elementAt(i);
2238 if (!existingNames.contains(ap.av.viewName))
2240 existingNames.addElement(ap.av.viewName);
2245 while (existingNames.contains(newViewName))
2247 newViewName = "View " + (++index);
2250 newap.av.viewName = newViewName;
2252 addAlignmentPanel(newap, true);
2254 if (alignPanels.size() == 2)
2256 viewport.gatherViewsHere = true;
2258 tabbedPane.setSelectedIndex(tabbedPane.getTabCount() - 1);
2261 public void expandViews_actionPerformed(ActionEvent e)
2263 Desktop.instance.explodeViews(this);
2266 public void gatherViews_actionPerformed(ActionEvent e)
2268 Desktop.instance.gatherViews(this);
2277 public void font_actionPerformed(ActionEvent e)
2279 new FontChooser(alignPanel);
2288 protected void seqLimit_actionPerformed(ActionEvent e)
2290 viewport.setShowJVSuffix(seqLimits.isSelected());
2292 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel
2293 .calculateIdWidth());
2294 alignPanel.paintAlignment(true);
2297 public void idRightAlign_actionPerformed(ActionEvent e)
2299 viewport.rightAlignIds = idRightAlign.isSelected();
2300 alignPanel.paintAlignment(true);
2303 public void centreColumnLabels_actionPerformed(ActionEvent e)
2305 viewport.centreColumnLabels = centreColumnLabelsMenuItem.getState();
2306 alignPanel.paintAlignment(true);
2312 * @see jalview.jbgui.GAlignFrame#followHighlight_actionPerformed()
2314 protected void followHighlight_actionPerformed()
2316 if (viewport.followHighlight = this.followHighlightMenuItem.getState())
2318 alignPanel.scrollToPosition(
2319 alignPanel.seqPanel.seqCanvas.searchResults, false);
2329 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
2331 viewport.setColourText(colourTextMenuItem.isSelected());
2332 alignPanel.paintAlignment(true);
2341 public void wrapMenuItem_actionPerformed(ActionEvent e)
2343 scaleAbove.setVisible(wrapMenuItem.isSelected());
2344 scaleLeft.setVisible(wrapMenuItem.isSelected());
2345 scaleRight.setVisible(wrapMenuItem.isSelected());
2346 viewport.setWrapAlignment(wrapMenuItem.isSelected());
2347 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
2350 public void showAllSeqs_actionPerformed(ActionEvent e)
2352 viewport.showAllHiddenSeqs();
2355 public void showAllColumns_actionPerformed(ActionEvent e)
2357 viewport.showAllHiddenColumns();
2361 public void hideSelSequences_actionPerformed(ActionEvent e)
2363 viewport.hideAllSelectedSeqs();
2364 alignPanel.paintAlignment(true);
2368 * called by key handler and the hide all/show all menu items
2373 private void toggleHiddenRegions(boolean toggleSeqs, boolean toggleCols)
2376 boolean hide = false;
2377 SequenceGroup sg = viewport.getSelectionGroup();
2378 if (!toggleSeqs && !toggleCols)
2380 // Hide everything by the current selection - this is a hack - we do the
2381 // invert and then hide
2382 // first check that there will be visible columns after the invert.
2383 if ((viewport.colSel != null && viewport.colSel.getSelected() != null && viewport.colSel
2384 .getSelected().size() > 0)
2385 || (sg != null && sg.getSize() > 0 && sg.getStartRes() <= sg
2388 // now invert the sequence set, if required - empty selection implies
2389 // that no hiding is required.
2392 invertSequenceMenuItem_actionPerformed(null);
2393 sg = viewport.getSelectionGroup();
2397 viewport.expandColSelection(sg, true);
2398 // finally invert the column selection and get the new sequence
2400 invertColSel_actionPerformed(null);
2407 if (sg != null && sg.getSize() != viewport.alignment.getHeight())
2409 hideSelSequences_actionPerformed(null);
2412 else if (!(toggleCols && viewport.colSel.getSelected().size() > 0))
2414 showAllSeqs_actionPerformed(null);
2420 if (viewport.colSel.getSelected().size() > 0)
2422 hideSelColumns_actionPerformed(null);
2425 viewport.selectionGroup = sg;
2430 showAllColumns_actionPerformed(null);
2439 * jalview.jbgui.GAlignFrame#hideAllButSelection_actionPerformed(java.awt.
2440 * event.ActionEvent)
2442 public void hideAllButSelection_actionPerformed(ActionEvent e)
2444 toggleHiddenRegions(false, false);
2451 * jalview.jbgui.GAlignFrame#hideAllSelection_actionPerformed(java.awt.event
2454 public void hideAllSelection_actionPerformed(ActionEvent e)
2456 SequenceGroup sg = viewport.getSelectionGroup();
2457 viewport.expandColSelection(sg, false);
2458 viewport.hideAllSelectedSeqs();
2459 viewport.hideSelectedColumns();
2460 alignPanel.paintAlignment(true);
2467 * jalview.jbgui.GAlignFrame#showAllhidden_actionPerformed(java.awt.event.
2470 public void showAllhidden_actionPerformed(ActionEvent e)
2472 viewport.showAllHiddenColumns();
2473 viewport.showAllHiddenSeqs();
2474 alignPanel.paintAlignment(true);
2477 public void hideSelColumns_actionPerformed(ActionEvent e)
2479 viewport.hideSelectedColumns();
2480 alignPanel.paintAlignment(true);
2483 public void hiddenMarkers_actionPerformed(ActionEvent e)
2485 viewport.setShowHiddenMarkers(hiddenMarkers.isSelected());
2495 protected void scaleAbove_actionPerformed(ActionEvent e)
2497 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
2498 alignPanel.paintAlignment(true);
2507 protected void scaleLeft_actionPerformed(ActionEvent e)
2509 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
2510 alignPanel.paintAlignment(true);
2519 protected void scaleRight_actionPerformed(ActionEvent e)
2521 viewport.setScaleRightWrapped(scaleRight.isSelected());
2522 alignPanel.paintAlignment(true);
2531 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
2533 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
2534 alignPanel.paintAlignment(true);
2543 public void viewTextMenuItem_actionPerformed(ActionEvent e)
2545 viewport.setShowText(viewTextMenuItem.isSelected());
2546 alignPanel.paintAlignment(true);
2555 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
2557 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
2558 alignPanel.paintAlignment(true);
2561 public FeatureSettings featureSettings;
2563 public void featureSettings_actionPerformed(ActionEvent e)
2565 if (featureSettings != null)
2567 featureSettings.close();
2568 featureSettings = null;
2570 if (!showSeqFeatures.isSelected())
2572 // make sure features are actually displayed
2573 showSeqFeatures.setSelected(true);
2574 showSeqFeatures_actionPerformed(null);
2576 featureSettings = new FeatureSettings(this);
2580 * Set or clear 'Show Sequence Features'
2585 public void showSeqFeatures_actionPerformed(ActionEvent evt)
2587 viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());
2588 alignPanel.paintAlignment(true);
2589 if (alignPanel.getOverviewPanel() != null)
2591 alignPanel.getOverviewPanel().updateOverviewImage();
2596 * Set or clear 'Show Sequence Features'
2601 public void showSeqFeaturesHeight_actionPerformed(ActionEvent evt)
2603 viewport.setShowSequenceFeaturesHeight(showSeqFeaturesHeight
2605 if (viewport.getShowSequenceFeaturesHeight())
2607 // ensure we're actually displaying features
2608 viewport.setShowSequenceFeatures(true);
2609 showSeqFeatures.setSelected(true);
2611 alignPanel.paintAlignment(true);
2612 if (alignPanel.getOverviewPanel() != null)
2614 alignPanel.getOverviewPanel().updateOverviewImage();
2624 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
2626 viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
2627 alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
2630 public void alignmentProperties()
2632 JEditorPane editPane = new JEditorPane("text/html", "");
2633 editPane.setEditable(false);
2634 StringBuffer contents = new StringBuffer("<html>");
2637 int min = Integer.MAX_VALUE, max = 0;
2638 for (int i = 0; i < viewport.alignment.getHeight(); i++)
2640 int size = viewport.alignment.getSequenceAt(i).getEnd()
2641 - viewport.alignment.getSequenceAt(i).getStart();
2648 avg = avg / (float) viewport.alignment.getHeight();
2650 contents.append("<br>Sequences: " + viewport.alignment.getHeight());
2651 contents.append("<br>Minimum Sequence Length: " + min);
2652 contents.append("<br>Maximum Sequence Length: " + max);
2653 contents.append("<br>Average Length: " + (int) avg);
2655 if (((Alignment) viewport.alignment).getProperties() != null)
2657 Hashtable props = ((Alignment) viewport.alignment).getProperties();
2658 Enumeration en = props.keys();
2659 contents.append("<br><br><table border=\"1\">");
2660 while (en.hasMoreElements())
2662 String key = en.nextElement().toString();
2663 StringBuffer val = new StringBuffer();
2664 String vals = props.get(key).toString();
2668 npos = vals.indexOf("\n", pos);
2671 val.append(vals.substring(pos));
2675 val.append(vals.substring(pos, npos));
2679 } while (npos != -1);
2681 .append("<tr><td>" + key + "</td><td>" + val + "</td></tr>");
2683 contents.append("</table>");
2685 editPane.setText(contents.toString() + "</html>");
2686 JInternalFrame frame = new JInternalFrame();
2687 frame.getContentPane().add(new JScrollPane(editPane));
2689 Desktop.instance.addInternalFrame(frame, "Alignment Properties: "
2690 + getTitle(), 500, 400);
2699 public void overviewMenuItem_actionPerformed(ActionEvent e)
2701 if (alignPanel.overviewPanel != null)
2706 JInternalFrame frame = new JInternalFrame();
2707 OverviewPanel overview = new OverviewPanel(alignPanel);
2708 frame.setContentPane(overview);
2709 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(), frame
2710 .getWidth(), frame.getHeight());
2712 frame.setLayer(JLayeredPane.PALETTE_LAYER);
2714 .addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
2716 public void internalFrameClosed(
2717 javax.swing.event.InternalFrameEvent evt)
2719 alignPanel.setOverviewPanel(null);
2723 alignPanel.setOverviewPanel(overview);
2726 public void textColour_actionPerformed(ActionEvent e)
2728 new TextColourChooser().chooseColour(alignPanel, null);
2737 protected void noColourmenuItem_actionPerformed(ActionEvent e)
2748 public void clustalColour_actionPerformed(ActionEvent e)
2750 changeColour(new ClustalxColourScheme(
2751 viewport.alignment.getSequences(), viewport.alignment
2761 public void zappoColour_actionPerformed(ActionEvent e)
2763 changeColour(new ZappoColourScheme());
2772 public void taylorColour_actionPerformed(ActionEvent e)
2774 changeColour(new TaylorColourScheme());
2783 public void hydrophobicityColour_actionPerformed(ActionEvent e)
2785 changeColour(new HydrophobicColourScheme());
2794 public void helixColour_actionPerformed(ActionEvent e)
2796 changeColour(new HelixColourScheme());
2805 public void strandColour_actionPerformed(ActionEvent e)
2807 changeColour(new StrandColourScheme());
2816 public void turnColour_actionPerformed(ActionEvent e)
2818 changeColour(new TurnColourScheme());
2827 public void buriedColour_actionPerformed(ActionEvent e)
2829 changeColour(new BuriedColourScheme());
2838 public void nucleotideColour_actionPerformed(ActionEvent e)
2840 changeColour(new NucleotideColourScheme());
2843 public void annotationColour_actionPerformed(ActionEvent e)
2845 new AnnotationColourChooser(viewport, alignPanel);
2854 protected void applyToAllGroups_actionPerformed(ActionEvent e)
2856 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
2865 public void changeColour(ColourSchemeI cs)
2871 if (viewport.getAbovePIDThreshold())
2873 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
2876 cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());
2878 viewport.setGlobalColourScheme(cs);
2882 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
2885 if (viewport.getConservationSelected())
2888 Alignment al = (Alignment) viewport.alignment;
2889 Conservation c = new Conservation("All",
2890 ResidueProperties.propHash, 3, al.getSequences(), 0, al
2894 c.verdict(false, viewport.ConsPercGaps);
2896 cs.setConservation(c);
2898 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel,
2903 cs.setConservation(null);
2906 cs.setConsensus(viewport.hconsensus);
2909 viewport.setGlobalColourScheme(cs);
2911 if (viewport.getColourAppliesToAllGroups())
2913 Vector groups = viewport.alignment.getGroups();
2915 for (int i = 0; i < groups.size(); i++)
2917 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
2925 if (cs instanceof ClustalxColourScheme)
2927 sg.cs = new ClustalxColourScheme(sg
2928 .getSequences(viewport.hiddenRepSequences), sg.getWidth());
2930 else if (cs instanceof UserColourScheme)
2932 sg.cs = new UserColourScheme(((UserColourScheme) cs).getColours());
2938 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
2939 } catch (Exception ex)
2944 if (viewport.getAbovePIDThreshold()
2945 || cs instanceof PIDColourScheme
2946 || cs instanceof Blosum62ColourScheme)
2948 sg.cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());
2950 sg.cs.setConsensus(AAFrequency.calculate(sg
2951 .getSequences(viewport.hiddenRepSequences), sg
2952 .getStartRes(), sg.getEndRes() + 1));
2956 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
2959 if (viewport.getConservationSelected())
2961 Conservation c = new Conservation("Group",
2962 ResidueProperties.propHash, 3, sg
2963 .getSequences(viewport.hiddenRepSequences), sg
2964 .getStartRes(), sg.getEndRes() + 1);
2966 c.verdict(false, viewport.ConsPercGaps);
2967 sg.cs.setConservation(c);
2971 sg.cs.setConservation(null);
2976 if (alignPanel.getOverviewPanel() != null)
2978 alignPanel.getOverviewPanel().updateOverviewImage();
2981 alignPanel.paintAlignment(true);
2990 protected void modifyPID_actionPerformed(ActionEvent e)
2992 if (viewport.getAbovePIDThreshold()
2993 && viewport.globalColourScheme != null)
2995 SliderPanel.setPIDSliderSource(alignPanel, viewport
2996 .getGlobalColourScheme(), "Background");
2997 SliderPanel.showPIDSlider();
3007 protected void modifyConservation_actionPerformed(ActionEvent e)
3009 if (viewport.getConservationSelected()
3010 && viewport.globalColourScheme != null)
3012 SliderPanel.setConservationSlider(alignPanel,
3013 viewport.globalColourScheme, "Background");
3014 SliderPanel.showConservationSlider();
3024 protected void conservationMenuItem_actionPerformed(ActionEvent e)
3026 viewport.setConservationSelected(conservationMenuItem.isSelected());
3028 viewport.setAbovePIDThreshold(false);
3029 abovePIDThreshold.setSelected(false);
3031 changeColour(viewport.getGlobalColourScheme());
3033 modifyConservation_actionPerformed(null);
3042 public void abovePIDThreshold_actionPerformed(ActionEvent e)
3044 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
3046 conservationMenuItem.setSelected(false);
3047 viewport.setConservationSelected(false);
3049 changeColour(viewport.getGlobalColourScheme());
3051 modifyPID_actionPerformed(null);
3060 public void userDefinedColour_actionPerformed(ActionEvent e)
3062 if (e.getActionCommand().equals("User Defined..."))
3064 new UserDefinedColours(alignPanel, null);
3068 UserColourScheme udc = (UserColourScheme) UserDefinedColours
3069 .getUserColourSchemes().get(e.getActionCommand());
3075 public void updateUserColourMenu()
3078 Component[] menuItems = colourMenu.getMenuComponents();
3079 int i, iSize = menuItems.length;
3080 for (i = 0; i < iSize; i++)
3082 if (menuItems[i].getName() != null
3083 && menuItems[i].getName().equals("USER_DEFINED"))
3085 colourMenu.remove(menuItems[i]);
3089 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
3091 java.util.Enumeration userColours = jalview.gui.UserDefinedColours
3092 .getUserColourSchemes().keys();
3094 while (userColours.hasMoreElements())
3096 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(
3097 userColours.nextElement().toString());
3098 radioItem.setName("USER_DEFINED");
3099 radioItem.addMouseListener(new MouseAdapter()
3101 public void mousePressed(MouseEvent evt)
3103 if (evt.isControlDown()
3104 || SwingUtilities.isRightMouseButton(evt))
3107 .removeActionListener(radioItem.getActionListeners()[0]);
3109 int option = JOptionPane.showInternalConfirmDialog(
3110 jalview.gui.Desktop.desktop,
3111 "Remove from default list?",
3112 "Remove user defined colour",
3113 JOptionPane.YES_NO_OPTION);
3114 if (option == JOptionPane.YES_OPTION)
3116 jalview.gui.UserDefinedColours
3117 .removeColourFromDefaults(radioItem.getText());
3118 colourMenu.remove(radioItem);
3122 radioItem.addActionListener(new ActionListener()
3124 public void actionPerformed(ActionEvent evt)
3126 userDefinedColour_actionPerformed(evt);
3133 radioItem.addActionListener(new ActionListener()
3135 public void actionPerformed(ActionEvent evt)
3137 userDefinedColour_actionPerformed(evt);
3141 colourMenu.insert(radioItem, 15);
3142 colours.add(radioItem);
3153 public void PIDColour_actionPerformed(ActionEvent e)
3155 changeColour(new PIDColourScheme());
3164 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
3166 changeColour(new Blosum62ColourScheme());
3175 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
3177 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
3178 AlignmentSorter.sortByPID(viewport.getAlignment(), viewport
3179 .getAlignment().getSequenceAt(0), null);
3180 addHistoryItem(new OrderCommand("Pairwise Sort", oldOrder,
3181 viewport.alignment));
3182 alignPanel.paintAlignment(true);
3191 public void sortIDMenuItem_actionPerformed(ActionEvent e)
3193 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
3194 AlignmentSorter.sortByID(viewport.getAlignment());
3195 addHistoryItem(new OrderCommand("ID Sort", oldOrder, viewport.alignment));
3196 alignPanel.paintAlignment(true);
3205 public void sortLengthMenuItem_actionPerformed(ActionEvent e)
3207 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
3208 AlignmentSorter.sortByLength(viewport.getAlignment());
3209 addHistoryItem(new OrderCommand("Length Sort", oldOrder,
3210 viewport.alignment));
3211 alignPanel.paintAlignment(true);
3220 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
3222 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
3223 AlignmentSorter.sortByGroup(viewport.getAlignment());
3224 addHistoryItem(new OrderCommand("Group Sort", oldOrder,
3225 viewport.alignment));
3227 alignPanel.paintAlignment(true);
3236 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
3238 new RedundancyPanel(alignPanel, this);
3247 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
3249 if ((viewport.getSelectionGroup() == null)
3250 || (viewport.getSelectionGroup().getSize() < 2))
3252 JOptionPane.showInternalMessageDialog(this,
3253 "You must select at least 2 sequences.", "Invalid Selection",
3254 JOptionPane.WARNING_MESSAGE);
3258 JInternalFrame frame = new JInternalFrame();
3259 frame.setContentPane(new PairwiseAlignPanel(viewport));
3260 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
3270 public void PCAMenuItem_actionPerformed(ActionEvent e)
3272 if (((viewport.getSelectionGroup() != null)
3273 && (viewport.getSelectionGroup().getSize() < 4) && (viewport
3274 .getSelectionGroup().getSize() > 0))
3275 || (viewport.getAlignment().getHeight() < 4))
3277 JOptionPane.showInternalMessageDialog(this,
3278 "Principal component analysis must take\n"
3279 + "at least 4 input sequences.",
3280 "Sequence selection insufficient",
3281 JOptionPane.WARNING_MESSAGE);
3286 new PCAPanel(alignPanel);
3289 public void autoCalculate_actionPerformed(ActionEvent e)
3291 viewport.autoCalculateConsensus = autoCalculate.isSelected();
3292 if (viewport.autoCalculateConsensus)
3294 viewport.firePropertyChange("alignment", null, viewport
3295 .getAlignment().getSequences());
3305 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
3307 NewTreePanel("AV", "PID", "Average distance tree using PID");
3316 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
3318 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
3327 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
3329 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
3338 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
3340 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
3353 void NewTreePanel(String type, String pwType, String title)
3357 if (viewport.getSelectionGroup() != null)
3359 if (viewport.getSelectionGroup().getSize() < 3)
3364 "You need to have more than two sequences selected to build a tree!",
3365 "Not enough sequences", JOptionPane.WARNING_MESSAGE);
3370 SequenceGroup sg = viewport.getSelectionGroup();
3372 /* Decide if the selection is a column region */
3373 while (s < sg.getSize())
3375 if (((SequenceI) sg.getSequences(null).elementAt(s++)).getLength() < sg
3381 "The selected region to create a tree may\nonly contain residues or gaps.\n"
3382 + "Try using the Pad function in the edit menu,\n"
3383 + "or one of the multiple sequence alignment web services.",
3384 "Sequences in selection are not aligned",
3385 JOptionPane.WARNING_MESSAGE);
3391 title = title + " on region";
3392 tp = new TreePanel(alignPanel, type, pwType);
3396 // are the visible sequences aligned?
3397 if (!viewport.alignment.isAligned(false))
3402 "The sequences must be aligned before creating a tree.\n"
3403 + "Try using the Pad function in the edit menu,\n"
3404 + "or one of the multiple sequence alignment web services.",
3405 "Sequences not aligned",
3406 JOptionPane.WARNING_MESSAGE);
3411 if (viewport.alignment.getHeight() < 2)
3416 tp = new TreePanel(alignPanel, type, pwType);
3421 if (viewport.viewName != null)
3423 title += viewport.viewName + " of ";
3426 title += this.title;
3428 Desktop.addInternalFrame(tp, title, 600, 500);
3439 public void addSortByOrderMenuItem(String title,
3440 final AlignmentOrder order)
3442 final JMenuItem item = new JMenuItem("by " + title);
3444 item.addActionListener(new java.awt.event.ActionListener()
3446 public void actionPerformed(ActionEvent e)
3448 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
3450 // TODO: JBPNote - have to map order entries to curent SequenceI
3452 AlignmentSorter.sortBy(viewport.getAlignment(), order);
3454 addHistoryItem(new OrderCommand(order.getName(), oldOrder,
3455 viewport.alignment));
3457 alignPanel.paintAlignment(true);
3463 * Add a new sort by annotation score menu item
3466 * the menu to add the option to
3468 * the label used to retrieve scores for each sequence on the
3471 public void addSortByAnnotScoreMenuItem(JMenu sort,
3472 final String scoreLabel)
3474 final JMenuItem item = new JMenuItem(scoreLabel);
3476 item.addActionListener(new java.awt.event.ActionListener()
3478 public void actionPerformed(ActionEvent e)
3480 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
3481 AlignmentSorter.sortByAnnotationScore(scoreLabel, viewport
3482 .getAlignment());// ,viewport.getSelectionGroup());
3483 addHistoryItem(new OrderCommand("Sort by " + scoreLabel, oldOrder,
3484 viewport.alignment));
3485 alignPanel.paintAlignment(true);
3491 * last hash for alignment's annotation array - used to minimise cost of
3494 protected int _annotationScoreVectorHash;
3497 * search the alignment and rebuild the sort by annotation score submenu the
3498 * last alignment annotation vector hash is stored to minimize cost of
3499 * rebuilding in subsequence calls.
3502 public void buildSortByAnnotationScoresMenu()
3504 if (viewport.alignment.getAlignmentAnnotation() == null)
3509 if (viewport.alignment.getAlignmentAnnotation().hashCode() != _annotationScoreVectorHash)
3511 sortByAnnotScore.removeAll();
3512 // almost certainly a quicker way to do this - but we keep it simple
3513 Hashtable scoreSorts = new Hashtable();
3514 AlignmentAnnotation aann[];
3515 Enumeration sq = viewport.alignment.getSequences().elements();
3516 while (sq.hasMoreElements())
3518 aann = ((SequenceI) sq.nextElement()).getAnnotation();
3519 for (int i = 0; aann != null && i < aann.length; i++)
3521 if (aann[i].hasScore() && aann[i].sequenceRef != null)
3523 scoreSorts.put(aann[i].label, aann[i].label);
3527 Enumeration labels = scoreSorts.keys();
3528 while (labels.hasMoreElements())
3530 addSortByAnnotScoreMenuItem(sortByAnnotScore, (String) labels
3533 sortByAnnotScore.setVisible(scoreSorts.size() > 0);
3536 _annotationScoreVectorHash = viewport.alignment
3537 .getAlignmentAnnotation().hashCode();
3542 * Maintain the Order by->Displayed Tree menu. Creates a new menu item for a
3543 * TreePanel with an appropriate <code>jalview.analysis.AlignmentSorter</code>
3544 * call. Listeners are added to remove the menu item when the treePanel is
3545 * closed, and adjust the tree leaf to sequence mapping when the alignment is
3549 * Displayed tree window.
3551 * SortBy menu item title.
3553 public void buildTreeMenu()
3555 sortByTreeMenu.removeAll();
3557 Vector comps = (Vector) PaintRefresher.components.get(viewport
3558 .getSequenceSetId());
3559 Vector treePanels = new Vector();
3560 int i, iSize = comps.size();
3561 for (i = 0; i < iSize; i++)
3563 if (comps.elementAt(i) instanceof TreePanel)
3565 treePanels.add(comps.elementAt(i));
3569 iSize = treePanels.size();
3573 sortByTreeMenu.setVisible(false);
3577 sortByTreeMenu.setVisible(true);
3579 for (i = 0; i < treePanels.size(); i++)
3581 TreePanel tp = (TreePanel) treePanels.elementAt(i);
3582 final JMenuItem item = new JMenuItem(tp.getTitle());
3583 final NJTree tree = ((TreePanel) treePanels.elementAt(i)).getTree();
3584 item.addActionListener(new java.awt.event.ActionListener()
3586 public void actionPerformed(ActionEvent e)
3588 SequenceI[] oldOrder = viewport.getAlignment()
3589 .getSequencesArray();
3590 AlignmentSorter.sortByTree(viewport.getAlignment(), tree);
3592 addHistoryItem(new OrderCommand("Tree Sort", oldOrder,
3593 viewport.alignment));
3595 alignPanel.paintAlignment(true);
3599 sortByTreeMenu.add(item);
3604 * Work out whether the whole set of sequences or just the selected set will
3605 * be submitted for multiple alignment.
3608 public jalview.datamodel.AlignmentView gatherSequencesForAlignment()
3610 // Now, check we have enough sequences
3611 AlignmentView msa = null;
3613 if ((viewport.getSelectionGroup() != null)
3614 && (viewport.getSelectionGroup().getSize() > 1))
3616 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to
3617 // some common interface!
3619 * SequenceGroup seqs = viewport.getSelectionGroup(); int sz; msa = new
3620 * SequenceI[sz = seqs.getSize(false)];
3622 * for (int i = 0; i < sz; i++) { msa[i] = (SequenceI)
3623 * seqs.getSequenceAt(i); }
3625 msa = viewport.getAlignmentView(true);
3630 * Vector seqs = viewport.getAlignment().getSequences();
3632 * if (seqs.size() > 1) { msa = new SequenceI[seqs.size()];
3634 * for (int i = 0; i < seqs.size(); i++) { msa[i] = (SequenceI)
3635 * seqs.elementAt(i); } }
3637 msa = viewport.getAlignmentView(false);
3643 * Decides what is submitted to a secondary structure prediction service: the
3644 * first sequence in the alignment, or in the current selection, or, if the
3645 * alignment is 'aligned' (ie padded with gaps), then the currently selected
3646 * region or the whole alignment. (where the first sequence in the set is the
3647 * one that the prediction will be for).
3649 public AlignmentView gatherSeqOrMsaForSecStrPrediction()
3651 AlignmentView seqs = null;
3653 if ((viewport.getSelectionGroup() != null)
3654 && (viewport.getSelectionGroup().getSize() > 0))
3656 seqs = viewport.getAlignmentView(true);
3660 seqs = viewport.getAlignmentView(false);
3662 // limit sequences - JBPNote in future - could spawn multiple prediction
3664 // TODO: viewport.alignment.isAligned is a global state - the local
3665 // selection may well be aligned - we preserve 2.0.8 behaviour for moment.
3666 if (!viewport.alignment.isAligned(false))
3668 seqs.setSequences(new SeqCigar[]
3669 { seqs.getSequences()[0] });
3670 // TODO: if seqs.getSequences().length>1 then should really have warned
3683 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
3685 // Pick the tree file
3686 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache
3687 .getProperty("LAST_DIRECTORY"));
3688 chooser.setFileView(new JalviewFileView());
3689 chooser.setDialogTitle("Select a newick-like tree file");
3690 chooser.setToolTipText("Load a tree file");
3692 int value = chooser.showOpenDialog(null);
3694 if (value == JalviewFileChooser.APPROVE_OPTION)
3696 String choice = chooser.getSelectedFile().getPath();
3697 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
3698 jalview.io.NewickFile fin = null;
3701 fin = new jalview.io.NewickFile(choice, "File");
3702 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
3703 } catch (Exception ex)
3705 JOptionPane.showMessageDialog(Desktop.desktop, ex.getMessage(),
3706 "Problem reading tree file", JOptionPane.WARNING_MESSAGE);
3707 ex.printStackTrace();
3709 if (fin != null && fin.hasWarningMessage())
3711 JOptionPane.showMessageDialog(Desktop.desktop, fin
3712 .getWarningMessage(), "Possible problem with tree file",
3713 JOptionPane.WARNING_MESSAGE);
3718 public TreePanel ShowNewickTree(NewickFile nf, String title)
3720 return ShowNewickTree(nf, title, 600, 500, 4, 5);
3723 public TreePanel ShowNewickTree(NewickFile nf, String title,
3724 AlignmentView input)
3726 return ShowNewickTree(nf, title, input, 600, 500, 4, 5);
3729 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,
3730 int h, int x, int y)
3732 return ShowNewickTree(nf, title, null, w, h, x, y);
3736 * Add a treeviewer for the tree extracted from a newick file object to the
3737 * current alignment view
3744 * Associated alignment input data (or null)
3753 * @return TreePanel handle
3755 public TreePanel ShowNewickTree(NewickFile nf, String title,
3756 AlignmentView input, int w, int h, int x, int y)
3758 TreePanel tp = null;
3764 if (nf.getTree() != null)
3766 tp = new TreePanel(alignPanel, "FromFile", title, nf, input);
3772 tp.setLocation(x, y);
3775 Desktop.addInternalFrame(tp, title, w, h);
3777 } catch (Exception ex)
3779 ex.printStackTrace();
3786 * Generates menu items and listener event actions for web service clients
3789 public void BuildWebServiceMenu()
3791 // TODO: add support for context dependent disabling of services based on
3792 // alignment and current selection
3793 // TODO: add additional serviceHandle parameter to specify abstract handler
3794 // class independently of AbstractName
3795 // TODO: add in rediscovery GUI function to restart discoverer
3796 // TODO: group services by location as well as function and/or introduce
3797 // object broker mechanism.
3798 if ((Discoverer.services != null) && (Discoverer.services.size() > 0))
3800 // TODO: refactor to allow list of AbstractName/Handler bindings to be
3801 // stored or retrieved from elsewhere
3802 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
3803 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
3804 Vector seqsrch = (Vector) Discoverer.services.get("SeqSearch");
3805 // TODO: move GUI generation code onto service implementation - so a
3806 // client instance attaches itself to the GUI with method call like
3807 // jalview.ws.MsaWSClient.bind(servicehandle, Desktop.instance,
3809 Vector wsmenu = new Vector();
3810 final IProgressIndicator af = this;
3813 // Add any Multiple Sequence Alignment Services
3814 final JMenu msawsmenu = new JMenu("Alignment");
3815 for (int i = 0, j = msaws.size(); i < j; i++)
3817 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws
3819 jalview.ws.WSClient impl = jalview.ws.Discoverer
3820 .getServiceClient(sh);
3821 impl.attachWSMenuEntry(msawsmenu, this);
3824 wsmenu.add(msawsmenu);
3826 if (secstrpr != null)
3828 // Add any secondary structure prediction services
3829 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
3830 for (int i = 0, j = secstrpr.size(); i < j; i++)
3832 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) secstrpr
3834 jalview.ws.WSClient impl = jalview.ws.Discoverer
3835 .getServiceClient(sh);
3836 impl.attachWSMenuEntry(secstrmenu, this);
3838 wsmenu.add(secstrmenu);
3840 if (seqsrch != null)
3842 // Add any sequence search services
3843 final JMenu seqsrchmenu = new JMenu("Sequence Database Search");
3844 for (int i = 0, j = seqsrch.size(); i < j; i++)
3846 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) seqsrch
3848 jalview.ws.WSClient impl = jalview.ws.Discoverer
3849 .getServiceClient(sh);
3850 impl.attachWSMenuEntry(seqsrchmenu, this);
3852 wsmenu.add(seqsrchmenu);
3854 // finally, add the whole shebang onto the webservices menu
3855 resetWebServiceMenu();
3856 for (int i = 0, j = wsmenu.size(); i < j; i++)
3858 webService.add((JMenu) wsmenu.get(i));
3863 resetWebServiceMenu();
3864 this.webService.add(this.webServiceNoServices);
3869 * empty the web service menu and add any ad-hoc functions not dynamically
3873 private void resetWebServiceMenu()
3875 webService.removeAll();
3876 build_fetchdbmenu(webService);
3877 build_urlServiceMenu(webService);
3881 * construct any groupURL type service menu entries.
3885 private void build_urlServiceMenu(JMenu webService)
3887 jalview.ws.EnfinEnvision2OneWay.getInstance().attachWSMenuEntry(
3892 * public void vamsasStore_actionPerformed(ActionEvent e) { JalviewFileChooser
3893 * chooser = new JalviewFileChooser(jalview.bin.Cache.
3894 * getProperty("LAST_DIRECTORY"));
3896 * chooser.setFileView(new JalviewFileView()); chooser.setDialogTitle("Export
3897 * to Vamsas file"); chooser.setToolTipText("Export");
3899 * int value = chooser.showSaveDialog(this);
3901 * if (value == JalviewFileChooser.APPROVE_OPTION) {
3902 * jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
3903 * //vs.store(chooser.getSelectedFile().getAbsolutePath() ); vs.storeJalview(
3904 * chooser.getSelectedFile().getAbsolutePath(), this); } }
3907 * prototype of an automatically enabled/disabled analysis function
3910 protected void setShowProductsEnabled()
3912 SequenceI[] selection = viewport.getSequenceSelection();
3913 if (canShowProducts(selection, viewport.getSelectionGroup() != null,
3914 viewport.getAlignment().getDataset()))
3916 showProducts.setEnabled(true);
3921 showProducts.setEnabled(false);
3926 * search selection for sequence xRef products and build the show products
3931 * @return true if showProducts menu should be enabled.
3933 public boolean canShowProducts(SequenceI[] selection,
3934 boolean isRegionSelection, Alignment dataset)
3936 boolean showp = false;
3939 showProducts.removeAll();
3940 final boolean dna = viewport.getAlignment().isNucleotide();
3941 final Alignment ds = dataset;
3942 String[] ptypes = (selection == null || selection.length == 0) ? null
3943 : CrossRef.findSequenceXrefTypes(dna, selection, dataset);
3945 // CrossRef.buildXProductsList(viewport.getAlignment().isNucleotide(),
3946 // selection, dataset, true);
3947 final SequenceI[] sel = selection;
3948 for (int t = 0; ptypes != null && t < ptypes.length; t++)
3951 final boolean isRegSel = isRegionSelection;
3952 final AlignFrame af = this;
3953 final String source = ptypes[t];
3954 JMenuItem xtype = new JMenuItem(ptypes[t]);
3955 xtype.addActionListener(new ActionListener()
3958 public void actionPerformed(ActionEvent e)
3960 // TODO: new thread for this call with vis-delay
3961 af.showProductsFor(af.viewport.getSequenceSelection(), ds,
3962 isRegSel, dna, source);
3966 showProducts.add(xtype);
3968 showProducts.setVisible(showp);
3969 showProducts.setEnabled(showp);
3970 } catch (Exception e)
3972 jalview.bin.Cache.log
3974 "canTranslate threw an exception - please report to help@jalview.org",
3981 protected void showProductsFor(SequenceI[] sel, Alignment ds,
3982 boolean isRegSel, boolean dna, String source)
3984 final boolean fisRegSel = isRegSel;
3985 final boolean fdna = dna;
3986 final String fsrc = source;
3987 final AlignFrame ths = this;
3988 final SequenceI[] fsel = sel;
3989 Runnable foo = new Runnable()
3994 final long sttime = System.currentTimeMillis();
3995 ths.setProgressBar("Searching for sequences from " + fsrc, sttime);
3998 Alignment ds = ths.getViewport().alignment.getDataset(); // update
4002 Alignment prods = CrossRef
4003 .findXrefSequences(fsel, fdna, fsrc, ds);
4006 SequenceI[] sprods = new SequenceI[prods.getHeight()];
4007 for (int s = 0; s < sprods.length; s++)
4009 sprods[s] = (prods.getSequenceAt(s)).deriveSequence();
4010 if (ds.getSequences() == null
4011 || !ds.getSequences().contains(
4012 sprods[s].getDatasetSequence()))
4013 ds.addSequence(sprods[s].getDatasetSequence());
4014 sprods[s].updatePDBIds();
4016 Alignment al = new Alignment(sprods);
4017 AlignedCodonFrame[] cf = prods.getCodonFrames();
4019 for (int s = 0; cf != null && s < cf.length; s++)
4021 al.addCodonFrame(cf[s]);
4024 AlignFrame naf = new AlignFrame(al, DEFAULT_WIDTH,
4026 String newtitle = "" + ((fdna) ? "Proteins " : "Nucleotides ")
4027 + " for " + ((fisRegSel) ? "selected region of " : "")
4029 Desktop.addInternalFrame(naf, newtitle, DEFAULT_WIDTH,
4034 System.err.println("No Sequences generated for xRef type "
4037 } catch (Exception e)
4039 jalview.bin.Cache.log.error(
4040 "Exception when finding crossreferences", e);
4041 } catch (OutOfMemoryError e)
4043 new OOMWarning("whilst fetching crossreferences", e);
4046 jalview.bin.Cache.log.error("Error when finding crossreferences",
4049 ths.setProgressBar("Finished searching for sequences from " + fsrc,
4054 Thread frunner = new Thread(foo);
4058 public boolean canShowTranslationProducts(SequenceI[] selection,
4059 AlignmentI alignment)
4064 return (jalview.analysis.Dna.canTranslate(selection, viewport
4065 .getViewAsVisibleContigs(true)));
4066 } catch (Exception e)
4068 jalview.bin.Cache.log
4070 "canTranslate threw an exception - please report to help@jalview.org",
4076 public void showProducts_actionPerformed(ActionEvent e)
4078 // /////////////////////////////
4079 // Collect Data to be translated/transferred
4081 SequenceI[] selection = viewport.getSequenceSelection();
4082 AlignmentI al = null;
4085 al = jalview.analysis.Dna.CdnaTranslate(selection, viewport
4086 .getViewAsVisibleContigs(true), viewport.getGapCharacter(),
4087 viewport.getAlignment().getDataset());
4088 } catch (Exception ex)
4091 jalview.bin.Cache.log.debug("Exception during translation.", ex);
4098 "Please select at least three bases in at least one sequence in order to perform a cDNA translation.",
4099 "Translation Failed", JOptionPane.WARNING_MESSAGE);
4103 AlignFrame af = new AlignFrame(al, DEFAULT_WIDTH, DEFAULT_HEIGHT);
4104 Desktop.addInternalFrame(af, "Translation of " + this.getTitle(),
4105 DEFAULT_WIDTH, DEFAULT_HEIGHT);
4109 public void showTranslation_actionPerformed(ActionEvent e)
4111 // /////////////////////////////
4112 // Collect Data to be translated/transferred
4114 SequenceI[] selection = viewport.getSequenceSelection();
4115 String[] seqstring = viewport.getViewAsString(true);
4116 AlignmentI al = null;
4119 al = jalview.analysis.Dna.CdnaTranslate(selection, seqstring,
4120 viewport.getViewAsVisibleContigs(true), viewport
4121 .getGapCharacter(), viewport.alignment
4122 .getAlignmentAnnotation(), viewport.alignment
4123 .getWidth(), viewport.getAlignment().getDataset());
4124 } catch (Exception ex)
4127 jalview.bin.Cache.log.debug("Exception during translation.", ex);
4134 "Please select at least three bases in at least one sequence in order to perform a cDNA translation.",
4135 "Translation Failed", JOptionPane.WARNING_MESSAGE);
4139 AlignFrame af = new AlignFrame(al, DEFAULT_WIDTH, DEFAULT_HEIGHT);
4140 Desktop.addInternalFrame(af, "Translation of " + this.getTitle(),
4141 DEFAULT_WIDTH, DEFAULT_HEIGHT);
4146 * Try to load a features file onto the alignment.
4149 * contents or path to retrieve file
4151 * access mode of file (see jalview.io.AlignFile)
4152 * @return true if features file was parsed corectly.
4154 public boolean parseFeaturesFile(String file, String type)
4156 boolean featuresFile = false;
4159 featuresFile = new FeaturesFile(file, type).parse(viewport.alignment
4160 .getDataset(), alignPanel.seqPanel.seqCanvas
4161 .getFeatureRenderer().featureColours, false);
4162 } catch (Exception ex)
4164 ex.printStackTrace();
4169 viewport.showSequenceFeatures = true;
4170 showSeqFeatures.setSelected(true);
4171 if (alignPanel.seqPanel.seqCanvas.fr != null)
4173 // update the min/max ranges where necessary
4174 alignPanel.seqPanel.seqCanvas.fr.findAllFeatures(true);
4176 if (featureSettings != null)
4178 featureSettings.setTableData();
4180 alignPanel.paintAlignment(true);
4183 return featuresFile;
4186 public void dragEnter(DropTargetDragEvent evt)
4190 public void dragExit(DropTargetEvent evt)
4194 public void dragOver(DropTargetDragEvent evt)
4198 public void dropActionChanged(DropTargetDragEvent evt)
4202 public void drop(DropTargetDropEvent evt)
4204 Transferable t = evt.getTransferable();
4205 java.util.List files = null;
4209 DataFlavor uriListFlavor = new DataFlavor(
4210 "text/uri-list;class=java.lang.String");
4211 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
4213 // Works on Windows and MacOSX
4214 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
4215 files = (java.util.List) t
4216 .getTransferData(DataFlavor.javaFileListFlavor);
4218 else if (t.isDataFlavorSupported(uriListFlavor))
4220 // This is used by Unix drag system
4221 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
4222 String data = (String) t.getTransferData(uriListFlavor);
4223 files = new java.util.ArrayList(1);
4224 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
4225 data, "\r\n"); st.hasMoreTokens();)
4227 String s = st.nextToken();
4228 if (s.startsWith("#"))
4230 // the line is a comment (as per the RFC 2483)
4234 java.net.URI uri = new java.net.URI(s);
4235 // check to see if we can handle this kind of URI
4236 if (uri.getScheme().toLowerCase().startsWith("http"))
4238 files.add(uri.toString());
4242 // otherwise preserve old behaviour: catch all for file objects
4243 java.io.File file = new java.io.File(uri);
4244 files.add(file.toString());
4248 } catch (Exception e)
4250 e.printStackTrace();
4257 for (int i = 0; i < files.size(); i++)
4259 loadJalviewDataFile(files.get(i).toString());
4261 } catch (Exception ex)
4263 ex.printStackTrace();
4269 * Attempt to load a "dropped" file or URL string: First by testing whether
4270 * it's and Annotation file, then a JNet file, and finally a features file. If
4271 * all are false then the user may have dropped an alignment file onto this
4275 * either a filename or a URL string.
4277 public void loadJalviewDataFile(String file)
4281 String protocol = jalview.io.FormatAdapter.FILE;
4282 String f = file.toLowerCase();
4283 if (f.indexOf("http:") == 0 || f.indexOf("https:") == 0
4284 || f.indexOf("file:") == 0)
4286 protocol = jalview.io.FormatAdapter.URL;
4289 boolean isAnnotation = new AnnotationFile().readAnnotationFile(
4290 viewport.alignment, file, protocol);
4294 // try to see if its a JNet 'concise' style annotation file *before* we
4295 // try to parse it as a features file
4296 String format = new IdentifyFile().Identify(file, protocol);
4297 if (format.equalsIgnoreCase("JnetFile"))
4299 jalview.io.JPredFile predictions = new jalview.io.JPredFile(file,
4301 new JnetAnnotationMaker().add_annotation(predictions, viewport
4302 .getAlignment(), 0, false);
4303 isAnnotation = true;
4307 // try to parse it as a features file
4308 boolean isGroupsFile = parseFeaturesFile(file, protocol);
4309 // if it wasn't a features file then we just treat it as a general
4310 // alignment file to load into the current view.
4313 new FileLoader().LoadFile(viewport, file, protocol, format);
4317 alignPanel.paintAlignment(true);
4324 alignPanel.adjustAnnotationHeight();
4325 viewport.updateSequenceIdColours();
4326 buildSortByAnnotationScoresMenu();
4327 alignPanel.paintAlignment(true);
4329 } catch (Exception ex)
4331 ex.printStackTrace();
4335 public void tabSelectionChanged(int index)
4339 alignPanel = (AlignmentPanel) alignPanels.elementAt(index);
4340 viewport = alignPanel.av;
4341 setMenusFromViewport(viewport);
4345 public void tabbedPane_mousePressed(MouseEvent e)
4347 if (SwingUtilities.isRightMouseButton(e))
4349 String reply = JOptionPane.showInternalInputDialog(this,
4350 "Enter View Name", "Edit View Name",
4351 JOptionPane.QUESTION_MESSAGE);
4355 viewport.viewName = reply;
4356 tabbedPane.setTitleAt(tabbedPane.getSelectedIndex(), reply);
4361 public AlignViewport getCurrentView()
4367 * Open the dialog for regex description parsing.
4369 protected void extractScores_actionPerformed(ActionEvent e)
4371 ParseProperties pp = new jalview.analysis.ParseProperties(
4372 viewport.alignment);
4373 // TODO: verify regex and introduce GUI dialog for version 2.5
4374 // if (pp.getScoresFromDescription("col", "score column ",
4375 // "\\W*([-+]?\\d*\\.?\\d*e?-?\\d*)\\W+([-+]?\\d*\\.?\\d*e?-?\\d*)",
4377 if (pp.getScoresFromDescription("description column",
4378 "score in description column ", "\\W*([-+eE0-9.]+)", true) > 0)
4380 buildSortByAnnotationScoresMenu();
4388 * jalview.jbgui.GAlignFrame#showDbRefs_actionPerformed(java.awt.event.ActionEvent
4391 protected void showDbRefs_actionPerformed(ActionEvent e)
4393 viewport.setShowDbRefs(showDbRefsMenuitem.isSelected());
4399 * @seejalview.jbgui.GAlignFrame#showNpFeats_actionPerformed(java.awt.event.
4402 protected void showNpFeats_actionPerformed(ActionEvent e)
4404 viewport.setShowNpFeats(showNpFeatsMenuitem.isSelected());
4408 * find the viewport amongst the tabs in this alignment frame and close that
4413 public boolean closeView(AlignViewport av)
4417 this.closeMenuItem_actionPerformed(false);
4420 Component[] comp = tabbedPane.getComponents();
4421 for (int i = 0; comp != null && i < comp.length; i++)
4423 if (comp[i] instanceof AlignmentPanel)
4425 if (((AlignmentPanel) comp[i]).av == av)
4428 closeView((AlignmentPanel) comp[i]);
4436 protected void build_fetchdbmenu(JMenu webService)
4438 // Temporary hack - DBRef Fetcher always top level ws entry.
4439 // TODO We probably want to store a sequence database checklist in
4440 // preferences and have checkboxes.. rather than individual sources selected
4442 JMenu rfetch = new JMenu("Fetch DB References");
4444 .setToolTipText("Retrieve and parse sequence database records for the alignment or the currently selected sequences");
4445 webService.add(rfetch);
4447 JMenuItem fetchr = new JMenuItem("Standard Databases");
4449 .setToolTipText("Fetch from EMBL/EMBLCDS or Uniprot/PDB and any selected DAS sources");
4450 fetchr.addActionListener(new ActionListener()
4453 public void actionPerformed(ActionEvent e)
4455 new Thread(new Runnable()
4460 new jalview.ws.DBRefFetcher(alignPanel.av
4461 .getSequenceSelection(), alignPanel.alignFrame)
4462 .fetchDBRefs(false);
4470 JMenu dfetch = new JMenu();
4472 jalview.ws.SequenceFetcher sf = SequenceFetcher
4473 .getSequenceFetcherSingleton(this);
4474 String[] otherdb = sf.getOrderedSupportedSources();
4475 // sf.getDbInstances(jalview.ws.dbsources.DasSequenceSource.class);
4476 // jalview.util.QuickSort.sort(otherdb, otherdb);
4477 int comp = 0, mcomp = 15;
4478 String mname = null;
4479 if (otherdb != null && otherdb.length > 0)
4481 for (int i = 0; i < otherdb.length; i++)
4483 String dbname = sf.getSourceProxy(otherdb[i]).getDbName();
4486 mname = "from '" + dbname + "'";
4488 fetchr = new JMenuItem(otherdb[i]);
4489 final String[] dassource = new String[]
4491 fetchr.addActionListener(new ActionListener()
4494 public void actionPerformed(ActionEvent e)
4496 new Thread(new Runnable()
4501 new jalview.ws.DBRefFetcher(alignPanel.av
4502 .getSequenceSelection(), alignPanel.alignFrame,
4503 dassource).fetchDBRefs(false);
4509 fetchr.setToolTipText("Retrieve from " + dbname);
4511 if (comp++ == mcomp || i == (otherdb.length - 1))
4513 dfetch.setText(mname + " to '" + dbname + "'");
4515 dfetch = new JMenu();
4524 * Left justify the whole alignment.
4526 protected void justifyLeftMenuItem_actionPerformed(ActionEvent e)
4528 AlignmentI al = viewport.getAlignment();
4530 viewport.firePropertyChange("alignment", null, al);
4534 * Right justify the whole alignment.
4536 protected void justifyRightMenuItem_actionPerformed(ActionEvent e)
4538 AlignmentI al = viewport.getAlignment();
4540 viewport.firePropertyChange("alignment", null, al);
4543 public void setShowSeqFeatures(boolean b)
4545 showSeqFeatures.setSelected(true);
4546 viewport.setShowSequenceFeatures(true);
4553 * jalview.jbgui.GAlignFrame#showUnconservedMenuItem_actionPerformed(java.
4554 * awt.event.ActionEvent)
4556 protected void showUnconservedMenuItem_actionPerformed(ActionEvent e)
4558 viewport.setShowUnconserved(showUnconservedMenuItem.getState());
4559 alignPanel.paintAlignment(true);
4566 * jalview.jbgui.GAlignFrame#showGroupConsensus_actionPerformed(java.awt.event
4569 protected void showGroupConsensus_actionPerformed(ActionEvent e)
4571 viewport.setShowGroupConsensus(showGroupConsensus.getState());
4572 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
4580 * jalview.jbgui.GAlignFrame#showGroupConservation_actionPerformed(java.awt
4581 * .event.ActionEvent)
4583 protected void showGroupConservation_actionPerformed(ActionEvent e)
4585 viewport.setShowGroupConservation(showGroupConservation.getState());
4586 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
4593 * jalview.jbgui.GAlignFrame#showConsensusHistogram_actionPerformed(java.awt
4594 * .event.ActionEvent)
4596 protected void showConsensusHistogram_actionPerformed(ActionEvent e)
4598 viewport.setShowConsensusHistogram(showConsensusHistogram.getState());
4599 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
4606 * jalview.jbgui.GAlignFrame#showConsensusProfile_actionPerformed(java.awt
4607 * .event.ActionEvent)
4609 protected void showSequenceLogo_actionPerformed(ActionEvent e)
4611 viewport.setShowSequenceLogo(showSequenceLogo.getState());
4612 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
4615 protected void applyAutoAnnotationSettings_actionPerformed(ActionEvent e)
4617 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
4624 * jalview.jbgui.GAlignFrame#makeGrpsFromSelection_actionPerformed(java.awt
4625 * .event.ActionEvent)
4627 protected void makeGrpsFromSelection_actionPerformed(ActionEvent e)
4629 if (viewport.getSelectionGroup() != null)
4631 SequenceGroup[] gps = jalview.analysis.Grouping.makeGroupsFrom(
4632 viewport.getSequenceSelection(), viewport.getAlignmentView(
4633 true).getSequenceStrings(viewport.getGapCharacter()),
4634 viewport.alignment.getGroups());
4635 viewport.alignment.deleteAllGroups();
4636 viewport.sequenceColours = null;
4637 viewport.setSelectionGroup(null);
4638 // set view properties for each group
4639 for (int g = 0; g < gps.length; g++)
4641 gps[g].setShowunconserved(viewport.getShowUnconserved());
4642 gps[g].setIncludeAllConsSymbols(viewport
4643 .isIncludeAllConsensusSymbols());
4644 viewport.alignment.addGroup(gps[g]);
4645 Color col = new Color((int) (Math.random() * 255), (int) (Math
4646 .random() * 255), (int) (Math.random() * 255));
4647 col = col.brighter();
4648 for (Enumeration sq = gps[g].getSequences(null).elements(); sq
4649 .hasMoreElements(); viewport.setSequenceColour(
4650 (SequenceI) sq.nextElement(), col))
4653 PaintRefresher.Refresh(this, viewport.getSequenceSetId());
4654 alignPanel.updateAnnotation();
4655 alignPanel.paintAlignment(true);
4660 class PrintThread extends Thread
4664 public PrintThread(AlignmentPanel ap)
4669 static PageFormat pf;
4673 PrinterJob printJob = PrinterJob.getPrinterJob();
4677 printJob.setPrintable(ap, pf);
4681 printJob.setPrintable(ap);
4684 if (printJob.printDialog())
4689 } catch (Exception PrintException)
4691 PrintException.printStackTrace();