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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 618 - (hide annotations)
Sun Dec 27 19:32:08 2009 UTC (15 years, 2 months ago) by alfonx
Original Path: branches/2.0-RC1/src/skrueger/swing/DialogManager.java
File MIME type: text/plain
File size: 4059 byte(s)


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

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