Greg, How/when can event listeners be removed (to avoid "memory leaks"/"loitering objects")? Flex has a robust component lifecycle, I don't remember Pivot having a component lifecycle model at all (and neither does Swing, except for Window, you have to bolt it on yourself). I think I'd rather see the whole model at once, I suppose in 1.5.
I'm a HUGE fan of what you are trying to do, but maybe it should wait? OTOH, you know you are going to have initialize(), maybe that's a good start. On the third hand, if you add preInitialize() later (like Flex), then existing initialize() calls aren't broken exactly, but when things happen may shift and be a surprise. Michael Bushe Software Architect/Developer [email protected] www.bushe.com On Wed, Dec 30, 2009 at 9:14 PM, Greg Brown <[email protected]> wrote: > FYI, though it wasn't mentioned in the commit message, this change also > included a minor addition/change to the org.apache.pivot.wtkx package. This > change is relatively insubstantial but should actually have a significant > impact on "real" application development. > > Some background: In Flex, MXML files are compiled to classes. So, this file > generates a class named MyVBox: > > MyVBox.mxml: > > <mx:VBox initialize="onInitialize()" > xmlns:mx="http://www.adobe.com/2006/mxml"> > <mx:Script> > public function onInitialize():void { > // Wire up event handlers, etc. > } > > public function onMyButtonClick():void { > // Respond to button click > } > </mx:Script> > > <mx:Button id="myButton" label="Click Me" click="onMyButtonClick()"/> > </mx:VBox> > > I can then use that class as a component in other MXML files (for example, > I could add it to a tab pane, or "TabNavigator" in Flex). > > In Pivot, something similar could be done with the following WTKX: > > my_box_pane.wtkx: > > <BoxPane orientation="vertical" > xmlns:wtkx="http://pivot.apache.org/wtkx" > xmlns="org.apache.pivot.wtk"> > <wtkx:script> > function myButtonClicked() { > // Respond to button click > } > </wtkx:script> > > <PushButton wtkx:id="myButton" buttonData="Click Me" > ButtonPressListener.buttonPressed="myButtonClicked()"/> > </BoxPane> > > We can then include my_box_pane.wtkx into a TabPane declared in another > WTKX file. However, Pivot didn't have an equivalent of onInitialize(). If > the root element is a Window, we could listen for windowOpened(), but > otherwise we're stuck. > > Also, it becomes more complex when we want to associate Java code with WTKX > includes, rather than putting the logic in script. This is something any > non-trivial application is going to want to do, and Pivot didn't provide an > easy way to do it. The change I checked in attempts to solve these two > problems. We can't use WTKX to define new classes, but we can use WTKX to > instantiate classes we have defined elsewhere. For example: > > MyBoxPane.java: > > public class MyBoxPane extends BoxPane implements Bindable { > @WTKX private PushButton myButton = null; > > public MyBoxPane() { > super(Orientation.VERTICAL); > } > > @Override > public void initialize() { > myButton.getButtonPressListeners().add(new ButtonPressListener() > { > public void buttonPressed(Button button) { > // Respond to button click > } > }); > } > } > > Using this approach, the updated my_box_pane.wtkx would look like this: > > my_box_pane.wtkx: > > <foo:MyBoxPane orientation="vertical" > xmlns:wtkx="http://pivot.apache.org/wtkx" > xmlns:foo="com.foo" > xmlns="org.apache.pivot.wtk"> > <PushButton wtkx:id="myButton" buttonData="Click Me"/> > </foo:MyBoxPane> > > Once WTKXSerializer is done processing foo:MyBoxPane, it sees that it > implements Bindable and bind()s to it. It then calls initialize() to allow > the class to register event listeners and perform any other required > initialization tasks. > > This is a late-breaking change for 1.4, so please let me know ASAP if you > have any questions or concerns. > > G > >
