X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FSeqPanel.java;h=48651f99d0ea73aad6f0927a2a8f9d90c880455c;hb=52fd681e0f239e20df19fd7560d4b999104ba222;hp=2fe27b381bf84bffe35aac5fb94700b32ef764fa;hpb=02f2f19fdecb0b7afa5b61b07c56d46d40948674;p=jalview.git diff --git a/src/jalview/gui/SeqPanel.java b/src/jalview/gui/SeqPanel.java index 2fe27b3..48651f9 100755 --- a/src/jalview/gui/SeqPanel.java +++ b/src/jalview/gui/SeqPanel.java @@ -45,8 +45,6 @@ public class SeqPanel extends JPanel implements MouseListener, public AlignmentPanel ap; protected int lastres; protected int startseq; - int startEdit = -1; - int endEdit = -1; protected AlignViewport av; // if character is inserted or deleted, we will need to recalculate the conservation @@ -67,7 +65,10 @@ public class SeqPanel extends JPanel implements MouseListener, SequenceGroup stretchGroup = null; boolean remove = false; + Point lastMousePress; boolean mouseWheelPressed = false; + StringBuffer keyboardNo1; + StringBuffer keyboardNo2; /** * Creates a new SeqPanel object. @@ -173,8 +174,211 @@ public class SeqPanel extends JPanel implements MouseListener, seqEditOccurred = false; editingSeqs = false; groupEditing = false; + keyboardNo1 = null; + keyboardNo2 = null; } + void setCursorRow() + { + seqCanvas.cursorY = getKeyboardNo(keyboardNo1)-1; + scrollToVisible(); + } + + void setCursorColumn() + { + seqCanvas.cursorX = getKeyboardNo(keyboardNo1)-1; + scrollToVisible(); + } + + void setCursorRowAndColumn() + { + if(keyboardNo2==null) + { + keyboardNo2 = new StringBuffer(); + } + else + { + seqCanvas.cursorX = getKeyboardNo(keyboardNo1) - 1; + seqCanvas.cursorY = getKeyboardNo(keyboardNo2) - 1; + scrollToVisible(); + } + } + + void setCursorPosition() + { + SequenceI sequence = + (Sequence) av.getAlignment().getSequenceAt(seqCanvas.cursorY); + + seqCanvas.cursorX = sequence.findIndex( + getKeyboardNo(keyboardNo1)-1 + ); + scrollToVisible(); + } + + void moveCursor(int dx, int dy) + { + seqCanvas.cursorX += dx; + seqCanvas.cursorY += dy; + scrollToVisible(); + } + + 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; + + + endEditing(); + if(av.wrapAlignment) + { + ap.scrollToWrappedVisible(seqCanvas.cursorX); + } + else + { + while (seqCanvas.cursorY < av.startSeq) + { + ap.scrollUp(true); + } + while (seqCanvas.cursorY + 1 > av.endSeq) + { + ap.scrollUp(false); + } + if (!av.wrapAlignment) + { + while (seqCanvas.cursorX < av.startRes) + { + if (!ap.scrollRight(false)) + break; + } + while (seqCanvas.cursorX > av.endRes) + { + if (!ap.scrollRight(true)) + break; + } + } + } + setStatusMessage(av.alignment.getSequenceAt(seqCanvas.cursorY), + seqCanvas.cursorX, seqCanvas.cursorY); + + seqCanvas.repaint(); + } + + void setSelectionAreaAtCursor(boolean topLeft) + { + SequenceI sequence = + (Sequence) av.getAlignment().getSequenceAt(seqCanvas.cursorY); + + if(av.getSelectionGroup()!=null) + { + 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; + } + + if(min>max) + { + // Only the user can do this + av.setSelectionGroup(null); + } + else + { + // 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); + } + } + } + + if (av.getSelectionGroup() == null) + { + SequenceGroup sg = new SequenceGroup(); + sg.setStartRes(seqCanvas.cursorX); + sg.setEndRes(seqCanvas.cursorX); + sg.addSequence(sequence, false); + av.setSelectionGroup(sg); + } + + + ap.repaint(); + } + + void insertGapAtCursor(boolean group) + { + ap.alignFrame.addHistoryItem(new HistoryItem("Edit Sequence", + av.alignment, HistoryItem.EDIT)); + groupEditing = group; + startseq = seqCanvas.cursorY; + lastres = seqCanvas.cursorX; + editSequence(true, seqCanvas.cursorX+getKeyboardNo(keyboardNo1)); + editOccurred(); + } + + void deleteGapAtCursor(boolean group) + { + ap.alignFrame.addHistoryItem(new HistoryItem("Edit Sequence", + av.alignment, HistoryItem.EDIT)); + groupEditing = group; + startseq = seqCanvas.cursorY; + lastres = seqCanvas.cursorX+getKeyboardNo(keyboardNo1); + editSequence(false, seqCanvas.cursorX); + editOccurred(); + } + + void numberPressed(char value) + { + if(keyboardNo1==null) + keyboardNo1 = new StringBuffer(); + + if(keyboardNo2!=null) + keyboardNo2.append(value); + else + keyboardNo1.append(value); + } + + int getKeyboardNo(StringBuffer kb) + { + if(kb==null) + return 1; + else + return Integer.parseInt(kb.toString()); + } + + /** * DOCUMENT ME! * @@ -183,6 +387,7 @@ public class SeqPanel extends JPanel implements MouseListener, public void mouseReleased(MouseEvent evt) { mouseDragging = false; + mouseWheelPressed = false; if (!editingSeqs) { @@ -190,13 +395,10 @@ public class SeqPanel extends JPanel implements MouseListener, return; } - if (seqEditOccurred) - { - editOccurred(); - } + editOccurred(); - endEditing(); - ap.repaint(); + endEditing(); + ap.repaint(); } @@ -208,6 +410,8 @@ public class SeqPanel extends JPanel implements MouseListener, */ public void mousePressed(MouseEvent evt) { + lastMousePress = evt.getPoint(); + if (javax.swing.SwingUtilities.isMiddleMouseButton(evt)) { mouseWheelPressed = true; @@ -230,8 +434,6 @@ public class SeqPanel extends JPanel implements MouseListener, } - ap.alignFrame.addHistoryItem(new HistoryItem("Edit Sequence", - av.alignment, HistoryItem.EDIT)); int seq = findSeq(evt); int res = findRes(evt); @@ -239,6 +441,9 @@ public class SeqPanel extends JPanel implements MouseListener, 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())) { @@ -251,9 +456,6 @@ public class SeqPanel extends JPanel implements MouseListener, lastres = -1; } - startEdit = lastres; - endEdit = lastres; - return; } @@ -274,6 +476,7 @@ public class SeqPanel extends JPanel implements MouseListener, int res = findRes(evt); int seq = findSeq(evt); + if(res<0 || seq<0 || seq >= av.getAlignment().getHeight()) return; @@ -289,36 +492,7 @@ public class SeqPanel extends JPanel implements MouseListener, seqCanvas.pdbCanvas.highlightRes(sequence.findPosition(res)); } - - StringBuffer text = new StringBuffer("Sequence " + (seq + 1) + " ID: " + - sequence.getName()); - - 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: "); - } - - if (obj != null) - { - - if (obj != "") - { - text.append( obj + " (" + - av.getAlignment().getSequenceAt(seq).findPosition(res) + ")"); - } - } - - ap.alignFrame.statusBar.setText(text.toString()); + setStatusMessage(sequence, res, seq); // use aa to see if the mouse pointer is on a if (av.showSequenceFeatures) @@ -334,7 +508,8 @@ public class SeqPanel extends JPanel implements MouseListener, if ( (features[i].getBegin() <= sequence.findPosition(res)) && (features[i].getEnd() >= sequence.findPosition(res))) { - if(!av.featuresDisplayed.containsKey(features[i].getType())) + if(av.featuresDisplayed==null + || !av.featuresDisplayed.containsKey(features[i].getType())) continue; @@ -382,6 +557,39 @@ public class SeqPanel extends JPanel implements MouseListener, } } + void setStatusMessage(SequenceI sequence, int res, int seq) + { + StringBuffer text = new StringBuffer("Sequence " + (seq + 1) + " ID: " + + sequence.getName()); + + 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: "); + } + + if (obj != null) + { + + if (obj != "") + { + text.append(obj + " (" + sequence.findPosition(res) + + ")"); + } + } + ap.alignFrame.statusBar.setText(text.toString()); + + } + /** * DOCUMENT ME! * @@ -389,6 +597,52 @@ public class SeqPanel extends JPanel implements MouseListener, */ public void mouseDragged(MouseEvent evt) { + if (mouseWheelPressed) + { + int oldWidth = av.charWidth; + + //Which is bigger, left-right or up-down? + if (Math.abs(evt.getY() - lastMousePress.getY()) + > Math.abs(evt.getX() - lastMousePress.getX())) + { + int fontSize = av.font.getSize(); + + if (evt.getY() < lastMousePress.getY() && av.charHeight > 1) + { + fontSize--; + } + else if (evt.getY() > lastMousePress.getY()) + { + fontSize++; + } + + av.setFont(new Font(av.font.getName(), av.font.getStyle(), fontSize)); + av.charWidth = oldWidth; + ap.fontChanged(); + + } + else + { + if (evt.getX() < lastMousePress.getX() && av.charWidth > 1) + { + av.charWidth--; + } + else if (evt.getX() > lastMousePress.getX()) + { + av.charWidth++; + } + + ap.repaint(); + } + + FontMetrics fm = getFontMetrics(av.getFont()); + av.validCharWidth = fm.charWidth('M') <= av.charWidth; + + lastMousePress = evt.getPoint(); + + return; + } + if (!editingSeqs) { doMouseDraggedDefineMode(evt); @@ -407,240 +661,382 @@ public class SeqPanel extends JPanel implements MouseListener, return; } - boolean dragRight = true; - - if ((res < av.getAlignment().getWidth()) && (res < lastres)) + if ( (res < av.getAlignment().getWidth()) && (res < lastres)) { - dragRight = false; + // dragLeft, delete gap + editSequence(false, res); } - else if(av.hasHiddenColumns) + else + editSequence(true, res); + + mouseDragging = true; + if(scrollThread!=null) + scrollThread.setEvent(evt); + + } + + synchronized void editSequence(boolean insertGap, int startres) + { + int fixedLeft = -1; + int fixedRight = -1; + boolean fixedColumns = false; + SequenceGroup sg = av.getSelectionGroup(); + + if(groupEditing && sg==null) + return; + + if (!groupEditing && av.hasHiddenRows) { - //Stop editing if the user has dragged beyond hiddenBoundary - int lastCol = av.getColumnSelection().getHiddenRegionBoundary(lastres); - if( lastCol < res) + //This needs to check all the sequences in a group edit,m + // not just the startseq + if (av.alignment.getSequenceAt(startseq).getHiddenSequences() != null) { - if(lastres!=lastCol) - { - endEditing(); - return; - } + groupEditing = true; } } - if(!groupEditing && av.hasHiddenRows) + SequenceI seq = av.alignment.getSequenceAt(startseq); + StringBuffer message = new StringBuffer(); + if (groupEditing) + message.append("Edit group:"); + else + message.append("Edit sequence: "+seq.getName()); + + if(insertGap) + message.append(" insert "); + else + message.append(" delete "); + + message.append(Math.abs(startres-lastres)+" gaps."); + ap.alignFrame.statusBar.setText(message.toString()); + + + //Are we editing within a selection group? + if (groupEditing + || (sg != null && sg.sequences.contains(seq))) { - if(av.alignment.getSequenceAt(startseq).getHiddenSequences()!=null) + fixedColumns = true; + + fixedLeft = sg.getStartRes(); + fixedRight = sg.getEndRes(); + + if ( (startres < fixedLeft && lastres >= fixedLeft) + || (startres >= fixedLeft && lastres < fixedLeft) + || (startres > fixedRight && lastres <=fixedRight) + || (startres <= fixedRight && lastres > fixedRight)) { - groupEditing = true; + endEditing(); + return; + } + + if (fixedLeft > startres) + { + fixedRight = fixedLeft - 1; + fixedLeft = 0; + } + else if (fixedRight < startres) + { + fixedLeft = fixedRight; + fixedRight = -1; } } - if (res != lastres) + + if(av.hasHiddenColumns) { - SequenceI seq; - // Group editing - if (groupEditing) - { - SequenceGroup sg = av.getSelectionGroup(); + fixedColumns = true; + int y1 = av.getColumnSelection().getHiddenBoundaryLeft(startres); + int y2 = av.getColumnSelection().getHiddenBoundaryRight(startres); - if (av.hasHiddenRows) - { - //sg might be null as the user may only see 1 sequence - if(sg==null) - { - sg = new SequenceGroup(); - sg.addSequence(av.alignment.getSequenceAt(startseq), false); - } + if( ( insertGap && startres>y1 && lastresy2) ) + { + endEditing(); + return; + } - SequenceGroup tmp = new SequenceGroup(); + if(fixedRightfixedLeft && fixedLeft==-1) + fixedLeft = y1; + } - //Do any of the sequences have hidden associates? - for (int s = 0; s < sg.getSize(); s++) - { - seq = sg.getSequenceAt(s); - tmp.addSequence(seq, false); - if (seq.getHiddenSequences()!=null) - { - for(int h=0; h