package org.oddjob.monitor.view;
import java.awt.event.KeyEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPopupMenu;
import javax.swing.event.MenuEvent;
import javax.swing.event.MenuListener;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import org.oddjob.arooa.design.actions.ConfigurableMenus;
import org.oddjob.arooa.design.designer.PopupMenuProvider;
import org.oddjob.monitor.context.ExplorerContext;
import org.oddjob.monitor.model.DetailModel;
import org.oddjob.monitor.model.SelectedContextAware;
/**
* Implementation of the monitor menu bar.
*
* @author Rob Gordon
*/
public class MonitorMenuBar extends JMenuBar implements PopupMenuProvider {
private static final long serialVersionUID = 2011101000L;
public static final String JOB_MENU_ID = "Job";
/** The file menu. */
private final JMenu fileMenu;
private JMenu[] lastFormMenus;
private JPopupMenu popupMenu;
private MenuSelection selectionListener;
/** Explorer model for job actions to observe. */
private DetailModel detailModel;
/**
* Constructor.
*
*/
public MonitorMenuBar() {
fileMenu = new JMenu("File");
fileMenu.setMnemonic(KeyEvent.VK_F);
this.add(fileMenu);
}
public JMenu getFileMenu() {
return fileMenu;
}
public JPopupMenu getPopupMenu() {
return popupMenu;
}
/**
* Associate the menu with an explorer session.
*
* @param model DetailModel.
*/
public void setSession(final ExplorerJobActions jobActions, DetailModel model) {
if (detailModel != null) {
throw new IllegalStateException(
"noSession() should have been called first.");
}
detailModel = model;
ConfigurableMenus formMenus = new ConfigurableMenus();
final ExplorerEditActions editActions =
new ExplorerEditActions();
editActions.contributeTo(formMenus);
jobActions.contributeTo(formMenus);
selectionListener = new MenuSelection(
new SelectedContextAware() {
public void setSelectedContext(ExplorerContext context) {
editActions.setSelectedContext(context);
jobActions.setSelectedContext(context);
}
@Override
public void prepare() {
editActions.prepare();
jobActions.prepare();
}
});
detailModel.addPropertyChangeListener(
selectionListener);
lastFormMenus = formMenus.getJMenuBar();
lastFormMenus[0].addMenuListener(selectionListener);
lastFormMenus[1].addMenuListener(selectionListener);
popupMenu = formMenus.getPopupMenu();
popupMenu.addPopupMenuListener(selectionListener);
for (JMenu menu : lastFormMenus) {
this.add(menu);
}
this.validate();
this.repaint();
}
/**
* Remove any association with an Explorer session.
*
*/
public void noSession() {
if (detailModel != null) {
detailModel.removePropertyChangeListener(
selectionListener);
detailModel = null;
}
selectionListener = null;
if (lastFormMenus != null) {
for (JMenu menu : lastFormMenus) {
this.remove(menu);
}
lastFormMenus = null;
this.validate();
this.repaint();
}
}
/**
* Internal class to handle menu selection.
*/
class MenuSelection implements PropertyChangeListener, PopupMenuListener, MenuListener {
/** Job Actions for the job menu. */
private SelectedContextAware selectionAware;
/** Track ExplorerContext as the selected job changes. */
private ExplorerContext context;
MenuSelection(SelectedContextAware jobActions) {
this.selectionAware = jobActions;
}
public void propertyChange(PropertyChangeEvent evt) {
if (DetailModel.SELECTED_CONTEXT_PROPERTY.equals(
evt.getPropertyName())) {
context = (ExplorerContext) evt.getNewValue();
selectionAware.setSelectedContext(context);
}
}
public void menuSelected(MenuEvent e) {
menuSelect();
}
public void menuCanceled(MenuEvent e) {
}
public void menuDeselected(MenuEvent e) {
}
public void popupMenuCanceled(PopupMenuEvent e) {
}
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
}
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
menuSelect();
}
void menuSelect() {
if (context == null) {
// Will this ever happen?
return;
}
selectionAware.prepare();
}
}
}