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 AlignmentI al = av.getAlignment();
423 start = al.getHiddenColumns().findColumnPosition(ostart);
424 end = al.getHiddenColumns().findColumnPosition(end);
427 if (!scrollToNearest && !al.getHiddenColumns().isVisible(ostart))
429 // don't scroll - position isn't visible
439 if (!av.getWrapAlignment())
442 * int spos=av.getStartRes(),sqpos=av.getStartSeq(); if ((startv =
443 * av.getStartRes()) >= start) { spos=start-1; // seqIn //
444 * setScrollValues(start - 1, seqIndex); } else if ((endv =
445 * av.getEndRes()) <= end) { // setScrollValues(spos=startv + 1 + end -
446 * endv, seqIndex); spos=startv + 1 + end - endv; } else if ((starts =
447 * av.getStartSeq()) > seqIndex) { setScrollValues(av.getStartRes(),
448 * seqIndex); } else if ((ends = av.getEndSeq()) <= seqIndex) {
449 * setScrollValues(av.getStartRes(), starts + seqIndex - ends + 1); }
452 // below is scrolling logic up to Jalview 2.8.2
453 // if ((av.getStartRes() > end)
454 // || (av.getEndRes() < start)
455 // || ((av.getStartSeq() > seqIndex) || (av.getEndSeq() < seqIndex)))
457 // if (start > av.getAlignment().getWidth() - hextent)
459 // start = av.getAlignment().getWidth() - hextent;
466 // if (seqIndex > av.getAlignment().getHeight() - vextent)
468 // seqIndex = av.getAlignment().getHeight() - vextent;
474 // setScrollValues(start, seqIndex);
476 // logic copied from jalview.gui.AlignmentPanel:
477 if ((startv = vpRanges.getStartRes()) >= start)
480 * Scroll left to make start of search results visible
482 setScrollValues(start - 1, seqIndex);
484 else if ((endv = vpRanges.getEndRes()) <= end)
487 * Scroll right to make end of search results visible
489 setScrollValues(startv + 1 + end - endv, seqIndex);
491 else if ((starts = vpRanges.getStartSeq()) > seqIndex)
494 * Scroll up to make start of search results visible
496 setScrollValues(vpRanges.getStartRes(), seqIndex);
498 else if ((ends = vpRanges.getEndSeq()) <= seqIndex)
501 * Scroll down to make end of search results visible
503 setScrollValues(vpRanges.getStartRes(), starts + seqIndex - ends
507 * Else results are already visible - no need to scroll
512 scrollToWrappedVisible(start);
514 if (redrawOverview && overviewPanel != null)
516 overviewPanel.setBoxPosition();
518 paintAlignment(redrawOverview);
522 void scrollToWrappedVisible(int res)
524 int cwidth = seqPanel.seqCanvas
525 .getWrappedCanvasWidth(seqPanel.seqCanvas.getSize().width);
526 if (res <= vpRanges.getStartRes()
527 || res >= (vpRanges.getStartRes() + cwidth))
529 vscroll.setValue(res / cwidth);
530 vpRanges.setStartRes(vscroll.getValue() * cwidth);
534 public OverviewPanel getOverviewPanel()
536 return overviewPanel;
539 public void setOverviewPanel(OverviewPanel op)
544 public void setAnnotationVisible(boolean b)
546 if (!av.getWrapAlignment())
548 annotationSpaceFillerHolder.setVisible(b);
549 annotationPanelHolder.setVisible(b);
553 annotationSpaceFillerHolder.setVisible(false);
554 annotationPanelHolder.setVisible(false);
561 * automatically adjust annotation panel height for new annotation whilst
562 * ensuring the alignment is still visible.
565 public void adjustAnnotationHeight()
567 // TODO: display vertical annotation scrollbar if necessary
568 // this is called after loading new annotation onto alignment
569 if (alignFrame.getSize().height == 0)
572 .println("adjustAnnotationHeight frame size zero NEEDS FIXING");
575 validateAnnotationDimensions(true);
576 apvscroll.addNotify();
579 paintAlignment(true);
583 * Calculate the annotation dimensions and refresh slider values accordingly.
584 * Need to do repaints/notifys afterwards.
586 protected void validateAnnotationDimensions(boolean adjustPanelHeight)
588 int rowHeight = av.getCharHeight();
589 int alignmentHeight = rowHeight * av.getAlignment().getHeight();
590 int annotationHeight = av.calcPanelHeight();
592 int mheight = annotationHeight;
593 Dimension d = sequenceHolderPanel.getSize();
595 int availableHeight = d.height - scalePanelHolder.getHeight();
597 if (adjustPanelHeight)
600 * If not enough vertical space, maximize annotation height while keeping
601 * at least two rows of alignment visible
603 if (annotationHeight + alignmentHeight > availableHeight)
605 annotationHeight = Math.min(annotationHeight, availableHeight - 2
611 // maintain same window layout whilst updating sliders
612 annotationHeight = annotationPanelHolder.getSize().height;
615 if (availableHeight - annotationHeight < 5)
617 annotationHeight = availableHeight;
620 annotationPanel.setSize(new Dimension(d.width, annotationHeight));
621 annotationPanelHolder.setSize(new Dimension(d.width, annotationHeight));
622 // seqPanelHolder.setSize(d.width, seqandannot - height);
624 .setSize(d.width, seqPanel.seqCanvas.getSize().height);
626 Dimension e = idPanel.getSize();
627 alabels.setSize(new Dimension(e.width, annotationHeight));
628 annotationSpaceFillerHolder.setSize(new Dimension(e.width,
631 int s = apvscroll.getValue();
632 if (s > mheight - annotationHeight)
636 apvscroll.setValues(s, annotationHeight, 0, mheight);
637 annotationPanel.setScrollOffset(apvscroll.getValue(), false);
638 alabels.setScrollOffset(apvscroll.getValue(), false);
641 public void setWrapAlignment(boolean wrap)
643 vpRanges.setStartSeq(0);
644 vpRanges.setStartRes(0);
645 scalePanelHolder.setVisible(!wrap);
647 hscroll.setVisible(!wrap);
648 idwidthAdjuster.setVisible(!wrap);
652 annotationPanelHolder.setVisible(false);
653 annotationSpaceFillerHolder.setVisible(false);
655 else if (av.isShowAnnotation())
657 annotationPanelHolder.setVisible(true);
658 annotationSpaceFillerHolder.setVisible(true);
661 idSpaceFillerPanel1.setVisible(!wrap);
663 fontChanged(); // This is so that the scalePanel is resized correctly
666 sequenceHolderPanel.validate();
675 // return value is true if the scroll is valid
676 public boolean scrollUp(boolean up)
680 if (vscroll.getValue() < 1)
684 setScrollValues(hscroll.getValue(), vscroll.getValue() - 1);
688 if (vextent + vscroll.getValue() >= av.getAlignment().getHeight())
692 setScrollValues(hscroll.getValue(), vscroll.getValue() + 1);
699 public boolean scrollRight(boolean right)
703 if (hscroll.getValue() < 1)
707 setScrollValues(hscroll.getValue() - 1, vscroll.getValue());
711 if (hextent + hscroll.getValue() >= av.getAlignment().getWidth())
715 setScrollValues(hscroll.getValue() + 1, vscroll.getValue());
722 public void setScrollValues(int x, int y)
724 int width = av.getAlignment().getWidth();
725 int height = av.getAlignment().getHeight();
727 if (av.hasHiddenColumns())
729 width = av.getAlignment().getHiddenColumns()
730 .findColumnPosition(width);
738 hextent = seqPanel.seqCanvas.getSize().width / av.getCharWidth();
739 vextent = seqPanel.seqCanvas.getSize().height / av.getCharHeight();
746 if (vextent > height)
751 if ((hextent + x) > width)
753 System.err.println("hextent was " + hextent + " and x was " + x);
758 if ((vextent + y) > height)
760 y = height - vextent;
770 System.err.println("x was " + x);
774 vpRanges.setStartSeq(y);
775 vpRanges.setEndSeq(y + vextent);
776 vpRanges.setStartRes(x);
777 vpRanges.setEndRes((x + (seqPanel.seqCanvas.getSize().width / av
778 .getCharWidth())) - 1);
780 hscroll.setValues(x, hextent, 0, width);
781 vscroll.setValues(y, vextent, 0, height);
783 if (overviewPanel != null)
785 overviewPanel.setBoxPosition();
792 public void adjustmentValueChanged(AdjustmentEvent evt)
794 int oldX = vpRanges.getStartRes();
795 int oldY = vpRanges.getStartSeq();
797 if (evt == null || evt.getSource() == apvscroll)
799 annotationPanel.setScrollOffset(apvscroll.getValue(), false);
800 alabels.setScrollOffset(apvscroll.getValue(), false);
801 // annotationPanel.image=null;
802 // alabels.image=null;
803 // alabels.repaint();
804 // annotationPanel.repaint();
806 if (evt == null || evt.getSource() == hscroll)
808 int x = hscroll.getValue();
809 vpRanges.setStartRes(x);
810 vpRanges.setEndRes(x + seqPanel.seqCanvas.getSize().width
811 / av.getCharWidth() - 1);
814 if (evt == null || evt.getSource() == vscroll)
816 int offy = vscroll.getValue();
817 if (av.getWrapAlignment())
819 int rowSize = seqPanel.seqCanvas
820 .getWrappedCanvasWidth(seqPanel.seqCanvas.getSize().width);
821 vpRanges.setStartRes(vscroll.getValue() * rowSize);
822 vpRanges.setEndRes((vscroll.getValue() + 1) * rowSize);
826 vpRanges.setStartSeq(offy);
827 vpRanges.setEndSeq(offy + seqPanel.seqCanvas.getSize().height
828 / av.getCharHeight() - 1);
832 if (overviewPanel != null)
834 overviewPanel.setBoxPosition();
837 int scrollX = vpRanges.getStartRes() - oldX;
838 int scrollY = vpRanges.getStartSeq() - oldY;
840 if (av.getWrapAlignment() || !fastPaint || av.MAC)
846 // Make sure we're not trying to draw a panel
847 // larger than the visible window
848 if (scrollX > vpRanges.getEndRes() - vpRanges.getStartRes())
850 scrollX = vpRanges.getEndRes() - vpRanges.getStartRes();
852 else if (scrollX < vpRanges.getStartRes() - vpRanges.getEndRes())
854 scrollX = vpRanges.getStartRes() - vpRanges.getEndRes();
857 idPanel.idCanvas.fastPaint(scrollY);
858 seqPanel.seqCanvas.fastPaint(scrollX, scrollY);
860 scalePanel.repaint();
861 if (av.isShowAnnotation())
863 annotationPanel.fastPaint(vpRanges.getStartRes() - oldX);
869 * If there is one, scroll the (Protein/cDNA) complementary alignment to
870 * match, unless we are ourselves doing that.
872 if (isFollowingComplementScroll())
874 setFollowingComplementScroll(false);
878 AlignmentPanel ap = getComplementPanel();
879 av.scrollComplementaryAlignment(ap);
885 * A helper method to return the AlignmentPanel in the other (complementary)
886 * half of a SplitFrame view. Returns null if not in a SplitFrame.
890 private AlignmentPanel getComplementPanel()
892 AlignmentPanel ap = null;
893 if (alignFrame != null)
895 SplitFrame sf = alignFrame.getSplitFrame();
898 AlignFrame other = sf.getComplement(alignFrame);
901 ap = other.alignPanel;
909 * Follow a scrolling change in the (cDNA/Protein) complementary alignment.
910 * The aim is to keep the two alignments 'lined up' on their centre columns.
913 * holds mapped region(s) of this alignment that we are scrolling
914 * 'to'; may be modified for sequence offset by this method
916 * the number of visible sequences to show above the mapped region
918 protected void scrollToCentre(SearchResultsI sr, int seqOffset)
921 * To avoid jumpy vertical scrolling (if some sequences are gapped or not
922 * mapped), we can make the scroll-to location a sequence above the one
925 SequenceI mappedTo = sr.getResults().get(0).getSequence();
926 List<SequenceI> seqs = av.getAlignment().getSequences();
929 * This is like AlignmentI.findIndex(seq) but here we are matching the
930 * dataset sequence not the aligned sequence
932 int sequenceIndex = 0;
933 boolean matched = false;
934 for (SequenceI seq : seqs)
936 if (mappedTo == seq.getDatasetSequence())
945 return; // failsafe, shouldn't happen
949 * Scroll to position but centring the target residue. Also set a state flag
950 * to prevent adjustmentValueChanged performing this recursively.
952 setFollowingComplementScroll(true);
953 // this should be scrollToPosition(sr,verticalOffset,
954 scrollToPosition(sr, seqOffset, true, true);
957 private void sendViewPosition()
959 StructureSelectionManager.getStructureSelectionManager(av.applet)
960 .sendViewPosition(this, vpRanges.getStartRes(),
961 vpRanges.getEndRes(), vpRanges.getStartSeq(),
962 vpRanges.getEndSeq());
966 * Repaint the alignment and annotations, and, optionally, any overview window
969 public void paintAlignment(boolean updateOverview)
971 final AnnotationSorter sorter = new AnnotationSorter(getAlignment(),
972 av.isShowAutocalculatedAbove());
973 sorter.sort(getAlignment().getAlignmentAnnotation(),
974 av.getSortAnnotationsBy());
979 // TODO: determine if this paintAlignment changed structure colours
980 jalview.structure.StructureSelectionManager
981 .getStructureSelectionManager(av.applet)
982 .sequenceColoursChanged(this);
984 if (overviewPanel != null)
986 overviewPanel.updateOverviewImage();
992 public void update(Graphics g)
998 public void paint(Graphics g)
1001 Dimension d = idPanel.idCanvas.getSize();
1002 final int canvasHeight = seqPanel.seqCanvas.getSize().height;
1003 if (canvasHeight != d.height)
1005 idPanel.idCanvas.setSize(d.width, canvasHeight);
1008 if (av.getWrapAlignment())
1010 int maxwidth = av.getAlignment().getWidth();
1012 if (av.hasHiddenColumns())
1014 maxwidth = av.getAlignment().getHiddenColumns()
1015 .findColumnPosition(maxwidth) - 1;
1018 int canvasWidth = seqPanel.seqCanvas
1019 .getWrappedCanvasWidth(seqPanel.seqCanvas.getSize().width);
1021 if (canvasWidth > 0)
1023 int max = maxwidth / canvasWidth;
1024 vscroll.setMaximum(1 + max);
1025 vscroll.setUnitIncrement(1);
1026 vscroll.setVisibleAmount(1);
1031 setScrollValues(vpRanges.getStartRes(), vpRanges.getStartSeq());
1034 seqPanel.seqCanvas.repaint();
1035 idPanel.idCanvas.repaint();
1036 if (!av.getWrapAlignment())
1038 if (av.isShowAnnotation())
1041 annotationPanel.repaint();
1043 scalePanel.repaint();
1048 protected Panel sequenceHolderPanel = new Panel();
1050 protected Scrollbar vscroll = new Scrollbar();
1052 protected Scrollbar hscroll = new Scrollbar();
1054 protected Panel seqPanelHolder = new Panel();
1056 protected Panel scalePanelHolder = new Panel();
1058 protected Panel idPanelHolder = new Panel();
1060 protected Panel idSpaceFillerPanel1 = new Panel();
1062 public Panel annotationSpaceFillerHolder = new Panel();
1064 protected Panel hscrollFillerPanel = new Panel();
1066 Panel annotationPanelHolder = new Panel();
1068 protected Scrollbar apvscroll = new Scrollbar();
1071 * Flag set while scrolling to follow complementary cDNA/protein scroll. When
1072 * true, suppresses invoking the same method recursively.
1074 private boolean followingComplementScroll;
1076 private void jbInit() throws Exception
1078 // idPanelHolder.setPreferredSize(new Dimension(70, 10));
1079 this.setLayout(new BorderLayout());
1081 // sequenceHolderPanel.setPreferredSize(new Dimension(150, 150));
1082 sequenceHolderPanel.setLayout(new BorderLayout());
1083 seqPanelHolder.setLayout(new BorderLayout());
1084 scalePanelHolder.setBackground(Color.white);
1086 // scalePanelHolder.setPreferredSize(new Dimension(10, 30));
1087 scalePanelHolder.setLayout(new BorderLayout());
1088 idPanelHolder.setLayout(new BorderLayout());
1089 idSpaceFillerPanel1.setBackground(Color.white);
1091 // idSpaceFillerPanel1.setPreferredSize(new Dimension(10, 30));
1092 idSpaceFillerPanel1.setLayout(new BorderLayout());
1093 annotationSpaceFillerHolder.setBackground(Color.white);
1095 // annotationSpaceFillerHolder.setPreferredSize(new Dimension(10, 80));
1096 annotationSpaceFillerHolder.setLayout(new BorderLayout());
1097 hscroll.setOrientation(Scrollbar.HORIZONTAL);
1099 Panel hscrollHolder = new Panel();
1100 hscrollHolder.setLayout(new BorderLayout());
1101 hscrollFillerPanel.setBackground(Color.white);
1102 apvscroll.setOrientation(Scrollbar.VERTICAL);
1103 apvscroll.setVisible(true);
1104 apvscroll.addAdjustmentListener(this);
1106 annotationPanelHolder.setBackground(Color.white);
1107 annotationPanelHolder.setLayout(new BorderLayout());
1108 annotationPanelHolder.add(apvscroll, BorderLayout.EAST);
1109 // hscrollFillerPanel.setPreferredSize(new Dimension(70, 10));
1110 hscrollHolder.setBackground(Color.white);
1112 // annotationScroller.setPreferredSize(new Dimension(10, 80));
1113 // this.setPreferredSize(new Dimension(220, 166));
1114 seqPanelHolder.setBackground(Color.white);
1115 idPanelHolder.setBackground(Color.white);
1116 sequenceHolderPanel.add(scalePanelHolder, BorderLayout.NORTH);
1117 sequenceHolderPanel.add(seqPanelHolder, BorderLayout.CENTER);
1118 seqPanelHolder.add(vscroll, BorderLayout.EAST);
1120 // Panel3.add(secondaryPanelHolder, BorderLayout.SOUTH);
1121 this.add(idPanelHolder, BorderLayout.WEST);
1122 idPanelHolder.add(idSpaceFillerPanel1, BorderLayout.NORTH);
1123 idPanelHolder.add(annotationSpaceFillerHolder, BorderLayout.SOUTH);
1124 this.add(hscrollHolder, BorderLayout.SOUTH);
1125 hscrollHolder.add(hscroll, BorderLayout.CENTER);
1126 hscrollHolder.add(hscrollFillerPanel, BorderLayout.WEST);
1127 this.add(sequenceHolderPanel, BorderLayout.CENTER);
1131 * hides or shows dynamic annotation rows based on groups and av state flags
1133 public void updateAnnotation()
1135 updateAnnotation(false);
1138 public void updateAnnotation(boolean applyGlobalSettings)
1140 updateAnnotation(applyGlobalSettings, false);
1143 public void updateAnnotation(boolean applyGlobalSettings,
1144 boolean preserveNewGroupSettings)
1146 av.updateGroupAnnotationSettings(applyGlobalSettings,
1147 preserveNewGroupSettings);
1148 adjustAnnotationHeight();
1152 public AlignmentI getAlignment()
1154 return av.getAlignment();
1158 public String getViewName()
1164 public StructureSelectionManager getStructureSelectionManager()
1166 return StructureSelectionManager
1167 .getStructureSelectionManager(av.applet);
1171 public void raiseOOMWarning(String string, OutOfMemoryError error)
1174 System.err.println("Out of memory whilst '" + string + "'");
1175 error.printStackTrace();
1179 * Set a flag to say we are scrolling to follow a (cDNA/protein) complement.
1183 protected void setFollowingComplementScroll(boolean b)
1185 this.followingComplementScroll = b;
1188 protected boolean isFollowingComplementScroll()
1190 return this.followingComplementScroll;