X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAlignFrame.java;h=bfdc40bd9bb4ffde05afe1ba3b3fca758a55eca8;hb=2e22e46f5f79840fd368858faa191e1be5f6095c;hp=ac9aa91e588c9315040dc21403981ee1625c31ef;hpb=205f62c25c9a456d315bee8cbc0d9b45996cbbee;p=jalview.git diff --git a/src/jalview/gui/AlignFrame.java b/src/jalview/gui/AlignFrame.java index ac9aa91..be428fe 100755 --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@ -1,16 +1,25 @@ -/******************** - * 2004 Jalview Reengineered - * Barton Group - * Dundee University +/* + * Jalview - A Sequence Alignment Editor and Viewer + * Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle * - * AM Waterhouse - *******************/ - - - - + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Softwarechang + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ package jalview.gui; +import java.beans.*; +import java.io.*; import java.util.*; import java.awt.*; @@ -18,921 +27,2303 @@ import java.awt.datatransfer.*; import java.awt.event.*; import java.awt.print.*; import javax.swing.*; -import javax.swing.event.*; import jalview.analysis.*; import jalview.datamodel.*; import jalview.io.*; import jalview.jbgui.*; import jalview.schemes.*; +import jalview.commands.*; import jalview.ws.*; +import java.awt.dnd.*; +import javax.swing.event.ChangeListener; +import javax.swing.event.ChangeEvent; - -public class AlignFrame extends GAlignFrame +/** + * DOCUMENT ME! + * + * @author $author$ + * @version $Revision$ + */ +public class AlignFrame extends GAlignFrame implements DropTargetListener { - final AlignmentPanel alignPanel; - final AlignViewport viewport; - public static final int NEW_WINDOW_WIDTH = 700; - public static final int NEW_WINDOW_HEIGHT = 500; - public String currentFileFormat = "Jalview"; - - public AlignFrame(AlignmentI al) - { - viewport = new AlignViewport(al); - - alignPanel = new AlignmentPanel(this, viewport); - alignPanel.annotationPanel.adjustPanelHeight(); - alignPanel.annotationSpaceFillerHolder.setPreferredSize(alignPanel.annotationPanel.getPreferredSize()); - alignPanel.annotationScroller.setPreferredSize(alignPanel.annotationPanel.getPreferredSize()); - alignPanel.setAnnotationVisible( viewport.getShowAnnotation() ); - - getContentPane().add(alignPanel, java.awt.BorderLayout.CENTER); - - addInternalFrameListener(new InternalFrameAdapter() - { - public void internalFrameActivated(InternalFrameEvent evt) - { - javax.swing.SwingUtilities.invokeLater(new Runnable() - { - public void run() - { alignPanel.requestFocus(); } - }); - - } - }); + /** DOCUMENT ME!! */ + public static final int DEFAULT_WIDTH = 700; - } + /** DOCUMENT ME!! */ + public static final int DEFAULT_HEIGHT = 500; + public AlignmentPanel alignPanel; - public void saveAlignmentMenu_actionPerformed(ActionEvent e) - { - JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.getProperty("LAST_DIRECTORY") - , new String[]{"fa, fasta, fastq", "aln", "pfam", "msf", "pir","blc","jar"}, - new String[]{"Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "Jalview"}, - currentFileFormat); + AlignViewport viewport; - chooser.setAcceptAllFileFilterUsed(false); - chooser.setFileView(new JalviewFileView()); - chooser.setDialogTitle("Save Alignment to file"); - chooser.setToolTipText("Save"); - int value = chooser.showSaveDialog(this); - if(value == JalviewFileChooser.APPROVE_OPTION) - { - currentFileFormat = chooser.getSelectedFormat(); - jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT", currentFileFormat); + Vector alignPanels = new Vector(); - if (currentFileFormat.equals("Jalview")) - { - String shortName = title.replace('/', '_'); - title = title.replace('\\', '_'); - String choice = chooser.getSelectedFile().getPath(); - Jalview2XML.SaveState(this, choice, shortName); - // USE Jalview2XML to save this file - return; - } - String choice = chooser.getSelectedFile().getPath(); - jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice); - String output = FormatAdapter.formatSequences(currentFileFormat, viewport.getAlignment().getSequences()); - try{ - java.io.PrintWriter out = new java.io.PrintWriter( new java.io.FileWriter( choice ) ); - out.println(output); - out.close(); - } - catch(Exception ex){} - } + /** DOCUMENT ME!! */ + String currentFileFormat = null; - } + String fileName = null; - protected void outputText_actionPerformed(ActionEvent e) - { - CutAndPasteTransfer cap = new CutAndPasteTransfer(false); - JInternalFrame frame = new JInternalFrame(); - cap.formatForOutput(); - frame.setContentPane(cap); - Desktop.addInternalFrame(frame, "Alignment output - "+e.getActionCommand(), 600, 500); - cap.setText( FormatAdapter.formatSequences(e.getActionCommand(), viewport.getAlignment().getSequences())); - } - protected void htmlMenuItem_actionPerformed(ActionEvent e) + /** + * Creates a new AlignFrame object. + * + * @param al DOCUMENT ME! + */ + public AlignFrame(AlignmentI al, int width, int height) { - HTMLOutput htmlOutput = new HTMLOutput(viewport); - htmlOutput = null; + this(al, null, width, height); } - protected void createPNG_actionPerformed(ActionEvent e) - { - alignPanel.makePNG(); - } - protected void epsFile_actionPerformed(ActionEvent e) + /** + * new alignment window with hidden columns + * @param al AlignmentI + * @param hiddenColumns ColumnSelection or null + */ + public AlignFrame(AlignmentI al, ColumnSelection hiddenColumns, + int width, int height) { - alignPanel.makeEPS(); - } - + this.setSize(width, height); + viewport = new AlignViewport(al, hiddenColumns); - public void printMenuItem_actionPerformed(ActionEvent e) - { - //Putting in a thread avoids Swing painting problems - PrintThread thread = new PrintThread(); - thread.start(); - } + alignPanel = new AlignmentPanel(this, viewport); - class PrintThread extends Thread - { - public void run() + if(al.getDataset()==null) { - PrinterJob printJob = PrinterJob.getPrinterJob(); - PageFormat pf = printJob.pageDialog(printJob.defaultPage()); - printJob.setPrintable(alignPanel, pf); - if (printJob.printDialog()) - { - try - { - printJob.print(); - } - catch (Exception PrintException) - { - PrintException.printStackTrace(); - } - } + al.setDataset(null); } + addAlignmentPanel(alignPanel, true); + init(); } - - - - public void closeMenuItem_actionPerformed(ActionEvent e) + /** + * Make a new AlignFrame from exisiting alignmentPanels + * @param ap AlignmentPanel + * @param av AlignViewport + */ + public AlignFrame(AlignmentPanel ap) { - try{ - this.setClosed(true); - }catch(Exception ex){} + viewport = ap.av; + alignPanel = ap; + addAlignmentPanel(ap, false); + init(); } - Stack historyList = new Stack(); - Stack redoList = new Stack(); - private int treeCount = 0; + void init() + { + this.setDropTarget(new java.awt.dnd.DropTarget(this, this)); - void updateEditMenuBar() - { - if(historyList.size()>0) - { - undoMenuItem.setEnabled(true); - HistoryItem hi = (HistoryItem)historyList.peek(); - undoMenuItem.setText("Undo "+hi.getDescription()); - } - else - { - undoMenuItem.setEnabled(false); - undoMenuItem.setText("Undo"); - } + if (viewport.conservation == null) + { + BLOSUM62Colour.setEnabled(false); + conservationMenuItem.setEnabled(false); + modifyConservation.setEnabled(false); + // PIDColour.setEnabled(false); + // abovePIDThreshold.setEnabled(false); + // modifyPID.setEnabled(false); + } - if(redoList.size()>0) - { - redoMenuItem.setEnabled(true); - HistoryItem hi = (HistoryItem)redoList.peek(); - redoMenuItem.setText("Redo "+hi.getDescription()); - } - else - { - redoMenuItem.setEnabled(false); - redoMenuItem.setText("Redo"); - } - } + String sortby = jalview.bin.Cache.getDefault("SORT_ALIGNMENT", "No sort"); - public void addHistoryItem(HistoryItem hi) - { - historyList.push(hi); - updateEditMenuBar(); - } + if (sortby.equals("Id")) + sortIDMenuItem_actionPerformed(null); + else if (sortby.equals("Pairwise Identity")) + sortPairwiseMenuItem_actionPerformed(null); - protected void undoMenuItem_actionPerformed(ActionEvent e) + if (Desktop.desktop != null) { - HistoryItem hi = (HistoryItem)historyList.pop(); - redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment, HistoryItem.HIDE)); - restoreHistoryItem(hi); + addServiceListeners(); + setGUINucleotide(viewport.alignment.isNucleotide()); } + setMenusFromViewport(viewport); - protected void redoMenuItem_actionPerformed(ActionEvent e) + if (viewport.wrapAlignment) { - HistoryItem hi = (HistoryItem)redoList.pop(); - restoreHistoryItem(hi); - updateEditMenuBar(); - viewport.updateConsensus(); - alignPanel.repaint(); - alignPanel.repaint(); + wrapMenuItem_actionPerformed(null); } + addKeyListener(); - // used by undo and redo - void restoreHistoryItem(HistoryItem hi) - { - if(hi.getType()== HistoryItem.SORT) - { - for(int i=0; i= KeyEvent.VK_0 + && evt.getKeyCode() <= KeyEvent.VK_9) { - restore.setSequence(hi.getHidden().elementAt(i).toString()); - viewport.alignment.getSequences().insertElementAt( - restore, - hi.getAlignIndex(i)); + alignPanel.seqPanel.numberPressed(evt.getKeyChar()); } - else - restore.setSequence(hi.getHidden().elementAt(i).toString()); - } - if(hi.getType()==HistoryItem.PASTE) - { - for(int i=viewport.alignment.getHeight()-1;i>hi.getSequences().size()-1; i--) - viewport.alignment.deleteSequence(i); - } - } - updateEditMenuBar(); + switch (evt.getKeyCode()) + { - viewport.updateConsensus(); - viewport.updateConservation(); - alignPanel.repaint(); - } + case 27: // escape key + deselectAllSequenceMenuItem_actionPerformed(null); + + break; + + case KeyEvent.VK_DOWN: + if (viewport.cursorMode) + { + alignPanel.seqPanel.moveCursor(0, 1); + } + else + moveSelectedSequences(false); + break; + + case KeyEvent.VK_UP: + if (viewport.cursorMode) + { + alignPanel.seqPanel.moveCursor(0, -1); + } + else + moveSelectedSequences(true); + break; + + case KeyEvent.VK_LEFT: + if (viewport.cursorMode) + { + alignPanel.seqPanel.moveCursor( -1, 0); + } + break; + + case KeyEvent.VK_RIGHT: + if (viewport.cursorMode) + { + alignPanel.seqPanel.moveCursor(1, 0); + } + break; + + case KeyEvent.VK_SPACE: + if (viewport.cursorMode) + { + alignPanel.seqPanel.insertGapAtCursor(evt.isControlDown() + || evt.isShiftDown() + || evt.isAltDown()); + } + break; + + case KeyEvent.VK_DELETE: + case KeyEvent.VK_BACK_SPACE: + if (!viewport.cursorMode) + { + cut_actionPerformed(null); + } + else + alignPanel.seqPanel.deleteGapAtCursor(evt.isControlDown() + || evt.isShiftDown() + || evt.isAltDown()); + + break; + + case KeyEvent.VK_S: + if (viewport.cursorMode) + { + alignPanel.seqPanel.setCursorRow(); + } + break; + case KeyEvent.VK_C: + if (viewport.cursorMode && !evt.isControlDown()) + { + alignPanel.seqPanel.setCursorColumn(); + } + break; + case KeyEvent.VK_P: + if (viewport.cursorMode) + { + alignPanel.seqPanel.setCursorPosition(); + } + break; + + case KeyEvent.VK_ENTER: + case KeyEvent.VK_COMMA: + if (viewport.cursorMode) + { + alignPanel.seqPanel.setCursorRowAndColumn(); + } + break; + + case KeyEvent.VK_Q: + if (viewport.cursorMode) + { + alignPanel.seqPanel.setSelectionAreaAtCursor(true); + } + break; + case KeyEvent.VK_M: + if (viewport.cursorMode) + { + alignPanel.seqPanel.setSelectionAreaAtCursor(false); + } + break; + + case KeyEvent.VK_F2: + viewport.cursorMode = !viewport.cursorMode; + statusBar.setText("Keyboard editing mode is " + + (viewport.cursorMode ? "on" : "off")); + if (viewport.cursorMode) + { + alignPanel.seqPanel.seqCanvas.cursorX = viewport.startRes; + alignPanel.seqPanel.seqCanvas.cursorY = viewport.startSeq; + } + alignPanel.seqPanel.seqCanvas.repaint(); + break; + + case KeyEvent.VK_F1: + try + { + ClassLoader cl = jalview.gui.Desktop.class.getClassLoader(); + java.net.URL url = javax.help.HelpSet.findHelpSet(cl, "help/help"); + javax.help.HelpSet hs = new javax.help.HelpSet(cl, url); + + javax.help.HelpBroker hb = hs.createHelpBroker(); + hb.setCurrentID("home"); + hb.setDisplayed(true); + } + catch (Exception ex) + { + ex.printStackTrace(); + } + break + ; + case KeyEvent.VK_H: + { + boolean toggleSeqs = !evt.isControlDown(); + boolean toggleCols = !evt.isShiftDown(); + + boolean hide = false; + + SequenceGroup sg = viewport.getSelectionGroup(); + if (toggleSeqs) + { + if (sg != null && sg.getSize(false) != viewport.alignment.getHeight()) + { + hideSelSequences_actionPerformed(null); + hide = true; + } + else if (! (toggleCols && viewport.colSel.getSelected().size() > 0)) + showAllSeqs_actionPerformed(null); + } + + if (toggleCols) + { + if (viewport.colSel.getSelected().size() > 0) + { + hideSelColumns_actionPerformed(null); + if (!toggleSeqs) + viewport.selectionGroup = sg; + } + else if (!hide) + showAllColumns_actionPerformed(null); + } + break; + } + case KeyEvent.VK_PAGE_UP: + if (viewport.wrapAlignment) + alignPanel.scrollUp(true); + else + alignPanel.setScrollValues(viewport.startRes, + viewport.startSeq + - viewport.endSeq + viewport.startSeq); + break; + case KeyEvent.VK_PAGE_DOWN: + if (viewport.wrapAlignment) + alignPanel.scrollUp(false); + else + alignPanel.setScrollValues(viewport.startRes, + viewport.startSeq + + viewport.endSeq - viewport.startSeq); + break; + } + } + }); + } - public void moveSelectedSequences(boolean up) + + public void addAlignmentPanel(final AlignmentPanel ap, + boolean newPanel) { - SequenceGroup sg = viewport.getSelectionGroup(); - if (sg == null) - return; + ap.alignFrame = this; - if (up) - { - for (int i = 1; i < viewport.alignment.getHeight(); i++) - { - SequenceI seq = viewport.alignment.getSequenceAt(i); - if (!sg.sequences.contains(seq)) - continue; + alignPanels.addElement(ap); - SequenceI temp = viewport.alignment.getSequenceAt(i - 1); - if (sg.sequences.contains(temp)) - continue; + PaintRefresher.Register(ap, ap.av.getSequenceSetId()); - viewport.alignment.getSequences().setElementAt(temp, i); - viewport.alignment.getSequences().setElementAt(seq, i - 1); - } + int aSize = alignPanels.size(); + + tabbedPane.setVisible(aSize>1 || ap.av.viewName!=null); + + if (aSize == 1 && ap.av.viewName==null) + { + this.getContentPane().add(ap, BorderLayout.CENTER); } else { - for (int i = viewport.alignment.getHeight() - 2; i > -1; i--) + if (aSize == 2) { - SequenceI seq = viewport.alignment.getSequenceAt(i); - if (!sg.sequences.contains(seq)) - continue; + setInitialTabVisible(); + } - SequenceI temp = viewport.alignment.getSequenceAt(i + 1); - if (sg.sequences.contains(temp)) - continue; + expandViews.setEnabled(true); + gatherViews.setEnabled(true); + tabbedPane.addTab(ap.av.viewName, ap); - viewport.alignment.getSequences().setElementAt(temp, i); - viewport.alignment.getSequences().setElementAt(seq, i + 1); - } + ap.setVisible(false); } - alignPanel.repaint(); + if(newPanel) + { + if (ap.av.padGaps) + ap.av.alignment.padGaps(); + ap.av.updateConservation(ap); + ap.av.updateConsensus(ap); + } } - - - protected void copy_actionPerformed(ActionEvent e) + public void setInitialTabVisible() { - if(viewport.getSelectionGroup()==null) - return; - - SequenceGroup sg = viewport.getSelectionGroup(); - - Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard(); - StringBuffer buffer= new StringBuffer(); - - Hashtable orderedSeqs = new Hashtable(); - for(int i=0; i 0) + if(fileName!=null) { - addHistoryItem(new HistoryItem("Remove Left",viewport.alignment, - HistoryItem.HIDE)); - int min = colSel.getMin(); - viewport.getAlignment().trimLeft(min); - colSel.compensateForEdit(0,min); + if(currentFileFormat.equals("Jalview")) + { + JInternalFrame [] frames = Desktop.desktop.getAllFrames(); + for(int i=0; i 0) + { + viewport.alignment.deleteSequence(0); + } + + viewport.historyList.clear(); + viewport.redoList.clear(); + Alignment dset = viewport.alignment.getDataset(); + while (dset.getHeight() > 0) + { + dset.deleteSequence(0); + } + + firePropertyChange("Alignment", null, null); + + updateEditMenuBar(); } - alignPanel.repaint(); + FileLoader loader = new FileLoader(); + String protocol = fileName.startsWith("http:")? "URL":"File"; + loader.LoadFile(viewport, fileName, protocol, currentFileFormat); + } } - public void remove2RightMenuItem_actionPerformed(ActionEvent e) - { - ColumnSelection colSel = viewport.getColumnSelection(); - if (colSel.size() > 0) - { - addHistoryItem(new HistoryItem("Remove Right",viewport.alignment, - HistoryItem.HIDE)); - - int max = colSel.getMax(); - viewport.getAlignment().trimRight(max); - if(viewport.getSelectionGroup()!=null) - viewport.getSelectionGroup().adjustForRemoveRight(max); - - Vector groups = viewport.alignment.getGroups(); - for(int i=0; i -1) + { + shortName = shortName.substring(shortName.lastIndexOf( + java.io.File.separatorChar) + 1); + } + + new Jalview2XML().SaveAlignment(this, file, shortName); + + statusBar.setText("Successfully saved to file: " + +fileName+" in " + +format +" format."); + + + // USE Jalview2XML to save this file + return true; + } + else { - addHistoryItem(new HistoryItem("Pad Gaps", - viewport.alignment, - HistoryItem.HIDE)); - SequenceI current; - int Width = viewport.getAlignment().getWidth()-1; - for (int i=0; i < viewport.getAlignment().getSequences().size();i++) + + String[] omitHidden = null; + + if (viewport.hasHiddenColumns) { - current = viewport.getAlignment().getSequenceAt(i); + int reply = JOptionPane.showInternalConfirmDialog(Desktop.desktop, + "The Alignment contains hidden columns." + + "\nDo you want to save only the visible alignment?", + "Save / Omit Hidden Columns", + JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); + + if (reply == JOptionPane.YES_OPTION) + omitHidden = viewport.getViewAsString(false); + } + + String output = new FormatAdapter().formatSequences( + format, + viewport.alignment.getSequencesArray(), + omitHidden); - if (current.getLength()