/* * $Id$ * * Copyright (c) 2006 by Joel Uckelman * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License (LGPL) as published by the Free Software Foundation. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, copies are available * at http://www.opensource.org. */ package VASSAL.tools; import java.awt.Component; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.JScrollPane; import VASSAL.build.GameModule; import VASSAL.configure.IntConfigurer; import VASSAL.i18n.Resources; import VASSAL.preferences.Prefs; /** * AdjustableSpeedScrollPane extends {@link ScrollPane} by making the * scroll speed user-configurable. Use AdjustableScrollPane instead * of ScrollPane wherever a scrollpane for large images is needed. * * @author Joel Uckelman * @see VASSAL.tools.ScrollPane * @see javax.swing.JScrollPane */ public class AdjustableSpeedScrollPane extends ScrollPane { private static final long serialVersionUID = 1L; private static final String SCROLL_SPEED = "scrollSpeed"; //$NON-NLS-1$ private static final int defaultSpeed = 50; /** * Creates an AdjustableSpeedScrollPane that displays the contents of the * specified component, where both horizontal and vertical scrollbars * appear whenever the component's contents are larger than the view. * * @param view the component to display in the scrollpane's viewport */ public AdjustableSpeedScrollPane(Component view) { this(view, VERTICAL_SCROLLBAR_AS_NEEDED, HORIZONTAL_SCROLLBAR_AS_NEEDED); } /** * Creates an AdjustableSpeedScrollPane that displays the view component * in a viewport with the specified scrollbar policies. The available * policy settings are listed at * {@link JScrollPane#setVerticalScrollBarPolicy} and * {@link JScrollPane#setHorizontalScrollBarPolicy}. * * @param view the component to display in the scrollpane's viewport * @param vsbPolicy an integer that specifies the vertical scrollbar policy * @param hsbPolicy an integer that specifies the horizontal scrollbar * policy */ public AdjustableSpeedScrollPane(Component view, int vsbPolicy, int hsbPolicy) { super(view, vsbPolicy, hsbPolicy); // set configurer final IntConfigurer config = new IntConfigurer( SCROLL_SPEED, Resources.getString("AdjustableSpeedScrollPane.scroll_increment"), defaultSpeed ); config.addPropertyChangeListener(new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent e) { if (SCROLL_SPEED.equals(e.getPropertyName())) setSpeed(((Integer) e.getNewValue()).intValue()); } }); final GameModule g = GameModule.getGameModule(); if (g == null) { setSpeed(defaultSpeed); } else { final Prefs prefs = g.getPrefs(); prefs.addOption(Resources.getString("Prefs.general_tab"), config); //$NON-NLS-1$ setSpeed(((Integer) prefs.getValue(SCROLL_SPEED)).intValue()); } } private void setSpeed(int speed) { verticalScrollBar.setUnitIncrement(speed); horizontalScrollBar.setUnitIncrement(speed); } }