/******************************************************************************* * 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.core.runtime.Assert; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseMoveListener; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.FillLayout; 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 TrayComposite extends SashForm { private static final int DEFAULT_TRAY_WIDTH = 92; public static final int EVENT_COLLAPSED_STATE_CHANGED = 9999999; public static final int STATE_EXPANDED = 1; public static final int STATE_COLLAPSED = 2; public int marginHeight = 0; public int marginWidth = 0; protected Composite editorControl; protected TraySash sashControl; protected Control trayControl; protected int trayState; protected int trayWidth; public class ResizeListener extends MouseAdapter implements MouseMoveListener { protected boolean dragging = false; protected boolean correctState = false; protected int origX; @Override public void mouseDown(MouseEvent me) { if (me.button != 1) return; dragging = true; correctState = isInState(STATE_EXPANDED); origX = me.x; } public void mouseMove(MouseEvent me) { if (dragging && correctState) { int shiftAmount = me.x - origX; int newWidth = trayWidth - shiftAmount; Point minSize = trayControl.computeSize(SWT.DEFAULT, SWT.DEFAULT); Point maxSize = TrayComposite.this.getSize(); if (newWidth >= minSize.x && newWidth <= (maxSize.x / 2)) { setTrayWidth(newWidth); } } } @Override public void mouseUp(MouseEvent me) { dragging = false; correctState = false; } } /** * @param parent * @param style */ public TrayComposite(Composite parent, int style) { super(parent, style | SWT.HORIZONTAL); editorControl = new Composite(this, SWT.NONE); editorControl.setLayout(new FillLayout()); sashControl = new TraySash(this, this, SWT.VERTICAL); setState(STATE_COLLAPSED); setTrayWidth(DEFAULT_TRAY_WIDTH); addListener(SWT.Resize, new Listener() { public void handleEvent(Event event) { layout(); } }); } public Composite getEditorComposite() { return editorControl; } /** * set the tray composite * @param trayControl */ public void setTrayControl(Control trayControl) { Assert.isTrue(trayControl.getParent() == this); this.trayControl = trayControl; } protected boolean isInState(int state) { return (trayState & state) != 0; } /** * Sets the tray state to either STATE_EXPANDED or STATE_COLLAPSED. */ public void setState(int trayState) { if (this.trayState != trayState) { this.trayState = trayState; Event event = new Event(); event.type = EVENT_COLLAPSED_STATE_CHANGED; notifyListeners(EVENT_COLLAPSED_STATE_CHANGED, event); layout(); } } public void setTrayWidth(int width) { if (trayWidth != width) { trayWidth = width; layout(); } } @Override public void layout(boolean changed) { if (editorControl == null || editorControl.isDisposed() || trayControl == null || trayControl.isDisposed()) return; Rectangle area = getClientArea(); if (area.width == 0 || area.height == 0) return; setRedraw(false); if (isInState(STATE_COLLAPSED)) { int titleWidth = sashControl.computeSize(-1, -1).x; editorControl.setBounds(area.x, area.y, area.width - titleWidth, area.height); sashControl.setBounds(area.x + area.width - titleWidth, area.y, titleWidth, area.height); trayControl.setVisible(false); } else if (isInState(STATE_EXPANDED)) { int titleWidth = sashControl.computeSize(-1, -1).x; if (changed) { int editorWeight = area.width - titleWidth - trayWidth; int sashWeight = titleWidth >= 0 ? titleWidth : 0; int trayWeight = trayWidth >= 0 ? trayWidth : 0; if (editorWeight < 0) { editorWeight = 0; } setWeights(new int[] {editorWeight, sashWeight, trayWeight}); } editorControl.setBounds(area.x, area.y, area.width - titleWidth - trayWidth, area.height); sashControl.setBounds(area.x + area.width - titleWidth - trayWidth, area.y, titleWidth, area.height); trayControl.setBounds(area.x + area.width - trayWidth, area.y, trayWidth, area.height); trayControl.setVisible(true); } sashControl.layout(true); setRedraw(true); update(); } /* (non-Javadoc) * @see org.eclipse.swt.widgets.Scrollable#getClientArea() */ @Override public Rectangle getClientArea() { Rectangle rect = super.getClientArea(); rect.x += marginWidth; rect.y += marginHeight; rect.width -= marginWidth * 2; rect.height -= marginHeight * 2; return rect; } }