Hi,
I've been working on an application that needs to be
changed/extended/updated after deployment. Swix seems to be the perfect lib
for the UI part, but I also need to develop some mechanism(s) that could be
changed by the (power?)user.(*)
To achieve this, I am using the client properties of the components
to pass the information from the xml file to an extended SwingEngine. However, I
think a better solution would be to add a plug-in system to the parser. This
way, one can write plugins that will set-up model data, or controller logic by
using tag values from the xml file. For example one can write a plug-in to
handle this:
<frame>
...
<combobox id="customer-name-combo" model-class="com.acme.MyComboModel"
event-handler-class="com.acme.MyItemListener" />
...
</frame>
What I am proposing is something similar to the converters. Rather than
converting values(String) of attributes to objects, one can convert custom
attributes themselves to objects/behaviors. For example, the parser section that
converts unknown attributes into client properties can be made as a plug-in
using an interface similar to this:
public interface
ParserPlugin {
public void handleAttributes(JComponent component, List
attributes);
}
What do you
think?
(*): For the
curious: I am working on a project that requires highly customizable user
interfaces that are bound to a database with (mostly) unknown structure. I am
required to develop dialogs/frames that can do search/filter/updates on the
database and can be plugged into a program, or run as stand-alone applications.
Moreover, most of these components need to be reusable, i.e. a user should be
able to create a dialog for himself by just writing an xml file and maybe adding
one or two java class files to a plugin directory. For example, I have a frame
like this:
<frame>
...
<combo context="filter" table="customers" display-field="company"
/>
<combo context="filter" table="designers" display-field="name"
/>
<label text="Design Index:" /> <textfield
context="filter" table="designs" field="designindex" />
...
<list id="design.list" context="filter" controls-context="display"
controller-class="com.acme.ComponentUpdater" />
....
<label text="Created On:" /> <label context="display"
table="designs" field="createdon" />
...
<button controls-context="filter"
text="Filter" controller-class="com.acme.ResultListUpdater" controller-param="design.list"
/>
...
</frame>
Which basically does
this: When the dialog comes up, the first two combo boxes are filled in with
available values (primary keys, and displayed values) from their corresponding
tables. Then the user can select these values, or enter a design index in the
text field, all of which makes up a query. When the "filter" button is pressed
it signals the controller-class with the parameter "controls-context".
controller class goes through all the components in the context="filter", makes
up the query, and fills in the JList with id=result.list. If user selects one of
those entries, the controller-class (ComponentUpdater) of the list object
traverses all the components in context="display" and updates their values from
the database that are related to that selection.
It is a bit complex,
and I am trying to simplify it. Suggestions, comments are
welcome.
Ozben Evren
Software Engineer
Dimensional Impressions
(818) 379 7039 x19
------------------------------------
I love deadlines. I especially like the whooshing
sound they make as they go flying by. -Douglas Adams