SCViewer/plugins/com.minres.scviewer.databas.../src/com/minres/scviewer/database/ui/swt/sb/FlatScrollBar.java

296 lines
8.2 KiB
Java

package com.minres.scviewer.database.ui.swt.sb;
import static com.minres.scviewer.database.ui.swt.sb.UntypedSelectionAdapter.lookup;
import java.util.Collection;
import java.util.HashSet;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Layout;
import org.eclipse.swt.widgets.Listener;
public class FlatScrollBar extends Composite {
public static final int BAR_BREADTH = 6;
static final int DEFAULT_MINIMUM = 0;
static final int DEFAULT_MAXIMUM = 100;
static final int DEFAULT_INCREMENT = 1;
static final int DEFAULT_THUMB = 10;
static final int DEFAULT_PAGE_INCREMENT = DEFAULT_THUMB;
static final int DEFAULT_SELECTION = 0;
static final int DEFAULT_BUTTON_LENGTH = 0;
static final int DEFAULT_MAX_EXPANSION = Direction.CLEARANCE + 2;
final ClickControl up;
final ClickControl upFast;
final DragControl drag;
final ClickControl downFast;
final ClickControl down;
final Direction direction;
final MouseWheelShifter mouseWheelHandler;
final Collection<SelectionListener> listeners;
private int minimum;
private int maximum;
private int increment;
private int pageIncrement;
private int thumb;
private int selection;
private boolean onDrag;
private int buttonLength;
public FlatScrollBar( final Composite parent, int style ) {
this( parent, style, DEFAULT_BUTTON_LENGTH, DEFAULT_MAX_EXPANSION );
}
FlatScrollBar( Composite parent, int style, int buttonLength, int maxExpansion ) {
super( parent, SWT.NONE );
super.setLayout( new FlatScrollBarLayout( getDirection( style ) ) );
this.minimum = DEFAULT_MINIMUM;
this.maximum = DEFAULT_MAXIMUM;
this.increment = DEFAULT_INCREMENT;
this.pageIncrement = DEFAULT_PAGE_INCREMENT;
this.thumb = DEFAULT_THUMB;
this.selection = DEFAULT_SELECTION;
this.buttonLength = buttonLength;
this.direction = getDirection( style );
this.direction.setDefaultSize( this );
this.up = new ClickControl( this, new Decrementer( this ), maxExpansion );
this.upFast = new ClickControl( this, new FastDecrementer( this ), maxExpansion );
this.drag = new DragControl( this, new DragShifter( this, buttonLength ), maxExpansion );
this.downFast = new ClickControl( this, new FastIncrementer( this ), maxExpansion );
this.down = new ClickControl( this, new Incrementer( this ), maxExpansion );
this.mouseWheelHandler = new MouseWheelShifter( this, parent, buttonLength );
this.listeners = new HashSet<SelectionListener>();
addMouseTrackListener( new MouseTracker( this, maxExpansion ) );
addControlListener( new ResizeObserver( this ) );
setDefaultColorScheme();
}
@Override
public void setLayout( Layout layout ) {
throw new UnsupportedOperationException( FlatScrollBar.class.getName() + " does not allow to change layout." );
};
@Override
public int getStyle() {
return direction != null ? super.getStyle() | direction.value() : super.getStyle();
};
Direction getDirection() {
return direction;
}
public void setMinimum( int minimum ) {
if( this.minimum != minimum && minimum >= 0 && minimum < maximum ) {
this.minimum = minimum;
adjustThumb();
adjustSelection();
layout();
}
}
public int getMinimum() {
return minimum;
}
public void setMaximum( int maximum ) {
if( this.maximum != maximum && maximum >= 0 && maximum > minimum ) {
this.maximum = maximum;
adjustThumb();
adjustSelection();
layout();
}
}
public int getMaximum() {
return maximum;
}
public void setThumb( int thumb ) {
if( this.thumb != thumb && thumb >= 1 ) {
this.thumb = thumb;
adjustThumb();
adjustSelection();
layout();
}
}
public int getThumb() {
return thumb;
}
public void setIncrement( int increment ) {
if( this.increment != increment ) {
this.increment = increment;
layout();
}
}
public int getIncrement() {
return increment;
}
public void setPageIncrement( int pageIncrement ) {
this.pageIncrement = pageIncrement;
}
public int getPageIncrement() {
return pageIncrement;
}
public void setSelection( int selection ) {
if( !onDrag ) {
updateSelection( selection );
}
}
public int getSelection() {
return selection;
}
public void addSelectionListener( SelectionListener selectionListener ) {
listeners.add( selectionListener );
}
public void removeSelectionListener( SelectionListener selectionListener ) {
listeners.remove( selectionListener );
}
@Override
public void addListener( int eventType, final Listener listener ) {
if( eventType == SWT.Selection ) {
addSelectionListener( new UntypedSelectionAdapter( listener ) );
} else {
super.addListener( eventType, listener );
}
}
@Override
public void removeListener( int eventType, Listener listener ) {
if( eventType == SWT.Selection ) {
removeSelectionListener( lookup( listeners, listener ) );
} else {
super.removeListener( eventType, listener );
}
}
@Override
public void layout() {
direction.layout( this, buttonLength );
update();
}
public void setIncrementButtonLength( int length ) {
this.buttonLength = length;
layout();
}
public int getIncrementButtonLength() {
return buttonLength;
}
public void setIncrementColor( Color color ) {
up.setForeground( color );
down.setForeground( color );
}
public Color getIncrementColor() {
return up.getForeground();
}
public void setPageIncrementColor( Color color ) {
upFast.setForeground( color );
downFast.setForeground( color );
}
public Color getPageIncrementColor() {
return upFast.getForeground();
}
public void setThumbColor( Color color ) {
drag.setForeground( color );
}
public Color getThumbColor() {
return drag.getForeground();
}
@Override
public void setBackground( Color color ) {
up.setBackground( color );
upFast.setBackground( color );
drag.setBackground( color );
downFast.setBackground( color );
down.setBackground( color );
super.setBackground( color );
}
protected void setSelectionInternal( int selection, int detail ) {
int oldSelection = this.selection;
updateSelection( selection );
if( oldSelection != this.selection ) {
notifyListeners( detail );
}
}
private void updateSelection( int selection ) {
if( this.selection != selection ) {
this.selection = selection;
adjustSelection();
layout();
}
}
public void notifyListeners( int detail ) {
updateOnDrag( detail );
SelectionEvent selectionEvent = createEvent( detail );
for( SelectionListener listener : listeners ) {
listener.widgetSelected( selectionEvent );
}
}
private void updateOnDrag( int detail ) {
onDrag = ( onDrag || ( SWT.DRAG & detail ) > 0 ) && ( SWT.NONE != detail );
}
private SelectionEvent createEvent( int detail ) {
Event event = new Event();
event.widget = this;
event.detail = detail;
return new SelectionEvent( event );
}
private void adjustThumb() {
if( thumb > maximum - minimum ) {
thumb = Math.min( maximum - minimum, thumb );
thumb = Math.max( 1, thumb );
}
}
private void adjustSelection() {
selection = Math.min( selection, maximum - thumb );
selection = Math.max( selection, minimum );
}
private static Direction getDirection( int style ) {
return ( style & SWT.HORIZONTAL ) > 0 ? Direction.HORIZONTAL : Direction.VERTICAL;
}
private void setDefaultColorScheme() {
up.setForeground( Display.getCurrent().getSystemColor( SWT.COLOR_WIDGET_NORMAL_SHADOW ) );
upFast.setForeground( Display.getCurrent().getSystemColor( SWT.COLOR_WIDGET_BACKGROUND ) );
drag.setForeground( Display.getCurrent().getSystemColor( SWT.COLOR_WIDGET_FOREGROUND ) );
downFast.setForeground( Display.getCurrent().getSystemColor( SWT.COLOR_WIDGET_BACKGROUND ) );
down.setForeground( Display.getCurrent().getSystemColor( SWT.COLOR_WIDGET_NORMAL_SHADOW ) );
setBackground( getBackground() );
}
}