/*******************************************************************************
* Copyright (c) 2010 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.swt.snippets;
/*
* Display snippet: slightly more complex example for Display.getMenuBar() (compared to Snippet347)
* Shows how to write a more cross-platform multi-window application using Display.getMenuBar().
*
* For a list of all SWT example snippets see
* http://www.eclipse.org/swt/snippets/
*
* @since 3.7
*/
import org.eclipse.swt.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.widgets.*;
public class Snippet348 {
static boolean createdScreenBar = false;
static void createMenuBar(Shell s) {
Menu bar = Display.getCurrent().getMenuBar();
boolean hasAppMenuBar = (bar != null);
if (bar == null) {
bar = new Menu(s, SWT.BAR);
}
// Populate the menu bar once if this is a screen menu bar.
// Otherwise, we need to make a new menu bar for each shell.
if (!createdScreenBar || !hasAppMenuBar) {
MenuItem item = new MenuItem(bar, SWT.CASCADE);
item.setText("File");
Menu menu = new Menu(item);
item.setMenu(menu);
menu.addMenuListener(new MenuListener() {
@Override
public void menuHidden(MenuEvent e) {
System.out.println("Menu closed: " + e);
}
@Override
public void menuShown(MenuEvent e) {
System.out.println("Menu open: " + e);
}
});
MenuItem newWindow = new MenuItem(menu, SWT.PUSH);
newWindow.setText("New Window");
newWindow.setAccelerator(SWT.MOD1 | 'N');
newWindow.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event event) {
Shell s = createShell();
s.open();
}
});
if (!SWT.getPlatform().equals("cocoa")) {
MenuItem exit = new MenuItem(menu, SWT.PUSH);
exit.setText("Exit");
exit.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event event) {
Display d = Display.getCurrent();
Shell[] shells = d.getShells();
for (Shell shell : shells) {
shell.close();
}
}
});
}
if (!hasAppMenuBar) s.setMenuBar(bar);
createdScreenBar = true;
}
}
static Shell createShell() {
final Shell shell = new Shell(SWT.SHELL_TRIM);
createMenuBar(shell);
shell.addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent e) {
Display d = Display.getCurrent();
Menu bar = d.getMenuBar();
boolean hasAppMenuBar = (bar != null);
if (!hasAppMenuBar) {
shell.getMenuBar().dispose();
Shell[] shells = d.getShells();
if ((shells.length == 1) && (shells[0] == shell)) {
if (!d.isDisposed()) d.dispose();
}
}
}
});
return shell;
}
public static void main(String[] args) {
final Display display = new Display();
Shell shell = createShell();
shell.open();
while (!display.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
}
}