compliant (primarily a default ctor). Now has "contextualize()" method that modules must implement. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@268374 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -8,7 +8,7 @@ | |||||
| <H1>Antidote Design Overview</H1> | <H1>Antidote Design Overview</H1> | ||||
| <P>Version 0.1 (2000/11/02)</P> | |||||
| <P>Version 0.2 (2000/12/18)</P> | |||||
| <P>Authors: | <P>Authors: | ||||
| <A HREF="mailto:simeon@fitch.net">Simeon H.K. Fitch</A> | <A HREF="mailto:simeon@fitch.net">Simeon H.K. Fitch</A> | ||||
| @@ -39,7 +39,7 @@ | |||||
| communications channel.</P> | communications channel.</P> | ||||
| <P>To a large extent, the configuration of application modules is | <P>To a large extent, the configuration of application modules is | ||||
| driven by localized configuration files, allowing new editors or | |||||
| driven by localized configuration files, allowing new modules or | |||||
| data views to be added, as well as providing multi-language | data views to be added, as well as providing multi-language | ||||
| support.</P> | support.</P> | ||||
| @@ -53,7 +53,7 @@ Antidote Component Architecture | |||||
| +---------------+ +----------------+ +-------------+ +-------------+ | +---------------+ +----------------+ +-------------+ +-------------+ | ||||
| | | | | | | | | | | | | | | | | | | ||||
| | ActionManager | | EventResponder | | AntEditor | | AntEditor | | |||||
| | ActionManager | | EventResponder | | AntModule | | AntModule | | |||||
| | | | | |(ProjectNav) | |(SourceEdit) | | | | | | |(ProjectNav) | |(SourceEdit) | | ||||
| +---------------+ +----------------+ +-------------+ +-------------+ | +---------------+ +----------------+ +-------------+ +-------------+ | ||||
| | ^ ^ ^ | | ^ ^ ^ | ||||
| @@ -53,34 +53,51 @@ | |||||
| */ | */ | ||||
| package org.apache.tools.ant.gui; | package org.apache.tools.ant.gui; | ||||
| import javax.swing.JPanel; | |||||
| import javax.swing.JComponent; | |||||
| import javax.swing.BorderFactory; | import javax.swing.BorderFactory; | ||||
| /** | /** | ||||
| * Abstract base class for an "editor", which is really anything that | |||||
| * Abstract base class for a "module", which is really anything that | |||||
| * can send or receive events, or edit or view the model. | * can send or receive events, or edit or view the model. | ||||
| * | * | ||||
| * @version $Revision$ | * @version $Revision$ | ||||
| * @author Simeon Fitch | * @author Simeon Fitch | ||||
| */ | */ | ||||
| public abstract class AntEditor extends JPanel { | |||||
| /** Parameters to the Contructor. Used for loading | |||||
| classes through reflection. */ | |||||
| public static final Class[] CTOR_PARAMS = { AppContext.class }; | |||||
| public abstract class AntModule extends JComponent { | |||||
| /** The application context. */ | /** The application context. */ | ||||
| private AppContext _context = null; | private AppContext _context = null; | ||||
| /** | /** | ||||
| * Standard constuctor. | |||||
| * Default constructor. | |||||
| */ | |||||
| protected AntModule() { | |||||
| // Create a dummy border so that the widget will at least have a | |||||
| // minimal display in a bean environment. | |||||
| setBorder(BorderFactory.createTitledBorder(getClass().getName())); | |||||
| } | |||||
| /** | |||||
| * This method is called after instantiation when the application context | |||||
| * is available for constructing the class' display. Think of this in | |||||
| * a similar manner to Applet.init() or Servlet.init(). It should | |||||
| * immediately call #setContext() with the given parameter. | |||||
| * | |||||
| * @param context Valid application context providing | |||||
| * all required resources. | |||||
| */ | |||||
| public abstract void contextualize(AppContext context); | |||||
| /** | |||||
| * Set the application context. | |||||
| * | * | ||||
| * @param context Application context. | * @param context Application context. | ||||
| */ | */ | ||||
| protected AntEditor(AppContext context) { | |||||
| protected void setContext(AppContext context) { | |||||
| _context = context; | _context = context; | ||||
| setBorder(BorderFactory.createTitledBorder(getName())); | |||||
| } | |||||
| setBorder(_context == null ? null : | |||||
| BorderFactory.createTitledBorder(getName())); | |||||
| } | |||||
| /** | /** | ||||
| * Get the application context. | * Get the application context. | ||||
| @@ -88,6 +105,10 @@ public abstract class AntEditor extends JPanel { | |||||
| * @return Application context. | * @return Application context. | ||||
| */ | */ | ||||
| public AppContext getContext() { | public AppContext getContext() { | ||||
| if(_context == null) { | |||||
| throw new IllegalStateException( | |||||
| "The AppContext has not been set."); | |||||
| } | |||||
| return _context; | return _context; | ||||
| } | } | ||||
| /** | /** | ||||
| @@ -96,6 +117,6 @@ public abstract class AntEditor extends JPanel { | |||||
| * @return Editor's name. | * @return Editor's name. | ||||
| */ | */ | ||||
| public String getName() { | public String getName() { | ||||
| return _context.getResources().getString(getClass(), "name"); | |||||
| return getContext().getResources().getString(getClass(), "name"); | |||||
| } | } | ||||
| } | } | ||||
| @@ -78,10 +78,10 @@ public class Antidote extends JPanel { | |||||
| _context = context; | _context = context; | ||||
| // Add the various editors/views to the editing area. | |||||
| // Add the various modules to the editing area. | |||||
| JSplitPane splitter = new JSplitPane(); | JSplitPane splitter = new JSplitPane(); | ||||
| splitter.add(JSplitPane.LEFT, populateEditors("left")); | |||||
| splitter.add(JSplitPane.RIGHT, populateEditors("right")); | |||||
| splitter.add(JSplitPane.LEFT, populateModules("left")); | |||||
| splitter.add(JSplitPane.RIGHT, populateModules("right")); | |||||
| // This is necessary because, frankly, the JSplitPane widget | // This is necessary because, frankly, the JSplitPane widget | ||||
| // sucks, and doesn't provide enought (working) control over the | // sucks, and doesn't provide enought (working) control over the | ||||
| // initial size of it's subcomponents. setDividerLocation(double) | // initial size of it's subcomponents. setDividerLocation(double) | ||||
| @@ -93,38 +93,35 @@ public class Antidote extends JPanel { | |||||
| splitter2.setOneTouchExpandable(true); | splitter2.setOneTouchExpandable(true); | ||||
| splitter2.add(JSplitPane.TOP, splitter); | splitter2.add(JSplitPane.TOP, splitter); | ||||
| splitter2.add(JSplitPane.BOTTOM, populateEditors("bottom")); | |||||
| splitter2.add(JSplitPane.BOTTOM, populateModules("bottom")); | |||||
| add(BorderLayout.CENTER, splitter2); | add(BorderLayout.CENTER, splitter2); | ||||
| splitter2.resetToPreferredSizes(); | splitter2.resetToPreferredSizes(); | ||||
| add(BorderLayout.NORTH, populateEditors("top")); | |||||
| add(BorderLayout.NORTH, populateModules("top")); | |||||
| setPreferredSize(new Dimension(640, 600)); | setPreferredSize(new Dimension(640, 600)); | ||||
| } | } | ||||
| /** | /** | ||||
| * Instantiate the configured editors. | |||||
| * Instantiate the configured modules. | |||||
| * | * | ||||
| * @return Component containing the editor(s). | |||||
| * @return Component containing the modules(s). | |||||
| */ | */ | ||||
| private JComponent populateEditors(String prefix) { | |||||
| private JComponent populateModules(String prefix) { | |||||
| String[] classNames = _context.getResources(). | String[] classNames = _context.getResources(). | ||||
| getStringArray(getClass(), prefix + ".editors"); | |||||
| getStringArray(getClass(), prefix + ".modules"); | |||||
| AntEditor[] editors = new AntEditor[classNames.length]; | |||||
| AntModule[] modules = new AntModule[classNames.length]; | |||||
| for(int i = 0; i < classNames.length; i++) { | for(int i = 0; i < classNames.length; i++) { | ||||
| try { | try { | ||||
| Class editorType = Class.forName(classNames[i]); | |||||
| Class type = Class.forName(classNames[i]); | |||||
| Constructor ctor = | |||||
| editorType.getConstructor(AntEditor.CTOR_PARAMS); | |||||
| editors[i] = | |||||
| (AntEditor) ctor.newInstance(new Object[] { _context }); | |||||
| modules[i] = (AntModule) type.newInstance(); | |||||
| modules[i].contextualize(_context); | |||||
| } | } | ||||
| catch(Exception ex) { | catch(Exception ex) { | ||||
| // XXX log me. | // XXX log me. | ||||
| @@ -132,14 +129,14 @@ public class Antidote extends JPanel { | |||||
| } | } | ||||
| } | } | ||||
| if(editors.length == 1) { | |||||
| return editors[0]; | |||||
| if(modules.length == 1) { | |||||
| return modules[0]; | |||||
| } | } | ||||
| else if(editors.length > 1) { | |||||
| else if(modules.length > 1) { | |||||
| JTabbedPane tabbed = new JTabbedPane(JTabbedPane.BOTTOM); | JTabbedPane tabbed = new JTabbedPane(JTabbedPane.BOTTOM); | ||||
| for(int i = 0; i < editors.length; i++) { | |||||
| tabbed.addTab(editors[i].getName(), editors[i]); | |||||
| for(int i = 0; i < modules.length; i++) { | |||||
| tabbed.addTab(modules[i].getName(), modules[i]); | |||||
| } | } | ||||
| return tabbed; | return tabbed; | ||||
| } | } | ||||
| @@ -68,7 +68,7 @@ import java.util.EventObject; | |||||
| * @version $Revision$ | * @version $Revision$ | ||||
| * @author Simeon Fitch | * @author Simeon Fitch | ||||
| */ | */ | ||||
| public class Console extends AntEditor { | |||||
| public class Console extends AntModule { | |||||
| /** Area where messages are printed. */ | /** Area where messages are printed. */ | ||||
| private JTextPane _text = null; | private JTextPane _text = null; | ||||
| /** Selection of logging levels. */ | /** Selection of logging levels. */ | ||||
| @@ -77,12 +77,19 @@ public class Console extends AntEditor { | |||||
| private ConsoleStyleContext _styles = null; | private ConsoleStyleContext _styles = null; | ||||
| /** | /** | ||||
| * Standard ctor. | |||||
| * Default ctor. | |||||
| */ | |||||
| public Console() { | |||||
| } | |||||
| /** | |||||
| * Using the given AppContext, initialize the display. | |||||
| * | * | ||||
| * @param context Application context; | |||||
| * @param context Application context. | |||||
| */ | */ | ||||
| public Console(AppContext context) { | |||||
| super(context); | |||||
| public void contextualize(AppContext context) { | |||||
| setContext(context); | |||||
| context.getEventBus().addMember(EventBus.MONITORING, new Handler()); | context.getEventBus().addMember(EventBus.MONITORING, new Handler()); | ||||
| setLayout(new BorderLayout()); | setLayout(new BorderLayout()); | ||||
| @@ -106,6 +113,7 @@ public class Console extends AntEditor { | |||||
| } | } | ||||
| /** Class for handling project events. */ | /** Class for handling project events. */ | ||||
| private class Handler implements BusMember { | private class Handler implements BusMember { | ||||
| private final Filter _filter = new Filter(); | private final Filter _filter = new Filter(); | ||||
| @@ -66,18 +66,25 @@ import java.util.EventObject; | |||||
| * @version $Revision$ | * @version $Revision$ | ||||
| * @author Simeon Fitch | * @author Simeon Fitch | ||||
| */ | */ | ||||
| class ProjectNavigator extends AntEditor { | |||||
| class ProjectNavigator extends AntModule { | |||||
| /** Navigation via a tree widget. */ | /** Navigation via a tree widget. */ | ||||
| private JTree _tree = null; | private JTree _tree = null; | ||||
| /** | /** | ||||
| * Standard ctor. | |||||
| * Default ctor. | |||||
| * | |||||
| */ | |||||
| public ProjectNavigator() { | |||||
| } | |||||
| /** | |||||
| * Using the given AppContext, initialize the display. | |||||
| * | * | ||||
| * @param context Application context. | * @param context Application context. | ||||
| */ | */ | ||||
| public ProjectNavigator(AppContext context) { | |||||
| super(context); | |||||
| public void contextualize(AppContext context) { | |||||
| setContext(context); | |||||
| context.getEventBus().addMember(EventBus.MONITORING, new Handler()); | context.getEventBus().addMember(EventBus.MONITORING, new Handler()); | ||||
| setLayout(new GridLayout(1,1)); | setLayout(new GridLayout(1,1)); | ||||
| @@ -71,7 +71,7 @@ import java.awt.Point; | |||||
| * @version $Revision$ | * @version $Revision$ | ||||
| * @author Simeon H.K. Fitch | * @author Simeon H.K. Fitch | ||||
| */ | */ | ||||
| class PropertyEditor extends AntEditor { | |||||
| public class PropertyEditor extends AntModule { | |||||
| /** The editor for current bean.*/ | /** The editor for current bean.*/ | ||||
| private Customizer _customizer = null; | private Customizer _customizer = null; | ||||
| @@ -81,12 +81,19 @@ class PropertyEditor extends AntEditor { | |||||
| private JScrollPane _scroller = null; | private JScrollPane _scroller = null; | ||||
| /** | /** | ||||
| * Standard ctor. | |||||
| * Default ctor. | |||||
| * | * | ||||
| * @param context Application context. | |||||
| */ | */ | ||||
| public PropertyEditor(AppContext context) { | |||||
| super(context); | |||||
| public PropertyEditor() { | |||||
| } | |||||
| /** | |||||
| * Using the given AppContext, initialize the display. | |||||
| * | |||||
| * @param context Application context. | |||||
| */ | |||||
| public void contextualize(AppContext context) { | |||||
| setContext(context); | |||||
| context.getEventBus().addMember(EventBus.MONITORING, new Handler()); | context.getEventBus().addMember(EventBus.MONITORING, new Handler()); | ||||
| setLayout(new BorderLayout()); | setLayout(new BorderLayout()); | ||||
| _container = new JPanel(new BorderLayout()); | _container = new JPanel(new BorderLayout()); | ||||
| @@ -1,130 +0,0 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 1999, 2000 The Apache Software Foundation. All rights | |||||
| * reserved. | |||||
| * | |||||
| * Redistribution and use in source and binary forms, with or without | |||||
| * modification, are permitted provided that the following conditions | |||||
| * are met: | |||||
| * | |||||
| * 1. Redistributions of source code must retain the above copyright | |||||
| * notice, this list of conditions and the following disclaimer. | |||||
| * | |||||
| * 2. Redistributions in binary form must reproduce the above copyright | |||||
| * notice, this list of conditions and the following disclaimer in | |||||
| * the documentation and/or other materials provided with the | |||||
| * distribution. | |||||
| * | |||||
| * 3. The end-user documentation included with the redistribution, if | |||||
| * any, must include the following acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software | |||||
| * Foundation" must not be used to endorse or promote products derived | |||||
| * from this software without prior written permission. For written | |||||
| * permission, please contact apache@apache.org. | |||||
| * | |||||
| * 5. Products derived from this software may not be called "Apache" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
| * SUCH DAMAGE. | |||||
| * ==================================================================== | |||||
| * | |||||
| * This software consists of voluntary contributions made by many | |||||
| * individuals on behalf of the Apache Software Foundation. For more | |||||
| * information on the Apache Software Foundation, please see | |||||
| * <http://www.apache.org/>. | |||||
| */ | |||||
| package org.apache.tools.ant.gui; | |||||
| import org.apache.tools.ant.gui.event.*; | |||||
| import java.util.EventObject; | |||||
| import javax.swing.*; | |||||
| import javax.swing.text.PlainDocument; | |||||
| import java.awt.GridLayout; | |||||
| import java.awt.Font; | |||||
| /* | |||||
| * AntEditor for the XML source. XXX Stubbed version. | |||||
| * | |||||
| * @version $Revision$ | |||||
| * @author Simeon Fitch | |||||
| */ | |||||
| class SourceEditor extends AntEditor { | |||||
| private JEditorPane _text = null; | |||||
| public SourceEditor(AppContext context) { | |||||
| super(context); | |||||
| context.getEventBus().addMember(EventBus.MONITORING, new Handler()); | |||||
| setLayout(new GridLayout(1,1)); | |||||
| _text = new JEditorPane(); | |||||
| _text.setEditable(false); | |||||
| // _text.setFont(new Font("Monospaced", 10, Font.PLAIN)); | |||||
| JScrollPane scroller = new JScrollPane(_text); | |||||
| add(scroller); | |||||
| } | |||||
| /** Class for handling project events. */ | |||||
| private class Handler implements BusMember { | |||||
| private final Filter _filter = new Filter(); | |||||
| /** | |||||
| * Get the filter to that is used to determine if an event should | |||||
| * to to the member. | |||||
| * | |||||
| * @return Filter to use. | |||||
| */ | |||||
| public BusFilter getBusFilter() { | |||||
| return _filter; | |||||
| } | |||||
| /** | |||||
| * Called when an event is to be posed to the member. | |||||
| * | |||||
| * @param event Event to post. | |||||
| * @return true if event should be propogated, false if | |||||
| * it should be cancelled. | |||||
| */ | |||||
| public boolean eventPosted(EventObject event) { | |||||
| ProjectProxy project = getContext().getProject(); | |||||
| _text.setDocument(project == null ? new PlainDocument() : | |||||
| project.getDocument()); | |||||
| return true; | |||||
| } | |||||
| } | |||||
| /** Class providing filtering for project events. */ | |||||
| private static class Filter implements BusFilter { | |||||
| /** | |||||
| * Determines if the given event should be accepted. | |||||
| * | |||||
| * @param event Event to test. | |||||
| * @return True if event should be given to BusMember, false otherwise. | |||||
| */ | |||||
| public boolean accept(EventObject event) { | |||||
| return event instanceof NewProjectEvent; | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -68,7 +68,7 @@ import java.util.EventObject; | |||||
| * @version $Revision$ | * @version $Revision$ | ||||
| * @author Simeon Fitch | * @author Simeon Fitch | ||||
| */ | */ | ||||
| public class TargetMonitor extends AntEditor { | |||||
| public class TargetMonitor extends AntModule { | |||||
| /** Place to display selected targets. */ | /** Place to display selected targets. */ | ||||
| private JLabel _text = null; | private JLabel _text = null; | ||||
| @@ -77,12 +77,19 @@ public class TargetMonitor extends AntEditor { | |||||
| private String _defText = null; | private String _defText = null; | ||||
| /** | /** | ||||
| * Standard ctor. | |||||
| * Default ctor. | |||||
| * | * | ||||
| * @param context Application context; | |||||
| */ | */ | ||||
| public TargetMonitor(AppContext context) { | |||||
| super(context); | |||||
| public TargetMonitor() { | |||||
| } | |||||
| /** | |||||
| * Using the given AppContext, initialize the display. | |||||
| * | |||||
| * @param context Application context. | |||||
| */ | |||||
| public void contextualize(AppContext context) { | |||||
| setContext(context); | |||||
| context.getEventBus().addMember(EventBus.RESPONDING, new Handler()); | context.getEventBus().addMember(EventBus.RESPONDING, new Handler()); | ||||
| setLayout(new BorderLayout()); | setLayout(new BorderLayout()); | ||||
| @@ -1,25 +1,27 @@ | |||||
| # This is the general properties file for the Antidote application. | # This is the general properties file for the Antidote application. | ||||
| # Configure the editors that appear on the right of the UI. | |||||
| org.apache.tools.ant.gui.Antidote.right.editors=\ | |||||
| # The following four module properties configure those properties that | |||||
| # should be initialized and displayed by default by the GUI. If more | |||||
| # than one module is configured for a property (as indicated providing | |||||
| # class names as a comma delimited list), then each module will appear | |||||
| # in its own tab in a JTabbedPane. | |||||
| # Configure the modules that appear on the right of the UI. | |||||
| org.apache.tools.ant.gui.Antidote.right.modules=\ | |||||
| org.apache.tools.ant.gui.PropertyEditor | org.apache.tools.ant.gui.PropertyEditor | ||||
| # org.apache.tools.ant.gui.SourceEditor | |||||
| # Configure the editors that appear on the left of the UI. | |||||
| org.apache.tools.ant.gui.Antidote.left.editors=\ | |||||
| # Configure the modules that appear on the left of the UI. | |||||
| org.apache.tools.ant.gui.Antidote.left.modules=\ | |||||
| org.apache.tools.ant.gui.ProjectNavigator | org.apache.tools.ant.gui.ProjectNavigator | ||||
| # Configure the editors that appear on the bottom of the UI. | |||||
| org.apache.tools.ant.gui.Antidote.bottom.editors=\ | |||||
| # Configure the modules that appear on the bottom of the UI. | |||||
| org.apache.tools.ant.gui.Antidote.bottom.modules=\ | |||||
| org.apache.tools.ant.gui.Console | org.apache.tools.ant.gui.Console | ||||
| # Configure the editors that appear on the top of the UI. | |||||
| org.apache.tools.ant.gui.Antidote.top.editors=\ | |||||
| # Configure the modules that appear on the top of the UI. | |||||
| org.apache.tools.ant.gui.Antidote.top.modules=\ | |||||
| org.apache.tools.ant.gui.TargetMonitor | org.apache.tools.ant.gui.TargetMonitor | ||||
| # Set specific class properties. | |||||
| org.apache.tools.ant.gui.SourceEditor.name=Source | |||||
| org.apache.tools.ant.gui.PropertyEditor.name=Properties | org.apache.tools.ant.gui.PropertyEditor.name=Properties | ||||
| org.apache.tools.ant.gui.ProjectNavigator.name=Project | org.apache.tools.ant.gui.ProjectNavigator.name=Project | ||||