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> | |||
| <P>Version 0.1 (2000/11/02)</P> | |||
| <P>Version 0.2 (2000/12/18)</P> | |||
| <P>Authors: | |||
| <A HREF="mailto:simeon@fitch.net">Simeon H.K. Fitch</A> | |||
| @@ -39,7 +39,7 @@ | |||
| communications channel.</P> | |||
| <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 | |||
| support.</P> | |||
| @@ -53,7 +53,7 @@ Antidote Component Architecture | |||
| +---------------+ +----------------+ +-------------+ +-------------+ | |||
| | | | | | | | | | |||
| | ActionManager | | EventResponder | | AntEditor | | AntEditor | | |||
| | ActionManager | | EventResponder | | AntModule | | AntModule | | |||
| | | | | |(ProjectNav) | |(SourceEdit) | | |||
| +---------------+ +----------------+ +-------------+ +-------------+ | |||
| | ^ ^ ^ | |||
| @@ -53,34 +53,51 @@ | |||
| */ | |||
| package org.apache.tools.ant.gui; | |||
| import javax.swing.JPanel; | |||
| import javax.swing.JComponent; | |||
| 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. | |||
| * | |||
| * @version $Revision$ | |||
| * @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. */ | |||
| 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. | |||
| */ | |||
| protected AntEditor(AppContext context) { | |||
| protected void setContext(AppContext context) { | |||
| _context = context; | |||
| setBorder(BorderFactory.createTitledBorder(getName())); | |||
| } | |||
| setBorder(_context == null ? null : | |||
| BorderFactory.createTitledBorder(getName())); | |||
| } | |||
| /** | |||
| * Get the application context. | |||
| @@ -88,6 +105,10 @@ public abstract class AntEditor extends JPanel { | |||
| * @return Application context. | |||
| */ | |||
| public AppContext getContext() { | |||
| if(_context == null) { | |||
| throw new IllegalStateException( | |||
| "The AppContext has not been set."); | |||
| } | |||
| return _context; | |||
| } | |||
| /** | |||
| @@ -96,6 +117,6 @@ public abstract class AntEditor extends JPanel { | |||
| * @return Editor's name. | |||
| */ | |||
| 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; | |||
| // Add the various editors/views to the editing area. | |||
| // Add the various modules to the editing area. | |||
| 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 | |||
| // sucks, and doesn't provide enought (working) control over the | |||
| // initial size of it's subcomponents. setDividerLocation(double) | |||
| @@ -93,38 +93,35 @@ public class Antidote extends JPanel { | |||
| splitter2.setOneTouchExpandable(true); | |||
| splitter2.add(JSplitPane.TOP, splitter); | |||
| splitter2.add(JSplitPane.BOTTOM, populateEditors("bottom")); | |||
| splitter2.add(JSplitPane.BOTTOM, populateModules("bottom")); | |||
| add(BorderLayout.CENTER, splitter2); | |||
| splitter2.resetToPreferredSizes(); | |||
| add(BorderLayout.NORTH, populateEditors("top")); | |||
| add(BorderLayout.NORTH, populateModules("top")); | |||
| 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(). | |||
| 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++) { | |||
| 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) { | |||
| // 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); | |||
| 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; | |||
| } | |||
| @@ -68,7 +68,7 @@ import java.util.EventObject; | |||
| * @version $Revision$ | |||
| * @author Simeon Fitch | |||
| */ | |||
| public class Console extends AntEditor { | |||
| public class Console extends AntModule { | |||
| /** Area where messages are printed. */ | |||
| private JTextPane _text = null; | |||
| /** Selection of logging levels. */ | |||
| @@ -77,12 +77,19 @@ public class Console extends AntEditor { | |||
| 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()); | |||
| setLayout(new BorderLayout()); | |||
| @@ -106,6 +113,7 @@ public class Console extends AntEditor { | |||
| } | |||
| /** Class for handling project events. */ | |||
| private class Handler implements BusMember { | |||
| private final Filter _filter = new Filter(); | |||
| @@ -66,18 +66,25 @@ import java.util.EventObject; | |||
| * @version $Revision$ | |||
| * @author Simeon Fitch | |||
| */ | |||
| class ProjectNavigator extends AntEditor { | |||
| class ProjectNavigator extends AntModule { | |||
| /** Navigation via a tree widget. */ | |||
| private JTree _tree = null; | |||
| /** | |||
| * Standard ctor. | |||
| * Default ctor. | |||
| * | |||
| */ | |||
| public ProjectNavigator() { | |||
| } | |||
| /** | |||
| * Using the given AppContext, initialize the display. | |||
| * | |||
| * @param context Application context. | |||
| */ | |||
| public ProjectNavigator(AppContext context) { | |||
| super(context); | |||
| public void contextualize(AppContext context) { | |||
| setContext(context); | |||
| context.getEventBus().addMember(EventBus.MONITORING, new Handler()); | |||
| setLayout(new GridLayout(1,1)); | |||
| @@ -71,7 +71,7 @@ import java.awt.Point; | |||
| * @version $Revision$ | |||
| * @author Simeon H.K. Fitch | |||
| */ | |||
| class PropertyEditor extends AntEditor { | |||
| public class PropertyEditor extends AntModule { | |||
| /** The editor for current bean.*/ | |||
| private Customizer _customizer = null; | |||
| @@ -81,12 +81,19 @@ class PropertyEditor extends AntEditor { | |||
| 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()); | |||
| setLayout(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$ | |||
| * @author Simeon Fitch | |||
| */ | |||
| public class TargetMonitor extends AntEditor { | |||
| public class TargetMonitor extends AntModule { | |||
| /** Place to display selected targets. */ | |||
| private JLabel _text = null; | |||
| @@ -77,12 +77,19 @@ public class TargetMonitor extends AntEditor { | |||
| 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()); | |||
| setLayout(new BorderLayout()); | |||
| @@ -1,25 +1,27 @@ | |||
| # 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.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 | |||
| # 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 | |||
| # 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 | |||
| # 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.ProjectNavigator.name=Project | |||