blob: 596e05a1d731ebe7bfc3d6af4e1be088138d9ece [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2010 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.gef.internal.ui.palette.editparts;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.PaletteData;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Display;
import org.eclipse.draw2d.Clickable;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.RangeModel;
import org.eclipse.draw2d.ScrollBar;
import org.eclipse.draw2d.ScrollBarLayout;
import org.eclipse.draw2d.Toggle;
import org.eclipse.draw2d.TreeSearch;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Insets;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.PointList;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.draw2d.rap.swt.SWT;
import org.eclipse.gef.internal.ui.palette.PaletteColorUtil;
public final class PaletteScrollBar extends ScrollBar {
private static final PointList OUTER_DOWN_TRIANGLE = new PointList(3);
private static final PointList INNER_DOWN_TRIANGLE = new PointList(3);
private static final PointList OUTER_UP_TRIANGLE = new PointList(3);
private static final PointList INNER_UP_TRIANGLE = new PointList(3);
public static final int BUTTON_HEIGHT = 7;
private static final int BUTTON_WIDTH = 76;
private static final int SCROLL_TIME = 200;
private static final Image TRANSPARENCY;
static {
Display display = Display.getCurrent();
PaletteData pData = new PaletteData(0xFF, 0xFF00, 0xFF0000);
RGB rgb = display.getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW)
.getRGB();
int fillColor = pData.getPixel(rgb);
ImageData iData = new ImageData(1, 1, 24, pData);
iData.setPixel(0, 0, fillColor);
iData.setAlpha(0, 0, 200);
TRANSPARENCY = new Image(display, iData);
OUTER_DOWN_TRIANGLE.addPoint(new Point(34, 2));
OUTER_DOWN_TRIANGLE.addPoint(new Point(38, 6));
OUTER_DOWN_TRIANGLE.addPoint(new Point(42, 2));
INNER_DOWN_TRIANGLE.addPoint(new Point(35, 2));
INNER_DOWN_TRIANGLE.addPoint(new Point(37, 5));
INNER_DOWN_TRIANGLE.addPoint(new Point(41, 2));
OUTER_UP_TRIANGLE.addPoint(new Point(33, 5));
OUTER_UP_TRIANGLE.addPoint(new Point(38, 0));
OUTER_UP_TRIANGLE.addPoint(new Point(42, 5));
INNER_UP_TRIANGLE.addPoint(new Point(34, 5));
INNER_UP_TRIANGLE.addPoint(new Point(38, 1));
INNER_UP_TRIANGLE.addPoint(new Point(42, 5));
}
protected Label downLabel;
protected Label upLabel;
public PaletteScrollBar() {
super();
}
public boolean containsPoint(int x, int y) {
return findDescendantAtExcluding(x, y, IdentitySearch.INSTANCE) != null;
}
protected Clickable createDefaultDownButton() {
return createTransparentArrowButton(true);
}
protected Clickable createDefaultUpButton() {
return createTransparentArrowButton(false);
}
/**
* Creates the figure used for the scrollbar button.
*
* @param down
* true if the arrow should be pointing down; false, if it should
* be pointing up.
* @return a new <code>Toggle</code> figure for the scroll bar button
*/
private Toggle createTransparentArrowButton(final boolean down) {
Toggle button = new Toggle() {
protected void paintFigure(Graphics g) {
// paint background
if (!getModel().isMouseOver())
g.drawImage(TRANSPARENCY, new Rectangle(0, 0, 1, 1),
getBounds());
else {
g.setBackgroundColor(getModel().isArmed() ? PaletteColorUtil
.getSelectedColor() : PaletteColorUtil
.getHoverColor());
g.fillRectangle(getBounds());
}
// paint triangle
g.translate(getLocation());
PointList outerPoints = transpose(down ? OUTER_DOWN_TRIANGLE
: OUTER_UP_TRIANGLE);
PointList innerPoints = transpose(down ? INNER_DOWN_TRIANGLE
: INNER_UP_TRIANGLE);
g.setBackgroundColor(PaletteColorUtil.WIDGET_LIST_BACKGROUND);
g.fillPolygon(outerPoints);
g.setBackgroundColor(PaletteColorUtil.WIDGET_DARK_SHADOW);
g.fillPolygon(innerPoints);
g.translate(getLocation().getNegated());
}
};
button.setRolloverEnabled(true);
button.setRequestFocusEnabled(false);
return button;
}
/**
* Transposes a list of points using the <code>transposer</code>.
*
* @param origPoints
* the original list of points
* @return a new list of transposed points
*/
private PointList transpose(PointList origPoints) {
PointList transposedPoints = new PointList(origPoints.size());
for (int i = 0; i < origPoints.size(); i++) {
transposedPoints.addPoint(transposer.t(origPoints.getPoint(i)));
}
return transposedPoints;
}
public IFigure findFigureAt(int x, int y, TreeSearch search) {
IFigure result = super.findFigureAt(x, y, search);
if (result != this)
return result;
return null;
}
public Dimension getPreferredSize(int wHint, int hHint) {
return new Dimension(wHint, hHint);
}
protected void initialize() {
super.initialize();
setLayoutManager(new ScrollBarLayout(transposer) {
protected Rectangle layoutButtons(ScrollBar scrollBar) {
Rectangle bounds = transposer.t(scrollBar.getClientArea());
Dimension buttonSize = new Dimension(BUTTON_WIDTH,
BUTTON_HEIGHT);
getButtonUp().setBounds(
transposer.t(new Rectangle(bounds.getTop()
.getTranslated(-(buttonSize.width / 2), 0),
buttonSize)));
Rectangle r = new Rectangle(bounds.getBottom().getTranslated(
-(buttonSize.width / 2), -buttonSize.height),
buttonSize);
getButtonDown().setBounds(transposer.t(r));
Rectangle trackBounds = bounds.getCropped(new Insets(
buttonSize.height, 0, buttonSize.height, 0));
RangeModel model = scrollBar.getRangeModel();
getButtonUp()
.setVisible(model.getValue() != model.getMinimum());
getButtonDown().setVisible(
model.getValue() != model.getMaximum()
- model.getExtent());
return trackBounds;
}
});
setPageUp(null);
setPageDown(null);
setThumb(null);
setOpaque(false);
}
protected void stepDown() {
timedStep(false);
}
protected void stepUp() {
timedStep(true);
}
protected void timedStep(boolean up) {
int increment = Math.max(getExtent() * 1 / 2, getStepIncrement());
int value = getValue();
long startTime = System.currentTimeMillis();
long elapsedTime = System.currentTimeMillis() - startTime;
while (elapsedTime < SCROLL_TIME) {
int step = (int) (increment * elapsedTime / SCROLL_TIME);
step = up ? value - step : value + step;
setValue(step);
getUpdateManager().performUpdate();
elapsedTime = System.currentTimeMillis() - startTime;
}
}
protected void updateDownLabel() {
getButtonDown().setVisible(getValue() < (getMaximum() - getExtent()));
}
protected void updateUpLabel() {
getButtonUp().setVisible(getValue() > getMinimum());
}
}