2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3
10 * of the License, or (at your option) any later version.
12 * Jalview is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19 * The Jalview Authors are detailed in the 'AUTHORS' file.
21 package jalview.appletgui;
23 import jalview.analysis.AnnotationSorter;
24 import jalview.api.AlignViewportI;
25 import jalview.api.AlignmentViewPanel;
26 import jalview.bin.JalviewLite;
27 import jalview.datamodel.AlignmentI;
28 import jalview.datamodel.SearchResultsI;
29 import jalview.datamodel.SequenceI;
30 import jalview.structure.StructureSelectionManager;
31 import jalview.viewmodel.ViewportRanges;
33 import java.awt.BorderLayout;
34 import java.awt.Color;
35 import java.awt.Dimension;
36 import java.awt.FontMetrics;
37 import java.awt.Frame;
38 import java.awt.Graphics;
39 import java.awt.Panel;
40 import java.awt.Scrollbar;
41 import java.awt.event.AdjustmentEvent;
42 import java.awt.event.AdjustmentListener;
43 import java.awt.event.ComponentAdapter;
44 import java.awt.event.ComponentEvent;
45 import java.util.List;
47 public class AlignmentPanel extends Panel implements AdjustmentListener,
51 public AlignViewport av;
53 OverviewPanel overviewPanel;
59 IdwidthAdjuster idwidthAdjuster;
61 public AlignFrame alignFrame;
63 ScalePanel scalePanel;
65 AnnotationPanel annotationPanel;
67 AnnotationLabels alabels;
69 ViewportRanges vpRanges;
71 // this value is set false when selection area being dragged
72 boolean fastPaint = true;
75 public void finalize() throws Throwable
81 seqPanelHolder = null;
82 sequenceHolderPanel = null;
84 scalePanelHolder = null;
85 annotationPanel = null;
86 annotationPanelHolder = null;
87 annotationSpaceFillerHolder = null;
91 public AlignmentPanel(AlignFrame af, final AlignViewport av)
103 vpRanges = av.getRanges();
104 seqPanel = new SeqPanel(av, this);
105 idPanel = new IdPanel(av, this);
106 scalePanel = new ScalePanel(av, this);
107 idwidthAdjuster = new IdwidthAdjuster(this);
108 annotationPanel = new AnnotationPanel(this);
109 annotationPanelHolder.add(annotationPanel, BorderLayout.CENTER);
111 sequenceHolderPanel.add(annotationPanelHolder, BorderLayout.SOUTH);
112 alabels = new AnnotationLabels(this);
114 setAnnotationVisible(av.isShowAnnotation());
116 idPanelHolder.add(idPanel, BorderLayout.CENTER);
117 idSpaceFillerPanel1.add(idwidthAdjuster, BorderLayout.CENTER);
118 annotationSpaceFillerHolder.add(alabels, BorderLayout.CENTER);
119 scalePanelHolder.add(scalePanel, BorderLayout.CENTER);
120 seqPanelHolder.add(seqPanel, BorderLayout.CENTER);
123 setScrollValues(0, 0);
125 apvscroll.addAdjustmentListener(this);
126 hscroll.addAdjustmentListener(this);
127 vscroll.addAdjustmentListener(this);
129 addComponentListener(new ComponentAdapter()
132 public void componentResized(ComponentEvent evt)
134 setScrollValues(vpRanges.getStartRes(), vpRanges.getStartSeq());
135 if (getSize().height > 0
136 && annotationPanelHolder.getSize().height > 0)
138 validateAnnotationDimensions(false);
145 Dimension d = calculateIdWidth();
146 idPanel.idCanvas.setSize(d);
148 hscrollFillerPanel.setSize(d.width, annotationPanel.getSize().height);
150 idPanel.idCanvas.setSize(d.width, seqPanel.seqCanvas.getSize().height);
151 annotationSpaceFillerHolder.setSize(d.width,
152 annotationPanel.getSize().height);
153 alabels.setSize(d.width, annotationPanel.getSize().height);
154 final AlignmentPanel ap = this;
155 av.addPropertyChangeListener(new java.beans.PropertyChangeListener()
158 public void propertyChange(java.beans.PropertyChangeEvent evt)
160 if (evt.getPropertyName().equals("alignment"))
162 PaintRefresher.Refresh(ap, av.getSequenceSetId(), true, true);
170 public AlignViewportI getAlignViewport()
175 public SequenceRenderer getSequenceRenderer()
177 return seqPanel.seqCanvas.sr;
181 public jalview.api.FeatureRenderer getFeatureRenderer()
183 return seqPanel.seqCanvas.fr;
187 public jalview.api.FeatureRenderer cloneFeatureRenderer()
189 FeatureRenderer nfr = new FeatureRenderer(av);
190 nfr.transferSettings(seqPanel.seqCanvas.fr);
194 public void alignmentChanged()
196 av.alignmentChanged(this);
198 if (overviewPanel != null)
200 overviewPanel.updateOverviewImage();
203 alignFrame.updateEditMenuBar();
208 public void fontChanged()
210 // set idCanvas bufferedImage to null
211 // to prevent drawing old image
212 idPanel.idCanvas.image = null;
213 FontMetrics fm = getFontMetrics(av.getFont());
215 scalePanel.setSize(new Dimension(10, av.getCharHeight()
217 idwidthAdjuster.setSize(new Dimension(10, av.getCharHeight()
219 av.updateSequenceIdColours();
220 annotationPanel.image = null;
221 int ap = annotationPanel.adjustPanelHeight(false);
222 Dimension d = calculateIdWidth();
223 d.setSize(d.width + 4, seqPanel.seqCanvas.getSize().height);
224 alabels.setSize(d.width + 4, ap);
226 idPanel.idCanvas.setSize(d);
227 hscrollFillerPanel.setSize(d);
229 validateAnnotationDimensions(false);
230 annotationPanel.repaint();
234 if (overviewPanel != null)
236 overviewPanel.updateOverviewImage();
240 public void setIdWidth(int w, int h)
242 idPanel.idCanvas.setSize(w, h);
243 idPanelHolder.setSize(w, idPanelHolder.getSize().height);
244 annotationSpaceFillerHolder.setSize(w,
245 annotationSpaceFillerHolder.getSize().height);
246 alabels.setSize(w, alabels.getSize().height);
250 Dimension calculateIdWidth()
252 if (av.nullFrame == null)
254 av.nullFrame = new Frame();
255 av.nullFrame.addNotify();
258 Graphics g = av.nullFrame.getGraphics();
260 FontMetrics fm = g.getFontMetrics(av.font);
261 AlignmentI al = av.getAlignment();
266 while (i < al.getHeight() && al.getSequenceAt(i) != null)
268 SequenceI s = al.getSequenceAt(i);
269 id = s.getDisplayId(av.getShowJVSuffix());
271 if (fm.stringWidth(id) > idWidth)
273 idWidth = fm.stringWidth(id);
278 // Also check annotation label widths
280 if (al.getAlignmentAnnotation() != null)
282 fm = g.getFontMetrics(av.nullFrame.getFont());
283 while (i < al.getAlignmentAnnotation().length)
285 String label = al.getAlignmentAnnotation()[i].label;
286 if (fm.stringWidth(label) > idWidth)
288 idWidth = fm.stringWidth(label);
294 return new Dimension(idWidth, idPanel.idCanvas.getSize().height);
298 * Highlight the given results on the alignment.
301 public void highlightSearchResults(SearchResultsI results)
303 scrollToPosition(results);
304 seqPanel.seqCanvas.highlightSearchResults(results);
308 * scroll the view to show the position of the highlighted region in results
309 * (if any) and redraw the overview
312 * @return false if results were not found
314 public boolean scrollToPosition(SearchResultsI results)
316 return scrollToPosition(results, true);
320 * scroll the view to show the position of the highlighted region in results
324 * @param redrawOverview
325 * - when set, the overview will be recalculated (takes longer)
326 * @return false if results were not found
328 public boolean scrollToPosition(SearchResultsI results,
329 boolean redrawOverview)
331 return scrollToPosition(results, 0, redrawOverview, false);
335 * scroll the view to show the position of the highlighted region in results
339 * @param redrawOverview
340 * - when set, the overview will be recalculated (takes longer)
341 * @return false if results were not found
343 public boolean scrollToPosition(SearchResultsI results,
345 boolean redrawOverview, boolean centre)
347 // do we need to scroll the panel?
348 if (results != null && results.getSize() > 0)
350 AlignmentI alignment = av.getAlignment();
351 int seqIndex = alignment.findIndex(results);
357 * allow for offset of target sequence (actually scroll to one above it)
360 SequenceI seq = alignment.getSequenceAt(seqIndex);
361 int[] r = results.getResults(seq, 0, alignment.getWidth());
364 if (JalviewLite.debug)
367 .println("DEBUG: scroll didn't happen - results not within alignment : "
368 + seq.getStart() + "," + seq.getEnd());
372 if (JalviewLite.debug)
376 * System.out.println("DEBUG: scroll: start=" + r[0] +
377 * " av.getStartRes()=" + av.getStartRes() + " end=" + r[1] +
378 * " seq.end=" + seq.getEnd() + " av.getEndRes()=" + av.getEndRes() +
379 * " hextent=" + hextent);
386 * To centre results, scroll to positions half the visible width
387 * left/right of the start/end positions
391 int offset = (vpRanges.getEndRes() - vpRanges.getStartRes() + 1) / 2 - 1;
392 start = Math.max(start - offset, 0);
393 end = Math.min(end + offset, seq.getEnd() - 1);
400 if (end == seq.getEnd())
406 * allow for offset of target sequence (actually scroll to one above it)
408 seqIndex = Math.max(0, seqIndex - verticalOffset);
409 return scrollTo(start, end, seqIndex, false, redrawOverview);
414 public boolean scrollTo(int ostart, int end, int seqIndex,
415 boolean scrollToNearest, boolean redrawOverview)
417 int startv, endv, starts, ends, width;
420 if (av.hasHiddenColumns())
422 start = av.getColumnSelection().findColumnPosition(ostart);
423 end = av.getColumnSelection().findColumnPosition(end);
426 if (!scrollToNearest && !av.getColumnSelection().isVisible(ostart))
428 // don't scroll - position isn't visible
438 if (!av.getWrapAlignment())
441 * int spos=av.getStartRes(),sqpos=av.getStartSeq(); if ((startv =
442 * av.getStartRes()) >= start) { spos=start-1; // seqIn //
443 * setScrollValues(start - 1, seqIndex); } else if ((endv =
444 * av.getEndRes()) <= end) { // setScrollValues(spos=startv + 1 + end -
445 * endv, seqIndex); spos=startv + 1 + end - endv; } else if ((starts =
446 * av.getStartSeq()) > seqIndex) { setScrollValues(av.getStartRes(),
447 * seqIndex); } else if ((ends = av.getEndSeq()) <= seqIndex) {
448 * setScrollValues(av.getStartRes(), starts + seqIndex - ends + 1); }
451 // below is scrolling logic up to Jalview 2.8.2
452 // if ((av.getStartRes() > end)
453 // || (av.getEndRes() < start)
454 // || ((av.getStartSeq() > seqIndex) || (av.getEndSeq() < seqIndex)))
456 // if (start > av.getAlignment().getWidth() - hextent)
458 // start = av.getAlignment().getWidth() - hextent;
465 // if (seqIndex > av.getAlignment().getHeight() - vextent)
467 // seqIndex = av.getAlignment().getHeight() - vextent;
473 // setScrollValues(start, seqIndex);
475 // logic copied from jalview.gui.AlignmentPanel:
476 if ((startv = vpRanges.getStartRes()) >= start)
479 * Scroll left to make start of search results visible
481 setScrollValues(start - 1, seqIndex);
483 else if ((endv = vpRanges.getEndRes()) <= end)
486 * Scroll right to make end of search results visible
488 setScrollValues(startv + 1 + end - endv, seqIndex);
490 else if ((starts = vpRanges.getStartSeq()) > seqIndex)
493 * Scroll up to make start of search results visible
495 setScrollValues(vpRanges.getStartRes(), seqIndex);
497 else if ((ends = vpRanges.getEndSeq()) <= seqIndex)
500 * Scroll down to make end of search results visible
502 setScrollValues(vpRanges.getStartRes(), starts + seqIndex - ends
506 * Else results are already visible - no need to scroll
511 scrollToWrappedVisible(start);
513 if (redrawOverview && overviewPanel != null)
515 overviewPanel.setBoxPosition();
517 paintAlignment(redrawOverview);
521 void scrollToWrappedVisible(int res)
523 int cwidth = seqPanel.seqCanvas
524 .getWrappedCanvasWidth(seqPanel.seqCanvas.getSize().width);
525 if (res <= vpRanges.getStartRes()
526 || res >= (vpRanges.getStartRes() + cwidth))
528 vscroll.setValue(res / cwidth);
529 vpRanges.setStartRes(vscroll.getValue() * cwidth);
533 public OverviewPanel getOverviewPanel()
535 return overviewPanel;
538 public void setOverviewPanel(OverviewPanel op)
543 public void setAnnotationVisible(boolean b)
545 if (!av.getWrapAlignment())
547 annotationSpaceFillerHolder.setVisible(b);
548 annotationPanelHolder.setVisible(b);
552 annotationSpaceFillerHolder.setVisible(false);
553 annotationPanelHolder.setVisible(false);
560 * automatically adjust annotation panel height for new annotation whilst
561 * ensuring the alignment is still visible.
564 public void adjustAnnotationHeight()
566 // TODO: display vertical annotation scrollbar if necessary
567 // this is called after loading new annotation onto alignment
568 if (alignFrame.getSize().height == 0)
571 .println("adjustAnnotationHeight frame size zero NEEDS FIXING");
574 validateAnnotationDimensions(true);
575 apvscroll.addNotify();
578 paintAlignment(true);
582 * Calculate the annotation dimensions and refresh slider values accordingly.
583 * Need to do repaints/notifys afterwards.
585 protected void validateAnnotationDimensions(boolean adjustPanelHeight)
587 int rowHeight = av.getCharHeight();
588 int alignmentHeight = rowHeight * av.getAlignment().getHeight();
589 int annotationHeight = av.calcPanelHeight();
591 int mheight = annotationHeight;
592 Dimension d = sequenceHolderPanel.getSize();
594 int availableHeight = d.height - scalePanelHolder.getHeight();
596 if (adjustPanelHeight)
599 * If not enough vertical space, maximize annotation height while keeping
600 * at least two rows of alignment visible
602 if (annotationHeight + alignmentHeight > availableHeight)
604 annotationHeight = Math.min(annotationHeight, availableHeight - 2
610 // maintain same window layout whilst updating sliders
611 annotationHeight = annotationPanelHolder.getSize().height;
614 if (availableHeight - annotationHeight < 5)
616 annotationHeight = availableHeight;
619 annotationPanel.setSize(new Dimension(d.width, annotationHeight));
620 annotationPanelHolder.setSize(new Dimension(d.width, annotationHeight));
621 // seqPanelHolder.setSize(d.width, seqandannot - height);
623 .setSize(d.width, seqPanel.seqCanvas.getSize().height);
625 Dimension e = idPanel.getSize();
626 alabels.setSize(new Dimension(e.width, annotationHeight));
627 annotationSpaceFillerHolder.setSize(new Dimension(e.width,
630 int s = apvscroll.getValue();
631 if (s > mheight - annotationHeight)
635 apvscroll.setValues(s, annotationHeight, 0, mheight);
636 annotationPanel.setScrollOffset(apvscroll.getValue(), false);
637 alabels.setScrollOffset(apvscroll.getValue(), false);
640 public void setWrapAlignment(boolean wrap)
642 vpRanges.setStartSeq(0);
643 vpRanges.setStartRes(0);
644 scalePanelHolder.setVisible(!wrap);
646 hscroll.setVisible(!wrap);
647 idwidthAdjuster.setVisible(!wrap);
651 annotationPanelHolder.setVisible(false);
652 annotationSpaceFillerHolder.setVisible(false);
654 else if (av.isShowAnnotation())
656 annotationPanelHolder.setVisible(true);
657 annotationSpaceFillerHolder.setVisible(true);
660 idSpaceFillerPanel1.setVisible(!wrap);
662 fontChanged(); // This is so that the scalePanel is resized correctly
665 sequenceHolderPanel.validate();
674 // return value is true if the scroll is valid
675 public boolean scrollUp(boolean up)
679 if (vscroll.getValue() < 1)
683 setScrollValues(hscroll.getValue(), vscroll.getValue() - 1);
687 if (vextent + vscroll.getValue() >= av.getAlignment().getHeight())
691 setScrollValues(hscroll.getValue(), vscroll.getValue() + 1);
698 public boolean scrollRight(boolean right)
702 if (hscroll.getValue() < 1)
706 setScrollValues(hscroll.getValue() - 1, vscroll.getValue());
710 if (hextent + hscroll.getValue() >= av.getAlignment().getWidth())
714 setScrollValues(hscroll.getValue() + 1, vscroll.getValue());
721 public void setScrollValues(int x, int y)
723 int width = av.getAlignment().getWidth();
724 int height = av.getAlignment().getHeight();
726 if (av.hasHiddenColumns())
728 width = av.getColumnSelection().findColumnPosition(width);
736 hextent = seqPanel.seqCanvas.getSize().width / av.getCharWidth();
737 vextent = seqPanel.seqCanvas.getSize().height / av.getCharHeight();
744 if (vextent > height)
749 if ((hextent + x) > width)
751 System.err.println("hextent was " + hextent + " and x was " + x);
756 if ((vextent + y) > height)
758 y = height - vextent;
768 System.err.println("x was " + x);
772 vpRanges.setStartSeq(y);
773 vpRanges.setEndSeq(y + vextent);
774 vpRanges.setStartRes(x);
775 vpRanges.setEndRes((x + (seqPanel.seqCanvas.getSize().width / av
776 .getCharWidth())) - 1);
778 hscroll.setValues(x, hextent, 0, width);
779 vscroll.setValues(y, vextent, 0, height);
781 if (overviewPanel != null)
783 overviewPanel.setBoxPosition();
790 public void adjustmentValueChanged(AdjustmentEvent evt)
792 int oldX = vpRanges.getStartRes();
793 int oldY = vpRanges.getStartSeq();
795 if (evt == null || evt.getSource() == apvscroll)
797 annotationPanel.setScrollOffset(apvscroll.getValue(), false);
798 alabels.setScrollOffset(apvscroll.getValue(), false);
799 // annotationPanel.image=null;
800 // alabels.image=null;
801 // alabels.repaint();
802 // annotationPanel.repaint();
804 if (evt == null || evt.getSource() == hscroll)
806 int x = hscroll.getValue();
807 vpRanges.setStartRes(x);
808 vpRanges.setEndRes(x + seqPanel.seqCanvas.getSize().width
809 / av.getCharWidth() - 1);
812 if (evt == null || evt.getSource() == vscroll)
814 int offy = vscroll.getValue();
815 if (av.getWrapAlignment())
817 int rowSize = seqPanel.seqCanvas
818 .getWrappedCanvasWidth(seqPanel.seqCanvas.getSize().width);
819 vpRanges.setStartRes(vscroll.getValue() * rowSize);
820 vpRanges.setEndRes((vscroll.getValue() + 1) * rowSize);
824 vpRanges.setStartSeq(offy);
825 vpRanges.setEndSeq(offy + seqPanel.seqCanvas.getSize().height
826 / av.getCharHeight() - 1);
830 if (overviewPanel != null)
832 overviewPanel.setBoxPosition();
835 int scrollX = vpRanges.getStartRes() - oldX;
836 int scrollY = vpRanges.getStartSeq() - oldY;
838 if (av.getWrapAlignment() || !fastPaint || av.MAC)
844 // Make sure we're not trying to draw a panel
845 // larger than the visible window
846 if (scrollX > vpRanges.getEndRes() - vpRanges.getStartRes())
848 scrollX = vpRanges.getEndRes() - vpRanges.getStartRes();
850 else if (scrollX < vpRanges.getStartRes() - vpRanges.getEndRes())
852 scrollX = vpRanges.getStartRes() - vpRanges.getEndRes();
855 idPanel.idCanvas.fastPaint(scrollY);
856 seqPanel.seqCanvas.fastPaint(scrollX, scrollY);
858 scalePanel.repaint();
859 if (av.isShowAnnotation())
861 annotationPanel.fastPaint(vpRanges.getStartRes() - oldX);
867 * If there is one, scroll the (Protein/cDNA) complementary alignment to
868 * match, unless we are ourselves doing that.
870 if (isFollowingComplementScroll())
872 setFollowingComplementScroll(false);
876 AlignmentPanel ap = getComplementPanel();
877 av.scrollComplementaryAlignment(ap);
883 * A helper method to return the AlignmentPanel in the other (complementary)
884 * half of a SplitFrame view. Returns null if not in a SplitFrame.
888 private AlignmentPanel getComplementPanel()
890 AlignmentPanel ap = null;
891 if (alignFrame != null)
893 SplitFrame sf = alignFrame.getSplitFrame();
896 AlignFrame other = sf.getComplement(alignFrame);
899 ap = other.alignPanel;
907 * Follow a scrolling change in the (cDNA/Protein) complementary alignment.
908 * The aim is to keep the two alignments 'lined up' on their centre columns.
911 * holds mapped region(s) of this alignment that we are scrolling
912 * 'to'; may be modified for sequence offset by this method
914 * the number of visible sequences to show above the mapped region
916 protected void scrollToCentre(SearchResultsI sr, int seqOffset)
919 * To avoid jumpy vertical scrolling (if some sequences are gapped or not
920 * mapped), we can make the scroll-to location a sequence above the one
923 SequenceI mappedTo = sr.getResults().get(0).getSequence();
924 List<SequenceI> seqs = av.getAlignment().getSequences();
927 * This is like AlignmentI.findIndex(seq) but here we are matching the
928 * dataset sequence not the aligned sequence
930 int sequenceIndex = 0;
931 boolean matched = false;
932 for (SequenceI seq : seqs)
934 if (mappedTo == seq.getDatasetSequence())
943 return; // failsafe, shouldn't happen
947 * Scroll to position but centring the target residue. Also set a state flag
948 * to prevent adjustmentValueChanged performing this recursively.
950 setFollowingComplementScroll(true);
951 // this should be scrollToPosition(sr,verticalOffset,
952 scrollToPosition(sr, seqOffset, true, true);
955 private void sendViewPosition()
957 StructureSelectionManager.getStructureSelectionManager(av.applet)
958 .sendViewPosition(this, vpRanges.getStartRes(),
959 vpRanges.getEndRes(), vpRanges.getStartSeq(),
960 vpRanges.getEndSeq());
964 * Repaint the alignment and annotations, and, optionally, any overview window
967 public void paintAlignment(boolean updateOverview)
969 final AnnotationSorter sorter = new AnnotationSorter(getAlignment(),
970 av.isShowAutocalculatedAbove());
971 sorter.sort(getAlignment().getAlignmentAnnotation(),
972 av.getSortAnnotationsBy());
977 // TODO: determine if this paintAlignment changed structure colours
978 jalview.structure.StructureSelectionManager
979 .getStructureSelectionManager(av.applet)
980 .sequenceColoursChanged(this);
982 if (overviewPanel != null)
984 overviewPanel.updateOverviewImage();
990 public void update(Graphics g)
996 public void paint(Graphics g)
999 Dimension d = idPanel.idCanvas.getSize();
1000 final int canvasHeight = seqPanel.seqCanvas.getSize().height;
1001 if (canvasHeight != d.height)
1003 idPanel.idCanvas.setSize(d.width, canvasHeight);
1006 if (av.getWrapAlignment())
1008 int maxwidth = av.getAlignment().getWidth();
1010 if (av.hasHiddenColumns())
1012 maxwidth = av.getColumnSelection().findColumnPosition(maxwidth) - 1;
1015 int canvasWidth = seqPanel.seqCanvas
1016 .getWrappedCanvasWidth(seqPanel.seqCanvas.getSize().width);
1018 if (canvasWidth > 0)
1020 int max = maxwidth / canvasWidth;
1021 vscroll.setMaximum(1 + max);
1022 vscroll.setUnitIncrement(1);
1023 vscroll.setVisibleAmount(1);
1028 setScrollValues(vpRanges.getStartRes(), vpRanges.getStartSeq());
1031 seqPanel.seqCanvas.repaint();
1032 idPanel.idCanvas.repaint();
1033 if (!av.getWrapAlignment())
1035 if (av.isShowAnnotation())
1038 annotationPanel.repaint();
1040 scalePanel.repaint();
1045 protected Panel sequenceHolderPanel = new Panel();
1047 protected Scrollbar vscroll = new Scrollbar();
1049 protected Scrollbar hscroll = new Scrollbar();
1051 protected Panel seqPanelHolder = new Panel();
1053 protected Panel scalePanelHolder = new Panel();
1055 protected Panel idPanelHolder = new Panel();
1057 protected Panel idSpaceFillerPanel1 = new Panel();
1059 public Panel annotationSpaceFillerHolder = new Panel();
1061 protected Panel hscrollFillerPanel = new Panel();
1063 Panel annotationPanelHolder = new Panel();
1065 protected Scrollbar apvscroll = new Scrollbar();
1068 * Flag set while scrolling to follow complementary cDNA/protein scroll. When
1069 * true, suppresses invoking the same method recursively.
1071 private boolean followingComplementScroll;
1073 private void jbInit() throws Exception
1075 // idPanelHolder.setPreferredSize(new Dimension(70, 10));
1076 this.setLayout(new BorderLayout());
1078 // sequenceHolderPanel.setPreferredSize(new Dimension(150, 150));
1079 sequenceHolderPanel.setLayout(new BorderLayout());
1080 seqPanelHolder.setLayout(new BorderLayout());
1081 scalePanelHolder.setBackground(Color.white);
1083 // scalePanelHolder.setPreferredSize(new Dimension(10, 30));
1084 scalePanelHolder.setLayout(new BorderLayout());
1085 idPanelHolder.setLayout(new BorderLayout());
1086 idSpaceFillerPanel1.setBackground(Color.white);
1088 // idSpaceFillerPanel1.setPreferredSize(new Dimension(10, 30));
1089 idSpaceFillerPanel1.setLayout(new BorderLayout());
1090 annotationSpaceFillerHolder.setBackground(Color.white);
1092 // annotationSpaceFillerHolder.setPreferredSize(new Dimension(10, 80));
1093 annotationSpaceFillerHolder.setLayout(new BorderLayout());
1094 hscroll.setOrientation(Scrollbar.HORIZONTAL);
1096 Panel hscrollHolder = new Panel();
1097 hscrollHolder.setLayout(new BorderLayout());
1098 hscrollFillerPanel.setBackground(Color.white);
1099 apvscroll.setOrientation(Scrollbar.VERTICAL);
1100 apvscroll.setVisible(true);
1101 apvscroll.addAdjustmentListener(this);
1103 annotationPanelHolder.setBackground(Color.white);
1104 annotationPanelHolder.setLayout(new BorderLayout());
1105 annotationPanelHolder.add(apvscroll, BorderLayout.EAST);
1106 // hscrollFillerPanel.setPreferredSize(new Dimension(70, 10));
1107 hscrollHolder.setBackground(Color.white);
1109 // annotationScroller.setPreferredSize(new Dimension(10, 80));
1110 // this.setPreferredSize(new Dimension(220, 166));
1111 seqPanelHolder.setBackground(Color.white);
1112 idPanelHolder.setBackground(Color.white);
1113 sequenceHolderPanel.add(scalePanelHolder, BorderLayout.NORTH);
1114 sequenceHolderPanel.add(seqPanelHolder, BorderLayout.CENTER);
1115 seqPanelHolder.add(vscroll, BorderLayout.EAST);
1117 // Panel3.add(secondaryPanelHolder, BorderLayout.SOUTH);
1118 this.add(idPanelHolder, BorderLayout.WEST);
1119 idPanelHolder.add(idSpaceFillerPanel1, BorderLayout.NORTH);
1120 idPanelHolder.add(annotationSpaceFillerHolder, BorderLayout.SOUTH);
1121 this.add(hscrollHolder, BorderLayout.SOUTH);
1122 hscrollHolder.add(hscroll, BorderLayout.CENTER);
1123 hscrollHolder.add(hscrollFillerPanel, BorderLayout.WEST);
1124 this.add(sequenceHolderPanel, BorderLayout.CENTER);
1128 * hides or shows dynamic annotation rows based on groups and av state flags
1130 public void updateAnnotation()
1132 updateAnnotation(false);
1135 public void updateAnnotation(boolean applyGlobalSettings)
1137 updateAnnotation(applyGlobalSettings, false);
1140 public void updateAnnotation(boolean applyGlobalSettings,
1141 boolean preserveNewGroupSettings)
1143 av.updateGroupAnnotationSettings(applyGlobalSettings,
1144 preserveNewGroupSettings);
1145 adjustAnnotationHeight();
1149 public AlignmentI getAlignment()
1151 return av.getAlignment();
1155 public String getViewName()
1161 public StructureSelectionManager getStructureSelectionManager()
1163 return StructureSelectionManager
1164 .getStructureSelectionManager(av.applet);
1168 public void raiseOOMWarning(String string, OutOfMemoryError error)
1171 System.err.println("Out of memory whilst '" + string + "'");
1172 error.printStackTrace();
1176 * Set a flag to say we are scrolling to follow a (cDNA/protein) complement.
1180 protected void setFollowingComplementScroll(boolean b)
1182 this.followingComplementScroll = b;
1185 protected boolean isFollowingComplementScroll()
1187 return this.followingComplementScroll;