annotate dwtx/jface/resource/ResourceManager.d @ 104:04b47443bb01

Reworked the collection uses to make use of a wrapper collection that is compatible to the Java Collections. These new wrappers now use the tango.util.containers instead of the tango.util.collections.
author Frank Benoit <benoit@tionex.de>
date Thu, 07 Aug 2008 15:01:33 +0200
parents 6c14e54dfc11
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1 /*******************************************************************************
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2 * Copyright (c) 2004, 2006 IBM Corporation and others.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
3 * All rights reserved. This program and the accompanying materials
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
4 * are made available under the terms of the Eclipse Public License v1.0
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
5 * which accompanies this distribution, and is available at
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
6 * http://www.eclipse.org/legal/epl-v10.html
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
7 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
8 * Contributors:
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
9 * IBM Corporation - initial API and implementation
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
10 * Port to the D programming language:
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
11 * Frank Benoit <benoit@tionex.de>
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
12 *******************************************************************************/
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
13 module dwtx.jface.resource.ResourceManager;
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
14
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
15 import dwtx.jface.resource.DeviceResourceDescriptor;
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
16 import dwtx.jface.resource.ImageDescriptor;
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
17 import dwtx.jface.resource.ColorDescriptor;
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
18 import dwtx.jface.resource.FontDescriptor;
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
19 import dwtx.jface.resource.DeviceResourceException;
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
20 import dwtx.jface.resource.RGBColorDescriptor;
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
21
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
22 // import java.util.ArrayList;
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
23
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
24 import dwt.DWTException;
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
25 import dwt.graphics.Color;
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
26 import dwt.graphics.Device;
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
27 import dwt.graphics.Font;
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
28 import dwt.graphics.Image;
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
29 import dwt.graphics.RGB;
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
30 import dwtx.core.runtime.Assert;
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
31 import dwtx.core.runtime.IStatus;
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
32 import dwtx.core.runtime.Status;
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
33 import dwtx.jface.util.Policy;
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
34
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
35 import dwt.dwthelper.utils;
104
04b47443bb01 Reworked the collection uses to make use of a wrapper collection that is compatible to the Java Collections.
Frank Benoit <benoit@tionex.de>
parents: 9
diff changeset
36 import dwtx.dwtxhelper.Collection;
8
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
37 import dwt.dwthelper.Runnable;
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
38
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
39 /**
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
40 * This class manages DWT resources. It manages reference-counted instances of resources
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
41 * such as Fonts, Images, and Colors, and allows them to be accessed using descriptors.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
42 * Everything allocated through the registry should also be disposed through the registry.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
43 * Since the resources are shared and reference counted, they should never be disposed
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
44 * directly.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
45 * <p>
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
46 * ResourceManager handles correct allocation and disposal of resources. It differs from
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
47 * the various JFace *Registry classes, which also map symbolic IDs onto resources. In
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
48 * general, you should use a *Registry class to map IDs onto descriptors, and use a
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
49 * ResourceManager to convert the descriptors into real Images/Fonts/etc.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
50 * </p>
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
51 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
52 * @since 3.1
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
53 */
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
54 public abstract class ResourceManager {
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
55
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
56 /**
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
57 * List of Runnables scheduled to run when the ResourceManager is disposed.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
58 * null if empty.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
59 */
104
04b47443bb01 Reworked the collection uses to make use of a wrapper collection that is compatible to the Java Collections.
Frank Benoit <benoit@tionex.de>
parents: 9
diff changeset
60 private List disposeExecs = null;
8
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
61
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
62 /**
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
63 * Returns the Device for which this ResourceManager will create resources
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
64 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
65 * @since 3.1
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
66 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
67 * @return the Device associated with this ResourceManager
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
68 */
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
69 public abstract Device getDevice();
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
70
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
71 /**
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
72 * Returns the resource described by the given descriptor. If the resource already
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
73 * exists, the reference count is incremented and the exiting resource is returned.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
74 * Otherwise, a new resource is allocated. Every call to this method should have
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
75 * a corresponding call to {@link #destroy(DeviceResourceDescriptor)}.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
76 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
77 * <p>If the resource is intended to live for entire lifetime of the resource manager,
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
78 * a subsequent call to {@link #destroy(DeviceResourceDescriptor)} may be omitted and the
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
79 * resource will be cleaned up when the resource manager is disposed. This pattern
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
80 * is useful for short-lived {@link LocalResourceManager}s, but should never be used
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
81 * with the global resource manager since doing so effectively leaks the resource.</p>
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
82 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
83 * <p>The resources returned from this method are reference counted and may be shared
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
84 * internally with other resource managers. They should never be disposed outside of the
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
85 * ResourceManager framework, or it will cause exceptions in other code that shares
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
86 * them. For example, never call {@link dwt.graphics.Resource#dispose()}
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
87 * on anything returned from this method.</p>
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
88 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
89 * <p>Callers may safely downcast the result to the resource type associated with
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
90 * the descriptor. For example, when given an ImageDescriptor, the return
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
91 * value of this method will always be an Image.</p>
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
92 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
93 * @since 3.1
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
94 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
95 * @param descriptor descriptor for the resource to allocate
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
96 * @return the newly allocated resource (not null)
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
97 * @throws DeviceResourceException if unable to allocate the resource
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
98 */
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
99 public abstract Object create(DeviceResourceDescriptor descriptor);
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
100
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
101 /**
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
102 * Deallocates a resource previously allocated by {@link #create(DeviceResourceDescriptor)}.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
103 * Descriptors are compared by equality, not identity. If the same resource was
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
104 * created multiple times, this may decrement a reference count rather than
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
105 * disposing the actual resource.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
106 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
107 * @since 3.1
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
108 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
109 * @param descriptor identifier for the resource
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
110 */
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
111 public abstract void destroy(DeviceResourceDescriptor descriptor);
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
112
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
113 /**
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
114 * <p>Returns a previously-allocated resource or allocates a new one if none
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
115 * exists yet. The resource will remain allocated for at least the lifetime
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
116 * of this resource manager. If necessary, the resource will be deallocated
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
117 * automatically when the resource manager is disposed.</p>
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
118 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
119 * <p>The resources returned from this method are reference counted and may be shared
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
120 * internally with other resource managers. They should never be disposed outside of the
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
121 * ResourceManager framework, or it will cause exceptions in other code that shares
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
122 * them. For example, never call {@link dwt.graphics.Resource#dispose()}
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
123 * on anything returned from this method.</p>
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
124 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
125 * <p>
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
126 * Callers may safely downcast the result to the resource type associated with
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
127 * the descriptor. For example, when given an ImageDescriptor, the return
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
128 * value of this method may be downcast to Image.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
129 * </p>
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
130 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
131 * <p>
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
132 * This method should only be used for resources that should remain
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
133 * allocated for the lifetime of the resource manager. To allocate shorter-lived
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
134 * resources, manage them with <code>create</code>, and <code>destroy</code>
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
135 * rather than this method.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
136 * </p>
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
137 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
138 * <p>
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
139 * This method should never be called on the global resource manager,
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
140 * since all resources will remain allocated for the lifetime of the app and
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
141 * will be effectively leaked.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
142 * </p>
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
143 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
144 * @param descriptor identifier for the requested resource
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
145 * @return the requested resource. Never null.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
146 * @throws DeviceResourceException if the resource does not exist yet and cannot
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
147 * be created for any reason.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
148 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
149 * @since 3.3
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
150 */
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
151 public final Object get(DeviceResourceDescriptor descriptor) {
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
152 Object result = find(descriptor);
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
153
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
154 if (result is null) {
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
155 result = create(descriptor);
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
156 }
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
157
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
158 return result;
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
159 }
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
160
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
161 /**
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
162 * <p>Creates an image, given an image descriptor. Images allocated in this manner must
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
163 * be disposed by {@link #destroyImage(ImageDescriptor)}, and never by calling
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
164 * {@link Image#dispose()}.</p>
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
165 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
166 * <p>
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
167 * If the image is intended to remain allocated for the lifetime of the ResourceManager,
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
168 * the call to destroyImage may be omitted and the image will be cleaned up automatically
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
169 * when the ResourceManager is disposed. This should only be done with short-lived ResourceManagers,
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
170 * as doing so with the global manager effectively leaks the resource.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
171 * </p>
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
172 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
173 * @since 3.1
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
174 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
175 * @param descriptor descriptor for the image to create
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
176 * @return the Image described by this descriptor (possibly shared by other equivalent
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
177 * ImageDescriptors)
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
178 * @throws DeviceResourceException if unable to allocate the Image
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
179 */
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
180 public final Image createImage(ImageDescriptor descriptor) {
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
181 // Assertion added to help diagnose client bugs. See bug #83711 and bug #90454.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
182 Assert.isNotNull(descriptor);
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
183
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
184 return cast(Image)create(descriptor);
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
185 }
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
186
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
187 /**
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
188 * Creates an image, given an image descriptor. Images allocated in this manner must
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
189 * be disposed by {@link #destroyImage(ImageDescriptor)}, and never by calling
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
190 * {@link Image#dispose()}.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
191 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
192 * @since 3.1
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
193 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
194 * @param descriptor descriptor for the image to create
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
195 * @return the Image described by this descriptor (possibly shared by other equivalent
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
196 * ImageDescriptors)
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
197 */
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
198 public final Image createImageWithDefault(ImageDescriptor descriptor) {
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
199 if (descriptor is null) {
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
200 return getDefaultImage();
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
201 }
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
202
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
203 try {
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
204 return cast(Image) create(descriptor);
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
205 } catch (DeviceResourceException e) {
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
206 Policy.getLog().log(
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
207 new Status(IStatus.WARNING, "dwtx.jface", 0, //$NON-NLS-1$
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
208 "The image could not be loaded: " ~ descriptor.toString, //$NON-NLS-1$
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
209 e));
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
210 return getDefaultImage();
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
211 } catch (DWTException e) {
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
212 Policy.getLog().log(
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
213 new Status(IStatus.WARNING, "dwtx.jface", 0, //$NON-NLS-1$
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
214 "The image could not be loaded: " ~ descriptor.toString, //$NON-NLS-1$
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
215 e));
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
216 return getDefaultImage();
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
217 }
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
218 }
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
219
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
220 /**
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
221 * Returns the default image that will be returned in the event that the intended
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
222 * image is missing.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
223 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
224 * @since 3.1
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
225 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
226 * @return a default image that will be returned in the event that the intended
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
227 * image is missing.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
228 */
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
229 protected abstract Image getDefaultImage();
9
6c14e54dfc11 completed /jface/resource/
Frank Benoit <benoit@tionex.de>
parents: 8
diff changeset
230 package Image getDefaultImage_(){
6c14e54dfc11 completed /jface/resource/
Frank Benoit <benoit@tionex.de>
parents: 8
diff changeset
231 return getDefaultImage();
6c14e54dfc11 completed /jface/resource/
Frank Benoit <benoit@tionex.de>
parents: 8
diff changeset
232 }
8
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
233
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
234 /**
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
235 * Undoes everything that was done by {@link #createImage(ImageDescriptor)}.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
236 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
237 * @since 3.1
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
238 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
239 * @param descriptor identifier for the image to dispose
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
240 */
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
241 public final void destroyImage(ImageDescriptor descriptor) {
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
242 destroy(descriptor);
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
243 }
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
244
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
245 /**
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
246 * Allocates a color, given a color descriptor. Any color allocated in this
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
247 * manner must be disposed by calling {@link #destroyColor(ColorDescriptor)},
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
248 * or by an eventual call to {@link #dispose()}. {@link Color#dispose()} must
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
249 * never been called directly on the returned color.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
250 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
251 * @since 3.1
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
252 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
253 * @param descriptor descriptor for the color to create
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
254 * @return the Color described by the given ColorDescriptor (not null)
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
255 * @throws DeviceResourceException if unable to create the color
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
256 */
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
257 public final Color createColor(ColorDescriptor descriptor) {
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
258 return cast(Color)create(descriptor);
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
259 }
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
260
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
261 /**
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
262 * Allocates a color, given its RGB value. Any color allocated in this
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
263 * manner must be disposed by calling {@link #destroyColor(RGB)},
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
264 * or by an eventual call to {@link #dispose()}. {@link Color#dispose()} must
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
265 * never been called directly on the returned color.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
266 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
267 * @since 3.1
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
268 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
269 * @param descriptor descriptor for the color to create
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
270 * @return the Color described by the given ColorDescriptor (not null)
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
271 * @throws DeviceResourceException if unable to create the color
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
272 */
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
273 public final Color createColor(RGB descriptor) {
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
274 return createColor(new RGBColorDescriptor(descriptor));
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
275 }
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
276
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
277 /**
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
278 * Undoes everything that was done by a call to {@link #createColor(RGB)}.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
279 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
280 * @since 3.1
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
281 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
282 * @param descriptor RGB value of the color to dispose
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
283 */
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
284 public final void destroyColor(RGB descriptor) {
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
285 destroyColor(new RGBColorDescriptor(descriptor));
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
286 }
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
287
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
288 /**
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
289 * Undoes everything that was done by a call to {@link #createColor(ColorDescriptor)}.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
290 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
291 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
292 * @since 3.1
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
293 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
294 * @param descriptor identifier for the color to dispose
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
295 */
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
296 public final void destroyColor(ColorDescriptor descriptor) {
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
297 destroy(descriptor);
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
298 }
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
299
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
300 /**
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
301 * Returns the Font described by the given FontDescriptor. Any Font
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
302 * allocated in this manner must be deallocated by calling disposeFont(...),
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
303 * or by an eventual call to {@link #dispose()}. The method {@link Font#dispose()}
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
304 * must never be called directly on the returned font.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
305 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
306 * @since 3.1
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
307 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
308 * @param descriptor description of the font to create
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
309 * @return the Font described by the given descriptor
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
310 * @throws DeviceResourceException if unable to create the font
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
311 */
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
312 public final Font createFont(FontDescriptor descriptor) {
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
313 return cast(Font)create(descriptor);
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
314 }
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
315
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
316 /**
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
317 * Undoes everything that was done by a previous call to {@link #createFont(FontDescriptor)}.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
318 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
319 * @since 3.1
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
320 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
321 * @param descriptor description of the font to destroy
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
322 */
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
323 public final void destroyFont(FontDescriptor descriptor) {
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
324 destroy(descriptor);
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
325 }
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
326
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
327 /**
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
328 * Disposes any remaining resources allocated by this manager.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
329 */
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
330 public void dispose() {
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
331 if (disposeExecs is null) {
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
332 return;
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
333 }
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
334
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
335 // If one of the runnables throws an exception, we need to propagate it.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
336 // However, this should not prevent the remaining runnables from being
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
337 // notified. If any runnables throw an exception, we remember one of them
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
338 // here and throw it at the end of the method.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
339 RuntimeException foundException = null;
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
340
104
04b47443bb01 Reworked the collection uses to make use of a wrapper collection that is compatible to the Java Collections.
Frank Benoit <benoit@tionex.de>
parents: 9
diff changeset
341 Runnable[] execs = arraycast!(Runnable)(disposeExecs.toArray());
8
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
342 for (int i = 0; i < execs.length; i++) {
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
343 Runnable exec = execs[i];
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
344
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
345 try {
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
346 exec.run();
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
347 } catch (RuntimeException e) {
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
348 // Ensure that we propagate an exception, but don't stop notifying
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
349 // the remaining runnables.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
350 foundException = e;
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
351 }
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
352 }
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
353
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
354 if (foundException !is null) {
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
355 // If any runnables threw an exception, propagate one of them.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
356 throw foundException;
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
357 }
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
358 }
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
359
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
360 /**
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
361 * Returns a previously allocated resource associated with the given descriptor, or
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
362 * null if none exists yet.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
363 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
364 * @since 3.1
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
365 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
366 * @param descriptor descriptor to find
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
367 * @return a previously allocated resource for the given descriptor or null if none.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
368 */
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
369 public abstract Object find(DeviceResourceDescriptor descriptor);
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
370
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
371 /**
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
372 * Causes the <code>run()</code> method of the runnable to
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
373 * be invoked just before the receiver is disposed. The runnable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
374 * can be subsequently canceled by a call to <code>cancelDisposeExec</code>.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
375 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
376 * @param r runnable to execute.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
377 */
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
378 public void disposeExec(Runnable r) {
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
379 Assert.isNotNull(cast(Object)r);
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
380
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
381 if (disposeExecs is null) {
104
04b47443bb01 Reworked the collection uses to make use of a wrapper collection that is compatible to the Java Collections.
Frank Benoit <benoit@tionex.de>
parents: 9
diff changeset
382 disposeExecs = new ArrayList();
8
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
383 }
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
384
104
04b47443bb01 Reworked the collection uses to make use of a wrapper collection that is compatible to the Java Collections.
Frank Benoit <benoit@tionex.de>
parents: 9
diff changeset
385 disposeExecs.add(cast(Object)r);
8
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
386 }
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
387
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
388 /**
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
389 * Cancels a runnable that was previously scheduled with <code>disposeExec</code>.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
390 * Has no effect if the given runnable was not previously registered with
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
391 * disposeExec.
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
392 *
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
393 * @param r runnable to cancel
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
394 */
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
395 public void cancelDisposeExec(Runnable r) {
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
396 Assert.isNotNull(cast(Object)r);
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
397
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
398 if (disposeExecs is null) {
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
399 return;
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
400 }
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
401
104
04b47443bb01 Reworked the collection uses to make use of a wrapper collection that is compatible to the Java Collections.
Frank Benoit <benoit@tionex.de>
parents: 9
diff changeset
402 disposeExecs.remove(cast(Object)r);
8
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
403
104
04b47443bb01 Reworked the collection uses to make use of a wrapper collection that is compatible to the Java Collections.
Frank Benoit <benoit@tionex.de>
parents: 9
diff changeset
404 if (disposeExecs.isEmpty()) {
8
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
405 disposeExecs = null;
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
406 }
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
407 }
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
408 }