31 import java.util.Map; |
31 import java.util.Map; |
32 import java.util.Set; |
32 import java.util.Set; |
33 import java.util.HashMap; |
33 import java.util.HashMap; |
34 import java.util.WeakHashMap; |
34 import java.util.WeakHashMap; |
35 |
35 |
36 import java.util.logging.*; |
36 import sun.util.logging.PlatformLogger; |
37 |
37 |
38 /** |
38 /** |
39 * This class is used to aid in keeping track of DisplayChangedListeners and |
39 * This class is used to aid in keeping track of DisplayChangedListeners and |
40 * notifying them when a display change has taken place. DisplayChangedListeners |
40 * notifying them when a display change has taken place. DisplayChangedListeners |
41 * are notified when the display's bit depth is changed, or when a top-level |
41 * are notified when the display's bit depth is changed, or when a top-level |
52 * |
52 * |
53 * displayChanged() is also called on Windows when they are moved from one |
53 * displayChanged() is also called on Windows when they are moved from one |
54 * screen to another on a system equipped with multiple displays. |
54 * screen to another on a system equipped with multiple displays. |
55 */ |
55 */ |
56 public class SunDisplayChanger { |
56 public class SunDisplayChanger { |
57 private static final Logger log = Logger.getLogger("sun.awt.multiscreen.SunDisplayChanger"); |
57 private static final PlatformLogger log = PlatformLogger.getLogger("sun.awt.multiscreen.SunDisplayChanger"); |
58 |
58 |
59 // Create a new synchronizedMap with initial capacity of one listener. |
59 // Create a new synchronizedMap with initial capacity of one listener. |
60 // It is asserted that the most common case is to have one GraphicsDevice |
60 // It is asserted that the most common case is to have one GraphicsDevice |
61 // and one top-level Window. |
61 // and one top-level Window. |
62 private Map listeners = Collections.synchronizedMap(new WeakHashMap(1)); |
62 private Map listeners = Collections.synchronizedMap(new WeakHashMap(1)); |
66 /* |
66 /* |
67 * Add a DisplayChangeListener to this SunDisplayChanger so that it is |
67 * Add a DisplayChangeListener to this SunDisplayChanger so that it is |
68 * notified when the display is changed. |
68 * notified when the display is changed. |
69 */ |
69 */ |
70 public void add(DisplayChangedListener theListener) { |
70 public void add(DisplayChangedListener theListener) { |
71 if (log.isLoggable(Level.FINE)) { |
71 if (log.isLoggable(PlatformLogger.FINE)) { |
72 if (theListener == null) { |
72 if (theListener == null) { |
73 log.log(Level.FINE, "Assertion (theListener != null) failed"); |
73 log.fine("Assertion (theListener != null) failed"); |
74 } |
74 } |
75 } |
75 } |
76 if (log.isLoggable(Level.FINER)) { |
76 if (log.isLoggable(PlatformLogger.FINER)) { |
77 log.log(Level.FINER, "Adding listener: " + theListener); |
77 log.finer("Adding listener: " + theListener); |
78 } |
78 } |
79 listeners.put(theListener, null); |
79 listeners.put(theListener, null); |
80 } |
80 } |
81 |
81 |
82 /* |
82 /* |
83 * Remove the given DisplayChangeListener from this SunDisplayChanger. |
83 * Remove the given DisplayChangeListener from this SunDisplayChanger. |
84 */ |
84 */ |
85 public void remove(DisplayChangedListener theListener) { |
85 public void remove(DisplayChangedListener theListener) { |
86 if (log.isLoggable(Level.FINE)) { |
86 if (log.isLoggable(PlatformLogger.FINE)) { |
87 if (theListener == null) { |
87 if (theListener == null) { |
88 log.log(Level.FINE, "Assertion (theListener != null) failed"); |
88 log.fine("Assertion (theListener != null) failed"); |
89 } |
89 } |
90 } |
90 } |
91 if (log.isLoggable(Level.FINER)) { |
91 if (log.isLoggable(PlatformLogger.FINER)) { |
92 log.log(Level.FINER, "Removing listener: " + theListener); |
92 log.finer("Removing listener: " + theListener); |
93 } |
93 } |
94 listeners.remove(theListener); |
94 listeners.remove(theListener); |
95 } |
95 } |
96 |
96 |
97 /* |
97 /* |
98 * Notify our list of DisplayChangedListeners that a display change has |
98 * Notify our list of DisplayChangedListeners that a display change has |
99 * taken place by calling their displayChanged() methods. |
99 * taken place by calling their displayChanged() methods. |
100 */ |
100 */ |
101 public void notifyListeners() { |
101 public void notifyListeners() { |
102 if (log.isLoggable(Level.FINEST)) { |
102 if (log.isLoggable(PlatformLogger.FINEST)) { |
103 log.log(Level.FINEST, "notifyListeners"); |
103 log.finest("notifyListeners"); |
104 } |
104 } |
105 // This method is implemented by making a clone of the set of listeners, |
105 // This method is implemented by making a clone of the set of listeners, |
106 // and then iterating over the clone. This is because during the course |
106 // and then iterating over the clone. This is because during the course |
107 // of responding to a display change, it may be appropriate for a |
107 // of responding to a display change, it may be appropriate for a |
108 // DisplayChangedListener to add or remove itself from a SunDisplayChanger. |
108 // DisplayChangedListener to add or remove itself from a SunDisplayChanger. |
124 Iterator itr = cloneSet.iterator(); |
124 Iterator itr = cloneSet.iterator(); |
125 while (itr.hasNext()) { |
125 while (itr.hasNext()) { |
126 DisplayChangedListener current = |
126 DisplayChangedListener current = |
127 (DisplayChangedListener) itr.next(); |
127 (DisplayChangedListener) itr.next(); |
128 try { |
128 try { |
129 if (log.isLoggable(Level.FINEST)) { |
129 if (log.isLoggable(PlatformLogger.FINEST)) { |
130 log.log(Level.FINEST, "displayChanged for listener: " + current); |
130 log.finest("displayChanged for listener: " + current); |
131 } |
131 } |
132 current.displayChanged(); |
132 current.displayChanged(); |
133 } catch (IllegalComponentStateException e) { |
133 } catch (IllegalComponentStateException e) { |
134 // This DisplayChangeListener is no longer valid. Most |
134 // This DisplayChangeListener is no longer valid. Most |
135 // likely, a top-level window was dispose()d, but its |
135 // likely, a top-level window was dispose()d, but its |
144 /* |
144 /* |
145 * Notify our list of DisplayChangedListeners that a palette change has |
145 * Notify our list of DisplayChangedListeners that a palette change has |
146 * taken place by calling their paletteChanged() methods. |
146 * taken place by calling their paletteChanged() methods. |
147 */ |
147 */ |
148 public void notifyPaletteChanged() { |
148 public void notifyPaletteChanged() { |
149 if (log.isLoggable(Level.FINEST)) { |
149 if (log.isLoggable(PlatformLogger.FINEST)) { |
150 log.finest("notifyPaletteChanged"); |
150 log.finest("notifyPaletteChanged"); |
151 } |
151 } |
152 // This method is implemented by making a clone of the set of listeners, |
152 // This method is implemented by making a clone of the set of listeners, |
153 // and then iterating over the clone. This is because during the course |
153 // and then iterating over the clone. This is because during the course |
154 // of responding to a display change, it may be appropriate for a |
154 // of responding to a display change, it may be appropriate for a |
170 Iterator itr = cloneSet.iterator(); |
170 Iterator itr = cloneSet.iterator(); |
171 while (itr.hasNext()) { |
171 while (itr.hasNext()) { |
172 DisplayChangedListener current = |
172 DisplayChangedListener current = |
173 (DisplayChangedListener) itr.next(); |
173 (DisplayChangedListener) itr.next(); |
174 try { |
174 try { |
175 if (log.isLoggable(Level.FINEST)) { |
175 if (log.isLoggable(PlatformLogger.FINEST)) { |
176 log.log(Level.FINEST, "paletteChanged for listener: " + current); |
176 log.finest("paletteChanged for listener: " + current); |
177 } |
177 } |
178 current.paletteChanged(); |
178 current.paletteChanged(); |
179 } catch (IllegalComponentStateException e) { |
179 } catch (IllegalComponentStateException e) { |
180 // This DisplayChangeListener is no longer valid. Most |
180 // This DisplayChangeListener is no longer valid. Most |
181 // likely, a top-level window was dispose()d, but its |
181 // likely, a top-level window was dispose()d, but its |