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 | ||||