-\r
- int value = chooser.showOpenDialog(null);\r
-\r
- if (value == JalviewFileChooser.APPROVE_OPTION)\r
- {\r
- String choice = chooser.getSelectedFile().getPath();\r
- jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);\r
- loadJalviewDataFile(choice, null, null, null);\r
- }\r
-\r
- }\r
-\r
- /**\r
- * Close the current view or all views in the alignment frame. If the frame\r
- * only contains one view then the alignment will be removed from memory.\r
- * \r
- * @param closeAllTabs\r
- */\r
- @Override\r
- public void closeMenuItem_actionPerformed(boolean closeAllTabs)\r
- {\r
- if (alignPanels != null && alignPanels.size() < 2)\r
- {\r
- closeAllTabs = true;\r
- }\r
-\r
- try\r
- {\r
- if (alignPanels != null)\r
- {\r
- if (closeAllTabs)\r
- {\r
- if (this.isClosed())\r
- {\r
- // really close all the windows - otherwise wait till\r
- // setClosed(true) is called\r
- for (int i = 0; i < alignPanels.size(); i++)\r
- {\r
- AlignmentPanel ap = (AlignmentPanel) alignPanels.elementAt(i);\r
- ap.closePanel();\r
- }\r
- }\r
- }\r
- else\r
- {\r
- closeView(alignPanel);\r
- }\r
- }\r
-\r
- if (closeAllTabs)\r
- {\r
- this.setClosed(true);\r
- }\r
- } catch (Exception ex)\r
- {\r
- ex.printStackTrace();\r
- }\r
- }\r
-\r
- /**\r
- * close alignPanel2 and shuffle tabs appropriately.\r
- * \r
- * @param alignPanel2\r
- */\r
- public void closeView(AlignmentPanel alignPanel2)\r
- {\r
- int index = tabbedPane.getSelectedIndex();\r
- int closedindex = tabbedPane.indexOfComponent(alignPanel2);\r
- alignPanels.removeElement(alignPanel2);\r
- // Unnecessary\r
- // if (viewport == alignPanel2.av)\r
- // {\r
- // viewport = null;\r
- // }\r
- alignPanel2.closePanel();\r
- alignPanel2 = null;\r
-\r
- tabbedPane.removeTabAt(closedindex);\r
- tabbedPane.validate();\r
-\r
- if (index > closedindex || index == tabbedPane.getTabCount())\r
- {\r
- // modify currently selected tab index if necessary.\r
- index--;\r
- }\r
-\r
- this.tabSelectionChanged(index);\r
- }\r
-\r
- /**\r
- * DOCUMENT ME!\r
- */\r
- void updateEditMenuBar()\r
- {\r
-\r
- if (viewport.historyList.size() > 0)\r
- {\r
- undoMenuItem.setEnabled(true);\r
- CommandI command = (CommandI) viewport.historyList.peek();\r
- undoMenuItem.setText(MessageManager.formatMessage("label.undo_command", new String[]{command.getDescription()}));\r
- }\r
- else\r
- {\r
- undoMenuItem.setEnabled(false);\r
- undoMenuItem.setText(MessageManager.getString("action.undo"));\r
- }\r
-\r
- if (viewport.redoList.size() > 0)\r
- {\r
- redoMenuItem.setEnabled(true);\r
-\r
- CommandI command = (CommandI) viewport.redoList.peek();\r
- redoMenuItem.setText(MessageManager.formatMessage("label.redo_command", new String[]{command.getDescription()}));\r
- }\r
- else\r
- {\r
- redoMenuItem.setEnabled(false);\r
- redoMenuItem.setText(MessageManager.getString("action.redo"));\r
- }\r
- }\r
-\r
- public void addHistoryItem(CommandI command)\r
- {\r
- if (command.getSize() > 0)\r
- {\r
- viewport.historyList.push(command);\r
- viewport.redoList.clear();\r
- updateEditMenuBar();\r
- viewport.updateHiddenColumns();\r
- // viewport.hasHiddenColumns = (viewport.getColumnSelection() != null\r
- // && viewport.getColumnSelection().getHiddenColumns() != null &&\r
- // viewport.getColumnSelection()\r
- // .getHiddenColumns().size() > 0);\r
- }\r
- }\r
-\r
- /**\r
- * \r
- * @return alignment objects for all views\r
- */\r
- AlignmentI[] getViewAlignments()\r
- {\r
- if (alignPanels != null)\r
- {\r
- Enumeration e = alignPanels.elements();\r
- AlignmentI[] als = new AlignmentI[alignPanels.size()];\r
- for (int i = 0; e.hasMoreElements(); i++)\r
- {\r
- als[i] = ((AlignmentPanel) e.nextElement()).av.getAlignment();\r
- }\r
- return als;\r
- }\r
- if (viewport != null)\r
- {\r
- return new AlignmentI[]\r
- { viewport.getAlignment() };\r
- }\r
- return null;\r
- }\r
-\r
- /**\r
- * DOCUMENT ME!\r
- * \r
- * @param e\r
- * DOCUMENT ME!\r
- */\r
- @Override\r
- protected void undoMenuItem_actionPerformed(ActionEvent e)\r
- {\r
- if (viewport.historyList.empty())\r
- return;\r
- CommandI command = (CommandI) viewport.historyList.pop();\r
- viewport.redoList.push(command);\r
- command.undoCommand(getViewAlignments());\r
-\r
- AlignViewport originalSource = getOriginatingSource(command);\r
- updateEditMenuBar();\r
-\r
- if (originalSource != null)\r
- {\r
- if (originalSource != viewport)\r
- {\r
- Cache.log\r
- .warn("Implementation worry: mismatch of viewport origin for undo");\r
- }\r
- originalSource.updateHiddenColumns();\r
- // originalSource.hasHiddenColumns = (viewport.getColumnSelection() !=\r
- // null\r
- // && viewport.getColumnSelection().getHiddenColumns() != null &&\r
- // viewport.getColumnSelection()\r
- // .getHiddenColumns().size() > 0);\r
- originalSource.firePropertyChange("alignment", null, originalSource\r
- .getAlignment().getSequences());\r
- }\r
- }\r
-\r
- /**\r
- * DOCUMENT ME!\r
- * \r
- * @param e\r
- * DOCUMENT ME!\r
- */\r
- @Override\r
- protected void redoMenuItem_actionPerformed(ActionEvent e)\r
- {\r
- if (viewport.redoList.size() < 1)\r
- {\r
- return;\r
- }\r
-\r
- CommandI command = (CommandI) viewport.redoList.pop();\r
- viewport.historyList.push(command);\r
- command.doCommand(getViewAlignments());\r
-\r
- AlignViewport originalSource = getOriginatingSource(command);\r
- updateEditMenuBar();\r
-\r
- if (originalSource != null)\r
- {\r
-\r
- if (originalSource != viewport)\r
- {\r
- Cache.log\r
- .warn("Implementation worry: mismatch of viewport origin for redo");\r
- }\r
- originalSource.updateHiddenColumns();\r
- // originalSource.hasHiddenColumns = (viewport.getColumnSelection() !=\r
- // null\r
- // && viewport.getColumnSelection().getHiddenColumns() != null &&\r
- // viewport.getColumnSelection()\r
- // .getHiddenColumns().size() > 0);\r
- originalSource.firePropertyChange("alignment", null, originalSource\r
- .getAlignment().getSequences());\r
- }\r
- }\r
-\r
- AlignViewport getOriginatingSource(CommandI command)\r
- {\r
- AlignViewport originalSource = null;\r
- // For sequence removal and addition, we need to fire\r
- // the property change event FROM the viewport where the\r
- // original alignment was altered\r
- AlignmentI al = null;\r
- if (command instanceof EditCommand)\r
- {\r
- EditCommand editCommand = (EditCommand) command;\r
- al = editCommand.getAlignment();\r
- Vector comps = (Vector) PaintRefresher.components.get(viewport\r
- .getSequenceSetId());\r
-\r
- for (int i = 0; i < comps.size(); i++)\r
- {\r
- if (comps.elementAt(i) instanceof AlignmentPanel)\r
- {\r
- if (al == ((AlignmentPanel) comps.elementAt(i)).av.getAlignment())\r
- {\r
- originalSource = ((AlignmentPanel) comps.elementAt(i)).av;\r
- break;\r
- }\r
- }\r
- }\r
- }\r
-\r
- if (originalSource == null)\r
- {\r
- // The original view is closed, we must validate\r
- // the current view against the closed view first\r
- if (al != null)\r
- {\r
- PaintRefresher.validateSequences(al, viewport.getAlignment());\r
- }\r
-\r
- originalSource = viewport;\r
- }\r
-\r
- return originalSource;\r
- }\r
-\r
- /**\r
- * DOCUMENT ME!\r
- * \r
- * @param up\r
- * DOCUMENT ME!\r
- */\r
- public void moveSelectedSequences(boolean up)\r
- {\r
- SequenceGroup sg = viewport.getSelectionGroup();\r
-\r
- if (sg == null)\r
- {\r
- return;\r
- }\r
- viewport.getAlignment().moveSelectedSequencesByOne(sg,\r
- viewport.getHiddenRepSequences(), up);\r
- alignPanel.paintAlignment(true);\r
- }\r
-\r
- synchronized void slideSequences(boolean right, int size)\r
- {\r
- List<SequenceI> sg = new Vector();\r
- if (viewport.cursorMode)\r
- {\r
- sg.add(viewport.getAlignment().getSequenceAt(\r
- alignPanel.seqPanel.seqCanvas.cursorY));\r
- }\r
- else if (viewport.getSelectionGroup() != null\r
- && viewport.getSelectionGroup().getSize() != viewport\r
- .getAlignment().getHeight())\r
- {\r
- sg = viewport.getSelectionGroup().getSequences(\r
- viewport.getHiddenRepSequences());\r
- }\r
-\r
- if (sg.size() < 1)\r
- {\r
- return;\r
- }\r
-\r
- Vector invertGroup = new Vector();\r
-\r
- for (int i = 0; i < viewport.getAlignment().getHeight(); i++)\r
- {\r
- if (!sg.contains(viewport.getAlignment().getSequenceAt(i)))\r
- invertGroup.add(viewport.getAlignment().getSequenceAt(i));\r
- }\r
-\r
- SequenceI[] seqs1 = sg.toArray(new SequenceI[0]);\r
-\r
- SequenceI[] seqs2 = new SequenceI[invertGroup.size()];\r
- for (int i = 0; i < invertGroup.size(); i++)\r
- seqs2[i] = (SequenceI) invertGroup.elementAt(i);\r
-\r
- SlideSequencesCommand ssc;\r
- if (right)\r
- ssc = new SlideSequencesCommand("Slide Sequences", seqs2, seqs1,\r
- size, viewport.getGapCharacter());\r
- else\r
- ssc = new SlideSequencesCommand("Slide Sequences", seqs1, seqs2,\r
- size, viewport.getGapCharacter());\r
-\r
- int groupAdjustment = 0;\r
- if (ssc.getGapsInsertedBegin() && right)\r
- {\r
- if (viewport.cursorMode)\r
- alignPanel.seqPanel.moveCursor(size, 0);\r
- else\r
- groupAdjustment = size;\r
- }\r
- else if (!ssc.getGapsInsertedBegin() && !right)\r
- {\r
- if (viewport.cursorMode)\r
- alignPanel.seqPanel.moveCursor(-size, 0);\r
- else\r
- groupAdjustment = -size;\r
- }\r
-\r
- if (groupAdjustment != 0)\r
- {\r
- viewport.getSelectionGroup().setStartRes(\r
- viewport.getSelectionGroup().getStartRes() + groupAdjustment);\r
- viewport.getSelectionGroup().setEndRes(\r
- viewport.getSelectionGroup().getEndRes() + groupAdjustment);\r
- }\r
-\r
- boolean appendHistoryItem = false;\r
- if (viewport.historyList != null && viewport.historyList.size() > 0\r
- && viewport.historyList.peek() instanceof SlideSequencesCommand)\r
- {\r
- appendHistoryItem = ssc\r
- .appendSlideCommand((SlideSequencesCommand) viewport.historyList\r
- .peek());\r
- }\r
-\r
- if (!appendHistoryItem)\r
- addHistoryItem(ssc);\r
-\r
- repaint();\r
- }\r
-\r
- /**\r
- * DOCUMENT ME!\r
- * \r
- * @param e\r
- * DOCUMENT ME!\r
- */\r
- @Override\r
- protected void copy_actionPerformed(ActionEvent e)\r
- {\r
- System.gc();\r
- if (viewport.getSelectionGroup() == null)\r
- {\r
- return;\r
- }\r
- // TODO: preserve the ordering of displayed alignment annotation in any\r
- // internal paste (particularly sequence associated annotation)\r
- SequenceI[] seqs = viewport.getSelectionAsNewSequence();\r
- String[] omitHidden = null;\r
-\r
- if (viewport.hasHiddenColumns())\r
- {\r
- omitHidden = viewport.getViewAsString(true);\r
- }\r
-\r
- String output = new FormatAdapter().formatSequences("Fasta", seqs,\r
- omitHidden);\r
-\r
- StringSelection ss = new StringSelection(output);\r
-\r
- try\r
- {\r
- jalview.gui.Desktop.internalCopy = true;\r
- // Its really worth setting the clipboard contents\r
- // to empty before setting the large StringSelection!!\r
- Toolkit.getDefaultToolkit().getSystemClipboard()\r
- .setContents(new StringSelection(""), null);\r
-\r
- Toolkit.getDefaultToolkit().getSystemClipboard()\r
- .setContents(ss, Desktop.instance);\r
- } catch (OutOfMemoryError er)\r
- {\r
- new OOMWarning("copying region", er);\r
- return;\r
- }\r
-\r
- Vector hiddenColumns = null;\r
- if (viewport.hasHiddenColumns())\r
- {\r
- hiddenColumns = new Vector();\r
- int hiddenOffset = viewport.getSelectionGroup().getStartRes(), hiddenCutoff = viewport\r
- .getSelectionGroup().getEndRes();\r
- for (int i = 0; i < viewport.getColumnSelection().getHiddenColumns()\r
- .size(); i++)\r
- {\r
- int[] region = (int[]) viewport.getColumnSelection()\r
- .getHiddenColumns().elementAt(i);\r
- if (region[0] >= hiddenOffset && region[1] <= hiddenCutoff)\r
- {\r
- hiddenColumns.addElement(new int[]\r
- { region[0] - hiddenOffset, region[1] - hiddenOffset });\r
- }\r
- }\r
- }\r
-\r
- Desktop.jalviewClipboard = new Object[]\r
- { seqs, viewport.getAlignment().getDataset(), hiddenColumns };\r
- statusBar.setText(MessageManager.formatMessage("label.copied_sequences_to_clipboard", new String[]{Integer.valueOf(seqs.length).toString()}));\r
- }\r
-\r
- /**\r
- * DOCUMENT ME!\r
- * \r
- * @param e\r
- * DOCUMENT ME!\r
- */\r
- @Override\r
- protected void pasteNew_actionPerformed(ActionEvent e)\r
- {\r
- paste(true);\r
- }\r
-\r
- /**\r
- * DOCUMENT ME!\r
- * \r
- * @param e\r
- * DOCUMENT ME!\r
- */\r
- @Override\r
- protected void pasteThis_actionPerformed(ActionEvent e)\r
- {\r
- paste(false);\r
- }\r
-\r
- /**\r
- * Paste contents of Jalview clipboard\r
- * \r
- * @param newAlignment\r
- * true to paste to a new alignment, otherwise add to this.\r
- */\r
- void paste(boolean newAlignment)\r
- {\r
- boolean externalPaste = true;\r
- try\r
- {\r
- Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();\r
- Transferable contents = c.getContents(this);\r
-\r
- if (contents == null)\r
- {\r
- return;\r
- }\r
-\r
- String str, format;\r
- try\r
- {\r
- str = (String) contents.getTransferData(DataFlavor.stringFlavor);\r
- if (str.length() < 1)\r
- {\r
- return;\r
- }\r
-\r
- format = new IdentifyFile().Identify(str, "Paste");\r
-\r
- } catch (OutOfMemoryError er)\r
- {\r
- new OOMWarning("Out of memory pasting sequences!!", er);\r
- return;\r
- }\r
-\r
- SequenceI[] sequences;\r
- boolean annotationAdded = false;\r
- AlignmentI alignment = null;\r
-\r
- if (Desktop.jalviewClipboard != null)\r
- {\r
- // The clipboard was filled from within Jalview, we must use the\r
- // sequences\r
- // And dataset from the copied alignment\r
- SequenceI[] newseq = (SequenceI[]) Desktop.jalviewClipboard[0];\r
- // be doubly sure that we create *new* sequence objects.\r
- sequences = new SequenceI[newseq.length];\r
- for (int i = 0; i < newseq.length; i++)\r
- {\r
- sequences[i] = new Sequence(newseq[i]);\r
- }\r
- alignment = new Alignment(sequences);\r
- externalPaste = false;\r
- }\r
- else\r
- {\r
- // parse the clipboard as an alignment.\r
- alignment = new FormatAdapter().readFile(str, "Paste", format);\r
- sequences = alignment.getSequencesArray();\r
- }\r
-\r
- int alwidth = 0;\r
- ArrayList<Integer> newGraphGroups = new ArrayList<Integer>();\r
- int fgroup = -1;\r
-\r
- if (newAlignment)\r
- {\r
-\r
- if (Desktop.jalviewClipboard != null)\r
- {\r
- // dataset is inherited\r
- alignment.setDataset((Alignment) Desktop.jalviewClipboard[1]);\r
- }\r
- else\r
- {\r
- // new dataset is constructed\r
- alignment.setDataset(null);\r
- }\r
- alwidth = alignment.getWidth() + 1;\r
- }\r
- else\r
- {\r
- AlignmentI pastedal = alignment; // preserve pasted alignment object\r
- // Add pasted sequences and dataset into existing alignment.\r
- alignment = viewport.getAlignment();\r
- alwidth = alignment.getWidth() + 1;\r
- // decide if we need to import sequences from an existing dataset\r
- boolean importDs = Desktop.jalviewClipboard != null\r
- && Desktop.jalviewClipboard[1] != alignment.getDataset();\r
- // importDs==true instructs us to copy over new dataset sequences from\r
- // an existing alignment\r
- Vector newDs = (importDs) ? new Vector() : null; // used to create\r
- // minimum dataset set\r
-\r
- for (int i = 0; i < sequences.length; i++)\r
- {\r
- if (importDs)\r
- {\r
- newDs.addElement(null);\r
- }\r
- SequenceI ds = sequences[i].getDatasetSequence(); // null for a simple\r
- // paste\r
- if (importDs && ds != null)\r
- {\r
- if (!newDs.contains(ds))\r
- {\r
- newDs.setElementAt(ds, i);\r
- ds = new Sequence(ds);\r
- // update with new dataset sequence\r
- sequences[i].setDatasetSequence(ds);\r
- }\r
- else\r
- {\r
- ds = sequences[newDs.indexOf(ds)].getDatasetSequence();\r
- }\r
- }\r
- else\r
- {\r
- // copy and derive new dataset sequence\r
- sequences[i] = sequences[i].deriveSequence();\r
- alignment.getDataset().addSequence(\r
- sequences[i].getDatasetSequence());\r
- // TODO: avoid creation of duplicate dataset sequences with a\r
- // 'contains' method using SequenceI.equals()/SequenceI.contains()\r
- }\r
- alignment.addSequence(sequences[i]); // merges dataset\r
- }\r
- if (newDs != null)\r
- {\r
- newDs.clear(); // tidy up\r
- }\r
- if (alignment.getAlignmentAnnotation() != null)\r
- {\r
- for (AlignmentAnnotation alan : alignment\r
- .getAlignmentAnnotation())\r
- {\r
- if (alan.graphGroup > fgroup)\r
- {\r
- fgroup = alan.graphGroup;\r
- }\r
- }\r
- }\r
- if (pastedal.getAlignmentAnnotation() != null)\r
- {\r
- // Add any annotation attached to alignment.\r
- AlignmentAnnotation[] alann = pastedal.getAlignmentAnnotation();\r
- for (int i = 0; i < alann.length; i++)\r
- {\r
- annotationAdded = true;\r
- if (alann[i].sequenceRef == null && !alann[i].autoCalculated)\r
- {\r
- AlignmentAnnotation newann = new AlignmentAnnotation(alann[i]);\r
- if (newann.graphGroup > -1)\r
- {\r
- if (newGraphGroups.size() <= newann.graphGroup\r
- || newGraphGroups.get(newann.graphGroup) == null)\r
- {\r
- for (int q = newGraphGroups.size(); q <= newann.graphGroup; q++)\r
- {\r
- newGraphGroups.add(q, null);\r
- }\r
- newGraphGroups.set(newann.graphGroup, new Integer(\r
- ++fgroup));\r
- }\r
- newann.graphGroup = newGraphGroups.get(newann.graphGroup)\r
- .intValue();\r
- }\r
-\r
- newann.padAnnotation(alwidth);\r
- alignment.addAnnotation(newann);\r
- }\r
- }\r
- }\r
- }\r
- if (!newAlignment)\r
- {\r
- // /////\r
- // ADD HISTORY ITEM\r
- //\r
- addHistoryItem(new EditCommand("Add sequences", EditCommand.PASTE,\r
- sequences, 0, alignment.getWidth(), alignment));\r
- }\r
- // Add any annotations attached to sequences\r
- for (int i = 0; i < sequences.length; i++)\r
- {\r
- if (sequences[i].getAnnotation() != null)\r
- {\r
- AlignmentAnnotation newann;\r
- for (int a = 0; a < sequences[i].getAnnotation().length; a++)\r
- {\r
- annotationAdded = true;\r
- newann = sequences[i].getAnnotation()[a];\r
- newann.adjustForAlignment();\r
- newann.padAnnotation(alwidth);\r
- if (newann.graphGroup > -1)\r
- {\r
- if (newann.graphGroup > -1)\r
- {\r
- if (newGraphGroups.size() <= newann.graphGroup\r
- || newGraphGroups.get(newann.graphGroup) == null)\r
- {\r
- for (int q = newGraphGroups.size(); q <= newann.graphGroup; q++)\r
- {\r
- newGraphGroups.add(q, null);\r
- }\r
- newGraphGroups.set(newann.graphGroup, new Integer(\r
- ++fgroup));\r
- }\r
- newann.graphGroup = newGraphGroups.get(newann.graphGroup)\r
- .intValue();\r
- }\r
- }\r
- alignment.addAnnotation(sequences[i].getAnnotation()[a]); // annotation\r
- // was\r
- // duplicated\r
- // earlier\r
- alignment\r
- .setAnnotationIndex(sequences[i].getAnnotation()[a], a);\r
- }\r
- }\r
- }\r
- if (!newAlignment)\r
- {\r
-\r
- // propagate alignment changed.\r
- viewport.setEndSeq(alignment.getHeight());\r
- if (annotationAdded)\r
- {\r
- // Duplicate sequence annotation in all views.\r
- AlignmentI[] alview = this.getViewAlignments();\r
- for (int i = 0; i < sequences.length; i++)\r
- {\r
- AlignmentAnnotation sann[] = sequences[i].getAnnotation();\r
- if (sann == null)\r
- continue;\r
- for (int avnum = 0; avnum < alview.length; avnum++)\r
- {\r
- if (alview[avnum] != alignment)\r
- {\r
- // duplicate in a view other than the one with input focus\r
- int avwidth = alview[avnum].getWidth() + 1;\r
- // this relies on sann being preserved after we\r
- // modify the sequence's annotation array for each duplication\r
- for (int a = 0; a < sann.length; a++)\r
- {\r
- AlignmentAnnotation newann = new AlignmentAnnotation(\r
- sann[a]);\r
- sequences[i].addAlignmentAnnotation(newann);\r
- newann.padAnnotation(avwidth);\r
- alview[avnum].addAnnotation(newann); // annotation was\r
- // duplicated earlier\r
- // TODO JAL-1145 graphGroups are not updated for sequence\r
- // annotation added to several views. This may cause\r
- // strangeness\r
- alview[avnum].setAnnotationIndex(newann, a);\r
- }\r
- }\r
- }\r
- }\r
- buildSortByAnnotationScoresMenu();\r
- }\r
- viewport.firePropertyChange("alignment", null,\r
- alignment.getSequences());\r
- if (alignPanels != null)\r
- {\r
- for (AlignmentPanel ap : ((Vector<AlignmentPanel>) alignPanels))\r
- {\r
- ap.validateAnnotationDimensions(false);\r
- }\r
- }\r
- else\r
- {\r
- alignPanel.validateAnnotationDimensions(false);\r
- }\r
-\r
- }\r
- else\r
- {\r
- AlignFrame af = new AlignFrame(alignment, DEFAULT_WIDTH,\r
- DEFAULT_HEIGHT);\r
- String newtitle = new String("Copied sequences");\r
-\r
- if (Desktop.jalviewClipboard != null\r
- && Desktop.jalviewClipboard[2] != null)\r
- {\r
- Vector hc = (Vector) Desktop.jalviewClipboard[2];\r
- for (int i = 0; i < hc.size(); i++)\r
- {\r
- int[] region = (int[]) hc.elementAt(i);\r
- af.viewport.hideColumns(region[0], region[1]);\r
- }\r
- }\r
-\r
- // >>>This is a fix for the moment, until a better solution is\r
- // found!!<<<\r
- af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer()\r
- .transferSettings(\r
- alignPanel.seqPanel.seqCanvas.getFeatureRenderer());\r
-\r
- // TODO: maintain provenance of an alignment, rather than just make the\r
- // title a concatenation of operations.\r
- if (!externalPaste)\r
- {\r
- if (title.startsWith("Copied sequences"))\r
- {\r
- newtitle = title;\r
- }\r
- else\r
- {\r
- newtitle = newtitle.concat("- from " + title);\r
- }\r
- }\r
- else\r
- {\r
- newtitle = new String("Pasted sequences");\r
- }\r
-\r
- Desktop.addInternalFrame(af, newtitle, DEFAULT_WIDTH,\r
- DEFAULT_HEIGHT);\r
-\r
- }\r
-\r
- } catch (Exception ex)\r
- {\r
- ex.printStackTrace();\r
- System.out.println("Exception whilst pasting: " + ex);\r
- // could be anything being pasted in here\r
- }\r
-\r
- }\r
-\r
- /**\r
- * DOCUMENT ME!\r
- * \r
- * @param e\r
- * DOCUMENT ME!\r
- */\r
- @Override\r
- protected void cut_actionPerformed(ActionEvent e)\r
- {\r
- copy_actionPerformed(null);\r
- delete_actionPerformed(null);\r
- }\r
-\r
- /**\r
- * DOCUMENT ME!\r
- * \r
- * @param e\r
- * DOCUMENT ME!\r
- */\r
- @Override\r
- protected void delete_actionPerformed(ActionEvent evt)\r
- {\r
-\r
- SequenceGroup sg = viewport.getSelectionGroup();\r
- if (sg == null)\r
- {\r
- return;\r
- }\r
-\r
- Vector seqs = new Vector();\r
- SequenceI seq;\r
- for (int i = 0; i < sg.getSize(); i++)\r
- {\r
- seq = sg.getSequenceAt(i);\r
- seqs.addElement(seq);\r
- }\r
-\r
- // If the cut affects all sequences, remove highlighted columns\r
- if (sg.getSize() == viewport.getAlignment().getHeight())\r
- {\r
- viewport.getColumnSelection().removeElements(sg.getStartRes(),\r
- sg.getEndRes() + 1);\r
- }\r
-\r
- SequenceI[] cut = new SequenceI[seqs.size()];\r
- for (int i = 0; i < seqs.size(); i++)\r
- {\r
- cut[i] = (SequenceI) seqs.elementAt(i);\r
- }\r
-\r
- /*\r
- * //ADD HISTORY ITEM\r
- */\r
- addHistoryItem(new EditCommand("Cut Sequences", EditCommand.CUT, cut,\r
- sg.getStartRes(), sg.getEndRes() - sg.getStartRes() + 1,\r
- viewport.getAlignment()));\r
-\r
- viewport.setSelectionGroup(null);\r
- viewport.sendSelection();\r
- viewport.getAlignment().deleteGroup(sg);\r
-\r
- viewport.firePropertyChange("alignment", null, viewport.getAlignment()\r
- .getSequences());\r
- if (viewport.getAlignment().getHeight() < 1)\r
- {\r
- try\r
- {\r
- this.setClosed(true);\r
- } catch (Exception ex)\r
- {\r
- }\r
- }\r
- }\r
-\r
- /**\r
- * DOCUMENT ME!\r
- * \r
- * @param e\r
- * DOCUMENT ME!\r
- */\r
- @Override\r
- protected void deleteGroups_actionPerformed(ActionEvent e)\r
- {\r
- if (avc.deleteGroups()) {\r
- PaintRefresher.Refresh(this, viewport.getSequenceSetId());\r
- alignPanel.updateAnnotation();\r
- alignPanel.paintAlignment(true);\r
- }\r
- }\r
-\r
- /**\r
- * DOCUMENT ME!\r
- * \r
- * @param e\r
- * DOCUMENT ME!\r
- */\r
- @Override\r
- public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
- {\r
- SequenceGroup sg = new SequenceGroup();\r
-\r
- for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)\r
- {\r
- sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);\r
- }\r
-\r
- sg.setEndRes(viewport.getAlignment().getWidth() - 1);\r
- viewport.setSelectionGroup(sg);\r
- viewport.sendSelection();\r
- alignPanel.paintAlignment(true);\r
- PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());\r
- }\r
-\r
- /**\r
- * DOCUMENT ME!\r
- * \r
- * @param e\r
- * DOCUMENT ME!\r
- */\r
- @Override\r
- public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
- {\r
- if (viewport.cursorMode)\r
- {\r
- alignPanel.seqPanel.keyboardNo1 = null;\r
- alignPanel.seqPanel.keyboardNo2 = null;\r
- }\r
- viewport.setSelectionGroup(null);\r
- viewport.getColumnSelection().clear();\r
- viewport.setSelectionGroup(null);\r
- alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);\r
- alignPanel.idPanel.idCanvas.searchResults = null;\r
- alignPanel.paintAlignment(true);\r
- PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());\r
- viewport.sendSelection();\r
- }\r
-\r
- /**\r
- * DOCUMENT ME!\r
- * \r
- * @param e\r
- * DOCUMENT ME!\r
- */\r
- @Override\r
- public void invertSequenceMenuItem_actionPerformed(ActionEvent e)\r
- {\r
- SequenceGroup sg = viewport.getSelectionGroup();\r
-\r
- if (sg == null)\r
- {\r
- selectAllSequenceMenuItem_actionPerformed(null);\r
-\r
- return;\r
- }\r
-\r
- for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)\r
- {\r
- sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);\r
- }\r
-\r
- alignPanel.paintAlignment(true);\r
- PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());\r
- viewport.sendSelection();\r
- }\r
-\r
- @Override\r
- public void invertColSel_actionPerformed(ActionEvent e)\r
- {\r
- viewport.invertColumnSelection();\r
- alignPanel.paintAlignment(true);\r
- viewport.sendSelection();\r
- }\r
-\r
- /**\r
- * DOCUMENT ME!\r
- * \r
- * @param e\r
- * DOCUMENT ME!\r
- */\r
- @Override\r
- public void remove2LeftMenuItem_actionPerformed(ActionEvent e)\r
- {\r
- trimAlignment(true);\r
- }\r
-\r
- /**\r
- * DOCUMENT ME!\r
- * \r
- * @param e\r
- * DOCUMENT ME!\r
- */\r
- @Override\r
- public void remove2RightMenuItem_actionPerformed(ActionEvent e)\r
- {\r
- trimAlignment(false);\r
- }\r
-\r
- void trimAlignment(boolean trimLeft)\r
- {\r
- ColumnSelection colSel = viewport.getColumnSelection();\r
- int column;\r
-\r
- if (colSel.size() > 0)\r
- {\r
- if (trimLeft)\r
- {\r
- column = colSel.getMin();\r
- }\r
- else\r
- {\r
- column = colSel.getMax();\r
- }\r
-\r
- SequenceI[] seqs;\r
- if (viewport.getSelectionGroup() != null)\r
- {\r
- seqs = viewport.getSelectionGroup().getSequencesAsArray(\r
- viewport.getHiddenRepSequences());\r
- }\r
- else\r
- {\r
- seqs = viewport.getAlignment().getSequencesArray();\r
- }\r
-\r
- TrimRegionCommand trimRegion;\r
- if (trimLeft)\r
- {\r
- trimRegion = new TrimRegionCommand("Remove Left",\r
- TrimRegionCommand.TRIM_LEFT, seqs, column,\r
- viewport.getAlignment(), viewport.getColumnSelection(),\r
- viewport.getSelectionGroup());\r
- viewport.setStartRes(0);\r
- }\r
- else\r
- {\r
- trimRegion = new TrimRegionCommand("Remove Right",\r
- TrimRegionCommand.TRIM_RIGHT, seqs, column,\r
- viewport.getAlignment(), viewport.getColumnSelection(),\r
- viewport.getSelectionGroup());\r
- }\r
-\r
- statusBar.setText(MessageManager.formatMessage("label.removed_columns", new String[]{Integer.valueOf(trimRegion.getSize()).toString()}));\r
-\r
- addHistoryItem(trimRegion);\r
-\r
- for (SequenceGroup sg : viewport.getAlignment().getGroups())\r
- {\r
- if ((trimLeft && !sg.adjustForRemoveLeft(column))\r
- || (!trimLeft && !sg.adjustForRemoveRight(column)))\r
- {\r
- viewport.getAlignment().deleteGroup(sg);\r
- }\r
- }\r
-\r
- viewport.firePropertyChange("alignment", null, viewport\r
- .getAlignment().getSequences());\r
- }\r
- }\r
-\r
- /**\r
- * DOCUMENT ME!\r
- * \r
- * @param e\r
- * DOCUMENT ME!\r
- */\r
- @Override\r
- public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)\r
- {\r
- int start = 0, end = viewport.getAlignment().getWidth() - 1;\r
-\r
- SequenceI[] seqs;\r
- if (viewport.getSelectionGroup() != null)\r
- {\r
- seqs = viewport.getSelectionGroup().getSequencesAsArray(\r
- viewport.getHiddenRepSequences());\r
- start = viewport.getSelectionGroup().getStartRes();\r
- end = viewport.getSelectionGroup().getEndRes();\r
- }\r
- else\r
- {\r
- seqs = viewport.getAlignment().getSequencesArray();\r
- }\r
-\r
- RemoveGapColCommand removeGapCols = new RemoveGapColCommand(\r
- "Remove Gapped Columns", seqs, start, end,\r
- viewport.getAlignment());\r
-\r
- addHistoryItem(removeGapCols);\r
-\r
- statusBar.setText(MessageManager.formatMessage("label.removed_empty_columns", new String[]{Integer.valueOf(removeGapCols.getSize()).toString()}));\r
-\r
- // This is to maintain viewport position on first residue\r
- // of first sequence\r
- SequenceI seq = viewport.getAlignment().getSequenceAt(0);\r
- int startRes = seq.findPosition(viewport.startRes);\r
- // ShiftList shifts;\r
- // viewport.getAlignment().removeGaps(shifts=new ShiftList());\r
- // edit.alColumnChanges=shifts.getInverse();\r
- // if (viewport.hasHiddenColumns)\r
- // viewport.getColumnSelection().compensateForEdits(shifts);\r
- viewport.setStartRes(seq.findIndex(startRes) - 1);\r
- viewport.firePropertyChange("alignment", null, viewport.getAlignment()\r
- .getSequences());\r
-\r
- }\r
-\r
- /**\r
- * DOCUMENT ME!\r
- * \r
- * @param e\r
- * DOCUMENT ME!\r
- */\r
- @Override\r
- public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)\r
- {\r
- int start = 0, end = viewport.getAlignment().getWidth() - 1;\r
-\r
- SequenceI[] seqs;\r
- if (viewport.getSelectionGroup() != null)\r
- {\r
- seqs = viewport.getSelectionGroup().getSequencesAsArray(\r
- viewport.getHiddenRepSequences());\r
- start = viewport.getSelectionGroup().getStartRes();\r
- end = viewport.getSelectionGroup().getEndRes();\r
- }\r
- else\r
- {\r
- seqs = viewport.getAlignment().getSequencesArray();\r
- }\r
-\r
- // This is to maintain viewport position on first residue\r
- // of first sequence\r
- SequenceI seq = viewport.getAlignment().getSequenceAt(0);\r
- int startRes = seq.findPosition(viewport.startRes);\r
-\r
- addHistoryItem(new RemoveGapsCommand("Remove Gaps", seqs, start, end,\r
- viewport.getAlignment()));\r
-\r
- viewport.setStartRes(seq.findIndex(startRes) - 1);\r
-\r
- viewport.firePropertyChange("alignment", null, viewport.getAlignment()\r
- .getSequences());\r
-\r
- }\r
-\r
- /**\r
- * DOCUMENT ME!\r
- * \r
- * @param e\r
- * DOCUMENT ME!\r
- */\r
- @Override\r
- public void padGapsMenuitem_actionPerformed(ActionEvent e)\r
- {\r
- viewport.setPadGaps(padGapsMenuitem.isSelected());\r
- viewport.firePropertyChange("alignment", null, viewport.getAlignment()\r
- .getSequences());\r
- }\r
-\r
- // else\r
- {\r
- // if (justifySeqs>0)\r
- {\r
- // alignment.justify(justifySeqs!=RIGHT_JUSTIFY);\r
- }\r
- }\r
-\r
- // }\r
-\r
- /**\r
- * DOCUMENT ME!\r
- * \r
- * @param e\r
- * DOCUMENT ME!\r
- */\r
- @Override\r
- public void findMenuItem_actionPerformed(ActionEvent e)\r
- {\r
- new Finder();\r
- }\r
-\r
- @Override\r
- public void newView_actionPerformed(ActionEvent e)\r
- {\r
- newView(true);\r
- }\r
-\r
- /**\r
- * \r
- * @param copyAnnotation\r
- * if true then duplicate all annnotation, groups and settings\r
- * @return new alignment panel, already displayed.\r
- */\r
- public AlignmentPanel newView(boolean copyAnnotation)\r
- {\r
- return newView(null, copyAnnotation);\r
- }\r
-\r
- /**\r
- * \r
- * @param viewTitle\r
- * title of newly created view\r
- * @return new alignment panel, already displayed.\r
- */\r
- public AlignmentPanel newView(String viewTitle)\r
- {\r
- return newView(viewTitle, true);\r
- }\r
-\r
- /**\r
- * \r
- * @param viewTitle\r
- * title of newly created view\r
- * @param copyAnnotation\r
- * if true then duplicate all annnotation, groups and settings\r
- * @return new alignment panel, already displayed.\r
- */\r
- public AlignmentPanel newView(String viewTitle, boolean copyAnnotation)\r
- {\r
- AlignmentPanel newap = new Jalview2XML().copyAlignPanel(alignPanel,\r
- true);\r
- if (!copyAnnotation)\r
- {\r
- // just remove all the current annotation except for the automatic stuff\r
- newap.av.getAlignment().deleteAllGroups();\r
- for (AlignmentAnnotation alan : newap.av.getAlignment()\r
- .getAlignmentAnnotation())\r
- {\r
- if (!alan.autoCalculated)\r
- {\r
- newap.av.getAlignment().deleteAnnotation(alan);\r
- }\r
- ;\r
- }\r
- }\r
-\r
- newap.av.gatherViewsHere = false;\r
-\r
- if (viewport.viewName == null)\r
- {\r
- viewport.viewName = "Original";\r
- }\r
-\r
- newap.av.historyList = viewport.historyList;\r
- newap.av.redoList = viewport.redoList;\r
-\r
- int index = Desktop.getViewCount(viewport.getSequenceSetId());\r
- // make sure the new view has a unique name - this is essential for Jalview\r
- // 2 archives\r
- boolean addFirstIndex = false;\r
- if (viewTitle == null || viewTitle.trim().length() == 0)\r
- {\r
- viewTitle = "View";\r
- addFirstIndex = true;\r
- }\r
- else\r
- {\r
- index = 1;// we count from 1 if given a specific name\r
- }\r
- String newViewName = viewTitle + ((addFirstIndex) ? " " + index : "");\r
- Vector comps = (Vector) PaintRefresher.components.get(viewport\r
- .getSequenceSetId());\r
- Vector existingNames = new Vector();\r
- for (int i = 0; i < comps.size(); i++)\r
- {\r
- if (comps.elementAt(i) instanceof AlignmentPanel)\r
- {\r
- AlignmentPanel ap = (AlignmentPanel) comps.elementAt(i);\r
- if (!existingNames.contains(ap.av.viewName))\r
- {\r
- existingNames.addElement(ap.av.viewName);\r
- }\r
- }\r
- }\r
-\r
- while (existingNames.contains(newViewName))\r
- {\r
- newViewName = viewTitle + " " + (++index);\r
- }\r
-\r
- newap.av.viewName = newViewName;\r
-\r
- addAlignmentPanel(newap, true);\r
- newap.alignmentChanged();\r
- \r
- if (alignPanels.size() == 2)\r
- {\r
- viewport.gatherViewsHere = true;\r
- }\r
- tabbedPane.setSelectedIndex(tabbedPane.getTabCount() - 1);\r
- return newap;\r
- }\r
-\r
- @Override\r
- public void expandViews_actionPerformed(ActionEvent e)\r
- {\r
- Desktop.instance.explodeViews(this);\r
- }\r
-\r
- @Override\r
- public void gatherViews_actionPerformed(ActionEvent e)\r
- {\r
- Desktop.instance.gatherViews(this);\r
- }\r
-\r
- /**\r
- * DOCUMENT ME!\r
- * \r
- * @param e\r
- * DOCUMENT ME!\r
- */\r
- @Override\r
- public void font_actionPerformed(ActionEvent e)\r
- {\r
- new FontChooser(alignPanel);\r
- }\r
-\r
- /**\r
- * DOCUMENT ME!\r
- * \r
- * @param e\r
- * DOCUMENT ME!\r
- */\r
- @Override\r
- protected void seqLimit_actionPerformed(ActionEvent e)\r
- {\r
- viewport.setShowJVSuffix(seqLimits.isSelected());\r
-\r
- alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel\r
- .calculateIdWidth());\r
- alignPanel.paintAlignment(true);\r
- }\r
-\r
- @Override\r
- public void idRightAlign_actionPerformed(ActionEvent e)\r
- {\r
- viewport.rightAlignIds = idRightAlign.isSelected();\r
- alignPanel.paintAlignment(true);\r
- }\r
-\r
- @Override\r
- public void centreColumnLabels_actionPerformed(ActionEvent e)\r
- {\r
- viewport.centreColumnLabels = centreColumnLabelsMenuItem.getState();\r
- alignPanel.paintAlignment(true);\r
- }\r
-\r
- /*\r
- * (non-Javadoc)\r
- * \r
- * @see jalview.jbgui.GAlignFrame#followHighlight_actionPerformed()\r
- */\r
- @Override\r
- protected void followHighlight_actionPerformed()\r
- {\r
- if (viewport.followHighlight = this.followHighlightMenuItem.getState())\r
- {\r
- alignPanel.scrollToPosition(\r
- alignPanel.seqPanel.seqCanvas.searchResults, false);\r
- }\r
- }\r
-\r
- /**\r
- * DOCUMENT ME!\r
- * \r
- * @param e\r
- * DOCUMENT ME!\r
- */\r
- @Override\r
- protected void colourTextMenuItem_actionPerformed(ActionEvent e)\r
- {\r
- viewport.setColourText(colourTextMenuItem.isSelected());\r
- alignPanel.paintAlignment(true);\r
- }\r
-\r
- /**\r
- * DOCUMENT ME!\r
- * \r
- * @param e\r
- * DOCUMENT ME!\r
- */\r
- @Override\r
- public void wrapMenuItem_actionPerformed(ActionEvent e)\r
- {\r
- scaleAbove.setVisible(wrapMenuItem.isSelected());\r
- scaleLeft.setVisible(wrapMenuItem.isSelected());\r
- scaleRight.setVisible(wrapMenuItem.isSelected());\r
- viewport.setWrapAlignment(wrapMenuItem.isSelected());\r
- alignPanel.setWrapAlignment(wrapMenuItem.isSelected());\r
- }\r
-\r
- @Override\r
- public void showAllSeqs_actionPerformed(ActionEvent e)\r
- {\r
- viewport.showAllHiddenSeqs();\r
- }\r
-\r
- @Override\r
- public void showAllColumns_actionPerformed(ActionEvent e)\r
- {\r
- viewport.showAllHiddenColumns();\r
- repaint();\r
- }\r
-\r
- @Override\r
- public void hideSelSequences_actionPerformed(ActionEvent e)\r
- {\r
- viewport.hideAllSelectedSeqs();\r
- alignPanel.paintAlignment(true);\r
- }\r
-\r
- /**\r
- * called by key handler and the hide all/show all menu items\r
- * \r
- * @param toggleSeqs\r
- * @param toggleCols\r
- */\r
- private void toggleHiddenRegions(boolean toggleSeqs, boolean toggleCols)\r
- {\r
-\r
- boolean hide = false;\r
- SequenceGroup sg = viewport.getSelectionGroup();\r
- if (!toggleSeqs && !toggleCols)\r
- {\r
- // Hide everything by the current selection - this is a hack - we do the\r
- // invert and then hide\r
- // first check that there will be visible columns after the invert.\r
- if ((viewport.getColumnSelection() != null\r
- && viewport.getColumnSelection().getSelected() != null && viewport\r
- .getColumnSelection().getSelected().size() > 0)\r
- || (sg != null && sg.getSize() > 0 && sg.getStartRes() <= sg\r
- .getEndRes()))\r
- {\r
- // now invert the sequence set, if required - empty selection implies\r
- // that no hiding is required.\r
- if (sg != null)\r
- {\r
- invertSequenceMenuItem_actionPerformed(null);\r
- sg = viewport.getSelectionGroup();\r
- toggleSeqs = true;\r
-\r
- }\r
- viewport.expandColSelection(sg, true);\r
- // finally invert the column selection and get the new sequence\r
- // selection.\r
- invertColSel_actionPerformed(null);\r
- toggleCols = true;\r
- }\r
- }\r
-\r
- if (toggleSeqs)\r
- {\r
- if (sg != null && sg.getSize() != viewport.getAlignment().getHeight())\r
- {\r
- hideSelSequences_actionPerformed(null);\r
- hide = true;\r
- }\r
- else if (!(toggleCols && viewport.getColumnSelection().getSelected()\r
- .size() > 0))\r
- {\r
- showAllSeqs_actionPerformed(null);\r
- }\r
- }\r
-\r
- if (toggleCols)\r
- {\r
- if (viewport.getColumnSelection().getSelected().size() > 0)\r
- {\r
- hideSelColumns_actionPerformed(null);\r
- if (!toggleSeqs)\r
- {\r
- viewport.setSelectionGroup(sg);\r
- }\r
- }\r
- else if (!hide)\r
- {\r
- showAllColumns_actionPerformed(null);\r
- }\r
- }\r
- }\r
-\r
- /*\r
- * (non-Javadoc)\r
- * \r
- * @see\r
- * jalview.jbgui.GAlignFrame#hideAllButSelection_actionPerformed(java.awt.\r
- * event.ActionEvent)\r
- */\r
- @Override\r
- public void hideAllButSelection_actionPerformed(ActionEvent e)\r
- {\r
- toggleHiddenRegions(false, false);\r
- }\r
-\r
- /*\r
- * (non-Javadoc)\r
- * \r
- * @see\r
- * jalview.jbgui.GAlignFrame#hideAllSelection_actionPerformed(java.awt.event\r
- * .ActionEvent)\r
- */\r
- @Override\r
- public void hideAllSelection_actionPerformed(ActionEvent e)\r
- {\r
- SequenceGroup sg = viewport.getSelectionGroup();\r
- viewport.expandColSelection(sg, false);\r
- viewport.hideAllSelectedSeqs();\r
- viewport.hideSelectedColumns();\r
- alignPanel.paintAlignment(true);\r
- }\r
-\r
- /*\r
- * (non-Javadoc)\r
- * \r
- * @see\r
- * jalview.jbgui.GAlignFrame#showAllhidden_actionPerformed(java.awt.event.\r
- * ActionEvent)\r
- */\r
- @Override\r
- public void showAllhidden_actionPerformed(ActionEvent e)\r
- {\r
- viewport.showAllHiddenColumns();\r
- viewport.showAllHiddenSeqs();\r
- alignPanel.paintAlignment(true);\r
- }\r
-\r
- @Override\r
- public void hideSelColumns_actionPerformed(ActionEvent e)\r
- {\r
- viewport.hideSelectedColumns();\r
- alignPanel.paintAlignment(true);\r
- }\r
-\r
- @Override\r
- public void hiddenMarkers_actionPerformed(ActionEvent e)\r
- {\r
- viewport.setShowHiddenMarkers(hiddenMarkers.isSelected());\r
- repaint();\r
- }\r
-\r
- /**\r
- * DOCUMENT ME!\r
- * \r
- * @param e\r
- * DOCUMENT ME!\r
- */\r
- @Override\r
- protected void scaleAbove_actionPerformed(ActionEvent e)\r
- {\r
- viewport.setScaleAboveWrapped(scaleAbove.isSelected());\r
- alignPanel.paintAlignment(true);\r
- }\r
-\r
- /**\r
- * DOCUMENT ME!\r
- * \r
- * @param e\r
- * DOCUMENT ME!\r
- */\r
- @Override\r
- protected void scaleLeft_actionPerformed(ActionEvent e)\r
- {\r
- viewport.setScaleLeftWrapped(scaleLeft.isSelected());\r
- alignPanel.paintAlignment(true);\r
- }\r
-\r
- /**\r
- * DOCUMENT ME!\r
- * \r
- * @param e\r
- * DOCUMENT ME!\r
- */\r
- @Override\r
- protected void scaleRight_actionPerformed(ActionEvent e)\r
- {\r
- viewport.setScaleRightWrapped(scaleRight.isSelected());\r
- alignPanel.paintAlignment(true);\r
- }\r
-\r
- /**\r
- * DOCUMENT ME!\r
- * \r
- * @param e\r
- * DOCUMENT ME!\r
- */\r
- @Override\r
- public void viewBoxesMenuItem_actionPerformed(ActionEvent e)\r
- {\r
- viewport.setShowBoxes(viewBoxesMenuItem.isSelected());\r
- alignPanel.paintAlignment(true);\r
- }\r
-\r
- /**\r
- * DOCUMENT ME!\r
- * \r
- * @param e\r
- * DOCUMENT ME!\r
- */\r
- @Override\r
- public void viewTextMenuItem_actionPerformed(ActionEvent e)\r
- {\r
- viewport.setShowText(viewTextMenuItem.isSelected());\r
- alignPanel.paintAlignment(true);\r
- }\r
-\r
- /**\r
- * DOCUMENT ME!\r
- * \r
- * @param e\r
- * DOCUMENT ME!\r
- */\r
- @Override\r
- protected void renderGapsMenuItem_actionPerformed(ActionEvent e)\r
- {\r
- viewport.setRenderGaps(renderGapsMenuItem.isSelected());\r
- alignPanel.paintAlignment(true);\r
- }\r
-\r
- public FeatureSettings featureSettings;\r
-\r
- @Override\r
- public void featureSettings_actionPerformed(ActionEvent e)\r
- {\r
- if (featureSettings != null)\r
- {\r
- featureSettings.close();\r
- featureSettings = null;\r
- }\r
- if (!showSeqFeatures.isSelected())\r
- {\r
- // make sure features are actually displayed\r
- showSeqFeatures.setSelected(true);\r
- showSeqFeatures_actionPerformed(null);\r
- }\r
- featureSettings = new FeatureSettings(this);\r
- }\r
-\r
- /**\r
- * Set or clear 'Show Sequence Features'\r
- * \r
- * @param evt\r
- * DOCUMENT ME!\r
- */\r
- @Override\r
- public void showSeqFeatures_actionPerformed(ActionEvent evt)\r
- {\r
- viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());\r
- alignPanel.paintAlignment(true);\r
- if (alignPanel.getOverviewPanel() != null)\r
- {\r
- alignPanel.getOverviewPanel().updateOverviewImage();\r
- }\r
- }\r
-\r
- /**\r
- * Set or clear 'Show Sequence Features'\r
- * \r
- * @param evt\r
- * DOCUMENT ME!\r
- */\r
- @Override\r
- public void showSeqFeaturesHeight_actionPerformed(ActionEvent evt)\r
- {\r
- viewport.setShowSequenceFeaturesHeight(showSeqFeaturesHeight\r
- .isSelected());\r
- if (viewport.getShowSequenceFeaturesHeight())\r
- {\r
- // ensure we're actually displaying features\r
- viewport.setShowSequenceFeatures(true);\r
- showSeqFeatures.setSelected(true);\r
- }\r
- alignPanel.paintAlignment(true);\r
- if (alignPanel.getOverviewPanel() != null)\r
- {\r
- alignPanel.getOverviewPanel().updateOverviewImage();\r
- }\r
- }\r
-\r
- /**\r
- * DOCUMENT ME!\r
- * \r
- * @param e\r
- * DOCUMENT ME!\r
- */\r
- @Override\r
- public void annotationPanelMenuItem_actionPerformed(ActionEvent e)\r
- {\r
- viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());\r
- alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());\r
- }\r
-\r
- @Override\r
- public void alignmentProperties()\r
- {\r
- JEditorPane editPane = new JEditorPane("text/html", "");\r
- editPane.setEditable(false);\r
- StringBuffer contents = new AlignmentProperties(viewport.getAlignment())\r
- .formatAsHtml();\r
- editPane.setText(MessageManager.formatMessage("label.html_content", new String[]{contents.toString()}));\r
- JInternalFrame frame = new JInternalFrame();\r
- frame.getContentPane().add(new JScrollPane(editPane));\r
-\r
+
+ int value = chooser.showOpenDialog(null);
+
+ if (value == JalviewFileChooser.APPROVE_OPTION)
+ {
+ String choice = chooser.getSelectedFile().getPath();
+ jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
+ loadJalviewDataFile(choice, null, null, null);
+ }
+
+ }
+
+ /**
+ * Close the current view or all views in the alignment frame. If the frame
+ * only contains one view then the alignment will be removed from memory.
+ *
+ * @param closeAllTabs
+ */
+ @Override
+ public void closeMenuItem_actionPerformed(boolean closeAllTabs)
+ {
+ if (alignPanels != null && alignPanels.size() < 2)
+ {
+ closeAllTabs = true;
+ }
+
+ try
+ {
+ if (alignPanels != null)
+ {
+ if (closeAllTabs)
+ {
+ if (this.isClosed())
+ {
+ // really close all the windows - otherwise wait till
+ // setClosed(true) is called
+ for (int i = 0; i < alignPanels.size(); i++)
+ {
+ AlignmentPanel ap = (AlignmentPanel) alignPanels.elementAt(i);
+ ap.closePanel();
+ }
+ }
+ }
+ else
+ {
+ closeView(alignPanel);
+ }
+ }
+
+ if (closeAllTabs)
+ {
+ this.setClosed(true);
+ }
+ } catch (Exception ex)
+ {
+ ex.printStackTrace();
+ }
+ }
+
+ /**
+ * close alignPanel2 and shuffle tabs appropriately.
+ *
+ * @param alignPanel2
+ */
+ public void closeView(AlignmentPanel alignPanel2)
+ {
+ int index = tabbedPane.getSelectedIndex();
+ int closedindex = tabbedPane.indexOfComponent(alignPanel2);
+ alignPanels.removeElement(alignPanel2);
+ // Unnecessary
+ // if (viewport == alignPanel2.av)
+ // {
+ // viewport = null;
+ // }
+ alignPanel2.closePanel();
+ alignPanel2 = null;
+
+ tabbedPane.removeTabAt(closedindex);
+ tabbedPane.validate();
+
+ if (index > closedindex || index == tabbedPane.getTabCount())
+ {
+ // modify currently selected tab index if necessary.
+ index--;
+ }
+
+ this.tabSelectionChanged(index);
+ }
+
+ /**
+ * DOCUMENT ME!
+ */
+ void updateEditMenuBar()
+ {
+
+ if (viewport.historyList.size() > 0)
+ {
+ undoMenuItem.setEnabled(true);
+ CommandI command = (CommandI) viewport.historyList.peek();
+ undoMenuItem.setText(MessageManager.formatMessage("label.undo_command", new String[]{command.getDescription()}));
+ }
+ else
+ {
+ undoMenuItem.setEnabled(false);
+ undoMenuItem.setText(MessageManager.getString("action.undo"));
+ }
+
+ if (viewport.redoList.size() > 0)
+ {
+ redoMenuItem.setEnabled(true);
+
+ CommandI command = (CommandI) viewport.redoList.peek();
+ redoMenuItem.setText(MessageManager.formatMessage("label.redo_command", new String[]{command.getDescription()}));
+ }
+ else
+ {
+ redoMenuItem.setEnabled(false);
+ redoMenuItem.setText(MessageManager.getString("action.redo"));
+ }
+ }
+
+ public void addHistoryItem(CommandI command)
+ {
+ if (command.getSize() > 0)
+ {
+ viewport.historyList.push(command);
+ viewport.redoList.clear();
+ updateEditMenuBar();
+ viewport.updateHiddenColumns();
+ // viewport.hasHiddenColumns = (viewport.getColumnSelection() != null
+ // && viewport.getColumnSelection().getHiddenColumns() != null &&
+ // viewport.getColumnSelection()
+ // .getHiddenColumns().size() > 0);
+ }
+ }
+
+ /**
+ *
+ * @return alignment objects for all views
+ */
+ AlignmentI[] getViewAlignments()
+ {
+ if (alignPanels != null)
+ {
+ Enumeration e = alignPanels.elements();
+ AlignmentI[] als = new AlignmentI[alignPanels.size()];
+ for (int i = 0; e.hasMoreElements(); i++)
+ {
+ als[i] = ((AlignmentPanel) e.nextElement()).av.getAlignment();
+ }
+ return als;
+ }
+ if (viewport != null)
+ {
+ return new AlignmentI[]
+ { viewport.getAlignment() };
+ }
+ return null;
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param e
+ * DOCUMENT ME!
+ */
+ @Override
+ protected void undoMenuItem_actionPerformed(ActionEvent e)
+ {
+ if (viewport.historyList.empty())
+ return;
+ CommandI command = (CommandI) viewport.historyList.pop();
+ viewport.redoList.push(command);
+ command.undoCommand(getViewAlignments());
+
+ AlignViewport originalSource = getOriginatingSource(command);
+ updateEditMenuBar();
+
+ if (originalSource != null)
+ {
+ if (originalSource != viewport)
+ {
+ Cache.log
+ .warn("Implementation worry: mismatch of viewport origin for undo");
+ }
+ originalSource.updateHiddenColumns();
+ // originalSource.hasHiddenColumns = (viewport.getColumnSelection() !=
+ // null
+ // && viewport.getColumnSelection().getHiddenColumns() != null &&
+ // viewport.getColumnSelection()
+ // .getHiddenColumns().size() > 0);
+ originalSource.firePropertyChange("alignment", null, originalSource
+ .getAlignment().getSequences());
+ }
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param e
+ * DOCUMENT ME!
+ */
+ @Override
+ protected void redoMenuItem_actionPerformed(ActionEvent e)
+ {
+ if (viewport.redoList.size() < 1)
+ {
+ return;
+ }
+
+ CommandI command = (CommandI) viewport.redoList.pop();
+ viewport.historyList.push(command);
+ command.doCommand(getViewAlignments());
+
+ AlignViewport originalSource = getOriginatingSource(command);
+ updateEditMenuBar();
+
+ if (originalSource != null)
+ {
+
+ if (originalSource != viewport)
+ {
+ Cache.log
+ .warn("Implementation worry: mismatch of viewport origin for redo");
+ }
+ originalSource.updateHiddenColumns();
+ // originalSource.hasHiddenColumns = (viewport.getColumnSelection() !=
+ // null
+ // && viewport.getColumnSelection().getHiddenColumns() != null &&
+ // viewport.getColumnSelection()
+ // .getHiddenColumns().size() > 0);
+ originalSource.firePropertyChange("alignment", null, originalSource
+ .getAlignment().getSequences());
+ }
+ }
+
+ AlignViewport getOriginatingSource(CommandI command)
+ {
+ AlignViewport originalSource = null;
+ // For sequence removal and addition, we need to fire
+ // the property change event FROM the viewport where the
+ // original alignment was altered
+ AlignmentI al = null;
+ if (command instanceof EditCommand)
+ {
+ EditCommand editCommand = (EditCommand) command;
+ al = editCommand.getAlignment();
+ Vector comps = (Vector) PaintRefresher.components.get(viewport
+ .getSequenceSetId());
+
+ for (int i = 0; i < comps.size(); i++)
+ {
+ if (comps.elementAt(i) instanceof AlignmentPanel)
+ {
+ if (al == ((AlignmentPanel) comps.elementAt(i)).av.getAlignment())
+ {
+ originalSource = ((AlignmentPanel) comps.elementAt(i)).av;
+ break;
+ }
+ }
+ }
+ }
+
+ if (originalSource == null)
+ {
+ // The original view is closed, we must validate
+ // the current view against the closed view first
+ if (al != null)
+ {
+ PaintRefresher.validateSequences(al, viewport.getAlignment());
+ }
+
+ originalSource = viewport;
+ }
+
+ return originalSource;
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param up
+ * DOCUMENT ME!
+ */
+ public void moveSelectedSequences(boolean up)
+ {
+ SequenceGroup sg = viewport.getSelectionGroup();
+
+ if (sg == null)
+ {
+ return;
+ }
+ viewport.getAlignment().moveSelectedSequencesByOne(sg,
+ viewport.getHiddenRepSequences(), up);
+ alignPanel.paintAlignment(true);
+ }
+
+ synchronized void slideSequences(boolean right, int size)
+ {
+ List<SequenceI> sg = new Vector();
+ if (viewport.cursorMode)
+ {
+ sg.add(viewport.getAlignment().getSequenceAt(
+ alignPanel.seqPanel.seqCanvas.cursorY));
+ }
+ else if (viewport.getSelectionGroup() != null
+ && viewport.getSelectionGroup().getSize() != viewport
+ .getAlignment().getHeight())
+ {
+ sg = viewport.getSelectionGroup().getSequences(
+ viewport.getHiddenRepSequences());
+ }
+
+ if (sg.size() < 1)
+ {
+ return;
+ }
+
+ Vector invertGroup = new Vector();
+
+ for (int i = 0; i < viewport.getAlignment().getHeight(); i++)
+ {
+ if (!sg.contains(viewport.getAlignment().getSequenceAt(i)))
+ invertGroup.add(viewport.getAlignment().getSequenceAt(i));
+ }
+
+ SequenceI[] seqs1 = sg.toArray(new SequenceI[0]);
+
+ SequenceI[] seqs2 = new SequenceI[invertGroup.size()];
+ for (int i = 0; i < invertGroup.size(); i++)
+ seqs2[i] = (SequenceI) invertGroup.elementAt(i);
+
+ SlideSequencesCommand ssc;
+ if (right)
+ ssc = new SlideSequencesCommand("Slide Sequences", seqs2, seqs1,
+ size, viewport.getGapCharacter());
+ else
+ ssc = new SlideSequencesCommand("Slide Sequences", seqs1, seqs2,
+ size, viewport.getGapCharacter());
+
+ int groupAdjustment = 0;
+ if (ssc.getGapsInsertedBegin() && right)
+ {
+ if (viewport.cursorMode)
+ alignPanel.seqPanel.moveCursor(size, 0);
+ else
+ groupAdjustment = size;
+ }
+ else if (!ssc.getGapsInsertedBegin() && !right)
+ {
+ if (viewport.cursorMode)
+ alignPanel.seqPanel.moveCursor(-size, 0);
+ else
+ groupAdjustment = -size;
+ }
+
+ if (groupAdjustment != 0)
+ {
+ viewport.getSelectionGroup().setStartRes(
+ viewport.getSelectionGroup().getStartRes() + groupAdjustment);
+ viewport.getSelectionGroup().setEndRes(
+ viewport.getSelectionGroup().getEndRes() + groupAdjustment);
+ }
+
+ boolean appendHistoryItem = false;
+ if (viewport.historyList != null && viewport.historyList.size() > 0
+ && viewport.historyList.peek() instanceof SlideSequencesCommand)
+ {
+ appendHistoryItem = ssc
+ .appendSlideCommand((SlideSequencesCommand) viewport.historyList
+ .peek());
+ }
+
+ if (!appendHistoryItem)
+ addHistoryItem(ssc);
+
+ repaint();
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param e
+ * DOCUMENT ME!
+ */
+ @Override
+ protected void copy_actionPerformed(ActionEvent e)
+ {
+ System.gc();
+ if (viewport.getSelectionGroup() == null)
+ {
+ return;
+ }
+ // TODO: preserve the ordering of displayed alignment annotation in any
+ // internal paste (particularly sequence associated annotation)
+ SequenceI[] seqs = viewport.getSelectionAsNewSequence();
+ String[] omitHidden = null;
+
+ if (viewport.hasHiddenColumns())
+ {
+ omitHidden = viewport.getViewAsString(true);
+ }
+
+ String output = new FormatAdapter().formatSequences("Fasta", seqs,
+ omitHidden);
+
+ StringSelection ss = new StringSelection(output);
+
+ try
+ {
+ jalview.gui.Desktop.internalCopy = true;
+ // 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(ss, Desktop.instance);
+ } catch (OutOfMemoryError er)
+ {
+ new OOMWarning("copying region", er);
+ return;
+ }
+
+ Vector hiddenColumns = null;
+ if (viewport.hasHiddenColumns())
+ {
+ hiddenColumns = new Vector();
+ int hiddenOffset = viewport.getSelectionGroup().getStartRes(), hiddenCutoff = viewport
+ .getSelectionGroup().getEndRes();
+ for (int i = 0; i < viewport.getColumnSelection().getHiddenColumns()
+ .size(); i++)
+ {
+ int[] region = (int[]) viewport.getColumnSelection()
+ .getHiddenColumns().elementAt(i);
+ if (region[0] >= hiddenOffset && region[1] <= hiddenCutoff)
+ {
+ hiddenColumns.addElement(new int[]
+ { region[0] - hiddenOffset, region[1] - hiddenOffset });
+ }
+ }
+ }
+
+ Desktop.jalviewClipboard = new Object[]
+ { seqs, viewport.getAlignment().getDataset(), hiddenColumns };
+ statusBar.setText(MessageManager.formatMessage("label.copied_sequences_to_clipboard", new String[]{Integer.valueOf(seqs.length).toString()}));
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param e
+ * DOCUMENT ME!
+ */
+ @Override
+ protected void pasteNew_actionPerformed(ActionEvent e)
+ {
+ paste(true);
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param e
+ * DOCUMENT ME!
+ */
+ @Override
+ protected void pasteThis_actionPerformed(ActionEvent e)
+ {
+ paste(false);
+ }
+
+ /**
+ * Paste contents of Jalview clipboard
+ *
+ * @param newAlignment
+ * true to paste to a new alignment, otherwise add to this.
+ */
+ void paste(boolean newAlignment)
+ {
+ boolean externalPaste = true;
+ try
+ {
+ Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
+ Transferable contents = c.getContents(this);
+
+ if (contents == null)
+ {
+ return;
+ }
+
+ String str, format;
+ try
+ {
+ str = (String) contents.getTransferData(DataFlavor.stringFlavor);
+ if (str.length() < 1)
+ {
+ return;
+ }
+
+ format = new IdentifyFile().Identify(str, "Paste");
+
+ } catch (OutOfMemoryError er)
+ {
+ new OOMWarning("Out of memory pasting sequences!!", er);
+ return;
+ }
+
+ SequenceI[] sequences;
+ boolean annotationAdded = false;
+ AlignmentI alignment = null;
+
+ if (Desktop.jalviewClipboard != null)
+ {
+ // The clipboard was filled from within Jalview, we must use the
+ // sequences
+ // And dataset from the copied alignment
+ SequenceI[] newseq = (SequenceI[]) Desktop.jalviewClipboard[0];
+ // be doubly sure that we create *new* sequence objects.
+ sequences = new SequenceI[newseq.length];
+ for (int i = 0; i < newseq.length; i++)
+ {
+ sequences[i] = new Sequence(newseq[i]);
+ }
+ alignment = new Alignment(sequences);
+ externalPaste = false;
+ }
+ else
+ {
+ // parse the clipboard as an alignment.
+ alignment = new FormatAdapter().readFile(str, "Paste", format);
+ sequences = alignment.getSequencesArray();
+ }
+
+ int alwidth = 0;
+ ArrayList<Integer> newGraphGroups = new ArrayList<Integer>();
+ int fgroup = -1;
+
+ if (newAlignment)
+ {
+
+ if (Desktop.jalviewClipboard != null)
+ {
+ // dataset is inherited
+ alignment.setDataset((Alignment) Desktop.jalviewClipboard[1]);
+ }
+ else
+ {
+ // new dataset is constructed
+ alignment.setDataset(null);
+ }
+ alwidth = alignment.getWidth() + 1;
+ }
+ else
+ {
+ AlignmentI pastedal = alignment; // preserve pasted alignment object
+ // Add pasted sequences and dataset into existing alignment.
+ alignment = viewport.getAlignment();
+ alwidth = alignment.getWidth() + 1;
+ // decide if we need to import sequences from an existing dataset
+ boolean importDs = Desktop.jalviewClipboard != null
+ && Desktop.jalviewClipboard[1] != alignment.getDataset();
+ // importDs==true instructs us to copy over new dataset sequences from
+ // an existing alignment
+ Vector newDs = (importDs) ? new Vector() : null; // used to create
+ // minimum dataset set
+
+ for (int i = 0; i < sequences.length; i++)
+ {
+ if (importDs)
+ {
+ newDs.addElement(null);
+ }
+ SequenceI ds = sequences[i].getDatasetSequence(); // null for a simple
+ // paste
+ if (importDs && ds != null)
+ {
+ if (!newDs.contains(ds))
+ {
+ newDs.setElementAt(ds, i);
+ ds = new Sequence(ds);
+ // update with new dataset sequence
+ sequences[i].setDatasetSequence(ds);
+ }
+ else
+ {
+ ds = sequences[newDs.indexOf(ds)].getDatasetSequence();
+ }
+ }
+ else
+ {
+ // copy and derive new dataset sequence
+ sequences[i] = sequences[i].deriveSequence();
+ alignment.getDataset().addSequence(
+ sequences[i].getDatasetSequence());
+ // TODO: avoid creation of duplicate dataset sequences with a
+ // 'contains' method using SequenceI.equals()/SequenceI.contains()
+ }
+ alignment.addSequence(sequences[i]); // merges dataset
+ }
+ if (newDs != null)
+ {
+ newDs.clear(); // tidy up
+ }
+ if (alignment.getAlignmentAnnotation() != null)
+ {
+ for (AlignmentAnnotation alan : alignment
+ .getAlignmentAnnotation())
+ {
+ if (alan.graphGroup > fgroup)
+ {
+ fgroup = alan.graphGroup;
+ }
+ }
+ }
+ if (pastedal.getAlignmentAnnotation() != null)
+ {
+ // Add any annotation attached to alignment.
+ AlignmentAnnotation[] alann = pastedal.getAlignmentAnnotation();
+ for (int i = 0; i < alann.length; i++)
+ {
+ annotationAdded = true;
+ if (alann[i].sequenceRef == null && !alann[i].autoCalculated)
+ {
+ AlignmentAnnotation newann = new AlignmentAnnotation(alann[i]);
+ if (newann.graphGroup > -1)
+ {
+ if (newGraphGroups.size() <= newann.graphGroup
+ || newGraphGroups.get(newann.graphGroup) == null)
+ {
+ for (int q = newGraphGroups.size(); q <= newann.graphGroup; q++)
+ {
+ newGraphGroups.add(q, null);
+ }
+ newGraphGroups.set(newann.graphGroup, new Integer(
+ ++fgroup));
+ }
+ newann.graphGroup = newGraphGroups.get(newann.graphGroup)
+ .intValue();
+ }
+
+ newann.padAnnotation(alwidth);
+ alignment.addAnnotation(newann);
+ }
+ }
+ }
+ }
+ if (!newAlignment)
+ {
+ // /////
+ // ADD HISTORY ITEM
+ //
+ addHistoryItem(new EditCommand("Add sequences", EditCommand.PASTE,
+ sequences, 0, alignment.getWidth(), alignment));
+ }
+ // Add any annotations attached to sequences
+ for (int i = 0; i < sequences.length; i++)
+ {
+ if (sequences[i].getAnnotation() != null)
+ {
+ AlignmentAnnotation newann;
+ for (int a = 0; a < sequences[i].getAnnotation().length; a++)
+ {
+ annotationAdded = true;
+ newann = sequences[i].getAnnotation()[a];
+ newann.adjustForAlignment();
+ newann.padAnnotation(alwidth);
+ if (newann.graphGroup > -1)
+ {
+ if (newann.graphGroup > -1)
+ {
+ if (newGraphGroups.size() <= newann.graphGroup
+ || newGraphGroups.get(newann.graphGroup) == null)
+ {
+ for (int q = newGraphGroups.size(); q <= newann.graphGroup; q++)
+ {
+ newGraphGroups.add(q, null);
+ }
+ newGraphGroups.set(newann.graphGroup, new Integer(
+ ++fgroup));
+ }
+ newann.graphGroup = newGraphGroups.get(newann.graphGroup)
+ .intValue();
+ }
+ }
+ alignment.addAnnotation(sequences[i].getAnnotation()[a]); // annotation
+ // was
+ // duplicated
+ // earlier
+ alignment
+ .setAnnotationIndex(sequences[i].getAnnotation()[a], a);
+ }
+ }
+ }
+ if (!newAlignment)
+ {
+
+ // propagate alignment changed.
+ viewport.setEndSeq(alignment.getHeight());
+ if (annotationAdded)
+ {
+ // Duplicate sequence annotation in all views.
+ AlignmentI[] alview = this.getViewAlignments();
+ for (int i = 0; i < sequences.length; i++)
+ {
+ AlignmentAnnotation sann[] = sequences[i].getAnnotation();
+ if (sann == null)
+ continue;
+ for (int avnum = 0; avnum < alview.length; avnum++)
+ {
+ if (alview[avnum] != alignment)
+ {
+ // duplicate in a view other than the one with input focus
+ int avwidth = alview[avnum].getWidth() + 1;
+ // this relies on sann being preserved after we
+ // modify the sequence's annotation array for each duplication
+ for (int a = 0; a < sann.length; a++)
+ {
+ AlignmentAnnotation newann = new AlignmentAnnotation(
+ sann[a]);
+ sequences[i].addAlignmentAnnotation(newann);
+ newann.padAnnotation(avwidth);
+ alview[avnum].addAnnotation(newann); // annotation was
+ // duplicated earlier
+ // TODO JAL-1145 graphGroups are not updated for sequence
+ // annotation added to several views. This may cause
+ // strangeness
+ alview[avnum].setAnnotationIndex(newann, a);
+ }
+ }
+ }
+ }
+ buildSortByAnnotationScoresMenu();
+ }
+ viewport.firePropertyChange("alignment", null,
+ alignment.getSequences());
+ if (alignPanels != null)
+ {
+ for (AlignmentPanel ap : ((Vector<AlignmentPanel>) alignPanels))
+ {
+ ap.validateAnnotationDimensions(false);
+ }
+ }
+ else
+ {
+ alignPanel.validateAnnotationDimensions(false);
+ }
+
+ }
+ else
+ {
+ AlignFrame af = new AlignFrame(alignment, DEFAULT_WIDTH,
+ DEFAULT_HEIGHT);
+ String newtitle = new String("Copied sequences");
+
+ if (Desktop.jalviewClipboard != null
+ && Desktop.jalviewClipboard[2] != null)
+ {
+ Vector hc = (Vector) Desktop.jalviewClipboard[2];
+ for (int i = 0; i < hc.size(); i++)
+ {
+ int[] region = (int[]) hc.elementAt(i);
+ af.viewport.hideColumns(region[0], region[1]);
+ }
+ }
+
+ // >>>This is a fix for the moment, until a better solution is
+ // found!!<<<
+ af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer()
+ .transferSettings(
+ alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
+
+ // TODO: maintain provenance of an alignment, rather than just make the
+ // title a concatenation of operations.
+ if (!externalPaste)
+ {
+ if (title.startsWith("Copied sequences"))
+ {
+ newtitle = title;
+ }
+ else
+ {
+ newtitle = newtitle.concat("- from " + title);
+ }
+ }
+ else
+ {
+ newtitle = new String("Pasted sequences");
+ }
+
+ Desktop.addInternalFrame(af, newtitle, DEFAULT_WIDTH,
+ DEFAULT_HEIGHT);
+
+ }
+
+ } catch (Exception ex)
+ {
+ ex.printStackTrace();
+ System.out.println("Exception whilst pasting: " + ex);
+ // could be anything being pasted in here
+ }
+
+ }
+ @Override
+ protected void expand_newalign(ActionEvent e)
+ {
+ try {
+ AlignmentI alignment = AlignmentUtils.expandContext(getViewport().getAlignment(), -1);
+ AlignFrame af = new AlignFrame(alignment, DEFAULT_WIDTH,
+ DEFAULT_HEIGHT);
+ String newtitle = new String("Flanking alignment");
+
+ if (Desktop.jalviewClipboard != null
+ && Desktop.jalviewClipboard[2] != null)
+ {
+ Vector hc = (Vector) Desktop.jalviewClipboard[2];
+ for (int i = 0; i < hc.size(); i++)
+ {
+ int[] region = (int[]) hc.elementAt(i);
+ af.viewport.hideColumns(region[0], region[1]);
+ }
+ }
+
+ // >>>This is a fix for the moment, until a better solution is
+ // found!!<<<
+ af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer()
+ .transferSettings(
+ alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
+
+ // TODO: maintain provenance of an alignment, rather than just make the
+ // title a concatenation of operations.
+ {
+ if (title.startsWith("Copied sequences"))
+ {
+ newtitle = title;
+ }
+ else
+ {
+ newtitle = newtitle.concat("- from " + title);
+ }
+ }
+
+ Desktop.addInternalFrame(af, newtitle, DEFAULT_WIDTH,
+ DEFAULT_HEIGHT);
+
+ } catch (Exception ex)
+ {
+ ex.printStackTrace();
+ System.out.println("Exception whilst pasting: " + ex);
+ // could be anything being pasted in here
+ }
+ catch (OutOfMemoryError oom)
+ {
+ new OOMWarning("Viewing flanking region of alignment", oom);
+ }
+ }
+ /**
+ * DOCUMENT ME!
+ *
+ * @param e
+ * DOCUMENT ME!
+ */
+ @Override
+ protected void cut_actionPerformed(ActionEvent e)
+ {
+ copy_actionPerformed(null);
+ delete_actionPerformed(null);
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param e
+ * DOCUMENT ME!
+ */
+ @Override
+ protected void delete_actionPerformed(ActionEvent evt)
+ {
+
+ SequenceGroup sg = viewport.getSelectionGroup();
+ if (sg == null)
+ {
+ return;
+ }
+
+ Vector seqs = new Vector();
+ SequenceI seq;
+ for (int i = 0; i < sg.getSize(); i++)
+ {
+ seq = sg.getSequenceAt(i);
+ seqs.addElement(seq);
+ }
+
+ // If the cut affects all sequences, remove highlighted columns
+ if (sg.getSize() == viewport.getAlignment().getHeight())
+ {
+ viewport.getColumnSelection().removeElements(sg.getStartRes(),
+ sg.getEndRes() + 1);
+ }
+
+ SequenceI[] cut = new SequenceI[seqs.size()];
+ for (int i = 0; i < seqs.size(); i++)
+ {
+ cut[i] = (SequenceI) seqs.elementAt(i);
+ }
+
+ /*
+ * //ADD HISTORY ITEM
+ */
+ addHistoryItem(new EditCommand("Cut Sequences", EditCommand.CUT, cut,
+ sg.getStartRes(), sg.getEndRes() - sg.getStartRes() + 1,
+ viewport.getAlignment()));
+
+ viewport.setSelectionGroup(null);
+ viewport.sendSelection();
+ viewport.getAlignment().deleteGroup(sg);
+
+ viewport.firePropertyChange("alignment", null, viewport.getAlignment()
+ .getSequences());
+ if (viewport.getAlignment().getHeight() < 1)
+ {
+ try
+ {
+ this.setClosed(true);
+ } catch (Exception ex)
+ {
+ }
+ }
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param e
+ * DOCUMENT ME!
+ */
+ @Override
+ protected void deleteGroups_actionPerformed(ActionEvent e)
+ {
+ if (avc.deleteGroups()) {
+ PaintRefresher.Refresh(this, viewport.getSequenceSetId());
+ alignPanel.updateAnnotation();
+ alignPanel.paintAlignment(true);
+ }
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param e
+ * DOCUMENT ME!
+ */
+ @Override
+ public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
+ {
+ SequenceGroup sg = new SequenceGroup();
+
+ for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
+ {
+ sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
+ }
+
+ sg.setEndRes(viewport.getAlignment().getWidth() - 1);
+ viewport.setSelectionGroup(sg);
+ viewport.sendSelection();
+ alignPanel.paintAlignment(true);
+ PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param e
+ * DOCUMENT ME!
+ */
+ @Override
+ public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
+ {
+ if (viewport.cursorMode)
+ {
+ alignPanel.seqPanel.keyboardNo1 = null;
+ alignPanel.seqPanel.keyboardNo2 = null;
+ }
+ viewport.setSelectionGroup(null);
+ viewport.getColumnSelection().clear();
+ viewport.setSelectionGroup(null);
+ alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
+ alignPanel.idPanel.idCanvas.searchResults = null;
+ alignPanel.paintAlignment(true);
+ PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
+ viewport.sendSelection();
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param e
+ * DOCUMENT ME!
+ */
+ @Override
+ public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
+ {
+ SequenceGroup sg = viewport.getSelectionGroup();
+
+ if (sg == null)
+ {
+ selectAllSequenceMenuItem_actionPerformed(null);
+
+ return;
+ }
+
+ for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
+ {
+ sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
+ }
+
+ alignPanel.paintAlignment(true);
+ PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
+ viewport.sendSelection();
+ }
+
+ @Override
+ public void invertColSel_actionPerformed(ActionEvent e)
+ {
+ viewport.invertColumnSelection();
+ alignPanel.paintAlignment(true);
+ viewport.sendSelection();
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param e
+ * DOCUMENT ME!
+ */
+ @Override
+ public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
+ {
+ trimAlignment(true);
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param e
+ * DOCUMENT ME!
+ */
+ @Override
+ public void remove2RightMenuItem_actionPerformed(ActionEvent e)
+ {
+ trimAlignment(false);
+ }
+
+ void trimAlignment(boolean trimLeft)
+ {
+ ColumnSelection colSel = viewport.getColumnSelection();
+ int column;
+
+ if (colSel.size() > 0)
+ {
+ if (trimLeft)
+ {
+ column = colSel.getMin();
+ }
+ else
+ {
+ column = colSel.getMax();
+ }
+
+ SequenceI[] seqs;
+ if (viewport.getSelectionGroup() != null)
+ {
+ seqs = viewport.getSelectionGroup().getSequencesAsArray(
+ viewport.getHiddenRepSequences());
+ }
+ else
+ {
+ seqs = viewport.getAlignment().getSequencesArray();
+ }
+
+ TrimRegionCommand trimRegion;
+ if (trimLeft)
+ {
+ trimRegion = new TrimRegionCommand("Remove Left",
+ TrimRegionCommand.TRIM_LEFT, seqs, column,
+ viewport.getAlignment(), viewport.getColumnSelection(),
+ viewport.getSelectionGroup());
+ viewport.setStartRes(0);
+ }
+ else
+ {
+ trimRegion = new TrimRegionCommand("Remove Right",
+ TrimRegionCommand.TRIM_RIGHT, seqs, column,
+ viewport.getAlignment(), viewport.getColumnSelection(),
+ viewport.getSelectionGroup());
+ }
+
+ statusBar.setText(MessageManager.formatMessage("label.removed_columns", new String[]{Integer.valueOf(trimRegion.getSize()).toString()}));
+
+ addHistoryItem(trimRegion);
+
+ for (SequenceGroup sg : viewport.getAlignment().getGroups())
+ {
+ if ((trimLeft && !sg.adjustForRemoveLeft(column))
+ || (!trimLeft && !sg.adjustForRemoveRight(column)))
+ {
+ viewport.getAlignment().deleteGroup(sg);
+ }
+ }
+
+ viewport.firePropertyChange("alignment", null, viewport
+ .getAlignment().getSequences());
+ }
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param e
+ * DOCUMENT ME!
+ */
+ @Override
+ public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
+ {
+ int start = 0, end = viewport.getAlignment().getWidth() - 1;
+
+ SequenceI[] seqs;
+ if (viewport.getSelectionGroup() != null)
+ {
+ seqs = viewport.getSelectionGroup().getSequencesAsArray(
+ viewport.getHiddenRepSequences());
+ start = viewport.getSelectionGroup().getStartRes();
+ end = viewport.getSelectionGroup().getEndRes();
+ }
+ else
+ {
+ seqs = viewport.getAlignment().getSequencesArray();
+ }
+
+ RemoveGapColCommand removeGapCols = new RemoveGapColCommand(
+ "Remove Gapped Columns", seqs, start, end,
+ viewport.getAlignment());
+
+ addHistoryItem(removeGapCols);
+
+ statusBar.setText(MessageManager.formatMessage("label.removed_empty_columns", new String[]{Integer.valueOf(removeGapCols.getSize()).toString()}));
+
+ // This is to maintain viewport position on first residue
+ // of first sequence
+ SequenceI seq = viewport.getAlignment().getSequenceAt(0);
+ int startRes = seq.findPosition(viewport.startRes);
+ // ShiftList shifts;
+ // viewport.getAlignment().removeGaps(shifts=new ShiftList());
+ // edit.alColumnChanges=shifts.getInverse();
+ // if (viewport.hasHiddenColumns)
+ // viewport.getColumnSelection().compensateForEdits(shifts);
+ viewport.setStartRes(seq.findIndex(startRes) - 1);
+ viewport.firePropertyChange("alignment", null, viewport.getAlignment()
+ .getSequences());
+
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param e
+ * DOCUMENT ME!
+ */
+ @Override
+ public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
+ {
+ int start = 0, end = viewport.getAlignment().getWidth() - 1;
+
+ SequenceI[] seqs;
+ if (viewport.getSelectionGroup() != null)
+ {
+ seqs = viewport.getSelectionGroup().getSequencesAsArray(
+ viewport.getHiddenRepSequences());
+ start = viewport.getSelectionGroup().getStartRes();
+ end = viewport.getSelectionGroup().getEndRes();
+ }
+ else
+ {
+ seqs = viewport.getAlignment().getSequencesArray();
+ }
+
+ // This is to maintain viewport position on first residue
+ // of first sequence
+ SequenceI seq = viewport.getAlignment().getSequenceAt(0);
+ int startRes = seq.findPosition(viewport.startRes);
+
+ addHistoryItem(new RemoveGapsCommand("Remove Gaps", seqs, start, end,
+ viewport.getAlignment()));
+
+ viewport.setStartRes(seq.findIndex(startRes) - 1);
+
+ viewport.firePropertyChange("alignment", null, viewport.getAlignment()
+ .getSequences());
+
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param e
+ * DOCUMENT ME!
+ */
+ @Override
+ public void padGapsMenuitem_actionPerformed(ActionEvent e)
+ {
+ viewport.setPadGaps(padGapsMenuitem.isSelected());
+ viewport.firePropertyChange("alignment", null, viewport.getAlignment()
+ .getSequences());
+ }
+
+ // else
+ {
+ // if (justifySeqs>0)
+ {
+ // alignment.justify(justifySeqs!=RIGHT_JUSTIFY);
+ }
+ }
+
+ // }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param e
+ * DOCUMENT ME!
+ */
+ @Override
+ public void findMenuItem_actionPerformed(ActionEvent e)
+ {
+ new Finder();
+ }
+
+ @Override
+ public void newView_actionPerformed(ActionEvent e)
+ {
+ newView(true);
+ }
+
+ /**
+ *
+ * @param copyAnnotation
+ * if true then duplicate all annnotation, groups and settings
+ * @return new alignment panel, already displayed.
+ */
+ public AlignmentPanel newView(boolean copyAnnotation)
+ {
+ return newView(null, copyAnnotation);
+ }
+
+ /**
+ *
+ * @param viewTitle
+ * title of newly created view
+ * @return new alignment panel, already displayed.
+ */
+ public AlignmentPanel newView(String viewTitle)
+ {
+ return newView(viewTitle, true);
+ }
+
+ /**
+ *
+ * @param viewTitle
+ * title of newly created view
+ * @param copyAnnotation
+ * if true then duplicate all annnotation, groups and settings
+ * @return new alignment panel, already displayed.
+ */
+ public AlignmentPanel newView(String viewTitle, boolean copyAnnotation)
+ {
+ AlignmentPanel newap = new Jalview2XML().copyAlignPanel(alignPanel,
+ true);
+ if (!copyAnnotation)
+ {
+ // just remove all the current annotation except for the automatic stuff
+ newap.av.getAlignment().deleteAllGroups();
+ for (AlignmentAnnotation alan : newap.av.getAlignment()
+ .getAlignmentAnnotation())
+ {
+ if (!alan.autoCalculated)
+ {
+ newap.av.getAlignment().deleteAnnotation(alan);
+ }
+ ;
+ }
+ }
+
+ newap.av.gatherViewsHere = false;
+
+ if (viewport.viewName == null)
+ {
+ viewport.viewName = "Original";
+ }
+
+ newap.av.historyList = viewport.historyList;
+ newap.av.redoList = viewport.redoList;
+
+ int index = Desktop.getViewCount(viewport.getSequenceSetId());
+ // make sure the new view has a unique name - this is essential for Jalview
+ // 2 archives
+ boolean addFirstIndex = false;
+ if (viewTitle == null || viewTitle.trim().length() == 0)
+ {
+ viewTitle = "View";
+ addFirstIndex = true;
+ }
+ else
+ {
+ index = 1;// we count from 1 if given a specific name
+ }
+ String newViewName = viewTitle + ((addFirstIndex) ? " " + index : "");
+ Vector comps = (Vector) PaintRefresher.components.get(viewport
+ .getSequenceSetId());
+ Vector existingNames = new Vector();
+ for (int i = 0; i < comps.size(); i++)
+ {
+ if (comps.elementAt(i) instanceof AlignmentPanel)
+ {
+ AlignmentPanel ap = (AlignmentPanel) comps.elementAt(i);
+ if (!existingNames.contains(ap.av.viewName))
+ {
+ existingNames.addElement(ap.av.viewName);
+ }
+ }
+ }
+
+ while (existingNames.contains(newViewName))
+ {
+ newViewName = viewTitle + " " + (++index);
+ }
+
+ newap.av.viewName = newViewName;
+
+ addAlignmentPanel(newap, true);
+ newap.alignmentChanged();
+
+ if (alignPanels.size() == 2)
+ {
+ viewport.gatherViewsHere = true;
+ }
+ tabbedPane.setSelectedIndex(tabbedPane.getTabCount() - 1);
+ return newap;
+ }
+
+ @Override
+ public void expandViews_actionPerformed(ActionEvent e)
+ {
+ Desktop.instance.explodeViews(this);
+ }
+
+ @Override
+ public void gatherViews_actionPerformed(ActionEvent e)
+ {
+ Desktop.instance.gatherViews(this);
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param e
+ * DOCUMENT ME!
+ */
+ @Override
+ public void font_actionPerformed(ActionEvent e)
+ {
+ new FontChooser(alignPanel);
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param e
+ * DOCUMENT ME!
+ */
+ @Override
+ protected void seqLimit_actionPerformed(ActionEvent e)
+ {
+ viewport.setShowJVSuffix(seqLimits.isSelected());
+
+ alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel
+ .calculateIdWidth());
+ alignPanel.paintAlignment(true);
+ }
+
+ @Override
+ public void idRightAlign_actionPerformed(ActionEvent e)
+ {
+ viewport.rightAlignIds = idRightAlign.isSelected();
+ alignPanel.paintAlignment(true);
+ }
+
+ @Override
+ public void centreColumnLabels_actionPerformed(ActionEvent e)
+ {
+ viewport.centreColumnLabels = centreColumnLabelsMenuItem.getState();
+ alignPanel.paintAlignment(true);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see jalview.jbgui.GAlignFrame#followHighlight_actionPerformed()
+ */
+ @Override
+ protected void followHighlight_actionPerformed()
+ {
+ if (viewport.followHighlight = this.followHighlightMenuItem.getState())
+ {
+ alignPanel.scrollToPosition(
+ alignPanel.seqPanel.seqCanvas.searchResults, false);
+ }
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param e
+ * DOCUMENT ME!
+ */
+ @Override
+ protected void colourTextMenuItem_actionPerformed(ActionEvent e)
+ {
+ viewport.setColourText(colourTextMenuItem.isSelected());
+ alignPanel.paintAlignment(true);
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param e
+ * DOCUMENT ME!
+ */
+ @Override
+ public void wrapMenuItem_actionPerformed(ActionEvent e)
+ {
+ scaleAbove.setVisible(wrapMenuItem.isSelected());
+ scaleLeft.setVisible(wrapMenuItem.isSelected());
+ scaleRight.setVisible(wrapMenuItem.isSelected());
+ viewport.setWrapAlignment(wrapMenuItem.isSelected());
+ alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
+ }
+
+ @Override
+ public void showAllSeqs_actionPerformed(ActionEvent e)
+ {
+ viewport.showAllHiddenSeqs();
+ }
+
+ @Override
+ public void showAllColumns_actionPerformed(ActionEvent e)
+ {
+ viewport.showAllHiddenColumns();
+ repaint();
+ }
+
+ @Override
+ public void hideSelSequences_actionPerformed(ActionEvent e)
+ {
+ viewport.hideAllSelectedSeqs();
+ alignPanel.paintAlignment(true);
+ }
+
+ /**
+ * called by key handler and the hide all/show all menu items
+ *
+ * @param toggleSeqs
+ * @param toggleCols
+ */
+ private void toggleHiddenRegions(boolean toggleSeqs, boolean toggleCols)
+ {
+
+ boolean hide = false;
+ SequenceGroup sg = viewport.getSelectionGroup();
+ if (!toggleSeqs && !toggleCols)
+ {
+ // Hide everything by the current selection - this is a hack - we do the
+ // invert and then hide
+ // first check that there will be visible columns after the invert.
+ if ((viewport.getColumnSelection() != null
+ && viewport.getColumnSelection().getSelected() != null && viewport
+ .getColumnSelection().getSelected().size() > 0)
+ || (sg != null && sg.getSize() > 0 && sg.getStartRes() <= sg
+ .getEndRes()))
+ {
+ // now invert the sequence set, if required - empty selection implies
+ // that no hiding is required.
+ if (sg != null)
+ {
+ invertSequenceMenuItem_actionPerformed(null);
+ sg = viewport.getSelectionGroup();
+ toggleSeqs = true;
+
+ }
+ viewport.expandColSelection(sg, true);
+ // finally invert the column selection and get the new sequence
+ // selection.
+ invertColSel_actionPerformed(null);
+ toggleCols = true;
+ }
+ }
+
+ if (toggleSeqs)
+ {
+ if (sg != null && sg.getSize() != viewport.getAlignment().getHeight())
+ {
+ hideSelSequences_actionPerformed(null);
+ hide = true;
+ }
+ else if (!(toggleCols && viewport.getColumnSelection().getSelected()
+ .size() > 0))
+ {
+ showAllSeqs_actionPerformed(null);
+ }
+ }
+
+ if (toggleCols)
+ {
+ if (viewport.getColumnSelection().getSelected().size() > 0)
+ {
+ hideSelColumns_actionPerformed(null);
+ if (!toggleSeqs)
+ {
+ viewport.setSelectionGroup(sg);
+ }
+ }
+ else if (!hide)
+ {
+ showAllColumns_actionPerformed(null);
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * jalview.jbgui.GAlignFrame#hideAllButSelection_actionPerformed(java.awt.
+ * event.ActionEvent)
+ */
+ @Override
+ public void hideAllButSelection_actionPerformed(ActionEvent e)
+ {
+ toggleHiddenRegions(false, false);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * jalview.jbgui.GAlignFrame#hideAllSelection_actionPerformed(java.awt.event
+ * .ActionEvent)
+ */
+ @Override
+ public void hideAllSelection_actionPerformed(ActionEvent e)
+ {
+ SequenceGroup sg = viewport.getSelectionGroup();
+ viewport.expandColSelection(sg, false);
+ viewport.hideAllSelectedSeqs();
+ viewport.hideSelectedColumns();
+ alignPanel.paintAlignment(true);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * jalview.jbgui.GAlignFrame#showAllhidden_actionPerformed(java.awt.event.
+ * ActionEvent)
+ */
+ @Override
+ public void showAllhidden_actionPerformed(ActionEvent e)
+ {
+ viewport.showAllHiddenColumns();
+ viewport.showAllHiddenSeqs();
+ alignPanel.paintAlignment(true);
+ }
+
+ @Override
+ public void hideSelColumns_actionPerformed(ActionEvent e)
+ {
+ viewport.hideSelectedColumns();
+ alignPanel.paintAlignment(true);
+ }
+
+ @Override
+ public void hiddenMarkers_actionPerformed(ActionEvent e)
+ {
+ viewport.setShowHiddenMarkers(hiddenMarkers.isSelected());
+ repaint();
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param e
+ * DOCUMENT ME!
+ */
+ @Override
+ protected void scaleAbove_actionPerformed(ActionEvent e)
+ {
+ viewport.setScaleAboveWrapped(scaleAbove.isSelected());
+ alignPanel.paintAlignment(true);
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param e
+ * DOCUMENT ME!
+ */
+ @Override
+ protected void scaleLeft_actionPerformed(ActionEvent e)
+ {
+ viewport.setScaleLeftWrapped(scaleLeft.isSelected());
+ alignPanel.paintAlignment(true);
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param e
+ * DOCUMENT ME!
+ */
+ @Override
+ protected void scaleRight_actionPerformed(ActionEvent e)
+ {
+ viewport.setScaleRightWrapped(scaleRight.isSelected());
+ alignPanel.paintAlignment(true);
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param e
+ * DOCUMENT ME!
+ */
+ @Override
+ public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
+ {
+ viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
+ alignPanel.paintAlignment(true);
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param e
+ * DOCUMENT ME!
+ */
+ @Override
+ public void viewTextMenuItem_actionPerformed(ActionEvent e)
+ {
+ viewport.setShowText(viewTextMenuItem.isSelected());
+ alignPanel.paintAlignment(true);
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param e
+ * DOCUMENT ME!
+ */
+ @Override
+ protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
+ {
+ viewport.setRenderGaps(renderGapsMenuItem.isSelected());
+ alignPanel.paintAlignment(true);
+ }
+
+ public FeatureSettings featureSettings;
+
+ @Override
+ public void featureSettings_actionPerformed(ActionEvent e)
+ {
+ if (featureSettings != null)
+ {
+ featureSettings.close();
+ featureSettings = null;
+ }
+ if (!showSeqFeatures.isSelected())
+ {
+ // make sure features are actually displayed
+ showSeqFeatures.setSelected(true);
+ showSeqFeatures_actionPerformed(null);
+ }
+ featureSettings = new FeatureSettings(this);
+ }
+
+ /**
+ * Set or clear 'Show Sequence Features'
+ *
+ * @param evt
+ * DOCUMENT ME!
+ */
+ @Override
+ public void showSeqFeatures_actionPerformed(ActionEvent evt)
+ {
+ viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());
+ alignPanel.paintAlignment(true);
+ if (alignPanel.getOverviewPanel() != null)
+ {
+ alignPanel.getOverviewPanel().updateOverviewImage();
+ }
+ }
+
+ /**
+ * Set or clear 'Show Sequence Features'
+ *
+ * @param evt
+ * DOCUMENT ME!
+ */
+ @Override
+ public void showSeqFeaturesHeight_actionPerformed(ActionEvent evt)
+ {
+ viewport.setShowSequenceFeaturesHeight(showSeqFeaturesHeight
+ .isSelected());
+ if (viewport.getShowSequenceFeaturesHeight())
+ {
+ // ensure we're actually displaying features
+ viewport.setShowSequenceFeatures(true);
+ showSeqFeatures.setSelected(true);
+ }
+ alignPanel.paintAlignment(true);
+ if (alignPanel.getOverviewPanel() != null)
+ {
+ alignPanel.getOverviewPanel().updateOverviewImage();
+ }
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param e
+ * DOCUMENT ME!
+ */
+ @Override
+ public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
+ {
+ viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
+ alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
+ }
+
+ @Override
+ public void alignmentProperties()
+ {
+ JEditorPane editPane = new JEditorPane("text/html", "");
+ editPane.setEditable(false);
+ StringBuffer contents = new AlignmentProperties(viewport.getAlignment())
+ .formatAsHtml();
+ editPane.setText(MessageManager.formatMessage("label.html_content", new String[]{contents.toString()}));
+ JInternalFrame frame = new JInternalFrame();
+ frame.getContentPane().add(new JScrollPane(editPane));
+