From 5cd5b6e7864fe435ceb3f5c2f339a436ea0aac93 Mon Sep 17 00:00:00 2001 From: amwaterhouse Date: Tue, 8 Aug 2006 15:44:08 +0000 Subject: [PATCH] Applet has hidden regions --- src/jalview/appletgui/APopupMenu.java | 163 +++++-- src/jalview/appletgui/AlignFrame.java | 40 +- src/jalview/appletgui/AlignViewport.java | 281 +++++++++++ src/jalview/appletgui/AlignmentPanel.java | 40 +- src/jalview/appletgui/AnnotationPanel.java | 232 +++++---- src/jalview/appletgui/CutAndPasteTransfer.java | 2 +- src/jalview/appletgui/FeatureRenderer.java | 31 +- src/jalview/appletgui/IdCanvas.java | 153 ++++-- src/jalview/appletgui/IdPanel.java | 6 +- src/jalview/appletgui/OverviewPanel.java | 197 +++++--- src/jalview/appletgui/PCAPanel.java | 57 ++- src/jalview/appletgui/PairwiseAlignPanel.java | 53 ++- src/jalview/appletgui/ScalePanel.java | 318 ++++++++++--- src/jalview/appletgui/SeqCanvas.java | 599 +++++++++++++++--------- src/jalview/appletgui/SeqPanel.java | 372 +++++++++------ src/jalview/appletgui/SequenceRenderer.java | 32 +- src/jalview/appletgui/TreePanel.java | 51 +- 17 files changed, 1845 insertions(+), 782 deletions(-) diff --git a/src/jalview/appletgui/APopupMenu.java b/src/jalview/appletgui/APopupMenu.java index 3401cc4..28e40eb 100755 --- a/src/jalview/appletgui/APopupMenu.java +++ b/src/jalview/appletgui/APopupMenu.java @@ -59,6 +59,14 @@ public class APopupMenu MenuItem toUpper = new MenuItem("To Upper Case"); MenuItem toLower = new MenuItem("To Lower Case"); MenuItem toggleCase = new MenuItem("Toggle Case"); + Menu outputmenu = new Menu(); + Menu seqMenu = new Menu(); + MenuItem pdb = new MenuItem(); + MenuItem hideSeqs = new MenuItem(); + MenuItem repGroup = new MenuItem(); + + Sequence seq; + MenuItem revealAll = new MenuItem(); public APopupMenu(AlignmentPanel apanel, final Sequence seq, Vector links) { @@ -70,6 +78,7 @@ public class APopupMenu ////////////////////////////////////////////////////////// this.ap = apanel; + this.seq = seq; try { @@ -80,6 +89,15 @@ public class APopupMenu e.printStackTrace(); } + for (int i = 0; i < jalview.io.AppletFormatAdapter.formats.size()-1; i++) + { + MenuItem item = new MenuItem( (String) jalview.io.AppletFormatAdapter.formats. + elementAt( + i)); + item.addActionListener(this); + outputmenu.add(item); + } + SequenceGroup sg = ap.av.getSelectionGroup(); if (sg != null && sg.getSize(false)>0) @@ -96,7 +114,6 @@ public class APopupMenu else { remove(groupMenu); - remove(editMenu); } if (links!=null) @@ -135,22 +152,18 @@ public class APopupMenu }); linkMenu.add(item); } - add(linkMenu); - - if(seq!=null) - { - item = new MenuItem("Show PDB Structure"); - item.addActionListener(new java.awt.event.ActionListener() - { - public void actionPerformed(ActionEvent e) - { - addPDB(seq); - } - }); - - add(item); - } + seqMenu.add(linkMenu); } + if(seq!=null) + { + seqMenu.setLabel(seq.getName()); + repGroup.setLabel("Represent Group with " + seq.getName()); + } + else + remove(seqMenu); + + if(!ap.av.hasHiddenRows) + remove(revealAll); } public void itemStateChanged(ItemEvent evt) @@ -187,19 +200,31 @@ public class APopupMenu else if(source==nucleotideMenuItem) nucleotideMenuItem_actionPerformed(); - else if(source==userDefinedColour) - userDefinedColour_actionPerformed(); - else if(source==PIDColour) - PIDColour_actionPerformed(); - else if(source==BLOSUM62Colour) + else if (source == userDefinedColour) + userDefinedColour_actionPerformed(); + else if (source == PIDColour) + PIDColour_actionPerformed(); + else if (source == BLOSUM62Colour) BLOSUM62Colour_actionPerformed(); - else if(source==noColourmenuItem) + else if (source == noColourmenuItem) noColourmenuItem_actionPerformed(); - else if(source==conservationMenuItem) - conservationMenuItem_itemStateChanged(); - else if(source==unGroupMenuItem) + else if (source == conservationMenuItem) + conservationMenuItem_itemStateChanged(); + else if (source == unGroupMenuItem) unGroupMenuItem_actionPerformed(); + else if(source == pdb) + addPDB(); + else if(source == hideSeqs) + hideSequences(false); + else if(source == repGroup) + hideSequences(true); + else if(source == revealAll) + { + ap.av.showAllHiddenSeqs(); + ap.repaint(); + } + else if(source==copy) ap.alignFrame.copy_actionPerformed(); else if(source==cut) @@ -222,10 +247,45 @@ public class APopupMenu ap.seqPanel.seqCanvas.repaint(); } } + else + outputText(evt); + + } + + void outputText(ActionEvent e) + { + CutAndPasteTransfer cap = new CutAndPasteTransfer(false, ap.alignFrame); + Vector vseqs = new Vector(); + + String [] selection = ap.av.getViewAsString(true); + SequenceI [] seqs = ap.av.getSelectionAsNewSequence(); + if (selection != null) + { + for (int i = 0; i < selection.length; i++) + { + Sequence seq = new Sequence( + seqs[i].getName(), + selection[i], + seqs[i].getStart(), seqs[i].getEnd()); + seq.setDescription(seqs[i].getDescription()); + vseqs.addElement( seq ); + } + } + + Frame frame = new Frame(); + frame.add(cap); + jalview.bin.JalviewLite.addFrame(frame, + "Selection output - " + e.getActionCommand(), + 600, 500); + + cap.setText(new jalview.io.AppletFormatAdapter().formatSequences( + e.getActionCommand(), + vseqs, + ap.av.showJVSuffix)); } - void addPDB(Sequence seq) + void addPDB() { CutAndPasteTransfer cap = new CutAndPasteTransfer(true, ap.alignFrame); cap.setText("Paste your PDB file here."); @@ -239,7 +299,7 @@ public class APopupMenu throws Exception { groupMenu.setLabel("Group"); - groupMenu.setLabel("Define"); + groupMenu.setLabel("Selection"); unGroupMenuItem.setLabel("Remove Group"); unGroupMenuItem.addActionListener(this); @@ -257,11 +317,22 @@ public class APopupMenu showText.addItemListener(this); showColourText.setLabel("Colour Text"); showColourText.addItemListener(this); + outputmenu.setLabel("Output to Textbox..."); + seqMenu.setLabel("Sequence"); + pdb.setLabel("View PDB Structure"); + hideSeqs.setLabel("Hide Sequences"); + repGroup.setLabel("Represent Group with"); + revealAll.setLabel("Reveal All"); add(groupMenu); + this.add(seqMenu); + this.add(hideSeqs); + this.add(revealAll); + groupMenu.add(editMenu); + groupMenu.add(outputmenu); + groupMenu.addSeparator(); groupMenu.add(unGroupMenuItem); groupMenu.add(colourMenu); - groupMenu.addSeparator(); groupMenu.add(showBoxes); groupMenu.add(showText); groupMenu.add(showColourText); @@ -311,7 +382,6 @@ public class APopupMenu BLOSUM62Colour.addActionListener(this); conservationMenuItem.setLabel("Conservation"); - add(editMenu); editMenu.add(copy); copy.addActionListener(this); editMenu.add(cut); @@ -321,7 +391,13 @@ public class APopupMenu editMenu.add(toLower); toLower.addActionListener(this); editMenu.add(toggleCase); + seqMenu.add(pdb); + seqMenu.add(repGroup); toggleCase.addActionListener(this); + pdb.addActionListener(this); + hideSeqs.addActionListener(this); + repGroup.addActionListener(this); + revealAll.addActionListener(this); } @@ -514,4 +590,33 @@ public class APopupMenu refresh(); } + void hideSequences(boolean representGroup) + { + SequenceGroup sg = ap.av.getSelectionGroup(); + if(sg==null || sg.getSize(false)<1) + { + ap.av.hideSequence(seq); + return; + } + + int index = 0; + while(index < sg.getSize(false)) + { + if(representGroup && sg.getSequenceAt(index)!=seq) + { + seq.addHiddenSequence(sg.getSequenceAt(index)); + ap.av.hideSequence(sg.getSequenceAt(index)); + } + else if(!representGroup) + { + ap.av.hideSequence(sg.getSequenceAt(index)); + } + index ++; + } + + ap.av.setSelectionGroup(null); + ap.repaint(); + refresh(); + } + } diff --git a/src/jalview/appletgui/AlignFrame.java b/src/jalview/appletgui/AlignFrame.java index 2b53d76..e1d8ce8 100755 --- a/src/jalview/appletgui/AlignFrame.java +++ b/src/jalview/appletgui/AlignFrame.java @@ -38,7 +38,6 @@ public class AlignFrame extends Frame implements ActionListener, public AlignViewport viewport; int NEW_WINDOW_WIDTH = 700; int NEW_WINDOW_HEIGHT = 500; - jalview.bin.JalviewLite applet; String jalviewServletURL; @@ -58,7 +57,6 @@ public class AlignFrame extends Frame implements ActionListener, ex.printStackTrace(); } - this.applet = applet; viewport = new AlignViewport(al, applet); alignPanel = new AlignmentPanel(this, viewport); @@ -515,25 +513,25 @@ public void itemStateChanged(ItemEvent evt) StringBuffer url = new StringBuffer(jalviewServletURL); url.append("?open="+ - appendProtocol( applet.getParameter("file") ) ); + appendProtocol( viewport.applet.getParameter("file") ) ); - if(applet.getParameter("features")!=null) + if(viewport.applet.getParameter("features")!=null) { url.append( "&features=" ); - url.append( appendProtocol( applet.getParameter("features") ) ); + url.append( appendProtocol( viewport.applet.getParameter("features") ) ); } - if(applet.getParameter("defaultColour")!=null) + if(viewport.applet.getParameter("defaultColour")!=null) { url.append("&colour=" + - removeWhiteSpace(applet.getParameter("defaultColour")) + removeWhiteSpace(viewport.applet.getParameter("defaultColour")) ); } - if(applet.getParameter("userDefinedColour")!=null) + if(viewport.applet.getParameter("userDefinedColour")!=null) { url.append( "&colour=" + - removeWhiteSpace( applet.getParameter("userDefinedColour") ) + removeWhiteSpace( viewport.applet.getParameter("userDefinedColour") ) ); } @@ -562,7 +560,7 @@ public void itemStateChanged(ItemEvent evt) new URL(url); }catch(java.net.MalformedURLException ex) { - url = applet.getCodeBase()+url; + url = viewport.applet.getCodeBase()+url; } return url; } @@ -570,7 +568,7 @@ public void itemStateChanged(ItemEvent evt) public void closeMenuItem_actionPerformed() { PaintRefresher.components.remove(viewport.alignment); - if(PaintRefresher.components.size()==0 && applet==null) + if(PaintRefresher.components.size()==0 && viewport.applet==null) System.exit(0); this.dispose(); @@ -820,7 +818,7 @@ public void itemStateChanged(ItemEvent evt) newtitle = newtitle.concat("- from " + getTitle()); } AlignFrame af = new AlignFrame(new Alignment(newSeqs), - applet, + viewport.applet, newtitle, false); @@ -1749,7 +1747,7 @@ public void itemStateChanged(ItemEvent evt) public void showURL(String url, String target) { - if (applet == null) + if (viewport.applet == null) { System.out.println("Not running as applet - no browser available."); } @@ -1758,7 +1756,7 @@ public void itemStateChanged(ItemEvent evt) try { System.out.println("Show url: "+url); - applet.getAppletContext().showDocument(new java.net.URL(url), + viewport.applet.getAppletContext().showDocument(new java.net.URL(url), target); } catch (Exception ex) @@ -2185,16 +2183,16 @@ public void itemStateChanged(ItemEvent evt) fileMenu.remove(closeMenuItem); fileMenu.remove(3); // Seperator - applet.setLayout(new BorderLayout()); - applet.add(embeddedMenu, BorderLayout.NORTH); - applet.add(statusBar, BorderLayout.SOUTH); - // applet.validate(); + viewport.applet.setLayout(new BorderLayout()); + viewport.applet.add(embeddedMenu, BorderLayout.NORTH); + viewport.applet.add(statusBar, BorderLayout.SOUTH); + // viewport.applet.validate(); - alignPanel.setSize(applet.size().width, applet.size().height + alignPanel.setSize(viewport.applet.size().width, viewport.applet.size().height - embeddedMenu.HEIGHT - statusBar.HEIGHT); - applet.add(alignPanel, BorderLayout.CENTER); - applet.validate(); + viewport.applet.add(alignPanel, BorderLayout.CENTER); + viewport.applet.validate(); } diff --git a/src/jalview/appletgui/AlignViewport.java b/src/jalview/appletgui/AlignViewport.java index 9f6448d..b4cac5c 100755 --- a/src/jalview/appletgui/AlignViewport.java +++ b/src/jalview/appletgui/AlignViewport.java @@ -81,6 +81,10 @@ public class AlignViewport // currently visible, in the correct order or rendering Hashtable featuresDisplayed; + boolean hasHiddenColumns = false; + boolean hasHiddenRows = false; + boolean showHiddenMarkers = true; + public Vector vconsensus; AlignmentAnnotation consensus; @@ -95,8 +99,11 @@ public class AlignViewport boolean ignoreGapsInConsensusCalculation = false; + jalview.bin.JalviewLite applet; + public AlignViewport(AlignmentI al, JalviewLite applet) { + this.applet = applet; setAlignment(al); this.startRes = 0; this.endRes = al.getWidth() - 1; @@ -581,6 +588,13 @@ public class AlignViewport return increment; } + public void setHiddenColumns(ColumnSelection colsel) + { + this.colSel = colsel; + if(colSel.getHiddenColumns()!=null) + hasHiddenColumns = true; + } + public ColumnSelection getColumnSelection() { return colSel; @@ -713,6 +727,273 @@ public class AlignViewport { return ignoreGapsInConsensusCalculation; } + public void hideSelectedColumns() + { + if (colSel.size() < 1) + return; + + colSel.hideSelectedColumns(); + setSelectionGroup(null); + + hasHiddenColumns = true; + } + + + public void hideColumns(int start, int end) + { + if(start==end) + colSel.hideColumns(start); + else + colSel.hideColumns(start, end); + setSelectionGroup(null); + hasHiddenColumns = true; + } + + public void hideSequence(SequenceI seq) + { + if(seq!=null) + { + alignment.getHiddenSequences().hideSequence(seq); + hasHiddenRows = true; + } + } + + public void showSequence(int index) + { + alignment.getHiddenSequences().showSequence(index); + + if(alignment.getHiddenSequences().getSize()<1) + hasHiddenRows = false; + } + + public void showColumn(int col) + { + colSel.revealHiddenColumns(col); + if(colSel.getHiddenColumns()==null) + hasHiddenColumns = false; + } + + public void showAllHiddenColumns() + { + colSel.revealAllHiddenColumns(); + hasHiddenColumns = false; + } + + public void showAllHiddenSeqs() + { + if(alignment.getHiddenSequences().getSize()>0) + { + alignment.getHiddenSequences().showAll(); + hasHiddenRows = false; + } + } + + public int adjustForHiddenSeqs(int alignmentIndex) + { + return alignment.getHiddenSequences().adjustForHiddenSeqs(alignmentIndex); + } + + /** + * This method returns the a new SequenceI [] with + * the selection sequence and start and end points adjusted + * @return String[] + */ + public SequenceI[] getSelectionAsNewSequence() + { + SequenceI[] sequences; + + if (selectionGroup == null) + sequences = alignment.getSequencesArray(); + else + sequences = selectionGroup.getSelectionAsNewSequences(alignment); + + return sequences; + } + + /** + * This method returns the visible alignment as text, as + * seen on the GUI, ie if columns are hidden they will not + * be returned in the result. + * Use this for calculating trees, PCA, redundancy etc on views + * which contain hidden columns. + * @return String[] + */ + public jalview.datamodel.CigarArray getViewAsCigars(boolean selectedRegionOnly) + { + CigarArray selection=null; + SequenceI [] seqs= null; + int i, iSize; + int start = 0, end = 0; + if(selectedRegionOnly && selectionGroup!=null) + { + iSize = selectionGroup.getSize(false); + seqs = selectionGroup.getSequencesInOrder(alignment); + start = selectionGroup.getStartRes(); + end = selectionGroup.getEndRes(); // inclusive for start and end in SeqCigar constructor + } + else + { + iSize = alignment.getHeight(); + seqs = alignment.getSequencesArray(); + end = alignment.getWidth()-1; + } + SeqCigar[] selseqs = new SeqCigar[iSize]; + for(i=0; i