X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FSeqPanel.java;h=a5ffb80110540b0d1170bed98ed2ab343c38ed6b;hb=b0123c396580412f9c2218caedfc173696cd0fe5;hp=3f49cc49ca923ab2972778efa65f26fc3e9a3c15;hpb=99f3f01792321efb671ac7ad946efffc3a3319a4;p=jalview.git diff --git a/src/jalview/gui/SeqPanel.java b/src/jalview/gui/SeqPanel.java index 3f49cc4..a5ffb80 100755 --- a/src/jalview/gui/SeqPanel.java +++ b/src/jalview/gui/SeqPanel.java @@ -1,6 +1,6 @@ /* * Jalview - A Sequence Alignment Editor and Viewer - * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle + * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -18,15 +18,16 @@ */ package jalview.gui; -import jalview.datamodel.*; - -import jalview.schemes.*; +import java.util.*; import java.awt.*; import java.awt.event.*; - import javax.swing.*; +import jalview.commands.*; +import jalview.datamodel.*; +import jalview.schemes.*; +import jalview.structure.*; /** * DOCUMENT ME! @@ -34,1296 +35,1744 @@ import javax.swing.*; * @author $author$ * @version $Revision$ */ -public class SeqPanel extends JPanel implements MouseListener, - MouseMotionListener, MouseWheelListener +public class SeqPanel + extends JPanel implements MouseListener, + MouseMotionListener, MouseWheelListener, SequenceListener { - /** DOCUMENT ME!! */ - public SeqCanvas seqCanvas; - - /** DOCUMENT ME!! */ - public AlignmentPanel ap; - protected int lastres; - protected int startseq; - protected AlignViewport av; - - // if character is inserted or deleted, we will need to recalculate the conservation - boolean seqEditOccurred = false; - ScrollThread scrollThread = null; - boolean mouseDragging = false; - boolean editingSeqs = false; - boolean groupEditing = false; - - ////////////////////////////////////////// - /////Everything below this is for defining the boundary of the rubberband - ////////////////////////////////////////// - int oldSeq = -1; - boolean changeEndSeq = false; - boolean changeStartSeq = false; - boolean changeEndRes = false; - boolean changeStartRes = false; - SequenceGroup stretchGroup = null; - boolean remove = false; - - boolean mouseWheelPressed = false; - - /** - * Creates a new SeqPanel object. - * - * @param avp DOCUMENT ME! - * @param p DOCUMENT ME! - */ - public SeqPanel(AlignViewport avp, AlignmentPanel p) - { - ToolTipManager.sharedInstance().registerComponent(this); - ToolTipManager.sharedInstance().setInitialDelay(0); - ToolTipManager.sharedInstance().setDismissDelay(10000); - this.av = avp; - setBackground(Color.white); - - seqCanvas = new SeqCanvas(avp); - setLayout(new BorderLayout()); - add(seqCanvas, BorderLayout.CENTER); - - ap = p; - - if(!av.isDataset()) - { - addMouseMotionListener(this); - addMouseListener(this); - addMouseWheelListener(this); - } + /** DOCUMENT ME!! */ + public SeqCanvas seqCanvas; + + /** DOCUMENT ME!! */ + public AlignmentPanel ap; + protected int lastres; + protected int startseq; + protected AlignViewport av; + + ScrollThread scrollThread = null; + boolean mouseDragging = false; + boolean editingSeqs = false; + boolean groupEditing = false; + + ////////////////////////////////////////// + /////Everything below this is for defining the boundary of the rubberband + ////////////////////////////////////////// + int oldSeq = -1; + boolean changeEndSeq = false; + boolean changeStartSeq = false; + boolean changeEndRes = false; + boolean changeStartRes = false; + SequenceGroup stretchGroup = null; + boolean remove = false; + + Point lastMousePress; + boolean mouseWheelPressed = false; + StringBuffer keyboardNo1; + StringBuffer keyboardNo2; + + java.net.URL linkImageURL; + + StringBuffer tooltipText = new StringBuffer(""); + String tmpString; + + EditCommand editCommand; + + StructureSelectionManager ssm; + + + /** + * Creates a new SeqPanel object. + * + * @param avp DOCUMENT ME! + * @param p DOCUMENT ME! + */ + public SeqPanel(AlignViewport avp, AlignmentPanel p) + { + linkImageURL = getClass().getResource("/images/link.gif"); + ToolTipManager.sharedInstance().registerComponent(this); + ToolTipManager.sharedInstance().setInitialDelay(0); + ToolTipManager.sharedInstance().setDismissDelay(10000); + this.av = avp; + setBackground(Color.white); + + seqCanvas = new SeqCanvas(avp); + setLayout(new BorderLayout()); + add(seqCanvas, BorderLayout.CENTER); + + ap = p; + + if (!av.isDataset()) + { + addMouseMotionListener(this); + addMouseListener(this); + addMouseWheelListener(this); + ssm = StructureSelectionManager.getStructureSelectionManager(); + ssm.addStructureViewerListener(this); } + } - int startWrapBlock=-1; - int wrappedBlock=-1; - int findRes(MouseEvent evt) - { - int res = 0; - int x = evt.getX(); + int startWrapBlock = -1; + int wrappedBlock = -1; + int findRes(MouseEvent evt) + { + int res = 0; + int x = evt.getX(); if (av.wrapAlignment) { int hgap = av.charHeight; if (av.scaleAboveWrapped) + { hgap += av.charHeight; + } int cHeight = av.getAlignment().getHeight() * av.charHeight + hgap + seqCanvas.getAnnotationHeight(); - int y = evt.getY(); - y -= hgap; - x -= seqCanvas.LABEL_WEST; - + int y = evt.getY(); + y -= hgap; + x -= seqCanvas.LABEL_WEST; - int cwidth = seqCanvas.getWrappedCanvasWidth(this.getWidth()); + int cwidth = seqCanvas.getWrappedCanvasWidth(this.getWidth()); + if (cwidth < 1) + { + return 0; + } - wrappedBlock = y / cHeight; - wrappedBlock += av.getStartRes() / cwidth; + wrappedBlock = y / cHeight; + wrappedBlock += av.getStartRes() / cwidth; - res = wrappedBlock * cwidth + x / av.getCharWidth(); + res = wrappedBlock * cwidth + x / av.getCharWidth(); } else { - res = (x / av.getCharWidth()) + av.getStartRes(); + res = (x / av.getCharWidth()) + av.getStartRes(); } - if(av.hasHiddenColumns) - res = av.getColumnSelection().adjustForHiddenColumns(res); + if (av.hasHiddenColumns) + { + res = av.getColumnSelection().adjustForHiddenColumns(res); + } return res; - } + } - int findSeq(MouseEvent evt) - { + int findSeq(MouseEvent evt) + { + int seq = 0; + int y = evt.getY(); - int seq = 0; - int y = evt.getY(); - - if (av.wrapAlignment) - { - int hgap = av.charHeight; - if (av.scaleAboveWrapped) - hgap += av.charHeight; - - int cHeight = av.getAlignment().getHeight() * av.charHeight - + hgap + seqCanvas.getAnnotationHeight(); - - y -= hgap; + if (av.wrapAlignment) + { + int hgap = av.charHeight; + if (av.scaleAboveWrapped) + { + hgap += av.charHeight; + } - seq = ( (y % cHeight) / av.getCharHeight()); - } - else - { - seq = (y / av.getCharHeight()) + av.getStartSeq(); - } + int cHeight = av.getAlignment().getHeight() * av.charHeight + + hgap + seqCanvas.getAnnotationHeight(); - return seq; - } + y -= hgap; - void endEditing() - { - startseq = -1; - lastres = -1; - seqEditOccurred = false; - editingSeqs = false; - groupEditing = false; - keyboardGaps = null; + seq = Math.min( (y % cHeight) / av.getCharHeight(), + av.alignment.getHeight() - 1); } - - - void moveCursor(int dx, int dy) + else { - seqCanvas.cursorX += dx; - seqCanvas.cursorY += dy; - - if(seqCanvas.cursorX<0) - seqCanvas.cursorX = 0; - else if(seqCanvas.cursorX>av.alignment.getWidth()-1) - seqCanvas.cursorX = av.alignment.getWidth()-1; - if(seqCanvas.cursorXav.endRes) - ap.scrollRight(true); - - if(seqCanvas.cursorY<0) - seqCanvas.cursorY=0; - else if(seqCanvas.cursorY>av.alignment.getHeight()-1) - seqCanvas.cursorY = av.alignment.getHeight()-1; - if(seqCanvas.cursorYav.endSeq) - ap.scrollUp(false); - - setStatusMessage(av.alignment.getSequenceAt(seqCanvas.cursorY), - seqCanvas.cursorX, seqCanvas.cursorY); - seqCanvas.repaint(); + seq = Math.min( (y / av.getCharHeight()) + av.getStartSeq(), + av.alignment.getHeight() - 1); } - void setSelectionAreaAtCursor(boolean topLeft) - { - SequenceI sequence = - (Sequence) av.getAlignment().getSequenceAt(seqCanvas.cursorY); + return seq; + } - if(av.getSelectionGroup()!=null) + SequenceFeature[] findFeaturesAtRes(SequenceI sequence, int res) + { + Vector tmp = new Vector(); + SequenceFeature[] features = sequence.getSequenceFeatures(); + if (features != null) + { + for (int i = 0; i < features.length; i++) { - SequenceGroup sg = av.selectionGroup; - //Find the top and bottom of this group - int min = av.alignment.getHeight(), max = 0; - for(int i=0; i max) - max = index; - if(index < min) - min = index; - } - - max ++; - - if(topLeft) - { - sg.setStartRes(seqCanvas.cursorX); - if(sg.getEndRes()seqCanvas.cursorX) - sg.setStartRes(seqCanvas.cursorX); - - max = seqCanvas.cursorY+1; + continue; } - if(min>max) - { - // Only the user can do this - av.setSelectionGroup(null); - } - else + if ( (features[i].getBegin() <= res) && + (features[i].getEnd() >= res)) { - // Now add any sequences between min and max - sg.sequences.clear(); - for (int i = min; i < max; i++) - { - sg.addSequence(av.alignment.getSequenceAt(i), false); - } + tmp.addElement(features[i]); } } + } - if (av.getSelectionGroup() == null) - { - SequenceGroup sg = new SequenceGroup(); - sg.setStartRes(seqCanvas.cursorX); - sg.setEndRes(seqCanvas.cursorX); - sg.addSequence(sequence, false); - av.setSelectionGroup(sg); - } + features = new SequenceFeature[tmp.size()]; + tmp.copyInto(features); + return features; + } - ap.repaint(); - } - void insertGapAtCursor(boolean group) + void endEditing() + { + if (editCommand != null && editCommand.getSize() > 0) { - ap.alignFrame.addHistoryItem(new HistoryItem("Edit Sequence", - av.alignment, HistoryItem.EDIT)); - groupEditing = group; - startseq = seqCanvas.cursorY; - lastres = seqCanvas.cursorX; - editSequence(true, seqCanvas.cursorX+getKeyboardGaps()); - editOccurred(); + ap.alignFrame.addHistoryItem(editCommand); + av.firePropertyChange("alignment", null, + av.getAlignment().getSequences()); } - void deleteGapAtCursor(boolean group) + startseq = -1; + lastres = -1; + editingSeqs = false; + groupEditing = false; + keyboardNo1 = null; + keyboardNo2 = null; + editCommand = null; + } + + void setCursorRow() + { + seqCanvas.cursorY = getKeyboardNo1() - 1; + scrollToVisible(); + } + + void setCursorColumn() + { + seqCanvas.cursorX = getKeyboardNo1() - 1; + scrollToVisible(); + } + + void setCursorRowAndColumn() + { + if (keyboardNo2 == null) { - ap.alignFrame.addHistoryItem(new HistoryItem("Edit Sequence", - av.alignment, HistoryItem.EDIT)); - groupEditing = group; - startseq = seqCanvas.cursorY; - lastres = seqCanvas.cursorX+getKeyboardGaps(); - editSequence(false, seqCanvas.cursorX); - editOccurred(); + keyboardNo2 = new StringBuffer(); } - - void numberPressed(char value) + else { - if(keyboardGaps==null) - keyboardGaps = new StringBuffer(); - - keyboardGaps.append(value); + seqCanvas.cursorX = getKeyboardNo1() - 1; + seqCanvas.cursorY = getKeyboardNo2() - 1; + scrollToVisible(); } - - StringBuffer keyboardGaps; - int getKeyboardGaps() + } + + void setCursorPosition() + { + SequenceI sequence = + (Sequence) av.getAlignment().getSequenceAt(seqCanvas.cursorY); + + seqCanvas.cursorX = sequence.findIndex( + getKeyboardNo1() - 1 + ); + scrollToVisible(); + } + + void moveCursor(int dx, int dy) + { + seqCanvas.cursorX += dx; + seqCanvas.cursorY += dy; + if (av.hasHiddenColumns && !av.colSel.isVisible(seqCanvas.cursorX)) { - if(keyboardGaps==null) - return 1; - else - return Integer.parseInt(keyboardGaps.toString()); - } - + int original = seqCanvas.cursorX - dx; + int maxWidth = av.alignment.getWidth(); - /** - * DOCUMENT ME! - * - * @param evt DOCUMENT ME! - */ - public void mouseReleased(MouseEvent evt) - { - mouseDragging = false; - mouseWheelPressed = false; + while (!av.colSel.isVisible(seqCanvas.cursorX) + && seqCanvas.cursorX < maxWidth + && seqCanvas.cursorX > 0) + { + seqCanvas.cursorX += dx; + } - if (!editingSeqs) + if (seqCanvas.cursorX >= maxWidth + || !av.colSel.isVisible(seqCanvas.cursorX)) { - doMouseReleasedDefineMode(evt); - return; + seqCanvas.cursorX = original; } + } - editOccurred(); + scrollToVisible(); + } - endEditing(); - ap.repaint(); + void scrollToVisible() + { + if (seqCanvas.cursorX < 0) + { + seqCanvas.cursorX = 0; + } + else if (seqCanvas.cursorX > av.alignment.getWidth() - 1) + { + seqCanvas.cursorX = av.alignment.getWidth() - 1; } + if (seqCanvas.cursorY < 0) + { + seqCanvas.cursorY = 0; + } + else if (seqCanvas.cursorY > av.alignment.getHeight() - 1) + { + seqCanvas.cursorY = av.alignment.getHeight() - 1; + } - - /** - * DOCUMENT ME! - * - * @param evt DOCUMENT ME! - */ - public void mousePressed(MouseEvent evt) + endEditing(); + if (av.wrapAlignment) + { + ap.scrollToWrappedVisible(seqCanvas.cursorX); + } + else { - if (javax.swing.SwingUtilities.isMiddleMouseButton(evt)) + while (seqCanvas.cursorY < av.startSeq) { - mouseWheelPressed = true; - return; + ap.scrollUp(true); } - - if (evt.isShiftDown() || evt.isAltDown() || - evt.isControlDown()) + while (seqCanvas.cursorY + 1 > av.endSeq) { - if (evt.isAltDown() || evt.isControlDown()) - { - groupEditing = true; - } - editingSeqs = true; + ap.scrollUp(false); } - else + if (!av.wrapAlignment) { - doMousePressedDefineMode(evt); - return; - } - - - - int seq = findSeq(evt); - int res = findRes(evt); - - if(seq<0 || res<0) - return; - - ap.alignFrame.addHistoryItem(new HistoryItem("Edit Sequence", - av.alignment, HistoryItem.EDIT)); - - if ((seq < av.getAlignment().getHeight()) && - (res < av.getAlignment().getSequenceAt(seq).getLength())) + while (seqCanvas.cursorX < av.colSel.adjustForHiddenColumns(av.startRes)) { - startseq = seq; - lastres = res; + if (!ap.scrollRight(false)) + { + break; + } } - else + while (seqCanvas.cursorX > av.colSel.adjustForHiddenColumns(av.endRes)) { - startseq = -1; - lastres = -1; + if (!ap.scrollRight(true)) + { + break; + } } - - return; + } } + setStatusMessage(av.alignment.getSequenceAt(seqCanvas.cursorY), + seqCanvas.cursorX, seqCanvas.cursorY); + + seqCanvas.repaint(); + } - /** - * DOCUMENT ME! - * - * @param evt DOCUMENT ME! - */ - public void mouseMoved(MouseEvent evt) + void setSelectionAreaAtCursor(boolean topLeft) + { + SequenceI sequence = + (Sequence) av.getAlignment().getSequenceAt(seqCanvas.cursorY); + + if (av.getSelectionGroup() != null) { - if (editingSeqs) + SequenceGroup sg = av.selectionGroup; + //Find the top and bottom of this group + int min = av.alignment.getHeight(), max = 0; + for (int i = 0; i < sg.getSize(); i++) { - // This is because MacOSX creates a mouseMoved - // If control is down, other platforms will not. - mouseDragged(evt); + int index = av.alignment.findIndex(sg.getSequenceAt(i)); + if (index > max) + { + max = index; + } + if (index < min) + { + min = index; + } } - int res = findRes(evt); - int seq = findSeq(evt); - + max++; - if(res<0 || seq<0 || seq >= av.getAlignment().getHeight()) - return; - - SequenceI sequence = av.getAlignment().getSequenceAt(seq); + if (topLeft) + { + sg.setStartRes(seqCanvas.cursorX); + if (sg.getEndRes() < seqCanvas.cursorX) + { + sg.setEndRes(seqCanvas.cursorX); + } - if (res > sequence.getLength()) + min = seqCanvas.cursorY; + } + else { - return; + sg.setEndRes(seqCanvas.cursorX); + if (sg.getStartRes() > seqCanvas.cursorX) + { + sg.setStartRes(seqCanvas.cursorX); + } + + max = seqCanvas.cursorY + 1; } - if(seqCanvas.pdbCanvas!=null && sequence==seqCanvas.pdbCanvas.sequence) + if (min > max) { - seqCanvas.pdbCanvas.highlightRes(sequence.findPosition(res)); + // Only the user can do this + av.setSelectionGroup(null); } - - setStatusMessage(sequence, res, seq); - - // use aa to see if the mouse pointer is on a - if (av.showSequenceFeatures) + else + { + // Now add any sequences between min and max + sg.getSequences(null).clear(); + for (int i = min; i < max; i++) { - SequenceFeature [] features = sequence.getDatasetSequence().getSequenceFeatures(); - if(features!=null) - { - StringBuffer sbuffer = new StringBuffer(""); + sg.addSequence(av.alignment.getSequenceAt(i), false); + } + } + } - for (int i = 0; i < features.length; i++) - { + if (av.getSelectionGroup() == null) + { + SequenceGroup sg = new SequenceGroup(); + sg.setStartRes(seqCanvas.cursorX); + sg.setEndRes(seqCanvas.cursorX); + sg.addSequence(sequence, false); + av.setSelectionGroup(sg); + } - if ( (features[i].getBegin() <= sequence.findPosition(res)) && - (features[i].getEnd() >= sequence.findPosition(res))) - { - if(av.featuresDisplayed==null - || !av.featuresDisplayed.containsKey(features[i].getType())) - continue; - - - if (features[i].getType().equals("disulfide bond")) - { - if (features[i].getBegin() == sequence.findPosition(res) - || features[i].getEnd() == sequence.findPosition(res)) - { - if (sbuffer.length() > 6) - sbuffer.append("
"); - sbuffer.append("disulfide bond " + features[i].getBegin() + ":" + - features[i].getEnd()); - } - } - else - { - if (sbuffer.length() > 6) - sbuffer.append("
"); - if(features[i].featureGroup!=null) - sbuffer.append(features[i].featureGroup+";"); - - sbuffer.append(features[i].getType()); - - if (features[i].getDescription() != null - && !features[i].description.equals(features[i].getType())) - sbuffer.append("; " + features[i].getDescription()); - - if (features[i].getStatus() != null && features[i].getStatus().length()>0) - { - sbuffer.append("; (" + features[i].getStatus() + ")"); - } - } - } + ap.paintAlignment(false); + } + + void insertGapAtCursor(boolean group) + { + groupEditing = group; + startseq = seqCanvas.cursorY; + lastres = seqCanvas.cursorX; + editSequence(true, seqCanvas.cursorX + getKeyboardNo1()); + endEditing(); + } + + void deleteGapAtCursor(boolean group) + { + groupEditing = group; + startseq = seqCanvas.cursorY; + lastres = seqCanvas.cursorX + getKeyboardNo1(); + editSequence(false, seqCanvas.cursorX); + endEditing(); + } + + void numberPressed(char value) + { + if (keyboardNo1 == null) + { + keyboardNo1 = new StringBuffer(); + } - } + if (keyboardNo2 != null) + { + keyboardNo2.append(value); + } + else + { + keyboardNo1.append(value); + } + } - sbuffer.append(""); - if(sbuffer.length()==13) // - setToolTipText(""); - else - setToolTipText(sbuffer.toString()); - } - else - setToolTipText(""); - } + int getKeyboardNo1() + { + if (keyboardNo1 == null) + return 1; + else + { + int value = Integer.parseInt(keyboardNo1.toString()); + keyboardNo1 = null; + return value; } + } - void setStatusMessage(SequenceI sequence, int res, int seq) + int getKeyboardNo2() + { + if (keyboardNo2 == null) + return 1; + else + { + int value = Integer.parseInt(keyboardNo2.toString()); + keyboardNo2 = null; + return value; + } + } + + /** + * DOCUMENT ME! + * + * @param evt DOCUMENT ME! + */ + public void mouseReleased(MouseEvent evt) + { + mouseDragging = false; + mouseWheelPressed = false; + + if (!editingSeqs) { - StringBuffer text = new StringBuffer("Sequence " + (seq + 1) + " ID: " + - sequence.getName()); + doMouseReleasedDefineMode(evt); + return; + } - Object obj = null; - if (av.alignment.isNucleotide()) - { - obj = ResidueProperties.nucleotideName.get(sequence.getCharAt(res) + - ""); - if (obj != null) - text.append(" Nucleotide: "); - } - else - { - obj = ResidueProperties.aa2Triplet.get(sequence.getCharAt(res) + ""); - if (obj != null) - text.append(" Residue: "); - } + endEditing(); - if (obj != null) - { + ap.paintAlignment(true); + } - if (obj != "") - { - text.append(obj + " (" + sequence.findPosition(res) + - ")"); - } - } - ap.alignFrame.statusBar.setText(text.toString()); + /** + * DOCUMENT ME! + * + * @param evt DOCUMENT ME! + */ + public void mousePressed(MouseEvent evt) + { + lastMousePress = evt.getPoint(); + if (javax.swing.SwingUtilities.isMiddleMouseButton(evt)) + { + mouseWheelPressed = true; + return; } - /** - * DOCUMENT ME! - * - * @param evt DOCUMENT ME! - */ - public void mouseDragged(MouseEvent evt) + if (evt.isShiftDown() || evt.isAltDown() || + evt.isControlDown()) { - if (!editingSeqs) + if (evt.isAltDown() || evt.isControlDown()) { - doMouseDraggedDefineMode(evt); - return; + groupEditing = true; } + editingSeqs = true; + } + else + { + doMousePressedDefineMode(evt); + return; + } - int res = findRes(evt); + int seq = findSeq(evt); + int res = findRes(evt); - if (res < 0) - { - res = 0; - } + if (seq < 0 || res < 0) + { + return; + } - if ((lastres == -1) || (lastres == res)) - { - return; - } + if ( (seq < av.getAlignment().getHeight()) && + (res < av.getAlignment().getSequenceAt(seq).getLength())) + { + startseq = seq; + lastres = res; + } + else + { + startseq = -1; + lastres = -1; + } - if ( (res < av.getAlignment().getWidth()) && (res < lastres)) - { - // dragLeft, delete gap - editSequence(false, res); - } - else - editSequence(true, res); + return; + } - mouseDragging = true; - if(scrollThread!=null) - scrollThread.setEvent(evt); + String lastMessage; + public void mouseOverSequence(SequenceI sequence, int index) + { + String tmp = sequence.hashCode()+index+""; + if (lastMessage == null || !lastMessage.equals(tmp)) + ssm.mouseOverSequence(sequence, index); + + lastMessage = tmp; + } - } - void editSequence(boolean insertGap, int startres) + public void highlightSequence(jalview.datamodel.SequenceI seq, int index) + { + if(av.alignment.findIndex(seq)>-1) + { + SearchResults highlight = new SearchResults(); + highlight.addResult(seq,index,index); + seqCanvas.highlightSearchResults(highlight); + } + } + + public void updateColours(SequenceI seq, int index) + { + System.out.println("update the seqPanel colours"); + //repaint(); + } + + /** + * DOCUMENT ME! + * + * @param evt DOCUMENT ME! + */ + public void mouseMoved(MouseEvent evt) + { + if (editingSeqs) { - int fixedLeft = -1; - int fixedRight = -1; - boolean fixedColumns = false; + // This is because MacOSX creates a mouseMoved + // If control is down, other platforms will not. + mouseDragged(evt); + } - if(insertGap && av.hasHiddenColumns) - { - //Stop editing if the user has dragged beyond hiddenBoundary - fixedRight = av.getColumnSelection().getHiddenRegionBoundary(lastres); - if( fixedRight < lastres) - { - if(lastres!=fixedRight) - { - endEditing(); - return; - } - } - } + int res = findRes(evt); + int seq = findSeq(evt); - if (!groupEditing && av.hasHiddenRows) - { - if (av.alignment.getSequenceAt(startseq).getHiddenSequences() != null) - { - groupEditing = true; - } - } + if (res < 0 || seq < 0 || seq >= av.getAlignment().getHeight()) + { + return; + } + SequenceI sequence = av.getAlignment().getSequenceAt(seq); - SequenceI seq = av.alignment.getSequenceAt(startseq); - StringBuffer message = new StringBuffer(); - if (groupEditing) - message.append("Edit group:"); - else - message.append("Edit sequence: "+seq.getName()); + if (res > sequence.getLength()) + { + return; + } - if(insertGap) - message.append(" insert "); - else - message.append(" delete "); + if (ssm != null) + mouseOverSequence(sequence, sequence.findPosition(res)); - message.append(Math.abs(startres-lastres)+" gaps."); - ap.alignFrame.statusBar.setText(message.toString()); + setStatusMessage(sequence, res, seq); + tooltipText.setLength(6); // Cuts the buffer back to - //Are we editing within a selection group? - if (groupEditing - || (av.getSelectionGroup() != null && - av.getSelectionGroup().sequences.contains(seq))) + SequenceGroup[] groups = av.alignment.findAllGroups(sequence); + if (groups != null) + { + for (int g = 0; g < groups.length; g++) + { + if (groups[g].getStartRes() <= res && groups[g].getEndRes() >= res) { - fixedColumns = true; - - fixedLeft = av.getSelectionGroup().getStartRes(); - fixedRight = av.getSelectionGroup().getEndRes(); - - if ( (startres < fixedLeft && lastres >= fixedLeft) - || (startres >= fixedLeft && lastres < fixedLeft) - || (startres > fixedRight && lastres <=fixedRight) - || (startres <= fixedRight && lastres > fixedRight)) + if (tooltipText.length() > 6) { - endEditing(); - return; + tooltipText.append("
"); } - if (fixedLeft > startres) + if (!groups[g].getName().startsWith("JTreeGroup") && + !groups[g].getName().startsWith("JGroup")) { - fixedRight = fixedLeft - 1; - fixedLeft = 0; + tooltipText.append(groups[g].getName()); } - else if (fixedRight < startres) + + if (groups[g].getDescription() != null) { - fixedLeft = fixedRight; - fixedRight = -1; + tooltipText.append(": " + groups[g].getDescription()); } } + } + } + + // use aa to see if the mouse pointer is on a + if (av.showSequenceFeatures) + { + SequenceFeature[] features = findFeaturesAtRes( + sequence.getDatasetSequence(), sequence.findPosition(res)); - if (groupEditing) + if (features != null) + { + for (int i = 0; i < features.length; i++) { - SequenceGroup sg = av.getSelectionGroup(); - if(fixedLeft>sg.getEndRes() - ||fixedRight