40 |
import java.awt.AWTKeyStroke; |
import java.awt.AWTKeyStroke; |
41 |
import java.awt.BasicStroke; |
import java.awt.BasicStroke; |
42 |
import java.awt.Color; |
import java.awt.Color; |
43 |
|
import java.awt.Component; |
44 |
|
import java.awt.Container; |
45 |
import java.awt.Dimension; |
import java.awt.Dimension; |
46 |
import java.awt.Font; |
import java.awt.Font; |
47 |
import java.awt.FontMetrics; |
import java.awt.FontMetrics; |
48 |
import java.awt.Graphics; |
import java.awt.Graphics; |
49 |
import java.awt.Graphics2D; |
import java.awt.Graphics2D; |
50 |
import java.awt.GridBagLayout; |
import java.awt.GridBagLayout; |
51 |
|
import java.awt.GridLayout; |
52 |
import java.awt.Insets; |
import java.awt.Insets; |
53 |
import java.awt.Rectangle; |
import java.awt.Rectangle; |
54 |
import java.awt.Stroke; |
import java.awt.Stroke; |
55 |
|
import java.awt.event.ComponentEvent; |
56 |
|
import java.awt.event.ComponentListener; |
57 |
import java.awt.event.FocusAdapter; |
import java.awt.event.FocusAdapter; |
58 |
import java.awt.event.FocusEvent; |
import java.awt.event.FocusEvent; |
59 |
import java.awt.event.FocusListener; |
import java.awt.event.FocusListener; |
93 |
|
|
94 |
|
|
95 |
/** |
/** |
96 |
* DOCUMENT ME! |
* UI Delegate for JPopupMenu |
97 |
*/ |
*/ |
98 |
public class BasicPopupMenuUI extends PopupMenuUI |
public class BasicPopupMenuUI extends PopupMenuUI |
99 |
{ |
{ |
100 |
|
/* popupMenu for which this UI delegate is for*/ |
101 |
protected JPopupMenu popupMenu; |
protected JPopupMenu popupMenu; |
102 |
|
|
103 |
|
/* MouseInputListener listens to mouse events */ |
104 |
private static transient MouseInputListener mouseInputListener; |
private static transient MouseInputListener mouseInputListener; |
105 |
|
|
106 |
|
/* PopupMenuListener listens to popup menu events fired by JPopupMenu*/ |
107 |
private transient PopupMenuListener popupMenuListener; |
private transient PopupMenuListener popupMenuListener; |
108 |
|
|
109 |
|
/* ComponentListener listening to popupMenu's invoker. */ |
110 |
|
private TopWindowListener topWindowListener; |
111 |
|
|
112 |
/** |
/** |
113 |
* Creates a new BasicPopupMenuUI object. |
* Creates a new BasicPopupMenuUI object. |
114 |
*/ |
*/ |
116 |
{ |
{ |
117 |
popupMenuListener = new PopupMenuHandler(); |
popupMenuListener = new PopupMenuHandler(); |
118 |
mouseInputListener = new MouseInputHandler(); |
mouseInputListener = new MouseInputHandler(); |
119 |
|
topWindowListener = new TopWindowListener(); |
120 |
} |
} |
121 |
|
|
122 |
/** |
/** |
123 |
* DOCUMENT ME! |
* Factory method to create a BasicPopupMenuUI for the given {@link |
124 |
|
* JComponent}, which should be a {@link JMenuItem}. |
125 |
* |
* |
126 |
* @param x DOCUMENT ME! |
* @param x The {@link JComponent} a UI is being created for. |
127 |
* |
* |
128 |
* @return DOCUMENT ME! |
* @return A BasicPopupMenuUI for the {@link JComponent}. |
129 |
*/ |
*/ |
130 |
public static ComponentUI createUI(JComponent x) |
public static ComponentUI createUI(JComponent x) |
131 |
{ |
{ |
133 |
} |
} |
134 |
|
|
135 |
/** |
/** |
136 |
* DOCUMENT ME! |
* Installs and initializes all fields for this UI delegate. Any properties |
137 |
|
* of the UI that need to be initialized and/or set to defaults will be |
138 |
|
* done now. It will also install any listeners necessary. |
139 |
* |
* |
140 |
* @param c DOCUMENT ME! |
* @param c The {@link JComponent} that is having this UI installed. |
141 |
*/ |
*/ |
142 |
public void installUI(JComponent c) |
public void installUI(JComponent c) |
143 |
{ |
{ |
145 |
popupMenu = (JPopupMenu) c; |
popupMenu = (JPopupMenu) c; |
146 |
popupMenu.setLayout(new GridBagLayout()); |
popupMenu.setLayout(new GridBagLayout()); |
147 |
popupMenu.setBorderPainted(true); |
popupMenu.setBorderPainted(true); |
148 |
popupMenu.setDefaultLightWeightPopupEnabled(true); |
JPopupMenu.setDefaultLightWeightPopupEnabled(true); |
149 |
|
|
150 |
installDefaults(); |
installDefaults(); |
151 |
installListeners(); |
installListeners(); |
152 |
} |
} |
153 |
|
|
154 |
/** |
/** |
155 |
* DOCUMENT ME! |
* This method installs the defaults that are defined in the Basic look and |
156 |
|
* feel for this {@link JPopupMenu}. |
157 |
*/ |
*/ |
158 |
public void installDefaults() |
public void installDefaults() |
159 |
{ |
{ |
166 |
} |
} |
167 |
|
|
168 |
/** |
/** |
169 |
* DOCUMENT ME! |
* This method installs the listeners for the {@link JMenuItem}. |
170 |
*/ |
*/ |
171 |
protected void installListeners() |
protected void installListeners() |
172 |
{ |
{ |
176 |
} |
} |
177 |
|
|
178 |
/** |
/** |
179 |
* DOCUMENT ME! |
* This method installs the keyboard actions for this {@link JPopupMenu}. |
180 |
*/ |
*/ |
181 |
protected void installKeyboardActions() |
protected void installKeyboardActions() |
182 |
{ |
{ |
183 |
|
// FIXME: Need to implement |
184 |
} |
} |
185 |
|
|
186 |
/** |
/** |
187 |
* DOCUMENT ME! |
* Performs the opposite of installUI. Any properties or resources that need |
188 |
|
* to be cleaned up will be done now. It will also uninstall any listeners |
189 |
|
* it has. In addition, any properties of this UI will be nulled. |
190 |
* |
* |
191 |
* @param c DOCUMENT ME! |
* @param c The {@link JComponent} that is having this UI uninstalled. |
192 |
*/ |
*/ |
193 |
public void uninstallUI(JComponent c) |
public void uninstallUI(JComponent c) |
194 |
{ |
{ |
198 |
} |
} |
199 |
|
|
200 |
/** |
/** |
201 |
* DOCUMENT ME! |
* This method uninstalls the defaults and sets any objects created during |
202 |
|
* install to null |
203 |
*/ |
*/ |
204 |
protected void uninstallDefaults() |
protected void uninstallDefaults() |
205 |
{ |
{ |
210 |
} |
} |
211 |
|
|
212 |
/** |
/** |
213 |
* DOCUMENT ME! |
* Unregisters all the listeners that this UI delegate was using. |
214 |
*/ |
*/ |
215 |
protected void uninstallListeners() |
protected void uninstallListeners() |
216 |
{ |
{ |
217 |
|
popupMenu.removeMouseListener(mouseInputListener); |
218 |
|
popupMenu.removeMouseMotionListener(mouseInputListener); |
219 |
|
popupMenu.removePopupMenuListener(popupMenuListener); |
220 |
} |
} |
221 |
|
|
222 |
/** |
/** |
223 |
* DOCUMENT ME! |
* Uninstalls any keyboard actions. |
224 |
*/ |
*/ |
225 |
protected void uninstallKeyboardActions() |
protected void uninstallKeyboardActions() |
226 |
{ |
{ |
227 |
|
// FIXME: Need to implement |
228 |
} |
} |
229 |
|
|
230 |
/** |
/** |
231 |
* DOCUMENT ME! |
* This method returns the minimum size of the JPopupMenu. |
232 |
* |
* |
233 |
* @param c DOCUMENT ME! |
* @param c The JComponent to find a size for. |
234 |
* |
* |
235 |
* @return DOCUMENT ME! |
* @return The minimum size. |
236 |
*/ |
*/ |
237 |
public Dimension getMinimumSize(JComponent c) |
public Dimension getMinimumSize(JComponent c) |
238 |
{ |
{ |
240 |
} |
} |
241 |
|
|
242 |
/** |
/** |
243 |
* DOCUMENT ME! |
* This method returns the preferred size of the JPopupMenu. |
244 |
* |
* |
245 |
* @param c DOCUMENT ME! |
* @param c The JComponent to find a size for. |
246 |
* |
* |
247 |
* @return DOCUMENT ME! |
* @return The preferred size. |
248 |
*/ |
*/ |
249 |
public Dimension getPreferredSize(JComponent c) |
public Dimension getPreferredSize(JComponent c) |
250 |
{ |
{ |
252 |
} |
} |
253 |
|
|
254 |
/** |
/** |
255 |
* DOCUMENT ME! |
* This method returns the minimum size of the JPopupMenu. |
256 |
* |
* |
257 |
* @param c DOCUMENT ME! |
* @param c The JComponent to find a size for. |
258 |
* |
* |
259 |
* @return DOCUMENT ME! |
* @return The minimum size. |
260 |
*/ |
*/ |
261 |
public Dimension getMaximumSize(JComponent c) |
public Dimension getMaximumSize(JComponent c) |
262 |
{ |
{ |
264 |
} |
} |
265 |
|
|
266 |
/** |
/** |
267 |
* DOCUMENT ME! |
* Return true if given mouse event is a platform popup trigger, |
268 |
|
* and false otherwise |
269 |
* |
* |
270 |
* @param e DOCUMENT ME! |
* @param e MouseEvent that is to be checked for popup trigger event |
271 |
* |
* |
272 |
* @return DOCUMENT ME! |
* @return true if given mouse event is a platform popup trigger, |
273 |
|
* and false otherwise |
274 |
*/ |
*/ |
275 |
public boolean isPopupTrigger(MouseEvent e) |
public boolean isPopupTrigger(MouseEvent e) |
276 |
{ |
{ |
278 |
} |
} |
279 |
|
|
280 |
/** |
/** |
281 |
* DOCUMENT ME! |
* This listener handles PopupMenuEvents fired by JPopupMenu |
282 |
*/ |
*/ |
283 |
protected class PopupMenuHandler implements PopupMenuListener |
private class PopupMenuHandler implements PopupMenuListener |
284 |
{ |
{ |
285 |
/** |
/** |
286 |
* DOCUMENT ME! |
* This method is invoked when JPopupMenu is cancelled. |
287 |
* |
* |
288 |
* @param event DOCUMENT ME! |
* @param event the PopupMenuEvent |
289 |
*/ |
*/ |
290 |
public void popupMenuCanceled(PopupMenuEvent event) |
public void popupMenuCanceled(PopupMenuEvent event) |
291 |
{ |
{ |
292 |
|
MenuSelectionManager manager = MenuSelectionManager.defaultManager(); |
293 |
|
manager.clearSelectedPath(); |
294 |
} |
} |
295 |
|
|
296 |
/** |
/** |
297 |
* DOCUMENT ME! |
* This method is invoked when JPopupMenu becomes invisible |
298 |
* |
* |
299 |
* @param event DOCUMENT ME! |
* @param event the PopupMenuEvent |
300 |
*/ |
*/ |
301 |
public void popupMenuWillBecomeInvisible(PopupMenuEvent event) |
public void popupMenuWillBecomeInvisible(PopupMenuEvent event) |
302 |
{ |
{ |
303 |
|
// remove listener that listens to component events fired |
304 |
|
// by the top - level window that this popup belongs to. |
305 |
|
Component invoker = popupMenu.getInvoker(); |
306 |
|
|
307 |
|
Container rootContainer = (Container) SwingUtilities.getRoot(invoker); |
308 |
|
rootContainer.removeComponentListener(topWindowListener); |
309 |
} |
} |
310 |
|
|
311 |
/** |
/** |
312 |
* DOCUMENT ME! |
* This method is invoked when JPopupMenu becomes visible |
313 |
* |
* |
314 |
* @param event DOCUMENT ME! |
* @param event the PopupMenuEvent |
315 |
*/ |
*/ |
316 |
public void popupMenuWillBecomeVisible(PopupMenuEvent event) |
public void popupMenuWillBecomeVisible(PopupMenuEvent event) |
317 |
{ |
{ |
318 |
|
// Adds topWindowListener to top-level window to listener to |
319 |
|
// ComponentEvents fired by it. We need to cancel this popup menu |
320 |
|
// if topWindow to which this popup belongs was resized or moved. |
321 |
|
Component invoker = popupMenu.getInvoker(); |
322 |
|
Container rootContainer = (Container) SwingUtilities.getRoot(invoker); |
323 |
|
rootContainer.addComponentListener(topWindowListener); |
324 |
|
|
325 |
|
// if this popup menu is a free floating popup menu, |
326 |
|
// then by default its first element should be always selected when |
327 |
|
// this popup menu becomes visible. |
328 |
|
MenuSelectionManager manager = MenuSelectionManager.defaultManager(); |
329 |
|
|
330 |
|
if (manager.getSelectedPath().length == 0) |
331 |
|
{ |
332 |
|
// Set selected path to point to the first item in the popup menu |
333 |
|
MenuElement[] path = new MenuElement[2]; |
334 |
|
path[0] = popupMenu; |
335 |
|
Component[] comps = popupMenu.getComponents(); |
336 |
|
if (comps.length != 0 && comps[0] instanceof MenuElement) |
337 |
|
path[1] = (MenuElement) comps[0]; |
338 |
|
manager.setSelectedPath(path); |
339 |
|
} |
340 |
} |
} |
341 |
} |
} |
342 |
|
|
343 |
/** |
/** |
344 |
* DOCUMENT ME! |
* ComponentListener that listens to Component Events fired by the |
345 |
|
* top - level window to which popup menu belongs. If top-level |
346 |
|
* window was resized, moved or hidded then popup menu will |
347 |
|
* be hidded and selected path of current menu hierarchy will be set |
348 |
|
* to null. |
349 |
|
* |
350 |
*/ |
*/ |
351 |
protected class MouseInputHandler implements MouseInputListener |
private class TopWindowListener implements ComponentListener |
352 |
{ |
{ |
353 |
/** |
/** |
354 |
* DOCUMENT ME! |
* This method is invoked when top-level window is resized. |
355 |
|
* This method closes current menu hierarchy. |
356 |
* |
* |
357 |
* @param e DOCUMENT ME! |
* @param e The ComponentEvent |
358 |
*/ |
*/ |
359 |
public void mouseClicked(MouseEvent e) |
public void componentResized(ComponentEvent e) |
360 |
{ |
{ |
361 |
|
MenuSelectionManager manager = MenuSelectionManager.defaultManager(); |
362 |
|
manager.clearSelectedPath(); |
363 |
} |
} |
364 |
|
|
365 |
/** |
/** |
366 |
* DOCUMENT ME! |
* This method is invoked when top-level window is moved. |
367 |
|
* This method closes current menu hierarchy. |
368 |
* |
* |
369 |
* @param e DOCUMENT ME! |
* @param e The ComponentEvent |
370 |
*/ |
*/ |
371 |
public void mouseDragged(MouseEvent e) |
public void componentMoved(ComponentEvent e) |
372 |
{ |
{ |
373 |
|
MenuSelectionManager manager = MenuSelectionManager.defaultManager(); |
374 |
|
manager.clearSelectedPath(); |
375 |
} |
} |
376 |
|
|
377 |
/** |
/** |
378 |
* DOCUMENT ME! |
* This method is invoked when top-level window is shown |
379 |
|
* This method does nothing by default. |
380 |
* |
* |
381 |
* @param e DOCUMENT ME! |
* @param e The ComponentEvent |
382 |
*/ |
*/ |
383 |
public void mouseEntered(MouseEvent e) |
public void componentShown(ComponentEvent e) |
384 |
{ |
{ |
385 |
|
MenuSelectionManager manager = MenuSelectionManager.defaultManager(); |
386 |
|
manager.clearSelectedPath(); |
387 |
} |
} |
388 |
|
|
389 |
/** |
/** |
390 |
* DOCUMENT ME! |
* This method is invoked when top-level window is hidden |
391 |
|
* This method closes current menu hierarchy. |
392 |
* |
* |
393 |
* @param e DOCUMENT ME! |
* @param e The ComponentEvent |
394 |
*/ |
*/ |
395 |
|
public void componentHidden(ComponentEvent e) |
396 |
|
{ |
397 |
|
MenuSelectionManager manager = MenuSelectionManager.defaultManager(); |
398 |
|
manager.clearSelectedPath(); |
399 |
|
} |
400 |
|
} |
401 |
|
|
402 |
|
private class MouseInputHandler implements MouseInputListener |
403 |
|
{ |
404 |
|
public void mouseClicked(MouseEvent e) |
405 |
|
{ |
406 |
|
} |
407 |
|
|
408 |
|
public void mouseDragged(MouseEvent e) |
409 |
|
{ |
410 |
|
} |
411 |
|
|
412 |
|
public void mouseEntered(MouseEvent e) |
413 |
|
{ |
414 |
|
} |
415 |
|
|
416 |
public void mouseExited(MouseEvent e) |
public void mouseExited(MouseEvent e) |
417 |
{ |
{ |
418 |
} |
} |
419 |
|
|
|
/** |
|
|
* DOCUMENT ME! |
|
|
* |
|
|
* @param e DOCUMENT ME! |
|
|
*/ |
|
420 |
public void mouseMoved(MouseEvent e) |
public void mouseMoved(MouseEvent e) |
421 |
{ |
{ |
422 |
} |
} |
423 |
|
|
|
/** |
|
|
* DOCUMENT ME! |
|
|
* |
|
|
* @param e DOCUMENT ME! |
|
|
*/ |
|
424 |
public void mousePressed(MouseEvent e) |
public void mousePressed(MouseEvent e) |
425 |
{ |
{ |
426 |
} |
} |
427 |
|
|
|
/** |
|
|
* DOCUMENT ME! |
|
|
* |
|
|
* @param e DOCUMENT ME! |
|
|
*/ |
|
428 |
public void mouseReleased(MouseEvent e) |
public void mouseReleased(MouseEvent e) |
429 |
{ |
{ |
430 |
} |
} |