/* * AlignmentViewer.java * * Copyright (c) 2002-2015 Alexei Drummond, Andrew Rambaut and Marc Suchard * * This file is part of BEAST. * See the NOTICE file distributed with this work for additional * information regarding copyright ownership and licensing. * * BEAST is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * BEAST is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with BEAST; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301 USA */ package dr.app.beauti.alignmentviewer; import javax.swing.*; import java.awt.*; import java.awt.event.*; /** * * @author Andrew Rambaut * @version $Id: AlignmentViewer.java,v 1.2 2005/11/11 16:40:41 rambaut Exp $ */ public class AlignmentViewer extends JPanel { private TaxonPane taxonPane; private JScrollPane taxonScrollPane; private RulerPane rulerPane; private JScrollPane rulerScrollPane; private PlotPane plotPane; private JScrollPane plotScrollPane; private AlignmentPane alignmentPane; private JScrollPane alignmentScrollPane; private JSplitPane splitPane; /** Creates new AlignmentPanel */ public AlignmentViewer() { this(null); } /** Creates new AlignmentPanel */ public AlignmentViewer(PlotPane plotPane) { setOpaque(false); setMinimumSize(new Dimension(300,150)); setLayout(new BorderLayout(6,6)); taxonPane = new TaxonPane(); taxonScrollPane = new JScrollPane(taxonPane, JScrollPane.VERTICAL_SCROLLBAR_NEVER, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); taxonScrollPane.setBorder(null); JPanel leftPanel = new JPanel(new BorderLayout(6,6)); leftPanel.add(taxonScrollPane, BorderLayout.CENTER); JPanel emptyPanel = new JPanel(); emptyPanel.setPreferredSize(new Dimension(16, 16)); leftPanel.add(emptyPanel, BorderLayout.NORTH); rulerPane = new RulerPane(); rulerPane.setOpaque(false); rulerScrollPane = new JScrollPane(rulerPane, JScrollPane.VERTICAL_SCROLLBAR_NEVER, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); rulerScrollPane.setBorder(null); alignmentPane = new AlignmentPane(taxonPane, rulerPane); alignmentScrollPane = new JScrollPane(alignmentPane, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); alignmentScrollPane.setBorder(null); taxonScrollPane.getVerticalScrollBar().setModel(alignmentScrollPane.getVerticalScrollBar().getModel()); rulerScrollPane.getHorizontalScrollBar().setModel(alignmentScrollPane.getHorizontalScrollBar().getModel()); JPanel rightPanel = new JPanel(new BorderLayout(6,6)); rightPanel.add(alignmentScrollPane, BorderLayout.CENTER); rightPanel.add(rulerScrollPane, BorderLayout.NORTH); if (plotPane != null) { plotScrollPane = new JScrollPane(plotPane, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); plotScrollPane.getHorizontalScrollBar().setModel(alignmentScrollPane.getHorizontalScrollBar().getModel()); rightPanel.add(plotScrollPane, BorderLayout.SOUTH); } splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPanel, rightPanel); splitPane.setDividerLocation(120); add(splitPane, BorderLayout.CENTER); alignmentPane.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent mouseEvent) { } public void mousePressed(MouseEvent mouseEvent) { // This is used for drag-to-scroll in combination with mouseDragged // in the MouseMotionListener, below. dragPoint = mouseEvent.getPoint(); } }); alignmentPane.addMouseMotionListener(new MouseMotionAdapter() { public void mouseMoved(MouseEvent mouseEvent) { } public void mouseDragged(MouseEvent mouseEvent) { // Calculate how far the mouse has been dragged from the point clicked in // mousePressed, above. int deltaX = mouseEvent.getX() - dragPoint.x; int deltaY = mouseEvent.getY() - dragPoint.y; // Get the currently visible window Rectangle visRect = alignmentPane.getVisibleRect(); // Calculate how much we need to scroll if (deltaX > 0) { deltaX = visRect.x - deltaX; } else { deltaX = visRect.x + visRect.width - deltaX; } if (deltaY > 0) { deltaY = visRect.y - deltaY; } else { deltaY = visRect.y + visRect.height - deltaY; } // Scroll the visible region Rectangle r = new Rectangle(deltaX, deltaY, 1, 1); alignmentPane.scrollRectToVisible(r); } }); } public void setAlignmentBuffer(AlignmentBuffer alignmentBuffer) { rulerPane.setAlignmentBuffer(alignmentBuffer); taxonPane.setAlignmentBuffer(alignmentBuffer); alignmentPane.setAlignmentBuffer(alignmentBuffer); } public void setRowDecorator(RowDecorator rowDecorator) { alignmentPane.setRowDecorator(rowDecorator); } public void setColumnDecorator(ColumnDecorator columnDecorator) { alignmentPane.setColumnDecorator(columnDecorator); rulerPane.setColumnDecorator(columnDecorator); } public void setCellDecorator(CellDecorator cellDecorator) { alignmentPane.setCellDecorator(cellDecorator); } public void addHorizontalScrollbarListener(AdjustmentListener adjustmentListener) { alignmentScrollPane.getHorizontalScrollBar().addAdjustmentListener(adjustmentListener); } public void addVerticalScrollbarListener(AdjustmentListener adjustmentListener) { alignmentScrollPane.getVerticalScrollBar().addAdjustmentListener(adjustmentListener); } public void addComponentListener(ComponentListener componentListener) { alignmentScrollPane.addComponentListener(componentListener); } public Rectangle getTaxonPaneBounds() { return taxonScrollPane.getViewportBorderBounds(); } public Rectangle getAlignmentPaneBounds() { return alignmentScrollPane.getViewportBorderBounds(); } public Rectangle getVisibleArea() { return alignmentPane.getVisibleArea(); } public void setTopRow(int row) { alignmentPane.setTopRow(row); } public void setLeftColumn(int col) { alignmentPane.setLeftColumn(col); } public void setCentreColumn(int col) { alignmentPane.setCentreColumn(col); } public void setRightColumn(int col) { alignmentPane.setRightColumn(col); } private Point dragPoint = null; }