annotate dwtx/jface/fieldassist/DecoratedField.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
17
f459f9147650 ImageAndMessgeDialog
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: 39
diff changeset
2 * Copyright (c) 2005, 2008 IBM Corporation and others.
17
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
3 * All rights reserved. This program and the accompanying materials
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
4 * are made available under the terms of the Eclipse Public License v1.0
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
5 * which accompanies this distribution, and is available at
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
6 * http://www.eclipse.org/legal/epl-v10.html
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
7 *
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
8 * Contributors:
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
9 * IBM Corporation - initial API and implementation
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
10 * Port to the D programming language:
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
11 * Frank Benoit <benoit@tionex.de>
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
12 *******************************************************************************/
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
13 module dwtx.jface.fieldassist.DecoratedField;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
14
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
15 import dwtx.jface.fieldassist.FieldDecoration;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
16 import dwtx.jface.fieldassist.FieldDecorationRegistry;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
17 import dwtx.jface.fieldassist.IControlCreator;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
18
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
19 import dwt.DWT;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
20 import dwt.events.DisposeEvent;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
21 import dwt.events.DisposeListener;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
22 import dwt.events.FocusEvent;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
23 import dwt.events.FocusListener;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
24 import dwt.events.MouseAdapter;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
25 import dwt.events.MouseEvent;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
26 import dwt.events.MouseTrackListener;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
27 import dwt.events.PaintEvent;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
28 import dwt.events.PaintListener;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
29 import dwt.graphics.GC;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
30 import dwt.graphics.Image;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
31 import dwt.graphics.Point;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
32 import dwt.graphics.Region;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
33 import dwt.layout.FormAttachment;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
34 import dwt.layout.FormData;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
35 import dwt.layout.FormLayout;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
36 import dwt.widgets.Composite;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
37 import dwt.widgets.Control;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
38 import dwt.widgets.Display;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
39 import dwt.widgets.Label;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
40 import dwt.widgets.Shell;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
41 import dwtx.core.runtime.Assert;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
42
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
43 import dwt.dwthelper.utils;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
44
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
45 /**
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
46 * DecoratedField manages image decorations around a control. It allows clients
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
47 * to specify an image decoration and a position for the decoration relative to
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
48 * the field. Decorations may be assigned descriptions, which are shown when the
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
49 * user hovers over the decoration. Clients can decorate any kind of control by
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
50 * supplying a {@link IControlCreator} to create the control that is decorated.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
51 * <p>
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
52 * Decorations always appear on either horizontal side of the field, never above
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
53 * or below it. Decorations can be positioned at the top or bottom of either
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
54 * side. Future implementations may provide additional positioning options for
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
55 * decorations.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
56 * <p>
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
57 * By default, DecoratedField will consult the {@link FieldDecorationRegistry}
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
58 * to determine how much space should be reserved for each decoration. This
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
59 * allows fields with decorations from different sources to align properly on
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
60 * the same dialog, since the registry tracks the size of all decorations
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
61 * registered. Therefore, it is recommended, but not required, that clients of
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
62 * DecoratedField register the decorations used. In cases where alignment
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
63 * between different fields is not a concern, clients can use
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
64 * <code>setUseMaximumDecorationWidth(false)</code> and need not register
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
65 * their decorations.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
66 * <p>
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
67 * This class is not intended to be subclassed.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
68 *
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
69 * @since 3.2
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
70 * @deprecated As of 3.3, clients should use {@link ControlDecoration} instead.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
71 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
72 public class DecoratedField {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
73
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
74 /**
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
75 * Cached platform flags for dealing with platform-specific issues.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
76 */
35
ef4534de0cf9 remaining files
Frank Benoit <benoit@tionex.de>
parents: 17
diff changeset
77 private static bool CARBON(){
ef4534de0cf9 remaining files
Frank Benoit <benoit@tionex.de>
parents: 17
diff changeset
78 return "carbon".equals(DWT.getPlatform()); //$NON-NLS-1$
ef4534de0cf9 remaining files
Frank Benoit <benoit@tionex.de>
parents: 17
diff changeset
79 }
17
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
80
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
81 /**
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
82 * Constants describing the array indices used to hold the decorations in
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
83 * array slots.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
84 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
85
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
86 private static const int LEFT_TOP = 0;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
87
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
88 private static const int LEFT_BOTTOM = 1;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
89
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
90 private static const int RIGHT_TOP = 2;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
91
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
92 private static const int RIGHT_BOTTOM = 3;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
93
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
94 private static const int DECORATION_SLOTS = 4;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
95
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
96 /**
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
97 * Simple data structure class for specifying the internals for a field
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
98 * decoration. This class contains data specific to the implementation of
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
99 * field decorations as labels attached to the field. Clients should use
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
100 * <code>FieldDecoration</code> for specifying a decoration.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
101 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
102 private class FieldDecorationData {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
103
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
104 /* Package */FieldDecoration decoration;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
105
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
106 /* Package */Label label;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
107
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
108 /* Package */FormData data;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
109
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
110 /* Package */bool showOnFocus;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
111
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
112 /* Package */bool visible = true;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
113
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
114 /**
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
115 * Create a decoration data representing the specified decoration, using
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
116 * the specified label and form data for its representation.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
117 *
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
118 * @param decoration
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
119 * the decoration whose data is kept.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
120 * @param label
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
121 * the label used to represent the decoration.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
122 * @param formData
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
123 * the form data used to attach the decoration to its field.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
124 * @param showOnFocus
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
125 * a bool specifying whether the decoration should only be
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
126 * shown when the field has focus.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
127 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
128 this(FieldDecoration decoration, Label label,
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
129 FormData formData, bool showOnFocus) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
130 this.decoration = decoration;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
131 this.label = label;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
132 this.data = formData;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
133 this.showOnFocus = showOnFocus;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
134 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
135 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
136
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
137 /**
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
138 * Decorations keyed by position.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
139 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
140 private FieldDecorationData[] decDatas;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
141
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
142 /**
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
143 * The associated control
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
144 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
145 private Control control;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
146
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
147 /**
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
148 * The composite with form layout used to manage decorations.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
149 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
150 private Composite form;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
151
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
152 /**
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
153 * The bool that indicates whether the maximum decoration width is used
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
154 * when allocating space for decorations.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
155 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
156 private bool useMaxDecorationWidth = true;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
157
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
158 /**
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
159 * The hover used for showing description text
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
160 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
161 private Hover hover;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
162
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
163 /**
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
164 * The hover used to show a decoration image's description.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
165 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
166 class Hover {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
167 private static const String EMPTY = ""; //$NON-NLS-1$
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
168
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
169 /**
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
170 * Offset of info hover arrow from the left or right side.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
171 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
172 private int hao = 10;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
173
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
174 /**
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
175 * Width of info hover arrow.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
176 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
177 private int haw = 8;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
178
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
179 /**
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
180 * Height of info hover arrow.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
181 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
182 private int hah = 10;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
183
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
184 /**
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
185 * Margin around info hover text.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
186 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
187 private int hm = 2;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
188
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
189 /**
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
190 * This info hover's shell.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
191 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
192 Shell hoverShell;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
193
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
194 /**
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
195 * The info hover text.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
196 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
197 String text = EMPTY;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
198
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
199 /**
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
200 * The region used to manage the shell shape
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
201 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
202 Region region;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
203
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
204 /**
70
46a6e0e6ccd4 Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 39
diff changeset
205 * Boolean indicating whether the last computed polygon location had an
17
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
206 * arrow on left. (true if left, false if right).
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
207 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
208 bool arrowOnLeft = true;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
209
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
210 /*
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
211 * Create a hover parented by the specified shell.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
212 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
213 this(Shell parent) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
214 final Display display = parent.getDisplay();
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
215 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: 39
diff changeset
216 | DWT.NO_FOCUS | DWT.TOOL);
17
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
217 hoverShell.setBackground(display
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
218 .getSystemColor(DWT.COLOR_INFO_BACKGROUND));
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
219 hoverShell.setForeground(display
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
220 .getSystemColor(DWT.COLOR_INFO_FOREGROUND));
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
221 hoverShell.addPaintListener(new class PaintListener {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
222 public void paintControl(PaintEvent pe) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
223 pe.gc.drawString(text, hm, hm);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
224 if (!CARBON) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
225 pe.gc.drawPolygon(getPolygon(true));
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
226 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
227 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
228 });
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
229 hoverShell.addMouseListener(new class MouseAdapter {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
230 public void mouseDown(MouseEvent e) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
231 hideHover();
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
232 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
233 });
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
234 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
235
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
236 /*
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
237 * Compute a polygon that represents a hover with an arrow pointer. If
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
238 * border is true, compute the polygon inset by 1-pixel border. Consult
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
239 * the arrowOnLeft flag to determine which side the arrow is on.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
240 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
241 int[] getPolygon(bool border) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
242 Point e = getExtent();
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
243 int b = border ? 1 : 0;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
244 if (arrowOnLeft) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
245 return [ 0, 0, e.x - b, 0, e.x - b, e.y - b,
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
246 hao + haw, e.y - b, hao + haw / 2, e.y + hah - b, hao,
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
247 e.y - b, 0, e.y - b, 0, 0 ];
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
248 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
249 return [ 0, 0, e.x - b, 0, e.x - b, e.y - b,
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
250 e.x - hao - b, e.y - b, e.x - hao - haw / 2, e.y + hah - b,
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
251 e.x - hao - haw, e.y - b, 0, e.y - b, 0, 0 ];
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
252 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
253
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
254 /*
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
255 * Dispose the hover, it is no longer needed. Dispose any resources
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
256 * allocated by the hover.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
257 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
258 void dispose() {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
259 if (!hoverShell.isDisposed()) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
260 hoverShell.dispose();
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
261 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
262 if (region !is null) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
263 region.dispose();
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
264 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
265 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
266
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
267 /*
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
268 * Set the visibility of the hover.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
269 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
270 void setVisible(bool visible) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
271 if (visible) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
272 if (!hoverShell.isVisible()) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
273 hoverShell.setVisible(true);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
274 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
275 } else {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
276 if (hoverShell.isVisible()) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
277 hoverShell.setVisible(false);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
278 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
279 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
280 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
281
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
282 /*
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
283 * Set the text of the hover to the specified text. Recompute the size
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
284 * and location of the hover to hover near the specified control,
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
285 * pointing the arrow toward the target control.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
286 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
287 void setText(String t, Control hoverNear, Control targetControl) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
288 if (t is null) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
289 t = EMPTY;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
290 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
291 if (!t.equals(text)) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
292 Point oldSize = getExtent();
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
293 text = t;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
294 hoverShell.redraw();
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
295 Point newSize = getExtent();
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
296 if (!oldSize.opEquals(newSize)) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
297 // set a flag that indicates the direction of arrow
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
298 arrowOnLeft = hoverNear.getLocation().x <= targetControl
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
299 .getLocation().x;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
300 setNewShape();
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
301 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
302 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
303
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
304 if (hoverNear !is null) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
305 Point extent = getExtent();
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
306 int y = -extent.y - hah + 1;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
307 int x = arrowOnLeft ? -hao + haw / 2 : -extent.x + hao + haw
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
308 / 2;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
309
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
310 hoverShell.setLocation(hoverNear.toDisplay(x, y));
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
311 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
312
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
313 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
314
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
315 /*
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
316 * Return whether or not the hover (shell) is visible.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
317 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
318 bool isVisible() {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
319 return hoverShell.isVisible();
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
320 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
321
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
322 /*
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
323 * Compute the extent of the hover for the current text.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
324 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
325 Point getExtent() {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
326 GC gc = new GC(hoverShell);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
327 Point e = gc.textExtent(text);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
328 gc.dispose();
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
329 e.x += hm * 2;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
330 e.y += hm * 2;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
331 return e;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
332 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
333
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
334 /*
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
335 * Compute a new shape for the hover shell.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
336 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
337 void setNewShape() {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
338 Region oldRegion = region;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
339 region = new Region();
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
340 region.add(getPolygon(false));
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
341 hoverShell.setRegion(region);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
342 if (oldRegion !is null) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
343 oldRegion.dispose();
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
344 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
345
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
346 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
347 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
348
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
349 /**
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
350 * Construct a decorated field which is parented by the specified composite
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
351 * and has the given style bits. Use the controlCreator to create the
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
352 * specific kind of control that is decorated inside the field.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
353 *
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
354 * @param parent
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
355 * the parent of the decorated field.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
356 * @param style
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
357 * the desired style bits for the field.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
358 * @param controlCreator
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
359 * the IControlCreator used to specify the specific kind of
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
360 * control that is to be decorated.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
361 *
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
362 * @see IControlCreator
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
363 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
364 public this(Composite parent, int style,
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
365 IControlCreator controlCreator) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
366 decDatas = new FieldDecorationData[DECORATION_SLOTS];
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
367 this.form = createForm(parent);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
368 this.control = controlCreator.createControl(form, style);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
369
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
370 addControlListeners();
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
371 form.setTabList([ control ]);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
372
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
373 // Set up the initial layout data.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
374 FormData data = new FormData();
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
375 data.left = new FormAttachment(0, 0);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
376 data.top = new FormAttachment(0, 0);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
377 data.right = new FormAttachment(100, 0);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
378 data.bottom = new FormAttachment(100, 0);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
379 control.setLayoutData(data);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
380
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
381 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
382
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
383 /**
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
384 * Adds an image decoration to the field.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
385 *
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
386 * @param decoration
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
387 * A FieldDecoration describing the image and description for the
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
388 * decoration
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
389 *
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
390 * @param position
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
391 * The DWT constant indicating the position of the decoration
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
392 * relative to the field's control. The position should include
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
393 * style bits describing both the vertical and horizontal
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
394 * orientation. <code>DWT.LEFT</code> and
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
395 * <code>DWT.RIGHT</code> describe the horizontal placement of
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
396 * the decoration relative to the field, and the constants
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
397 * <code>DWT.TOP</code> and <code>DWT.BOTTOM</code> describe
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
398 * the vertical alignment of the decoration relative to the
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
399 * field. Decorations always appear on either horizontal side of
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
400 * the field, never above or below it. For example, a decoration
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
401 * appearing on the left side of the field, at the top, is
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
402 * specified as DWT.LEFT | DWT.TOP. If an image decoration
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
403 * already exists in the specified position, it will be replaced
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
404 * by the one specified.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
405 * @param showOnFocus
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
406 * <code>true</code> if the decoration should only be shown
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
407 * when the associated control has focus, <code>false</code> if
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
408 * it should always be shown.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
409 *
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
410 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
411 public void addFieldDecoration(FieldDecoration decoration, int position,
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
412 bool showOnFocus) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
413 Label label;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
414 FormData formData;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
415 int i = indexForPosition(position);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
416 if (decDatas[i] is null) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
417 formData = createFormDataForIndex(i, decoration.getImage());
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
418 label = new Label(form, DWT.HORIZONTAL | DWT.VERTICAL | DWT.CENTER);
39
644f1334b451 fix anon classes
Frank Benoit <benoit@tionex.de>
parents: 35
diff changeset
419 label.addMouseTrackListener(new class(label) MouseTrackListener {
17
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
420 Label label_;
39
644f1334b451 fix anon classes
Frank Benoit <benoit@tionex.de>
parents: 35
diff changeset
421 this(Label a){
644f1334b451 fix anon classes
Frank Benoit <benoit@tionex.de>
parents: 35
diff changeset
422 label_=a;
17
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
423 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
424 public void mouseHover(MouseEvent event) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
425 FieldDecorationData decData = cast(FieldDecorationData) event.widget
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
426 .getData();
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
427 String desc = decData.decoration.getDescription();
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
428 if (desc !is null) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
429 showHoverText(desc, label_);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
430 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
431 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
432
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
433 public void mouseEnter(MouseEvent event) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
434 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
435
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
436 public void mouseExit(MouseEvent event) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
437 hideHover();
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
438 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
439 });
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
440 decDatas[i] = new FieldDecorationData(decoration, label, formData,
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
441 showOnFocus);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
442 } else {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
443 label = decDatas[i].label;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
444 formData = decDatas[i].data;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
445 decDatas[i].decoration = decoration;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
446 decDatas[i].showOnFocus = showOnFocus;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
447 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
448 label.setImage(decDatas[i].decoration.getImage());
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
449 label.setData(decDatas[i]);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
450 label.setLayoutData(formData);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
451 label.setVisible(!showOnFocus);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
452
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
453 // Since sizes may have changed or there could be a new position
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
454 // defined, we need to update layout data on the control.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
455 updateControlAttachments(i, decDatas[i]);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
456 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
457
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
458 /*
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
459 * A decoration at the specified index has been added. Update the control's
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
460 * attachments if it has not previously been attached on that side or if it
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
461 * was attached to a decoration with a lesser width.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
462 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
463 private void updateControlAttachments(int index, FieldDecorationData decData) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
464 FormData formData = cast(FormData) control.getLayoutData();
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
465 int newWidth = widthOf(decData.decoration.getImage());
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
466 // opposing represents the location of the decoration above or below
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
467 // the one in question.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
468 int opposing;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
469
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
470 switch (index) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
471 case LEFT_TOP:
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
472 case LEFT_BOTTOM:
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
473 if (index is LEFT_TOP) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
474 opposing = LEFT_BOTTOM;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
475 } else {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
476 opposing = LEFT_TOP;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
477 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
478 if (decDatas[opposing] is null) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
479 // No decorator on the opposing side.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
480 // Attach the control to this decorator
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
481 formData.left = new FormAttachment(decData.label);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
482 } else if (decDatas[opposing].data.width < newWidth) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
483 // Decorator on opposing side is the smaller one. Attach
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
484 // control to the new one.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
485 formData.left = new FormAttachment(decData.label);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
486 // Center align the smaller one relative to the larger one.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
487 decDatas[opposing].data.left.alignment = DWT.CENTER;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
488 decDatas[opposing].data.left.control = decData.label;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
489 } else {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
490 // The new decorator is the smaller one. Keep the
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
491 // control attached to the opposing one.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
492 formData = null;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
493 // Horizontally center the smaller one relative to the larger
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
494 // one.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
495 decData.data.left.alignment = DWT.CENTER;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
496 decData.data.left.control = decDatas[opposing].label;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
497 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
498 break;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
499 /*
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
500 * The only real difference in right side cases is that we are attaching
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
501 * the right side of the control to the wider decoration rather than the
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
502 * left side of the control. Other concerns (horizontally aligning the
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
503 * smaller decoration relative to the larger one) are the same.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
504 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
505 case RIGHT_TOP:
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
506 case RIGHT_BOTTOM:
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
507 if (index is RIGHT_TOP) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
508 opposing = RIGHT_BOTTOM;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
509 } else {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
510 opposing = RIGHT_TOP;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
511 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
512 if (decDatas[opposing] is null) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
513 // No decorator on the opposing side.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
514 // Attach the control to this decorator.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
515 formData.right = new FormAttachment(decData.label);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
516 } else if (decDatas[opposing].data.width < newWidth) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
517 // Decorator on opposing side is the smaller one. Attach
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
518 // control to the new one.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
519 formData.right = new FormAttachment(decData.label);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
520 // Center align the smaller one to the larger one.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
521 // Note that this could be done using the left or right
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
522 // attachment, we use the right since it is already
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
523 // created for all right-side decorations.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
524 decDatas[opposing].data.right.alignment = DWT.CENTER;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
525 decDatas[opposing].data.right.control = decData.label;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
526 } else {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
527 // The new decorator is the smaller one. Keep the
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
528 // control attached to the opposing one.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
529 formData = null;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
530 // Horizontally center align the smaller one to the
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
531 // larger one.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
532 decData.data.right.alignment = DWT.CENTER;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
533 decData.data.right.control = decDatas[opposing].label;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
534 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
535 break;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
536 default:
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
537 return;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
538 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
539 if (formData !is null) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
540 // Form data was updated.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
541 control.setLayoutData(formData);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
542 form.layout();
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
543 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
544 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
545
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
546 /**
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
547 * Get the control that is decorated by the receiver.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
548 *
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
549 * @return the Control decorated by the receiver, or <code>null</code> if
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
550 * none has been created yet.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
551 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
552 public Control getControl() {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
553 return control;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
554 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
555
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
556 /**
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
557 * Get the control that represents the decorated field. This composite
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
558 * should be used to lay out the field within its parent.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
559 *
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
560 * @return the Control that should be layed out in the field's parent's
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
561 * layout. This is typically not the control itself, since
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
562 * additional controls are used to represent the decorations.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
563 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
564 public Control getLayoutControl() {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
565 return form;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
566 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
567
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
568 /**
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
569 * Create the parent composite and a form layout that will be used to manage
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
570 * decorations.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
571 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
572 private Composite createForm(Composite parent) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
573 Composite composite = new Composite(parent, DWT.NO_FOCUS);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
574 // see https://bugs.eclipse.org/bugs/show_bug.cgi?id=126553
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
575 composite.setBackgroundMode(DWT.INHERIT_DEFAULT);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
576 composite.setLayout(new FormLayout());
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
577 return composite;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
578 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
579
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
580 /**
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
581 * Add any listeners needed on the target control.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
582 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
583 private void addControlListeners() {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
584 control.addDisposeListener(new class DisposeListener {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
585 public void widgetDisposed(DisposeEvent event) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
586 if (hover !is null) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
587 hover.dispose();
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
588 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
589 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
590 });
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
591 control.addFocusListener(new class FocusListener {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
592 public void focusGained(FocusEvent event) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
593 controlFocusGained();
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
594 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
595
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
596 public void focusLost(FocusEvent event) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
597 controlFocusLost();
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
598 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
599
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
600 });
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
601 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
602
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
603 /*
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
604 * Return the index in the array of decoration datas that represents the
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
605 * specified DWT position.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
606 *
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
607 * @param position The DWT constant indicating the position of the
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
608 * decoration relative to the field's control. The position should include
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
609 * style bits describing both the vertical and horizontal orientation.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
610 * <code>DWT.LEFT</code> and <code>DWT.RIGHT</code> describe the
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
611 * horizontal placement of the decoration relative to the field, and the
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
612 * constants <code>DWT.TOP</code> and <code>DWT.BOTTOM</code> describe
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
613 * the vertical alignment of the decoration relative to the field.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
614 * Decorations always appear on either horizontal side of the field, never
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
615 * above or below it. For example, a decoration appearing on the left side
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
616 * of the field, at the top, is specified as DWT.LEFT | DWT.TOP.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
617 *
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
618 * @return index the index in the array of decorations that represents the
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
619 * specified DWT position. If the position is not an expected position, the
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
620 * index representing the top left position will be returned.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
621 *
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
622 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
623 private int indexForPosition(int position) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
624 switch (position) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
625 case DWT.LEFT | DWT.BOTTOM:
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
626 return LEFT_BOTTOM;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
627 case DWT.RIGHT | DWT.TOP:
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
628 return RIGHT_TOP;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
629 case DWT.RIGHT | DWT.BOTTOM:
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
630 return RIGHT_BOTTOM;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
631 default:
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
632 return LEFT_TOP;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
633 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
634 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
635
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
636 /*
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
637 * Create a form data that will place the decoration at the specified
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
638 * position.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
639 *
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
640 * @param index the index in the decDatas describing the position of the
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
641 * decoration.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
642 *
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
643 * @param image the image shown in the decoration.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
644 *
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
645 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
646 private FormData createFormDataForIndex(int index, Image image) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
647 Assert.isTrue(index >= 0 && index < DECORATION_SLOTS,
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
648 "Index out of range"); //$NON-NLS-1$
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
649
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
650 FormData data = new FormData();
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
651 switch (index) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
652 case LEFT_TOP:
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
653 data.left = new FormAttachment(0, 0);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
654 data.top = new FormAttachment(0, 0);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
655 break;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
656 case LEFT_BOTTOM:
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
657 data.left = new FormAttachment(0, 0);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
658 data.bottom = new FormAttachment(100, 0);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
659 break;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
660 case RIGHT_TOP:
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
661 data.right = new FormAttachment(100, 0);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
662 data.top = new FormAttachment(0, 0);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
663 break;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
664 case RIGHT_BOTTOM:
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
665 data.right = new FormAttachment(100, 0);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
666 data.bottom = new FormAttachment(100, 0);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
667 break;
192
c3583c6ec027 Added missing default cases for switch statements
Frank Benoit <benoit@tionex.de>
parents: 70
diff changeset
668 default:
17
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
669 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
670 data.width = widthOf(image);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
671 data.height = DWT.DEFAULT;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
672
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
673 return data;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
674 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
675
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
676 /**
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
677 * Show the specified text using the same hover dialog as is used to show
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
678 * decorator descriptions. Normally, a decoration's description text will be
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
679 * shown in an info hover over the field's control whenever the mouse hovers
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
680 * over the decoration. This method can be used to show a decoration's
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
681 * description text at other times (such as when the control receives
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
682 * focus), or to show other text associated with the field.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
683 *
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
684 * <p>
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
685 * If there is currently a hover visible, the hover's text will be replaced
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
686 * with the specified text.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
687 *
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
688 * @param text
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
689 * the text to be shown in the info hover, or <code>null</code>
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
690 * if no text should be shown.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
691 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
692 public void showHoverText(String text) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
693 showHoverText(text, control);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
694 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
695
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
696 /**
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
697 * Hide any hover popups that are currently showing on the control.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
698 * Normally, a decoration's description text will be shown in an info hover
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
699 * over the field's control as long as the mouse hovers over the decoration,
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
700 * and will be hidden when the mouse exits the control. This method can be
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
701 * used to hide a hover that was shown using <code>showHoverText</code>,
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
702 * or to programatically hide the current decoration hover.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
703 *
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
704 * <p>
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
705 * This message has no effect if there is no current hover.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
706 *
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
707 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
708 public void hideHover() {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
709 if (hover !is null) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
710 hover.setVisible(false);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
711 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
712 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
713
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
714 /*
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
715 * The target control gained focus. Any decorations that should show only
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
716 * when they have the focus should be shown here.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
717 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
718 private void controlFocusGained() {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
719 for (int i = 0; i < DECORATION_SLOTS; i++) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
720 if (decDatas[i] !is null && decDatas[i].showOnFocus) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
721 setVisible(decDatas[i], true);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
722 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
723 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
724 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
725
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
726 /*
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
727 * The target control lost focus. Any decorations that should show only when
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
728 * they have the focus should be hidden here.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
729 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
730 private void controlFocusLost() {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
731 for (int i = 0; i < DECORATION_SLOTS; i++) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
732 if (decDatas[i] !is null && decDatas[i].showOnFocus) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
733 setVisible(decDatas[i], false);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
734 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
735 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
736 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
737
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
738 /**
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
739 * Show the specified decoration. This message has no effect if the
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
740 * decoration is already showing, or was not already added to the field
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
741 * using <code>addFieldDecoration</code>.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
742 *
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
743 * @param decoration
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
744 * the decoration to be shown.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
745 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
746 public void showDecoration(FieldDecoration decoration) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
747 FieldDecorationData data = getDecorationData(decoration);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
748 if (data is null) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
749 return;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
750 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
751 // record the fact that client would like it to be visible
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
752 data.visible = true;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
753 // even if it is supposed to be shown, if the field does not have focus,
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
754 // do not show it (yet)
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
755 if (!data.showOnFocus || control.isFocusControl()) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
756 setVisible(data, true);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
757 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
758 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
759
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
760 /**
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
761 * Hide the specified decoration. This message has no effect if the
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
762 * decoration is already hidden, or was not already added to the field using
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
763 * <code>addFieldDecoration</code>.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
764 *
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
765 * @param decoration
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
766 * the decoration to be hidden.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
767 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
768 public void hideDecoration(FieldDecoration decoration) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
769 FieldDecorationData data = getDecorationData(decoration);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
770 if (data is null) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
771 return;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
772 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
773 // Store the desired visibility in the decData. We remember the
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
774 // client's instructions so that changes in visibility caused by
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
775 // field focus changes won't violate the client's visibility setting.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
776 data.visible = false;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
777 setVisible(data, false);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
778 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
779
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
780 /**
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
781 * Update the specified decoration. This message should be used if the image
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
782 * or description in the decoration have changed. This message has no
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
783 * immediate effect if the decoration is not visible, and no effect at all
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
784 * if the decoration was not previously added to the field.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
785 *
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
786 * @param decoration
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
787 * the decoration to be hidden.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
788 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
789 public void updateDecoration(FieldDecoration decoration) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
790 FieldDecorationData data = getDecorationData(decoration);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
791 if (data is null) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
792 return;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
793 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
794 if (data.label !is null) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
795 data.label.setImage(decoration.getImage());
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
796 // If the decoration is being shown, and a hover is active,
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
797 // update the hover text to display the new description.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
798 if (data.label.getVisible() is true && hover !is null) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
799 showHoverText(decoration.getDescription(), data.label);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
800 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
801 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
802 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
803
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
804 /*
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
805 * Set the visibility of the specified decoration data. This method does not
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
806 * change the visibility value stored in the decData, but instead consults
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
807 * it to determine how the visibility should be changed. This method is
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
808 * called any time visibility of a decoration might change, whether by
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
809 * client API or focus changes.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
810 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
811 private void setVisible(FieldDecorationData decData, bool visible) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
812 // Check the decData visibility flag, since it contains the client's
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
813 // instructions for visibility.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
814 if (visible && decData.visible) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
815 decData.label.setVisible(true);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
816 } else {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
817 decData.label.setVisible(false);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
818 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
819 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
820
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
821 /*
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
822 * Get the FieldDecorationData that corresponds to the given decoration.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
823 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
824 private FieldDecorationData getDecorationData(FieldDecoration dec) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
825 for (int i = 0; i < DECORATION_SLOTS; i++) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
826 if (decDatas[i] !is null && dec is decDatas[i].decoration
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
827 && decDatas[i].label !is null
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
828 && !decDatas[i].label.isDisposed()) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
829 return decDatas[i];
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
830 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
831 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
832 return null;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
833 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
834
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
835 /*
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
836 * Show the specified text in the hover, positioning the hover near the
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
837 * specified control.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
838 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
839 private void showHoverText(String text, Control hoverNear) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
840 if (text is null) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
841 hideHover();
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
842 return;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
843 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
844
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
845 if (hover is null) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
846 hover = new Hover(hoverNear.getShell());
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
847 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
848 hover.setText(text, hoverNear, control);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
849 hover.setVisible(true);
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
850 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
851
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
852 /**
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
853 * Set a bool that indicates whether the receiver should use the
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
854 * decoration registry's maximum decoration width when allocating space for
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
855 * decorations. The default value is <code>true</code>. Using the maximum
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
856 * decoration width is useful so that decorated fields on the same dialog
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
857 * that have different decoration widths will all align. This also allows
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
858 * client dialogs to align non-decorated fields with decorated fields by
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
859 * consulting the maximum decoration width.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
860 * </p>
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
861 * <p>
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
862 * Clients may wish to set this value to <code>false</code> in cases where
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
863 * space usage is more important than alignment of fields. This value must
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
864 * be set before the decorations are added in order to ensure proper
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
865 * alignment.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
866 * </p>
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
867 *
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
868 * @param useMaximumWidth
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
869 * <code>true</code> if the maximum decoration width should be
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
870 * used as the size for all decorations, <code>false</code> if
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
871 * only the decoration size should be used.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
872 *
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
873 * @see FieldDecorationRegistry#getMaximumDecorationWidth()
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
874 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
875 public void setUseMaximumDecorationWidth(bool useMaximumWidth) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
876 useMaxDecorationWidth = useMaximumWidth;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
877 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
878
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
879 /*
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
880 * Return the width appropriate for the specified decoration image.
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
881 */
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
882 private int widthOf(Image image) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
883 if (image is null) {
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
884 return 0;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
885 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
886 return useMaxDecorationWidth ? FieldDecorationRegistry.getDefault()
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
887 .getMaximumDecorationWidth() : image.getBounds().width;
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
888 }
f459f9147650 ImageAndMessgeDialog
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
889 }