Gang,
I am working on a demo of Qi4j + Swing, and looking at how to do widget 
bindings.

Let's say we have;

public interface Person
{
    Property<String> firstName();
    Property<String> lastName();
    Property<Address> address();
}
public interface Address
{
    Property<String> line1();
    Property<String> line2();
  :
}

// Swing "as usual"
public class PersonPanel extends JPanel
{
    public PersonPanel( StateModel<Person> model )
    {
        TextField tf1 = new TextField();
        add( tf1 );
        model.bind( model.firstName() ).to( tf1 );

        TextField tf3 = new TextField();
        add( tf3 );
        model.bind( model.address().get().line1() )
            .to( tf3 );
    }
}

Right now the StateModel is a normal class that needs to be created with the 
ObjectBuilder, but we are planning to make it into a Composite instead.

Additionally, there are SwingAdapters which are responsible for the actual 
binding, and the requirements of those are;

 * implement SwingAdapter
 * be ServiceComposites
 * be visible from where the StateModel is used.

The SwingAdapter looks like this;

public interface SwingAdapter
{
    Set<Pair> canHandle();

    void fromSwingToProperty( JComponent component, Property<?> property );

    void fromPropertyToSwing( JComponent component, Property<?> property );

    public class Pair
    {
        public Class<? extends JComponent> component;
        public Class<?> propertyType;

        public Pair( Class<? extends JComponent> component, 
                     Class<?> propertyType )
        {
            this.component = component;
            this.propertyType = propertyType;
        }
    }
}

All SwingAdapters will be looked up in the "bind" phase, and asked for which 
type and component combinations they can handle.


The "use"-phase is when a Person instance is set to the StateModel, such as;

StateModel<Person> model = .... ;
PersonPanel panel = new PersonPanel( model );
:
:
model.use( somePerson );
:
:
model.use( someOtherPerson );


Changes to the Property instance in "Person" will occur on focusLost events. 
There are no buffering, as it is expected that all objects modified are 
backed by a UnitOfWork.


We don't want to commit the code to trunk, since trunk is unstable at the 
moment and the small sample can't be run. That is just a matter of... days?
Until then, I will fix up Associations and ManyAssociations.

Ok folks, WDYAT??


This will all end up in a library, and this is a perfect project for YOU to 
get your hands dirty, since a lot of work is needed for the binding adapters.


Cheers
-- 
Niclas Hedhman, Software Developer

I  live here; http://tinyurl.com/2qq9er
I  work here; http://tinyurl.com/2ymelc
I relax here; http://tinyurl.com/2cgsug

_______________________________________________
qi4j-dev mailing list
[email protected]
http://lists.ops4j.org/mailman/listinfo/qi4j-dev

Reply via email to