X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAlignFrame.java;h=7db8f01805fec6f67eb2650b1b925eb7e018c4ef;hb=1146ae7f678127be7796772b228d5fc6823435d4;hp=1ff77e620ff9f005e4cdc51bc57f3082659632f5;hpb=33c59ebddbc51bbd26bc4c8576ec17c1498b19e8;p=jalview.git diff --git a/src/jalview/gui/AlignFrame.java b/src/jalview/gui/AlignFrame.java index 1ff77e6..7db8f01 100755 --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@ -1,902 +1,2559 @@ -/******************** - * 2004 Jalview Reengineered - * Barton Group - * Dundee University +/* + * Jalview - A Sequence Alignment Editor and Viewer + * Copyright (C) 2007 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 jalview.jbgui.GAlignFrame; -import jalview.schemes.*; -import jalview.datamodel.*; -import jalview.analysis.*; -import jalview.io.*; -import jalview.ws.*; +import java.beans.*; +import java.io.*; +import java.util.*; + import java.awt.*; +import java.awt.datatransfer.*; +import java.awt.dnd.*; import java.awt.event.*; import java.awt.print.*; import javax.swing.*; -import javax.swing.event.*; -import java.util.*; -import java.awt.datatransfer.*; +import jalview.analysis.*; +import jalview.commands.*; +import jalview.datamodel.*; +import jalview.io.*; +import jalview.jbgui.*; +import jalview.schemes.*; +import jalview.ws.*; -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"; + /** DOCUMENT ME!! */ + public static final int DEFAULT_WIDTH = 700; - public AlignFrame(AlignmentI al) - { - viewport = new AlignViewport(al); + /** DOCUMENT ME!! */ + public static final int DEFAULT_HEIGHT = 500; + public AlignmentPanel alignPanel; - alignPanel = new AlignmentPanel(this, viewport); - alignPanel.annotationPanel.adjustPanelHeight(); - alignPanel.annotationSpaceFillerHolder.setPreferredSize(alignPanel.annotationPanel.getPreferredSize()); - alignPanel.annotationScroller.setPreferredSize(alignPanel.annotationPanel.getPreferredSize()); - alignPanel.setAnnotationVisible( viewport.getShowAnnotation() ); + AlignViewport viewport; - getContentPane().add(alignPanel, java.awt.BorderLayout.CENTER); + Vector alignPanels = new Vector(); - addInternalFrameListener(new InternalFrameAdapter() - { - public void internalFrameActivated(InternalFrameEvent evt) - { - javax.swing.SwingUtilities.invokeLater(new Runnable() - { - public void run() - { alignPanel.requestFocus(); } - }); - } - }); + /** DOCUMENT ME!! */ + String currentFileFormat = null; + + String fileName = null; - } - public void saveAlignmentMenu_actionPerformed(ActionEvent e) + /** + * Creates a new AlignFrame object. + * + * @param al DOCUMENT ME! + */ + public AlignFrame(AlignmentI al, int width, int height) { - 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); + this(al, null, width, height); + } - 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(); - if (currentFileFormat.equals("Jalview")) - { - String shortName = title.replace('/', '_'); - title = title.replace('\\', '_'); - String choice = chooser.getSelectedFile().getPath(); - Jalview2XML.SaveState(this, System.currentTimeMillis(), shortName, - choice); - // USE Jalview2XML to save this file - return; - } + /** + * new alignment window with hidden columns + * @param al AlignmentI + * @param hiddenColumns ColumnSelection or null + */ + public AlignFrame(AlignmentI al, ColumnSelection hiddenColumns, + int width, int height) + { + this.setSize(width, height); + viewport = new AlignViewport(al, hiddenColumns); - 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){} + alignPanel = new AlignmentPanel(this, viewport); + + if(al.getDataset()==null) + { + al.setDataset(null); } + addAlignmentPanel(alignPanel, true); + init(); } - protected void outputText_actionPerformed(ActionEvent e) + /** + * Make a new AlignFrame from exisiting alignmentPanels + * @param ap AlignmentPanel + * @param av AlignViewport + */ + public AlignFrame(AlignmentPanel ap) { - 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())); + viewport = ap.av; + alignPanel = ap; + addAlignmentPanel(ap, false); + init(); } - protected void htmlMenuItem_actionPerformed(ActionEvent e) + void init() { - HTMLOutput htmlOutput = new HTMLOutput(viewport); - htmlOutput = null; - } + this.setDropTarget(new java.awt.dnd.DropTarget(this, this)); - protected void createPNG_actionPerformed(ActionEvent e) - { - alignPanel.makePNG(); - } + if (viewport.conservation == null) + { + BLOSUM62Colour.setEnabled(false); + conservationMenuItem.setEnabled(false); + modifyConservation.setEnabled(false); + // PIDColour.setEnabled(false); + // abovePIDThreshold.setEnabled(false); + // modifyPID.setEnabled(false); + } - protected void epsFile_actionPerformed(ActionEvent e) - { - alignPanel.makeEPS(); - } + String sortby = jalview.bin.Cache.getDefault("SORT_ALIGNMENT", "No sort"); + if (sortby.equals("Id")) + { + sortIDMenuItem_actionPerformed(null); + } + else if (sortby.equals("Pairwise Identity")) + { + sortPairwiseMenuItem_actionPerformed(null); + } - public void printMenuItem_actionPerformed(ActionEvent e) + if (Desktop.desktop != null) + { + addServiceListeners(); + setGUINucleotide(viewport.alignment.isNucleotide()); + } + + setMenusFromViewport(viewport); + + if (viewport.wrapAlignment) + { + wrapMenuItem_actionPerformed(null); + } + + if (jalview.bin.Cache.getDefault("SHOW_OVERVIEW",false)) + { + this.overviewMenuItem_actionPerformed(null); + } + + addKeyListener(); + + } + + public void setFileName(String file, String format) { - //Putting in a thread avoids Swing painting problems - PrintThread thread = new PrintThread(); - thread.start(); + fileName = file; + currentFileFormat = format; + reload.setEnabled(true); } - class PrintThread extends Thread + void addKeyListener() { - public void run() - { - PrinterJob printJob = PrinterJob.getPrinterJob(); - PageFormat pf = printJob.pageDialog(printJob.defaultPage()); - printJob.setPrintable(alignPanel, pf); - if (printJob.printDialog()) + addKeyListener(new KeyAdapter() { - try + public void keyPressed(KeyEvent evt) { - printJob.print(); + if (viewport.cursorMode + && evt.getKeyCode() >= KeyEvent.VK_0 + && evt.getKeyCode() <= KeyEvent.VK_9) + { + alignPanel.seqPanel.numberPressed(evt.getKeyChar()); + } + + switch (evt.getKeyCode()) + { + + case 27: // escape key + deselectAllSequenceMenuItem_actionPerformed(null); + + break; + + case KeyEvent.VK_DOWN: + if (evt.isAltDown() || !viewport.cursorMode) + moveSelectedSequences(false); + if (viewport.cursorMode) + alignPanel.seqPanel.moveCursor(0, 1); + break; + + case KeyEvent.VK_UP: + if (evt.isAltDown() || !viewport.cursorMode) + moveSelectedSequences(true); + if (viewport.cursorMode) + alignPanel.seqPanel.moveCursor(0, -1); + + break; + + case KeyEvent.VK_LEFT: + if (evt.isAltDown() || !viewport.cursorMode) + slideSequences(false, + alignPanel.seqPanel.getKeyboardNo1()); + else + alignPanel.seqPanel.moveCursor( -1, 0); + + + break; + + case KeyEvent.VK_RIGHT: + if (evt.isAltDown() || !viewport.cursorMode) + slideSequences(true, + alignPanel.seqPanel.getKeyboardNo1()); + else + 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() != 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; + } } - catch (Exception PrintException) + + public void keyReleased(KeyEvent evt) + { + switch(evt.getKeyCode()) { - PrintException.printStackTrace(); + case KeyEvent.VK_LEFT: + if (evt.isAltDown() || !viewport.cursorMode) + viewport.firePropertyChange("alignment", null, + viewport.getAlignment().getSequences()); + break; + + case KeyEvent.VK_RIGHT: + if (evt.isAltDown() || !viewport.cursorMode) + viewport.firePropertyChange("alignment", null, + viewport.getAlignment().getSequences()); + break; } } - } - + }); } + public void addAlignmentPanel(final AlignmentPanel ap, + boolean newPanel) + { + ap.alignFrame = this; + alignPanels.addElement(ap); - public void closeMenuItem_actionPerformed(ActionEvent e) - { - try{ - this.setClosed(true); - }catch(Exception ex){} - } + PaintRefresher.Register(ap, ap.av.getSequenceSetId()); - Stack historyList = new Stack(); - Stack redoList = new Stack(); + int aSize = alignPanels.size(); - void updateEditMenuBar() - { - if(historyList.size()>0) - { - undoMenuItem.setEnabled(true); - Object [] history = (Object[])historyList.get(0); - undoMenuItem.setText("Undo "+history[0]); - } + tabbedPane.setVisible(aSize>1 || ap.av.viewName!=null); + + if (aSize == 1 && ap.av.viewName==null) + { + this.getContentPane().add(ap, BorderLayout.CENTER); + } else { - undoMenuItem.setEnabled(false); - undoMenuItem.setText("Undo"); + if (aSize == 2) + { + setInitialTabVisible(); + } + + expandViews.setEnabled(true); + gatherViews.setEnabled(true); + tabbedPane.addTab(ap.av.viewName, ap); + + ap.setVisible(false); } - if(redoList.size()>0) - { - redoMenuItem.setEnabled(true); - Object [] history = (Object[])redoList.get(0); - redoMenuItem.setText("Redo "+history[0]); - } - else + if(newPanel) { - redoMenuItem.setEnabled(false); - redoMenuItem.setText("Redo"); + if (ap.av.padGaps) + { + ap.av.alignment.padGaps(); + } + ap.av.updateConservation(ap); + ap.av.updateConsensus(ap); } } - public void addHistoryItem(String type) + public void setInitialTabVisible() + { + expandViews.setEnabled(true); + gatherViews.setEnabled(true); + tabbedPane.setVisible(true); + AlignmentPanel first = (AlignmentPanel) alignPanels.firstElement(); + tabbedPane.addTab(first.av.viewName,first); + this.getContentPane().add(tabbedPane, BorderLayout.CENTER); + } + + + public AlignViewport getViewport() { - // must make sure we add new sequence objects her, not refs to the existing sequences - redoList.clear(); + return viewport; + } - SequenceI[] seq = new SequenceI[viewport.getAlignment().getHeight()]; - for(int i=0; i -1; i--) - { - SequenceI seq = viewport.alignment.getSequenceAt(i); - if (!sg.sequences.contains(seq)) - continue; + progressPanel = new JPanel(new BorderLayout(10, 5)); - SequenceI temp = viewport.alignment.getSequenceAt(i + 1); - if (sg.sequences.contains(temp)) - continue; - - viewport.alignment.getSequences().setElementAt(temp, i); - viewport.alignment.getSequences().setElementAt(seq, i + 1); - } - } - - alignPanel.repaint(); - } + JProgressBar progressBar = new JProgressBar(); + progressBar.setIndeterminate(true); + progressPanel.add(new JLabel(message), BorderLayout.WEST); + progressPanel.add(progressBar, BorderLayout.CENTER); + layout.setRows(layout.getRows() + 1); + statusPanel.add(progressPanel); - protected void copy_actionPerformed(ActionEvent e) - { - if(viewport.getSelectionGroup()==null) - return; + progressBars.put(new Long(id), progressPanel); + } - SequenceGroup sg = viewport.getSelectionGroup(); + validate(); + } - Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard(); - StringBuffer buffer= new StringBuffer(); - Hashtable orderedSeqs = new Hashtable(); - for(int i=0; i 0) - { - int min = colSel.getMin(); - viewport.getAlignment().trimLeft(min); - colSel.compensateForEdit(0,min); + boolean success = true; - if(viewport.getSelectionGroup()!=null) - viewport.getSelectionGroup().adjustForRemoveLeft(min); + if (format.equalsIgnoreCase("Jalview")) + { + String shortName = title; - Vector groups = viewport.alignment.getGroups(); - for(int i=0; i -1) { - SequenceGroup sg = (SequenceGroup) groups.get(i); - if(!sg.adjustForRemoveLeft(min)) - viewport.alignment.deleteGroup(sg); + shortName = shortName.substring(shortName.lastIndexOf( + java.io.File.separatorChar) + 1); } - alignPanel.repaint(); - } - } + success = new Jalview2XML().SaveAlignment(this, file, shortName); - public void remove2RightMenuItem_actionPerformed(ActionEvent e) - { - addHistoryItem("delete columns"); - ColumnSelection colSel = viewport.getColumnSelection(); - if (colSel.size() > 0) + statusBar.setText("Successfully saved to file: " + +fileName+" in " + +format +" format."); + + } + else { - 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