X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FSeqPanel.java;h=2fe27b381bf84bffe35aac5fb94700b32ef764fa;hb=2959d102cb701ba58489e7222cd101d0eb02ead6;hp=f4d77c3345e955d91b8d2defe54aec9c19296d16;hpb=588042b69abf8e60bcc950b24c283933c7dd422f;p=jalview.git
diff --git a/src/jalview/gui/SeqPanel.java b/src/jalview/gui/SeqPanel.java
index f4d77c3..2fe27b3 100755
--- a/src/jalview/gui/SeqPanel.java
+++ b/src/jalview/gui/SeqPanel.java
@@ -18,814 +18,1110 @@
*/
package jalview.gui;
-import java.util.*;
+import jalview.datamodel.*;
+
+import jalview.schemes.*;
import java.awt.*;
import java.awt.event.*;
+
import javax.swing.*;
-import jalview.analysis.*;
-import jalview.datamodel.*;
-import jalview.schemes.*;
-public class SeqPanel
- extends JPanel
+/**
+ * DOCUMENT ME!
+ *
+ * @author $author$
+ * @version $Revision$
+ */
+public class SeqPanel extends JPanel implements MouseListener,
+ MouseMotionListener, MouseWheelListener
+
{
- public SeqCanvas seqCanvas;
- 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;
-
- public SeqPanel(AlignViewport avp, AlignmentPanel p)
- {
- this.av = avp;
-
- seqCanvas = new SeqCanvas(avp);
- setLayout(new BorderLayout());
- add(seqCanvas, BorderLayout.CENTER);
-
- ap = p;
-
- addMouseMotionListener(new MouseMotionAdapter()
+ /** 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
+ 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)
{
- public void mouseMoved(MouseEvent evt)
- {
- if (av.getWrapAlignment())
- {
- return;
- }
+ ToolTipManager.sharedInstance().registerComponent(this);
+ ToolTipManager.sharedInstance().setInitialDelay(0);
+ ToolTipManager.sharedInstance().setDismissDelay(10000);
+ this.av = avp;
+ setBackground(Color.white);
- doMouseMoved(evt);
- }
+ seqCanvas = new SeqCanvas(avp);
+ setLayout(new BorderLayout());
+ add(seqCanvas, BorderLayout.CENTER);
- public void mouseDragged(MouseEvent evt)
- {
- if (av.getWrapAlignment())
- {
- return;
- }
+ ap = p;
- if (editingSeqs)
+ if(!av.isDataset())
{
- doMouseDragged(evt);
+ addMouseMotionListener(this);
+ addMouseListener(this);
+ addMouseWheelListener(this);
}
- else
- {
- doMouseDraggedDefineMode(evt);
- }
- }
- });
+ }
- addMouseListener(new MouseAdapter()
- {
- public void mouseReleased(MouseEvent evt)
- {
- if (av.getWrapAlignment())
- {
- return;
- }
+ int startWrapBlock=-1;
+ int wrappedBlock=-1;
+ int findRes(MouseEvent evt)
+ {
+ int res = 0;
+ int x = evt.getX();
- if (editingSeqs)
- {
- doMouseReleased(evt);
- }
- else
- {
- doMouseReleasedDefineMode(evt);
- }
- }
+ if (av.wrapAlignment)
+ {
- public void mousePressed(MouseEvent evt)
- {
- if (av.getWrapAlignment())
- {
- return;
- }
+ int hgap = av.charHeight;
+ if (av.scaleAboveWrapped)
+ hgap += av.charHeight;
- if (evt.isShiftDown() || evt.isAltDown() ||
- evt.isControlDown())
- {
- if (evt.isAltDown() || evt.isControlDown())
- {
- groupEditing = true;
- }
+ int cHeight = av.getAlignment().getHeight() * av.charHeight
+ + hgap + seqCanvas.getAnnotationHeight();
- editingSeqs = true;
- doMousePressed(evt);
- }
- else
- {
- doMousePressedDefineMode(evt);
- }
- }
+ int y = evt.getY();
+ y -= hgap;
+ x -= seqCanvas.LABEL_WEST;
- public void mouseExited(MouseEvent evt)
- {
- if (av.getWrapAlignment() || editingSeqs)
- {
- return;
- }
- doMouseExitedDefineMode(evt);
- }
+ int cwidth = seqCanvas.getWrappedCanvasWidth(this.getWidth());
- public void mouseEntered(MouseEvent evt)
- {
- if (av.getWrapAlignment() || editingSeqs)
- {
- return;
- }
+ wrappedBlock = y / cHeight;
+ wrappedBlock += av.getStartRes() / cwidth;
- doMouseEnteredDefineMode(evt);
- }
- });
- repaint();
- }
+ res = wrappedBlock * cwidth + x / av.getCharWidth();
- public void doMouseReleased(MouseEvent evt)
- {
- if (seqEditOccurred > -1)
+ }
+ else
{
- editOccurred(seqEditOccurred);
+ res = (x / av.getCharWidth()) + av.getStartRes();
}
- startseq = -1;
- lastres = -1;
- seqEditOccurred = -1;
- editingSeqs = false;
- groupEditing = false;
+ if(av.hasHiddenColumns)
+ res = av.getColumnSelection().adjustForHiddenColumns(res);
- ap.repaint();
- }
+ return res;
- public void doMousePressed(MouseEvent evt)
- {
- ap.alignFrame.addHistoryItem(new HistoryItem("Edit Sequence",
- av.alignment, HistoryItem.EDIT));
+ }
- int seq;
- int res;
+ int findSeq(MouseEvent evt)
+ {
- int x = evt.getX();
- int y = evt.getY();
+ int seq = 0;
+ int y = evt.getY();
- res = (x / av.getCharWidth()) + av.getStartRes();
- seq = (y / av.getCharHeight()) + av.getStartSeq();
+ if (av.wrapAlignment)
+ {
+ int hgap = av.charHeight;
+ if (av.scaleAboveWrapped)
+ hgap += av.charHeight;
- if ( (seq < av.getAlignment().getHeight()) &&
- (res < av.getAlignment().getSequenceAt(seq).getLength()))
- {
- startseq = seq;
- lastres = res;
- }
- else
- {
- startseq = -1;
- lastres = -1;
- }
+ int cHeight = av.getAlignment().getHeight() * av.charHeight
+ + hgap + seqCanvas.getAnnotationHeight();
- startEdit = lastres;
- endEdit = lastres;
-
- return;
- }
-
- public void doMouseMoved(MouseEvent evt)
- {
- int res = 0;
- int seq = 0;
- int x = evt.getX();
- int y = evt.getY();
-
- if (av.wrapAlignment)
- {
- y -= (2 * av.charHeight);
+ y -= hgap;
- int chunkHeight = (av.getAlignment().getHeight() + 2) * av.charHeight;
+ seq = ( (y % cHeight) / av.getCharHeight());
+ }
+ else
+ {
+ seq = (y / av.getCharHeight()) + av.getStartSeq();
+ }
- res = (int) ( (y / chunkHeight) * (getWidth() / av.charWidth)) +
- (x / av.getCharWidth()) + av.getStartRes();
+ return seq;
+ }
- y %= chunkHeight;
- seq = (y / av.getCharHeight()) + av.getStartSeq();
- }
- else
- {
- res = (x / av.getCharWidth()) + av.getStartRes();
- seq = (y / av.getCharHeight()) + av.getStartSeq();
+ void endEditing()
+ {
+ startseq = -1;
+ lastres = -1;
+ seqEditOccurred = false;
+ editingSeqs = false;
+ groupEditing = false;
}
- if (seq >= av.getAlignment().getHeight())
+ /**
+ * DOCUMENT ME!
+ *
+ * @param evt DOCUMENT ME!
+ */
+ public void mouseReleased(MouseEvent evt)
{
- return;
- }
-
- SequenceI sequence = av.getAlignment().getSequenceAt(seq);
+ mouseDragging = false;
- if (res > sequence.getLength())
- {
- return;
- }
+ if (!editingSeqs)
+ {
+ doMouseReleasedDefineMode(evt);
+ return;
+ }
- Object obj = ResidueProperties.aa2Triplet.get(sequence.getCharAt(res) +
- "");
- String aa = "";
+ if (seqEditOccurred)
+ {
+ editOccurred();
+ }
- if (obj != null)
- {
- aa = obj.toString();
+ endEditing();
+ ap.repaint();
}
- StringBuffer text = new StringBuffer("Sequence " + (seq + 1) + " ID: " +
- sequence.getName());
- if (aa != "")
- {
- text.append(" Residue: " + aa + " (" +
- 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)
+ /**
+ * DOCUMENT ME!
+ *
+ * @param evt DOCUMENT ME!
+ */
+ public void mousePressed(MouseEvent evt)
{
- Vector features = sequence.getSequenceFeatures();
- Enumeration e = features.elements();
- StringBuffer sbuffer = new StringBuffer();
-
- while (e.hasMoreElements())
+ if (javax.swing.SwingUtilities.isMiddleMouseButton(evt))
{
- SequenceFeature sf = (SequenceFeature) e.nextElement();
+ mouseWheelPressed = true;
+ return;
+ }
- if ( (sf.getStart() <= sequence.findPosition(res)) &&
- (sf.getEnd() >= sequence.findPosition(res)))
+ if (evt.isShiftDown() || evt.isAltDown() ||
+ evt.isControlDown())
+ {
+ if (evt.isAltDown() || evt.isControlDown())
{
- if (sbuffer.length() > 0)
- {
- sbuffer.append("; ");
- }
-
- sbuffer.append(sf.getType() + " " + sf.getDescription());
-
- if (sf.getStatus().length() > 0)
- {
- sbuffer.append(" (" + sf.getStatus() + ")");
- }
+ groupEditing = true;
}
+ editingSeqs = true;
+ }
+ else
+ {
+ doMousePressedDefineMode(evt);
+ return;
}
- ToolTipManager.sharedInstance().registerComponent(this);
- this.setToolTipText(sbuffer.toString());
- }
- }
- public void doMouseDragged(MouseEvent evt)
- {
- // If we're dragging we're editing
- int res = (evt.getX() / av.getCharWidth()) + av.getStartRes();
+ ap.alignFrame.addHistoryItem(new HistoryItem("Edit Sequence",
+ av.alignment, HistoryItem.EDIT));
- if (res < 0)
- {
- res = 0;
- }
+ int seq = findSeq(evt);
+ int res = findRes(evt);
- if ( (lastres == -1) || (lastres == res))
- {
- return;
- }
+ if(seq<0 || res<0)
+ return;
- boolean dragRight = true;
+ 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))
- {
- dragRight = false;
+ startEdit = lastres;
+ endEdit = lastres;
+
+ return;
}
- if (res != lastres)
+ /**
+ * DOCUMENT ME!
+ *
+ * @param evt DOCUMENT ME!
+ */
+ public void mouseMoved(MouseEvent evt)
{
- // Group editing
- if (groupEditing)
+ if (editingSeqs)
{
- SequenceGroup sg = av.getSelectionGroup();
+ // This is because MacOSX creates a mouseMoved
+ // If control is down, other platforms will not.
+ mouseDragged(evt);
+ }
- if (sg == null)
- {
- lastres = -1;
+ int res = findRes(evt);
+ int seq = findSeq(evt);
+
+ if(res<0 || seq<0 || seq >= av.getAlignment().getHeight())
+ return;
+
+ SequenceI sequence = av.getAlignment().getSequenceAt(seq);
+
+ if (res > sequence.getLength())
+ {
+ return;
+ }
+
+ if(seqCanvas.pdbCanvas!=null && sequence==seqCanvas.pdbCanvas.sequence)
+ {
+ seqCanvas.pdbCanvas.highlightRes(sequence.findPosition(res));
+ }
- return;
- }
- // drag to right
- if (dragRight)
+ StringBuffer text = new StringBuffer("Sequence " + (seq + 1) + " ID: " +
+ sequence.getName());
+
+ Object obj = null;
+ if (av.alignment.isNucleotide())
{
- sg.setEndRes(sg.getEndRes() + (res - lastres));
+ obj = ResidueProperties.nucleotideName.get(sequence.getCharAt(res) +
+ "");
+ if(obj!=null)
+ text.append(" Nucleotide: ");
}
- // drag to left
else
{
- /// Are we able to delete?
- // ie are all columns blank?
- boolean deleteAllowed = false;
+ obj = ResidueProperties.aa2Triplet.get(sequence.getCharAt(res) + "");
+ if(obj!=null)
+ text.append(" Residue: ");
+ }
+
+ if (obj != null)
+ {
- for (int s = 0; s < sg.getSize(); s++)
+ if (obj != "")
{
- SequenceI seq = sg.getSequenceAt(s);
+ text.append( obj + " (" +
+ av.getAlignment().getSequenceAt(seq).findPosition(res) + ")");
+ }
+ }
- for (int j = res; j < lastres; j++)
+ ap.alignFrame.statusBar.setText(text.toString());
+
+ // use aa to see if the mouse pointer is on a
+ if (av.showSequenceFeatures)
+ {
+ SequenceFeature [] features = sequence.getDatasetSequence().getSequenceFeatures();
+ if(features!=null)
{
- if (seq.getSequence().length() <= j)
- {
- continue;
- }
+ StringBuffer sbuffer = new StringBuffer("");
- if (!jalview.util.Comparison.isGap(
- seq.getSequence().charAt(j)))
+ for (int i = 0; i < features.length; i++)
{
- // Not a gap, block edit not valid
- res = j + 1;
- deleteAllowed = false;
- continue;
+ if ( (features[i].getBegin() <= sequence.findPosition(res)) &&
+ (features[i].getEnd() >= sequence.findPosition(res)))
+ {
+ if(!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() + ")");
+ }
+ }
+ }
+
}
- deleteAllowed = true;
+ sbuffer.append("");
+ if(sbuffer.length()==13) //
+ setToolTipText("");
+ else
+ setToolTipText(sbuffer.toString());
}
- }
+ else
+ setToolTipText("");
+ }
+ }
- if (!deleteAllowed)
- {
- lastres = -1;
+ /**
+ * DOCUMENT ME!
+ *
+ * @param evt DOCUMENT ME!
+ */
+ public void mouseDragged(MouseEvent evt)
+ {
+ if (!editingSeqs)
+ {
+ doMouseDraggedDefineMode(evt);
+ return;
+ }
- return;
- }
+ int res = findRes(evt);
- sg.setEndRes(sg.getEndRes() - (lastres - res));
+ if (res < 0)
+ {
+ res = 0;
}
- for (int i = 0; i < sg.getSize(); i++)
+ if ((lastres == -1) || (lastres == res))
{
- SequenceI s = sg.getSequenceAt(i);
- int k = av.alignment.findIndex(s);
+ return;
+ }
- // drag to right
- if (dragRight)
- {
- for (int j = lastres; j < res; j++)
- {
- insertChar(j, k);
- }
- }
- // drag to left
- else
+ boolean dragRight = true;
+
+ if ((res < av.getAlignment().getWidth()) && (res < lastres))
+ {
+ dragRight = false;
+ }
+ else if(av.hasHiddenColumns)
+ {
+ //Stop editing if the user has dragged beyond hiddenBoundary
+ int lastCol = av.getColumnSelection().getHiddenRegionBoundary(lastres);
+ if( lastCol < res)
{
- for (int j = res; j < lastres; j++)
+ if(lastres!=lastCol)
{
- if (s.getLength() > j)
- {
- deleteChar(res, k);
- }
+ endEditing();
+ return;
}
}
}
- }
- else /////Editing a single sequence///////////
- {
- if ( (res < av.getAlignment().getWidth()) && (res > lastres))
+
+ if(!groupEditing && av.hasHiddenRows)
{
- // dragging to the right
- for (int j = lastres; j < res; j++)
+ if(av.alignment.getSequenceAt(startseq).getHiddenSequences()!=null)
{
- insertChar(j, startseq);
+ groupEditing = true;
}
}
- else if ( (res < av.getAlignment().getWidth()) &&
- (res < lastres))
+
+
+ if (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)))
+ SequenceI seq;
+ // Group editing
+ if (groupEditing)
{
- deleteChar(res, startseq);
+ SequenceGroup sg = av.getSelectionGroup();
+
+ 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);
+ }
+
+ SequenceGroup tmp = new SequenceGroup();
+
+ //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 1)
+ {
+ res = lastres+1;
+ }
+
+
+ int lastCol = av.getColumnSelection().
+ getHiddenRegionBoundary(res);
+
+ if(lastCol!=res)
+ {
+ for (blankColumn = lastCol;
+ blankColumn > lastres;
+ blankColumn--)
+ {
+ boolean blank = true;
+ for (int s = 0; s < sg.getSize(); s++)
+ {
+ seq = sg.getSequenceAt(s);
+
+ if (seq.getSequence().length() <= blankColumn)
+ {
+ continue;
+ }
+
+ if (!jalview.util.Comparison.isGap(
+ seq.getSequence().charAt(blankColumn)))
+ {
+ blank = false;
+ continue;
+ }
+ }
+ if (blank)
+ break;
+ }
+
+
+ if (blankColumn <= lastres)
+ {
+ endEditing();
+ return;
+ }
+ }
+ else
+ blankColumn = -1;
+
+ }
+
+ sg.setEndRes(sg.getEndRes() + (res - lastres));
+ }
+
+ // drag to left
+ else
+ {
+ /// Are we able to delete?
+ // ie are all columns blank?
+
+ for (int s = 0; s < sg.getSize(); s++)
+ {
+ 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
+ endEditing();
+ return;
+ }
+ }
+ }
+
+ if(res res)
+ {
+ deleteChar(res, seq);
+ }
+ }
+ }
+ }
}
- else
+ else /////Editing a single sequence///////////
{
- break;
+ seq = av.alignment.getSequenceAt(startseq);
+ if ((res < av.getAlignment().getWidth()) && (res > lastres))
+ {
+ // dragging to the right
+ for (int j = lastres; j < res; j++)
+ {
+ insertChar(j, seq, j);
+ }
+ }
+ 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, seq);
+ }
+ else
+ {
+ break;
+ }
+ }
+ }
}
- }
}
- }
- }
-
- endEdit = res;
- lastres = res;
- repaint();
- }
-
- public void drawChars(int seqstart, int seqend, int start)
- {
- seqCanvas.drawPanel(seqCanvas.gg, start, av.getEndRes(), seqstart,
- seqend, av.getStartRes(), av.getStartSeq(), 0);
- repaint();
- }
-
- public void insertChar(int j, int seq)
- {
- av.alignment.getSequenceAt(seq).insertCharAt(j, av.getGapCharacter());
- seqEditOccurred = seq;
- }
-
- public void deleteChar(int j, int seq)
- {
- av.alignment.getSequenceAt(seq).deleteCharAt(j);
- seqEditOccurred = seq;
-
- av.alignment.getWidth();
- repaint();
- }
-
- void editOccurred(int i)
- {
- if (endEdit == startEdit)
- {
- ap.alignFrame.historyList.pop();
- ap.alignFrame.updateEditMenuBar();
- }
- av.updateConservation();
- av.updateConsensus();
+ mouseDragging = true;
+ if(scrollThread!=null)
+ scrollThread.setEvent(evt);
- // Y O Y CLUSTALX
- ColourSchemeI cs = av.getGlobalColourScheme();
+ endEdit = res;
+ lastres = res;
+ seqCanvas.repaint();
+ }
- if (cs instanceof ConservationColourScheme)
+ /**
+ * DOCUMENT ME!
+ *
+ * @param e DOCUMENT ME!
+ */
+ public void mouseEntered(MouseEvent e)
{
- ConservationColourScheme ccs = (ConservationColourScheme) cs;
+ if(oldSeq < 0)
+ oldSeq = 0;
- if (ccs.cs instanceof ClustalxColourScheme)
- {
- Conservation c = new Conservation("All",
- ResidueProperties.propHash, 3,
- av.alignment.getSequences(), 0,
- av.alignment.getWidth() - 1);
- c.calculate();
- c.verdict(false, av.ConsPercGaps);
-
- ClustalxColourScheme cxs = (ClustalxColourScheme) ccs.cs;
- cxs.resetClustalX(av.alignment.getSequences(),
- av.alignment.getWidth());
- ccs = new ConservationColourScheme(c, cxs);
- av.setGlobalColourScheme(ccs);
- }
+ if (scrollThread != null)
+ {
+ scrollThread.running = false;
+ scrollThread = null;
+ }
}
- if (cs instanceof ClustalxColourScheme)
+ /**
+ * DOCUMENT ME!
+ *
+ * @param e DOCUMENT ME!
+ */
+ public void mouseExited(MouseEvent e)
{
- ( (ClustalxColourScheme) cs).resetClustalX(av.alignment.getSequences(),
- av.alignment.getWidth());
- av.setGlobalColourScheme(cs);
- }
- }
-
- public void doMousePressedDefineMode(MouseEvent evt)
- {
- int res = (evt.getX() / av.getCharWidth()) + av.getStartRes();
- int seq = (evt.getY() / av.getCharHeight()) + av.getStartSeq();
- oldSeq = seq;
-
- SequenceI sequence = (Sequence) av.getAlignment().getSequenceAt(seq);
+ if (av.getWrapAlignment())
+ {
+ return;
+ }
- if ( (sequence == null) || (res > sequence.getLength()))
- {
- return;
+ if (mouseDragging)
+ {
+ scrollThread = new ScrollThread();
+ }
}
- stretchGroup = av.getSelectionGroup();
+ public void mouseClicked(MouseEvent evt)
+ {}
- if (stretchGroup == null)
+ public void mouseWheelMoved(MouseWheelEvent e)
{
- stretchGroup = av.alignment.findGroup(sequence);
-
- if ( (stretchGroup != null) && (res > stretchGroup.getStartRes()) &&
- (res < stretchGroup.getEndRes()))
+ if (mouseWheelPressed)
{
- av.setSelectionGroup(stretchGroup);
+ 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
{
- stretchGroup = null;
+ if (e.getWheelRotation() > 0)
+ ap.scrollUp(false);
+ else
+ ap.scrollUp(true);
}
+
}
- 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++)
+ /**
+ * DOCUMENT ME!
+ *
+ * @param j DOCUMENT ME!
+ * @param seq DOCUMENT ME!
+ */
+ void insertChar(int j, SequenceI seq, int blankColumn)
+ {
+ if(av.hasHiddenColumns)
{
- if ( (allGroups[i].getStartRes() <= res) &&
- (allGroups[i].getEndRes() >= res))
+ //Find the next gap before the end of the visible region boundary
+ int lastCol = av.getColumnSelection().getHiddenRegionBoundary(j);
+ if(lastCol != j)
{
- stretchGroup = allGroups[i];
- av.setSelectionGroup(stretchGroup);
+ if (!groupEditing || lastCol <= j)
+ {
+ blankColumn = lastCol;
+ //If lastCol > j, theres a boundary after the gap insertion
+ if (lastCol > j)
+ {
+ for (blankColumn = lastCol; blankColumn > j; blankColumn--)
+ {
+ if (jalview.util.Comparison.isGap(seq.getCharAt(blankColumn)))
+ {
+ //Theres a space, so break and insert the gap
+ break;
+ }
+ }
+
+ if (blankColumn <= j)
+ {
+ endEditing();
+ return;
+ }
+ }
+
+ }
- break;
+ // Editing with hidden regions only!!
+ seq.deleteCharAt(blankColumn);
}
- }
}
+
+ seq.insertCharAt(j, av.getGapCharacter());
+ seqEditOccurred = true;
}
- if (stretchGroup == null)
+ /**
+ * DOCUMENT ME!
+ *
+ * @param j DOCUMENT ME!
+ * @param seq DOCUMENT ME!
+ */
+ public void deleteChar(int j, SequenceI seq)
{
- // define a new group here
- SequenceGroup sg = new SequenceGroup();
- sg.setStartRes(res);
- sg.setEndRes(res);
- sg.addSequence(sequence);
- av.setSelectionGroup(sg);
- stretchGroup = sg;
-
- if (av.getConservationSelected())
+ if (av.hasHiddenColumns)
{
- SliderPanel.setConservationSlider(ap,
- av.getGlobalColourScheme(),
- "Background");
- }
+ //Find the next gap before the end of the visible region boundary
+ int lastCol = av.getColumnSelection().getHiddenRegionBoundary(j);
- if (av.getAbovePIDThreshold())
- {
- SliderPanel.setPIDSliderSource(ap, av.getGlobalColourScheme(),
- "Background");
+ //If lastCol > j, theres a boundary after the gap insertion
+ if (lastCol > j)
+ {
+ seq.insertCharAt(lastCol, av.getGapCharacter());
+ }
}
- }
- 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
+ seq.deleteCharAt(j);
+ seqEditOccurred = true;
+
+ seqCanvas.repaint();
}
- if ( (stretchGroup != null) && (stretchGroup.getEndRes() == res))
+ /**
+ * DOCUMENT ME!
+ *
+ * @param i DOCUMENT ME!
+ */
+ void editOccurred()
{
- // Edit end res position of selected group
- changeEndRes = true;
+ if (endEdit == startEdit)
+ {
+ ap.alignFrame.historyList.pop();
+ ap.alignFrame.updateEditMenuBar();
+ }
+
+ av.firePropertyChange("alignment", null,av.getAlignment().getSequences());
+
}
- else if ( (stretchGroup != null) && (stretchGroup.getStartRes() == res))
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param evt DOCUMENT ME!
+ */
+ public void doMousePressedDefineMode(MouseEvent evt)
{
- // Edit end res position of selected group
- changeStartRes = true;
- }
+ int res = findRes(evt);
+ int seq = findSeq(evt);
+ oldSeq = seq;
- stretchGroup.getWidth();
+ startWrapBlock=wrappedBlock;
- repaint();
- }
+ 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 doMouseReleasedDefineMode(MouseEvent evt)
- {
- mouseDragging = false;
+ if(seq<0 || res<0)
+ return;
- if (stretchGroup == null)
- {
- return;
- }
- if (stretchGroup.cs instanceof ClustalxColourScheme)
- {
- stretchGroup.cs = new ClustalxColourScheme(stretchGroup.sequences,
- av.alignment.getWidth());
- repaint();
- }
- else if (stretchGroup.cs instanceof ConservationColourScheme)
- {
- ConservationColourScheme ccs = (ConservationColourScheme) stretchGroup.cs;
- stretchGroup.cs = ccs;
- SliderPanel.setConservationSlider(ap, stretchGroup.cs,
- stretchGroup.getName());
+ SequenceI sequence = (Sequence) av.getAlignment().getSequenceAt(seq);
- repaint();
- }
- else
- {
- SliderPanel.setPIDSliderSource(ap, stretchGroup.cs,
- stretchGroup.getName());
- }
+ if ((sequence == null) || (res > sequence.getLength()))
+ {
+ return;
+ }
- changeEndRes = false;
- changeStartRes = false;
- stretchGroup = null;
- ap.idPanel.repaint();
- }
+ stretchGroup = av.getSelectionGroup();
- public void doMouseDraggedDefineMode(MouseEvent evt)
- {
- int res = (evt.getX() / av.getCharWidth()) + av.getStartRes();
- int y = (evt.getY() / av.getCharHeight()) + av.getStartSeq();
+ if (stretchGroup == null)
+ {
+ stretchGroup = av.alignment.findGroup(sequence);
- if (stretchGroup == null)
- {
- return;
- }
+ 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;
- if (res > av.alignment.getWidth())
- {
- res = av.alignment.getWidth() - 1;
- }
+ SequenceGroup[] allGroups = av.alignment.findAllGroups(sequence);
- 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 (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 (res < av.getStartRes())
- {
- res = av.getStartRes();
- }
- else if (res > av.getEndRes())
- {
- res = av.getEndRes();
- }
+ 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 (changeEndRes)
- {
- if (res > (stretchGroup.getStartRes() - 1))
- {
- stretchGroup.setEndRes(res);
- }
- }
- else if (changeStartRes)
- {
- if (res < (stretchGroup.getEndRes() + 1))
- {
- stretchGroup.setStartRes(res);
- }
- }
+ 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());
- int dragDirection = 0;
+ // edit the properties of existing group
+ }
- if (y > oldSeq)
- {
- dragDirection = 1;
+ 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();
}
- else if (y < oldSeq)
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param evt DOCUMENT ME!
+ */
+ public void doMouseReleasedDefineMode(MouseEvent evt)
{
- dragDirection = -1;
+ 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());
+ stretchGroup.recalcConservation();
+ }
+ else
+ {
+ SliderPanel.setPIDSliderSource(ap, stretchGroup.cs,
+ stretchGroup.getName());
+ }
+ }
+ changeEndRes = false;
+ changeStartRes = false;
+ stretchGroup = null;
+ PaintRefresher.Refresh(av.alignment);
}
- while ( (y != oldSeq) && (oldSeq > 0) && (y < av.alignment.getHeight()))
+ /**
+ * DOCUMENT ME!
+ *
+ * @param evt DOCUMENT ME!
+ */
+ public void doMouseDraggedDefineMode(MouseEvent evt)
{
- // This routine ensures we don't skip any sequences, as the
- // selection is quite slow.
- Sequence seq = (Sequence) av.getAlignment().getSequenceAt(oldSeq);
+ int res = findRes(evt);
+ int y = findSeq(evt);
- oldSeq += dragDirection;
+ if(wrappedBlock!=startWrapBlock)
+ return;
- Sequence nextSeq = (Sequence) av.getAlignment().getSequenceAt(oldSeq);
+ if (stretchGroup == null)
+ {
+ return;
+ }
- if (stretchGroup.sequences.contains(nextSeq))
- {
- stretchGroup.deleteSequence(seq);
- stretchGroup.deleteSequence(nextSeq);
- }
- else
- {
- if (seq != null)
+
+ if(y > av.alignment.getHeight())
{
- stretchGroup.addSequence(seq);
+ y = av.alignment.getHeight() -1;
}
- stretchGroup.addSequence(nextSeq);
- }
- }
+ 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;
+ }
- oldSeq = y;
- mouseDragging = true;
+ if (res < av.getStartRes())
+ {
+ res = av.getStartRes();
+ }
- if (scrollThread != null)
- {
- scrollThread.setEvent(evt);
- }
+ if (changeEndRes)
+ {
+ if (res > (stretchGroup.getStartRes() - 1))
+ {
+ stretchGroup.setEndRes(res);
+ }
+ }
+ else if (changeStartRes)
+ {
+ if (res < (stretchGroup.getEndRes() + 1))
+ {
+ stretchGroup.setStartRes(res);
+ }
+ }
- repaint();
- }
+ int dragDirection = 0;
- public void doMouseEnteredDefineMode(MouseEvent e)
- {
- if (scrollThread != null)
- {
- scrollThread.running = false;
- }
- }
+ if (y > oldSeq)
+ {
+ dragDirection = 1;
+ }
+ else if (y < oldSeq)
+ {
+ dragDirection = -1;
+ }
- public void doMouseExitedDefineMode(MouseEvent e)
- {
- if (av.getWrapAlignment())
- {
- return;
- }
- if (mouseDragging)
- {
- scrollThread = new ScrollThread();
- }
- }
+ while ((y != oldSeq) && (oldSeq > -1) && (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);
- // this class allows scrolling off the bottom of the visible alignment
- class ScrollThread
- extends Thread
- {
- MouseEvent evt;
- boolean running = false;
+ oldSeq += dragDirection;
- public ScrollThread()
- {
- start();
- }
+ if(oldSeq<0)
+ break;
- public void setEvent(MouseEvent e)
- {
- evt = e;
- }
+ Sequence nextSeq = (Sequence) av.getAlignment().getSequenceAt(oldSeq);
- public void stopScrolling()
- {
- running = false;
+ if (stretchGroup.sequences.contains(nextSeq))
+ {
+ stretchGroup.deleteSequence(seq, false);
+ }
+ else
+ {
+ if (seq != null)
+ {
+ stretchGroup.addSequence(seq, false);
+ }
+
+ stretchGroup.addSequence(nextSeq, false);
+ }
+ }
+
+ if(oldSeq < 0)
+ oldSeq = -1;
+
+ mouseDragging = true;
+
+ if (scrollThread != null)
+ {
+ scrollThread.setEvent(evt);
+ }
+
+ seqCanvas.repaint();
}
- public void run()
+
+
+ // this class allows scrolling off the bottom of the visible alignment
+ class ScrollThread extends Thread
{
- running = true;
+ MouseEvent evt;
+ boolean running = false;
- while (running)
- {
- if (evt != null)
+ public ScrollThread()
{
- 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);
- }
+ start();
+ }
- if (mouseDragging && (evt.getX() < 0))
- {
- running = ap.scrollRight(true);
- }
- else if (mouseDragging && (evt.getX() >= getWidth()))
- {
- running = ap.scrollRight(false);
- }
+ public void setEvent(MouseEvent e)
+ {
+ evt = e;
}
- try
+ public void stopScrolling()
{
- Thread.sleep(75);
+ running = false;
}
- catch (Exception ex)
+
+ 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)
+ {
+ }
+ }
}
- }
}
- }
}