|
What this is
Other links
The source code/* * ActionSet.java - A set of actions * :tabSize=8:indentSize=8:noTabs=false: * :folding=explicit:collapseFolds=1: * * Copyright (C) 2001, 2003 Slava Pestov * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package org.gjt.sp.jedit; import com.microstar.xml.*; import java.io.*; import java.net.URL; import java.util.*; import org.gjt.sp.jedit.gui.InputHandler; import org.gjt.sp.util.Log; /** * A set of actions, either loaded from an XML file, or constructed at runtime * by a plugin.
<?xml version="1.0"?> *<!DOCTYPE ACTIONS SYSTEM "actions.dtd"> *<ACTIONS> * <ACTION NAME="some-action"> * <CODE> * // BeanShell code evaluated when the action is invoked * </CODE> * </ACTION> * <ACTION NAME="some-toggle-action"> * <CODE> * // BeanShell code evaluated when the action is invoked * </CODE> * <IS_SELECTED> * // BeanShell code that should evaluate to true or false * </IS_SELECTED> * </ACTION> *</ACTIONS>* * The following elements are valid: * *
name.label containing
* the action's menu item label.
*
* View actions* * Actions defined inactions.xml can be added to the view's
* Plugins menu; see {@link EditPlugin}.
* The action code may use any standard predefined
* BeanShell variable; see {@link BeanShell}.
*
* File system browser actions* * Actions defined inactions.xml can be added to the file
* system browser's Plugins menu; see {@link EditPlugin}.
* The action code may use any standard predefined
* BeanShell variable, in addition to a variable browser which
* contains a reference to the current
* {@link org.gjt.sp.jedit.browser.VFSBrowser} instance.
*
* File system browser actions should not define
* Custom action sets* * Call {@link jEdit#addActionSet(ActionSet)} to add a custom action set to * jEdit's action context. You must also call {@link #initKeyBindings()} for new * action sets. Don't forget to call {@link jEdit#removeActionSet(ActionSet)} * before your plugin is unloaded, too. * * @see jEdit#getActionContext() * @see org.gjt.sp.jedit.browser.VFSBrowser#getActionContext() * @see ActionContext#getActionNames() * @see ActionContext#getAction(String) * @see jEdit#addActionSet(ActionSet) * @see jEdit#removeActionSet(ActionSet) * @see PluginJAR#getActionSet() * @see BeanShell * @see View * * @author Slava Pestov * @author John Gellene (API documentation) * @version $Id: ActionSet.java,v 1.31 2004/07/12 19:25:07 spestov Exp $ * @since jEdit 4.0pre1 */ public class ActionSet { //{{{ ActionSet constructor /** * Creates a new action set. * @since jEdit 4.0pre1 */ public ActionSet() { actions = new Hashtable(); loaded = true; label = "
*
* Deferred loading: this will load the action set if necessary.
*
* @param name The action name
* @since jEdit 4.0pre1
*/
public EditAction getAction(String name)
{
Object obj = actions.get(name);
if(obj == placeholder)
{
load();
obj = actions.get(name);
if(obj == placeholder)
{
Log.log(Log.WARNING,this,"Outdated cache");
obj = null;
}
}
return (EditAction)obj;
} //}}}
//{{{ getActionCount() method
/**
* Returns the number of actions in the set.
* @since jEdit 4.0pre1
*/
public int getActionCount()
{
return actions.size();
} //}}}
//{{{ getActionNames() method
/**
* Returns an array of all action names in this action set.
* @since jEdit 4.2pre1
*/
public String[] getActionNames()
{
String[] retVal = new String[actions.size()];
Enumeration e = actions.keys();
int i = 0;
while(e.hasMoreElements())
{
retVal[i++] = (String)e.nextElement();
}
return retVal;
} //}}}
//{{{ getCacheableActionNames() method
/**
* Returns an array of all action names in this action set that should
* be cached; namely, * * Deferred loading: this will load the action set if necessary. * * @since jEdit 4.0pre1 */ public EditAction[] getActions() { load(); EditAction[] retVal = new EditAction[actions.size()]; Enumeration e = actions.elements(); int i = 0; while(e.hasMoreElements()) { retVal[i++] = (EditAction)e.nextElement(); } return retVal; } //}}} //{{{ contains() method /** * Returns if this action set contains the specified action. * @param action The action * @since jEdit 4.2pre1 */ public boolean contains(String action) { return actions.containsKey(action); } //}}} //{{{ size() method /** * Returns the number of actions in this action set. * @since jEdit 4.2pre2 */ public int size() { return actions.size(); } //}}} //{{{ toString() method public String toString() { return label; } //}}} //{{{ initKeyBindings() method /** * Initializes the action set's key bindings. * jEdit calls this method for all registered action sets when the * user changes key bindings in the Global Options dialog box. * * Note if your plugin adds a custom action set to jEdit's collection, * it must also call this method on the action set after adding it. * * @since jEdit 4.2pre1 */ public void initKeyBindings() { InputHandler inputHandler = jEdit.getInputHandler(); Iterator iter = actions.entrySet().iterator(); while(iter.hasNext()) { Map.Entry entry = (Map.Entry)iter.next(); String name = (String)entry.getKey(); String shortcut1 = jEdit.getProperty(name + ".shortcut"); if(shortcut1 != null) inputHandler.addKeyBinding(shortcut1,name); String shortcut2 = jEdit.getProperty(name + ".shortcut2"); if(shortcut2 != null) inputHandler.addKeyBinding(shortcut2,name); } } //}}} //{{{ load() method /** * Forces the action set to be loaded. Plugins and macros should not * call this method. * @since jEdit 4.2pre1 */ public void load() { if(loaded) return; loaded = true; //actions.clear(); Reader stream = null; try { Log.log(Log.DEBUG,this,"Loading actions from " + uri); ActionListHandler ah = new ActionListHandler(uri.toString(),this); stream = new BufferedReader(new InputStreamReader( uri.openStream())); XmlParser parser = new XmlParser(); parser.setHandler(ah); parser.parse(null, null, stream); } catch(XmlException xe) { int line = xe.getLine(); String message = xe.getMessage(); Log.log(Log.ERROR,this,uri + ":" + line + ": " + message); } catch(Exception e) { Log.log(Log.ERROR,uri,e); } finally { try { if(stream != null) stream.close(); } catch(IOException io) { Log.log(Log.ERROR,this,io); } } } //}}} //{{{ Package-private members ActionContext context; //{{{ getActionNames() method void getActionNames(List vec) { Enumeration e = actions.keys(); while(e.hasMoreElements()) vec.add(e.nextElement()); } //}}} //}}} //{{{ Private members private String label; private Hashtable actions; private PluginJAR plugin; private URL uri; private boolean loaded; private static final Object placeholder = new Object(); //}}} } |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.