blob: 512738ca42065647ecd09efaf5a0814fb7fc9def [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.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;
}
}