extends GAlignFrame implements DropTargetListener, FeatureListener
{
/** DOCUMENT ME!! */
- public static final int NEW_WINDOW_WIDTH = 700;
+ public static final int DEFAULT_WIDTH = 700;
/** DOCUMENT ME!! */
- public static final int NEW_WINDOW_HEIGHT = 500;
- AlignmentPanel alignPanel;
+ public static final int DEFAULT_HEIGHT = 500;
+ public AlignmentPanel alignPanel;
AlignViewport viewport;
+
+ Vector alignPanels = new Vector();
+
+
/** DOCUMENT ME!! */
public String currentFileFormat = null;
Stack historyList = new Stack();
private int treeCount = 0;
/**
+ * Creates a new AlignFrame object.
+ *
+ * @param al DOCUMENT ME!
+ */
+ public AlignFrame(AlignmentI al, int width, int height)
+ {
+ this(al, null, width, height);
+ }
+
+
+ /**
* new alignment window with hidden columns
* @param al AlignmentI
* @param hiddenColumns ColumnSelection or null
*/
- public AlignFrame(AlignmentI al, ColumnSelection hiddenColumns) {
-
+ public AlignFrame(AlignmentI al, ColumnSelection hiddenColumns,
+ int width, int height)
+ {
+ this.setSize(width, height);
viewport = new AlignViewport(al, hiddenColumns);
+ alignPanel = new AlignmentPanel(this, viewport);
+
+ if(al.getDataset()==null)
+ {
+ al.setDataset(null);
+ }
+
+ addAlignmentPanel(alignPanel);
+ init();
+ }
+
+ /**
+ * Make a new AlignFrame from exisiting alignmentPanels
+ * @param ap AlignmentPanel
+ * @param av AlignViewport
+ */
+ public AlignFrame(AlignmentPanel ap)
+ {
+ viewport = ap.av;
+ alignPanel = ap;
+ addAlignmentPanel(ap);
+ init();
+ }
+
+ void init()
+ {
this.setDropTarget(new java.awt.dnd.DropTarget(this, this));
- if(viewport.vconsensus==null)
+ if (viewport.vconsensus == null)
{
//Out of memory calculating consensus.
BLOSUM62Colour.setEnabled(false);
modifyPID.setEnabled(false);
}
- alignPanel = new AlignmentPanel(this, viewport);
-
String sortby = jalview.bin.Cache.getDefault("SORT_ALIGNMENT", "No sort");
- if(sortby.equals("Id"))
+ if (sortby.equals("Id"))
sortIDMenuItem_actionPerformed(null);
- else if(sortby.equals("Pairwise Identity"))
+ else if (sortby.equals("Pairwise Identity"))
sortPairwiseMenuItem_actionPerformed(null);
- // remove(tabbedPane);
- getContentPane().add(alignPanel, BorderLayout.CENTER);
+ if (Desktop.desktop != null)
+ {
+ addServiceListeners();
+ setGUINucleotide(viewport.alignment.isNucleotide());
+ }
+ if (jalview.bin.Cache.getDefault("WRAP_ALIGNMENT", false))
+ {
+ wrapMenuItem.setSelected(true);
+ wrapMenuItem_actionPerformed(null);
+ }
+ addKeyListener();
+ }
- // tabbedPane.add(al.isNucleotide() ? "DNA":"Protein", alignPanel);
+ void addKeyListener()
+ {
+ final AlignFrame af = this;
+ addKeyListener(new KeyAdapter()
+ {
+ public void keyPressed(KeyEvent evt)
+ {
+ if (viewport.cursorMode
+ && evt.getKeyCode() >= KeyEvent.VK_0
+ && evt.getKeyCode() <= KeyEvent.VK_9)
+ {
+ alignPanel.seqPanel.numberPressed(evt.getKeyChar());
+ }
- ///Dataset tab
- /////////////////////////
- if(al.getDataset()==null)
+ switch (evt.getKeyCode())
+ {
+ case KeyEvent.VK_V:
+ if (!evt.isControlDown())
+ {
+ AlignmentI al;
+ if(viewport.hasHiddenRows)
+ {
+ al = viewport.alignment.getHiddenSequences().getFullAlignment();
+ }
+ else
+ al = new Alignment(viewport.alignment.getSequencesArray());
+
+ AlignViewport newview = new AlignViewport(al);
+
+ AlignmentPanel copy = new AlignmentPanel(af, newview);
+
+ if(viewport.viewName==null)
+ viewport.viewName="View 1";
+
+ copy.av.sequenceSetID = viewport.getSequenceSetId();
+ copy.av.viewName = "View " +
+ (Desktop.getViewCount(viewport.getSequenceSetId())+1);
+
+
+ addAlignmentPanel(copy);
+ PaintRefresher.Register(copy, viewport.getSequenceSetId());
+ PaintRefresher.Register(alignPanel,
+ viewport.getSequenceSetId());
+
+ }
+ 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)
+ {
+ alignPanels.addElement(ap);
+
+ int aSize = alignPanels.size();
+
+ tabbedPane.setVisible(aSize>1 || ap.av.viewName!=null);
+
+ if (aSize == 1 && ap.av.viewName==null)
{
- al.setDataset(null);
+ this.getContentPane().add(ap, BorderLayout.CENTER);
+ }
+ else
+ {
+ if (aSize == 2)
+ {
+ AlignmentPanel first = (AlignmentPanel) alignPanels.firstElement();
+ tabbedPane.addTab(first.av.viewName==null?"Original":first.av.viewName,first);
+
+ this.getContentPane().add(tabbedPane, BorderLayout.CENTER);
+ }
+
+ tabbedPane.addTab(ap.av.viewName==null?"Original":ap.av.viewName, ap);
}
- // AlignViewport ds = new AlignViewport(al.getDataset(), true);
- // AlignmentPanel dap = new AlignmentPanel(this, ds);
- // tabbedPane.add("Dataset", dap);
- // viewports.add(ds);
- // alignPanels.add(dap);
- /////////////////////////
- viewport.addPropertyChangeListener(new PropertyChangeListener()
+ ap.av.addPropertyChangeListener(new PropertyChangeListener()
{
public void propertyChange(PropertyChangeEvent evt)
{
if (evt.getPropertyName().equals("alignment"))
{
+ PaintRefresher.Refresh(ap, ap.av.getSequenceSetId());
alignmentChanged();
}
}
});
-
- if (Desktop.desktop != null)
- {
- addServiceListeners();
- setGUINucleotide(al.isNucleotide());
- }
-
-
- if (jalview.bin.Cache.getDefault("WRAP_ALIGNMENT", false))
- {
- wrapMenuItem.setSelected(true);
- wrapMenuItem_actionPerformed(null);
- }
-
}
- /**
- * Creates a new AlignFrame object.
- *
- * @param al DOCUMENT ME!
- */
- public AlignFrame(AlignmentI al)
- {
- this(al, null);
- }
+
public AlignViewport getViewport()
{
}
}
});
+
addInternalFrameListener(new javax.swing.event.
InternalFrameAdapter()
{
}
+
/**
* DOCUMENT ME!
*
{
try
{
- PaintRefresher.components.remove(viewport.alignment);
+ for(int i=0; i<alignPanels.size(); i++)
+ {
+ AlignmentPanel ap = (AlignmentPanel)alignPanels.elementAt(i);
+ PaintRefresher.RemoveComponent(ap.seqPanel.seqCanvas);
+ PaintRefresher.RemoveComponent(ap.idPanel.idCanvas);
+ PaintRefresher.RemoveComponent(ap);
+ }
+
this.setClosed(true);
}
catch (Exception ex)
}
}
+
/**
* DOCUMENT ME!
*/
*/
protected void copy_actionPerformed(ActionEvent e)
{
+ System.gc();
if (viewport.getSelectionGroup() == null)
{
return;
seqs,
omitHidden);
+ StringSelection ss = new StringSelection(output);
+
+ try
+ {
+ //Its really worth setting the clipboard contents
+ //to empty before setting the large StringSelection!!
+ Toolkit.getDefaultToolkit().getSystemClipboard()
+ .setContents(new StringSelection(""), null);
- Toolkit.getDefaultToolkit().getSystemClipboard()
- .setContents(new StringSelection(output), Desktop.instance);
+ Toolkit.getDefaultToolkit().getSystemClipboard()
+ .setContents(ss, Desktop.instance);
+ }
+ catch (OutOfMemoryError er)
+ {
+ er.printStackTrace();
+ javax.swing.SwingUtilities.invokeLater(new Runnable()
+ {
+ public void run()
+ {
+ javax.swing.JOptionPane.showInternalMessageDialog(Desktop.desktop,
+ "Out of memory copying region!!"
+ +
+ "\nSee help files for increasing Java Virtual Machine memory."
+ , "Out of memory",
+ javax.swing.JOptionPane.WARNING_MESSAGE);
+ }
+ });
+
+ return;
+ }
Vector hiddenColumns = null;
if(viewport.hasHiddenColumns)
}
}
+
+
Desktop.jalviewClipboard = new Object[]{ seqs,
viewport.alignment.getDataset(),
hiddenColumns};
+ statusBar.setText("Copied "+seqs.length+" sequences to clipboard.");
}
/**
return;
}
- String str = (String) contents.getTransferData(DataFlavor.stringFlavor);
- if(str.length()<1)
+ String str, format;
+ try
+ {
+ str = (String) contents.getTransferData(DataFlavor.stringFlavor);
+ if (str.length() < 1)
+ return;
+
+ format = new IdentifyFile().Identify(str, "Paste");
+
+ }
+ catch (OutOfMemoryError er)
+ {
+ er.printStackTrace();
+ javax.swing.SwingUtilities.invokeLater(new Runnable()
+ {
+ public void run()
+ {
+ javax.swing.JOptionPane.showInternalMessageDialog(Desktop.desktop,
+ "Out of memory pasting sequences!!"
+ +
+ "\nSee help files for increasing Java Virtual Machine memory."
+ , "Out of memory",
+ javax.swing.JOptionPane.WARNING_MESSAGE);
+ }
+ });
+
return;
+ }
- String format = new IdentifyFile().Identify(str, "Paste");
SequenceI[] sequences;
if (newAlignment)
{
- alignment = new Alignment(sequences);
-
- if(Desktop.jalviewClipboard!=null)
- alignment.setDataset( (Alignment)Desktop.jalviewClipboard[1] );
- else
- alignment.setDataset( null );
+ alignment = new Alignment(sequences);
+ if (Desktop.jalviewClipboard != null)
+ alignment.setDataset( (Alignment) Desktop.jalviewClipboard[1]);
+ else
+ alignment.setDataset(null);
}
else
{
sequences[i].getEnd());
alignment.addSequence(newseq);
+ PaintRefresher.Refresh(alignPanel,
+ alignPanel.av.getSequenceSetId(),
+ null,newseq);
}
-
-
// Add any annotations attached to sequences
for (int i = 0; i < sequences.length; i++)
{
if(newAlignment)
{
- AlignFrame af = new AlignFrame(alignment);
+ AlignFrame af = new AlignFrame(alignment, DEFAULT_WIDTH, DEFAULT_HEIGHT);
String newtitle = new String("Copied sequences");
if(Desktop.jalviewClipboard!=null && Desktop.jalviewClipboard[2]!=null)
newtitle = newtitle.concat("- from " + title);
}
- Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH,
- NEW_WINDOW_HEIGHT);
+ Desktop.addInternalFrame(af, newtitle, DEFAULT_WIDTH,
+ DEFAULT_HEIGHT);
}
SequenceGroup sg = viewport.getSelectionGroup();
-
- //Jalview no longer allows deletion of residues.
- //Check here whether any residues are in selection area
- /* if( sg.getEndRes()-sg.getStartRes() < viewport.alignment.getWidth()-1)
- {
- for (int i = 0; i < sg.sequences.size(); i++)
- {
- SequenceI seq = sg.getSequenceAt(i);
- int j = sg.getStartRes();
- do
- {
- if (!jalview.util.Comparison.isGap(seq.getCharAt(j)))
- {
- JOptionPane.showInternalMessageDialog(
- Desktop.desktop, "Cannot delete residues from alignment!\n"
- + "Try hiding columns instead.",
- "Deletion of residues not permitted",
- JOptionPane.WARNING_MESSAGE);
-
- return;
- }
- j++;
- }while(j<=sg.getEndRes());
- }
- }*/
-
-
addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,
HistoryItem.HIDE));
if (seq.getSequence().length() < 1)
{
viewport.getAlignment().deleteSequence(seq);
+ PaintRefresher.Refresh(alignPanel,alignPanel.av.getSequenceSetId(),seq,null);
}
else
{
{
viewport.alignment.deleteAllGroups();
viewport.setSelectionGroup(null);
+ PaintRefresher.Refresh(this, viewport.getSequenceSetId());
alignPanel.repaint();
}
sg.setEndRes(viewport.alignment.getWidth() - 1);
viewport.setSelectionGroup(sg);
- PaintRefresher.Refresh(null, viewport.alignment);
+ alignPanel.repaint();
+ PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
}
/**
alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
alignPanel.idPanel.idCanvas.searchResults = null;
alignPanel.repaint();
- PaintRefresher.Refresh(null, viewport.alignment);
+ PaintRefresher.Refresh(this, viewport.getSequenceSetId());
}
/**
sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
}
- PaintRefresher.Refresh(null, viewport.alignment);
+ PaintRefresher.Refresh(this, viewport.getSequenceSetId());
}
public void invertColSel_actionPerformed(ActionEvent e)
viewport.getColumnSelection().compensateForEdits(shifts);
viewport.setStartRes(seq.findIndex(startRes)-1);
viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
+
}
/**
SequenceI current;
- int jSize;
Vector seqs = null;
viewport.setStartRes(seq.findIndex(startRes)-1);
viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
+
}
public void alignmentChanged()
{
- if(viewport.padGaps)
- viewport.getAlignment().padGaps();
+ AlignViewport av;
+ AlignmentPanel ap;
- if(viewport.vconsensus!=null && viewport.autoCalculateConsensus)
+ for(int i=0; i<alignPanels.size(); i++)
{
- viewport.updateConsensus();
- viewport.updateConservation();
- }
+ ap = (AlignmentPanel) alignPanels.elementAt(i);
+ av = ap.av;
- resetAllColourSchemes();
- if(alignPanel.overviewPanel!=null)
- alignPanel.overviewPanel.updateOverviewImage();
+ if (av.padGaps)
+ av.getAlignment().padGaps();
- viewport.alignment.adjustSequenceAnnotations();
+ if (av.vconsensus != null && av.autoCalculateConsensus)
+ {
+ av.updateConsensus();
+ av.updateConservation();
+ }
+
+ resetAllColourSchemes();
+
+ av.alignment.adjustSequenceAnnotations();
- if(alignPanel.overviewPanel!=null)
- alignPanel.overviewPanel.updateOverviewImage();
+ if (ap.overviewPanel != null)
+ ap.overviewPanel.updateOverviewImage();
- alignPanel.repaint();
+ ap.repaint();
+ }
}
void resetAllColourSchemes()
viewport.padGaps = padGapsMenuitem.isSelected();
- // if (viewport.padGaps)
- alignmentChanged();
+ viewport.firePropertyChange("alignment",
+ null,
+ viewport.getAlignment().getSequences());
}
/**
public void hideSelSequences_actionPerformed(ActionEvent e)
{
viewport.hideAllSelectedSeqs();
+ alignPanel.repaint();
}
public void hideSelColumns_actionPerformed(ActionEvent e)
viewport.autoCalculateConsensus = autoCalculate.isSelected();
if(viewport.autoCalculateConsensus)
{
- alignmentChanged();
+ viewport.firePropertyChange("alignment",
+ null,
+ viewport.getAlignment().getSequences());
}
}
}
title = title + " on region";
- tp = new TreePanel(viewport, type, pwType);
+ tp = new TreePanel(alignPanel, type, pwType);
}
else
{
if(viewport.alignment.getHeight()<2)
return;
- tp = new TreePanel(viewport, type, pwType);
+ tp = new TreePanel(alignPanel, type, pwType);
}
addTreeMenuItem(tp, title);
if (nf.getTree() != null)
{
- tp = new TreePanel(viewport,
+ tp = new TreePanel(alignPanel,
"FromFile",
title,
nf);
}
}
- AlignFrame af = new AlignFrame(al);
+ AlignFrame af = new AlignFrame(al, DEFAULT_WIDTH, DEFAULT_HEIGHT);
Desktop.addInternalFrame(af, "Translation of "+this.getTitle(),
- NEW_WINDOW_WIDTH,
- NEW_WINDOW_HEIGHT);
+ DEFAULT_WIDTH,
+ DEFAULT_HEIGHT);
- // AlignViewport newViewport = new AlignViewport(al);
- // AlignmentPanel ap = new AlignmentPanel(this, newViewport);
- // tabbedPane.add("Protein", ap);
- // viewports.add(newViewport);
- // alignPanels.add(ap);
-
- ///Dataset tab
- /////////////////////////
-
- // AlignViewport ds = new AlignViewport(al.getDataset());
- // ds.setDataset(true);
- // AlignmentPanel dap = new AlignmentPanel(this, ds);
- // tabbedPane.add("Dataset", dap);
- // viewports.add(ds);
- // alignPanels.add(dap);
- /////////////////////////
}
-/*public void tabSelected()
- {
- int index = tabbedPane.getSelectedIndex();
- viewport = (AlignViewport)viewports.elementAt(index);
- alignPanel = (AlignmentPanel)alignPanels.elementAt(index);
- }*/
-
/**
* DOCUMENT ME!
*
ex.printStackTrace();
}
}
+
+ public void tabSelectionChanged(int index)
+ {
+ if (index > -1)
+ {
+ alignPanel = (AlignmentPanel) alignPanels.elementAt(index);
+ viewport = alignPanel.av;
+ }
+ }
+
+ public void tabbedPane_mousePressed(MouseEvent e)
+ {
+ if(SwingUtilities.isRightMouseButton(e))
+ {
+ String reply = JOptionPane.showInternalInputDialog(this,
+ "Enter View Name",
+ "Edit View Name",
+ JOptionPane.QUESTION_MESSAGE);
+
+ if (reply != null)
+ {
+ viewport.viewName = reply;
+ tabbedPane.setTitleAt( tabbedPane.getSelectedIndex() ,reply);
+ }
+ }
+ }
+
+
+ public AlignViewport getCurrentView()
+ {
+ return viewport;
+ }
}