/*
* Copyright (C) 2006, 2011 IsmAvatar <IsmAvatar@gmail.com>
* Copyright (C) 2007 Quadduc <quadduc@gmail.com>
* Copyrigth (C) 2013 Robert B. Colton
*
* This file is part of LateralGM.
* LateralGM is free software and comes with ABSOLUTELY NO WARRANTY.
* See LICENSE for details.
*/
package org.lateralgm.components;
import java.io.File;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.Icon;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import org.lateralgm.components.impl.ResNode;
import org.lateralgm.main.LGM;
import org.lateralgm.main.Listener;
import org.lateralgm.main.PrefsStore;
import org.lateralgm.messages.Messages;
import org.lateralgm.resources.InstantiableResource;
import org.lateralgm.resources.Resource;
public class GmMenuBar extends JMenuBar
{
private static final long serialVersionUID = 1L;
private List<JMenuItem> recentFiles = new ArrayList<JMenuItem>();
private GmMenu recentMenu;
public static final void setTextAndAlt(JMenuItem item, String input)
{
Matcher m = Pattern.compile("\t+([^\\s])$").matcher(input); //$NON-NLS-1$
if (m.find())
{
int alt = m.group(1).toUpperCase(Locale.ENGLISH).charAt(0);
item.setMnemonic(alt);
item.setText(input.substring(0,m.start()));
}
else
{
item.setMnemonic(-1);
item.setText(input);
}
}
public void setRecentMenuEnabled(boolean enabled)
{
recentMenu.setEnabled(enabled);
if (!enabled)
{
recentMenu.removeAll();
}
}
public void updateRecentFiles()
{
List<String> recentList = PrefsStore.getRecentFiles();
if (recentList.size() > 0)
{
setRecentMenuEnabled(true);
}
else
{
setRecentMenuEnabled(false);
return;
}
recentMenu.removeAll();
recentFiles.clear();
for (String recentStr : recentList)
{
try
{
URI uri = new URI(recentStr);
JMenuItem item;
String number = Integer.toString(recentFiles.size() + 1);
try
{
File file = new File(uri).getAbsoluteFile();
item = new JMenuItem(String.format("%s %s [%s]",number,file.getName(),file.getParent()),
number.codePointAt(number.length() - 1));
}
catch (IllegalArgumentException e)
{
item = new JMenuItem(String.format("%s %s",number,uri),number.codePointAt(number.length() - 1));
}
item.setActionCommand("GmMenuBar.OPENRECENT " + recentStr); //$NON-NLS-1$
item.addActionListener(Listener.getInstance());
recentMenu.insert(item,recentFiles.size());
recentFiles.add(item);
}
catch (URISyntaxException e)
{
LGM.showDefaultExceptionHandler(e);
}
}
recentMenu.addSeparator();
recentMenu.addItem("GmMenuBar.CLEARRECENT");
}
protected static final Map<Class<? extends Resource<?,?>>,Character> MNEMONICS;
static
{
MNEMONICS = new HashMap<Class<? extends Resource<?,?>>,Character>();
for (Entry<String,Class<? extends Resource<?,?>>> k : Resource.kindsByName3.entrySet())
MNEMONICS.put(k.getValue(),
Messages.getString("GmMenuBar.MNEMONIC_" + k.getKey()).toUpperCase().charAt(0)); //$NON-NLS-1$
}
public GmMenuBar()
{
GmMenu menu = new GmMenu(Messages.getString("GmMenuBar.MENU_FILE")); //$NON-NLS-1$
add(menu);
menu.addItem("GmMenuBar.NEW"); //$NON-NLS-1$
menu.addItem("GmMenuBar.OPEN"); //$NON-NLS-1$
recentMenu = (GmMenu) menu.addMenu("GmMenuBar.RECENTFILES");
menu.addItem("GmMenuBar.SAVE"); //$NON-NLS-1$
menu.addItem("GmMenuBar.SAVEAS"); //$NON-NLS-1$
menu.addSeparator();
// JCheckBoxMenuItem check = new JCheckBoxMenuItem();
// setTextAndAlt(check,Messages.getString("GmMenuBar.ADVANCED")); //$NON-NLS-1$
// menu.add(check);
menu.addItem("GmMenuBar.PREFERENCES"); //$NON-NLS-1$
menu.addSeparator();
menu.addItem("GmMenuBar.EXIT"); //$NON-NLS-1$
updateRecentFiles();
menu = new GmMenu(Messages.getString("GmMenuBar.MENU_EDIT")); //$NON-NLS-1$
add(menu);
GmMenu subIns = new GmMenu(Messages.getString("GmMenuBar.MENU_INSERT")); //$NON-NLS-1$
menu.add(subIns);
subIns.addItem("GmMenuBar.INSERT_GROUP"); //$NON-NLS-1$
subIns.addSeparator();
GmMenu subAdd = new GmMenu(Messages.getString("GmMenuBar.MENU_ADD")); //$NON-NLS-1$
menu.add(subAdd);
subAdd.addItem("GmMenuBar.ADD_GROUP"); //$NON-NLS-1$
subAdd.addSeparator();
for (final Class<? extends Resource<?,?>> k : Resource.kinds)
if (InstantiableResource.class.isAssignableFrom(k))
{
String nodeName = Resource.kindNames.get(k);
// subIns.addItem("GmMenuBar.INSERT_" + name3); //$NON-NLS-1$
// subAdd.addItem("GmMenuBar.ADD_" + name3); //$NON-NLS-1$
Icon icon = ResNode.ICON.get(k);
int mnemonic = MNEMONICS.get(k);
String insNodeName = Messages.format("GmMenuBar.INSERT",nodeName); //$NON-NLS-1$
String addNodeName = Messages.format("GmMenuBar.ADD",nodeName); //$NON-NLS-1$
JMenuItem item = new JMenuItem(insNodeName,icon);
if (mnemonic != '!') item.setMnemonic(mnemonic);
item.addActionListener(new Listener.ResourceAdder(true,k));
subIns.add(item);
item = new JMenuItem(addNodeName,icon);
if (mnemonic != '!') item.setMnemonic(mnemonic);
item.addActionListener(new Listener.ResourceAdder(false,k));
subAdd.add(item);
}
menu.addSeparator();
menu.addItem("GmMenuBar.RENAME"); //$NON-NLS-1$
menu.addItem("GmMenuBar.DELETE"); //$NON-NLS-1$
menu.addItem("GmMenuBar.DUPLICATE"); //$NON-NLS-1$
menu.addSeparator();
menu.addItem("GmMenuBar.PROPERTIES"); //$NON-NLS-1$
menu = new GmMenu(Messages.getString("GmMenuBar.MENU_RESOURCES")); //$NON-NLS-1$
add(menu);
menu.addItem("GmMenuBar.PACKAGE"); //$NON-NLS-1$
menu.addItem("GmMenuBar.DEFRAGIDS"); //$NON-NLS-1$
menu.addItem("GmMenuBar.VERIFYNAMES"); //$NON-NLS-1$
menu.addItem("GmMenuBar.SYNTAXCHECK"); //$NON-NLS-1$
menu.addSeparator();
menu.addItem("GmMenuBar.FIND"); //$NON-NLS-1$
menu.addItem("GmMenuBar.ANNOTATE"); //$NON-NLS-1$
menu.addSeparator();
menu.addItem("GmMenuBar.EXPAND"); //$NON-NLS-1$
menu.addItem("GmMenuBar.COLLAPSE"); //$NON-NLS-1$
add(LGM.mdi.getMenu());
menu = new GmMenu(Messages.getString("GmMenuBar.MENU_HELP")); //$NON-NLS-1$
add(menu);
menu.addItem("GmMenuBar.DOCUMENTATION"); //$NON-NLS-1$
menu.addSeparator();
menu.addItem("GmMenuBar.WEBSITE"); //$NON-NLS-1$
menu.addItem("GmMenuBar.COMMUNITY"); //$NON-NLS-1$
menu.addItem("GmMenuBar.ISSUE"); //$NON-NLS-1$
menu.addSeparator();
menu.addItem("GmMenuBar.EXPLORELATERALGM"); //$NON-NLS-1$
menu.addItem("GmMenuBar.EXPLOREPROJECT"); //$NON-NLS-1$
menu.addSeparator();
menu.addItem("GmMenuBar.ABOUT"); //$NON-NLS-1$
}
}