Thread: [Japi-cvs] SF.net SVN: japi: [187] libs/swing-action/trunk
Status: Beta
Brought to you by:
christianhujer
From: <chr...@us...> - 2006-10-14 12:49:47
|
Revision: 187 http://svn.sourceforge.net/japi/?rev=187&view=rev Author: christianhujer Date: 2006-10-14 05:49:23 -0700 (Sat, 14 Oct 2006) Log Message: ----------- Copied action classes from historic to swing-action subproject. Added Paths: ----------- libs/swing-action/trunk/src/ libs/swing-action/trunk/src/net/ libs/swing-action/trunk/src/net/sf/ libs/swing-action/trunk/src/net/sf/japi/ libs/swing-action/trunk/src/net/sf/japi/swing/ libs/swing-action/trunk/src/net/sf/japi/swing/ActionFactory.java libs/swing-action/trunk/src/net/sf/japi/swing/ActionMethod.java libs/swing-action/trunk/src/net/sf/japi/swing/ActionProvider.java libs/swing-action/trunk/src/net/sf/japi/swing/DisposeAction.java libs/swing-action/trunk/src/net/sf/japi/swing/DummyAction.java libs/swing-action/trunk/src/net/sf/japi/swing/NamedActionMap.java libs/swing-action/trunk/src/net/sf/japi/swing/ReflectionAction.java libs/swing-action/trunk/src/net/sf/japi/swing/ToggleAction.java Copied: libs/swing-action/trunk/src/net/sf/japi/swing/ActionFactory.java (from rev 181, historic/trunk/src/app/net/sf/japi/swing/ActionFactory.java) =================================================================== --- libs/swing-action/trunk/src/net/sf/japi/swing/ActionFactory.java (rev 0) +++ libs/swing-action/trunk/src/net/sf/japi/swing/ActionFactory.java 2006-10-14 12:49:23 UTC (rev 187) @@ -0,0 +1,1099 @@ +/* JAPI - (Yet another (hopefully) useful) Java API + * + * Copyright (C) 2004-2006 Christian Hujer + * + * 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 (at your option) 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 net.sf.japi.swing; + +import java.awt.Component; +import java.awt.event.ActionEvent; +import java.lang.reflect.Field; +import java.text.MessageFormat; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.MissingResourceException; +import java.util.ResourceBundle; +import static java.util.ResourceBundle.getBundle; +import java.util.WeakHashMap; +import java.util.ArrayList; +import java.util.prefs.Preferences; +import static java.util.prefs.Preferences.userNodeForPackage; +import javax.swing.AbstractAction; +import javax.swing.Action; +import static javax.swing.Action.ACCELERATOR_KEY; +import static javax.swing.Action.LONG_DESCRIPTION; +import static javax.swing.Action.MNEMONIC_KEY; +import static javax.swing.Action.NAME; +import static javax.swing.Action.SHORT_DESCRIPTION; +import static javax.swing.Action.SMALL_ICON; +import javax.swing.ActionMap; +import javax.swing.Icon; +import javax.swing.JCheckBox; +import javax.swing.JLabel; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JToolBar; +import javax.swing.JPopupMenu; +import static javax.swing.KeyStroke.getKeyStroke; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import static net.sf.japi.swing.IconManager.getDefaultIconManager; +import static net.sf.japi.swing.ReflectionAction.REFLECTION_MESSAGE_PROVIDER; +import static net.sf.japi.swing.ReflectionAction.REFLECTION_TARGET; +import static net.sf.japi.swing.ToggleAction.REFLECTION_PROPERTY_NAME; + +/** Class for creating and initializing {@link Action}s that are localized, user configurable and may invoke their final methods using Reflection; + * also handles extremely much useful stuff for i18n/l10n. + * It is meant as a general service for creating Action objects that have some comfort for the programmer in several aspects: + * <ul> + * <li>Allow zero or more ResourceBundles to be used when creating Actions</li> + * <li>Allow zero or more UserPreferences to be used when creating Actions</li> + * <li>Manage an ActionMap to which created Actions are automatically added</li> + * </ul> + * You may choose to use one or more ActionFactories, depending on the size of your application. + * You may use to spread Action configuration information accross one or more ResourceBundles and one or more Preferences, as you wish. + * When looking for values, the Preferences are queried first, in addition order, after that the ResourceBundles, again in addition order, until + * a value was found. The behaviour when no value was found is undefined. + * <h3>Usage</h3> + * The recommended usage is to + * <ol> + * <li> + * create and initialize an ActionFactory similar as the following example code, put it somewhere at the start of your program: + * <pre> + * ActionFactory myActionFactory = ActionFactory.getFactory("MyApplication"); + * myActionFactory.addBundle("com.mycompany.mypackage.myresource"); // not always required + * myActionFactory.addPref(MyClass.class); + * </pre> + * </li> + * <li> + * then use the ActionFactory from anywhere within the application like this: + * <pre> + * ActionFactory myActionFactory = ActionFactory.getFactory("MyApplication"); + * Action myAction = myActionFactory.createAction("load", this); + * </pre> + * </li> + * </ol> + * <p> + * All actions created or initialized by an instance of this class are optionally put into that instance's {@link ActionMap}. + * If they are stored, you can use that map for later retrieval. + * </p> + * <h4>Usage Notes: Factory Name</h4> + * <ul> + * <li> + * The factory name is used to try to load a resource bundle when a bundle is created. + * The factory name is used as package name for the bundle, the bundle name itself is "action". + * Example: When calling <code>ActionFactory.getFactory("net.sf.japi.swing");</code> for the first time, it is tried to load a + * {@link ResourceBundle} named <code>net.sf.japi.swing.actions</code> for that <code>ActionFactory</code>. + * This automatism has been implemented to save you from the need of initializing an ActionFactory before use. + * </li> + * </ul> + * <h4>Usage Notes: Action Key / Action Name</h4> + * The key you supply as first argument of {@link #createAction(boolean, String, Object)} determines several things: + * <ul> + * <li>The base name for the different keys in the preferences / resource bundle and other known Action Keys: + * <table border="1"> + * <tr><th>What</th><th>Preferences / Bundle key</th><th>Action key if stored in an action</th></tr> + * <tr><td>An (somewhat unique) ID</td><td>(<var>basename</var> itself)</td><td>{@link #ACTION_ID}</td></tr> + * <tr><td>The icon</td><td><code><var>basename</var> + ".icon"</code></td><td>{@link Action#SMALL_ICON}</td></tr> + * <tr><td>The tooltip help</td><td><code><var>basename</var> + ".shortdescription"</code></td><td>{@link Action#SHORT_DESCRIPTION}</td></tr> + * <tr><td>The long help</td><td><code><var>basename</var> + ".longdescription"</code></td><td>{@link Action#LONG_DESCRIPTION}</td></tr> + * <tr><td>The text label</td><td><code><var>basename</var> + ".text"</code></td><td>{@link Action#NAME}</td></tr> + * <tr><td>The keyboard accelerator</td><td><code><var>basename</var> + ".accel"</code></td><td>{@link Action#ACCELERATOR_KEY}</td></tr> + * <tr><td>The alternate keyboard accelerator</td><td><code><var>basename</var> + ".accel2"</code></td><td>{@link #ACCELERATOR_KEY_2}</td></tr> + * <tr><td>The mnemonic</td><td><code><var>basename</var> + ".mnemonic"</code></td><td>{@link Action#MNEMONIC_KEY}</td></tr> + * <tr><td>The method name</td><td></td><td>{@link ReflectionAction#REFLECTION_METHOD_NAME}</td></tr> + * <tr><td>The method</td><td></td><td>{@link ReflectionAction#REFLECTION_METHOD}</td></tr> + * <tr><td>The boolean property name</td><td></td><td>{@link ToggleAction#REFLECTION_PROPERTY_NAME}</td></tr> + * <tr><td>The target instance</td><td></td><td>{@link ReflectionAction#REFLECTION_TARGET}</td></tr> + * <tr><td>Exception handler dialogs</td><td><code><var>basename</var> + ".exception." + <var>exception class name</var> + ...</code><br/>The message can be formatted with 1 parameter that will be the localized message of the thrown exception.</td><td>n/a</td></tr> + * </table> + * </li> + * </ul> + * <p>Some methods are not related to actions, yet take base keys:</p> + * <ul> + * <li>The methods for dialogs, e.g. {@link #showMessageDialog(Component, String, Object...)}: + * <table border="1"> + * <tr><th>What</th><th>Preferences / Bundle key</th></tr> + * <tr><td>Dialog title</td><td><code><var>basename</var> + ".title"</code></td></tr> + * <tr><td>Dialog message</td><td><code><var>basename</var> + ".message"</code></td></tr> + * <tr><td>Dialog messagetype </td><td><code><var>basename</var> + ".messagetype"</code><br/>The message type should be one of the message types defined in {@link JOptionPane}, e.g. {@link JOptionPane#PLAIN_MESSAGE}.</td></tr> + * </table> + * </li> + * </ul> + * <h4>Final Notes</h4> + * <ul> + * <li> + * If by having read all this you think it might often be a good idea to use a package name as a factory name: this is completely right and the + * most common way of using an ActionFactory. + * </li> + * <li> + * If you think you're too lazy to hold your own ActionFactory reference and instead more often call {@link #getFactory(String)}, just go ahead + * and do so. + * Looking up created ActionFactories is extremely fast, and of course they are initialized exactly once, not more. + * </li> + * </ul> + * @see AbstractAction + * @see Action + * @see Preferences + * @see ResourceBundle + * @todo think about toolbar interaction + * @todo think about toolbar configuration + * @todo eventually rename this ActionBuilder and provide an ActionBuilderFactory. + * @todo whether a dialog is a onetime dialog should be a property and user configurable + * @author <a href="mailto:ch...@ri...">Christian Hujer</a> + */ +public final class ActionFactory { + + /** The key used for storing a somewhat unique id for this Action. */ + @NotNull public static final String ACTION_ID = "ActionID"; + + /** The key used for storing an alternative accelerator for this Action. + * Currently unused. + */ + @NotNull public static final String ACCELERATOR_KEY_2 = "AcceleratorKey2"; + + /** The ActionFactories. */ + @NotNull private static final Map<String, ActionFactory> FACTORIES = new WeakHashMap<String, ActionFactory>(); + + /** The parent ActionFactories. */ + @NotNull private final List<ActionFactory> parents = new LinkedList<ActionFactory>(); + + /** The ResourceBundles to look for. + * Type: ResourceBundle + */ + @NotNull private final List<ResourceBundle> bundles = new LinkedList<ResourceBundle>(); + + /** The Preferences to look for. + * Type: Preferences + */ + @NotNull private final List<Preferences> prefs = new LinkedList<Preferences>(); + + /** The ActionMap to which created Actions are automatically added. */ + @NotNull private final ActionMap actionMap = new NamedActionMap(); + + private List<ActionProvider> actionProviders = new ArrayList<ActionProvider>(); + + /** Get an ActionFactory. + * If there is no ActionFactory with name <var>key</var>, a new ActionFactory is created and stored. + * Future invocations of this method will constantly return that ActionFactory unless the key is garbage collected. + * If you must prevent the key from being garbage collected (and with it the ActionFactory), you may internalize the key ({@link String#intern()}). + * A good name for a key is the application or package name. + * The <code><var>key</var></code> may be a package name, in which case it is tried to load a {@link ResourceBundle} named "action" from that + * package and add it ({@link #addBundle(ResourceBundle)}); nothing special happens if that fails. + * @param key name of ActionFactory (which even may be <code>null</code> if you are too lazy to invent a key) + * @return ActionFactory for given key. The factory is created in case it didn't already exist. + */ + @NotNull public static ActionFactory getFactory(@Nullable final String key) { + ActionFactory factory = FACTORIES.get(key); + if (factory == null) { + factory = new ActionFactory(); + FACTORIES.put(key, factory); + try { + factory.addBundle(key + ".action"); + } catch (final MissingResourceException e) { + /* ignore */ + } + // eventually initialize factory here + } + return factory; + } + + /** Add a ResourceBundle to the list of used bundles. + * @param baseName the base name of the resource bundle, a fully qualified class name + * @see ResourceBundle#getBundle(String) + */ + public void addBundle(@NotNull final String baseName) { + //noinspection ConstantConditions + if (baseName == null) { + throw new NullPointerException("null bundle name not allowed"); + } + @NotNull final ResourceBundle newBundle = getBundle(baseName); + addBundle(newBundle); + @Nullable final String additionalBundles = newBundle.getString("ActionFactory.additionalBundles"); + if (additionalBundles != null) { + for (final String additionalBundle : additionalBundles.split("\\s+")) { + addBundle(additionalBundle); + } + } + } + + /** Method to find the JMenuItem for a specific Action. + * @param menuBar JMenuBar to search + * @param action Action to find JMenuItem for + * @return JMenuItem for action or <code>null</code> if none found + * @throws NullPointerException if <var>action</var> or <var>menuBar</var> is <code>null</code> + */ + @Nullable public static JMenuItem find(@NotNull final JMenuBar menuBar, @NotNull final Action action) { + //noinspection ConstantConditions + if (menuBar == null) { + throw new NullPointerException("null JMenuBar not allowed"); + } + //noinspection ConstantConditions + if (action == null) { + throw new NullPointerException("null Action not allowed"); + } + for (int i = 0; i < menuBar.getMenuCount(); i++) { + final JMenu menu = menuBar.getMenu(i); + if (menu.getAction() == action) { + return menu; + } else { + final JMenuItem ret = find(menu, action); + if (ret != null) { + return ret; + } + } + } + return null; + } + + /** Method to find the JMenuItem for a specific Action. + * @param menu JMenu to search + * @param action Action to find JMenuItem for + * @return JMenuItem for action or <code>null</code> if none found + * @throws NullPointerException if <var>menu</var> or <var>action</var> is <code>null</code> + */ + @Nullable public static JMenuItem find(@NotNull final JMenu menu, @NotNull final Action action) { + for (int i = 0; i < menu.getItemCount(); i++) { + final JMenuItem item = menu.getItem(i); + if (item == null) { + // Ignore Separators + } else if (item.getAction() == action) { + return item; + } else if (item instanceof JMenu) { + final JMenuItem ret = find((JMenu) item, action); + if (ret != null) { + return ret; + } + } + } + return null; + } + + /** Create an ActionFactory. + * This constructor is private to force users to use the method {@link #getFactory(String)} for recycling ActionFactories and profit of easy + * access to the same ActionFactory from within the whole application without passing around ActionFactory references. + */ + private ActionFactory() { + } + + /** Get the ActionMap. + * @return ActionMap + */ + @NotNull public ActionMap getActionMap() { + return actionMap; + } + + /** Add a ResourceBundle to the list of used bundles. + * @param bundle ResourceBundle to add + * @throws NullPointerException if <code>bundle == null</code> + */ + public void addBundle(@NotNull final ResourceBundle bundle) throws NullPointerException { + //noinspection ConstantConditions + if (bundle == null) { + throw new NullPointerException("null ResourceBundle not allowed"); + } + if (!bundles.contains(bundle)) { + // insert first because new bundles override old bundles + bundles.add(0, bundle); + } + } + + /** Add a parent to the list of used parents. + * @param parent Parent to use if lookups failed in this ActionFactory + * WARNING: Adding a descendents as parents of ancestors or vice versa will result in endless recursion and thus stack overflow! + * @throws NullPointerException if <code>parent == null</code> + */ + public void addParent(@NotNull final ActionFactory parent) throws NullPointerException { + //noinspection ConstantConditions + if (parent == null) { + throw new NullPointerException("null ActionFactory not allowed"); + } + parents.add(parent); + } + + /** Add a Preferences to the list of used preferences. + * @param pref Preferences to add + * @throws NullPointerException if <code>pref == null</code> + */ + public void addPref(@NotNull final Preferences pref) throws NullPointerException { + //noinspection ConstantConditions + if (pref == null) { + throw new NullPointerException("null ResourceBundle not allowed"); + } + if (!prefs.contains(pref)) { + prefs.add(pref); + } + } + + /** Add a Preferences to the list of used preferences. + * @param clazz the class whose package a user preference node is desired + * @see Preferences#userNodeForPackage(Class) + * @throws NullPointerException if <code>clazz == null</code> + */ + public void addPref(@NotNull final Class<?> clazz) { + //noinspection ConstantConditions + if (clazz == null) { + throw new NullPointerException("null Class not allowed"); + } + addPref(userNodeForPackage(clazz)); + } + + /** Creates actions. + * This is a loop variant of {@link #createAction(boolean,String)}. + * The actions created can be retrieved using {@link #getAction(String)} or via the ActionMap returned by {@link #getActionMap()}. + * @param store whether to store the initialized Action in the ActionMap of this ActionFactory + * @param keys Keys of actions to create + * @return Array with created actions + * @throws NullPointerException in case keys is or contains <code>null</code> + */ + public Action[] createActions(final boolean store, @NotNull final String... keys) throws NullPointerException { + final Action[] actions = new Action[keys.length]; + for (int i = 0; i < keys.length; i++) { + actions[i] = createAction(store, keys[i]); + } + return actions; + } + + /** Create an Action. + * The created Action is automatically stored together with all other Actions created by this Factory instance in an ActionMap, which you can + * retreive using {@link #getActionMap()}. + * @param store whether to store the initialized Action in the ActionMap of this ActionFactory + * @param key Key for Action, which is used as basename for access to Preferences and ResourceBundles and as ActionMap key (may not be + * <code>null</code>) + * @return created Action, which is a dummy in the sense that its {@link Action#actionPerformed(ActionEvent)} method does not do anything + * @throws NullPointerException in case <var>key</var> was <code>null</code> + * @see #createAction(boolean,String,Object) + * @see #createToggle(boolean,String,Object) + * @see #initAction(boolean,Action,String) + */ + public Action createAction(final boolean store, @NotNull final String key) throws NullPointerException { + // initAction() checks for null key + return initAction(store, new DummyAction(), key); + } + + /** Initialize an Action. + * This is a convenience method for Action users which want to use the services provided by this {@link ActionFactory} class but need more + * sophisticated Action objects they created on their own. + * So you can simply create an Action and pass it to this Initialization method to fill its data. + * The initialized Action is automatically stored together with all other Actions created by this Factory instance in an ActionMap, which you can + * retreive using {@link #getActionMap()}. + * @param store whether to store the initialized Action in the ActionMap of this ActionFactory + * @param action Action to fill + * @param key Key for Action, which is used as basename for access to Preferences and ResourceBundles and as ActionMap key (may not be <code>null</code>) + * @return the supplied Action object (<var>action</var>) is returned for convenience + * @throws NullPointerException in case <var>key</var> was <code>null</code> + */ + @SuppressWarnings({"NestedAssignment"}) + public Action initAction(final boolean store, @NotNull final Action action, @NotNull final String key) throws NullPointerException { + if (key == null) { throw new NullPointerException("null key for Action initialization not allowed."); } + action.putValue(ACTION_ID, key); + String value; + if ((value = getString(key + ".text" )) != null) { action.putValue(NAME, value); } + if ((value = getString(key + ".shortdescription")) != null) { action.putValue(SHORT_DESCRIPTION, value); } + if ((value = getString(key + ".longdescription" )) != null) { action.putValue(LONG_DESCRIPTION, value); } + if ((value = getString(key + ".accel" )) != null) { action.putValue(ACCELERATOR_KEY, getKeyStroke(value)); } + if ((value = getString(key + ".accel2" )) != null) { action.putValue(ACCELERATOR_KEY_2, getKeyStroke(value)); } + if ((value = getString(key + ".mnemonic" )) != null) { action.putValue(MNEMONIC_KEY, getKeyStroke(value).getKeyCode()); } + if ((value = getString(key + ".icon" )) != null) { + final Icon image = getDefaultIconManager().getIcon(value); + if (image != null) { action.putValue(SMALL_ICON, image); } + } + action.putValue(REFLECTION_MESSAGE_PROVIDER, this); + if (store) { + actionMap.put(key, action); + } + return action; + } + + /** Get a String. + * First looks one pref after another, in their addition order. + * Then looks one bundle after another, in their addition order. + * @param key Key to get String for + * @return the first value found or <code>null</code> if no value could be found + * @throws NullPointerException if <var>key</var> is <code>null</code> + */ + @Nullable public String getString(@NotNull final String key) throws NullPointerException { + if (key == null) { + throw new NullPointerException("null key not allowed"); + } + String value = null; + for (final Preferences pref : prefs) { + value = pref.get(key, value); + if (value != null) { + return value; + } + } + for (final ResourceBundle bundle : bundles) { + try { + value = bundle.getString(key); + return value; + } catch (final MissingResourceException e) { /* ignore */ + } catch (final ClassCastException e) { /* ignore */ + } // ignore exceptions because they don't mean errors just there's no resource, so parents are checked or null is returned. + } + for (final ActionFactory parent : parents) { + value = parent.getString(key); + if (value != null) { + return value; + } + } + return null; + } + + /** Get a String from the preferences, ignoring the resource bundles. + * @param key Key to get String for + * @return the first value found or <code>null</code> if no value could be found + * @throws NullPointerException if <var>key</var> is <code>null</code> + */ + @Nullable public String getStringFromPrefs(@NotNull final String key) throws NullPointerException { + if (key == null) { + throw new NullPointerException("null key not allowed"); + } + String value = null; + for (final Preferences pref : prefs) { + value = pref.get(key, value); + if (value != null) { + return value; + } + } + for (final ActionFactory parent : parents) { + value = parent.getStringFromPrefs(key); + if (value != null) { + return value; + } + } + return null; + } + + /** Get a String from the resource bundles, ignoring the preferences. + * @param key Key to get String for + * @return the first value found or <code>null</code> if no value could be found + * @throws NullPointerException if <var>key</var> is <code>null</code> + */ + @Nullable public String getStringFromBundles(@NotNull final String key) throws NullPointerException { + if (key == null) { + throw new NullPointerException("null key not allowed"); + } + String value; + for (final ResourceBundle bundle : bundles) { + try { + value = bundle.getString(key); + return value; + } catch (final MissingResourceException e) { /* ignore */ + } catch (final ClassCastException e) { /* ignore */ + } // ignore exceptions because they don't mean errors just there's no resource, so parents are checked or null is returned. + } + for (final ActionFactory parent : parents) { + value = parent.getStringFromBundles(key); + if (value != null) { + return value; + } + } + return null; + } + /** Creates actions. + * This is a loop variant of {@link #createAction(boolean,String,Object)}. + * The actions created can be retrieved using {@link #getAction(String)} or via the ActionMap returned by {@link #getActionMap()}. + * @param store whether to store the initialized Action in the ActionMap of this ActionFactory + * @param target Target object + * @param keys Keys of actions to create + * @return Array with created actions + * @throws NullPointerException in case keys is or contains <code>null</code> + */ + public Action[] createActions(final boolean store, final Object target, final String... keys) throws NullPointerException { + final Action[] actions = new Action[keys.length]; + for (int i = 0; i < keys.length; i++) { + actions[i] = createAction(store, keys[i], target); + } + return actions; + } + + /** Create an Action. + * The created Action is automatically stored together with all other Actions created by this Factory instance in an ActionMap, which you can + * retreive using {@link #getActionMap()}. + * The supplied object needs to have a zero argument method named <var>key</var>. + * You may pass <code>null</code> as object, which means that the object the method is invoked on is not defined yet. + * You may safely use the Action, it will not throw any Exceptions upon {@link Action#actionPerformed(ActionEvent)} but simply silently do nothing. + * The desired object can be set later using <code>action.putValue({@link ReflectionAction#REFLECTION_TARGET}, <var>object</var>)</code>. + * <p /> + * Users of this method can assume that the returned object behaves quite like {@link ReflectionAction}. + * Wether or not this method returns an instance of {@link ReflectionAction} should not be relied on. + * @param store whether to store the initialized Action in the ActionMap of this ActionFactory + * @param key Key for Action, which is used as basename for access to Preferences and ResourceBundles, as ActionMap key and as Reflection Method + * name within the supplied object (may not be <code>null</code>) + * @param object Instance to invoke method on if the Action was activated ({@link Action#actionPerformed(ActionEvent)}) + * @return created Action + * @throws NullPointerException in case <var>key</var> was <code>null</code> + * @see #createAction(boolean,String) + * @see #createToggle(boolean,String,Object) + * @see #initAction(boolean,Action,String) + */ + public Action createAction(final boolean store, final String key, final Object object) throws NullPointerException { + if (key == null) { throw new NullPointerException("null key for Action creation not allowed."); } + final Action action = new ReflectionAction(key, object); + initAction(store, action, key); + return action; + } + + /** Method for creating a Menu. + * @param store whether to store the initialized Action in the ActionMap of this ActionFactory + * @param menuKey action key for Menu + * @param keys Action keys for menu items + * @return menu created fro... [truncated message content] |
From: <chr...@us...> - 2007-01-07 18:22:34
|
Revision: 278 http://svn.sourceforge.net/japi/?rev=278&view=rev Author: christianhujer Date: 2007-01-07 10:22:32 -0800 (Sun, 07 Jan 2007) Log Message: ----------- Made swing-action compilable. Added Paths: ----------- libs/swing-action/trunk/build.xml libs/swing-action/trunk/lib/ libs/swing-action/trunk/lib/LICENSE-Pack200Task.jar libs/swing-action/trunk/lib/LICENSE-annotations.jar libs/swing-action/trunk/lib/Pack200Task.jar libs/swing-action/trunk/lib/annotations.jar libs/swing-action/trunk/lib/japi-lib-lang-0.1.jar Property Changed: ---------------- libs/swing-action/trunk/ Property changes on: libs/swing-action/trunk ___________________________________________________________________ Name: svn:ignore + dest dist classes Added: libs/swing-action/trunk/build.xml =================================================================== --- libs/swing-action/trunk/build.xml (rev 0) +++ libs/swing-action/trunk/build.xml 2007-01-07 18:22:32 UTC (rev 278) @@ -0,0 +1,178 @@ +<?xml version="1.0" encoding="utf-8"?> +<project name="japi lib swing-action" default="compile"> + + <property name="module.version" value="0.1" /> + <property name="module.name" value="japi-lib-swing-action" /> + <property name="module.shortname" value="swing-action" /> + <property name="module.title" value="Swing Action" /> + + <taskdef name="pack200" classpath="lib/Pack200Task.jar" classname="com.sun.tools.apache.ant.pack200.Pack200Task" /> + + <target + name = "clean" + description = "Cleans Sandbox" + > + <delete dir="classes" /> + <delete dir="docs" /> + </target> + + <target + name = "compile" + description = "Compiles production classes" + > + <mkdir dir="classes/production/${module.shortname}" /> + <mkdir dir="classes/test/${module.shortname}" /> + <javac + srcdir="src" + destdir="classes/production/${module.shortname}" + encoding="utf-8" + source="1.5" + target="1.5" + > + <classpath> + <fileset dir="lib" includes="*.jar" excludes="LICENSE-*.jar" /> + </classpath> + <exclude name="test/**/*.java" /> + </javac> + <copy + todir="classes/production/${module.shortname}" + > + <fileset dir="src" includes="**/*.properties" excludes="test/**/*.properties" /> + <fileset dir="src" includes="META-INF/services/**" /> + </copy> + </target> + + <target + name = "dist" + description = "Packs distribution archives." + depends = "clean, compile" + > + <!--depends = "clean, compile, doc" + --> + <delete dir="dist" /> + <mkdir dir="dist" /> + <property name="distName" value="dist/${module.name}-${module.version}" /> + <parallel> + <tar tarfile="${distName}.src.tar"> + <tarfileset dir="." prefix="${module.name}-${module.version}"> + <include name="src/**" /> + <include name="build.xml" /> + </tarfileset> + </tar> + <zip destfile="${distName}.src.zip"> + <zipfileset dir="." prefix="${module.name}-${module.version}"> + <include name="src/**" /> + <include name="build.xml" /> + </zipfileset> + </zip> + <jar destfile="${distName}.src.jar"> + <zipfileset dir="." prefix="${module.name}-${module.version}"> + <include name="src/**" /> + <include name="build.xml" /> + </zipfileset> + </jar> + <jar destfile="${distName}.jar"> + <zipfileset dir="classes/production/${module.shortname}"/> + <manifest> + <attribute name="Implementation-Title" value="${module.name}" /> + <attribute name="Implementation-Vendor" value="Christian Hujer + the JAPI Developers" /> + <attribute name="Implementation-Version" value="${module.version}" /> + <attribute name="Implementation-URL" value="http://sourceforge.net/projects/japi/" /> + </manifest> + </jar> + <tar tarfile="${distName}.doc.tar"> + <tarfileset dir="." prefix="${module.name}-${module.version}"> + <include name="docs/**" /> + <include name="build.xml" /> + </tarfileset> + </tar> + <zip destfile="${distName}.doc.zip"> + <zipfileset dir="." prefix="${module.name}-${module.version}"> + <include name="docs/**" /> + <include name="build.xml" /> + </zipfileset> + </zip> + <jar destfile="${distName}.doc.jar"> + <zipfileset dir="." prefix="${module.name}-${module.version}"> + <include name="docs/**" /> + </zipfileset> + </jar> + </parallel> + <parallel> + <gzip src="${distName}.src.tar" destfile="${distName}.src.tar.gz" /> + <bzip2 src="${distName}.src.tar" destfile="${distName}.src.tar.bz2" /> + <gzip src="${distName}.doc.tar" destfile="${distName}.doc.tar.gz" /> + <bzip2 src="${distName}.doc.tar" destfile="${distName}.doc.tar.bz2" /> + <pack200 + src="${distName}.jar" + destfile="${distName}.pack.gz" + gzipoutput="true" + stripdebug="true" + effort="9" + keepfileorder="false" + modificationtime="latest" + deflatehint="false" + /> + </parallel> + <delete file="${distName}.src.tar" /> + <delete file="${distName}.doc.tar" /> + </target> + + <target + name = "doc" + description = "Creates public javadoc documentation." + > + <mkdir dir="docs/api" /> + <!--copy todir="docs/api" file="src/doc/api/public/copyright.html" /> + <copy todir="docs/api" file="src/doc/api/public/.htaccess" /--> + <javadoc + destdir = "docs/api" + access = "protected" + author = "yes" + version = "yes" + locale = "en_US" + use = "yes" + splitindex = "yes" + windowtitle = "JAPI Library ${module.title} ${module.version} API documentation" + doctitle = "JAPI<br />Yet another Java API<br />Library ${module.title} ${module.version} API documentation" + header = "JAPI Library ${module.title} ${module.version}<br />API Documentation" + footer = "JAPI<br />Yet another Java API<br />Library ${module.title} ${module.version} API documentation" + bottom = "<div style=" text-align:center;">© 2005-2006 Christian Hujer. All rights reserved. See <a href="{@docRoot}/copyright.html">copyright</a></div>" + serialwarn = "yes" + charset = "utf-8" + docencoding = "utf-8" + encoding = "utf-8" + source = "1.5" + linksource = "yes" + link = "${user.javadoc.link}" + > + <!-- + overview = "src/overview.html" + --> + <classpath> + <fileset dir="lib" includes="annotations.jar" /> + </classpath> + <sourcepath> + <pathelement path="${user.javadoc.javasrc}" /> + <pathelement path="src" /> + </sourcepath> + <packageset + dir="src" + defaultexcludes="yes" + > + <include name="net/**" /> + </packageset> + <tag enabled="true" name="retval" description="Return Values:" scope="methods" /> + <tag enabled="true" name="pre" description="Preconditions:" scope="methods,constructors" /> + <tag enabled="true" name="post" description="Postconditions:" scope="methods" /> + <tag enabled="true" name="invariant" description="Invariant:" scope="methods,fields" /> + <tag enabled="true" name="note" description="Notes:" /> + <tag enabled="true" name="warning" description="Warnings:" /> + <!--tag enabled="true" name="todo" description="Todo:" /--> + <taglet name="com.sun.tools.doclets.ToDoTaglet" path="" /> + <tag enabled="true" name="fixme" description="Fixme:" /> + <tag enabled="true" name="xxx" description="XXX:" /> + </javadoc> + </target> + +</project> Property changes on: libs/swing-action/trunk/build.xml ___________________________________________________________________ Name: svn:mime-type + text/xml Name: svn:eol-style + LF Added: libs/swing-action/trunk/lib/LICENSE-Pack200Task.jar =================================================================== --- libs/swing-action/trunk/lib/LICENSE-Pack200Task.jar (rev 0) +++ libs/swing-action/trunk/lib/LICENSE-Pack200Task.jar 2007-01-07 18:22:32 UTC (rev 278) @@ -0,0 +1,471 @@ +SUN PUBLIC LICENSE Version 1.0 + +1. Definitions. + + 1.0.1. "Commercial Use" means distribution or otherwise making the + Covered Code available to a third party. + + 1.1. "Contributor" means each entity that creates or contributes to + the creation of Modifications. + + 1.2. "Contributor Version" means the combination of the Original Code, + prior Modifications used by a Contributor, and the Modifications made + by that particular Contributor. + + 1.3. "Covered Code" means the Original Code or Modifications or the + combination of the Original Code and Modifications, in each case + including portions thereof and corresponding documentation released + with the source code. + + 1.4. "Electronic Distribution Mechanism" means a mechanism generally + accepted in the software development community for the electronic + transfer of data. + + 1.5. "Executable" means Covered Code in any form other than Source + Code. + + 1.6. "Initial Developer" means the individual or entity identified as + the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7. "Larger Work" means a work which combines Covered Code or + portions thereof with code not governed by the terms of this License. + + 1.8. "License" means this document. + + 1.8.1. "Licensable" means having the right to grant, to the maximum + extent possible, whether at the time of the initial grant or + subsequently acquired, any and all of the rights conveyed herein. + + 1.9. "Modifications" means any addition to or deletion from the + substance or structure of either the Original Code or any previous + Modifications. When Covered Code is released as a series of files, a + Modification is: + + A. Any addition to or deletion from the contents of a file containing + Original Code or previous Modifications. + + B. Any new file that contains any part of the Original Code or + previous Modifications. + + 1.10. "Original Code" means Source Code of computer software code + which is described in the Source Code notice required by Exhibit A as + Original Code, and which, at the time of its release under this + License is not already Covered Code governed by this License. + + 1.10.1. "Patent Claims" means any patent claim(s), now owned or + hereafter acquired, including without limitation, method, process, and + apparatus claims, in any patent Licensable by grantor. + + 1.11. "Source Code" means the preferred form of the Covered Code for + making modifications to it, including all modules it contains, plus + any associated documentation, interface definition files, scripts used + to control compilation and installation of an Executable, or source + code differential comparisons against either the Original Code or + another well known, available Covered Code of the Contributor's + choice. The Source Code can be in a compressed or archival form, + provided the appropriate decompression or de-archiving software is + widely available for no charge. + + 1.12. "You" (or "Your") means an individual or a legal entity + exercising rights under, and complying with all of the terms of, this + License or a future version of this License issued under Section 6.1. + For legal entities, "You" includes any entity which controls, is + controlled by, or is under common control with You. For purposes of + this definition, "control" means (a) the power, direct or indirect, to + cause the direction or management of such entity, whether by contract + or otherwise, or (b) ownership of more than fifty percent (50%) of the + outstanding shares or beneficial ownership of such entity. + +2. Source Code License. + +2.1 The Initial Developer Grant. + + The Initial Developer hereby grants You a world-wide, royalty-free, + non-exclusive license, subject to third party intellectual property + claims: + + (a) under intellectual property rights (other than patent or + trademark) Licensable by Initial Developer to use, reproduce, modify, + display, perform, sublicense and distribute the Original Code (or + portions thereof) with or without Modifications, and/or as part of a + Larger Work; and + + (b) under Patent Claims infringed by the making, using or selling of + Original Code, to make, have made, use, practice, sell, and offer for + sale, and/or otherwise dispose of the Original Code (or portions + thereof). + + (c) the licenses granted in this Section 2.1(a) and (b) are effective + on the date Initial Developer first distributes Original Code under + the terms of this License. + + (d) Notwithstanding Section 2.1(b) above, no patent license is + granted: 1) for code that You delete from the Original Code; 2) + separate from the Original Code; or 3) for infringements caused by: + i) the modification of the Original Code or ii) the combination of the + Original Code with other software or devices. + +2.2. Contributor Grant. + + Subject to third party intellectual property claims, each Contributor + hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or + trademark) Licensable by Contributor, to use, reproduce, modify, + display, perform, sublicense and distribute the Modifications created + by such Contributor (or portions thereof) either on an unmodified + basis, with other Modifications, as Covered Code and/or as part of a + Larger Work; and + + (b) under Patent Claims infringed by the making, using, or selling of + Modifications made by that Contributor either alone and/or in + combination with its Contributor Version (or portions of such + combination), to make, use, sell, offer for sale, have made, and/or + otherwise dispose of: 1) Modifications made by that Contributor (or + portions thereof); and 2) the combination of Modifications made by + that Contributor with its Contributor Version (or portions of such + combination). + + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective + on the date Contributor first makes Commercial Use of the Covered + Code. + + (d) notwithstanding Section 2.2(b) above, no patent license is + granted: 1) for any code that Contributor has deleted from the + Contributor Version; 2) separate from the Contributor Version; 3) for + infringements caused by: i) third party modifications of Contributor + Version or ii) the combination of Modifications made by that + Contributor with other software (except as part of the Contributor + Version) or other devices; or 4) under Patent Claims infringed by + Covered Code in the absence of Modifications made by that Contributor. + +3. Distribution Obligations. + +3.1. Application of License. + + The Modifications which You create or to which You contribute are + governed by the terms of this License, including without limitation + Section 2.2. The Source Code version of Covered Code may be + distributed only under the terms of this License or a future version + of this License released under Section 6.1, and You must include a + copy of this License with every copy of the Source Code You + distribute. You may not offer or impose any terms on any Source Code + version that alters or restricts the applicable version of this + License or the recipients' rights hereunder. However, You may include + an additional document offering the additional rights described in + Section 3.5. + +3.2. Availability of Source Code. + + Any Modification which You create or to which You contribute must be + made available in Source Code form under the terms of this License + either on the same media as an Executable version or via an accepted + Electronic Distribution Mechanism to anyone to whom you made an + Executable version available; and if made available via Electronic + Distribution Mechanism, must remain available for at least twelve (12) + months after the date it initially became available, or at least six + (6) months after a subsequent version of that particular Modification + has been made available to such recipients. You are responsible for + ensuring that the Source Code version remains available even if the + Electronic Distribution Mechanism is maintained by a third party. + +3.3. Description of Modifications. + + You must cause all Covered Code to which You contribute to contain a + file documenting the changes You made to create that Covered Code and + the date of any change. You must include a prominent statement that + the Modification is derived, directly or indirectly, from Original + Code provided by the Initial Developer and including the name of the + Initial Developer in (a) the Source Code, and (b) in any notice in an + Executable version or related documentation in which You describe the + origin or ownership of the Covered Code. + +3.4. Intellectual Property Matters. + + (a) Third Party Claims. + + If Contributor has knowledge that a license under a third party's + intellectual property rights is required to exercise the rights + granted by such Contributor under Sections 2.1 or 2.2, Contributor + must include a text file with the Source Code distribution titled + "LEGAL'' which describes the claim and the party making the claim in + sufficient detail that a recipient will know whom to contact. If + Contributor obtains such knowledge after the Modification is made + available as described in Section 3.2, Contributor shall promptly + modify the LEGAL file in all copies Contributor makes available + thereafter and shall take other steps (such as notifying appropriate + mailing lists or newsgroups) reasonably calculated to inform those who + received the Covered Code that new knowledge has been obtained. + + (b) Contributor APIs. + + If Contributor's Modifications include an application programming + interface ("API") and Contributor has knowledge of patent licenses + which are reasonably necessary to implement that API, Contributor must + also include this information in the LEGAL file. + + (c) Representations. + + Contributor represents that, except as disclosed pursuant to Section + 3.4(a) above, Contributor believes that Contributor's Modifications + are Contributor's original creation(s) and/or Contributor has + sufficient rights to grant the rights conveyed by this License. + +3.5. Required Notices. + + You must duplicate the notice in Exhibit A in each file of the Source + Code. If it is not possible to put such notice in a particular Source + Code file due to its structure, then You must include such notice in a + location (such as a relevant directory) where a user would be likely + to look for such a notice. If You created one or more Modification(s) + You may add your name as a Contributor to the notice described in + Exhibit A. You must also duplicate this License in any documentation + for the Source Code where You describe recipients' rights or ownership + rights relating to Covered Code. You may choose to offer, and to + charge a fee for, warranty, support, indemnity or liability + obligations to one or more recipients of Covered Code. However, You + may do so only on Your own behalf, and not on behalf of the Initial + Developer or any Contributor. You must make it absolutely clear than + any such warranty, support, indemnity or liability obligation is + offered by You alone, and You hereby agree to indemnify the Initial + Developer and every Contributor for any liability incurred by the + Initial Developer or such Contributor as a result of warranty, + support, indemnity or liability terms You offer. + +3.6. Distribution of Executable Versions. + + You may distribute Covered Code in Executable form only if the + requirements of Section 3.1-3.5 have been met for that Covered Code, + and if You include a notice stating that the Source Code version of + the Covered Code is available under the terms of this License, + including a description of how and where You have fulfilled the + obligations of Section 3.2. The notice must be conspicuously included + in any notice in an Executable version, related documentation or + collateral in which You describe recipients' rights relating to the + Covered Code. You may distribute the Executable version of Covered + Code or ownership rights under a license of Your choice, which may + contain terms different from this License, provided that You are in + compliance with the terms of this License and that the license for the + Executable version does not attempt to limit or alter the recipient's + rights in the Source Code version from the rights set forth in this + License. If You distribute the Executable version under a different + license You must make it absolutely clear that any terms which differ + from this License are offered by You alone, not by the Initial + Developer or any Contributor. You hereby agree to indemnify the + Initial Developer and every Contributor for any liability incurred by + the Initial Developer or such Contributor as a result of any such + terms You offer. + +3.7. Larger Works. + + You may create a Larger Work by combining Covered Code with other code + not governed by the terms of this License and distribute the Larger + Work as a single product. In such a case, You must make sure the + requirements of this License are fulfilled for the Covered Code. + +4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this + License with respect to some or all of the Covered Code due to + statute, judicial order, or regulation then You must: (a) comply with + the terms of this License to the maximum extent possible; and (b) + describe the limitations and the code they affect. Such description + must be included in the LEGAL file described in Section 3.4 and must + be included with all distributions of the Source Code. Except to the + extent prohibited by statute or regulation, such description must be + sufficiently detailed for a recipient of ordinary skill to be able to + understand it. + +5. Application of this License. + + This License applies to code to which the Initial Developer has + attached the notice in Exhibit A and to related Covered Code. + +6. Versions of the License. + +6.1. New Versions. + + Sun Microsystems, Inc. ("Sun") may publish revised and/or new versions + of the License from time to time. Each version will be given a + distinguishing version number. + +6.2. Effect of New Versions. + + Once Covered Code has been published under a particular version of the + License, You may always continue to use it under the terms of that + version. You may also choose to use such Covered Code under the terms + of any subsequent version of the License published by Sun. No one + other than Sun has the right to modify the terms applicable to Covered + Code created under this License. + +6.3. Derivative Works. + + If You create or use a modified version of this License (which you may + only do in order to apply it to code which is not already Covered Code + governed by this License), You must: (a) rename Your license so that + the phrases "Sun," "Sun Public License," or "SPL" or any confusingly + similar phrase do not appear in your license (except to note that your + license differs from this License) and (b) otherwise make it clear + that Your version of the license contains terms which differ from the + Sun Public License. (Filling in the name of the Initial Developer, + Original Code or Contributor in the notice described in Exhibit A + shall not of themselves be deemed to be modifications of this + License.) + +7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS'' BASIS, + WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF + DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. + THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE + IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, + YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE + COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER + OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF + ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +8. TERMINATION. + + 8.1. This License and the rights granted hereunder will terminate + automatically if You fail to comply with terms herein and fail to cure + such breach within 30 days of becoming aware of the breach. All + sublicenses to the Covered Code which are properly granted shall + survive any termination of this License. Provisions which, by their + nature, must remain in effect beyond the termination of this License + shall survive. + + 8.2. If You initiate litigation by asserting a patent infringement + claim (excluding declaratory judgment actions) against Initial Developer + or a Contributor (the Initial Developer or Contributor against whom + You file such action is referred to as "Participant") alleging that: + + (a) such Participant's Contributor Version directly or indirectly + infringes any patent, then any and all rights granted by such + Participant to You under Sections 2.1 and/or 2.2 of this License + shall, upon 60 days notice from Participant terminate prospectively, + unless if within 60 days after receipt of notice You either: (i) + agree in writing to pay Participant a mutually agreeable reasonable + royalty for Your past and future use of Modifications made by such + Participant, or (ii) withdraw Your litigation claim with respect to + the Contributor Version against such Participant. If within 60 days + of notice, a reasonable royalty and payment arrangement are not + mutually agreed upon in writing by the parties or the litigation claim + is not withdrawn, the rights granted by Participant to You under + Sections 2.1 and/or 2.2 automatically terminate at the expiration of + the 60 day notice period specified above. + + (b) any software, hardware, or device, other than such Participant's + Contributor Version, directly or indirectly infringes any patent, then + any rights granted to You by such Participant under Sections 2.1(b) + and 2.2(b) are revoked effective as of the date You first made, used, + sold, distributed, or had made, Modifications made by that + Participant. + + 8.3. If You assert a patent infringement claim against Participant + alleging that such Participant's Contributor Version directly or + indirectly infringes any patent where such claim is resolved (such as + by license or settlement) prior to the initiation of patent + infringement litigation, then the reasonable value of the licenses + granted by such Participant under Sections 2.1 or 2.2 shall be taken + into account in determining the amount or value of any payment or + license. + + 8.4. In the event of termination under Sections 8.1 or 8.2 above, all + end user license agreements (excluding distributors and resellers) + which have been validly granted by You or any distributor hereunder + prior to termination shall survive termination. + +9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT + (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL + DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, + OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR + ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY + CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, + WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER + COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN + INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF + LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY + RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW + PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE + EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO + THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +10. U.S. GOVERNMENT END USERS. + + The Covered Code is a "commercial item," as that term is defined in 48 + C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" + and "commercial computer software documentation," as such terms are + used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. + 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all + U.S. Government End Users acquire Covered Code with only those rights + set forth herein. + +11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. This License shall be governed by + California law provisions (except to the extent applicable law, if + any, provides oth... [truncated message content] |