/*
* Copyright (c) 2010 The Jackson Laboratory
*
* This is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This software 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this software. If not, see <http://www.gnu.org/licenses/>.
*/
package org.jax.gwtutil.client;
/**
* For zoom/scrolls that use a 0.0-1.0 range
* @author <A HREF="mailto:keith.sheppard@jax.org">Keith Sheppard</A>
*/
public class RealZoomScrollBar extends ZoomScrollBar
{
private double selectedRangeStart = 0.0;
private double selectedRangeExtent = 0.0;
private int selectedRangeExtentInPixels;
private int selectedRangeStartInPixels;
private volatile RealZoomScrollListener[] listeners =
new RealZoomScrollListener[0];
/**
* Constructor
*/
public RealZoomScrollBar()
{
}
/**
* Add the given zoom/scroll listener
* @param listenerToAdd
* the listener to add
*/
public void addRealZoomScrollListener(RealZoomScrollListener listenerToAdd)
{
RealZoomScrollListener[] listeners = this.listeners;
RealZoomScrollListener[] newListeners =
new RealZoomScrollListener[listeners.length + 1];
for(int i = 0; i < listeners.length; i++)
{
newListeners[i] = listeners[i];
}
newListeners[newListeners.length - 1] = listenerToAdd;
this.listeners = newListeners;
}
/**
* {@inheritDoc}
*/
@Override
protected int getSelectedRangeExtentInPixels()
{
return this.selectedRangeExtentInPixels;
}
/**
* {@inheritDoc}
*/
@Override
protected int getSelectedRangeStartInPixels()
{
return this.selectedRangeStartInPixels;
}
/**
* @return the selectedRangeStart
*/
public double getSelectedRangeStart()
{
return this.selectedRangeStart;
}
/**
* @return the selectedRangeExtent
*/
public double getSelectedRangeExtent()
{
return this.selectedRangeExtent;
}
/**
* Update the selected range
* @param selectedRangeStart
* the range start 0-1
* @param selectedRangeExtent
* the range extent 0-1
* @param zoomScrollComplete
* if zoom scroll was complete
* @param fireEvent
* flag indicating whether an event should be fired
*/
public void updateSelectedRange(
double selectedRangeStart,
double selectedRangeExtent,
boolean zoomScrollComplete,
boolean fireEvent)
{
this.selectedRangeStart = selectedRangeStart;
this.selectedRangeExtent = selectedRangeExtent;
int fullRangeStartInPixels = this.getFullRangeStartInPixels();
int fullRangeExtentInPixels = this.getFullRangeExtentInPixels();
this.selectedRangeStartInPixels =
fullRangeStartInPixels +
(int)(selectedRangeStart * fullRangeExtentInPixels);
this.selectedRangeExtentInPixels =
(int)(Math.round(selectedRangeExtent * fullRangeExtentInPixels));
super.refreshScrollBar(zoomScrollComplete);
if(fireEvent)
{
this.fireZoomScrollRangeUpdated(
selectedRangeStart,
selectedRangeExtent,
zoomScrollComplete);
}
}
/**
* Tell all of our listeners that there has been a change
* @param selectedRangeStart
* the updated start
* @param selectedRangeExtent
* the updated extent
* @param zoomScrollComplete
* if zoom scroll was complete
*/
private void fireZoomScrollRangeUpdated(
double selectedRangeStart,
double selectedRangeExtent,
boolean zoomScrollComplete)
{
RealZoomScrollListener[] listeners = this.listeners;
for(RealZoomScrollListener currListener: listeners)
{
currListener.zoomScrollRangeUpdated(
selectedRangeStart,
selectedRangeExtent,
zoomScrollComplete);
}
}
/**
* {@inheritDoc}
*/
@Override
protected void updateSelectedRangeInPixels(
int newSelectedRangeStartInPixels,
int newSelectedRangeExtentInPixels,
boolean zoomScrollComplete)
{
// Set the pixel ranges
this.selectedRangeStartInPixels = newSelectedRangeStartInPixels;
this.selectedRangeExtentInPixels = newSelectedRangeExtentInPixels;
int fullRangeStartInPixels = this.getFullRangeStartInPixels();
int fullRangeExtentInPixels = this.getFullRangeExtentInPixels();
// Set the 0-1 range values
this.selectedRangeStart =
(newSelectedRangeStartInPixels - fullRangeStartInPixels) /
(double)fullRangeExtentInPixels;
this.selectedRangeExtent =
newSelectedRangeExtentInPixels /
(double)fullRangeExtentInPixels;
// repaint the scroll bar to reflect the newly selected range
this.refreshScrollBar(zoomScrollComplete);
}
/**
* {@inheritDoc}
*/
@Override
protected void refreshScrollBar(boolean zoomScrollComplete)
{
this.updateSelectedRange(
this.selectedRangeStart,
this.selectedRangeExtent,
zoomScrollComplete,
true);
}
/**
* {@inheritDoc}
*/
@Override
protected void zoomScrollComplete()
{
this.updateSelectedRange(
this.selectedRangeStart,
this.selectedRangeExtent,
true,
true);
}
}