X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Fgui%2FSeqPanel.java;h=3209960d6f183e9a9901884df259378a40a9f61a;hb=e21fb8306a9efaf170d7354daa10e7ee42d37c17;hp=986f9966016d6c6b111a92a3c651da9b0fe3969f;hpb=b7d08a8fc06966d98af98e4eaacb03db813005f5;p=jalview.git
diff --git a/src/jalview/gui/SeqPanel.java b/src/jalview/gui/SeqPanel.java
index 986f996..3209960 100755
--- a/src/jalview/gui/SeqPanel.java
+++ b/src/jalview/gui/SeqPanel.java
@@ -1,561 +1,1020 @@
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer
+ * Copyright (C) 2005 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
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
package jalview.gui;
+import jalview.datamodel.*;
+
+import jalview.schemes.*;
+
import java.awt.*;
import java.awt.event.*;
-import jalview.datamodel.*;
-import javax.swing.*;
+
import java.util.*;
-import jalview.schemes.*;
-import jalview.analysis.*;
+
+import javax.swing.*;
+/**
+ * DOCUMENT ME!
+ *
+ * @author $author$
+ * @version $Revision$
+ */
public class SeqPanel extends JPanel
{
+ /** DOCUMENT ME!! */
+ public SeqCanvas seqCanvas;
+
+ /** DOCUMENT ME!! */
+ 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
+ int seqEditOccurred = -1;
+ 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);
- public SeqCanvas seqCanvas;
- public AlignmentPanel ap;
-
- protected int startres;
- protected int lastres;
- protected int endres;
+ seqCanvas = new SeqCanvas(avp);
+ setLayout(new BorderLayout());
+ add(seqCanvas, BorderLayout.CENTER);
- protected int startseq;
- protected int padseq;
+ ap = p;
- protected AlignViewport av;
- // if character is inserted or deleted, we will need to recalculate the conservation
- int seqEditOccurred = -1;
+ addMouseMotionListener(new MouseMotionAdapter()
+ {
+ public void mouseMoved(MouseEvent evt)
+ {
+ doMouseMoved(evt);
+ if (editingSeqs)
+ {
+ // This is because MacOSX creates a mouseMoved
+ // If control is down
+ if(!av.isDataset())
+ doMouseDragged(evt);
+ }
+ }
- public SeqPanel(AlignViewport avp, AlignmentPanel p) {
- this.av = avp;
+ public void mouseDragged(MouseEvent evt)
+ {
+ if (editingSeqs)
+ {
+ if(!av.isDataset())
+ doMouseDragged(evt);
+ }
+ else
+ {
+ if(!av.isDataset())
+ doMouseDraggedDefineMode(evt);
+ }
+ }
+ });
- seqCanvas = new SeqCanvas(avp);
- setLayout(new BorderLayout());
- add(seqCanvas, BorderLayout.CENTER);
+ addMouseWheelListener(new MouseWheelListener()
+ {
+ public void mouseWheelMoved(MouseWheelEvent e)
+ {
- ap = p;
+ if (mouseWheelPressed)
+ {
+ Font font = av.getFont();
+ int fontSize = font.getSize();
+ if (e.getWheelRotation() > 0 && fontSize < 51)
+ fontSize++;
+ else if (fontSize > 1)
+ fontSize--;
+
+ av.setFont(new Font(font.getName(), font.getStyle(), fontSize));
+ ap.fontChanged();
+ }
+ else
+ {
+ if (e.getWheelRotation() > 0)
+ ap.scrollUp(false);
+ else
+ ap.scrollUp(true);
+ }
- addMouseMotionListener( new MouseMotionAdapter()
- {
- public void mouseMoved(MouseEvent evt)
- {
- if(av.getWrapAlignment())
- return;
- doMouseMoved(evt); }
+ }
+ });
- public void mouseDragged(MouseEvent evt)
- {
- if(av.getWrapAlignment())
- return;
- if(evt.isShiftDown() || evt.isAltDown() || evt.isControlDown())
- doMouseDragged(evt);
- else
- doMouseDraggedDefineMode(evt);
- }
- });
-
- addMouseListener( new MouseAdapter()
- {
- public void mouseReleased(MouseEvent evt)
- {
- if(av.getWrapAlignment())
- return;
- if(evt.isShiftDown() || evt.isAltDown() || evt.isControlDown())
- doMouseReleased(evt);
- else
- doMouseReleasedDefineMode(evt);
- }
- public void mousePressed(MouseEvent evt)
- {
- if(av.getWrapAlignment())
- return;
- if(evt.isShiftDown() || evt.isAltDown() || evt.isControlDown())
- doMousePressed(evt);
- else
- doMousePressedDefineMode(evt);
- }
-
- });
- repaint();
- }
+ if(!av.isDataset())
+ {
+ addMouseListener(new MouseAdapter()
+ {
+ public void mouseReleased(MouseEvent evt)
+ {
+ mouseWheelPressed = false;
+
+ if (editingSeqs)
+ {
+ doMouseReleased(evt);
+ }
+ else
+ {
+ doMouseReleasedDefineMode(evt);
+ }
+ }
- public void doMouseReleased(MouseEvent evt) {
+ public void mousePressed(MouseEvent evt)
+ {
+ if (javax.swing.SwingUtilities.isMiddleMouseButton(evt))
+ {
+ mouseWheelPressed = true;
+ return;
+ }
+
+ if (evt.isShiftDown() || evt.isAltDown() ||
+ evt.isControlDown())
+ {
+ if (evt.isAltDown() || evt.isControlDown())
+ {
+ groupEditing = true;
+
+ }
+
+ editingSeqs = true;
+ doMousePressed(evt);
+ }
+ else
+ {
+ doMousePressedDefineMode(evt);
+ }
+ }
- int x = evt.getX();
- int res = x/av.getCharWidth() + av.getStartRes();
+ public void mouseExited(MouseEvent evt)
+ {
+ if (editingSeqs)
+ {
+ return;
+ }
- endres = res;
+ doMouseExitedDefineMode(evt);
+ }
- startseq = -1;
- startres = -1;
- lastres = -1;
- if(seqEditOccurred>-1)
- updateConservation(seqEditOccurred);
+ public void mouseEntered(MouseEvent evt)
+ {
+ if (editingSeqs)
+ {
+ return;
+ }
- seqEditOccurred = -1;
+ doMouseEnteredDefineMode(evt);
+ }
+ });
+ }
+ }
- ap.RefreshPanels();
- repaint();
+ int startWrapBlock=-1;
+ int wrappedBlock=-1;
+ int findRes(MouseEvent evt)
+ {
+ int res = 0;
+ int x = evt.getX();
- }
+ if (av.wrapAlignment)
+ {
- public void doMousePressed(MouseEvent evt) {
- ap.alignFrame.addHistoryItem("sequence edit");
- int seq;
- int res;
+ int hgap = av.charHeight;
+ if (av.scaleAboveWrapped)
+ hgap += av.charHeight;
- int x = evt.getX();
- int y = evt.getY();
+ int cHeight = av.getAlignment().getHeight() * av.charHeight
+ + hgap + seqCanvas.getAnnotationHeight();
- res = x/av.getCharWidth() + av.getStartRes();
- seq = y/av.getCharHeight() + av.getStartSeq();
+ int y = evt.getY();
+ y -= hgap;
+ x -= seqCanvas.LABEL_WEST;
- if (seq < av.getAlignment().getHeight() &&
- res < av.getAlignment().getSequenceAt(seq).getLength())
- {
- //char resstr = align.getSequenceAt(seq).getSequence().charAt(res);
- // Find the residue's position in the sequence (res is the position
- // in the alignment
- startseq = seq;
+ int cwidth = seqCanvas.getWrappedCanvasWidth(this.getWidth());
- if (startseq == (av.getAlignment().getHeight() - 1))
- padseq = 1;
- else
- padseq = 1;
+ wrappedBlock = y / cHeight;
+ wrappedBlock += av.getStartRes() / cwidth;
- startres = res;
- lastres = res;
+ res = wrappedBlock * cwidth + x / av.getCharWidth();
}
else
{
- startseq = -1;
- startres = -1;
- lastres = -1;
+ res = (x / av.getCharWidth()) + av.getStartRes();
}
- return;
- }
+ return res;
- public void doMouseMoved(MouseEvent evt)
- {
- int res=0, seq=0;
- int x = evt.getX();
- int y = evt.getY();
- if(av.wrapAlignment)
- {
- y -= 2*av.charHeight;
- int chunkHeight = (av.getAlignment().getHeight()+2)*av.charHeight;
+ }
+ int findSeq(MouseEvent evt)
+ {
- res = (int)((y/chunkHeight)*(getWidth()/av.charWidth)) + x/av.getCharWidth() + av.getStartRes();
+ int seq = 0;
+ int y = evt.getY();
- y %= chunkHeight;
- seq = y / av.getCharHeight() + av.getStartSeq();
+ if (av.wrapAlignment)
+ {
+ int hgap = av.charHeight;
+ if (av.scaleAboveWrapped)
+ hgap += av.charHeight;
- // chunkHeight = (da.getHeight() + 2)*charHeight;
- // startx += chunkWidth;
- }
- else
- {
- res = x / av.getCharWidth() + av.getStartRes();
- seq = y / av.getCharHeight() + av.getStartSeq();
- }
+ int cHeight = av.getAlignment().getHeight() * av.charHeight
+ + hgap + seqCanvas.getAnnotationHeight();
+ y -= hgap;
+
+ seq = ( (y % cHeight) / av.getCharHeight());
+ }
+ else
+ {
+ seq = (y / av.getCharHeight()) + av.getStartSeq();
+ }
+
+ return seq;
+ }
- if(seq>=av.getAlignment().getHeight())
- return;
- SequenceI sequence = av.getAlignment().getSequenceAt(seq);
- Object obj = ResidueProperties.aa2Triplet.get( sequence.getCharAt(res)+"" ) ;
- String aa = "";
- if(obj!=null)
- aa = obj.toString();
+ /**
+ * DOCUMENT ME!
+ *
+ * @param evt DOCUMENT ME!
+ */
+ public void doMouseReleased(MouseEvent evt)
+ {
+ if (seqEditOccurred > -1)
+ {
+ editOccurred(seqEditOccurred);
+ }
- StringBuffer text = new StringBuffer("Sequence " +(seq+1)+" ID: "+sequence.getName());
- if(aa!="")
- text.append(" Residue: "+aa+" ("+ av.getAlignment().getSequenceAt(seq).findPosition(res)+")");
+ startseq = -1;
+ lastres = -1;
+ seqEditOccurred = -1;
+ editingSeqs = false;
+ groupEditing = false;
- ap.alignFrame.statusBar.setText(text.toString());
+ ap.repaint();
+ }
- if(av.showSequenceFeatures)
+ /**
+ * DOCUMENT ME!
+ *
+ * @param evt DOCUMENT ME!
+ */
+ public void doMousePressed(MouseEvent evt)
{
- Vector features = sequence.getSequenceFeatures();
- Enumeration e = features.elements();
- StringBuffer sbuffer = new StringBuffer();
+ ap.alignFrame.addHistoryItem(new HistoryItem("Edit Sequence",
+ av.alignment, HistoryItem.EDIT));
+ int seq = findSeq(evt);
+ int res = findRes(evt);
- while (e.hasMoreElements())
- {
- SequenceFeature sf = (SequenceFeature) e.nextElement();
- if (sf.getStart() <= sequence.findPosition(res) &&
- sf.getEnd() >= sequence.findPosition(res))
- {
- if(sbuffer.length()>0)
- sbuffer.append("; ");
- sbuffer.append(sf.getType() + " " + sf.getDescription());
+ if(seq<0 || res<0)
+ return;
+ if ((seq < av.getAlignment().getHeight()) &&
+ (res < av.getAlignment().getSequenceAt(seq).getLength()))
+ {
+ startseq = seq;
+ lastres = res;
+ }
+ else
+ {
+ startseq = -1;
+ lastres = -1;
}
- }
+ startEdit = lastres;
+ endEdit = lastres;
- ToolTipManager.sharedInstance().registerComponent(this);
- this.setToolTipText(sbuffer.toString());
+ return;
}
+ /**
+ * DOCUMENT ME!
+ *
+ * @param evt DOCUMENT ME!
+ */
+ public void doMouseMoved(MouseEvent evt)
+ {
+ int res = findRes(evt);
+ int seq = findSeq(evt);
- }
+ if(res<0 || seq<0 || seq >= av.getAlignment().getHeight())
+ return;
- public void doMouseDragged(MouseEvent evt) {
- // If we're dragging we're editing
+ SequenceI sequence = av.getAlignment().getSequenceAt(seq);
- int x = evt.getX();
+ if (res > sequence.getLength())
+ {
+ return;
+ }
- int res = x/av.getCharWidth() + av.getStartRes();
- if (res < 0)
- res = 0;
+ if(seqCanvas.pdbCanvas!=null && sequence==seqCanvas.pdbCanvas.sequence)
+ {
+ seqCanvas.pdbCanvas.highlightRes(sequence.findPosition(res));
+ }
- if (res != lastres)
- {
- // Group editing
- if (evt.isAltDown() || evt.isControlDown())
+
+ StringBuffer text = new StringBuffer("Sequence " + (seq + 1) + " ID: " +
+ sequence.getName());
+
+ Object obj = null;
+ if (av.alignment.isNucleotide())
{
- SequenceGroup sg = av.getAlignment().findGroup(startseq);
- if (sg != null)
+ 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 != "")
{
- boolean deleteAllowed = false;
- if (res < av.getAlignment().getWidth() && res < lastres)
+ text.append( obj + " (" +
+ av.getAlignment().getSequenceAt(seq).findPosition(res) + ")");
+ }
+ }
+
+ ap.alignFrame.statusBar.setText(text.toString());
+
+ // use aa to see if the mouse pointer is on a
+ if (av.showSequenceFeatures)
+ {
+ Vector features = sequence.getDatasetSequence().getSequenceFeatures();
+ if(features!=null)
{
- /// Are we able to delete?
- boolean allGaps = true;
- for (int i = 0; i < sg.getSize(); i++)
+ StringBuffer sbuffer = new StringBuffer("");
+
+ for (int i = 0; i < features.size(); i++)
{
- SequenceI s = sg.getSequenceAt(i);
- for (int j = lastres-1; j >= res && allGaps; j--)
+ SequenceFeature sf = (SequenceFeature) features.elementAt(i);
+
+ if ( (sf.getBegin() <= sequence.findPosition(res)) &&
+ (sf.getEnd() >= sequence.findPosition(res)))
{
- if (!jalview.util.Comparison.isGap(s.getSequence().charAt(j)))
+ if (sf.getType().equals("disulfide bond"))
+ {
+ if (sf.getBegin() == sequence.findPosition(res)
+ || sf.getEnd() == sequence.findPosition(res))
{
- res = j + 1;
- allGaps = false;
+ if (sbuffer.length() > 6)
+ sbuffer.append("
");
+ sbuffer.append("disulfide bond " + sf.getBegin() + ":" +
+ sf.getEnd());
}
+ }
+ else
+ {
+ if (sbuffer.length() > 6)
+ sbuffer.append("
");
+ sbuffer.append(sf.getType());
+ if (sf.getDescription() != null)
+ sbuffer.append(" " + sf.getDescription());
+
+ if (sf.getStatus() != null)
+ {
+ sbuffer.append(" (" + sf.getStatus() + ")");
+ }
+ }
}
- if(!deleteAllowed && allGaps)
- deleteAllowed = true;
}
+
+ sbuffer.append("");
+ if(sbuffer.length()==13) //
+ setToolTipText("");
+ else
+ setToolTipText(sbuffer.toString());
}
+ else
+ setToolTipText("");
+ }
+ }
- // drag to right
- if (res < av.getAlignment().getWidth() && res > lastres)
- sg.setEndRes(sg.getEndRes() + 1);
+ /**
+ * DOCUMENT ME!
+ *
+ * @param evt DOCUMENT ME!
+ */
+ public void doMouseDragged(MouseEvent evt)
+ {
+ // If we're dragging we're editing
+ int res = findRes(evt);
- // drag to left
- else if (deleteAllowed && res < av.getAlignment().getWidth() &&
- res < lastres)
- sg.setEndRes(sg.getEndRes() - 1);
+ if (res < 0)
+ {
+ res = 0;
+ }
+ if ((lastres == -1) || (lastres == res))
+ {
+ return;
+ }
+ boolean dragRight = true;
+ if ((res < av.getAlignment().getWidth()) && (res < lastres))
+ {
+ dragRight = false;
+ }
- for (int i = 0; i < sg.getSize(); i++)
+ if (res != lastres)
+ {
+ // Group editing
+ if (groupEditing)
{
- SequenceI s = sg.getSequenceAt(i);
- int k = av.alignment.findIndex(s);
+ SequenceGroup sg = av.getSelectionGroup();
- // drag to right
- if (res < av.getAlignment().getWidth() && res > lastres)
- for (int j = lastres; j < res; j++)
- insertChar(j, k);
+ if (sg == null)
+ {
+ lastres = -1;
- // drag to left
- else if (deleteAllowed && res < av.getAlignment().getWidth() && res < lastres)
- {
- for (int j = res; j < lastres; j++)
+ return;
+ }
+
+ // drag to right
+ if (dragRight)
{
- deleteChar(j, k);
- startres = res;
+ sg.setEndRes(sg.getEndRes() + (res - lastres));
}
- }
- }
- }
- }
- else /////Editing a single sequence///////////
- {
- if (res < av.getAlignment().getWidth() && res > lastres)
- {
- // dragging to the right
- for (int j = lastres; j < res; j++)
- insertChar(j, startseq);
- }
- else if (res < av.getAlignment().getWidth() && res < lastres)
- {
- // dragging to the left
- for (int j = res; j < lastres; j++)
- {
- deleteChar(j, startseq);
- startres = res;
- }
- }
- }
+ // drag to left
+ else
+ {
+ /// Are we able to delete?
+ // ie are all columns blank?
+ boolean deleteAllowed = false;
- }
+ for (int s = 0; s < sg.getSize(); s++)
+ {
+ SequenceI seq = sg.getSequenceAt(s);
+
+ for (int j = res; j < lastres; j++)
+ {
+ if (seq.getSequence().length() <= j)
+ {
+ continue;
+ }
+
+ if (!jalview.util.Comparison.isGap(
+ seq.getSequence().charAt(j)))
+ {
+ // Not a gap, block edit not valid
+ res = j + 1;
+ deleteAllowed = false;
+
+ continue;
+ }
+
+ deleteAllowed = true;
+ }
+ }
- lastres = res;
- repaint();
- }
+ if (!deleteAllowed)
+ {
+ lastres = -1;
- public void drawChars(int seqstart, int seqend, int start) {
- seqCanvas.drawPanel(seqCanvas.gg, start,av.getEndRes(),seqstart,seqend,av.getStartRes(),av.getStartSeq(),0);
- repaint();
- }
+ return;
+ }
- public void insertChar(int j, int seq)
- {
- av.alignment.getSequenceAt(seq).insertCharAt(j, av.getGapCharacter());
- seqEditOccurred=seq;
- }
+ sg.setEndRes(sg.getEndRes() - (lastres - res));
+ }
- public void deleteChar(int j, int seq)
- {
+ for (int i = 0; i < sg.getSize(); i++)
+ {
+ SequenceI s = sg.getSequenceAt(i);
+ int k = av.alignment.findIndex(s);
- if ( jalview.util.Comparison.isGap( av.alignment.getSequenceAt(seq).getSequence().charAt(j)))
- av.alignment.getSequenceAt(seq).deleteCharAt(j);
+ // drag to right
+ if (dragRight)
+ {
+ for (int j = lastres; j < res; j++)
+ {
+ insertChar(j, k);
+ }
+ }
- av.alignment.getWidth();
- repaint();
- seqEditOccurred=seq;
- }
-
-
- void updateConservation(int i)
- {
- /* Alignment al = (Alignment) av.getAlignment();
- SequenceGroup sg = av.alignment.findGroup( al.getSequenceAt(i));
- if(sg==null || !(sg.cs instanceof ConservationColourScheme))
- return;
-
- Conservation c = sg.getConservation();
-
- c = new Conservation("All", al.cons,
- ResidueProperties.propHash, 3, sg.sequences, 0,
- al.getWidth());
- c.calculate();
- c.verdict(false, 100);
- sg.setConservation(c);
- ConservationColourScheme ccs = (ConservationColourScheme)sg.cs;
- ccs.conserve = c;*/
- }
-
-//////////////////////////////////////////
-/////Everything below this is for defining the boundary of the rubberband
-//////////////////////////////////////////
- int oldSeq = -1;
- public void doMousePressedDefineMode(MouseEvent evt)
- {
- int res = evt.getX()/av.getCharWidth() + av.getStartRes();
- int seq = evt.getY()/av.getCharHeight() + av.getStartSeq();
- oldSeq = seq;
-
- stretchGroup = av.getRubberbandGroup();
-
- if(stretchGroup == null)
- {
- stretchGroup = av.alignment.findGroup( (Sequence) av.getAlignment().
- getSequenceAt(seq));
- av.setRubberbandGroup( stretchGroup );
- }
+ // drag to left
+ else
+ {
+ for (int j = res; j < lastres; j++)
+ {
+ if (s.getLength() > j)
+ {
+ deleteChar(res, k);
+ }
+ }
+ }
+ }
+ }
+ else /////Editing a single sequence///////////
+ {
+ if ((res < av.getAlignment().getWidth()) && (res > lastres))
+ {
+ // dragging to the right
+ for (int j = lastres; j < res; j++)
+ {
+ insertChar(j, startseq);
+ }
+ }
+ else if ((res < av.getAlignment().getWidth()) &&
+ (res < lastres))
+ {
+ // dragging to the left
+ for (int j = lastres; j > res; j--)
+ {
+ if (jalview.util.Comparison.isGap(
+ av.alignment.getSequenceAt(startseq)
+ .getSequence().charAt(res)))
+ {
+ deleteChar(res, startseq);
+ }
+ else
+ {
+ break;
+ }
+ }
+ }
+ }
+ }
- else if(!stretchGroup.sequences.contains((Sequence)av.getAlignment().getSequenceAt(seq))
- || stretchGroup.getStartRes()>res
- || stretchGroup.getEndRes()= res)
- {
- stretchGroup = allGroups[i];
- av.setRubberbandGroup(stretchGroup);
- break;
- }
- }
+ /**
+ * DOCUMENT ME!
+ *
+ * @param j DOCUMENT ME!
+ * @param seq DOCUMENT ME!
+ */
+ public void insertChar(int j, int seq)
+ {
+ av.alignment.getSequenceAt(seq).insertCharAt(j, av.getGapCharacter());
+ seqEditOccurred = seq;
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param j DOCUMENT ME!
+ * @param seq DOCUMENT ME!
+ */
+ public void deleteChar(int j, int seq)
+ {
+ av.alignment.getSequenceAt(seq).deleteCharAt(j);
+ seqEditOccurred = seq;
- if(stretchGroup==null)
+ av.alignment.getWidth();
+ seqCanvas.repaint();
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param i DOCUMENT ME!
+ */
+ void editOccurred(int i)
{
- // define a new group here
- SequenceGroup sg = new SequenceGroup();
- sg.setStartRes(res);
- sg.setEndRes(res);
- sg.addSequence( (Sequence)av.getAlignment().getSequenceAt(seq) );
- av.setRubberbandGroup( sg );
- stretchGroup = sg;
-
- if(av.getConservationSelected())
- Desktop.setConservationSliderSource(ap, av.getGlobalColourScheme(), "Background");
- else if(av.getGlobalColourScheme()!=null && av.getGlobalColourScheme().canThreshold())
+ if (endEdit == startEdit)
{
- ResidueColourScheme rcs = (ResidueColourScheme) av.getGlobalColourScheme();
- int threshold = rcs.getThreshold();
- if (threshold > 0)
- Desktop.setPIDSliderSource(ap, av.getGlobalColourScheme(), "Background");
+ ap.alignFrame.historyList.pop();
+ ap.alignFrame.updateEditMenuBar();
}
+ av.firePropertyChange("alignment", null,av.getAlignment().getSequences());
+
}
- else if( javax.swing.SwingUtilities.isRightMouseButton(evt))
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param evt DOCUMENT ME!
+ */
+ public void doMousePressedDefineMode(MouseEvent evt)
{
- jalview.gui.PopupMenu pop = new jalview.gui.PopupMenu( ap , null);
- pop.show(this, evt.getX(), evt.getY());
+ int res = findRes(evt);
+ int seq = findSeq(evt);
+ oldSeq = seq;
- // edit the properties of existing group
- }
+ startWrapBlock=wrappedBlock;
- if(stretchGroup!=null && stretchGroup.getEndRes()==res)
- // Edit end res position of selected group
- changeEndRes = true;
+ if(av.wrapAlignment && seq>av.alignment.getHeight())
+ {
+ JOptionPane.showInternalMessageDialog(Desktop.desktop,
+ "Cannot edit annotations in wrapped view.",
+ "Wrapped view - no edit",
+ JOptionPane.WARNING_MESSAGE);
+ return;
+ }
- else if(stretchGroup!=null && stretchGroup.getStartRes()==res)
- // Edit end res position of selected group
- changeStartRes = true;
+ if(seq<0 || res<0)
+ return;
- seqCanvas.paintFlag = true;
- repaint();
+ SequenceI sequence = (Sequence) av.getAlignment().getSequenceAt(seq);
- }
+ if ((sequence == null) || (res > sequence.getLength()))
+ {
+ return;
+ }
- boolean changeEndSeq = false;
- boolean changeStartSeq = false;
- boolean changeEndRes = false;
- boolean changeStartRes = false;
- SequenceGroup stretchGroup = null;
+ stretchGroup = av.getSelectionGroup();
- public void doMouseReleasedDefineMode(MouseEvent evt)
- {
+ if (stretchGroup == null)
+ {
+ stretchGroup = av.alignment.findGroup(sequence);
- if(stretchGroup.cs instanceof ClustalxColourScheme)
- {
- stretchGroup.cs = new ClustalxColourScheme(stretchGroup.sequences, av.alignment.getWidth());
- seqCanvas.paintFlag = true;
- repaint();
- }
+ if ((stretchGroup != null) && (res > stretchGroup.getStartRes()) &&
+ (res < stretchGroup.getEndRes()))
+ {
+ av.setSelectionGroup(stretchGroup);
+ }
+ else
+ {
+ stretchGroup = null;
+ }
+ }
+ else if (!stretchGroup.sequences.contains(sequence) ||
+ (stretchGroup.getStartRes() > res) ||
+ (stretchGroup.getEndRes() < res))
+ {
+ stretchGroup = null;
- else if(stretchGroup.cs instanceof ConservationColourScheme)
- {
- ConservationColourScheme ccs = (ConservationColourScheme)stretchGroup.cs;
+ SequenceGroup[] allGroups = av.alignment.findAllGroups(sequence);
- Conservation c = new Conservation("Group",
- ResidueProperties.propHash, 3, stretchGroup.sequences, 0,
- av.alignment.getWidth() );
+ if (allGroups != null)
+ {
+ for (int i = 0; i < allGroups.length; i++)
+ {
+ if ((allGroups[i].getStartRes() <= res) &&
+ (allGroups[i].getEndRes() >= res))
+ {
+ stretchGroup = allGroups[i];
+ av.setSelectionGroup(stretchGroup);
- c.calculate();
- c.verdict(false, 100);
- ccs = new ConservationColourScheme(c, ccs.cs);
+ break;
+ }
+ }
+ }
+ }
- stretchGroup.cs = ccs;
+ if (stretchGroup == null)
+ {
+ // define a new group here
+ SequenceGroup sg = new SequenceGroup();
+ sg.setStartRes(res);
+ sg.setEndRes(res);
+ sg.addSequence(sequence, false);
+ av.setSelectionGroup(sg);
+ stretchGroup = sg;
+
+ if (av.getConservationSelected())
+ {
+ SliderPanel.setConservationSlider(ap,
+ av.getGlobalColourScheme(), "Background");
+ }
+ if (av.getAbovePIDThreshold())
+ {
+ SliderPanel.setPIDSliderSource(ap, av.getGlobalColourScheme(),
+ "Background");
+ }
+ }
+ else if (javax.swing.SwingUtilities.isRightMouseButton(evt))
+ {
+ jalview.gui.PopupMenu pop = new jalview.gui.PopupMenu(ap, null);
+ pop.show(this, evt.getX(), evt.getY());
+
+ // edit the properties of existing group
+ }
- Desktop.setConservationSliderSource(ap, stretchGroup.cs, stretchGroup.getName()) ;
+ if ((stretchGroup != null) && (stretchGroup.getEndRes() == res))
+ {
+ // Edit end res position of selected group
+ changeEndRes = true;
+ }
+ else if ((stretchGroup != null) && (stretchGroup.getStartRes() == res))
+ {
+ // Edit end res position of selected group
+ changeStartRes = true;
+ }
- seqCanvas.paintFlag = true;
- repaint();
+ stretchGroup.getWidth();
+
+ seqCanvas.repaint();
}
- else
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param evt DOCUMENT ME!
+ */
+ public void doMouseReleasedDefineMode(MouseEvent evt)
{
- if(stretchGroup.cs !=null && stretchGroup.cs.canThreshold())
- {
- ResidueColourScheme rcs = (ResidueColourScheme) stretchGroup.cs;
- int threshold = rcs.getThreshold();
- if(threshold>0)
- Desktop.setPIDSliderSource(ap, stretchGroup.cs, stretchGroup.getName());
- }
+ if (mouseDragging)
+ {
+ stretchGroup.recalcConservation();
+ mouseDragging = false;
+ }
+
+ if (stretchGroup == null)
+ {
+ return;
+ }
+
+ if(stretchGroup.cs!=null)
+ {
+ if (stretchGroup.cs instanceof ClustalxColourScheme)
+ {
+ ( (ClustalxColourScheme) stretchGroup.cs).resetClustalX(stretchGroup.
+ sequences,
+ stretchGroup.getWidth());
+ }
+ if (stretchGroup.cs.conservationApplied())
+ {
+ SliderPanel.setConservationSlider(ap, stretchGroup.cs,
+ stretchGroup.getName());
+ }
+ else
+ {
+ SliderPanel.setPIDSliderSource(ap, stretchGroup.cs,
+ stretchGroup.getName());
+ }
+ }
+ changeEndRes = false;
+ changeStartRes = false;
+ stretchGroup = null;
+ PaintRefresher.Refresh(av.alignment);
}
+ /**
+ * DOCUMENT ME!
+ *
+ * @param evt DOCUMENT ME!
+ */
+ public void doMouseDraggedDefineMode(MouseEvent evt)
+ {
+ int res = findRes(evt);
+ int y = findSeq(evt);
- changeEndRes = false;
- changeStartRes = false;
- stretchGroup = null;
- }
+ if(wrappedBlock!=startWrapBlock)
+ return;
+ if (stretchGroup == null)
+ {
+ return;
+ }
- boolean remove = false;
- public void doMouseDraggedDefineMode(MouseEvent evt)
- {
- int res = evt.getX()/av.getCharWidth() + av.getStartRes();
- int y = evt.getY()/av.getCharHeight() + av.getStartSeq();
+ if (res > av.alignment.getWidth())
+ {
+ res = av.alignment.getWidth() - 1;
+ }
+ if (stretchGroup.getEndRes() == res)
+ {
+ // Edit end res position of selected group
+ changeEndRes = true;
+ }
+ else if (stretchGroup.getStartRes() == res)
+ {
+ // Edit start res position of selected group
+ changeStartRes = true;
+ }
- if(stretchGroup.getEndRes()==res)
- // Edit end res position of selected group
- changeEndRes = true;
+ if (res < av.getStartRes())
+ {
+ res = av.getStartRes();
+ }
+ else if (res > av.getEndRes() && !av.getWrapAlignment())
+ {
+ res = av.getEndRes();
+ }
- else if(stretchGroup.getStartRes()==res)
- // Edit start res position of selected group
- changeStartRes = true;
+ if (changeEndRes)
+ {
+ if (res > (stretchGroup.getStartRes() - 1))
+ {
+ stretchGroup.setEndRes(res);
+ }
+ }
+ else if (changeStartRes)
+ {
+ if (res < (stretchGroup.getEndRes() + 1))
+ {
+ stretchGroup.setStartRes(res);
+ }
+ }
+ int dragDirection = 0;
- if(resav.getEndRes())
- res = av.getEndRes();
+ if (y > oldSeq)
+ {
+ dragDirection = 1;
+ }
+ else if (y < oldSeq)
+ {
+ dragDirection = -1;
+ }
- if(changeEndRes)
- {
- if(res>stretchGroup.getStartRes()-1)
- stretchGroup.setEndRes( res );
+ while ((y != oldSeq) && (oldSeq > 0) && (y < av.alignment.getHeight()))
+ {
+ // This routine ensures we don't skip any sequences, as the
+ // selection is quite slow.
+ Sequence seq = (Sequence) av.getAlignment().getSequenceAt(oldSeq);
+
+ oldSeq += dragDirection;
+
+ Sequence nextSeq = (Sequence) av.getAlignment().getSequenceAt(oldSeq);
+
+ if (stretchGroup.sequences.contains(nextSeq))
+ {
+ stretchGroup.deleteSequence(seq, false);
+ }
+ else
+ {
+ if (seq != null)
+ {
+ stretchGroup.addSequence(seq, false);
+ }
+
+ stretchGroup.addSequence(nextSeq, false);
+ }
+ }
+
+ oldSeq = y;
+ mouseDragging = true;
+
+ if (scrollThread != null)
+ {
+ scrollThread.setEvent(evt);
+ }
+
+ seqCanvas.repaint();
}
- else if(changeStartRes)
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param e DOCUMENT ME!
+ */
+ public void doMouseEnteredDefineMode(MouseEvent e)
{
- if(res oldSeq)
- dragDirection = 1;
- else if (y < oldSeq)
- dragDirection = -1;
+ if (mouseDragging)
+ {
+ scrollThread = new ScrollThread();
+ }
+ }
- while (y != oldSeq)
+ // this class allows scrolling off the bottom of the visible alignment
+ class ScrollThread extends Thread
{
- // This routine ensures we don't skip any sequences, as the
- // selection is quite slow.
- Sequence seq = (Sequence) av.getAlignment().getSequenceAt(oldSeq);
+ MouseEvent evt;
+ boolean running = false;
- oldSeq += dragDirection;
- Sequence nextSeq = (Sequence) av.getAlignment().getSequenceAt(oldSeq);
-
- if (stretchGroup.sequences.contains(nextSeq))
- {
- stretchGroup.deleteSequence(seq);
- stretchGroup.deleteSequence(nextSeq);
- }
- else
- {
- stretchGroup.addSequence(seq);
- stretchGroup.addSequence(nextSeq);
- }
- }
- oldSeq = y;
+ public ScrollThread()
+ {
+ start();
+ }
- seqCanvas.paintFlag = true;
- repaint();
- }
+ public void setEvent(MouseEvent e)
+ {
+ evt = e;
+ }
+ public void stopScrolling()
+ {
+ running = false;
+ }
-}
+ public void run()
+ {
+ running = true;
+ while (running)
+ {
+ if (evt != null)
+ {
+ if (mouseDragging && (evt.getY() < 0) &&
+ (av.getStartSeq() > 0))
+ {
+ running = ap.scrollUp(true);
+ }
+ if (mouseDragging && (evt.getY() >= getHeight()) &&
+ (av.alignment.getHeight() > av.getEndSeq()))
+ {
+ running = ap.scrollUp(false);
+ }
+ if (mouseDragging && (evt.getX() < 0))
+ {
+ running = ap.scrollRight(true);
+ }
+ else if (mouseDragging && (evt.getX() >= getWidth()))
+ {
+ running = ap.scrollRight(false);
+ }
+ }
+ try
+ {
+ Thread.sleep(20);
+ }
+ catch (Exception ex)
+ {
+ }
+ }
+ }
+ }
+}