X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FSeqPanel.java;h=930a6a5bfa77b5ee7fd86a1b9256524cff08e54f;hb=02d91bab6246aa621844864b2351bbe1ed3905f6;hp=eedad59a5584ac3091d466f560a8fd8c928c22f0;hpb=15e102bc28463efa98d7d68e3a93f4f09c62248f;p=jalview.git diff --git a/src/jalview/gui/SeqPanel.java b/src/jalview/gui/SeqPanel.java index eedad59..930a6a5 100644 --- a/src/jalview/gui/SeqPanel.java +++ b/src/jalview/gui/SeqPanel.java @@ -73,9 +73,9 @@ import javax.swing.ToolTipManager; * @author $author$ * @version $Revision: 1.130 $ */ -public class SeqPanel extends JPanel implements MouseListener, - MouseMotionListener, MouseWheelListener, SequenceListener, - SelectionListener +public class SeqPanel extends JPanel + implements MouseListener, MouseMotionListener, MouseWheelListener, + SequenceListener, SelectionListener { /** DOCUMENT ME!! */ @@ -216,7 +216,7 @@ public class SeqPanel extends JPanel implements MouseListener, int y = evt.getY(); y = Math.max(0, y - hgap); - x = Math.max(0, x - seqCanvas.labelWidthWest); + x = Math.max(0, x - seqCanvas.getLabelWidthWest()); int cwidth = seqCanvas.getWrappedCanvasWidth(this.getWidth()); if (cwidth < 1) @@ -275,15 +275,14 @@ public class SeqPanel extends JPanel implements MouseListener, y -= hgap; - seq = Math.min((y % cHeight) / av.getCharHeight(), av.getAlignment() - .getHeight() - 1); + seq = Math.min((y % cHeight) / av.getCharHeight(), + av.getAlignment().getHeight() - 1); } else { - seq = Math.min((y / av.getCharHeight()) - + av.getRanges().getStartSeq(), - av - .getAlignment().getHeight() - 1); + seq = Math.min( + (y / av.getCharHeight()) + av.getRanges().getStartSeq(), + av.getAlignment().getHeight() - 1); } return seq; @@ -300,8 +299,8 @@ public class SeqPanel extends JPanel implements MouseListener, if (editCommand != null && editCommand.getSize() > 0) { ap.alignFrame.addHistoryItem(editCommand); - av.firePropertyChange("alignment", null, av.getAlignment() - .getSequences()); + av.firePropertyChange("alignment", null, + av.getAlignment().getSequences()); } } finally { @@ -359,8 +358,7 @@ public class SeqPanel extends JPanel implements MouseListener, HiddenColumns hidden = av.getAlignment().getHiddenColumns(); - if (av.hasHiddenColumns() - && !hidden.isVisible(seqCanvas.cursorX)) + if (av.hasHiddenColumns() && !hidden.isVisible(seqCanvas.cursorX)) { int original = seqCanvas.cursorX - dx; int maxWidth = av.getAlignment().getWidth(); @@ -486,7 +484,7 @@ public class SeqPanel extends JPanel implements MouseListener, av.setSelectionGroup(sg); } - ap.paintAlignment(false); + ap.paintAlignment(false, false); av.sendSelection(); } @@ -840,8 +838,9 @@ public class SeqPanel extends JPanel implements MouseListener, Point p = lastp; if (!event.isShiftDown() || p == null) { - p = (tooltipText != null && tooltipText.length() > 6) ? new Point( - event.getX() + wdth, event.getY() - 20) : null; + p = (tooltipText != null && tooltipText.length() > 6) + ? new Point(event.getX() + wdth, event.getY() - 20) + : null; } /* * TODO: try to modify position region is not obcured by tooltip @@ -853,11 +852,12 @@ public class SeqPanel extends JPanel implements MouseListener, /** * set when the current UI interaction has resulted in a change that requires - * overview shading to be recalculated. this could be changed to something - * more expressive that indicates what actually has changed, so selective - * redraws can be applied + * shading in overviews and structures to be recalculated. this could be + * changed to a something more expressive that indicates what actually has + * changed, so selective redraws can be applied (ie. only structures, only + * overview, etc) */ - private boolean needOverviewUpdate = false; // TODO: refactor to avcontroller + private boolean updateOverviewAndStructs = false; // TODO: refactor to avcontroller /** * set if av.getSelectionGroup() refers to a group that is defined on the @@ -939,9 +939,9 @@ public class SeqPanel extends JPanel implements MouseListener, } else { - residue = "X".equalsIgnoreCase(displayChar) ? "X" : ("*" - .equals(displayChar) ? "STOP" - : ResidueProperties.aa2Triplet.get(displayChar)); + residue = "X".equalsIgnoreCase(displayChar) ? "X" + : ("*".equals(displayChar) ? "STOP" + : ResidueProperties.aa2Triplet.get(displayChar)); } text.append(" ").append(nucleotide ? "Nucleotide" : "Residue") .append(": ").append(residue == null ? displayChar : residue); @@ -998,8 +998,8 @@ public class SeqPanel extends JPanel implements MouseListener, int oldWidth = av.getCharWidth(); // Which is bigger, left-right or up-down? - if (Math.abs(evt.getY() - lastMousePress.getY()) > Math.abs(evt - .getX() - lastMousePress.getX())) + if (Math.abs(evt.getY() - lastMousePress.getY()) > Math + .abs(evt.getX() - lastMousePress.getX())) { /* * on drag up or down, decrement or increment font size @@ -1058,7 +1058,7 @@ public class SeqPanel extends JPanel implements MouseListener, } if (newWidth > 0) { - ap.paintAlignment(false); + ap.paintAlignment(false, false); if (copyChanges) { /* @@ -1112,7 +1112,7 @@ public class SeqPanel extends JPanel implements MouseListener, } mouseDragging = true; - if (scrollThread != null) + if ((scrollThread != null) && (scrollThread.isRunning())) { scrollThread.setEvent(evt); } @@ -1159,8 +1159,9 @@ public class SeqPanel extends JPanel implements MouseListener, } if (editCommand == null) { - editCommand = new EditCommand(MessageManager.formatMessage( - "label.edit_params", new String[] { label })); + editCommand = new EditCommand(MessageManager + .formatMessage("label.edit_params", new String[] + { label })); } } @@ -1177,9 +1178,8 @@ public class SeqPanel extends JPanel implements MouseListener, ap.alignFrame.statusBar.setText(message.toString()); // Are we editing within a selection group? - if (groupEditing - || (sg != null && sg.getSequences(av.getHiddenRepSequences()) - .contains(seq))) + if (groupEditing || (sg != null + && sg.getSequences(av.getHiddenRepSequences()).contains(seq))) { fixedColumns = true; @@ -1275,7 +1275,7 @@ public class SeqPanel extends JPanel implements MouseListener, // Find the next gap before the end // of the visible region boundary boolean blank = false; - for (fixedRight = fixedRight; fixedRight > lastres; fixedRight--) + for (; fixedRight > lastres; fixedRight--) { blank = true; @@ -1367,8 +1367,8 @@ public class SeqPanel extends JPanel implements MouseListener, } else { - appendEdit(Action.INSERT_GAP, groupSeqs, startres, startres - - lastres); + appendEdit(Action.INSERT_GAP, groupSeqs, startres, + startres - lastres); } } else @@ -1383,8 +1383,8 @@ public class SeqPanel extends JPanel implements MouseListener, } else { - appendEdit(Action.DELETE_GAP, groupSeqs, startres, lastres - - startres); + appendEdit(Action.DELETE_GAP, groupSeqs, startres, + lastres - startres); } } @@ -1538,9 +1538,9 @@ public class SeqPanel extends JPanel implements MouseListener, oldSeq = 0; } - if (scrollThread != null) + if ((scrollThread != null) && (scrollThread.isRunning())) { - scrollThread.running = false; + scrollThread.stopScrolling(); scrollThread = null; } } @@ -1559,7 +1559,7 @@ public class SeqPanel extends JPanel implements MouseListener, return; } - if (mouseDragging) + if (mouseDragging && scrollThread == null) { scrollThread = new ScrollThread(); } @@ -1657,14 +1657,15 @@ public class SeqPanel extends JPanel implements MouseListener, final int res = findColumn(evt); final int seq = findSeq(evt); oldSeq = seq; - needOverviewUpdate = false; + updateOverviewAndStructs = false; startWrapBlock = wrappedBlock; if (av.getWrapAlignment() && seq > av.getAlignment().getHeight()) { - JvOptionPane.showInternalMessageDialog(Desktop.desktop, MessageManager - .getString("label.cannot_edit_annotations_in_wrapped_view"), + JvOptionPane.showInternalMessageDialog(Desktop.desktop, + MessageManager.getString( + "label.cannot_edit_annotations_in_wrapped_view"), MessageManager.getString("label.wrapped_view_no_edit"), JvOptionPane.WARNING_MESSAGE); return; @@ -1721,43 +1722,53 @@ public class SeqPanel extends JPanel implements MouseListener, if (stretchGroup == null) { - // Only if left mouse button do we want to change group sizes + createStretchGroup(res, sequence); + } - // 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 (stretchGroup != null) + { + stretchGroup.addPropertyChangeListener(seqCanvas); + } - if (av.getConservationSelected()) - { - SliderPanel.setConservationSlider(ap, av.getResidueShading(), - ap.getViewName()); - } + seqCanvas.repaint(); + } - if (av.getAbovePIDThreshold()) - { - SliderPanel.setPIDSliderSource(ap, av.getResidueShading(), - ap.getViewName()); - } - // TODO: stretchGroup will always be not null. Is this a merge error ? - 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(); + private void createStretchGroup(int res, SequenceI sequence) + { + // Only if left mouse button do we want to change group sizes + // 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.getResidueShading(), + ap.getViewName()); } - seqCanvas.repaint(); + if (av.getAbovePIDThreshold()) + { + SliderPanel.setPIDSliderSource(ap, av.getResidueShading(), + ap.getViewName()); + } + // TODO: stretchGroup will always be not null. Is this a merge error ? + // or is there a threading issue here? + 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(); + } /** @@ -1805,17 +1816,21 @@ public class SeqPanel extends JPanel implements MouseListener, { return; } + + stretchGroup.removePropertyChangeListener(seqCanvas); + // always do this - annotation has own state // but defer colourscheme update until hidden sequences are passed in boolean vischange = stretchGroup.recalcConservation(true); - needOverviewUpdate |= vischange && av.isSelectionDefinedGroup() + updateOverviewAndStructs |= vischange && av.isSelectionDefinedGroup() && afterDrag; if (stretchGroup.cs != null) { stretchGroup.cs.alignmentChanged(stretchGroup, av.getHiddenRepSequences()); - ResidueShaderI groupColourScheme = stretchGroup.getGroupColourScheme(); + ResidueShaderI groupColourScheme = stretchGroup + .getGroupColourScheme(); String name = stretchGroup.getName(); if (stretchGroup.cs.conservationApplied()) { @@ -1827,8 +1842,10 @@ public class SeqPanel extends JPanel implements MouseListener, } } PaintRefresher.Refresh(this, av.getSequenceSetId()); - ap.paintAlignment(needOverviewUpdate); - needOverviewUpdate = false; + // TODO: structure colours only need updating if stretchGroup used to or now + // does contain sequences with structure views + ap.paintAlignment(updateOverviewAndStructs, updateOverviewAndStructs); + updateOverviewAndStructs = false; changeEndRes = false; changeStartRes = false; stretchGroup = null; @@ -1882,7 +1899,7 @@ public class SeqPanel extends JPanel implements MouseListener, if (res > (stretchGroup.getStartRes() - 1)) { stretchGroup.setEndRes(res); - needOverviewUpdate |= av.isSelectionDefinedGroup(); + updateOverviewAndStructs |= av.isSelectionDefinedGroup(); } } else if (changeStartRes) @@ -1890,7 +1907,7 @@ public class SeqPanel extends JPanel implements MouseListener, if (res < (stretchGroup.getEndRes() + 1)) { stretchGroup.setStartRes(res); - needOverviewUpdate |= av.isSelectionDefinedGroup(); + updateOverviewAndStructs |= av.isSelectionDefinedGroup(); } } @@ -1924,7 +1941,7 @@ public class SeqPanel extends JPanel implements MouseListener, if (stretchGroup.getSequences(null).contains(nextSeq)) { stretchGroup.deleteSequence(seq, false); - needOverviewUpdate |= av.isSelectionDefinedGroup(); + updateOverviewAndStructs |= av.isSelectionDefinedGroup(); } else { @@ -1934,7 +1951,7 @@ public class SeqPanel extends JPanel implements MouseListener, } stretchGroup.addSequence(nextSeq, false); - needOverviewUpdate |= av.isSelectionDefinedGroup(); + updateOverviewAndStructs |= av.isSelectionDefinedGroup(); } } @@ -1945,21 +1962,19 @@ public class SeqPanel extends JPanel implements MouseListener, mouseDragging = true; - if (scrollThread != null) + if ((scrollThread != null) && (scrollThread.isRunning())) { scrollThread.setEvent(evt); } - - seqCanvas.repaint(); } void scrollCanvas(MouseEvent evt) { if (evt == null) { - if (scrollThread != null) + if ((scrollThread != null) && (scrollThread.isRunning())) { - scrollThread.running = false; + scrollThread.stopScrolling(); scrollThread = null; } mouseDragging = false; @@ -1982,7 +1997,7 @@ public class SeqPanel extends JPanel implements MouseListener, { MouseEvent evt; - boolean running = false; + private volatile boolean threadRunning = true; public ScrollThread() { @@ -1996,38 +2011,40 @@ public class SeqPanel extends JPanel implements MouseListener, public void stopScrolling() { - running = false; + threadRunning = false; + } + + public boolean isRunning() + { + return threadRunning; } @Override public void run() { - running = true; - - while (running) + while (threadRunning) { if (evt != null) { if (mouseDragging && (evt.getY() < 0) && (av.getRanges().getStartSeq() > 0)) { - running = av.getRanges().scrollUp(true); + av.getRanges().scrollUp(true); } - if (mouseDragging && (evt.getY() >= getHeight()) - && (av.getAlignment().getHeight() > av.getRanges() - .getEndSeq())) + if (mouseDragging && (evt.getY() >= getHeight()) && (av + .getAlignment().getHeight() > av.getRanges().getEndSeq())) { - running = av.getRanges().scrollUp(false); + av.getRanges().scrollUp(false); } if (mouseDragging && (evt.getX() < 0)) { - running = av.getRanges().scrollRight(false); + av.getRanges().scrollRight(false); } else if (mouseDragging && (evt.getX() >= getWidth())) { - running = av.getRanges().scrollRight(true); + av.getRanges().scrollRight(true); } } @@ -2052,8 +2069,10 @@ public class SeqPanel extends JPanel implements MouseListener, // handles selection messages... // TODO: extend config options to allow user to control if selections may be // shared between viewports. - boolean iSentTheSelection = (av == source || (source instanceof AlignViewport && ((AlignmentViewport) source) - .getSequenceSetId().equals(av.getSequenceSetId()))); + boolean iSentTheSelection = (av == source + || (source instanceof AlignViewport + && ((AlignmentViewport) source).getSequenceSetId() + .equals(av.getSequenceSetId()))); if (iSentTheSelection) { @@ -2155,8 +2174,7 @@ public class SeqPanel extends JPanel implements MouseListener, repaint = true; } - if (copycolsel - && av.hasHiddenColumns() + if (copycolsel && av.hasHiddenColumns() && (av.getAlignment().getHiddenColumns() == null)) { System.err.println("Bad things");