blob: 341fcaff486ab123cf7651133562feb66f0dcac3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005 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.bpel.common.ui.tray;
import org.eclipse.bpel.common.ui.CommonUIPlugin;
import org.eclipse.bpel.common.ui.ICommonUIConstants;
import org.eclipse.bpel.common.ui.details.IDetailsColors;
import org.eclipse.draw2d.ActionEvent;
import org.eclipse.draw2d.ActionListener;
import org.eclipse.draw2d.Button;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.Cursors;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.ImageFigure;
import org.eclipse.draw2d.LightweightSystem;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseTrackAdapter;
import org.eclipse.swt.events.MouseTrackListener;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
public class TraySash extends Composite {
protected static final Image ARROW_LEFT = CommonUIPlugin.getDefault().getImageRegistry().get(ICommonUIConstants.ICON_KEY_TRAY_EXPAND_BUTTON);
protected static final Image ARROW_RIGHT = CommonUIPlugin.getDefault().getImageRegistry().get(ICommonUIConstants.ICON_KEY_TRAY_COLLAPSE_BUTTON);
protected static final Point TEXTURE_SIZE = new Point(15, 50);
protected static final int TEXTURE_SPACING = 4;
protected class TrayTextureCanvas extends Canvas {
protected final int MAX_ROWS = (TEXTURE_SIZE.y / TEXTURE_SPACING);
protected final int MAX_COLUMNS = 2;
public TrayTextureCanvas(Composite parent, int style) {
super(parent, SWT.NO_REDRAW_RESIZE | style);
setBackground(CommonUIPlugin.getDefault().getColorRegistry().get(IDetailsColors.COLOR_LIGHT_BACKGROUND));
addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
int y;
int height = getBounds().height;
int textureHeight = MAX_ROWS * TEXTURE_SPACING;
int availableHeight = height - textureHeight;
int imageHeight = 66;
if (isTop()) {
y = Math.min(0, (availableHeight - imageHeight));
} else {
y = Math.max(textureHeight, (height - imageHeight));
}
// paint texture background
e.gc.setBackground(CommonUIPlugin.getDefault().getColorRegistry().get(IDetailsColors.COLOR_LIGHT_BACKGROUND));
if (isTop()) {
e.gc.fillRectangle(0, (y + imageHeight), getBounds().width, getBounds().height);
} else {
e.gc.fillRectangle(0, 0, getBounds().width, y);
}
// paint texture
y = 0;
if (isTop()) {
y = getBounds().height;
}
for(int i = 0; i < MAX_ROWS; i++) {
int x = (TEXTURE_SIZE.x - ((TEXTURE_SPACING-1) * MAX_COLUMNS)) / 2;
for(int j = 0; j < MAX_COLUMNS; j++) {
e.gc.setForeground(CommonUIPlugin.getDefault().getColorRegistry().get(IDetailsColors.COLOR_DARK_SHADOW));
e.gc.drawLine(x, y, x, y+1);
e.gc.setForeground(CommonUIPlugin.getDefault().getColorRegistry().get(IDetailsColors.COLOR_CANVAS));
e.gc.drawLine(x+1, y, x+1, y+1);
x += TEXTURE_SPACING;
}
if (isTop()) {
y -= TEXTURE_SPACING;
} else {
y += TEXTURE_SPACING;
}
}
}
protected boolean isTop() {
return (getStyle() & SWT.TOP) != 0;
}
});
}
@Override
public Point computeSize(int wHint, int hHint, boolean changed) {
return TEXTURE_SIZE;
}
}
protected class TrayButtonCanvas extends Canvas {
protected class TrayArrowButton extends Button {
public TrayArrowButton() {
super(getButtonImage());
setBorder(null);
setRolloverEnabled(true);
addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
if (trayComposite.isInState(TrayComposite.STATE_COLLAPSED)) {
trayComposite.setState(TrayComposite.STATE_EXPANDED);
} else {
trayComposite.setState(TrayComposite.STATE_COLLAPSED);
}
}
});
trayComposite.addListener(TrayComposite.EVENT_COLLAPSED_STATE_CHANGED, new Listener() {
public void handleEvent(Event event) {
setContents(new ImageFigure(getButtonImage()));
}
});
}
@Override
protected void paintBorder(Graphics graphics) {
if (hasFocus()) {
graphics.setForegroundColor(ColorConstants.black);
graphics.setBackgroundColor(ColorConstants.white);
org.eclipse.draw2d.geometry.Rectangle area = getClientArea();
graphics.drawFocus(area.x, area.y, area.width - 1, area.height - 1);
}
}
}
protected LightweightSystem lws;
public TrayButtonCanvas(Composite parent) {
super(parent, SWT.NO_REDRAW_RESIZE);
setCursor(Cursors.ARROW);
lws = new LightweightSystem();
lws.setControl(this);
lws.setContents(new TrayArrowButton());
}
@Override
public Point computeSize(int wHint, int hHint, boolean changed) {
Dimension size = lws.getRootFigure().getPreferredSize(wHint, hHint);
size.union(new Dimension(wHint, hHint));
return new Point(size.width, size.height * 2);
}
private Image getButtonImage() {
return trayComposite.isInState(TrayComposite.STATE_COLLAPSED) ? ARROW_LEFT : ARROW_RIGHT;
}
}
protected TrayComposite trayComposite;
public TraySash(TrayComposite composite, Composite parent, int style) {
super(parent, SWT.NONE);
this.trayComposite = composite;
setBackground(CommonUIPlugin.getDefault().getColorRegistry().get(IDetailsColors.COLOR_TRAY_BACKGROUND));
GridLayout layout = new GridLayout(1, false);
layout.marginWidth = 3;
layout.marginHeight = 0;
layout.horizontalSpacing = 0;
layout.verticalSpacing = 0;
setLayout(layout);
Control topTexture = new TrayTextureCanvas(this, SWT.TOP);
Control button = new TrayButtonCanvas(this);
Control bottomTexture = new TrayTextureCanvas(this, SWT.BOTTOM);
topTexture.setLayoutData(new GridData(GridData.BEGINNING | GridData.FILL_BOTH));
button.setLayoutData(new GridData(GridData.CENTER | GridData.FILL_HORIZONTAL));
bottomTexture.setLayoutData(new GridData(GridData.END | GridData.FILL_BOTH));
// add listeners
MouseTrackListener listener = new MouseTrackAdapter() {
@Override
public void mouseEnter(MouseEvent e) {
if (TraySash.this.trayComposite.isInState(TrayComposite.STATE_EXPANDED))
setCursor(Cursors.SIZEWE);
}
@Override
public void mouseExit(MouseEvent e) {
if (TraySash.this.trayComposite.isInState(TrayComposite.STATE_EXPANDED))
setCursor(Cursors.ARROW);
}
};
addMouseTrackListener(listener);
topTexture.addMouseTrackListener(listener);
bottomTexture.addMouseTrackListener(listener);
TrayComposite.ResizeListener resizeListener = trayComposite.new ResizeListener();
addMouseListener(resizeListener);
addMouseMoveListener(resizeListener);
topTexture.addMouseListener(resizeListener);
topTexture.addMouseMoveListener(resizeListener);
bottomTexture.addMouseListener(resizeListener);
bottomTexture.addMouseMoveListener(resizeListener);
addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
e.gc.setForeground(CommonUIPlugin.getDefault().getColorRegistry().get(IDetailsColors.COLOR_DARK_SHADOW));
e.gc.drawLine(0, 0, 0, getBounds().height);
}
});
}
}