001: /*
002: * $Id: JGraphpadOpenRecentMenu.java,v 1.4 2006/01/31 15:33:11 gaudenz Exp $
003: * Copyright (c) 2001-2005, Gaudenz Alder
004: *
005: * All rights reserved.
006: *
007: * See LICENSE file for license details. If you are unable to locate
008: * this file please contact info (at) jgraph (dot) com.
009: */
010: package com.jgraph.pad.factory;
011:
012: import java.awt.Component;
013: import java.awt.event.ActionEvent;
014: import java.awt.event.ActionListener;
015: import java.io.File;
016: import java.util.Properties;
017:
018: import javax.swing.JMenu;
019: import javax.swing.JMenuItem;
020:
021: import org.w3c.dom.Node;
022:
023: import com.jgraph.JGraphEditor;
024: import com.jgraph.JGraphpad;
025: import com.jgraph.editor.JGraphEditorAction;
026: import com.jgraph.editor.JGraphEditorModel;
027: import com.jgraph.editor.JGraphEditorResources;
028: import com.jgraph.editor.factory.JGraphEditorFactoryMethod;
029: import com.jgraph.pad.dialog.JGraphpadDialogs;
030:
031: /**
032: * Menu to open the files stored under {@link JGraphpad#KEY_RECENTFILES} in the
033: * editor settings. This implementation is updated once on application start. It
034: * requires its list of entries in the settings to be updated by the respective
035: * file actions, namely open and save.
036: */
037: public class JGraphpadOpenRecentMenu extends JGraphEditorFactoryMethod {
038:
039: /**
040: * Defines the default name for factory methods of this kind.
041: */
042: public static String NAME = "createOpenRecentMenu";
043:
044: /**
045: * Specifies the maximum length of the filename to show. Default is 30.
046: */
047: public static int MAX_DISPLAYLENGTH = 30;
048:
049: /**
050: * Specifies the resource key for the menu label. Default is
051: * <code>openRecentMenu.label</code>.
052: */
053: public static String KEY_MENULABEL = "openRecentMenu.label";
054:
055: /**
056: * References the enclosing editor.
057: */
058: protected JGraphEditor editor;
059:
060: /**
061: * Constructs a new factory method for the specified enclosing editor using
062: * {@link #NAME}.
063: *
064: * @param editor
065: * The editor that contains the factory method.
066: */
067: public JGraphpadOpenRecentMenu(JGraphEditor editor) {
068: super (NAME);
069: this .editor = editor;
070: }
071:
072: /**
073: * Constructs a new menu using the entries in the recent files list. Adds an
074: * action listener to each entry that invokes
075: * {@link JGraphEditorModel#addFile(String)} with the respective filename.
076: * The configuration parameter is currently ignored.
077: *
078: * @param configuration
079: * The configuration to configure the menu with.
080: */
081: public Component createInstance(Node configuration) {
082: JMenu menu = new JMenu(JGraphEditorResources
083: .getString(KEY_MENULABEL));
084: Properties props = editor.getSettings().getProperties(
085: JGraphpad.NAME_USERSETTINGS);
086: int i = 0;
087: if (props != null) {
088:
089: // Finds all entries in the list by appending an incrementing
090: // value to the resource key. If no value is found the end
091: // of the list is assumed.
092: String tmp = props.getProperty(JGraphpad.KEY_RECENTFILES
093: + i++);
094: while (tmp != null) {
095: final String filename = tmp;
096: if (JGraphEditor.isURL(filename)
097: || new File(tmp).canRead()) {
098: int len = tmp.length();
099: if (len > MAX_DISPLAYLENGTH)
100: tmp = "..."
101: + tmp.substring(
102: len - MAX_DISPLAYLENGTH, len);
103:
104: // Creates a menu item using the short name as a label
105: // and adds an action listener that opens the file.
106: JMenuItem item = new JMenuItem(tmp);
107: item.addActionListener(new ActionListener() {
108: public void actionPerformed(ActionEvent e) {
109: try {
110: editor.getModel().addFile(filename);
111: } catch (Exception ex) {
112: // ex.printStackTrace();
113: JGraphpadDialogs
114: .getSharedInstance()
115: .errorDialog(
116: JGraphEditorAction
117: .getPermanentFocusOwner(),
118: ex.getMessage());
119: }
120: }
121: });
122: menu.add(item);
123: }
124: tmp = props
125: .getProperty(JGraphpad.KEY_RECENTFILES + i++);
126: }
127: }
128: return menu;
129: }
130:
131: }
|