annotate dwtx/jface/fieldassist/ControlDecoration.d @ 192:c3583c6ec027

Added missing default cases for switch statements
author Frank Benoit <benoit@tionex.de>
date Mon, 03 Nov 2008 22:52:26 +0100
parents 46a6e0e6ccd4
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
29
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1 /*******************************************************************************
70
46a6e0e6ccd4 Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 34
diff changeset
2 * Copyright (c) 2006, 2008 IBM Corporation and others.
29
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
3 * All rights reserved. This program and the accompanying materials
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
4 * are made available under the terms of the Eclipse Public License v1.0
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
5 * which accompanies this distribution, and is available at
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
6 * http://www.eclipse.org/legal/epl-v10.html
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
7 *
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
8 * Contributors:
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
9 * IBM Corporation - initial API and implementation
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
10 * Port to the D programming language:
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
11 * Frank Benoit <benoit@tionex.de>
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
12 *******************************************************************************/
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
13 module dwtx.jface.fieldassist.ControlDecoration;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
14
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
15
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
16 import dwt.DWT;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
17 import dwt.events.DisposeEvent;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
18 import dwt.events.DisposeListener;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
19 import dwt.events.FocusEvent;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
20 import dwt.events.FocusListener;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
21 import dwt.events.MenuDetectEvent;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
22 import dwt.events.MenuDetectListener;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
23 import dwt.events.MouseAdapter;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
24 import dwt.events.MouseEvent;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
25 import dwt.events.MouseMoveListener;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
26 import dwt.events.MouseTrackListener;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
27 import dwt.events.PaintEvent;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
28 import dwt.events.PaintListener;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
29 import dwt.events.SelectionEvent;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
30 import dwt.events.SelectionListener;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
31 import dwt.graphics.GC;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
32 import dwt.graphics.Image;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
33 import dwt.graphics.Point;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
34 import dwt.graphics.Rectangle;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
35 import dwt.graphics.Region;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
36 import dwt.widgets.Composite;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
37 import dwt.widgets.Control;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
38 import dwt.widgets.Display;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
39 import dwt.widgets.Event;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
40 import dwt.widgets.Listener;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
41 import dwt.widgets.Shell;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
42 import dwt.widgets.Widget;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
43 import dwtx.core.runtime.ListenerList;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
44
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
45 import dwt.dwthelper.utils;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
46 import tango.io.Stdout;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
47
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
48 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
49 * ControlDecoration renders an image decoration near a control. It allows
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
50 * clients to specify an image and a position for the image relative to the
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
51 * control. A ControlDecoration may be assigned description text, which can
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
52 * optionally be shown when the user hovers over the image. Clients can decorate
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
53 * any kind of control.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
54 * <p>
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
55 * Decoration images always appear on the left or right side of the field, never
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
56 * above or below it. Decorations can be positioned at the top, center, or
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
57 * bottom of either side of the control. Future implementations may provide
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
58 * additional positioning options for decorations.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
59 * <p>
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
60 * ControlDecoration renders the image adjacent to the specified (already
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
61 * created) control, with no guarantee that it won't be clipped or otherwise
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
62 * obscured or overlapped by adjacent controls, including another
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
63 * ControlDecoration placed in the same location. Clients should ensure that
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
64 * there is adequate space adjacent to the control to show the decoration
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
65 * properly.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
66 * <p>
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
67 * Clients using ControlDecoration should typically ensure that enough margin
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
68 * space is reserved for a decoration by altering the layout data margins,
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
69 * although this is not assumed or required by the ControlDecoration
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
70 * implementation.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
71 * <p>
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
72 * This class is intended to be instantiated and used by clients. It is not
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
73 * intended to be subclassed by clients.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
74 *
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
75 * @since 3.3
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
76 *
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
77 * @see FieldDecoration
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
78 * @see FieldDecorationRegistry
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
79 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
80 public class ControlDecoration {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
81 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
82 * Debug flag for tracing
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
83 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
84 private static bool DEBUG = false;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
85
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
86 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
87 * Cached platform flags for dealing with platform-specific issues.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
88 */
34
b3c8e32d406f preference
Frank Benoit <benoit@tionex.de>
parents: 29
diff changeset
89 private static bool CARBON(){
b3c8e32d406f preference
Frank Benoit <benoit@tionex.de>
parents: 29
diff changeset
90 return "carbon".equals(DWT.getPlatform()); //$NON-NLS-1$
b3c8e32d406f preference
Frank Benoit <benoit@tionex.de>
parents: 29
diff changeset
91 }
29
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
92
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
93 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
94 * The associated control
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
95 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
96 private Control control;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
97
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
98 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
99 * The composite on which to render the decoration and hook mouse events, or
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
100 * null if we are hooking all parent composites.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
101 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
102 private Composite composite;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
103
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
104 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
105 * The associated image.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
106 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
107 private Image image;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
108
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
109 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
110 * The associated description text.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
111 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
112 private String descriptionText;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
113 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
114 * The position of the decoration.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
115 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
116 private int position;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
117
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
118 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
119 * The decoration's visibility flag
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
120 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
121 private bool visible = true;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
122
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
123 /**
70
46a6e0e6ccd4 Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 34
diff changeset
124 * Boolean indicating whether the decoration should only be shown when the
29
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
125 * control has focus
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
126 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
127 private bool showOnlyOnFocus = false;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
128
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
129 /**
70
46a6e0e6ccd4 Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 34
diff changeset
130 * Boolean indicating whether the decoration should show its description
29
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
131 * text in a hover when the user hovers over the decoration.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
132 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
133 private bool showHover = true;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
134
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
135 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
136 * Margin width used between the decorator and the control.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
137 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
138 private int marginWidth = 0;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
139
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
140 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
141 * Registered selection listeners.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
142 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
143 private ListenerList selectionListeners;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
144
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
145 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
146 * Registered menu detect listeners.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
147 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
148 private ListenerList menuDetectListeners;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
149
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
150 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
151 * The focus listener
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
152 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
153 private FocusListener focusListener;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
154
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
155 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
156 * The dispose listener
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
157 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
158 private DisposeListener disposeListener;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
159
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
160 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
161 * The paint listener installed for drawing the decoration
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
162 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
163 private PaintListener paintListener;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
164
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
165 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
166 * The mouse listener installed for tracking the hover
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
167 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
168 private MouseTrackListener mouseTrackListener;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
169
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
170 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
171 * The mouse move listener installed for tracking the hover
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
172 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
173 private MouseMoveListener mouseMoveListener;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
174
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
175 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
176 * The untyped listener installed for notifying external listeners
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
177 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
178 private Listener compositeListener;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
179
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
180 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
181 * Control that we last installed a move listener on. We only want one at a
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
182 * time.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
183 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
184 private Control moveListeningTarget = null;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
185
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
186 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
187 * Debug counter used to match add and remove listeners
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
188 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
189 private int listenerInstalls = 0;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
190
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
191 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
192 * The current rectangle used for tracking mouse moves
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
193 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
194 private Rectangle decorationRectangle;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
195
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
196 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
197 * An internal flag tracking whether we have focus. We use this rather than
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
198 * isFocusControl() so that we can set the flag as soon as we get the focus
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
199 * callback, rather than having to do an asyncExec in the middle of a focus
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
200 * callback to ensure that isFocusControl() represents the outcome of the
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
201 * event.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
202 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
203 private bool hasFocus = false;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
204
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
205 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
206 * The hover used for showing description text
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
207 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
208 private Hover hover;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
209
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
210 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
211 * The hover used to show a decoration image's description.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
212 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
213 class Hover {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
214 private static const String EMPTY = ""; //$NON-NLS-1$
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
215
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
216 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
217 * Offset of info hover arrow from the left or right side.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
218 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
219 private int hao = 10;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
220
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
221 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
222 * Width of info hover arrow.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
223 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
224 private int haw = 8;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
225
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
226 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
227 * Height of info hover arrow.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
228 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
229 private int hah = 10;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
230
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
231 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
232 * Margin around info hover text.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
233 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
234 private int hm = 2;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
235
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
236 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
237 * This info hover's shell.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
238 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
239 Shell hoverShell;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
240
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
241 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
242 * The info hover text.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
243 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
244 String text = EMPTY;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
245
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
246 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
247 * The region used to manage the shell shape
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
248 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
249 Region region;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
250
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
251 /**
70
46a6e0e6ccd4 Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 34
diff changeset
252 * Boolean indicating whether the last computed polygon location had an
29
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
253 * arrow on left. (true if left, false if right).
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
254 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
255 bool arrowOnLeft = true;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
256
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
257 /*
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
258 * Create a hover parented by the specified shell.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
259 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
260 this(Shell parent) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
261 Display display = parent.getDisplay();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
262 hoverShell = new Shell(parent, DWT.NO_TRIM | DWT.ON_TOP
70
46a6e0e6ccd4 Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 34
diff changeset
263 | DWT.NO_FOCUS | DWT.TOOL);
29
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
264 hoverShell.setBackground(display
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
265 .getSystemColor(DWT.COLOR_INFO_BACKGROUND));
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
266 hoverShell.setForeground(display
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
267 .getSystemColor(DWT.COLOR_INFO_FOREGROUND));
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
268 hoverShell.addPaintListener(new class PaintListener {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
269 public void paintControl(PaintEvent pe) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
270 pe.gc.drawText(text, hm, hm);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
271 if (!CARBON) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
272 pe.gc.drawPolygon(getPolygon(true));
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
273 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
274 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
275 });
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
276 hoverShell.addMouseListener(new class MouseAdapter {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
277 public void mouseDown(MouseEvent e) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
278 hideHover();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
279 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
280 });
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
281 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
282
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
283 /*
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
284 * Compute a polygon that represents a hover with an arrow pointer. If
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
285 * border is true, compute the polygon inset by 1-pixel border. Consult
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
286 * the arrowOnLeft flag to determine which side the arrow is on.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
287 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
288 int[] getPolygon(bool border) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
289 Point e = getExtent();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
290 int b = border ? 1 : 0;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
291 if (arrowOnLeft) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
292 return [ 0, 0, e.x - b, 0, e.x - b, e.y - b,
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
293 hao + haw, e.y - b, hao + haw / 2, e.y + hah - b, hao,
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
294 e.y - b, 0, e.y - b, 0, 0 ];
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
295 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
296 return [ 0, 0, e.x - b, 0, e.x - b, e.y - b,
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
297 e.x - hao - b, e.y - b, e.x - hao - haw / 2, e.y + hah - b,
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
298 e.x - hao - haw, e.y - b, 0, e.y - b, 0, 0 ];
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
299 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
300
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
301 /*
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
302 * Dispose the hover, it is no longer needed. Dispose any resources
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
303 * allocated by the hover.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
304 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
305 void dispose() {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
306 if (!hoverShell.isDisposed()) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
307 hoverShell.dispose();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
308 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
309 if (region !is null) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
310 region.dispose();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
311 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
312 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
313
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
314 /*
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
315 * Set the visibility of the hover.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
316 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
317 void setVisible(bool visible) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
318 if (visible) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
319 if (!hoverShell.isVisible()) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
320 hoverShell.setVisible(true);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
321 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
322 } else {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
323 if (hoverShell.isVisible()) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
324 hoverShell.setVisible(false);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
325 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
326 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
327 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
328
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
329 /*
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
330 * Set the text of the hover to the specified text. Recompute the size
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
331 * and location of the hover to hover near the decoration rectangle,
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
332 * pointing the arrow toward the target control.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
333 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
334 void setText(String t, Rectangle decorationRectangle,
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
335 Control targetControl) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
336 if (t is null) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
337 t = EMPTY;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
338 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
339 if (!t.equals(text)) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
340 Point oldSize = getExtent();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
341 text = t;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
342 hoverShell.redraw();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
343 Point newSize = getExtent();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
344 if (!oldSize.opEquals(newSize)) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
345 // set a flag that indicates the direction of arrow
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
346 arrowOnLeft = decorationRectangle.x <= targetControl
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
347 .getLocation().x;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
348 setNewShape();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
349 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
350 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
351
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
352 Point extent = getExtent();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
353 int y = -extent.y - hah + 1;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
354 int x = arrowOnLeft ? -hao + haw / 2 : -extent.x + hao + haw / 2;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
355
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
356 hoverShell.setLocation(control.getParent().toDisplay(
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
357 decorationRectangle.x + x, decorationRectangle.y + y));
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
358 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
359
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
360 /*
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
361 * Return whether or not the hover (shell) is visible.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
362 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
363 bool isVisible() {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
364 return hoverShell.isVisible();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
365 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
366
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
367 /*
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
368 * Compute the extent of the hover for the current text.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
369 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
370 Point getExtent() {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
371 GC gc = new GC(hoverShell);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
372 Point e = gc.textExtent(text);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
373 gc.dispose();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
374 e.x += hm * 2;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
375 e.y += hm * 2;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
376 return e;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
377 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
378
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
379 /*
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
380 * Compute a new shape for the hover shell.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
381 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
382 void setNewShape() {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
383 Region oldRegion = region;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
384 region = new Region();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
385 region.add(getPolygon(false));
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
386 hoverShell.setRegion(region);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
387 if (oldRegion !is null) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
388 oldRegion.dispose();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
389 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
390
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
391 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
392 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
393
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
394 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
395 * Construct a ControlDecoration for decorating the specified control at the
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
396 * specified position relative to the control. Render the decoration on top
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
397 * of any Control that happens to appear at the specified location.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
398 * <p>
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
399 * DWT constants are used to specify the position of the decoration relative
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
400 * to the control. The position should include style bits describing both
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
401 * the vertical and horizontal orientation. <code>DWT.LEFT</code> and
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
402 * <code>DWT.RIGHT</code> describe the horizontal placement of the
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
403 * decoration relative to the control, and the constants
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
404 * <code>DWT.TOP</code>, <code>DWT.CENTER</code>, and
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
405 * <code>DWT.BOTTOM</code> describe the vertical alignment of the
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
406 * decoration relative to the control. Decorations always appear on either
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
407 * the left or right side of the control, never above or below it. For
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
408 * example, a decoration appearing on the left side of the field, at the
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
409 * top, is specified as DWT.LEFT | DWT.TOP. If no position style bits are
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
410 * specified, the control decoration will be positioned to the left and
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
411 * center of the control (<code>DWT.LEFT | DWT.CENTER</code>).
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
412 * </p>
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
413 *
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
414 * @param control
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
415 * the control to be decorated
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
416 * @param position
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
417 * bit-wise or of position constants (<code>DWT.TOP</code>,
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
418 * <code>DWT.BOTTOM</code>, <code>DWT.LEFT</code>,
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
419 * <code>DWT.RIGHT</code>, and <code>DWT.CENTER</code>).
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
420 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
421 public this(Control control, int position) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
422 this(control, position, null);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
423
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
424 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
425
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
426 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
427 * Construct a ControlDecoration for decorating the specified control at the
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
428 * specified position relative to the control. Render the decoration only on
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
429 * the specified Composite or its children. The decoration will be clipped
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
430 * if it does not appear within the visible bounds of the composite or its
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
431 * child composites.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
432 * <p>
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
433 * DWT constants are used to specify the position of the decoration relative
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
434 * to the control. The position should include style bits describing both
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
435 * the vertical and horizontal orientation. <code>DWT.LEFT</code> and
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
436 * <code>DWT.RIGHT</code> describe the horizontal placement of the
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
437 * decoration relative to the control, and the constants
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
438 * <code>DWT.TOP</code>, <code>DWT.CENTER</code>, and
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
439 * <code>DWT.BOTTOM</code> describe the vertical alignment of the
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
440 * decoration relative to the control. Decorations always appear on either
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
441 * the left or right side of the control, never above or below it. For
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
442 * example, a decoration appearing on the left side of the field, at the
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
443 * top, is specified as DWT.LEFT | DWT.TOP. If no position style bits are
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
444 * specified, the control decoration will be positioned to the left and
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
445 * center of the control (<code>DWT.LEFT | DWT.CENTER</code>).
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
446 * </p>
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
447 *
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
448 * @param control
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
449 * the control to be decorated
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
450 * @param position
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
451 * bit-wise or of position constants (<code>DWT.TOP</code>,
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
452 * <code>DWT.BOTTOM</code>, <code>DWT.LEFT</code>,
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
453 * <code>DWT.RIGHT</code>, and <code>DWT.CENTER</code>).
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
454 * @param composite
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
455 * The DWT composite within which the decoration should be
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
456 * rendered. The decoration will be clipped to this composite,
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
457 * but it may be rendered on a child of the composite. The
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
458 * decoration will not be visible if the specified composite or
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
459 * its child composites are not visible in the space relative to
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
460 * the control, where the decoration is to be rendered. If this
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
461 * value is <code>null</code>, then the decoration will be
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
462 * rendered on whichever composite (or composites) are located in
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
463 * the specified position.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
464 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
465 public this(Control control, int position, Composite composite) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
466 selectionListeners = new ListenerList();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
467 menuDetectListeners = new ListenerList();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
468 this.position = position;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
469 this.control = control;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
470 this.composite = composite;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
471
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
472 addControlListeners();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
473
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
474 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
475
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
476 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
477 * Adds the listener to the collection of listeners who will be notified
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
478 * when the platform-specific context menu trigger has occurred, by sending
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
479 * it one of the messages defined in the <code>MenuDetectListener</code>
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
480 * interface.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
481 * <p>
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
482 * The <code>widget</code> field in the SelectionEvent will contain the
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
483 * Composite on which the decoration is rendered that received the click.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
484 * The <code>x</code> and <code>y</code> fields will be in coordinates
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
485 * relative to the display. The <code>data</code> field will contain the
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
486 * decoration that received the event.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
487 * </p>
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
488 *
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
489 * @param listener
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
490 * the listener which should be notified
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
491 *
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
492 * @see dwt.events.MenuDetectListener
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
493 * @see dwt.events.MenuDetectEvent
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
494 * @see #removeMenuDetectListener
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
495 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
496 public void addMenuDetectListener(MenuDetectListener listener) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
497 menuDetectListeners.add(cast(Object)listener);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
498 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
499
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
500 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
501 * Removes the listener from the collection of listeners who will be
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
502 * notified when the platform-specific context menu trigger has occurred.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
503 *
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
504 * @param listener
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
505 * the listener which should no longer be notified. This message
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
506 * has no effect if the listener was not previously added to the
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
507 * receiver.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
508 *
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
509 * @see dwt.events.MenuDetectListener
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
510 * @see #addMenuDetectListener
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
511 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
512 public void removeMenuDetectListener(MenuDetectListener listener) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
513 menuDetectListeners.remove(cast(Object)listener);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
514 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
515
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
516 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
517 * Adds the listener to the collection of listeners who will be notified
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
518 * when the decoration is selected, by sending it one of the messages
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
519 * defined in the <code>SelectionListener</code> interface.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
520 * <p>
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
521 * <code>widgetSelected</code> is called when the decoration is selected
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
522 * (by mouse click). <code>widgetDefaultSelected</code> is called when the
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
523 * decoration is double-clicked.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
524 * </p>
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
525 * <p>
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
526 * The <code>widget</code> field in the SelectionEvent will contain the
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
527 * Composite on which the decoration is rendered that received the click.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
528 * The <code>x</code> and <code>y</code> fields will be in coordinates
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
529 * relative to that widget. The <code>data</code> field will contain the
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
530 * decoration that received the event.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
531 * </p>
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
532 *
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
533 * @param listener
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
534 * the listener which should be notified
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
535 *
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
536 * @see dwt.events.SelectionListener
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
537 * @see dwt.events.SelectionEvent
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
538 * @see #removeSelectionListener
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
539 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
540 public void addSelectionListener(SelectionListener listener) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
541 selectionListeners.add(cast(Object)listener);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
542 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
543
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
544 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
545 * Removes the listener from the collection of listeners who will be
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
546 * notified when the decoration is selected.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
547 *
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
548 * @param listener
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
549 * the listener which should no longer be notified. This message
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
550 * has no effect if the listener was not previously added to the
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
551 * receiver.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
552 *
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
553 * @see dwt.events.SelectionListener
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
554 * @see #addSelectionListener
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
555 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
556 public void removeSelectionListener(SelectionListener listener) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
557 selectionListeners.remove(cast(Object)listener);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
558 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
559
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
560 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
561 * Dispose this ControlDecoration. Unhook any listeners that have been
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
562 * installed on the target control. This method has no effect if the
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
563 * receiver is already disposed.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
564 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
565 public void dispose() {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
566 if (control is null) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
567 return;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
568 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
569 if (hover !is null) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
570 hover.dispose();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
571 hover = null;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
572 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
573 removeControlListeners();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
574 control = null;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
575 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
576
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
577 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
578 * Get the control that is decorated by the receiver.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
579 *
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
580 * @return the Control decorated by the receiver. May be <code>null</code>
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
581 * if the control has been uninstalled.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
582 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
583 public Control getControl() {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
584 return control;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
585 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
586
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
587 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
588 * Add any listeners needed on the target control and on the composite where
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
589 * the decoration is to be rendered.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
590 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
591 private void addControlListeners() {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
592 disposeListener = new class DisposeListener {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
593 public void widgetDisposed(DisposeEvent event) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
594 dispose();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
595 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
596 };
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
597 printAddListener(control, "DISPOSE"); //$NON-NLS-1$
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
598 control.addDisposeListener(disposeListener);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
599
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
600 focusListener = new class FocusListener {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
601 public void focusGained(FocusEvent event) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
602 hasFocus = true;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
603 if (showOnlyOnFocus) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
604 update();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
605 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
606 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
607
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
608 public void focusLost(FocusEvent event) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
609 hasFocus = false;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
610 if (showOnlyOnFocus) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
611 update();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
612 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
613 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
614 };
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
615 printAddListener(control, "FOCUS"); //$NON-NLS-1$
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
616 control.addFocusListener(focusListener);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
617
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
618 // Listener for painting the decoration
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
619 paintListener = new class PaintListener {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
620 public void paintControl(PaintEvent event) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
621 Control control = cast(Control) event.widget;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
622 Rectangle rect = getDecorationRectangle(control);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
623 if (shouldShowDecoration()) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
624 event.gc.drawImage(getImage(), rect.x, rect.y);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
625 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
626 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
627 };
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
628
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
629 // Listener for tracking the end of a hover. Only installed
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
630 // after a hover begins.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
631 mouseMoveListener = new class MouseMoveListener {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
632 public void mouseMove(MouseEvent event) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
633 if (showHover) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
634 if (!decorationRectangle.contains(event.x, event.y)) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
635 hideHover();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
636 // No need to listen any longer
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
637 printRemoveListener(event.widget, "MOUSEMOVE"); //$NON-NLS-1$
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
638 (cast(Control) event.widget)
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
639 .removeMouseMoveListener(mouseMoveListener);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
640 moveListeningTarget = null;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
641 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
642 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
643 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
644 };
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
645
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
646 // Listener for tracking the beginning of a hover. Always installed.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
647 mouseTrackListener = new class MouseTrackListener {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
648 public void mouseExit(MouseEvent event) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
649 // Just in case we didn't catch it before.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
650 Control target = cast(Control) event.widget;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
651 if (target is moveListeningTarget) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
652 printRemoveListener(target, "MOUSEMOVE"); //$NON-NLS-1$
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
653 target.removeMouseMoveListener(mouseMoveListener);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
654 moveListeningTarget = null;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
655 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
656 hideHover();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
657 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
658
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
659 public void mouseHover(MouseEvent event) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
660 if (showHover) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
661 decorationRectangle = getDecorationRectangle(cast(Control) event.widget);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
662 if (decorationRectangle.contains(event.x, event.y)) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
663 showHoverText(getDescriptionText());
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
664 Control target = cast(Control) event.widget;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
665 if (moveListeningTarget is null) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
666 printAddListener(target, "MOUSEMOVE"); //$NON-NLS-1$
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
667 target.addMouseMoveListener(mouseMoveListener);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
668 moveListeningTarget = target;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
669 } else if (target !is moveListeningTarget) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
670 printRemoveListener(moveListeningTarget,
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
671 "MOUSEMOVE"); //$NON-NLS-1$
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
672 moveListeningTarget
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
673 .removeMouseMoveListener(mouseMoveListener);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
674 printAddListener(target, "MOUSEMOVE"); //$NON-NLS-1$
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
675 target.addMouseMoveListener(mouseMoveListener);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
676 moveListeningTarget = target;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
677 } else {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
678 // It is already installed on this control.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
679 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
680 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
681 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
682 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
683
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
684 public void mouseEnter(MouseEvent event) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
685 // Nothing to do until a hover occurs.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
686 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
687 };
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
688
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
689 compositeListener = new class Listener {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
690 public void handleEvent(Event event) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
691 // Don't forward events if decoration is not showing
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
692 if (!visible) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
693 return;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
694 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
695 // Notify listeners if any are registered.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
696 switch (event.type) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
697 case DWT.MouseDown:
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
698 if (!selectionListeners.isEmpty())
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
699 notifySelectionListeners(event);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
700 break;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
701 case DWT.MouseDoubleClick:
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
702 if (!selectionListeners.isEmpty())
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
703 notifySelectionListeners(event);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
704 break;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
705 case DWT.MenuDetect:
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
706 if (!menuDetectListeners.isEmpty())
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
707 notifyMenuDetectListeners(event);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
708 break;
192
c3583c6ec027 Added missing default cases for switch statements
Frank Benoit <benoit@tionex.de>
parents: 70
diff changeset
709 default:
29
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
710 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
711 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
712 };
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
713
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
714 // We do not know which parent in the control hierarchy
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
715 // is providing the decoration space, so hook all the way up, until
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
716 // the shell or the specified parent composite is reached.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
717 Composite c = control.getParent();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
718 while (c !is null) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
719 installCompositeListeners(c);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
720 if (composite !is null && composite is c) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
721 // We just installed on the specified composite, so stop.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
722 c = null;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
723 } else if (cast(Shell)c ) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
724 // We just installed on a shell, so don't go further
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
725 c = null;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
726 } else {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
727 c = c.getParent();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
728 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
729 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
730 // force a redraw of the decoration area so our paint listener
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
731 // is notified.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
732 update();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
733 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
734
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
735 /*
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
736 * Install the listeners used to paint and track mouse events on the
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
737 * composite.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
738 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
739 private void installCompositeListeners(Composite c) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
740 if (!c.isDisposed()) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
741 printAddListener(c, "PAINT"); //$NON-NLS-1$
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
742 c.addPaintListener(paintListener);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
743 printAddListener(c, "MOUSETRACK"); //$NON-NLS-1$
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
744 c.addMouseTrackListener(mouseTrackListener);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
745 printAddListener(c, "DWT.MenuDetect"); //$NON-NLS-1$
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
746 c.addListener(DWT.MenuDetect, compositeListener);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
747 printAddListener(c, "DWT.MouseDown"); //$NON-NLS-1$
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
748 c.addListener(DWT.MouseDown, compositeListener);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
749 printAddListener(c, "DWT.MouseDoubleClick"); //$NON-NLS-1$
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
750 c.addListener(DWT.MouseDoubleClick, compositeListener);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
751 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
752 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
753
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
754 /*
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
755 * Remove the listeners used to paint and track mouse events on the
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
756 * composite.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
757 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
758 private void removeCompositeListeners(Composite c) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
759 if (!c.isDisposed()) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
760 printRemoveListener(c, "PAINT"); //$NON-NLS-1$
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
761 c.removePaintListener(paintListener);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
762 printRemoveListener(c, "MOUSETRACK"); //$NON-NLS-1$
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
763 c.removeMouseTrackListener(mouseTrackListener);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
764 printRemoveListener(c, "DWT.MenuDetect"); //$NON-NLS-1$
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
765 c.removeListener(DWT.MenuDetect, compositeListener);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
766 printRemoveListener(c, "DWT.MouseDown"); //$NON-NLS-1$
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
767 c.removeListener(DWT.MouseDown, compositeListener);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
768 printRemoveListener(c, "DWT.MouseDoubleClick"); //$NON-NLS-1$
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
769 c.removeListener(DWT.MouseDoubleClick, compositeListener);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
770 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
771 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
772
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
773 private void notifySelectionListeners(Event event) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
774 if (!(cast(Control)event.widget )) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
775 return;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
776 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
777 if (getDecorationRectangle(cast(Control) event.widget).contains(event.x,
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
778 event.y)) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
779 SelectionEvent clientEvent = new SelectionEvent(event);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
780 clientEvent.data = this;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
781 if (getImage() !is null) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
782 clientEvent.height = getImage().getBounds().height;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
783 clientEvent.width = getImage().getBounds().width;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
784 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
785 Object[] listeners;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
786 switch (event.type) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
787 case DWT.MouseDoubleClick:
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
788 if (event.button is 1) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
789 listeners = selectionListeners.getListeners();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
790 for (int i = 0; i < listeners.length; i++) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
791 (cast(SelectionListener) listeners[i])
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
792 .widgetDefaultSelected(clientEvent);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
793 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
794 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
795 break;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
796 case DWT.MouseDown:
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
797 if (event.button is 1) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
798 listeners = selectionListeners.getListeners();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
799 for (int i = 0; i < listeners.length; i++) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
800 (cast(SelectionListener) listeners[i])
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
801 .widgetSelected(clientEvent);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
802 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
803 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
804 break;
192
c3583c6ec027 Added missing default cases for switch statements
Frank Benoit <benoit@tionex.de>
parents: 70
diff changeset
805 default:
29
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
806 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
807 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
808 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
809
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
810 private void notifyMenuDetectListeners(Event event) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
811 if (getDecorationRectangle(null).contains(event.x, event.y)) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
812 MenuDetectEvent clientEvent = new MenuDetectEvent(event);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
813 clientEvent.data = this;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
814 Object[] listeners = menuDetectListeners.getListeners();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
815 for (int i = 0; i < listeners.length; i++) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
816 (cast(MenuDetectListener) listeners[i]).menuDetected(clientEvent);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
817
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
818 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
819 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
820 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
821
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
822 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
823 * Show the specified text using the same hover dialog as is used to show
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
824 * decorator descriptions. When {@link #setShowHover(bool)} has been set
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
825 * to <code>true</code>, a decoration's description text will be shown in
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
826 * an info hover over the field's control whenever the mouse hovers over the
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
827 * decoration. This method can be used to show a decoration's description
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
828 * text at other times (such as when the control receives focus), or to show
70
46a6e0e6ccd4 Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 34
diff changeset
829 * other text associated with the field. The hover will not be shown if the
46a6e0e6ccd4 Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 34
diff changeset
830 * decoration is hidden.
29
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
831 *
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
832 * @param text
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
833 * the text to be shown in the info hover, or <code>null</code>
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
834 * if no text should be shown.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
835 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
836 public void showHoverText(String text) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
837 if (control is null) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
838 return;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
839 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
840 showHoverText(text, control);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
841 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
842
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
843 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
844 * Hide any hover popups that are currently showing on the control. When
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
845 * {@link #setShowHover(bool)} has been set to <code>true</code>, a
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
846 * decoration's description text will be shown in an info hover over the
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
847 * field's control as long as the mouse hovers over the decoration, and will
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
848 * be hidden when the mouse exits the decoration. This method can be used to
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
849 * hide a hover, whether it was shown explicitly using
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
850 * {@link #showHoverText(String)}, or was showing because the user was
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
851 * hovering in the decoration.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
852 * <p>
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
853 * This message has no effect if there is no current hover.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
854 *
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
855 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
856 public void hideHover() {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
857 if (hover !is null) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
858 hover.setVisible(false);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
859 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
860 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
861
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
862 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
863 * Show the control decoration. This message has no effect if the decoration
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
864 * is already showing. If {@link #setShowOnlyOnFocus(bool)} is set to
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
865 * <code>true</code>, the decoration will only be shown if the control
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
866 * has focus.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
867 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
868 public void show() {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
869 if (!visible) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
870 visible = true;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
871 update();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
872 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
873 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
874
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
875 /**
70
46a6e0e6ccd4 Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 34
diff changeset
876 * Hide the control decoration and any associated hovers. This message has
46a6e0e6ccd4 Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 34
diff changeset
877 * no effect if the decoration is already hidden.
29
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
878 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
879 public void hide() {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
880 if (visible) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
881 visible = false;
70
46a6e0e6ccd4 Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 34
diff changeset
882 hideHover();
29
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
883 update();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
884 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
885 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
886
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
887 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
888 * Get the description text that may be shown in a hover for this
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
889 * decoration.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
890 *
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
891 * @return the text to be shown as a description for the decoration, or
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
892 * <code>null</code> if none has been set.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
893 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
894 public String getDescriptionText() {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
895 return descriptionText;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
896 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
897
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
898 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
899 * Set the image shown in this control decoration. Update the rendered
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
900 * decoration.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
901 *
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
902 * @param text
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
903 * the text to be shown as a description for the decoration, or
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
904 * <code>null</code> if none has been set.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
905 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
906 public void setDescriptionText(String text) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
907 this.descriptionText = text;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
908 update();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
909 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
910
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
911 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
912 * Get the image shown in this control decoration.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
913 *
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
914 * @return the image to be shown adjacent to the control, or
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
915 * <code>null</code> if one has not been set.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
916 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
917 public Image getImage() {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
918 return image;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
919 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
920
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
921 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
922 * Set the image shown in this control decoration. Update the rendered
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
923 * decoration.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
924 *
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
925 * @param image
70
46a6e0e6ccd4 Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 34
diff changeset
926 * the image to be shown adjacent to the control. Should never be
46a6e0e6ccd4 Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 34
diff changeset
927 * <code>null</code>.
29
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
928 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
929 public void setImage(Image image) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
930 this.image = image;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
931 update();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
932 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
933
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
934 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
935 * Get the bool that controls whether the decoration is shown only when
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
936 * the control has focus. The default value of this setting is
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
937 * <code>false</code>.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
938 *
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
939 * @return <code>true</code> if the decoration should only be shown when
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
940 * the control has focus, and <code>false</code> if it should
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
941 * always be shown. Note that if the control is not capable of
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
942 * receiving focus (<code>DWT.NO_FOCUS</code>), then the
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
943 * decoration will never show when this value is <code>true</code>.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
944 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
945 public bool getShowOnlyOnFocus() {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
946 return showOnlyOnFocus;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
947 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
948
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
949 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
950 * Set the bool that controls whether the decoration is shown only when
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
951 * the control has focus. The default value of this setting is
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
952 * <code>false</code>.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
953 *
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
954 * @param showOnlyOnFocus
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
955 * <code>true</code> if the decoration should only be shown
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
956 * when the control has focus, and <code>false</code> if it
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
957 * should always be shown. Note that if the control is not
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
958 * capable of receiving focus (<code>DWT.NO_FOCUS</code>),
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
959 * then the decoration will never show when this value is
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
960 * <code>true</code>.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
961 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
962 public void setShowOnlyOnFocus(bool showOnlyOnFocus) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
963 this.showOnlyOnFocus = showOnlyOnFocus;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
964 update();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
965 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
966
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
967 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
968 * Get the bool that controls whether the decoration's description text
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
969 * should be shown in a hover when the user hovers over the decoration. The
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
970 * default value of this setting is <code>true</code>.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
971 *
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
972 * @return <code>true</code> if a hover popup containing the decoration's
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
973 * description text should be shown when the user hovers over the
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
974 * decoration, and <code>false</code> if a hover should not be
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
975 * shown.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
976 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
977 public bool getShowHover() {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
978 return showHover;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
979 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
980
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
981 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
982 * Set the bool that controls whether the decoration's description text
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
983 * should be shown in a hover when the user hovers over the decoration. The
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
984 * default value of this setting is <code>true</code>.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
985 *
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
986 * @param showHover
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
987 * <code>true</code> if a hover popup containing the
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
988 * decoration's description text should be shown when the user
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
989 * hovers over the decoration, and <code>false</code> if a
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
990 * hover should not be shown.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
991 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
992 public void setShowHover(bool showHover) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
993 this.showHover = showHover;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
994 update();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
995 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
996
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
997 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
998 * Get the margin width in pixels that should be used between the decorator
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
999 * and the horizontal edge of the control. The default value of this setting
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1000 * is <code>0</code>.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1001 *
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1002 * @return the number of pixels that should be reserved between the
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1003 * horizontal edge of the control and the adjacent edge of the
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1004 * decoration.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1005 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1006 public int getMarginWidth() {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1007 return marginWidth;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1008 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1009
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1010 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1011 * Set the margin width in pixels that should be used between the decorator
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1012 * and the horizontal edge of the control. The default value of this setting
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1013 * is <code>0</code>.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1014 *
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1015 * @param marginWidth
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1016 * the number of pixels that should be reserved between the
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1017 * horizontal edge of the control and the adjacent edge of the
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1018 * decoration.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1019 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1020 public void setMarginWidth(int marginWidth) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1021 this.marginWidth = marginWidth;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1022 update();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1023 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1024
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1025 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1026 * Something has changed, requiring redraw. Redraw the decoration and update
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1027 * the hover text if appropriate.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1028 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1029 protected void update() {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1030 if (control is null || control.isDisposed()) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1031 return;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1032 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1033 Rectangle rect = getDecorationRectangle(control.getShell());
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1034 // Redraw this rectangle in all children
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1035 control.getShell()
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1036 .redraw(rect.x, rect.y, rect.width, rect.height, true);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1037 control.getShell().update();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1038 if (hover !is null && getDescriptionText() !is null) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1039 hover.setText(getDescriptionText(), getDecorationRectangle(control
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1040 .getParent()), control);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1041 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1042 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1043
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1044 /*
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1045 * Show the specified text in the hover, positioning the hover near the
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1046 * specified control.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1047 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1048 private void showHoverText(String text, Control hoverNear) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1049 // If we aren't to show a hover, don't do anything.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1050 if (!showHover) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1051 return;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1052 }
70
46a6e0e6ccd4 Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 34
diff changeset
1053
46a6e0e6ccd4 Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 34
diff changeset
1054 // If we are not visible, don't show the hover.
46a6e0e6ccd4 Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 34
diff changeset
1055 if (!visible) {
46a6e0e6ccd4 Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 34
diff changeset
1056 return;
46a6e0e6ccd4 Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 34
diff changeset
1057 }
29
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1058 // If there is no text, don't do anything.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1059 if (text is null) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1060 hideHover();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1061 return;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1062 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1063
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1064 // If there is no control, nothing to do
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1065 if (control is null) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1066 return;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1067 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1068 // Create the hover if it's not showing
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1069 if (hover is null) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1070 hover = new Hover(hoverNear.getShell());
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1071 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1072 hover.setText(text, getDecorationRectangle(control.getParent()),
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1073 control);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1074 hover.setVisible(true);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1075 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1076
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1077 /*
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1078 * Remove any listeners installed on the controls.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1079 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1080 private void removeControlListeners() {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1081 if (control is null) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1082 return;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1083 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1084 printRemoveListener(control, "FOCUS"); //$NON-NLS-1$
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1085 control.removeFocusListener(focusListener);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1086 focusListener = null;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1087
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1088 printRemoveListener(control, "DISPOSE"); //$NON-NLS-1$
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1089 control.removeDisposeListener(disposeListener);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1090 disposeListener = null;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1091
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1092 Composite c = control.getParent();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1093 while (c !is null) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1094 removeCompositeListeners(c);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1095 if (composite !is null && composite is c) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1096 // We previously installed listeners only to the specified
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1097 // composite, so stop.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1098 c = null;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1099 } else if (cast(Shell)c ) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1100 // We previously installed listeners only up to the first Shell
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1101 // encountered, so stop.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1102 c = null;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1103 } else {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1104 c = c.getParent();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1105 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1106 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1107 paintListener = null;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1108 mouseTrackListener = null;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1109 compositeListener = null;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1110
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1111 // We may have a remaining mouse move listener installed
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1112 if (moveListeningTarget !is null) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1113 printRemoveListener(moveListeningTarget, "MOUSEMOVE"); //$NON-NLS-1$
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1114 moveListeningTarget.removeMouseMoveListener(mouseMoveListener);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1115 moveListeningTarget = null;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1116 mouseMoveListener = null;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1117 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1118 if (DEBUG) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1119 if (listenerInstalls > 0) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1120 Stdout.formatln("LISTENER LEAK>>>CHECK TRACE ABOVE"); //$NON-NLS-1$
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1121 } else if (listenerInstalls < 0) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1122 Stdout.formatln("REMOVED UNREGISTERED LISTENERS>>>CHECK TRACE ABOVE"); //$NON-NLS-1$
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1123 } else {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1124 Stdout.formatln("ALL INSTALLED LISTENERS WERE REMOVED."); //$NON-NLS-1$
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1125 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1126 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1127 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1128
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1129 /**
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1130 * Return the rectangle in which the decoration should be rendered, in
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1131 * coordinates relative to the specified control. If the specified control
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1132 * is null, return the rectangle in display coordinates.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1133 *
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1134 * @param targetControl
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1135 * the control whose coordinates should be used
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1136 * @return the rectangle in which the decoration should be rendered
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1137 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1138 protected Rectangle getDecorationRectangle(Control targetControl) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1139 if (getImage() is null || control is null) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1140 return new Rectangle(0, 0, 0, 0);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1141 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1142 // Compute the bounds first relative to the control's parent.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1143 Rectangle imageBounds = getImage().getBounds();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1144 Rectangle controlBounds = control.getBounds();
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1145 int x, y;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1146 // Compute x
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1147 if ((position & DWT.RIGHT) is DWT.RIGHT) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1148 x = controlBounds.x + controlBounds.width + marginWidth;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1149 } else {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1150 // default is left
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1151 x = controlBounds.x - imageBounds.width - marginWidth;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1152 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1153 // Compute y
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1154 if ((position & DWT.TOP) is DWT.TOP) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1155 y = controlBounds.y;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1156 } else if ((position & DWT.BOTTOM) is DWT.BOTTOM) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1157 y = controlBounds.y + control.getBounds().height
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1158 - imageBounds.height;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1159 } else {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1160 // default is center
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1161 y = controlBounds.y
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1162 + (control.getBounds().height - imageBounds.height) / 2;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1163 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1164
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1165 // Now convert to coordinates relative to the target control.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1166 Point globalPoint = control.getParent().toDisplay(x, y);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1167 Point targetPoint;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1168 if (targetControl is null) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1169 targetPoint = globalPoint;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1170 } else {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1171 targetPoint = targetControl.toControl(globalPoint);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1172 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1173 return new Rectangle(targetPoint.x, targetPoint.y, imageBounds.width,
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1174 imageBounds.height);
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1175 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1176
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1177 /*
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1178 * Return true if the decoration should be shown, false if it should not.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1179 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1180 private bool shouldShowDecoration() {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1181 if (!visible) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1182 return false;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1183 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1184 if (control is null || control.isDisposed() || getImage() is null) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1185 return false;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1186 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1187
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1188 if (!control.isVisible()) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1189 return false;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1190 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1191 if (showOnlyOnFocus) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1192 return hasFocus;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1193 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1194 return true;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1195 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1196
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1197 /*
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1198 * If in debug mode, print info about adding the specified listener.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1199 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1200 private void printAddListener(Widget widget, String listenerType) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1201 listenerInstalls++;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1202 if (DEBUG) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1203 Stdout.formatln("Added listener>>>{} to>>>{}", listenerType, widget); //$NON-NLS-1$//$NON-NLS-2$
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1204 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1205 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1206
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1207 /*
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1208 * If in debug mode, print info about adding the specified listener.
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1209 */
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1210 private void printRemoveListener(Widget widget, String listenerType) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1211 listenerInstalls--;
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1212 if (DEBUG) {
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1213 Stdout.formatln("Removed listener>>>{} from>>>{}", listenerType, widget); //$NON-NLS-1$//$NON-NLS-2$
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1214 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1215 }
f12d40e7da8f fieldassist
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1216 }