Re: SwiXML robustitude

Chuck Dillon <[email protected]> Fri, 14 Jan 2005 09:51:46 -0600
Newsgroups gmane.comp.embedded.carlsbad-cubes
Organization NimbleGen Systems Inc.
Message-ID <[email protected]>
Frank Meissner wrote:
>>>
>>>> Q5) How well does it support GUI glue functionality?  ...  Can 
>>>> object A reference object B in the XML?
>>>
>>> This is not a builitin facility in swixml. You may try to solve this 
>>> through
>>> custom converters, but I'm not sure whether this is possible...
>>
>> Unfortunate, it would be a powerful feature.
> 
> 
> But not that easy to implement if the requirements are somewhat 
> advanced. E.g. I had the problem I wanted to disable a button if the 
> number of lines is less than one. This is not that trivial (describable 
> in XML) but perhaps it's out of your intended scope...

Let me preface the following comments with admitting I'm basing them on 
limited information about SwiXML.  I've been looking at the samples and 
browsing the JavaDoc.  But since I can't find any detail functional 
description of it's capabilities I'm assuming what's in the samples is 
what there is.

 From the samples it appears the XML references Java Objects by name 
using tags like "id" and "action".  This direct reference by name is a 
useful feature but if it is the only way to bind the XML to the code it 
is too limiting IMHO.  It forces me to mirrow the GUI structure with 
Java code which has marginal utility.  What is needed is an indirect 
way of referencing objects so that I don't need Java code that shadows 
the GUI structure.  I want to be able to build the majority of my 
action code so that it can be applied to the GUI by indirect reference 
so that my business logic is as agnostic as possible about the GUI.

What I'm suggesting is that the engine needs an indirect way to revolve 
what tags like "id" and "action" are referring to.  I envision the 
SwingEngine class (or something within) to have a methods  like:
  - registerActionClass(String nameToBeUsedInXML,Class class)
  - registerActionInstance(String nameToBeUsedInXML,AbstractAction action)
  - registerDataObject(String nameToBeUsedInXML,Object object)
Then I can create an action class or instance or a data object, 
register it and use it whereever I want in the GUI.  I'm not seeing 
this kind of capability.  Is it there?

Another powerful feature would be a means of specifying data to be 
passed to actions in the XML.  The API could, for example, include an 
extension of ActionEvent that carries a payload of data defined in XML. 
  It could be as simple as a Properties object.

In the Java code I do:
   engine.registerActionClass("changefg",ForegroundChanger.getClass());
   engine.registerDataObject("blue",Color.blue);
In the XML I specify a button:
   <solelabel Foreground="green">Some Label</label>
   <button enabled="true" Action="changefg(somelabel,blue)"/>

The action declares that an instance of "changefg" class should be 
created and a reference to the "somelabel" label and the "blue" data 
object should be passed to it via a SwiXMLActionEvent, or some such.

The above wouldn't be difficult to implement.  What's needed is a few 
hashes, a definition of the precedence of each possible class of things 
that can be referenced and logic to do the lookups in order of 
precedence.  The event could simply hold a Properties object or a hash 
containing the objects declared in the XML and what they resolved to.

It's also useful to allow declaration of multiple action handlers.

One last, extrememly useful, feature would be to add Swing object 
create time actions...
   <button enabled="true" Action="whatever" Create="registerAsAThingy"/>
The Create attribute is like Action except that it gets "fired" 
immediately after the button is created.  What this does is saves the 
applications code from having to lookup a bunch of GUI objects by name. 
  It reduces the direct litereal String references in the Java code and 
can save a lot of code.


> 
>>
>> How does SwiXML support things like radio button groups without such a 
>> utility?
> 
> 
> Groups of radio buttons *are* supported. There is no magic (or, at 
> least, not much ;)) ...

So in XML I can declare a container with CheckBoxes in it.  And IN XML 
I can declare a ButtonGroup and the CheckBoxes I want it to control. 
As separate XML declarations?  IOW, in the ButtonGroup declaration I 
can reference the CheckBox objects declared elsewhere in XML?

Thanks for the information.  Sorry if all of the above is already there 
and I'm just missing it.

-- ced

> 
> Frank


-- 
Chuck Dillon
Senior Software Engineer
NimbleGen Systems Inc.