annotate dwtx/jface/fieldassist/DecoratedField.d @ 17:f459f9147650

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