From b8a60e31342c5012d24d6d6c6b350efc64e658ab Mon Sep 17 00:00:00 2001 From: Stefan Bodewig Date: Wed, 30 Mar 2005 09:59:36 +0000 Subject: [PATCH] Remove Antidote pages git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@278085 13f79535-47bb-0310-9956-ffa450edef68 --- docs/projects/antidote/design.html | 354 ------------------- docs/projects/antidote/images/screenshot.jpg | Bin 71069 -> 0 bytes docs/projects/antidote/index.html | 166 --------- docs/projects/antidote/module.html | 190 ---------- docs/projects/antidote/news.html | 134 ------- xdocs/projects/antidote/design.xml | 259 -------------- xdocs/projects/antidote/index.xml | 77 ---- xdocs/projects/antidote/module.xml | 107 ------ xdocs/projects/antidote/news.xml | 40 --- xdocs/stylesheets/project.xml | 6 - 10 files changed, 1333 deletions(-) delete mode 100644 docs/projects/antidote/design.html delete mode 100644 docs/projects/antidote/images/screenshot.jpg delete mode 100644 docs/projects/antidote/index.html delete mode 100644 docs/projects/antidote/module.html delete mode 100644 docs/projects/antidote/news.html delete mode 100644 xdocs/projects/antidote/design.xml delete mode 100644 xdocs/projects/antidote/index.xml delete mode 100644 xdocs/projects/antidote/module.xml delete mode 100644 xdocs/projects/antidote/news.xml diff --git a/docs/projects/antidote/design.html b/docs/projects/antidote/design.html deleted file mode 100644 index 3771b960e..000000000 --- a/docs/projects/antidote/design.html +++ /dev/null @@ -1,354 +0,0 @@ - - - - - - - - Apache Ant - Design Overview - - - - - - - - - - -
- - - - - - -
Apache Ant siteApache Ant logo -
- - - - - - - - - - - - - - -
- - - - -
- the Apache Ant site -
-
-
-
- -
- - - - - -
- - - - -
Home
-
- - - - -
Projects
-
-
- -
- - -
 
-
-
-

Design Overview

-

- - Introduction -

-

The purpose of this document is to communicate the overall - structure and design patters used in Antidote, the GUI for - Ant. This document is a work in progress, as well as a living - document, and it is most likely not be in full synchronization with - the source code. Therefore, if there is any doubt, view the source - ;-) -

-

- - Overview -

-

The Antidote architecture design aims to provide a high level - of modularity and extensibility. Ideally the components of - Antidote will be able to be assembled in different configurations - to provide the type of application or plug-in desired. -

-

To achieve this modularity, a high level of decoupling is - necessary. The standard UI design approach of providing separation - of view (presentation) from model (data) is applied, leveraging - the built-in Ant data model where possible, as well as the - predefined Swing model interfaces. Furthermore, the architecture - is highly event driven, whereby modules communicate via a shared - communications channel. -

-

To a large extent, the configuration of application modules is - driven by localized configuration files, allowing new modules or - data views to be added, as well as providing multi-language - support. -

-

The diagram below conveys a high altitude view of the - application's structure. As the application grows, new components - will be plugged in to what will be described as the EventBus -

-

- - Antidote Component Architecture/Event Bus -

-
-   +---------------+ +----------------+ +-------------+ +-------------+
-   |               | |                | |             | |             |
-   | ActionManager | | EventResponder | |  AntModule  | |  AntModule  |
-   |               | |                | |(ProjectNav) | |(SourceEdit) |
-   +---------------+ +----------------+ +-------------+ +-------------+
-           |                  ^               ^               ^
-           |                  |               |               |
-      ActionEvent         EventObject      AntEvent       AntEvent
-           |                  |               |               |
-           v                  v               v               v
-  /---------------------------------------------------------------------\
- /                                                                       \
-<                                   EventBus                              >
- \                                                                       /
-  \---------------------------------------------------------------------/
-           |                  ^               ^               ^
-           |                  |               |               |
-      EventObject         ChangeEvent      BuildEvent     EventObject
-           |                  |               |               |
-           v                  |               |               v
-   +---------------+ +----------------+ +-------------+ +--------------+
-   |               | |                | |             | |              |
-   |   Console     | |  ProjectProxy  | |    Ant      | | (Your Module)|
-   |               | |                | |             | |              |
-   +---------------+ +----------------+ +-------------+ +--------------+
-    
-

The backbone of the application is the EventBus. Any - component of the application can post events to the - EventBus. Components that wish to receive events are - called BusMembers. -

-

The EventBus will dispatch any object of type - java.util.Event, which means that Ant BuildEvent - objects, as well as AWTEvent objects can be posted (if desired). A - new class of events called AntEvent is defined for Antidote - specific events, which have the additional capability of being - canceled mid-dispatch. -

-

Each BusMember must provide a BusFilter instance, - which is the members' means of telling the bus which - events it is interested in. This allows a BusMember to, - say, only receive AntEvent objects. -

-

When a BusMember registers itself with the - EventBus, it must provide a (so called) interrupt - level which is a integer value defining a relative ordering - for dispatching EventObjects to BusMembers. The - purpose of this is to allow certain BusMember instances - to see an event before others, and in the case of AntEvent - objects, keep the event from propagating onward. The - EventBus class defines the interrupt level constants - VETOING=1, MONITORING=5, and RESPONDING=10 to - help define categories of members. The implied purpose being that: -

-
    - -
  • VETOING: Listens for certain types of events, and - may process them in a non-default manner to determine if the - event should be canceled before being dispatched to the - RESPONDING group. -
  • - -
  • MONITORING: Just listens for events, like a logger - or status monitor. -
  • - -
  • RESPONDING: Process events in a default manner, - knowing that the event has passed any VETOING members. -
  • - -
-

Within a specific interrupt level, the order in which members will - receive events is undefined. A BusMember may be registered - at a level that is +/- of one of the defined levels, as long as it - follows the constraint MONITORING <= interruptLevel <= - MAX_INTERRUPT. -

-

- - Actions and ActionManager -

-

Extensive use of the javax.swing.Action interface is - made for defining the set of menu and tool bar options that are - available. The configuration file action.properties - exists to define what should appear in the menu and toolbar, how - it is displayed, and the Action command name that is - dispatched when the user invokes that action. A class called - ActionManager exists for not only processing the - configuration file, but also for dispatching invoked action events - to the EventBus, and for controlling the enabled state of - an Action. When a new menu item or toolbar button is - desired, first it is added to the action.properties file, - and then the code to respond to it is added to the - EventResponder (see below). -

-

- - Commands and EventResponder -

-

At some point in the stages of event processing, an event may - require the data model to be modified, or some other task be - performed. The Command interface is defined to classify - code which performs some task or operation. This is distinct from - an Action, which is a user request for an operation. A - Command class is the encapsulation of the operation - itself. -

-

When an Action generates an ActionEvent, the - event is posted to the EventBus which delivers the event - to all interested BusMembers. It eventually makes it to - the EventResponder instance (registered at the - RESPONDING interrupt level), which is responsible for - translating specific events into Command objects, and - then executing the Command object. For example, when the - user selects the "Open..." menu option, an ActionEvent is - generated by the Swing MenuItem class, which is then - posted to the EventBus by the ActionManager. The - ActionEvent is delivered to the EventResponder, - which converts the ActionEvent into a Command - instance. The EventResponder then calls the method - Command.execute() to invoke the command (which displays a - dialog for selecting a file to open). -

-

When adding new Actions or general tasks to the - application, a Command object should be created to - encapsulate the behavior. This includes most operations which - modify the state of the data model. -

-

The purpose of this encapsulation is to allow the clean - separation of making a request, and servicing a request. Due to - various conditions in the application state, the actually response - to a request may change, as well as who services it. This - design approach facilitates that. -

-

- - Data Model and Views -

-

NB: This part of the architecture is not fleshed out very well. There - needs to be a discussion of the degree to which the Antidote development - should be able to impose changes on the Ant data model, and to what level - that model should be mirrored in the Antidote code base. The coupling - between them should be kept low, and at the same time changes to one should - affect the other minimally. Still, features like property change events and - bean introspection (or BeanInfo) may be needed to be added to the Ant data - model. Right now the data model is encapsulated in the package - org.apache.tools.ant.gui.acs (where "acs" stands for "Ant Construction Set"). -

-

- - Application Context -

-

In order to keep the coupling among application modules to a - minimum, a single point of reference is needed for coordination - and data sharing. The class AppContext is the catch-all - class for containing the application state. Most modules and - Command classes require an instance of the - AppContext class. Because all state information in - contained in an AppContext instance, multiple instances - of Antidote can run inside the same JVM as long as each has it's - own AppContext. (Interestingly, two instances of the - Antidote could conceivably share an AppContext instance - through RMI, allowing remote interaction/collaboration.) -

-

- - Configuration and ResourceManager -

-

Full "i18n" support should be assumed in modern applications, - and all user viewable strings should be defined in a configuration - file. For Antidote this configuration file is - antidote.properties, which is located (with other UI - resources) in the sub-package "resources". -

-

To aid in the lookup of text properties, as well as other - resources like icons, a class called ResourceManager is - defined. There are various convenience methods attached to this - class, which will likely grow to make looking up configuration - values as easy as possible. -

-

The organization of configuration properties is based on the - fully qualified path of the class that requires the property. For - example, the "about" box contains a messages, so it looks for the - property "org.apache.tools.ant.gui.About.message" for the text - message it should display. Therefore, the ResourceManager - method getString() takes a Class instance as - well as a String key. Please see the - ResourceManager documentation for more information. Given - this support, no user visible strings should appear in the source - code itself. -

- -
-
- - - - - - - - - - - - - - diff --git a/docs/projects/antidote/images/screenshot.jpg b/docs/projects/antidote/images/screenshot.jpg deleted file mode 100644 index 35c3f122c52ca4233f844960d132a7566e110c12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71069 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 X_6j{y$tPWoTPOB8g2wsl|K9`v#6OEV diff --git a/docs/projects/antidote/index.html b/docs/projects/antidote/index.html deleted file mode 100644 index a90f656df..000000000 --- a/docs/projects/antidote/index.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - - Apache Ant - About Antidote - - - - - - - - -
- - - - - - -
Apache Ant siteApache Ant logo -
- - - - - - - - - - - - - - -
- - - - -
- the Apache Ant site -
-
-
-
- -
- - - - - -
- - - - -
Home
-
- - - - -
Projects
-
-
- -
- - -
 
-
-
-

About Antidote

-

- - About -

-

ANTidote is the GUI for Ant...

-

... in fact it is the Ant GUI by the Apache Ant project itself, because, - as you might know, there are several other graphical user interfaces covering Ant. - Most of them are integrated in IDEs such as NetBeans - or Eclipse. To be honest Antidote - has started a long time ago (spring 2000) and was designed to become integrable into - IDEs by it's original Author Simeon H. K. Fitch, who did the most work on Antidote. - Unfortunately the Antidote community never came really "to speed" and so the IDE-guys - where faster with their integrations. -

-

With these other Ant GUIs Antidote became less important and it seemed there was not much - interest in such a tool... -

-

Anyways: The "sleeping beauty" Antidote has been awaken and is now being developed to - a full featured, stand alone, JFC/Swing-based Ant GUI to graphically create, edit and run - build-files to be quite useful for the developer who do not use an IDE at all. So one of - the goals of Antidote development is to make it small, fast and really neat :)! -

-

- - Get a glimpse -

-

- Screenshot -

-

This is a screenshot of how Antidote looks today. Still there is, of course, a lot to do - and you are welcome to contribute! It shows Antidote using a custom look and feel called - "Metouia" which you can find here if you want to try it! -

-

- - Get Involved -

-

Antidote is discussed on the main Ant mailing lists you can find here: -

- - -
-
- - - - - - - - - - - - - - diff --git a/docs/projects/antidote/module.html b/docs/projects/antidote/module.html deleted file mode 100644 index 2f1a45b21..000000000 --- a/docs/projects/antidote/module.html +++ /dev/null @@ -1,190 +0,0 @@ - - - - - - - - Apache Ant - Module HOW-TO - - - - - - - - - - -
- - - - - - -
Apache Ant siteApache Ant logo -
- - - - - - - - - - - - - - -
- - - - -
- the Apache Ant site -
-
-
-
- -
- - - - - -
- - - - -
Home
-
- - - - -
Projects
-
-
- -
- - -
 
-
-
-

Module HOW-TO

-

- - Introduction -

-

The purpose of this document is to provide an overview of the - basic steps one must undertake to add a new module to - Antidote. Please see The Antidote - Design Overview for information on what a module is and how it - fits into Antidote. If you've already got all that, then read - on! -

-

NB: Please submit updates and criticisms to this, particularly - areas that were unclear, missing, or difficult to follow. -

-

- - Step by step -

-

1) Specialize org.apache.tools.ant.gui.core.AntModule

-

All modules must inherit from the AntModule - class. This will probably irritate some of you, but it essentially - enforces inheritance from javax.swing.JComponent and - provides encapsulated handling of the AppContext instance - that is so important to this class. -

-

Your module is required to implement the - AntModule.contextualize(AppContext) method. The first - thing this method should do is call - AntModule.setContext(AppContext), and then it is safe for - it to begin constructing its display, using whatever resources it - needs from the given AppContext instance. Think of this - in a similar manner to Applet.init() or - Servlet.init(). -

-

2) Update - org/apache/tools/ant/gui/resources/antidote.properties

-

2a) Externalize All Displayable Strings

-

All displayable strings must be externalized to the - antidote.properties file, and looked up via the - AppContext.getResources() method after the - AntModule.contextualize() method has been called. Follow - the naming convention currently used in the properties file and - you should have to problems. This task should be done - during development of your module. Under no circumstances - should your module be submitted or committed without this task - being completed. Remember that Antidote has an international - audience. -

-

2b) Add Module to List of Auto-Loaded Modules

-

Look for the properties with the format - org.apache.tools.ant.gui.Antidote.xxx.modules where - xxx is one of {left | right | top | bottom}. Depending on - where you want your module to appear, and the order that you want - it to appear in relationship to the other modules, add the class - name of your module appropriately. If multiple modules are listed - for a single property (via a comma delimited list), then each - module will have it's own tab in a javax.swing.JTabbedPane. -

-

NB:This goofy way of constructing the main screen will probably - change to something much more general (but not as general as, say - BML). -

-

Run it!

-

That should be all you need to do, at least to get your module - plugged in. Check out the source code for - ProjectNavigator and PropertyEditor for module - examples that use the various facilities of the Antidote - framework. -

- -
-
- - - - - - - - - - - - - - diff --git a/docs/projects/antidote/news.html b/docs/projects/antidote/news.html deleted file mode 100644 index 2aab2e513..000000000 --- a/docs/projects/antidote/news.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - Apache Ant - News - - - - - - - - -
- - - - - - -
Apache Ant siteApache Ant logo -
- - - - - - - - - - - - - - -
- - - - -
- the Apache Ant site -
-
-
-
- -
- - - - - -
- - - - -
Home
-
- - - - -
Projects
-
-
- -
- - -
 
-
-
-

News

-

- - German i18n -

-

October 12, 2003 - Antidote German internationalization implemented

-

After English and Japanese, German is the third language Antidote has been - localized to! Many others may follow!?!

-

- - Antidote News Page -

-

October 12, 2003 - News Page

-

To show, that we are really continue the work on Antidote, I set up this - news page to inform you all about the progress. Additonally I'd like to encourage - you to use and test Antidote, or - of course - take part in the development!

- -
-
- - - - - - - - - - - - - - diff --git a/xdocs/projects/antidote/design.xml b/xdocs/projects/antidote/design.xml deleted file mode 100644 index a6c8f173d..000000000 --- a/xdocs/projects/antidote/design.xml +++ /dev/null @@ -1,259 +0,0 @@ - - - - - - - Simeon H. K. Fitch - Christoph Wilhelms - Design Overview - - - - -
-

The purpose of this document is to communicate the overall - structure and design patters used in Antidote, the GUI for - Ant. This document is a work in progress, as well as a living - document, and it is most likely not be in full synchronization with - the source code. Therefore, if there is any doubt, view the source - ;-) -

-
- -
-

The Antidote architecture design aims to provide a high level - of modularity and extensibility. Ideally the components of - Antidote will be able to be assembled in different configurations - to provide the type of application or plug-in desired. -

-

To achieve this modularity, a high level of decoupling is - necessary. The standard UI design approach of providing separation - of view (presentation) from model (data) is applied, leveraging - the built-in Ant data model where possible, as well as the - predefined Swing model interfaces. Furthermore, the architecture - is highly event driven, whereby modules communicate via a shared - communications channel. -

-

To a large extent, the configuration of application modules is - driven by localized configuration files, allowing new modules or - data views to be added, as well as providing multi-language - support. -

-

The diagram below conveys a high altitude view of the - application's structure. As the application grows, new components - will be plugged in to what will be described as the EventBus -

-
-
- - +---------------+ +----------------+ +-------------+ +-------------+
- | | | | | | | |
- | ActionManager | | EventResponder | | AntModule | | AntModule |
- | | | | |(ProjectNav) | |(SourceEdit) |
- +---------------+ +----------------+ +-------------+ +-------------+
- | ^ ^ ^
- | | | |
- ActionEvent EventObject AntEvent AntEvent
- | | | |
- v v v v
- /---------------------------------------------------------------------\
- / \
-< EventBus >
- \ /
- \---------------------------------------------------------------------/
- | ^ ^ ^
- | | | |
- EventObject ChangeEvent BuildEvent EventObject
- | | | |
- v | | v
- +---------------+ +----------------+ +-------------+ +--------------+
- | | | | | | | |
- | Console | | ProjectProxy | | Ant | | (Your Module)|
- | | | | | | | |
- +---------------+ +----------------+ +-------------+ +--------------+ - -

The backbone of the application is the EventBus. Any - component of the application can post events to the - EventBus. Components that wish to receive events are - called BusMembers. -

- -

The EventBus will dispatch any object of type - java.util.Event, which means that Ant BuildEvent - objects, as well as AWTEvent objects can be posted (if desired). A - new class of events called AntEvent is defined for Antidote - specific events, which have the additional capability of being - canceled mid-dispatch. -

- -

Each BusMember must provide a BusFilter instance, - which is the members' means of telling the bus which - events it is interested in. This allows a BusMember to, - say, only receive AntEvent objects. -

- -

When a BusMember registers itself with the - EventBus, it must provide a (so called) interrupt - level which is a integer value defining a relative ordering - for dispatching EventObjects to BusMembers. The - purpose of this is to allow certain BusMember instances - to see an event before others, and in the case of AntEvent - objects, keep the event from propagating onward. The - EventBus class defines the interrupt level constants - VETOING=1, MONITORING=5, and RESPONDING=10 to - help define categories of members. The implied purpose being that: -

-
    - -
  • VETOING: Listens for certain types of events, and - may process them in a non-default manner to determine if the - event should be canceled before being dispatched to the - RESPONDING group. -
  • - -
  • MONITORING: Just listens for events, like a logger - or status monitor. -
  • - -
  • RESPONDING: Process events in a default manner, - knowing that the event has passed any VETOING members. -
  • - -
- -

Within a specific interrupt level, the order in which members will - receive events is undefined. A BusMember may be registered - at a level that is +/- of one of the defined levels, as long as it - follows the constraint MONITORING <= interruptLevel <= - MAX_INTERRUPT. -

-
- -
-

Extensive use of the javax.swing.Action interface is - made for defining the set of menu and tool bar options that are - available. The configuration file action.properties - exists to define what should appear in the menu and toolbar, how - it is displayed, and the Action command name that is - dispatched when the user invokes that action. A class called - ActionManager exists for not only processing the - configuration file, but also for dispatching invoked action events - to the EventBus, and for controlling the enabled state of - an Action. When a new menu item or toolbar button is - desired, first it is added to the action.properties file, - and then the code to respond to it is added to the - EventResponder (see below). -

-
-
-

At some point in the stages of event processing, an event may - require the data model to be modified, or some other task be - performed. The Command interface is defined to classify - code which performs some task or operation. This is distinct from - an Action, which is a user request for an operation. A - Command class is the encapsulation of the operation - itself. -

- -

When an Action generates an ActionEvent, the - event is posted to the EventBus which delivers the event - to all interested BusMembers. It eventually makes it to - the EventResponder instance (registered at the - RESPONDING interrupt level), which is responsible for - translating specific events into Command objects, and - then executing the Command object. For example, when the - user selects the "Open..." menu option, an ActionEvent is - generated by the Swing MenuItem class, which is then - posted to the EventBus by the ActionManager. The - ActionEvent is delivered to the EventResponder, - which converts the ActionEvent into a Command - instance. The EventResponder then calls the method - Command.execute() to invoke the command (which displays a - dialog for selecting a file to open). -

- -

When adding new Actions or general tasks to the - application, a Command object should be created to - encapsulate the behavior. This includes most operations which - modify the state of the data model. -

- -

The purpose of this encapsulation is to allow the clean - separation of making a request, and servicing a request. Due to - various conditions in the application state, the actually response - to a request may change, as well as who services it. This - design approach facilitates that. -

-
-
-

NB: This part of the architecture is not fleshed out very well. There - needs to be a discussion of the degree to which the Antidote development - should be able to impose changes on the Ant data model, and to what level - that model should be mirrored in the Antidote code base. The coupling - between them should be kept low, and at the same time changes to one should - affect the other minimally. Still, features like property change events and - bean introspection (or BeanInfo) may be needed to be added to the Ant data - model. Right now the data model is encapsulated in the package - org.apache.tools.ant.gui.acs (where "acs" stands for "Ant Construction Set"). -

-
-
-

In order to keep the coupling among application modules to a - minimum, a single point of reference is needed for coordination - and data sharing. The class AppContext is the catch-all - class for containing the application state. Most modules and - Command classes require an instance of the - AppContext class. Because all state information in - contained in an AppContext instance, multiple instances - of Antidote can run inside the same JVM as long as each has it's - own AppContext. (Interestingly, two instances of the - Antidote could conceivably share an AppContext instance - through RMI, allowing remote interaction/collaboration.) -

-
-
-

Full "i18n" support should be assumed in modern applications, - and all user viewable strings should be defined in a configuration - file. For Antidote this configuration file is - antidote.properties, which is located (with other UI - resources) in the sub-package "resources". -

- -

To aid in the lookup of text properties, as well as other - resources like icons, a class called ResourceManager is - defined. There are various convenience methods attached to this - class, which will likely grow to make looking up configuration - values as easy as possible. -

- -

The organization of configuration properties is based on the - fully qualified path of the class that requires the property. For - example, the "about" box contains a messages, so it looks for the - property "org.apache.tools.ant.gui.About.message" for the text - message it should display. Therefore, the ResourceManager - method getString() takes a Class instance as - well as a String key. Please see the - ResourceManager documentation for more information. Given - this support, no user visible strings should appear in the source - code itself. -

-
- - -
- diff --git a/xdocs/projects/antidote/index.xml b/xdocs/projects/antidote/index.xml deleted file mode 100644 index f14d67492..000000000 --- a/xdocs/projects/antidote/index.xml +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - Christoph Wilhelms - About Antidote - - - - -
-

ANTidote is the GUI for Ant...

- -

... in fact it is the Ant GUI by the Apache Ant project itself, because, - as you might know, there are several other graphical user interfaces covering Ant. - Most of them are integrated in IDEs such as NetBeans - or Eclipse. To be honest Antidote - has started a long time ago (spring 2000) and was designed to become integrable into - IDEs by it's original Author Simeon H. K. Fitch, who did the most work on Antidote. - Unfortunately the Antidote community never came really "to speed" and so the IDE-guys - where faster with their integrations. -

-

With these other Ant GUIs Antidote became less important and it seemed there was not much - interest in such a tool... -

-

Anyways: The "sleeping beauty" Antidote has been awaken and is now being developed to - a full featured, stand alone, JFC/Swing-based Ant GUI to graphically create, edit and run - build-files to be quite useful for the developer who do not use an IDE at all. So one of - the goals of Antidote development is to make it small, fast and really neat :)! -

-
- -
-

- Screenshot -

-

This is a screenshot of how Antidote looks today. Still there is, of course, a lot to do - and you are welcome to contribute! It shows Antidote using a custom look and feel called - "Metouia" which you can find here if you want to try it! -

-
- -
-

Antidote is discussed on the main Ant mailing lists you can find here: -

- - - - -
- - -
- diff --git a/xdocs/projects/antidote/module.xml b/xdocs/projects/antidote/module.xml deleted file mode 100644 index 2c8b7a279..000000000 --- a/xdocs/projects/antidote/module.xml +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - - Simeon H. K. Fitch - Christoph Wilhelms - Module HOW-TO - - - - -
-

The purpose of this document is to provide an overview of the - basic steps one must undertake to add a new module to - Antidote. Please see The Antidote - Design Overview for information on what a module is and how it - fits into Antidote. If you've already got all that, then read - on! -

- -

NB: Please submit updates and criticisms to this, particularly - areas that were unclear, missing, or difficult to follow. -

-
- -
-

1) Specialize org.apache.tools.ant.gui.core.AntModule

- -

All modules must inherit from the AntModule - class. This will probably irritate some of you, but it essentially - enforces inheritance from javax.swing.JComponent and - provides encapsulated handling of the AppContext instance - that is so important to this class. -

- -

Your module is required to implement the - AntModule.contextualize(AppContext) method. The first - thing this method should do is call - AntModule.setContext(AppContext), and then it is safe for - it to begin constructing its display, using whatever resources it - needs from the given AppContext instance. Think of this - in a similar manner to Applet.init() or - Servlet.init(). -

- -

2) Update - org/apache/tools/ant/gui/resources/antidote.properties

- -

2a) Externalize All Displayable Strings

- -

All displayable strings must be externalized to the - antidote.properties file, and looked up via the - AppContext.getResources() method after the - AntModule.contextualize() method has been called. Follow - the naming convention currently used in the properties file and - you should have to problems. This task should be done - during development of your module. Under no circumstances - should your module be submitted or committed without this task - being completed. Remember that Antidote has an international - audience. -

- -

2b) Add Module to List of Auto-Loaded Modules

- -

Look for the properties with the format - org.apache.tools.ant.gui.Antidote.xxx.modules where - xxx is one of {left | right | top | bottom}. Depending on - where you want your module to appear, and the order that you want - it to appear in relationship to the other modules, add the class - name of your module appropriately. If multiple modules are listed - for a single property (via a comma delimited list), then each - module will have it's own tab in a javax.swing.JTabbedPane. -

- -

NB:This goofy way of constructing the main screen will probably - change to something much more general (but not as general as, say - BML). -

- -

Run it!

-

That should be all you need to do, at least to get your module - plugged in. Check out the source code for - ProjectNavigator and PropertyEditor for module - examples that use the various facilities of the Antidote - framework. -

- -
- -
- diff --git a/xdocs/projects/antidote/news.xml b/xdocs/projects/antidote/news.xml deleted file mode 100644 index e53c41b01..000000000 --- a/xdocs/projects/antidote/news.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - Christoph Wilhelms - News - - - -
-

October 12, 2003 - Antidote German internationalization implemented

-

After English and Japanese, German is the third language Antidote has been - localized to! Many others may follow!?!

-
- -
-

October 12, 2003 - News Page

-

To show, that we are really continue the work on Antidote, I set up this - news page to inform you all about the progress. Additonally I'd like to encourage - you to use and test Antidote, or - of course - take part in the development!

-
- -
- diff --git a/xdocs/stylesheets/project.xml b/xdocs/stylesheets/project.xml index 1e70bab0e..2f25146ba 100644 --- a/xdocs/stylesheets/project.xml +++ b/xdocs/stylesheets/project.xml @@ -69,12 +69,6 @@ -