pivot-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Gerrick Bivins <gbiv...@objectreservoir.com>
Subject Re: [pivot] are there any tools to convert bxml to Java?
Date Tue, 04 Jan 2011 17:47:57 GMT
*+1* for this example!
 I had been thinking about something like this as well to simplify creating
table views for java Beans, ie, dynamically creating the table columns based
on properties. This addresses part of what I was trying to do.
What would really be slick is if that Class parameter in the constructor
could be made Bindable so it could dynamically specified via BXML ala:

...
*<bxml:define>*
*   <Class bxml:id="beanClass">*
*</bxml:define>*
...
*<GenericTableView class="$beanClass" ...>*
...


Gerrick


On Tue, Jan 4, 2011 at 11:11 AM, calathus <calathus@gmail.com> wrote:

>
>
> On Mon, Dec 20, 2010 at 5:54 PM, Greg Brown <gk_brown@verizon.net> wrote:
>
>> > My goal was to create a generic class to support CRUD GUI from a given
>> Java Beans class. Although it is not generic version, Vaadin provides such
>> sample implementation which may be  immediately used for real projects.
>>
>> I'd be interested in learning more about how you envision something like
>> this might work.
>>
>
> Greg,
>
> I created a sample generic  TableView class which can take a parameter bean
> class and using the reflection library, it defines table view's column
> fields. This class is modified from tutorials tableviews sample.
> This is only for demonstration of the generic class approach in Pivot using
> builder class approach.
>
> In general, if we introduce new annotations for entity beans class to
> define more presentation related information (like width of column) , we can
> fine tune the look and feels.
> And the same entity beans can have another JPA annotation from which DB
> scheme can be generated and also some utility (like in netbeans) will allow
> to generate restful API from the entity beans.
>
> So if we define more GUI feature to support CRUD operation as generic class
> library, it become very simple to develop DB based web application.
> There is an  open source project called openxava which has similar
> approach, but its GUI is based on JSP and not so impressive compared to
> other GUI(web) projects.
> The degree of usability of such generic library may not be so general, but
> if there are a lot of entity classes, this type of approach would be quite
> useful.
> Also the pattern of these class may be used as starting point for other
> type of CRUD GUI.
>
> Following is the sample code:
>
>     public static class GenericTableView<T> extends TableView {
>
>      private final Class<T> cls;
>
>      public GenericTableView(final Class<T> cls, final Map<String, Object>
> namespace) throws Exception {
>      this.cls = cls;
>
>             for (final Field field: cls.getFields()) {
>              final String fname = field.getName();
>               getColumns().add(new TableView.Column() {{
>              setName(fname);
>                     setWidth(3, true);
>                     if (fname.equals("flag")) {
>                      setCellRenderer(new TableViewImageCellRenderer() {{
>                      }}); // INSTANCE, name:
> <content:TableViewImageCellRenderer>
>                     } else {
>                      setHeaderData(getCapitalName(fname));
>                     }
>                     System.out.println(">>> fname: "+fname);
>                 }});
>             }
>             getTableViewSortListeners().add(new
> TableViewSortListener.Adapter() {
>                 @Override
>                 @SuppressWarnings("unchecked")
>                 public void sortChanged(TableView tableView) {
>                  tableView.getTableData().setComparator(new
> org.apache.pivot.wtk.content.TableViewRowComparator(tableView));
>                 }
>             });
>         }
>
>      public void add(T... ts) {
>      for (T t: ts) {
>      getTableData().add(t);
>      }
>      }
>
>      static String getCapitalName(String name) {
>      if (name.length() == 0) return name;
>      return Character.toUpperCase(name.charAt(0))+name.substring(1);
>      }
>     }
>
>     static java.util.List<OlympicStanding> createOlympicStandings() throws
> Exception {
>         java.util.List<OlympicStanding> ts = new
> java.util.ArrayList<OlympicStanding>();
>
>         // tableViewSortListeners(): LISTENER_LIST_PROPERTY
>         ts.add(new OlympicStanding() {{
>             setNation("China");
>             setGold(51);
>             setSilver(21);
>             setBronze(28);
>             setFlag(new
> URL("file:/share/workspace/pivot/tutorials/src/org/apache/pivot/tutorials/tableviews/cn.png"));
>         }}); // INSTANCE, name: <tableviews:OlympicStanding>
>         ts.add(new OlympicStanding() {{
>             setNation("United States");
>             setGold(36);
>             setSilver(38);
>             setBronze(36);
>             setFlag(new
> URL("file:/share/workspace/pivot/tutorials/src/org/apache/pivot/tutorials/tableviews/us.png"));
>         }}); // INSTANCE, name: <tableviews:OlympicStanding>
>         return ts;
>  }
>
>     static Window create() throws Exception {
>         return new Window() {{
>             final Map<String, Object> namespace = new HashMap<String,
> Object>();
>             setTitle("Table Views");
>             setMaximized(true);
>             setContent(new Border() {{
>                 setContent(new ScrollPane() {{
>
>  setHorizontalScrollBarPolicy(ScrollPane.ScrollBarPolicy.FILL);
>                     setView(new
> GenericTableView<OlympicStanding>(OlympicStanding.class, namespace){{
>                         namespace.put("tableView", this);
>
>                         for (OlympicStanding os: createOlympicStandings())
> {
>                      add(os);
>                      }
>                     }}); // INSTANCE, name: <TableView>
>                     // columnHeader(): WRITABLE_PROPERTY
>                     setColumnHeader(new TableViewHeader() {{
>
>  setTableView((TableView)namespace.get("tableView"));
>                         setSortMode(TableViewHeader.SortMode.MULTI_COLUMN);
>                      }}); // INSTANCE, name: <TableViewHeader>
>                 }}); // INSTANCE, name: <ScrollPane>
>             }}); // INSTANCE, name: <Border>
>             CodeEmitterRuntime.initialize(this, namespace);
>         }};
>     }
>
>
>
>>
>> > I wondered if Pivot is really designed to support normal Java class
>> based GUI implementation.
>>
>> It most certainly is.  :-)  BXML is just a shortcut to coding your UI by
>> hand. Anything you can do in BXML, you can do in Java (though, in many
>> cases, not quite as conveniently).
>>
>> > Regarding to the translator, since there is no detail sample how to use
>> these Java API directly, it would be helpful if we have such bxml to Java
>> translator.
>> > But ideally, Pivot site should include more detailed sample/explanation
>> for Java Pivot API based approach(without bxml). Then we would not need such
>> a tool.
>>
>> If you read the BXML Primer, you should have a good understanding of how
>> BXML maps to Java. There's no magic to it - it is very straightforward.
>>
>> > Also if we may really have declarative GUI design, using Scala may be
>> more attractive way. Scala would allow declaring GUI in equivalent code side
>> as BXML.
>>
>> I'm not sure how this would work. Scala is conceptually more akin to Java
>> than markup. Could you elaborate?
>>
>> > BTW, I still wonder where the following code went wrong.  I would
>> appreciate your suggestion for the following code(java verson of
>> custom_table_view.bxml).
>> > When it is run, it opens the applet window, but it does not show
>> anything.
>>
>> Two errors:
>>
>> - You need to call border.setContent(scrollPane), not
>> border.add(scrollPane).
>>
>> - You need to call scrollPane.setView(tableView). Otherwise, the scroll
>> pane won't know what it's content is.
>>
>> I made these changes and the app worked fine.
>>
>> G
>>
>>
>>
>
>
> --
> Cheers,
> calathus
>
>
>
>

Mime
View raw message