/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at * trunk/opends/resource/legal-notices/OpenDS.LICENSE * or https://OpenDS.dev.java.net/OpenDS.LICENSE. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, * add the following below this CDDL HEADER, with the fields enclosed * by brackets "[]" replaced with your own identifying information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Copyright 2008-2010 Sun Microsystems, Inc. */ package org.opends.guitools.controlpanel.ui; import static org.opends.messages.AdminToolMessages.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.HashSet; import java.util.Set; import javax.swing.JMenu; import javax.swing.JMenuItem; import org.opends.guitools.controlpanel.datamodel.ControlPanelInfo; import org.opends.guitools.controlpanel.task.Task; import org.opends.guitools.controlpanel.util.Utilities; import org.opends.messages.Message; /** * The menu bar that appears on the main panel. * */ public class MainMenuBar extends GenericMenuBar { private static final long serialVersionUID = 6441273044772077947L; private GenericDialog dlg; private RefreshOptionsPanel panel; /** * Constructor. * @param info the control panel information. */ public MainMenuBar(ControlPanelInfo info) { super(info); addMenus(); if (Utilities.isMacOS()) { setMacOSQuitHandler(); } } /** * Method that can be overwritten to set specific menus. * */ protected void addMenus() { add(createFileMenuBar()); add(createViewMenuBar()); add(createHelpMenuBar()); } /** * The method called when the user clicks on quick. It will check that there * are not ongoing tasks. If there are tasks, it will ask the user for * confirmation to quit. * */ public void quitClicked() { Set<String> runningTasks = new HashSet<String>(); for (Task task : getInfo().getTasks()) { if (task.getState() == Task.State.RUNNING) { runningTasks.add(task.getTaskDescription().toString()); } } boolean confirmed = true; if (runningTasks.size() > 0) { String allTasks = Utilities.getStringFromCollection(runningTasks, "<br>"); Message title = INFO_CTRL_PANEL_CONFIRMATION_REQUIRED_SUMMARY.get(); Message msg = INFO_CTRL_PANEL_RUNNING_TASKS_CONFIRMATION_DETAILS.get(allTasks); confirmed = Utilities.displayConfirmationDialog( Utilities.getParentDialog(this), title, msg); } if (confirmed) { System.exit(0); } } /** * Creates the File menu bar. * @return the File menu bar. */ protected JMenu createFileMenuBar() { JMenu menu = Utilities.createMenu(INFO_CTRL_PANEL_FILE_MENU.get(), INFO_CTRL_PANEL_FILE_MENU_DESCRIPTION.get()); menu.setMnemonic(KeyEvent.VK_F); JMenuItem menuItem = Utilities.createMenuItem( INFO_CTRL_PANEL_CONNECT_TO_SERVER_MENU.get()); menuItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev) { connectToServerClicked(); } }); menu.add(menuItem); if (!Utilities.isMacOS()) { menuItem = Utilities.createMenuItem(INFO_CTRL_PANEL_EXIT_MENU.get()); menuItem.addActionListener(new ActionListener() { /** * {@inheritDoc} */ public void actionPerformed(ActionEvent ev) { quitClicked(); } }); menu.add(menuItem); } return menu; } /** * Creates the View menu bar. * @return the View menu bar. */ protected JMenu createViewMenuBar() { JMenu menu = Utilities.createMenu(INFO_CTRL_PANEL_VIEW_MENU.get(), INFO_CTRL_PANEL_HELP_VIEW_DESCRIPTION.get()); menu.setMnemonic(KeyEvent.VK_V); JMenuItem menuItem = Utilities.createMenuItem( INFO_CTRL_PANEL_REFRESH_MENU.get()); menuItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev) { refreshOptionsClicked(); } }); menu.add(menuItem); return menu; } /** * Specific method to be able to handle the Quit events sent from the COCOA * menu of Mac OS. * */ private void setMacOSQuitHandler() { try { Class<? extends Object> applicationClass = Class.forName("com.apple.eawt.Application"); Class<? extends Object> applicationListenerClass = Class.forName("com.apple.eawt.ApplicationListener"); final Object macApplication = applicationClass.getConstructor( (Class[])null).newInstance((Object[])null); InvocationHandler adapter = new InvocationHandler() { public Object invoke (Object proxy, Method method, Object[] args) throws Throwable { Object event = args[0]; if (method.getName().equals("handleQuit")) { quitClicked(); // quitClicked will exit if we must exit Method setHandledMethod = event.getClass().getDeclaredMethod( "setHandled", new Class[] { boolean.class }); setHandledMethod.invoke(event, new Object[] { Boolean.FALSE }); } return null; } }; Method addListenerMethod = applicationClass.getDeclaredMethod("addApplicationListener", new Class[] { applicationListenerClass }); Object proxy = Proxy.newProxyInstance(MainMenuBar.class.getClassLoader(), new Class[] { applicationListenerClass }, adapter); addListenerMethod.invoke(macApplication, new Object[] { proxy }); } catch (Throwable t) { t.printStackTrace(); } } /** * The method called when the user clicks on 'Refresh Options'. * */ protected void refreshOptionsClicked() { if (panel == null) { panel = new RefreshOptionsPanel(); panel.setInfo(getInfo()); dlg = new GenericDialog( Utilities.getFrame(MainMenuBar.this), panel); dlg.setModal(true); Utilities.centerGoldenMean(dlg, Utilities.getFrame(MainMenuBar.this)); } dlg.setVisible(true); if (!panel.isCanceled()) { getInfo().setPoolingPeriod(panel.getPoolingPeriod()); getInfo().stopPooling(); getInfo().startPooling(); } } /** * The method called when the user clicks on 'Connect to Server...'. */ protected void connectToServerClicked() { Set<String> runningTasks = new HashSet<String>(); for (Task task : getInfo().getTasks()) { if (task.getState() == Task.State.RUNNING) { runningTasks.add(task.getTaskDescription().toString()); } } boolean confirmed = true; if (runningTasks.size() > 0) { String allTasks = Utilities.getStringFromCollection(runningTasks, "<br>"); Message title = INFO_CTRL_PANEL_CONFIRMATION_REQUIRED_SUMMARY.get(); Message msg = INFO_CTRL_PANEL_RUNNING_TASKS_CHANGE_SERVER_CONFIRMATION_DETAILS.get( allTasks); confirmed = Utilities.displayConfirmationDialog( Utilities.getParentDialog(this), title, msg); } if (confirmed) { GenericDialog dlg = ControlCenterMainPane.getLocalOrRemoteDialog(getInfo()); Utilities.centerGoldenMean(dlg, Utilities.getFrame(MainMenuBar.this)); dlg.setVisible(true); } } }