I only wish Java had an one-line reorder function. (Or has it?)

I was (like you, ningdh) very irritated by said behavoir. My wish would be that we could use "add" both to add existing properties (but, for the one or other reason, like "has only a getter", non-showing) and not-property-blocks. Mh, maybe I should open an issue for that.

Tobias

Jonathan Barker schrieb:
DH,

For anything the least bit complicated, I do it in Java.

@Inject
BeanModelSource _bms;

@Cached
public BeanModel getBeanModel(){
        BeanModel model = _bms.create(User.class, false, _bms);
        model.include("username");
model.add("location").sortable(true); return model;
}


It has the side-benefit of keeping your templates cleaner - especially as
the lists to include / exclude get longer.

Also, have you tried using @NonVisual to hide what you want to hide?  I
haven't really used it, but it might suit your needs.

Jonathan


-----Original Message-----
From: ningdh [mailto:[EMAIL PROTECTED]
Sent: Sunday, April 20, 2008 11:21 AM
To: Tapestry users
Subject: Re: T5: Is there a simple way to display property of embedded
instance in Grid?

Thank you, Tobias and Jonathan, especially for Tobias's detailed work.

I find include and add can't use together, because properties of 'add'
will be flushed and cleared by 'include' later, and this can be traced
from source code of BeanModelUtils. For example, I want to show 'username'
and 'city' of the user, so I write: include="username" add="location_city"
and add t:parameter to "location_city", but in the table I can only get
'username' column. But if I remove include section, all the user
information and city will be shown.

Now I can use exclude and username to get what I need, but that would be
annoying to write so much longer exclude expression.

So is it a known issue?

Thanks.
DH
----- Original Message -----
From: "Jonathan Barker" <[EMAIL PROTECTED]>
To: "'Tapestry users'" <users@tapestry.apache.org>
Sent: Saturday, April 19, 2008 11:26 AM
Subject: RE: T5: Is there a simple way to display property of embedded
instance in Grid?


I'll add to this and say that if you want sorting behavior, you can
implement Comparable and Comparator (I don't remember which you need - I
tend to implement both), and add "location" to your model.

IIRC, you will need to build your model in code to say that the
"location"
column is sortable.


Jonathan


-----Original Message-----
From: Tobias Wehrum [mailto:[EMAIL PROTECTED]
Sent: Friday, April 18, 2008 5:20 AM
To: Tapestry users
Subject: Re: T5: Is there a simple way to display property of embedded
instance in Grid?

Hi DH,

it would be:

-----------------------------------------------------------------------
<table t:type="grid" t:source="userSource" row="currentUser"
add="location_city">
    <t:parameter name="location_citycell">
${currentUser.location.city}
    </t:parameter>
</table>
-----------------------------------------------------------------------

(Note the "add" instead of include - you want to add something not
already
existing, not include something.)

On your page you have to define

-----------------------------------------------------------------------
@Parameter
User userSource;
-----------------------------------------------------------------------

to keep track of the current grid object.
So much for the first method.


If you want to have to have a Location always represented as a String
containing its city toString():

-----------------------------------------------------------------------
class Location {
// [...]
public String toString() {
return city;
}
}
-----------------------------------------------------------------------

Now you have to define a Translator for Tapestry (I use a template for
all
classes which implement toString()):

-----------------------------------------------------------------------
public class ModelTranslator<ModelClass> implements
Translator<ModelClass>
{

   public Class<ModelClass> getType() {
       return null;
   }

   public ModelClass parseClient(String arg0, Messages arg1)
           throws ValidationException {
       throw new ValidationException("ModelTranslator cannot
implement parseClient()");
   }

   public String toClient(ModelClass arg0) {
       return arg0.toString();
   }

}
-----------------------------------------------------------------------

Now you only have to announce your Translator in to your
AppModule.java:
-----------------------------------------------------------------------
    @SuppressWarnings("unchecked")
    public static void
contributeDefaultDataTypeAnalyzer(MappedConfiguration<Class, String>
configuration) {
    configuration.add(User.class, "user");
    }

    @SuppressWarnings("unchecked") {
    configuration.add("user", new ModelTranslator<User>());
    }
-----------------------------------------------------------------------

...and after doing this, you have to do exactly *nothing* to add it to
your grid - it will do so per default. :)

Tobias


dhning schrieb:

Hi, Tobias

Thanks for reply.

I am newbie of customizing grid component.
I guess what you mean like this?:
<table t:type="grid" t:source="userSource" include="location_city">
    <t:parameter name="location_cityheader">
    </t:parameter>
    <t:parameter name="location_citycell">
    </t:parameter>
</table>

But exception message still exists: "Bean editor model for User does
not
contain a property named 'location_city'".
Thanks!

DH


----- Original Message -----
From: "Tobias Wehrum" <[EMAIL PROTECTED]>
To: "Tapestry users" <users@tapestry.apache.org>
Sent: Friday, April 18, 2008 4:20 PM
Subject: Re: T5: Is there a simple way to display property of
embedded
instance in Grid?

Hi DH,

you can teach Location a standard way to be outputted by overwriting
the
toString() function of Location.

Now you can output the String returned by toString() simply by
including
"location".

If you want to output different properties of Location and not in
one
cell, I think you will have to add location_city, location_street
etc
and implement <t:parameter> blocks for it.

Hope that helps,
Tobias

dhning schrieb:

Hi, All

Case: A user own a location while the location is comprised of
city,
street...
public class User {
  private Location location;
  // setter & getter
}
public class Location {
  private String city;
 // setter & getter
}

In the user list page, I want to display the city as one column in
Grid.
But it doesn't work like this <table t:type="grid"
t:source="userSource" include="location.city"></table>.
The exception message is "User does not contain a property named
'location.city'".
Is there a simple way to implement such function?

Thanks in advance.
DH

--------------------------------------------------------------------
-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]




---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]




---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to