/[schmitzm]/trunk/src/skrueger/swing/DialogManager.java
ViewVC logotype

Contents of /trunk/src/skrueger/swing/DialogManager.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1041 - (show annotations)
Wed Sep 22 10:56:20 2010 UTC (14 years, 5 months ago) by alfonx
File MIME type: text/plain
File size: 4463 byte(s)
When opening a dialog is canceled during construction, no more empty dialog will appear
1 package skrueger.swing;
2
3 import java.awt.Component;
4 import java.awt.event.WindowAdapter;
5 import java.awt.event.WindowEvent;
6 import java.util.Collection;
7 import java.util.HashMap;
8 import java.util.HashSet;
9
10 import javax.swing.JDialog;
11
12 import org.apache.log4j.Logger;
13
14 public abstract class DialogManager<KEY, DIALOG extends AtlasDialog> {
15 final static private Logger LOGGER = Logger.getLogger(DialogManager.class);
16
17 public abstract class FactoryInterface {
18
19 public abstract DIALOG create();
20
21 /** May be overridden to add Listeners **/
22 public void afterCreation(DIALOG newInstance) {
23 };
24
25 /** May be overridden to remove Listeners added earlier **/
26 public void beforeDispose(DIALOG newInstance) {
27 };
28
29 }
30
31 protected HashMap<KEY, DIALOG> dialogCache = new HashMap<KEY, DIALOG>();
32
33 /**
34 * A {@link DialogManager} instance can be created for any extension of
35 * {@link JDialog} that will implement the
36 * {@link #getInstanceFor(Object, Component, Object...)} method.
37 */
38 public DialogManager() {
39 }
40
41 /**
42 * This will be done with every dialog that an instance is required for.
43 *
44 * @param dialog
45 * @return
46 */
47 protected DIALOG bringup(DIALOG dialog) {
48 if (dialog == null){
49 // The dialog creation may have been cancelled
50 return null;
51 }
52 if (!dialog.isVisible())
53 dialog.setVisible(true);
54 dialog.toFront();
55
56 return dialog;
57 }
58
59 /**
60 * Implementing this should have a <br/>
61 * <code>try { ... return ... } catch (Exception e) {
62 ExceptionDialog.show(owner, e);
63 return null;
64 } </code> block.
65 *
66 * @param key
67 * @param owner
68 * @param constArgs
69 * @return a cached instance or creates a new instance. Instances are always
70 * returned visible and toFront.
71 */
72 public abstract DIALOG getInstanceFor(final KEY key, final Component owner,
73 final Object... constArgs);
74
75 /**
76 * @return Is there an open/visible dialog for the given layer id?
77 */
78 public boolean isVisibleFor(KEY key) {
79 return dialogCache.containsKey(key) && dialogCache.get(key).isVisible();
80 }
81
82 /**
83 * Will dispose any dialog that is registered to the given parent
84 * {@link Component}
85 *
86 * @param parent
87 */
88 public void disposeInstanceForParent(final Component parent) {
89
90 final HashMap<KEY, JDialog> clonedHashMap = (HashMap<KEY, JDialog>) dialogCache
91 .clone();
92
93 for (KEY chartId : clonedHashMap.keySet()) {
94 if (dialogCache.get(chartId).getParent() == parent) {
95 disposeInstanceFor(chartId);
96 }
97 }
98 }
99
100 public boolean disposeInstanceFor(KEY key) {
101 synchronized (dialogCache) {
102
103 final DIALOG dialog = dialogCache.get(key);
104 if (dialog != null) {
105 dialog.dispose();
106 dialogCache.remove(key);
107 return true;
108 }
109 return false;
110 }
111 }
112
113 /**
114 * Checks whether there already is an instance for that key and otherwise
115 * will create the instance by invoking the {@link FactoryInterface} #create
116 * method.
117 *
118 * @param factory
119 * {@link FactoryInterface} that creates the DIALOG
120 *
121 * @return Always a visible and inFront instance of DIALOG for the given
122 * key.
123 */
124 public DIALOG getInstanceFor(final KEY key, final FactoryInterface factory) {
125 final DIALOG dialog;
126 if (isVisibleFor(key)) {
127 dialog = dialogCache.get(key);
128 } else {
129
130 dialog = factory.create();
131 if (dialog.isDisposed) {
132 // The creation of the Dialog may have been cancelled for some reason
133 return null;
134 }
135 dialogCache.put(key, dialog);
136 dialog.setVisible(true);
137 dialog.toFront();
138
139 dialog.addWindowListener(new WindowAdapter() {
140 @Override
141 public void windowClosed(final WindowEvent e) {
142 dialogCache.remove(key);
143 factory.beforeDispose(dialog);
144 }
145
146 @Override
147 public void windowClosing(final WindowEvent e) {
148 }
149 });
150
151 factory.afterCreation(dialog);
152 }
153
154 return dialog;
155 }
156
157 /**
158 * Disposes all open instances and removes them from the cache.
159 *
160 * @return <code>true</code> if at least one window has been disposed.
161 */
162 public boolean disposeAll() {
163
164 boolean atLeastOne = false;
165 HashSet<KEY> tempKeys = new HashSet<KEY>(dialogCache.keySet());
166 for (KEY key : tempKeys) {
167 DIALOG dialog = dialogCache.get(key);
168 if (dialog != null) {
169 dialog.dispose();
170 atLeastOne = true;
171 }
172 }
173 tempKeys.clear();
174 dialogCache.clear();
175 return atLeastOne;
176 }
177
178 /**
179 * @return All instances of DIALOG as they are cached.
180 */
181 public Collection<DIALOG> getAllInstances() {
182 return dialogCache.values();
183 }
184
185 }

Properties

Name Value
svn:eol-style native
svn:keywords Id URL
svn:mime-type text/plain

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26