package com.jbidwatcher.ui;
/*
* Copyright (c) 2000-2007, CyberFOX Software, Inc. All Rights Reserved.
*
* Developed by mrs (Morgan Schweers)
*/
import com.cyberfox.util.platform.Platform;
import com.jbidwatcher.util.config.JConfig;
import com.jbidwatcher.ui.util.JContext;
import com.jbidwatcher.util.Constants;
import com.jbidwatcher.util.queue.MQFactory;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.PopupMenuListener;
import javax.swing.event.PopupMenuEvent;
import java.util.HashMap;
/**
* The GUI Menu bar. This will create the menu bar for the application.
*
* @version $Revision: 1.38 $
*/
public class JBidMenuBar extends JMenuBar {
protected static JBidMenuBar _instance = null;
protected JMenu _fileMenu;
protected JMenu _editMenu;
protected JMenu _debugMenu = null;
protected JMenu _serverMenu;
protected JMenu mWindowMenu;
protected JMenu mTabMenu;
protected JMenu _auctionMenu;
protected JMenu _helpMenu;
protected ActionListener _actionDirector;
protected JMenuItem makeMenuItem(
JMenu inMenu,
String inName,
String inActionCommand,
int mnemonic,
KeyStroke accelerator) {
return makeMenuItem(inMenu, inName, inActionCommand, mnemonic, accelerator, true);
}
protected JMenuItem makeMenuItem(JMenu inMenu, String inName, String inActionCommand, int mnemonic, KeyStroke accelerator, boolean add) {
JMenuItem constructItem = new JMenuItem();
constructItem.setText(inName);
constructItem.setActionCommand(inActionCommand);
constructItem.addActionListener(_actionDirector);
constructItem.setMnemonic(mnemonic);
if (accelerator != null) {
constructItem.setAccelerator(accelerator);
} // end of if (accelerator != null)
if (add) inMenu.add(constructItem);
return constructItem;
}
protected JMenuItem makeMenuItem(
JMenu inMenu,
String inName,
int mnemonic,
KeyStroke accelerator) {
return makeMenuItem(inMenu, inName, inName, mnemonic, accelerator, true);
}
protected JMenuItem makeMenuItem(JMenu inMenu, String inName, String inActionCommand, char mnemonic) {
JMenuItem constructItem = new JMenuItem();
constructItem.setText(inName);
constructItem.setActionCommand(inActionCommand);
constructItem.addActionListener(_actionDirector);
constructItem.setMnemonic(mnemonic);
inMenu.add(constructItem);
return constructItem;
}
protected JMenuItem makeMenuItem(JMenu inMenu, String inName, char mnemonic) {
return makeMenuItem(inMenu, inName, inName, mnemonic);
}
protected JMenuItem makeMenuItem(JMenu inMenu, String inName, int mnemonic) {
return makeMenuItem(inMenu, inName, inName, mnemonic, null);
}
protected JMenuItem makeMenuItem(JMenu inMenu, String inName) {
return makeMenuItem(inMenu, inName, inName, '\0');
}
protected void establishFileMenu(JMenu inMenu) {
makeMenuItem(
inMenu,
"Save Auctions", "Save",
KeyEvent.VK_S,
KeyStroke.getKeyStroke(KeyEvent.VK_S, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
makeMenuItem(inMenu, "Dump Cache", "Dump", KeyEvent.VK_D,
KeyStroke.getKeyStroke(KeyEvent.VK_D, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
if(Platform.isMac()) {
makeMenuItem(
inMenu,
"Configure",
KeyEvent.VK_C,
KeyStroke.getKeyStroke(KeyEvent.VK_COMMA, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
} else {
makeMenuItem(
inMenu,
"Configure",
KeyEvent.VK_C,
KeyStroke.getKeyStroke(KeyEvent.VK_C, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
}
makeMenuItem(inMenu, "Scripting Manager", "Scripting", 'M');
if(!Platform.isMac()) makeMenuItem(inMenu, "Check For Updates", KeyEvent.VK_U);
makeMenuItem(inMenu, "Clear Deleted Tracking", "Clear Deleted", KeyEvent.VK_D, KeyStroke.getKeyStroke(KeyEvent.VK_D, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
if(!Platform.isMac()) inMenu.add(new JSeparator());
makeMenuItem(
inMenu,
"Exit",
"Exit",
KeyEvent.VK_X,
KeyStroke.getKeyStroke(KeyEvent.VK_Q, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), !Platform.isMac());
String launcher = System.getenv("JBIDWATCHER_LAUNCHER");
if(launcher != null && JConfig.debugging()) {
makeMenuItem(inMenu, "Restart", "Restart", 'R');
}
}
protected void establishDebugMenu(JMenu inMenu) {
makeMenuItem(inMenu, "Serialize");
makeMenuItem(inMenu, "Deserialize");
makeMenuItem(inMenu, "SQL");
inMenu.add(new JSeparator());
makeMenuItem(inMenu, "Submit Log File");
}
protected void establishEditMenu(JMenu inMenu) {
JMenu copyMenu = new JMenu("Copy");
copyMenu.add(JContext.makeGeneralMenuItem("Information", "Copy")).addActionListener(_actionDirector);
copyMenu.add(JContext.makeGeneralMenuItem("URL", "CopyURL")).addActionListener(_actionDirector);
copyMenu.add(JContext.makeGeneralMenuItem("Auction Id", "CopyID")).addActionListener(_actionDirector);
inMenu.add(copyMenu);
//makeMenuItem(inMenu, "Copy Auction URL", "CopyURL", KeyEvent.VK_C,
// KeyStroke.getKeyStroke(KeyEvent.VK_C, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
//makeMenuItem(inMenu, "Copy Auction ID", "CopyID", 'I');
makeMenuItem(inMenu, "Paste Auction", "Paste", KeyEvent.VK_P,
KeyStroke.getKeyStroke(KeyEvent.VK_V, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
inMenu.add(new JSeparator());
makeMenuItem(inMenu, "Find", "Search", KeyEvent.VK_F,
KeyStroke.getKeyStroke(KeyEvent.VK_F, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
inMenu.add(new JSeparator());
makeMenuItem(inMenu, "Set Background Color", "Set Background Color", 'B');
makeMenuItem(inMenu, "Show/Hide Toolbar", "Toolbar", 'T');
}
protected void establishServerMenu(JMenu inMenu) {
String doTimeSync = JConfig.queryConfiguration("timesync.enabled", "true");
makeMenuItem(inMenu, "Update Auctions", "UpdateAll", 'U');
makeMenuItem(inMenu, "Stop Activity", "StopUpdating", KeyEvent.VK_S,
KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
if(doTimeSync.equals("true")) {
inMenu.add(new JSeparator());
makeMenuItem(inMenu, "Time Information", "Show Time Info", 'T');
makeMenuItem(inMenu, "Synchronize Time", "Resync", 'R');
}
}
protected void establishWindowMenu(JMenu inMenu) {
makeMenuItem(inMenu, "Activity Log", "View Activity", 'A');
makeMenuItem(inMenu, "Errors Log", "View Log", 'E');
makeMenuItem(inMenu, "Search Manager", "Search", 'S');
makeMenuItem(inMenu, "Configuration", "Configure", 'C');
makeMenuItem(inMenu, "Scripting", 'P');
inMenu.add(new JSeparator());
makeMenuItem(inMenu, "Choose Font", "Font", 'F');
makeMenuItem(inMenu, "Change Selection Color", "Selection Color", 'H');
}
protected void establishAuctionMenu(JMenu inMenu) {
// The mac doesn't have an 'INSERT' key. I suppose 'Overwrite'
// mode is too complex? Frustration abounds, as CMD-A is 'select
// all'. We're going with CMD-I to mirror 'Insert'.
JMenuItem add;
if(Platform.isMac()) {
add = makeMenuItem(inMenu, "Add New", KeyEvent.VK_A,
KeyStroke.getKeyStroke(KeyEvent.VK_N, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
} else {
add = makeMenuItem(inMenu, "Add", KeyEvent.VK_A,
KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, 0));
}
add.registerKeyboardAction(_actionDirector, "Add", KeyStroke.getKeyStroke(KeyEvent.VK_ADD, 0), WHEN_IN_FOCUSED_WINDOW);
add.registerKeyboardAction(_actionDirector, "Add", KeyStroke.getKeyStroke(KeyEvent.VK_EQUALS, KeyEvent.SHIFT_DOWN_MASK), WHEN_IN_FOCUSED_WINDOW);
// Require 'CMD-Del' for the Mac, because otherwise it catches
// the 'Del' operation in the middle of text entry. (D'oh!)
if(Platform.isMac()) {
makeMenuItem(inMenu, "Delete", KeyEvent.VK_D,
KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
} else {
makeMenuItem(inMenu, "Delete", KeyEvent.VK_D,
KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0));
}
inMenu.add(new JSeparator());
makeMenuItem(inMenu, "Snipe", 'S', KeyStroke.getKeyStroke(KeyEvent.VK_E, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
makeMenuItem(inMenu, "Multiple Snipe", 'i');
makeMenuItem(inMenu, "Cancel Snipe", 'C');
inMenu.add(new JSeparator());
makeMenuItem(inMenu, "Bid", 'B');
makeMenuItem(inMenu, "Buy", 'y');
inMenu.add(new JSeparator());
makeMenuItem(inMenu, "Update", 'U');
if(Platform.isMac()) {
makeMenuItem(inMenu, "Show Information", "Information", 'I', KeyStroke.getKeyStroke(KeyEvent.VK_I, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
} else {
makeMenuItem(inMenu, "Show Information", "Information", 'I');
}
// makeMenuItem(inMenu, "Show Last Error Page", "ShowError", 'l');
makeMenuItem(inMenu, "Show In Browser", "Browse", 'b', KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
// makeMenuItem(inMenu, "Show status", "Status", 't');
inMenu.add(new JSeparator());
JMenu commentMenu = new JMenu("Comment");
commentMenu.add(JContext.makeGeneralMenuItem("Add", "Add Comment")).addActionListener(_actionDirector);
commentMenu.add(JContext.makeGeneralMenuItem("View", "View Comment")).addActionListener(_actionDirector);
commentMenu.add(JContext.makeGeneralMenuItem("Remove", "Remove Comment")).addActionListener(_actionDirector);
inMenu.add(commentMenu);
}
protected void establishHelpMenu(JMenu inMenu) {
makeMenuItem(inMenu, "Explain Colors And Icons", 'E');
makeMenuItem(inMenu, "FAQ", 'F', KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0));
makeMenuItem(inMenu, "User Community", "Forum", 'C');
makeMenuItem(inMenu, "Donate", 'D');
makeMenuItem(inMenu, "License Details", "License", 'D');
if(JConfig.debugging()) makeMenuItem(inMenu, "Report a Bug", "Report Bug", 'R');
inMenu.add(new JSeparator());
makeMenuItem(inMenu, "My JBidwatcher", 'M');
makeMenuItem(inMenu, "About " + Constants.PROGRAM_NAME, 'A');
}
private static HashMap<String, JBidMenuBar> _frameMenus = new HashMap<String, JBidMenuBar>(10);
/**
* @brief Return the menu instance associated with a specific frame name.
*
* @param inAction - The action underlying the menu, in case it has to be created.
* @param frameName - The name of the frame to associated the menu bar with.
*
* @return - A menu bar usable with said frame.
*/
protected static JBidMenuBar getFrameInstance(PopupMenuFactory menuFactory, JTabbedPane inTabs, ActionListener inAction, String frameName) {
JBidMenuBar retInstance = _frameMenus.get(frameName);
if(retInstance == null) {
if(inAction == null) {
throw new RuntimeException("JBidMenuBar.getInstance(null) called when no matching instance \"" + frameName + "\" yet created!");
}
retInstance = new JBidMenuBar(menuFactory, inTabs, inAction);
_frameMenus.put(frameName, retInstance);
}
if(_instance == null) _instance = retInstance;
return retInstance;
}
/**
* @brief Return the 'global instance' of the menu bar.
*
* @param inAction - The action handler to use under the menu bar.
*
* @return - The global instance of the menu bar.
*/
public static JBidMenuBar getInstance(PopupMenuFactory menuFactory, JTabbedPane inTabs, ActionListener inAction) {
return getInstance(menuFactory, inTabs, inAction, null);
}
/**
* @brief Get an instance of the menu bar for use with a given frame name.
*
* @param inAction - The action to use underneath the menu bar.
* @param frameName - The name of the frame this menu bar is to be associated with.
*
* @return - A menu bar, either the 'global instance', or a specific one for the frame.
*/
public static JBidMenuBar getInstance(PopupMenuFactory menuFactory, JTabbedPane inTabs, ActionListener inAction, String frameName) {
if(inAction == null && _instance == null && _frameMenus == null) {
throw new RuntimeException("JBidMenuBar.getInstance(null, null) called when no instance yet created!");
}
if(frameName != null) {
return getFrameInstance(menuFactory, inTabs, inAction, frameName);
}
// Return the 'global instance'.
if(_instance == null) {
_instance = new JBidMenuBar(menuFactory, inTabs, inAction);
}
return _instance;
}
private JBidMenuBar(PopupMenuFactory menuFactory, JTabbedPane inTabs, ActionListener inAction) {
_actionDirector = inAction;
_fileMenu = new JMenu("File");
_fileMenu.setMnemonic('F');
_editMenu = new JMenu("Edit");
_editMenu.setMnemonic('E');
if(JConfig.queryConfiguration("debug.menu", "false").equals("true") && JConfig.debugging()) {
_debugMenu = new JMenu("Debug");
_debugMenu.setMnemonic('D');
establishDebugMenu(_debugMenu);
}
_serverMenu = new JMenu("Servers");
_serverMenu.setMnemonic('S');
_auctionMenu = new JMenu("Auction");
_auctionMenu.setMnemonic('A');
mTabMenu = new JMenu("Tab");
mTabMenu.setMnemonic('T');
mWindowMenu = new JMenu("Windows");
mWindowMenu.setMnemonic('W');
_helpMenu = new JMenu("Help");
_helpMenu.setMnemonic('H');
establishFileMenu(_fileMenu);
establishEditMenu(_editMenu);
establishServerMenu(_serverMenu);
establishAuctionMenu(_auctionMenu);
establishTabMenu(menuFactory, inTabs, mTabMenu);
establishWindowMenu(mWindowMenu);
establishHelpMenu(_helpMenu);
add(_fileMenu);
add(_editMenu);
if (_debugMenu != null) {
add(_debugMenu);
}
add(_serverMenu);
add(_auctionMenu);
add(mTabMenu);
add(mWindowMenu);
add(_helpMenu);
}
private void establishTabMenu(PopupMenuFactory menuFactory, final JTabbedPane inTabs, JMenu tabMenu) {
final JTabPopupMenu pop = menuFactory.create(inTabs, tabMenu.getPopupMenu());
MQFactory.getConcrete("tab_menu").registerListener(pop);
tabMenu.getPopupMenu().addPopupMenuListener(new PopupMenuListener() {
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
pop.preparePopup(inTabs.getSelectedIndex());
}
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { }
public void popupMenuCanceled(PopupMenuEvent e) { }
});
}
}