Great approach! Is that representative of what your BXML->Java compiler 
generates? I really like how it uses anonymous inner classes as the "builder" 
mechanism.

On Dec 27, 2010, at 7:41 AM, calathus wrote:

> Greg,
> I considered implementing Pivot builder in Scala following scala-squib, but I 
> found a few issues for this type of approach.
> Basically, it will depend on more runtime binding, so it will reduce the 
> advantage of statically typed language.
> After I implemented bxml to Java converter, it became clear that the 
> translation can be done more directly reflecting the original BXML structure, 
> also without using variable in translated Java codes.
> 
> For example,  detail_pane.bxml can be translated in Java as following. This 
> style may be used instead of BXML.
> Do you have any opinion for this approach?
> 
>     public static Object getComponent() {
>         try {
>             return new BoxPane() {{
>                 setOrientation(Orientation.VERTICAL);
>                 setStyles("{fill:true}");
>                 add(new Label() {{
>                     setTextKey("companyName");
>                     setStyles("{font:{size:12, bold:true}}");
>                 }});
>                 add(new Separator() {{
>                 }});
>                 add(new Form() {{
>                     setStyles("{padding:0, fill:true, showFlagIcons:false, 
> showFlagHighlight:false,         leftAlignLabels:true}");
>                     getSections().add(new Form.Section() {{
>                         final ValueMapping valueMapping_5 = new 
> ValueMapping();
>                         final ChangeMapping changeMapping_6 = new 
> ChangeMapping();
>                         final VolumeMapping volumeMapping_7 = new 
> VolumeMapping();
>                         add(new Label() {{
>                             setTextKey("value");
>                             setTextBindMapping(valueMapping_5);
>                             setStyles("{horizontalAlignment:'right'}");
>                             Form.setLabel(this, "value");
>                         }});
>                         add(new Label() {{
>                             setTextKey("change");
>                             setTextBindMapping(changeMapping_6);
>                             setStyles("{horizontalAlignment:'right'}");
>                             Form.setLabel(this, "change");
>                         }});
>                         add(new Label() {{
>                             setTextKey("openingValue");
>                             setTextBindMapping(valueMapping_5);
>                             setStyles("{horizontalAlignment:'right'}");
>                             Form.setLabel(this, "openingValue");
>                         }});
>                         add(new Label() {{
>                             setTextKey("highValue");
>                             setTextBindMapping(valueMapping_5);
>                             setStyles("{horizontalAlignment:'right'}");
>                             Form.setLabel(this, "highValue");
>                         }});
>                         add(new Label() {{
>                             setTextKey("lowValue");
>                             setTextBindMapping(valueMapping_5);
>                             setStyles("{horizontalAlignment:'right'}");
>                             Form.setLabel(this, "lowValue");
>                         }});
>                         add(new Label() {{
>                             setTextKey("volume");
>                             setTextBindMapping(volumeMapping_7);
>                             setStyles("{horizontalAlignment:'right'}");
>                             Form.setLabel(this, "volume");
>                         }});
>                     }});
>                 }});
>             }};
>         } catch (Exception e) {
>             e.printStackTrace();
>             throw new RuntimeException(e);
>         }
>     }
> 
> -----
> detail_pane.bxml
> 
> <BoxPane orientation="vertical" styles="{fill:true}"
>     xmlns:bxml="http://pivot.apache.org/bxml";
>     xmlns:stocktracker="org.apache.pivot.tutorials.stocktracker"
>     xmlns="org.apache.pivot.wtk">
>     <Label textKey="companyName" styles="{font:{size:12, bold:true}}"/>
> 
>     <Separator/>
> 
>     <Form styles="{padding:0, fill:true, showFlagIcons:false, 
> showFlagHighlight:false,
>         leftAlignLabels:true}">
>         <Form.Section>
>             <bxml:define>
>                 <stocktracker:ValueMapping bxml:id="valueMapping"/>
>                 <stocktracker:ChangeMapping bxml:id="changeMapping"/>
>                 <stocktracker:VolumeMapping bxml:id="volumeMapping"/>
>             </bxml:define>
> 
>             <Label bxml:id="valueLabel" Form.label="%value"
>                 textKey="value" textBindMapping="$valueMapping"
>                 styles="{horizontalAlignment:'right'}"/>
>             <Label bxml:id="changeLabel" Form.label="%change"
>                 textKey="change" textBindMapping="$changeMapping"
>                 styles="{horizontalAlignment:'right'}"/>
>             <Label bxml:id="openingValueLabel" Form.label="%openingValue"
>                 textKey="openingValue" textBindMapping="$valueMapping"
>                 styles="{horizontalAlignment:'right'}"/>
>             <Label bxml:id="highValueLabel" Form.label="%highValue"
>                 textKey="highValue" textBindMapping="$valueMapping"
>                 styles="{horizontalAlignment:'right'}"/>
>             <Label bxml:id="lowValueLabel" Form.label="%lowValue"
>                 textKey="lowValue" textBindMapping="$valueMapping"
>                 styles="{horizontalAlignment:'right'}"/>
>             <Label bxml:id="volumeLabel" Form.label="%volume"
>                 textKey="volume" textBindMapping="$volumeMapping"
>                 styles="{horizontalAlignment:'right'}"/>
>         </Form.Section>
>     </Form>
> </BoxPane>
> 
> On Tue, Dec 21, 2010 at 11:06 AM, calathus <[email protected]> wrote:
> Greg,
> There were a few questions, and I did not have investigated these lines much, 
> so I searched the similar projects.
> 
> For the CRUD stuff, I will answer later. 
> 
> For the Scala Pivot builder approach, as you and Clint suggested, I was 
> thinking something similar o Gvoovy's SwingBuilder approach.
> Right now, Scala 2.8.1's scala.swing library is not taking this type of 
> builder approach. So I looked for some other library.
> I found squib project:
> http://code.google.com/p/scala-squib/
> 
> 
> Unfortunately, Scala is still evolving language, this squid project could not 
> be compiled in the latest 2.8.1, but with a few code changes, I could 
> resolved these errors. (but somehow how, running demo did not work with ant)
> 
> So If we change Swing API to Pivot API, we will be able to have similar 
> builder.
> Here is a sample code from the squib project:
> 
> import java.awt.GridBagConstraints._
> import java.beans.{PropertyChangeListener, PropertyChangeEvent}
> import java.lang.reflect.Method
> import javax.swing._
> import javax.swing.event._
> 
> import scala.reflect.BeanProperty
> 
> import net.miginfocom.swing.MigLayout
> 
> package tfd.scala.squib.demo {
> 
> import tfd.scala.squib._
> import tfd.scala.squib.event._
> 
>  object RGBSliders extends Application {
>     class RGBCanvasComponent extends JComponent {
>         private var red:Int = 0
>         private var green:Int = 0
>         private var blue:Int = 0
>         
>         def setRed(value:Int) = {
>             if (value != red) {
>                 red = value
>                 repaint()
>             }
>         }
>         
>         def setGreen(value:Int) = {
>             if (value != green) {
>                 green = value
>                 repaint()
>             }
>         }
>         
>         def setBlue(value:Int) = {
>             if (value != blue) {
>                 blue = value
>                 repaint()
>             }
>         }
>            
>         override def paint(g: Graphics):Unit = {
>             g.setColor(new Color(red, green, blue))
>             val d = getSize()
>             g.fillRect(0,0, d.width, d.height)
>         }
>     }
>     
>     object rgbcanvas extends BuiltComponent[RGBCanvasComponent] {
>         def newComponent = new RGBCanvasComponent()
>     }
>     
>     lazy val rgb = rgbcanvas.id("rgbcanvas")
>     
>     frame(
>             'title->"RGB Selector",
>             'visible -> true,
>             'defaultCloseOperation -> JFrame.EXIT_ON_CLOSE,
>             'layout -> new MigLayout("fill, wrap 3", "align right, grow", 
> "align top, grow"),
>             contents(
>                  label("Red:"),
>                  slider("red", 'maximum -> 255, 'minimum-> 0, 'value->0, 
> sliderValueChanged(&rgb.setRed)),
>                  rgbcanvas("rgbcanvas",
>                                'preferredSize -> new Dimension(100,100),
>                                'red -> 0,
>                                'green -> 0,
>                                'blue -> 0
>                  ) -> "spany 3",
>                  label("Green:"),
>                  slider("green", 'maximum -> 255, 'minimum-> 0, 'value->0, 
> sliderValueChanged(&rgb.setGreen)),
>                  label("Blue:"),
>                  slider("blue", 'maximum -> 255, 'minimum-> 0, 'value->0, 
> sliderValueChanged(&rgb.setBlue))                
>             )
>     ).pack
>  }
> }
> 
> 
> On Mon, Dec 20, 2010 at 6:04 AM, Greg Brown <[email protected]> wrote:
> As Chris mentioned, Pivot does not currently provide a BXML to Java compiler. 
> We actually prototyped one a while back, but it was never completed due to 
> other priorities.
> 
> Generating byte code from BXML might be tough, but converting it to a Java 
> source file would probably be pretty easy. Let me know if you are interested 
> in trying to write something like this - I would be happy to try to help when 
> I can.
> 
> G
> 
> On Dec 19, 2010, at 10:26 PM, calathus wrote:
> 
> > Hi,
> > I'm looking for a tool to convert bxml file to equivalent Java source 
> > program.
> > Are there such tools?
> >
> > I just started using pivot, but many of sample is based on bxml.
> > I think in order to develop a UI library with Java generic class, XML file 
> > based approach is not appropriate.
> >
> > And xml based approach will reduce static error detection capability.
> > I liked to see  more examples using  Java classes to define GUI without 
> > relying on bxml files.
> >
> > --
> > Cheers,
> > calathus
> >
> >
> >
> 
> 
> 
> 
> -- 
> Cheers,
> calathus
> 
> 
> 
> 
> 
> 
> -- 
> Cheers,
> calathus
> 
> 
> 

Reply via email to