package org.enhydra.jawe;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.lang.reflect.Constructor;
import javax.swing.Action;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JToolBar;
import javax.swing.KeyStroke;
import javax.swing.SwingConstants;
import org.enhydra.jawe.base.controller.JaWEType;
import org.enhydra.jawe.base.controller.JaWETypeChoiceButton;
import org.enhydra.jawe.base.editor.NewStandardXPDLElementEditor;
public class BarFactory {
public final static String CLASSNAME_POSTFIX = "ClassName";
public final static String SETTINGSNAME_POSTFIX = "SettingsName";
public final static String ACCELERATION_POSTFIX = "Accel";
public final static String MNEMONIC_POSTFIX = "Mnemonic";
public final static String LABEL_POSTFIX = "Label";
public final static String TOOLTIP_POSTFIX = "Tooltip";
public final static String LANGUAGEDEPENDENTNAME_POSTFIX = "LangName";
public final static String JAWE_STANDARD_MENU_PREFIX = "jawe_";
public final static String JAWE_STANDARD_ACTION_PREFIX = "jaweAction_";
public final static String JAWECOMPONENT_AS_MENU_PREFIX = "@";
public final static String SUBMENU_PREFIX = "*";
public final static String ACTION_DELIMITER = " ";
public final static String ACTION_SEPARATOR = "-";
public final static String CTRL_PREFIX = "CTRL";
public final static String SHIFT_PREFIX = "SHIFT";
public final static String ALT_PREFIX = "ALT";
public static JMenuBar createMainMenu(JaWEComponent comp) {
JMenuBar mbar = new JMenuBar();
String actionOrder = comp.getSettings().getMainMenuActionOrder();
String[] act = Utils.tokenize(actionOrder, ACTION_DELIMITER);
for (int i = 0; i < act.length; i++) {
if (act[i].startsWith(JAWECOMPONENT_AS_MENU_PREFIX)) {
String className = (String) comp.getSettings()
.getSetting(act[i].substring(1) + CLASSNAME_POSTFIX);
String settingsName = (String) comp.getSettings()
.getSetting(act[i].substring(1) + SETTINGSNAME_POSTFIX);
JMenu subMenu = getExternalMenu(className, settingsName);
if (subMenu != null) {
BarFactory.setAccelerator(subMenu, comp.getSettings()
.getLanguageDependentString(act[i].substring(1) + ACCELERATION_POSTFIX));
BarFactory.setMnemonic(subMenu, comp.getSettings()
.getLanguageDependentString(act[i].substring(1) + MNEMONIC_POSTFIX));
mbar.add(subMenu);
}
} else if (act[i].startsWith(JAWE_STANDARD_MENU_PREFIX)) {
mbar.add(JaWEManager.getInstance()
.getJaWEController()
.getJaWEActions()
.getActionMenu(act[i], true));
} else if (act[i].startsWith(JAWE_STANDARD_ACTION_PREFIX)) {
mbar.add(JaWEManager.getInstance()
.getJaWEController()
.getJaWEActions()
.getActionMenuItem(act[i].substring(11), true));
} else if (act[i].startsWith(SUBMENU_PREFIX)) {
JMenu sm = createSubMenu(act[i].substring(1), comp, true);
if (sm != null) {
mbar.add(sm);
}
} else {
JaWEAction ja = comp.getSettings().getAction(act[i]);
if (ja != null) {
mbar.add(createMenuItem(ja, comp, true));
}
}
}
return mbar;
}
public static JPopupMenu createPopupMenu(String popupMenuName, JaWEComponent comp) {
String actionOrder = comp.getSettings().getMenuActionOrder(popupMenuName);
return createMenu(actionOrder, comp, false).getPopupMenu();
}
public static JToolBar createToolbar(String toolbarName, JaWEComponent comp) {
String actionOrder = comp.getSettings().getToolbarActionOrder(toolbarName);
JToolBar toolbar = new JToolBar();
toolbar.setRollover(true);
String[] act = Utils.tokenize(actionOrder, ACTION_DELIMITER);
for (int i = 0; i < act.length; i++) {
if (act[i].equals(ACTION_SEPARATOR)) {
toolbar.addSeparator();
} else if (act[i].startsWith(JAWE_STANDARD_MENU_PREFIX)) {
toolbar.add(JaWEManager.getInstance()
.getJaWEController()
.getJaWEActions()
.getActionToolbar(act[i]));
} else if (act[i].startsWith(JAWE_STANDARD_ACTION_PREFIX)) {
toolbar.add(JaWEManager.getInstance()
.getJaWEController()
.getJaWEActions()
.getActionButton(act[i].substring(11)));
} else if (act[i].startsWith(SUBMENU_PREFIX)) {
toolbar.add(createToolbar(act[i].substring(1), comp));
} else {
JaWEAction ja = comp.getSettings().getAction(act[i]);
if (ja != null) {
toolbar.add(createToolbarButton(ja, comp));
}
}
}
toolbar.setName(comp.getSettings().getLanguageDependentString(toolbarName
+ LABEL_POSTFIX));
return toolbar;
}
public static JButton createToolbarButton(JaWEAction ja, JaWEComponent comp) {
Action a = ja.getAction();
String aname = null;
if (a != null) {
aname = (String) a.getValue(Action.NAME);
}
String depName = ja.getLangDepName();
String label = comp.getSettings().getLanguageDependentString(depName
+ LABEL_POSTFIX);
if (aname == null) {
aname = depName;
}
if (label == null) {
label = aname;
}
JButton b = null;
ImageIcon ai = ja.getIcon();
if (ai != null) {
if (a instanceof NewActionBase && comp instanceof ChoiceButtonListener) {
b = new JaWETypeChoiceButton(JaWEType.class,
((NewActionBase) a).getXPDLTypeClass(),
(ChoiceButtonListener) comp,
ai);
} else if (comp instanceof NewStandardXPDLElementEditor) {
// CUSTOM
b = new JButton(label, ai) {
public float getAlignmentY() {
return 0.5f;
}
};
// END CUSTOM
} else {
b = new JButton(ai) {
public float getAlignmentY() {
return 0.5f;
}
};
}
} else {
if (a instanceof NewActionBase && comp instanceof ChoiceButtonListener) {
b = new JaWETypeChoiceButton(JaWEType.class,
((NewActionBase) a).getXPDLTypeClass(),
(ChoiceButtonListener) comp,
ai);
} else {
b = new JButton(label) {
public float getAlignmentY() {
return 0.5f;
}
};
}
}
b.setName(aname);
b.setMargin(new Insets(1, 1, 1, 1));
b.setRequestFocusEnabled(false);
b.setActionCommand(aname);
if (a != null) {
b.addActionListener(a);
b.setEnabled(a.isEnabled());
a.addPropertyChangeListener(new ButtonPropertyChangedListener(b));
} else {
b.setEnabled(false);
}
String tip = comp.getSettings().getLanguageDependentString(depName
+ TOOLTIP_POSTFIX);
if (tip != null) {
b.setToolTipText(tip);
}
return b;
}
protected static JMenu createMenu(String actionOrder,
JaWEComponent comp,
boolean addBCListener) {
JMenu menu = new JMenu();
String[] act = Utils.tokenize(actionOrder, ACTION_DELIMITER);
for (int i = 0; i < act.length; i++) {
if (act[i].equals(ACTION_SEPARATOR)) {
menu.addSeparator();
} else if (act[i].startsWith(JAWECOMPONENT_AS_MENU_PREFIX)) {
String className = (String) comp.getSettings()
.getSetting(act[i].substring(1) + CLASSNAME_POSTFIX);
String settingsName = (String) comp.getSettings()
.getSetting(act[i].substring(1) + SETTINGSNAME_POSTFIX);
JMenu subMenu = getExternalMenu(className, settingsName);
BarFactory.setAccelerator(subMenu, comp.getSettings()
.getLanguageDependentString(act[i].substring(1) + ACCELERATION_POSTFIX));
BarFactory.setMnemonic(subMenu, comp.getSettings()
.getLanguageDependentString(act[i].substring(1) + MNEMONIC_POSTFIX));
menu.add(subMenu);
} else if (act[i].startsWith(JAWE_STANDARD_MENU_PREFIX)) {
menu.add(JaWEManager.getInstance()
.getJaWEController()
.getJaWEActions()
.getActionMenu(act[i], addBCListener));
} else if (act[i].startsWith(JAWE_STANDARD_ACTION_PREFIX)) {
menu.add(JaWEManager.getInstance()
.getJaWEController()
.getJaWEActions()
.getActionMenuItem(act[i].substring(11), addBCListener));
} else if (act[i].startsWith(SUBMENU_PREFIX)) {
menu.add(createSubMenu(act[i].substring(1), comp, addBCListener));
} else {
JaWEAction ja = comp.getSettings().getAction(act[i]);
if (ja != null) {
menu.add(createMenuItem(ja, comp, addBCListener));
}
}
}
return menu;
}
protected static JMenu createSubMenu(String name,
JaWEComponent comp,
boolean addBCListener) {
JMenu menu = new JMenu();
String depName = (String) comp.getSettings()
.getSetting(name + LANGUAGEDEPENDENTNAME_POSTFIX);
String langDepName = comp.getSettings().getLanguageDependentString(depName
+ LABEL_POSTFIX);
if (langDepName == null) {
langDepName = name;
}
BarFactory.setAccelerator(menu, comp.getSettings()
.getLanguageDependentString(depName + ACCELERATION_POSTFIX));
BarFactory.setMnemonic(menu, comp.getSettings()
.getLanguageDependentString(depName + MNEMONIC_POSTFIX));
menu.setText(langDepName);
String actionOrder = comp.getSettings().getMenuActionOrder(name);
String[] act = Utils.tokenize(actionOrder, ACTION_DELIMITER);
int cnt=0;
for (int i = 0; i < act.length; i++) {
if (act[i].equals(ACTION_SEPARATOR)) {
menu.addSeparator();
cnt++;
} else if (act[i].startsWith(JAWECOMPONENT_AS_MENU_PREFIX)) {
String className = (String) comp.getSettings()
.getSetting(act[i].substring(1) + CLASSNAME_POSTFIX);
String settingsName = (String) comp.getSettings()
.getSetting(act[i].substring(1) + SETTINGSNAME_POSTFIX);
JMenu subMenu = getExternalMenu(className, settingsName);
if (subMenu != null) {
BarFactory.setAccelerator(subMenu, comp.getSettings()
.getLanguageDependentString(act[i].substring(1) + ACCELERATION_POSTFIX));
BarFactory.setMnemonic(subMenu, comp.getSettings()
.getLanguageDependentString(act[i].substring(1) + MNEMONIC_POSTFIX));
menu.add(subMenu);
cnt++;
} else {
System.out.println("Can't create ext meny "
+ settingsName + " for cn " + className);
}
} else if (act[i].startsWith(JAWE_STANDARD_MENU_PREFIX)) {
menu.add(JaWEManager.getInstance()
.getJaWEController()
.getJaWEActions()
.getActionMenu(act[i], addBCListener));
cnt++;
} else if (act[i].startsWith(JAWE_STANDARD_ACTION_PREFIX)) {
menu.add(JaWEManager.getInstance()
.getJaWEController()
.getJaWEActions()
.getActionMenuItem(act[i].substring(11), addBCListener));
cnt++;
} else if (act[i].startsWith(SUBMENU_PREFIX)) {
JMenu sm=createSubMenu(act[i], comp, addBCListener);
if (sm!=null) {
menu.add(sm);
cnt++;
}
} else {
JaWEAction ja = comp.getSettings().getAction(act[i]);
if (ja != null) {
menu.add(createMenuItem(ja, comp, addBCListener));
cnt++;
}
}
}
if (cnt>0) {
return menu;
}
return null;
}
protected static JMenu getExternalMenu(String className, String settingsClassName) {
try {
Constructor sc = Class.forName(settingsClassName).getConstructor(new Class[] {});
JaWEComponentSettings settings = (JaWEComponentSettings) sc.newInstance(new Object[0]);
Constructor c = Class.forName(className).getConstructor(new Class[] {
JaWEComponentSettings.class
});
JaWEComponent jc = (JaWEComponent) c.newInstance(new Object[] {
settings
});
return (JMenu) (jc.getView());
} catch (Throwable thr) {
}
return null;
}
public static JMenuItem createMenuItem(JaWEAction ja,
JaWEComponent comp,
boolean addBCListener) {
Action a = ja.getAction();
String aname = null;
if (a != null) {
aname = (String) a.getValue(Action.NAME);
}
String depName = ja.getLangDepName();
if (aname == null) {
aname = depName;
}
if (depName == null) {
depName = aname;
}
String label = comp.getSettings().getLanguageDependentString(depName
+ LABEL_POSTFIX);
if (label == null) {
label = aname;
}
JMenuItem mi = new JMenuItem(label);
mi.setName(aname);
ImageIcon ai = ja.getIcon();
if (ai != null) {
mi.setHorizontalTextPosition(SwingConstants.RIGHT);
mi.setIcon(ai);
}
BarFactory.setAccelerator(mi, comp.getSettings()
.getLanguageDependentString(depName + ACCELERATION_POSTFIX));
BarFactory.setMnemonic(mi, comp.getSettings()
.getLanguageDependentString(depName + MNEMONIC_POSTFIX));
mi.setActionCommand(aname);
if (a != null) {
mi.addActionListener(a);
if (addBCListener) {
a.addPropertyChangeListener(new ButtonPropertyChangedListener(mi));
}
mi.setEnabled(a.isEnabled());
} else {
mi.setEnabled(false);
}
return mi;
}
public static void setMnemonic(JMenuItem mi, String mnemonic) {
if (mnemonic != null && mnemonic.length() > 0) {
mi.setMnemonic(mnemonic.toCharArray()[0]);
}
}
public static void setAccelerator(JMenuItem mi, String accel) {
if (accel != null) {
try {
int mask = 0;
if (accel.startsWith(CTRL_PREFIX)) {
mask += ActionEvent.CTRL_MASK;
accel = accel.substring(CTRL_PREFIX.length() + 1);
}
if (accel.startsWith(SHIFT_PREFIX)) {
mask += ActionEvent.SHIFT_MASK;
accel = accel.substring(SHIFT_PREFIX.length() + 1);
}
if (accel.startsWith(ALT_PREFIX)) {
mask += ActionEvent.ALT_MASK;
accel = accel.substring(ALT_PREFIX.length() + 1);
}
int key = KeyEvent.class.getField("VK_" + accel).getInt(null);
mi.setAccelerator(KeyStroke.getKeyStroke(key, mask));
} catch (Exception e) {
System.err.println("Error while assigning accelerator !!!");
}
}
}
}