1 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 ; 44 import java.util.ArrayList ; 45 import java.util.Iterator ; 46 import java.util.List ; 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; 70 public static final int MI_NO_WINDOW = 21000; 71 public static final int MI_WINDOW = 21001; 73 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 <XJMenu> customMenus = new ArrayList <XJMenu>(); 89 90 protected static List <XJMainMenuBar> mmbs = new ArrayList <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 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 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 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 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 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 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 o : XJApplication.shared().recentFiles()) { 356 menuRecentFiles.addItem(buildMenuItem((String ) 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 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 |