# HG changeset patch # User Frank Benoit # Date 1200623251 -3600 # Node ID 0b1b010f772cb794730067cd0547c6491f5d8351 # Parent 3ec1765539d0b770953ef7df961be4bde694d8bb ControlEditor diff -r 3ec1765539d0 -r 0b1b010f772c dwt/custom/ControlEditor.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dwt/custom/ControlEditor.d Fri Jan 18 03:27:31 2008 +0100 @@ -0,0 +1,258 @@ +/******************************************************************************* + * Copyright (c) 2000, 2007 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 + *******************************************************************************/ +module dwt.custom.ControlEditor; + + + +import dwt.DWT; +import dwt.graphics.Rectangle; +import dwt.widgets.Composite; +import dwt.widgets.Control; +import dwt.widgets.Event; +import dwt.widgets.Listener; +import dwt.widgets.ScrollBar; + +/** +* +* A ControlEditor is a manager for a Control that appears above a composite and tracks with the +* moving and resizing of that composite. It can be used to display one control above +* another control. This could be used when editing a control that does not have editing +* capabilities by using a text editor or for launching a dialog by placing a button +* above a control. +* +*

Here is an example of using a ControlEditor: +* +*

+* Canvas canvas = new Canvas(shell, DWT.BORDER);
+* canvas.setBounds(10, 10, 300, 300);
+* Color color = new Color(null, 255, 0, 0);
+* canvas.setBackground(color);
+* ControlEditor editor = new ControlEditor (canvas);
+* // The editor will be a button in the bottom right corner of the canvas.
+* // When selected, it will launch a Color dialog that will change the background
+* // of the canvas.
+* Button button = new Button(canvas, DWT.PUSH);
+* button.setText("Select Color...");
+* button.addSelectionListener (new SelectionAdapter() {
+*   public void widgetSelected(SelectionEvent e) {
+*       ColorDialog dialog = new ColorDialog(shell);
+*       dialog.open();
+*       RGB rgb = dialog.getRGB();
+*       if (rgb !is null) {
+*           if (color !is null) color.dispose();
+*           color = new Color(null, rgb);
+*           canvas.setBackground(color);
+*       }
+*
+*   }
+* });
+*
+* editor.horizontalAlignment = DWT.RIGHT;
+* editor.verticalAlignment = DWT.BOTTOM;
+* editor.grabHorizontal = false;
+* editor.grabVertical = false;
+* Point size = button.computeSize(DWT.DEFAULT, DWT.DEFAULT);
+* editor.minimumWidth = size.x;
+* editor.minimumHeight = size.y;
+* editor.setEditor (button);
+* 
+*/ +public class ControlEditor { + + /** + * Specifies how the editor should be aligned relative to the control. Allowed values + * are DWT.LEFT, DWT.RIGHT and DWT.CENTER. The default value is DWT.CENTER. + */ + public int horizontalAlignment = DWT.CENTER; + + /** + * Specifies whether the editor should be sized to use the entire width of the control. + * True means resize the editor to the same width as the cell. False means do not adjust + * the width of the editor. The default value is false. + */ + public bool grabHorizontal = false; + + /** + * Specifies the minimum width the editor can have. This is used in association with + * a true value of grabHorizontal. If the cell becomes smaller than the minimumWidth, the + * editor will not made smaller than the minimum width value. The default value is 0. + */ + public int minimumWidth = 0; + + /** + * Specifies how the editor should be aligned relative to the control. Allowed values + * are DWT.TOP, DWT.BOTTOM and DWT.CENTER. The default value is DWT.CENTER. + */ + public int verticalAlignment = DWT.CENTER; + + /** + * Specifies whether the editor should be sized to use the entire height of the control. + * True means resize the editor to the same height as the underlying control. False means do not adjust + * the height of the editor. The default value is false. + */ + public bool grabVertical = false; + + /** + * Specifies the minimum height the editor can have. This is used in association with + * a true value of grabVertical. If the control becomes smaller than the minimumHeight, the + * editor will not made smaller than the minimum height value. The default value is 0. + */ + public int minimumHeight = 0; + + Composite parent; + Control editor; + private bool hadFocus; + private Listener controlListener; + private Listener scrollbarListener; + + private final static int [] EVENTS = [DWT.KeyDown, DWT.KeyUp, DWT.MouseDown, DWT.MouseUp, DWT.Resize]; +/** +* Creates a ControlEditor for the specified Composite. +* +* @param parent the Composite above which this editor will be displayed +* +*/ +public this (Composite parent) { + this.parent = parent; + + controlListener = new class() Listener { + public void handleEvent(Event e) { + layout (); + } + }; + for (int i=0; inot disposed. + */ +public void dispose () { + if (parent !is null && !parent.isDisposed()) { + for (int i=0; iNote: The Control provided as the editor must be created with its parent +* being the Composite specified in the ControlEditor constructor. +* +* @param editor the Control that is displayed above the composite being edited +*/ +public void setEditor (Control editor) { + + if (editor is null) { + // this is the case where the caller is setting the editor to be blank + // set all the values accordingly + this.editor = null; + return; + } + + this.editor = editor; + layout(); + if (this.editor is null || this.editor.isDisposed()) return; + editor.setVisible(true); +} +}