KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > antlr > xjlib > appkit > menu > XJMainMenuBar


1 /*
2
3 [The "BSD licence"]
4 Copyright (c) 2005 Jean Bovet
5 All rights reserved.
6
7 Redistribution and use in source and binary forms, with or without
8 modification, are permitted provided that the following conditions
9 are met:
10
11 1. Redistributions of source code must retain the above copyright
12 notice, this list of conditions and the following disclaimer.
13 2. Redistributions in binary form must reproduce the above copyright
14 notice, this list of conditions and the following disclaimer in the
15 documentation and/or other materials provided with the distribution.
16 3. The name of the author may not be used to endorse or promote products
17 derived from this software without specific prior written permission.
18
19 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22 IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28 THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
30 */

31
32 package org.antlr.xjlib.appkit.menu;
33
34 import org.antlr.xjlib.appkit.app.XJApplication;
35 import org.antlr.xjlib.appkit.document.XJDocument;
36 import org.antlr.xjlib.appkit.frame.XJWindow;
37 import org.antlr.xjlib.appkit.undo.XJUndo;
38 import org.antlr.xjlib.appkit.utils.XJLocalizable;
39 import org.antlr.xjlib.foundation.XJSystem;
40
41 import javax.swing.*;
42 import java.awt.*;
43 import java.awt.event.KeyEvent JavaDoc;
44 import java.util.ArrayList JavaDoc;
45 import java.util.Iterator JavaDoc;
46 import java.util.List JavaDoc;
47
48 public class XJMainMenuBar implements XJMenuItemDelegate {
49
50     public static final int MI_NEW = 10000;
51     public static final int MI_OPEN = 10001;
52     public static final int MI_LOAD = 10002;
53     public static final int MI_SAVE = 10003;
54     public static final int MI_SAVEAS = 10004;
55     public static final int MI_CLOSE = 10005;
56     public static final int MI_QUIT = 10006;
57     public static final int MI_HELP = 10020;
58     public static final int MI_ABOUT = 10021;
59     public static final int MI_PREFS = 10022;
60     public static final int MI_UNDO = 10023;
61     public static final int MI_REDO = 10024;
62     public static final int MI_CUT = 10025;
63     public static final int MI_COPY = 10026;
64     public static final int MI_PASTE = 10027;
65     public static final int MI_SELECT_ALL = 10028;
66
67     public static final int MI_CLEAR_RECENT_FILES = 20000;
68     public static final int MI_RECENT_FILES = 20001; // + any number of recent files!
69

70     public static final int MI_NO_WINDOW = 21000;
71     public static final int MI_WINDOW = 21001; // + any number of windows!
72

73     // !!! Do not use any number above MI_WINDOW !!!
74

75     protected JMenuBar menuBar = null;
76     protected XJMenu menuFile = null;
77     protected XJMenu menuRecentFiles = null;
78     protected XJMenu menuEdit = null;
79     protected XJMenu menuWindow = null;
80     protected XJMenu menuHelp = null;
81
82     protected XJMenuItem menuItemUndo = null;
83     protected XJMenuItem menuItemRedo = null;
84
85     protected XJMenuBarCustomizer customizer = null;
86     protected XJMenuBarDelegate delegate = null;
87
88     protected List JavaDoc<XJMenu> customMenus = new ArrayList JavaDoc<XJMenu>();
89
90     protected static List JavaDoc<XJMainMenuBar> mmbs = new ArrayList JavaDoc<XJMainMenuBar>();
91
92     public synchronized static XJMainMenuBar createInstance() {
93         XJMainMenuBar mmb = new XJMainMenuBar();
94         mmbs.add(mmb);
95         return mmb;
96     }
97
98     public synchronized static void removeInstance(XJMainMenuBar mmb) {
99         mmbs.remove(mmb);
100     }
101
102     public synchronized static void refreshAllRecentFilesMenu() {
103         for (XJMainMenuBar mmb : mmbs) {
104             mmb.rebuildRecentFilesMenu();
105         }
106     }
107
108     public synchronized static void refreshAllMenuBars() {
109         for (XJMainMenuBar mmb : mmbs) {
110             mmb.refresh();
111         }
112     }
113
114     public synchronized static void setActiveWindowToAllMenuBar(XJWindow window) {
115         for (XJMainMenuBar mmb : mmbs) {
116             mmb.setActiveWindow(window);
117         }
118     }
119
120     public static boolean isRecentFilesItem(XJMenuItem item) {
121         return item.getTag() >= XJMainMenuBar.MI_CLEAR_RECENT_FILES && item.getTag() < XJMainMenuBar.MI_NO_WINDOW;
122     }
123     
124     public XJMainMenuBar() {
125     }
126
127     public void setCustomizer(XJMenuBarCustomizer customizer) {
128         this.customizer = customizer;
129     }
130
131     public void setDelegate(XJMenuBarDelegate delegate) {
132         this.delegate = delegate;
133     }
134
135     public JMenuBar getJMenuBar() {
136         return menuBar;
137     }
138
139     public XJMenu getFileMenu() {
140         return menuFile;
141     }
142
143     public void refresh() {
144         refreshContent();
145         refreshState();
146     }
147
148     public void refreshState() {
149         refreshMenuState(menuFile);
150         refreshMenuState(menuEdit);
151         refreshMenuState(menuHelp);
152
153         for (XJMenu customMenu : customMenus) refreshMenuState(customMenu);
154     }
155
156     public void refreshMenuEditState() {
157         refreshMenuState(menuEdit);
158     }
159
160     public void refreshMenuState(XJMenu menu) {
161         if(menu == null)
162             return;
163         
164         for(int i=0; i<menu.getItemCount(); i++) {
165             XJMenuItem item = menu.getItemAtIndex(i);
166             if(item instanceof XJMenu)
167                 refreshMenuState((XJMenu)item);
168             else
169                 refreshMenuItemState(item);
170         }
171     }
172
173     public void refreshMenuItemState(XJMenuItem item) {
174         if(delegate != null)
175             delegate.menuItemState(item);
176     }
177
178     public void refreshContent() {
179         rebuildRecentFilesMenu();
180         rebuildWindowMenu();
181     }
182
183     public void menuUndoRedoItemState(XJUndo undo) {
184         if(undo == null) {
185             menuItemUndo.setEnabled(false);
186             menuItemRedo.setEnabled(false);
187         } else {
188             menuItemUndo.setEnabled(undo.canUndo());
189             menuItemRedo.setEnabled(undo.canRedo());
190         }
191     }
192
193     public void setActiveWindow(XJWindow window) {
194         if(menuWindow == null)
195             return;
196
197         int index = XJApplication.shared().getWindows().indexOf(window);
198         if(index>=0) {
199             XJMenuItem item = menuWindow.getItemAtIndex(index);
200             if(item != null)
201                 item.setSelected(true);
202         }
203     }
204
205     public void setupMenuItem(XJMenuItem item, String JavaDoc name, int keystroke, int modifiers, int tag) {
206         item.setTitle(name);
207         item.setTag(tag);
208
209         if(keystroke > 0 && modifiers > 0)
210             item.setAccelerator(keystroke, modifiers);
211         else if(keystroke >0)
212             item.setAccelerator(keystroke);
213
214         item.setDelegate(this);
215     }
216
217     public XJMenuItem buildMenuItem(String JavaDoc name, int keystroke, int modifiers, int tag) {
218         XJMenuItem item = new XJMenuItem();
219         setupMenuItem(item, name, keystroke, modifiers, tag);
220         return item;
221     }
222
223     public XJMenuItem buildMenuItem(String JavaDoc name, int keystroke, int tag) {
224         XJMenuItem item = new XJMenuItem();
225         setupMenuItem(item, name, keystroke, -1, tag);
226         return item;
227     }
228
229     public XJMenuItemCheck buildMenuItemCheck(String JavaDoc name, int keystroke, int tag) {
230         XJMenuItemCheck item = new XJMenuItemCheck();
231         setupMenuItem(item, name, keystroke, -1, tag);
232         return item;
233     }
234
235     public XJMenuItem buildMenuItem(String JavaDoc name, int tag) {
236         return buildMenuItem(name, -1, tag);
237     }
238
239     public static final int IGNORE_FILEMENU = 1;
240     public static final int IGNORE_EDITMENU = 2;
241     public static final int IGNORE_WINDOWMENU = 4;
242     public static final int IGNORE_HELPMENU = 8;
243
244     public void createMenuBar() {
245         createMenuBar(0);
246     }
247
248     public void createMenuBar(int ignore) {
249         customMenus.clear();
250
251         menuBar = new JMenuBar();
252
253         if((ignore & IGNORE_FILEMENU) == 0)
254             addMenu(createFileMenu());
255         if((ignore & IGNORE_EDITMENU) == 0)
256             addMenu(createEditMenu());
257
258         // Customization between menu Edit and menu Help
259
if(customizer != null)
260             customizer.customizeMenuBar(this);
261
262         if((ignore & IGNORE_WINDOWMENU) == 0)
263             addMenu(createWindowMenu());
264         if((ignore & IGNORE_HELPMENU) == 0)
265             addMenu(createHelpMenu());
266     }
267
268     public XJMenu createFileMenu() {
269         XJMenu menu = buildFileMenu();
270         if(customizer != null)
271             customizer.customizeFileMenu(menu);
272         XJApplication.getAppDelegate().customizeFileMenu(menu);
273         return menu;
274     }
275
276     public XJMenu createEditMenu() {
277         XJMenu menu = buildEditMenu();
278         if(customizer != null)
279             customizer.customizeEditMenu(menu);
280         XJApplication.getAppDelegate().customizeEditMenu(menu);
281         return menu;
282     }
283
284     public XJMenu createWindowMenu() {
285         XJMenu menu = buildWindowMenu();
286         if(customizer != null)
287             customizer.customizeWindowMenu(menu);
288         XJApplication.getAppDelegate().customizeWindowMenu(menu);
289         return menu;
290     }
291
292     public XJMenu createHelpMenu() {
293         XJMenu menu = buildHelpMenu();
294         if(customizer != null)
295             customizer.customizeHelpMenu(menu);
296         XJApplication.getAppDelegate().customizeHelpMenu(menu);
297         return menu;
298     }
299
300     public void addCustomMenu(XJMenu menu) {
301         if(menu == null)
302             return;
303
304         customMenus.add(menu);
305         addMenu(menu);
306     }
307
308     private void addMenu(XJMenu menu) {
309         menuBar.add(menu.getSwingComponent());
310         menu.setMainMenuBar(this);
311     }
312
313     private XJMenu buildFileMenu() {
314         boolean persistence = XJApplication.shared().supportsPersistence();
315
316         menuFile = new XJMenu();
317         menuFile.setTitle(XJLocalizable.getXJString("File"));
318         menuFile.addItem(buildMenuItem(XJLocalizable.getXJString("New"), KeyEvent.VK_N, MI_NEW));
319         if(persistence) {
320             menuFile.addItem(buildMenuItem(XJLocalizable.getXJString("Open"), KeyEvent.VK_O, MI_OPEN));
321             menuFile.addItem(createRecentFilesMenu());
322         }
323         menuFile.addSeparator();
324         menuFile.addItem(buildMenuItem(XJLocalizable.getXJString("Close"), KeyEvent.VK_W, MI_CLOSE));
325         if(persistence) {
326             menuFile.addItem(buildMenuItem(XJLocalizable.getXJString("Save"), KeyEvent.VK_S, MI_SAVE));
327             menuFile.addItem(buildMenuItem(XJLocalizable.getXJString("SaveAs"), MI_SAVEAS));
328         }
329
330         if(!XJSystem.isMacOS()) {
331             menuFile.addSeparator();
332             if(XJApplication.shared().hasPreferencesMenuItem()) {
333                 menuFile.addItem(buildMenuItem(XJLocalizable.getXJString("Preferences"), KeyEvent.VK_COMMA, MI_PREFS));
334                 menuFile.addSeparator();
335             }
336             menuFile.addItem(buildMenuItem(XJLocalizable.getXJString("Quit"), KeyEvent.VK_Q, MI_QUIT));
337         }
338         return menuFile;
339     }
340
341     public XJMenu createRecentFilesMenu() {
342         menuRecentFiles = new XJMenu();
343         rebuildRecentFilesMenu();
344         return menuRecentFiles;
345     }
346
347     public void rebuildRecentFilesMenu() {
348         if(menuRecentFiles == null)
349             return;
350
351         menuRecentFiles.clear();
352         menuRecentFiles.setTitle(XJLocalizable.getXJString("OpenRecent"));
353
354         int f = 0;
355         for (Object JavaDoc o : XJApplication.shared().recentFiles()) {
356             menuRecentFiles.addItem(buildMenuItem((String JavaDoc) o, MI_RECENT_FILES + f++));
357         }
358         menuRecentFiles.addSeparator();
359         menuRecentFiles.addItem(buildMenuItem(XJLocalizable.getXJString("ClearMenu"), MI_CLEAR_RECENT_FILES));
360     }
361
362     private XJMenu buildEditMenu() {
363         menuEdit = new XJMenu();
364         menuEdit.setTitle(XJLocalizable.getXJString("Edit"));
365         menuEdit.addItem(menuItemUndo = buildMenuItem(XJLocalizable.getXJString("Undo"), KeyEvent.VK_Z, MI_UNDO));
366         menuEdit.addItem(menuItemRedo = buildMenuItem(XJLocalizable.getXJString("Redo"), KeyEvent.VK_Z, XJMenuItem.getKeyModifier() | Event.SHIFT_MASK, MI_REDO));
367         menuEdit.addSeparator();
368         menuEdit.addItem(buildMenuItem(XJLocalizable.getXJString("Cut"), KeyEvent.VK_X, MI_CUT));
369         menuEdit.addItem(buildMenuItem(XJLocalizable.getXJString("Copy"), KeyEvent.VK_C, MI_COPY));
370         menuEdit.addItem(buildMenuItem(XJLocalizable.getXJString("Paste"), KeyEvent.VK_V, MI_PASTE));
371         menuEdit.addSeparator();
372         menuEdit.addItem(buildMenuItem(XJLocalizable.getXJString("SelectAll"), KeyEvent.VK_A, MI_SELECT_ALL));
373         return menuEdit;
374     }
375
376     private void buildWindowMenu_() {
377         Iterator JavaDoc iterator = XJApplication.shared().getWindows().iterator();
378         int count = 0;
379         while(iterator.hasNext()) {
380             XJWindow window = (XJWindow)iterator.next();
381             if(window.shouldAppearsInWindowMenu()) {
382                 XJMenuItemCheck item = buildMenuItemCheck(window.getTitle(), count<10?KeyEvent.VK_0+count:-1, MI_WINDOW+count);
383                 item.setSelected(window.isActive());
384                 menuWindow.addItem(item);
385                 count++;
386             }
387         }
388
389         if(count == 0) {
390             XJMenuItem item = new XJMenuItem(XJLocalizable.getXJString("NoWindows"), MI_NO_WINDOW, null);
391             item.setEnabled(false);
392             menuWindow.addItem(item);
393         }
394     }
395
396     private XJMenu buildWindowMenu() {
397         menuWindow = new XJMenu();
398         menuWindow.setTitle(XJLocalizable.getXJString("Window"));
399         buildWindowMenu_();
400         return menuWindow;
401     }
402
403     private void rebuildWindowMenu() {
404         if(menuWindow == null)
405             return;
406
407         for(int index = menuWindow.getItemCount()-1; index>=0; index--) {
408             XJMenuItem item = menuWindow.getItemAtIndex(index);
409             if(item != null && item.getTag() >= MI_NO_WINDOW)
410                 menuWindow.removeItem(index);
411         }
412         buildWindowMenu_();
413     }
414
415     private XJMenu buildHelpMenu() {
416         menuHelp = new XJMenu();
417         menuHelp.setTitle(XJLocalizable.getXJString("Help"));
418         menuHelp.addItem(buildMenuItem(XJLocalizable.getXJString("Help"), MI_HELP));
419         if(!XJSystem.isMacOS()) {
420             menuHelp.addSeparator();
421             menuHelp.addItem(buildMenuItem(XJLocalizable.getXJString("About"), MI_ABOUT));
422         }
423         return menuHelp;
424     }
425
426     public void handleMenuEvent(XJMenu menu, XJMenuItem item) {
427         XJDocument document = XJApplication.shared().getActiveDocument();
428         switch(item.tag) {
429             case MI_NEW:
430                 XJApplication.shared().newDocument();
431                 break;
432
433             case MI_OPEN:
434                 XJApplication.shared().openDocument();
435                 break;
436
437             case MI_LOAD:
438                 if(document != null && document.performLoad())
439                     document.changeReset();
440                 break;
441
442             case MI_SAVE:
443                 if(document != null && document.performSave(false))
444                     document.changeReset();
445                 break;
446
447             case MI_SAVEAS:
448                 if(document != null && document.performSave(true))
449                     document.changeReset();
450                 break;
451
452             case MI_CLEAR_RECENT_FILES:
453                 XJApplication.shared().clearRecentFiles();
454                 break;
455
456             case MI_QUIT:
457                 XJApplication.shared().performQuit();
458                 break;
459
460             case MI_PREFS:
461                 XJApplication.shared().displayPrefs();
462                 break;
463
464             case MI_ABOUT:
465                 XJApplication.shared().displayAbout();
466                 break;
467
468             case MI_HELP:
469                 XJApplication.shared().displayHelp();
470                 break;
471
472             default:
473                 if(item.tag>=MI_WINDOW) {
474                     XJWindow window = XJApplication.shared().getWindowsInWindowMenu().get(item.tag-MI_WINDOW);
475                     window.bringToFront();
476                     item.setSelected(true);
477                 } else if(item.tag>=MI_RECENT_FILES && item.tag<=MI_RECENT_FILES+XJApplication.MAX_RECENT_FILES) {
478                     if(!XJApplication.shared().openDocument(item.getTitle())) {
479                         XJApplication.shared().removeRecentFile(item.getTitle());
480                     }
481                 } else if(delegate != null)
482                     delegate.handleMenuEvent(menu, item);
483                 break;
484         }
485     }
486
487     public void menuSelected(XJMenu menu) {
488         if(delegate != null)
489             delegate.handleMenuSelected(menu);
490     }
491 }
492
Popular Tags