X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAlignFrame.java;h=f82efb5b9b25bade7cbc11287ced0586f4c9c0d2;hb=0b23947e2cdcd704d3f313b23ba271e43d097344;hp=b60ee6248f65890a73095f1cc4de5520a9408658;hpb=0f31ab4d7d3c5fdf3af01f3f2f497962d9602725;p=jalview.git diff --git a/src/jalview/gui/AlignFrame.java b/src/jalview/gui/AlignFrame.java index b60ee62..f82efb5 100755 --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@ -1,902 +1,2162 @@ -/******************** - * 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 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.event.*; import java.awt.print.*; import javax.swing.*; -import javax.swing.event.*; -import java.util.*; -import java.awt.datatransfer.*; +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.*; -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!! */ + public String currentFileFormat = null; - } + public String fileName = null; + + private int treeCount = 0; - 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); + + if (Desktop.desktop != null) + { + addServiceListeners(); + setGUINucleotide(viewport.alignment.isNucleotide()); + } + + setMenusFromViewport(viewport); + + if (viewport.wrapAlignment) + { + wrapMenuItem_actionPerformed(null); + } + + addKeyListener(); - public void printMenuItem_actionPerformed(ActionEvent e) - { - //Putting in a thread avoids Swing painting problems - PrintThread thread = new PrintThread(); - thread.start(); } - 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()) + final AlignFrame af = this; + addKeyListener(new KeyAdapter() { - try - { - printJob.print(); - } - catch (Exception PrintException) + public void keyPressed(KeyEvent evt) { - PrintException.printStackTrace(); - } - } - } + if (viewport.cursorMode + && evt.getKeyCode() >= KeyEvent.VK_0 + && evt.getKeyCode() <= KeyEvent.VK_9) + { + alignPanel.seqPanel.numberPressed(evt.getKeyChar()); + } + switch (evt.getKeyCode()) + { + case KeyEvent.VK_V: + if (!evt.isControlDown()) + { + AlignmentPanel newap = + new Jalview2XML().copyAlignPanel(alignPanel, true); + + if(viewport.viewName==null) + viewport.viewName="View 1"; + + newap.av.historyList = viewport.historyList; + newap.av.redoList = viewport.redoList; + newap.av.viewName = "View " + + (Desktop.getViewCount(viewport.getSequenceSetId())+1); + + addAlignmentPanel(newap, false); + + tabbedPane.setSelectedIndex(tabbedPane.getTabCount()-1); + + } + break; + case KeyEvent.VK_G: + Desktop.instance.gatherViews(af); + break; + + case KeyEvent.VK_X: + if (!evt.isControlDown()) + { + Desktop.instance.explodeViews(af); + } + break; + + + 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 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){} - } + int aSize = alignPanels.size(); - Stack historyList = new Stack(); - Stack redoList = new Stack(); + tabbedPane.setVisible(aSize>1 || ap.av.viewName!=null); - void updateEditMenuBar() - { - if(historyList.size()>0) - { - undoMenuItem.setEnabled(true); - Object [] history = (Object[])historyList.get(0); - undoMenuItem.setText("Undo "+history[0]); - } - else + if (aSize == 1 && ap.av.viewName==null) { - undoMenuItem.setEnabled(false); - undoMenuItem.setText("Undo"); + this.getContentPane().add(ap, BorderLayout.CENTER); } - - if(redoList.size()>0) - { - redoMenuItem.setEnabled(true); - Object [] history = (Object[])redoList.get(0); - redoMenuItem.setText("Redo "+history[0]); - } else { - redoMenuItem.setEnabled(false); - redoMenuItem.setText("Redo"); - } - } - - public void addHistoryItem(String type) - { - // must make sure we add new sequence objects her, not refs to the existing sequences - redoList.clear(); + if (aSize == 2) + { + AlignmentPanel first = (AlignmentPanel) alignPanels.firstElement(); + tabbedPane.addTab(first.av.viewName==null?"Original":first.av.viewName,first); - SequenceI[] seq = new SequenceI[viewport.getAlignment().getHeight()]; - for(int i=0; i -1; i--) + public void internalFrameClosed( + javax.swing.event.InternalFrameEvent evt) { - SequenceI seq = viewport.alignment.getSequenceAt(i); - if (!sg.sequences.contains(seq)) - continue; + // System.out.println("deregistering discoverer listener"); + Desktop.discoverer.removePropertyChangeListener(thisListener); + closeMenuItem_actionPerformed(null); + } + ; + }); + } - SequenceI temp = viewport.alignment.getSequenceAt(i + 1); - if (sg.sequences.contains(temp)) - continue; + public void setGUINucleotide(boolean nucleotide) + { + showTranslation.setVisible( nucleotide ); + conservationMenuItem.setEnabled( !nucleotide ); + modifyConservation.setEnabled( !nucleotide ); - viewport.alignment.getSequences().setElementAt(temp, i); - viewport.alignment.getSequences().setElementAt(seq, i + 1); - } + //Remember AlignFrame always starts as protein + if(!nucleotide) + { + calculateMenu.remove(calculateMenu.getItemCount()-2); } - - alignPanel.repaint(); } + /** + * Need to call this method when tabs are selected for multiple views, + * or when loading from Jalview2XML.java + * @param av AlignViewport + */ + void setMenusFromViewport(AlignViewport av) + { + colourTextMenuItem.setSelected(av.showColourText); + abovePIDThreshold.setSelected(av.getAbovePIDThreshold()); + conservationMenuItem.setSelected(av.getConservationSelected()); + seqLimits.setSelected(av.getShowJVSuffix()); + renderGapsMenuItem.setSelected(av.renderGaps); + wrapMenuItem.setSelected(av.wrapAlignment); + annotationPanelMenuItem.setState(av.showAnnotation); + viewBoxesMenuItem.setSelected(av.showBoxes); + viewTextMenuItem.setSelected(av.showText); + setColourSelected(ColourSchemeProperty. + getColourName(av.getGlobalColourScheme())); - protected void copy_actionPerformed(ActionEvent e) - { - if(viewport.getSelectionGroup()==null) - return; + showSeqFeatures.setSelected(av.showSequenceFeatures); + hiddenMarkers.setState(av.showHiddenMarkers); + applyToAllGroups.setState(av.colourAppliesToAllGroups); + smoothFont.setState(av.antiAlias); + + updateEditMenuBar(); + } - SequenceGroup sg = viewport.getSelectionGroup(); - Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard(); - StringBuffer buffer= new StringBuffer(); + Hashtable progressBars; + public void setProgressBar(String message, long id) + { + if(progressBars == null) + progressBars = new Hashtable(); - Hashtable orderedSeqs = new Hashtable(); - for(int i=0; i -1) + { + shortName = shortName.substring(shortName.lastIndexOf( + java.io.File.separatorChar) + 1); + } + new Jalview2XML().SaveAlignment(this, file, shortName); - public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e) - { - SequenceGroup sg = new SequenceGroup(); - for (int i=0; i 0) + // USE Jalview2XML to save this file + return true; + } + else { - int min = colSel.getMin(); - viewport.getAlignment().trimLeft(min); - colSel.compensateForEdit(0,min); - if(viewport.getSelectionGroup()!=null) - viewport.getSelectionGroup().adjustForRemoveLeft(min); + String[] omitHidden = null; - Vector groups = viewport.alignment.getGroups(); - for(int i=0; i