?? cbanner.java
字號:
/******************************************************************************* * Copyright (c) 2000, 2004 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/package org.eclipse.swt.custom;import org.eclipse.swt.graphics.*;import org.eclipse.swt.widgets.*;import org.eclipse.swt.*;/** * Instances of this class implement a Composite that lays out its * children and allows programmatic control of the layout. It draws * a separator between the left and right children which can be dragged * to resize the right control. * CBanner is used in the workbench to layout the toolbar area and * perspective switching toolbar at the top of the workbench. * <p> * Note that although this class is a subclass of <code>Composite</code>, * it does not make sense to set a layout on it. * </p><p> * <dl> * <dt><b>Styles:</b></dt> * <dd>NONE</dd> * <dt><b>Events:</b></dt> * <dd>(None)</dd> * </dl> * <p> * IMPORTANT: This class is <em>not</em> intended to be subclassed. * </p> * * @since 3.0 */public class CBanner extends Composite { Control left; Control right; Control bottom; boolean simple = true; int[] curve; int curveStart = 0; Rectangle curveRect = new Rectangle(0, 0, 0, 0); int curve_width = 5; int curve_indent = -2; int rightWidth = SWT.DEFAULT; Cursor resizeCursor; boolean dragging = false; int rightDragDisplacement = 0; static final int OFFSCREEN = -200; static final int BORDER_BOTTOM = 2; static final int BORDER_TOP = 3; static final int BORDER_STRIPE = 1; static final int CURVE_TAIL = 200; static final int BEZIER_RIGHT = 30; static final int BEZIER_LEFT = 30; static final int MIN_LEFT = 10; static final int MIN_RIGHT = 160; static int BORDER1 = SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW; /** * Constructs a new instance of this class given its parent * and a style value describing its behavior and appearance. * <p> * The style value is either one of the style constants defined in * class <code>SWT</code> which is applicable to instances of this * class, or must be built by <em>bitwise OR</em>'ing together * (that is, using the <code>int</code> "|" operator) two or more * of those <code>SWT</code> style constants. The class description * lists the style constants that are applicable to the class. * Style bits are also inherited from superclasses. * </p> * * @param parent a widget which will be the parent of the new instance (cannot be null) * @param style the style of widget to construct * * @exception IllegalArgumentException <ul> * <li>ERROR_NULL_ARGUMENT - if the parent is null</li> * </ul> * @exception SWTException <ul> * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent</li> * </ul> * */public CBanner(Composite parent, int style) { super(parent, checkStyle(style)); resizeCursor = new Cursor(getDisplay(), SWT.CURSOR_SIZEWE); Listener listener = new Listener() { public void handleEvent(Event e) { switch (e.type) { case SWT.Dispose: onDispose(); break; case SWT.MouseDown: onMouseDown (e.x, e.y); break; case SWT.MouseExit: onMouseExit(); break; case SWT.MouseMove: onMouseMove(e.x, e.y); break; case SWT.MouseUp: onMouseUp(); break; case SWT.Paint: onPaint(e.gc); break; case SWT.Resize: onResize(); break; } } }; int[] events = new int[] {SWT.Dispose, SWT.MouseDown, SWT.MouseExit, SWT.MouseMove, SWT.MouseUp, SWT.Paint, SWT.Resize}; for (int i = 0; i < events.length; i++) { addListener(events[i], listener); }}static int[] bezier(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3, int count) { // The parametric equations for a Bezier curve for x[t] and y[t] where 0 <= t <=1 are: // x[t] = x0+3(x1-x0)t+3(x0+x2-2x1)t^3+(x3-x0+3x1-3x2)t^3 // y[t] = y0+3(y1-y0)t+3(y0+y2-2y1)t^2+(y3-y0+3y1-3y2)t^3 double a0 = x0; double a1 = 3*(x1 - x0); double a2 = 3*(x0 + x2 - 2*x1); double a3 = x3 - x0 + 3*x1 - 3*x2; double b0 = y0; double b1 = 3*(y1 - y0); double b2 = 3*(y0 + y2 - 2*y1); double b3 = y3 - y0 + 3*y1 - 3*y2; int[] polygon = new int[2*count + 2]; for (int i = 0; i <= count; i++) { double t = (double)i / (double)count; polygon[2*i] = (int)(a0 + a1*t + a2*t*t + a3*t*t*t); polygon[2*i + 1] = (int)(b0 + b1*t + b2*t*t + b3*t*t*t); } return polygon;}static int checkStyle (int style) { return SWT.NONE;}public Point computeSize(int wHint, int hHint, boolean changed) { checkWidget(); boolean showCurve = left != null && right != null; int height = hHint; int width = wHint; Point bottomSize = new Point(0, 0); if (bottom != null) { Point trim = bottom.computeSize(width, SWT.DEFAULT); trim.x = trim.x - width; bottomSize = bottom.computeSize(width == SWT.DEFAULT ? SWT.DEFAULT : width - trim.x, SWT.DEFAULT); if (height != SWT.DEFAULT) { bottomSize.y = Math.min(bottomSize.y, height); height -= bottomSize.y + BORDER_TOP + BORDER_STRIPE + BORDER_BOTTOM; } } if (showCurve && height != SWT.DEFAULT ) height -= BORDER_TOP + BORDER_BOTTOM + 2*BORDER_STRIPE; Point rightSize = new Point(0, 0); if (right != null) { Point trim = right.computeSize(rightWidth, height); trim.x = trim.x - rightWidth; rightSize = right.computeSize(rightWidth == SWT.DEFAULT ? SWT.DEFAULT : rightWidth - trim.x, rightWidth == SWT.DEFAULT ? SWT.DEFAULT : height); if (width != SWT.DEFAULT) { rightSize.x = Math.min(rightSize.x, width); width -= rightSize.x + curve_width - 2* curve_indent; width = Math.max(width, MIN_LEFT); } } Point leftSize = new Point(0, 0); if (left != null) { Point trim = left.computeSize(width, SWT.DEFAULT); trim.x = trim.x - width; leftSize = left.computeSize(width == SWT.DEFAULT ? SWT.DEFAULT : width - trim.x, SWT.DEFAULT); } int w = 0, h = 0; h += bottomSize.y; if (bottom != null && (left != null || right != null)) h += BORDER_TOP + BORDER_BOTTOM + BORDER_STRIPE; w += leftSize.x + rightSize.x; if (showCurve) { w += curve_width - 2*curve_indent; h += BORDER_TOP + BORDER_BOTTOM + 2*BORDER_STRIPE; } h += left != null ? leftSize.y : rightSize.y; if (wHint != SWT.DEFAULT) w = wHint; if (hHint != SWT.DEFAULT) h = hHint; return new Point(w, h);}public Rectangle computeTrim (int x, int y, int width, int height) { checkWidget (); return new Rectangle(x, y, width, height);}/*** Returns the Control that appears on the bottom side of the banner.* * @return the control that appears on the bottom side of the banner or null* * @exception SWTException <ul>* <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>* <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>* </ul>* * @since 3.0*/public Control getBottom() { checkWidget(); return bottom;}public Rectangle getClientArea() { return new Rectangle(0, 0, 0, 0);}/*** Returns the Control that appears on the left side of the banner.* * @return the control that appears on the left side of the banner or null* * @exception SWTException <ul>* <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>* <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>* </ul>* * @since 3.0*/public Control getLeft() { checkWidget(); return left;}/*** Returns the Control that appears on the right side of the banner.* * @return the control that appears on the right side of the banner or null* * @exception SWTException <ul>* <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>* <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>* </ul>* * @since 3.0*/public Control getRight() { checkWidget(); return right;}/** * Returns the width of the control that appears on the right of the banner. * * @return the width of the control that appears on the right of the banner * * @since 3.0 */public int getRightWidth() { checkWidget(); if (right == null) return 0; if (rightWidth == SWT.DEFAULT) return right.computeSize(SWT.DEFAULT, getSize().y).x; return rightWidth;}/** * Returns <code>true</code> if the CBanner is rendered * with a simple, traditional shape. * * @return <code>true</code> if the Cbanner is rendered with a simple shape * * @since 3.0 */public boolean getSimple() { checkWidget(); return simple;}public void layout (boolean changed) { checkWidget(); Point size = getSize(); boolean showCurve = left != null && right != null; int width = size.x; int height = size.y; Point bottomSize = new Point(0, 0); if (bottom != null) { Point trim = bottom.computeSize(width, SWT.DEFAULT); trim.x = trim.x - width; bottomSize = bottom.computeSize(width - trim.x, SWT.DEFAULT); bottomSize.y = Math.min(bottomSize.y, height); height -= bottomSize.y + BORDER_TOP + BORDER_BOTTOM + BORDER_STRIPE; } if (showCurve) height -= BORDER_TOP + BORDER_BOTTOM + 2*BORDER_STRIPE; height = Math.max(0, height); Point rightSize = new Point(0,0); if (right != null) { Point trim = right.computeSize(rightWidth, height); trim.x = trim.x - rightWidth; rightSize = right.computeSize(rightWidth == SWT.DEFAULT ? SWT.DEFAULT : rightWidth - trim.x, rightWidth == SWT.DEFAULT ? SWT.DEFAULT : height); rightSize.x = Math.min(rightSize.x, width); width -= rightSize.x + curve_width - 2*curve_indent; width = Math.max(width, MIN_LEFT); }
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -