diff dwtx/ui/forms/widgets/ToggleHyperlink.d @ 75:5d489b9f966c

Fix continue porting
author Frank Benoit <benoit@tionex.de>
date Sat, 24 May 2008 05:11:16 +0200
parents
children e193036d82c9
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtx/ui/forms/widgets/ToggleHyperlink.d	Sat May 24 05:11:16 2008 +0200
@@ -0,0 +1,263 @@
+/*******************************************************************************
+ * 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwtx.ui.forms.widgets.ToggleHyperlink;
+
+import dwtx.ui.forms.widgets.AbstractHyperlink;
+
+import dwt.DWT;
+import dwt.accessibility.ACC;
+import dwt.accessibility.AccessibleAdapter;
+import dwt.accessibility.AccessibleControlAdapter;
+import dwt.accessibility.AccessibleControlEvent;
+import dwt.accessibility.AccessibleEvent;
+import dwt.graphics.Color;
+import dwt.graphics.Point;
+import dwt.graphics.Rectangle;
+import dwt.widgets.Composite;
+import dwt.widgets.Event;
+import dwt.widgets.Listener;
+import dwtx.ui.forms.events.HyperlinkAdapter;
+import dwtx.ui.forms.events.HyperlinkEvent;
+import dwtx.ui.internal.forms.Messages;
+
+import dwt.dwthelper.utils;
+
+/**
+ * A custom selectable control that can be used to control areas that can be
+ * expanded or collapsed.
+ * <p>
+ * This is an abstract class. Subclasses are responsible for rendering the
+ * control using decoration and hover decoration color. Control should be
+ * rendered based on the current expansion state.
+ *
+ * @since 3.0
+ */
+public abstract class ToggleHyperlink : AbstractHyperlink {
+    protected int innerWidth;
+    protected int innerHeight;
+    protected bool hover;
+    package bool hover_package(){
+        return hover;
+    }
+    package bool hover_package( bool v){
+        return (hover = v);
+    }
+    private bool expanded;
+    private Color decorationColor;
+    private Color hoverColor;
+    /**
+     * Creates a control in a provided composite.
+     *
+     * @param parent
+     *            the parent
+     * @param style
+     *            the style
+     */
+    public this(Composite parent, int style) {
+        super(parent, style);
+        Listener listener = new class Listener {
+            public void handleEvent(Event e) {
+                switch (e.type) {
+                    case DWT.MouseEnter:
+                        hover=true;
+                        redraw();
+                        break;
+                    case DWT.MouseExit:
+                        hover = false;
+                        redraw();
+                        break;
+                    case DWT.KeyDown:
+                        onKeyDown(e);
+                        break;
+                }
+            }
+        };
+        addListener(DWT.MouseEnter, listener);
+        addListener(DWT.MouseExit, listener);
+        addListener(DWT.KeyDown, listener);
+        addHyperlinkListener(new class HyperlinkAdapter {
+            public void linkActivated(HyperlinkEvent e) {
+                setExpanded(!isExpanded());
+            }
+        });
+        initAccessible();
+    }
+    /**
+     * Sets the color of the decoration.
+     *
+     * @param decorationColor
+     */
+    public void setDecorationColor(Color decorationColor) {
+        this.decorationColor = decorationColor;
+    }
+    /**
+     * Returns the color of the decoration.
+     *
+     * @return decoration color
+     */
+    public Color getDecorationColor() {
+        return decorationColor;
+    }
+    /**
+     * Sets the hover color of decoration. Hover color will be used when mouse
+     * enters the decoration area.
+     *
+     * @param hoverColor
+     *            the hover color to use
+     */
+    public void setHoverDecorationColor(Color hoverColor) {
+        this.hoverColor = hoverColor;
+    }
+    /**
+     * Returns the hover color of the decoration.
+     *
+     * @return the hover color of the decoration.
+     * @since 3.1
+     */
+    public Color getHoverDecorationColor() {
+        return hoverColor;
+    }
+
+    /**
+     * Returns the hover color of the decoration.
+     *
+     * @return the hover color of the decoration.
+     * @deprecated use <code>getHoverDecorationColor</code>
+     * @see #getHoverDecorationColor()
+     */
+    public Color geHoverDecorationColor() {
+        return hoverColor;
+    }
+    /**
+     * Computes the size of the control.
+     *
+     * @param wHint
+     *            width hint
+     * @param hHint
+     *            height hint
+     * @param changed
+     *            if true, flush any saved layout state
+     */
+    public Point computeSize(int wHint, int hHint, bool changed) {
+        int width, height;
+        /*
+        if (wHint !is DWT.DEFAULT)
+            width = wHint;
+        else */
+            width = innerWidth + 2 * marginWidth;
+        /*
+        if (hHint !is DWT.DEFAULT)
+            height = hHint;
+        else */
+            height = innerHeight + 2 * marginHeight;
+        return new Point(width, height);
+    }
+    /**
+     * Returns the expansion state of the toggle control. When toggle is in the
+     * normal (downward) state, the value is <samp>true </samp>. Collapsed
+     * control will return <samp>false </samp>.
+     *
+     * @return <samp>false </samp> if collapsed, <samp>true </samp> otherwise.
+     */
+    public bool isExpanded() {
+        return expanded;
+    }
+    /**
+     * Sets the expansion state of the twistie control
+     *
+     * @param expanded the expansion state
+     */
+    public void setExpanded(bool expanded) {
+        this.expanded = expanded;
+        getAccessible().selectionChanged();
+        redraw();
+    }
+    private void initAccessible() {
+        getAccessible().addAccessibleListener(new class AccessibleAdapter {
+            public void getHelp(AccessibleEvent e) {
+                e.result = getToolTipText();
+            }
+            public void getName(AccessibleEvent e) {
+                String name=Messages.ToggleHyperlink_accessibleName;
+                if (null !is cast(ExpandableComposite)getParent() ) {
+                    name ~= Messages.ToggleHyperlink_accessibleColumn ~ (cast(ExpandableComposite)getParent()).getText();
+                    int index = name.indexOf('&');
+                    if (index !is -1) {
+                        name = name.substring(0, index) + name.substring(index + 1);
+                    }
+                }
+                e.result = name;
+            }
+            public void getDescription(AccessibleEvent e) {
+                getName(e);
+            }
+        });
+        getAccessible().addAccessibleControlListener(
+                new class AccessibleControlAdapter {
+                    public void getChildAtPoint(AccessibleControlEvent e) {
+                        Point testPoint = toControl(new Point(e.x, e.y));
+                        if (getBounds().contains(testPoint)) {
+                            e.childID = ACC.CHILDID_SELF;
+                        }
+                    }
+                    public void getLocation(AccessibleControlEvent e) {
+                        Rectangle location = getBounds();
+                        Point pt = toDisplay(new Point(location.x, location.y));
+                        e.x = pt.x;
+                        e.y = pt.y;
+                        e.width = location.width;
+                        e.height = location.height;
+                    }
+                    public void getSelection (AccessibleControlEvent e) {
+                        if (this.outer.getSelection())
+                            e.childID = ACC.CHILDID_SELF;
+                    }
+
+                    public void getFocus (AccessibleControlEvent e) {
+                        if (this.outer.getSelection())
+                            e.childID = ACC.CHILDID_SELF;
+                    }
+                    public void getChildCount(AccessibleControlEvent e) {
+                        e.detail = 0;
+                    }
+                    public void getRole(AccessibleControlEvent e) {
+                        e.detail = ACC.ROLE_TREE;
+                    }
+                    public void getState(AccessibleControlEvent e) {
+                        int state = ACC.STATE_FOCUSABLE;
+                        if (this.outer.getSelection())
+                            state |= ACC.STATE_FOCUSED;
+                        state |= this.outer.isExpanded()
+                                ? ACC.STATE_EXPANDED
+                                : ACC.STATE_COLLAPSED;
+                        e.detail = state;
+                    }
+                });
+    }
+    private void onKeyDown(Event e) {
+        if (e.keyCodeisDWT.ARROW_RIGHT) {
+            // expand if collapsed
+            if (!isExpanded()) {
+                handleActivate(e);
+            }
+            e.doit=false;
+        }
+        else if (e.keyCodeisDWT.ARROW_LEFT) {
+            // collapse if expanded
+            if (isExpanded()) {
+                handleActivate(e);
+            }
+            e.doit=false;
+        }
+    }
+}