X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FSeqPanel.java;h=3209960d6f183e9a9901884df259378a40a9f61a;hb=e21fb8306a9efaf170d7354daa10e7ee42d37c17;hp=b650c9af5c10a5d32a789de3f7e661702befddad;hpb=70654ad85b5ca344793b0a199107fec66facbda6;p=jalview.git
diff --git a/src/jalview/gui/SeqPanel.java b/src/jalview/gui/SeqPanel.java
index b650c9a..3209960 100755
--- a/src/jalview/gui/SeqPanel.java
+++ b/src/jalview/gui/SeqPanel.java
@@ -1,396 +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 java.awt.*;
-import java.awt.event.*;
import jalview.datamodel.*;
-import javax.swing.*;
+
import jalview.schemes.*;
-import jalview.analysis.*;
+import java.awt.*;
+import java.awt.event.*;
-public class SeqPanel extends JPanel
-{
+import java.util.*;
- public SeqCanvas seqCanvas;
- public AlignmentPanel parent;
+import javax.swing.*;
- protected int startres;
- protected int lastres;
- protected int endres;
- protected int startseq;
- protected int padseq;
+/**
+ * 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 boolean editFlag;
- protected AlignViewport av;
+ seqCanvas = new SeqCanvas(avp);
+ setLayout(new BorderLayout());
+ add(seqCanvas, BorderLayout.CENTER);
- public SeqPanel(AlignViewport av, AlignmentPanel p) {
- this.av = av;
+ ap = p;
- seqCanvas = new SeqCanvas(av);
- setLayout(new BorderLayout());
- add(seqCanvas, BorderLayout.CENTER);
- parent = p;
+ 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 void mouseDragged(MouseEvent evt)
+ {
+ if (editingSeqs)
+ {
+ if(!av.isDataset())
+ doMouseDragged(evt);
+ }
+ else
+ {
+ if(!av.isDataset())
+ doMouseDraggedDefineMode(evt);
+ }
+ }
+ });
+
+ addMouseWheelListener(new MouseWheelListener()
+ {
+ public void mouseWheelMoved(MouseWheelEvent e)
+ {
- addMouseMotionListener( new MouseMotionAdapter()
- {
- public void mouseMoved(MouseEvent evt)
- { doMouseMoved(evt); }
- public void mouseDragged(MouseEvent evt)
- { doMouseDragged(evt); }
- });
+ 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);
+ }
- addMouseListener( new MouseAdapter()
- {
- public void mouseReleased(MouseEvent evt)
- { doMouseReleased(evt); }
- public void mousePressed(MouseEvent evt)
- { doMousePressed(evt); }
+ }
+ });
- });
- repaint();
- }
+ if(!av.isDataset())
+ {
+ addMouseListener(new MouseAdapter()
+ {
+ public void mouseReleased(MouseEvent evt)
+ {
+ mouseWheelPressed = false;
+
+ if (editingSeqs)
+ {
+ doMouseReleased(evt);
+ }
+ else
+ {
+ doMouseReleasedDefineMode(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);
+ }
+ }
+
+ public void mouseExited(MouseEvent evt)
+ {
+ if (editingSeqs)
+ {
+ return;
+ }
+
+ doMouseExitedDefineMode(evt);
+ }
+
+ public void mouseEntered(MouseEvent evt)
+ {
+ if (editingSeqs)
+ {
+ return;
+ }
+
+ doMouseEnteredDefineMode(evt);
+ }
+ });
+ }
+ }
- public void doMouseReleased(MouseEvent evt) {
+ int startWrapBlock=-1;
+ int wrappedBlock=-1;
+ int findRes(MouseEvent evt)
+ {
+ int res = 0;
+ int x = evt.getX();
- int x = evt.getX();
- int res = (int)(x/av.getCharWidth()) + av.getStartRes();
+ if (av.wrapAlignment)
+ {
- endres = res;
+ int hgap = av.charHeight;
+ if (av.scaleAboveWrapped)
+ hgap += av.charHeight;
- // This is to detect edits - we're at the end of an edit if mouse is up
- editFlag = false;
- startseq = -1;
- startres = -1;
- lastres = -1;
+ int cHeight = av.getAlignment().getHeight() * av.charHeight
+ + hgap + seqCanvas.getAnnotationHeight();
- parent.RefreshPanels();
- repaint();
+ int y = evt.getY();
+ y -= hgap;
+ x -= seqCanvas.LABEL_WEST;
- }
- public void doMousePressed(MouseEvent evt) {
- parent.alignFrame.addHistoryItem("sequence edit");
- int seq;
- int res;
+ int cwidth = seqCanvas.getWrappedCanvasWidth(this.getWidth());
- int x = evt.getX();
- int y = evt.getY();
+ wrappedBlock = y / cHeight;
+ wrappedBlock += av.getStartRes() / cwidth;
- res = (int)(x/av.getCharWidth()) + av.getStartRes();
- seq = (y)/av.getCharHeight() + av.getStartSeq();
+ res = wrappedBlock * cwidth + x / av.getCharWidth();
- if (seq < av.getAlignment().getHeight() && res < av.getAlignment().getSequenceAt(seq).getLength())
+ }
+ else
{
- //char resstr = align.getSequenceAt(seq).getSequence().charAt(res);
- // Find the residue's position in the sequence (res is the position
- // in the alignment
+ res = (x / av.getCharWidth()) + av.getStartRes();
+ }
- startseq = seq;
+ return res;
- if (startseq == (av.getAlignment().getHeight()-1)) {
- padseq = 1;
- } else {
- padseq = 1;
- }
+ }
- startres = res;
- lastres = res;
+ int findSeq(MouseEvent evt)
+ {
- } else {
- startseq = -1;
- startres = -1;
- lastres = -1;
- }
+ int seq = 0;
+ int y = evt.getY();
- return;
- }
+ if (av.wrapAlignment)
+ {
+ int hgap = av.charHeight;
+ if (av.scaleAboveWrapped)
+ hgap += av.charHeight;
- 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 cHeight = av.getAlignment().getHeight() * av.charHeight
+ + hgap + seqCanvas.getAnnotationHeight();
+
+ y -= hgap;
+ seq = ( (y % cHeight) / av.getCharHeight());
+ }
+ else
+ {
+ seq = (y / av.getCharHeight()) + av.getStartSeq();
+ }
- res = (int)((y/chunkHeight)*(getWidth()/av.charWidth)) + (int)(x/av.getCharWidth()) + av.getStartRes();
+ return seq;
+ }
- System.out.println( ((y/chunkHeight)*(getWidth()/av.charWidth)) +" "+((x / av.getCharWidth()) + av.getStartRes()) );
- y %= chunkHeight;
- seq = y / av.getCharHeight() + av.getStartSeq();
- // chunkHeight = (da.getHeight() + 2)*charHeight;
- // startx += chunkWidth;
- }
- else
+ /**
+ * DOCUMENT ME!
+ *
+ * @param evt DOCUMENT ME!
+ */
+ public void doMouseReleased(MouseEvent evt)
{
- res = (int) (x / av.getCharWidth()) + av.getStartRes();
- seq = y / av.getCharHeight() + av.getStartSeq();
+ if (seqEditOccurred > -1)
+ {
+ editOccurred(seqEditOccurred);
+ }
+
+ startseq = -1;
+ lastres = -1;
+ seqEditOccurred = -1;
+ editingSeqs = false;
+ groupEditing = false;
+
+ ap.repaint();
}
+ /**
+ * DOCUMENT ME!
+ *
+ * @param evt DOCUMENT ME!
+ */
+ public void doMousePressed(MouseEvent evt)
+ {
+ ap.alignFrame.addHistoryItem(new HistoryItem("Edit Sequence",
+ av.alignment, HistoryItem.EDIT));
+
+ int seq = findSeq(evt);
+ int res = findRes(evt);
+
+ 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;
+
+ return;
+ }
- if(seq>=av.getAlignment().getHeight())
- return;
-
- Object obj = ResidueProperties.aa2Triplet.get( av.getAlignment().getSequenceAt(seq).getCharAt(res)+"" ) ;
- String aa = "";
- if(obj!=null)
- aa = obj.toString();
-
- StringBuffer text = new StringBuffer("Sequence " +(seq+1)+" ID: "+av.getAlignment().getSequenceAt(seq).getName());
- if(aa!="")
- text.append(" Residue: "+aa+" ("+ av.getAlignment().getSequenceAt(seq).findPosition(res)+")");
-
- parent.alignFrame.statusBar.setText(text.toString());
+ /**
+ * 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
- editFlag = true;
- int x = evt.getX();
+ SequenceI sequence = av.getAlignment().getSequenceAt(seq);
- int res = (int)(x/av.getCharWidth()) + av.getStartRes();
- if (res < 0) {res = 0;}
+ if (res > sequence.getLength())
+ {
+ return;
+ }
- if (res != lastres) {
- if (startseq != -1) {
+ if(seqCanvas.pdbCanvas!=null && sequence==seqCanvas.pdbCanvas.sequence)
+ {
+ seqCanvas.pdbCanvas.highlightRes(sequence.findPosition(res));
+ }
- // Group editing
- if (av.getGroupEdit()) {
- SequenceGroup sg = av.getAlignment().findGroup(startseq);
- if(sg!=null)
- if (res < av.getAlignment().getWidth() && res < lastres)
+ 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 != "")
{
- boolean flag = false;
- for (int i= 0 ; i < sg.getSize(); i++)
+ 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)
{
- SequenceI s = (SequenceI)sg.getSequenceAt(i);
- for (int j=lastres-1; j >= res; j--)
+ StringBuffer sbuffer = new StringBuffer("");
+
+ for (int i = 0; i < features.size(); i++)
{
- if (!flag)
+ SequenceFeature sf = (SequenceFeature) features.elementAt(i);
+
+ if ( (sf.getBegin() <= sequence.findPosition(res)) &&
+ (sf.getEnd() >= sequence.findPosition(res)))
{
- if (!s.getSequence().substring(j,j+1).equals(av.getAlignment().getGapCharacter()) &&
- !s.getSequence().substring(j,j+1).equals(" "))
+ if (sf.getType().equals("disulfide bond"))
{
- res = j+1;
- flag = true;
- }
- }
- }
- }
- }
-
- if(sg!=null)
- for (int i= 0 ; i < sg.getSize(); i++)
- {
- SequenceI s = (SequenceI)sg.getSequenceAt(i);
- boolean found = false;
- int sno = -1;
- for (int k = 0; k < av.getAlignment().getHeight(); k++)
+ if (sf.getBegin() == sequence.findPosition(res)
+ || sf.getEnd() == sequence.findPosition(res))
+ {
+ 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() + ")");
+ }
+ }
+ }
+
+ }
+
+ sbuffer.append("");
+ if(sbuffer.length()==13) //
+ setToolTipText("");
+ else
+ setToolTipText(sbuffer.toString());
+ }
+ else
+ setToolTipText("");
+ }
+ }
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param evt DOCUMENT ME!
+ */
+ public void doMouseDragged(MouseEvent evt)
+ {
+ // If we're dragging we're editing
+ int res = findRes(evt);
+
+ if (res < 0)
+ {
+ res = 0;
+ }
+
+ if ((lastres == -1) || (lastres == res))
+ {
+ return;
+ }
+
+ boolean dragRight = true;
+
+ if ((res < av.getAlignment().getWidth()) && (res < lastres))
+ {
+ dragRight = false;
+ }
+
+ if (res != lastres)
+ {
+ // Group editing
+ if (groupEditing)
{
- if (av.getAlignment().getSequenceAt(k) == s)
- {
- found = true;
- sno = k;
- break;
- }
- }
- if (found && sno != -1) {
- if (res < av.getAlignment().getWidth() && res > lastres)
- {
- for (int j = lastres; j < res; j++)
- insertChar(j,sno);
+ SequenceGroup sg = av.getSelectionGroup();
- int index = av.getAlignment().findIndex(s);
- if (index != -1)
- drawChars(index,index+1,lastres);
+ if (sg == null)
+ {
+ lastres = -1;
+ return;
+ }
- } else if (res < av.getAlignment().getWidth() && res < lastres)
- {
- for (int j = res; j < lastres; j++)
+ // drag to right
+ if (dragRight)
{
- deleteChar(j,res,sno);
- startres = res;
- }
- int index = av.getAlignment().findIndex(s);
- if (index != -1)
- drawChars(index,index+1,res);
-
- }
- }
+ sg.setEndRes(sg.getEndRes() + (res - lastres));
+ }
- }
- lastres = res;
- } else {
+ // 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;
+ }
+ }
+
+ if (!deleteAllowed)
+ {
+ lastres = -1;
+
+ return;
+ }
+
+ sg.setEndRes(sg.getEndRes() - (lastres - res));
+ }
+
+ for (int i = 0; i < sg.getSize(); i++)
+ {
+ SequenceI s = sg.getSequenceAt(i);
+ int k = av.alignment.findIndex(s);
+
+ // drag to right
+ if (dragRight)
+ {
+ for (int j = lastres; j < res; j++)
+ {
+ insertChar(j, k);
+ }
+ }
+
+ // 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;
+ }
+ }
+ }
+ }
+ }
+
+ endEdit = res;
+ lastres = res;
+ seqCanvas.repaint();
+ }
+ /**
+ * DOCUMENT ME!
+ *
+ * @param seqstart DOCUMENT ME!
+ * @param seqend DOCUMENT ME!
+ * @param start DOCUMENT ME!
+ */
+ public void drawChars(int seqstart, int seqend, int start)
+ {
+ seqCanvas.drawPanel(seqCanvas.gg, start, av.getEndRes(), seqstart,
+ seqend, av.getStartRes(), av.getStartSeq(), 0);
+ seqCanvas.repaint();
+ }
- if (res < av.getAlignment().getWidth() && res > lastres) {
- // dragging to the right
- for (int j = lastres; j < res; j++)
- insertChar(j,startseq);
+ /**
+ * 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;
+ }
- drawChars(startseq,startseq+1,lastres);
+ /**
+ * 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;
- } else if (res < av.getAlignment().getWidth() && res < lastres)
- {
+ av.alignment.getWidth();
+ seqCanvas.repaint();
+ }
- // dragging to the left
- for (int j = res; j < lastres; j++) {
- deleteChar(j,res,startseq);
- startres = res;
- }
- drawChars(startseq,startseq+1,res);
- }
- }
+ /**
+ * DOCUMENT ME!
+ *
+ * @param i DOCUMENT ME!
+ */
+ void editOccurred(int i)
+ {
+ if (endEdit == startEdit)
+ {
+ ap.alignFrame.historyList.pop();
+ ap.alignFrame.updateEditMenuBar();
}
- lastres = res;
+
+ av.firePropertyChange("alignment", null,av.getAlignment().getSequences());
+
}
- repaint();
- return;
- }
+ /**
+ * DOCUMENT ME!
+ *
+ * @param evt DOCUMENT ME!
+ */
+ public void doMousePressedDefineMode(MouseEvent evt)
+ {
+ int res = findRes(evt);
+ int seq = findSeq(evt);
+ oldSeq = seq;
- public void drawChars(int seqstart, int seqend, int start) {
- seqCanvas.drawPanel(seqCanvas.gg, start,av.getEndRes(),seqstart,seqend,av.getStartRes(),av.getStartSeq(),0);
- repaint();
- }
+ startWrapBlock=wrappedBlock;
- public void insertChar(int j, int seq)
- {
- av.getAlignment().getSequenceAt(seq).insertCharAt(j, av.getGapCharacter().charAt(0));
- updateConservation(seq);
- }
+ 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;
+ }
- public void deleteChar(int j, int res, int sno)
- {
+ if(seq<0 || res<0)
+ return;
- if (av.getAlignment().getSequenceAt(sno).getSequence().substring(j,j+1).equals(".") ||
- av.getAlignment().getSequenceAt(sno).getSequence().substring(j,j+1).equals("-") ||
- av.getAlignment().getSequenceAt(sno).getSequence().substring(j,j+1).equals(" ") )
- {
- av.getAlignment().getSequenceAt(sno).deleteCharAt(j);
+
+ SequenceI sequence = (Sequence) av.getAlignment().getSequenceAt(seq);
+
+ if ((sequence == null) || (res > sequence.getLength()))
+ {
+ return;
+ }
+
+ stretchGroup = av.getSelectionGroup();
+
+ if (stretchGroup == null)
+ {
+ stretchGroup = av.alignment.findGroup(sequence);
+
+ 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;
+
+ SequenceGroup[] allGroups = av.alignment.findAllGroups(sequence);
+
+ 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);
+
+ break;
+ }
+ }
+ }
+ }
+
+ 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
+ }
+
+ 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;
+ }
+
+ stretchGroup.getWidth();
+
+ seqCanvas.repaint();
}
- updateConservation(sno);
- av.getAlignment().getWidth();
- repaint();
- }
-
-
- 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;
- // sg.cs = new ConservationColourScheme(sg);
- }
-
- public void setColourScheme(ColourSchemeI cs, boolean showConservation)
- {
- if (av.getSelection().size() == 0)
- {
- seqCanvas.cs = cs;
- for (int i = 0; i < av.alignment.getGroups().size();i++)
- {
- SequenceGroup sg = (SequenceGroup)av.alignment.getGroups().elementAt(i);
- sg.cs = cs;
- if(!showConservation
- && !(sg.cs instanceof Blosum62ColourScheme)
- && sg.cs instanceof ConservationColourScheme)
- {
- // remove ConservationColouring from existing Conservation group
- ConservationColourScheme ccs = (ConservationColourScheme)sg.cs;
- sg.cs = ccs.cs;
- }
- else if(showConservation && !(sg.cs instanceof ConservationColourScheme))
- {
- // add ConservationColouring to new group
- Conservation c = sg.getConservation();
- Alignment al = (Alignment) av.getAlignment();
- c = new Conservation("All", al.cons,
- ResidueProperties.propHash, 3, sg.sequences, 0,
- al.getWidth() );
- c.calculate();
- c.verdict(false, 100);
- sg.setConservation(c);
- sg.cs = new ConservationColourScheme(sg);
- }
+ /**
+ * DOCUMENT ME!
+ *
+ * @param evt DOCUMENT ME!
+ */
+ public void doMouseReleasedDefineMode(MouseEvent evt)
+ {
+ 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);
}
- else
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param evt DOCUMENT ME!
+ */
+ public void doMouseDraggedDefineMode(MouseEvent evt)
{
- SequenceGroup sg = av.alignment.addGroup();
- sg.cs = cs;
+ int res = findRes(evt);
+ int y = findSeq(evt);
- for (int i=0; i < av.getSelection().size(); i++)
- {
- av.alignment.removeFromGroup(av.alignment.findGroup((Sequence)av.sel.sequenceAt(i)),
- (Sequence)av.sel.sequenceAt(i));
- av.alignment.addToGroup(sg,(Sequence)av.sel.sequenceAt(i));
- }
+ if(wrappedBlock!=startWrapBlock)
+ return;
- // Selection is made, we only want to change the conservationColour for selected group
- if( showConservation
- && !(sg.cs instanceof ConservationColourScheme)
- && !(sg.cs instanceof Blosum62ColourScheme))
+ if (stretchGroup == null)
{
- Conservation c = sg.getConservation();
- Alignment al = (Alignment) av.getAlignment();
-
- c = new Conservation("All", al.cons,
- ResidueProperties.propHash, 3, sg.sequences, 0,
- al.getWidth() );
- c.calculate();
- c.verdict(false, 100);
- sg.setConservation(c);
- sg.cs = new ConservationColourScheme(sg);
+ return;
+ }
+
+ 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 (res < av.getStartRes())
+ {
+ res = av.getStartRes();
+ }
+ else if (res > av.getEndRes() && !av.getWrapAlignment())
+ {
+ res = av.getEndRes();
+ }
+
+ 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 (y > oldSeq)
+ {
+ dragDirection = 1;
+ }
+ else if (y < oldSeq)
+ {
+ dragDirection = -1;
+ }
+
+ 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( !showConservation && sg.cs instanceof ConservationColourScheme)
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param e DOCUMENT ME!
+ */
+ public void doMouseEnteredDefineMode(MouseEvent e)
{
- ConservationColourScheme ccs = (ConservationColourScheme)sg.cs;
- sg.cs = ccs.cs;
+ if (scrollThread != null)
+ {
+ scrollThread.running = false;
+ }
}
+ /**
+ * DOCUMENT ME!
+ *
+ * @param e DOCUMENT ME!
+ */
+ public void doMouseExitedDefineMode(MouseEvent e)
+ {
+ if (av.getWrapAlignment())
+ {
+ return;
+ }
+
+ if (mouseDragging)
+ {
+ scrollThread = new ScrollThread();
+ }
+ }
+ // this class allows scrolling off the bottom of the visible alignment
+ class ScrollThread extends Thread
+ {
+ MouseEvent evt;
+ boolean running = false;
- }
- seqCanvas.paintFlag = true;
- repaint();
- }
-
-
- public ColourSchemeI getColourScheme()
- {
- if(av.getSelection().size()>0)
- return av.alignment.findGroup((Sequence)av.sel.sequenceAt(0)).cs;
- else
- return seqCanvas.cs;
- }
-}
+ public ScrollThread()
+ {
+ start();
+ }
+ 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)
+ {
+ }
+ }
+ }
+ }
+}