| /******************************************************************************* |
| * 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); |
| } |
| }); |
| } |
| } |