/*******************************************************************************
* Copyright (c) 2009 Paul VanderLei, Simon Archer, Jeff McAffer and others. All
* rights reserved. This program and the accompanying materials are made
* available under the terms of the Eclipse Public License v1.0 and Eclipse
* Distribution License v1.0 which accompanies this distribution. The Eclipse
* Public License is available at http://www.eclipse.org/legal/epl-v10.html and
* the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors: Paul VanderLei, Simon Archer, Jeff McAffer - initial API and
* implementation
*******************************************************************************/
package org.eclipse.examples.toast.crust.widgets;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.graphics.Region;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
public class ImageSlider extends Canvas {
private Image image;
private Image sliderImage;
private int selection;
private int privateStyle;
private int minimum;
private int maximum;
public ImageSlider(Composite parent, int style) {
super(parent, checkStyle(style));
privateStyle = checkPrivateStyle(style);
addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
ImageSlider.this.widgetDisposed(e);
}
});
addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
ImageSlider.this.paintControl(e);
}
});
selection = 0;
minimum = 0;
maximum = 100;
}
public void setSelection(int selection) {
if (selection < minimum)
this.selection = minimum;
else if (selection > maximum)
this.selection = maximum;
else
this.selection = selection;
redraw();
}
public int getSelection() {
return selection;
}
private void paintControl(PaintEvent e) {
GC gc = e.gc;
Rectangle size = getBounds();
if (image != null) {
Rectangle iSize = image.getBounds();
int widthOffset = computeOffset(size.width, iSize.width);
int heightOffset = computeOffset(size.height, iSize.height);
gc.drawImage(image, widthOffset, heightOffset);
}
if (sliderImage != null) {
Rectangle sSize = sliderImage.getBounds();
int percent = ((selection - minimum) * 100) / maximum;
int style = privateStyle;
int widthOffset;
int heightOffset;
if ((style & SWT.HORIZONTAL) != 0) {
heightOffset = computeOffset(size.height, sSize.height);
if ((style & SWT.RIGHT_TO_LEFT) != 0)
percent = 100 - percent;
widthOffset = (size.width * percent) / 100 - sSize.width / 2;
} else {
widthOffset = computeOffset(size.width, sSize.width);
if ((style & SWT.UP) != 0)
percent = 100 - percent;
heightOffset = (size.height * percent) / 100 - sSize.height / 2;
}
gc.drawImage(sliderImage, widthOffset, heightOffset);
}
}
private int computeOffset(int i, int j) {
if (j >= i)
return 0;
else
return (i - j) / 2;
}
private void widgetDisposed(DisposeEvent e) {
Region region = getRegion();
if (region != null)
region.dispose();
}
public void setImages(Image image, Image sliderImage) {
this.image = image;
this.sliderImage = sliderImage;
redraw();
}
public Image[] getImages() {
return (new Image[] {image, sliderImage});
}
public int getMinimum() {
return minimum;
}
public void setMinimum(int minimum) {
if (minimum < 0) {
return;
} else {
this.minimum = minimum;
redraw();
return;
}
}
public int getMaximum() {
return maximum;
}
public void setMaximum(int maximum) {
if ((maximum < 0) | (maximum < minimum)) {
return;
} else {
this.maximum = maximum;
redraw();
return;
}
}
private static int checkStyle(int style) {
// SWT.HORIZONTAL and SWT.VERTICAL cause scroll bars which we don't want
// so eliminate them
style |= SWT.NO_FOCUS;
int mask = SWT.HORIZONTAL | SWT.VERTICAL | SWT.LEFT_TO_RIGHT | SWT.RIGHT_TO_LEFT | SWT.UP | SWT.DOWN;
return style & ~mask;
}
private int checkBits(int style, int int0, int int1) {
int mask = int0 | int1;
if ((style & mask) == 0)
style |= int0;
if ((style & int0) != 0)
style = style & ~mask | int0;
if ((style & int1) != 0)
style = style & ~mask | int1;
return style;
}
private int checkPrivateStyle(int style) {
style = checkBits(style, SWT.HORIZONTAL, SWT.VERTICAL);
if ((style & SWT.HORIZONTAL) != 0) {
return checkBits(style, SWT.LEFT_TO_RIGHT, SWT.RIGHT_TO_LEFT);
}
if ((style & SWT.VERTICAL) != 0) {
return checkBits(style, SWT.UP, SWT.DOWN);
}
return style;
}
}