Show the code for the dropdownchoice creation (in your panel)

On Tue, Oct 26, 2010 at 6:14 PM, Mark Doyle <markjohndo...@googlemail.com>wrote:

> I suppose this is related so I'll keep the thread going.
>
> As part of the above use case I have created a custom PropertyColumn that
> uses a DropDownChoice.
>
> Everything seems to be working except for the initial display, this is
> always set to "Choose One".
>
> The code that builds the dropdown is in the populateItem method of the
> custom Property Column.  As you can see it has a model set (propertyModel)
> which wraps a String.
>
> PropertyModel<String> propertyModel = new PropertyModel<String>(rowModel,
> getPropertyExpression());
> System.out.println("propertyModel value = " + propertyModel.getObject());
> AjaxDropDownChoicePanel cp = new AjaxDropDownChoicePanel(componentId,
> propertyModel, selectionOptionsModel);
>
> The AjaxDropDownChoicePanel is simply a panel that wraps the DropDown in a
> some select tags.  It instantiates a DropDownChoice with the passed in
> parameters.  The DropDownChoice is instantiated is of type String, that
> is, DropDownChoice<String>.
>
> NOTE: The syso is printing the expected value.
>
>
>
> On Sat, Oct 23, 2010 at 10:18 PM, James Carman
> <ja...@carmanconsulting.com>wrote:
>
> > Use a fragment.  Search this list for my FragmentColumn.  I think I've
> > posted it before
> > On Oct 23, 2010 4:04 PM, "Mark Doyle" <markjohndo...@googlemail.com>
> > wrote:
> > > Ok, I've nearly got this finished.
> > >
> > > Does anybody know how to add a link in populateItem() that doesn't
> render
> > as
> > > "[cell]"? I could create a customised Panel I suppose but it seems like
> > > overkill.
> > >
> > > Maybe a fragment...hmmm
> > >
> > >
> > > On Fri, Oct 22, 2010 at 11:56 AM, Mark Doyle
> > > <markjohndo...@googlemail.com>wrote:
> > >
> > >> Oh and the table isn't the parent:
> > >>
> > >> // get the table to rerender
> > >> target.addComponent(this.getParent());
> > >>
> > >> I had to do a six step "parental grab"; I'm sure there is a better
> way!
> > :D
> > >>
> > >>
> > >>
> > >> On Fri, Oct 22, 2010 at 11:54 AM, Mark Doyle <
> > markjohndo...@googlemail.com
> > >> > wrote:
> > >>
> > >>> Thanks Mike, this was definitely a great pointer in the right
> > direction;
> > >>> I'm beginning to grasp the column system now.
> > >>>
> > >>> I do have some issues though as detailed below.
> > >>>
> > >>> Firstly, my business model is out of my control so I had to wrap that
> > in
> > a
> > >>> class that contains the editable state. I don't like doing that it
> but
> > it's
> > >>> useful to see if I can get it to work and it shouldn't effect the
> > process on
> > >>> the whole.
> > >>>
> > >>> The main difference is I'm attempting to do this using different
> > columns,
> > >>> that is, not having a custom column that takes a type and switches.
> The
> > >>> problem is that the models for each column seem to wrap different
> > instances
> > >>> of the business object.
> > >>>
> > >>> The code below shows how I'm creating the columns. The link in the
> > >>> AbstractColumn grabs the business object and toggles editable.
> > >>> The EditablePropertyColumn's populateItem method then get's it's
> > rowModel
> > >>> object (the business object) and checks the editable state. This is
> > where
> > >>> it goes wrong as each column seems to have it's own copy of the rows
> > >>> business model object. I guess this is how the columns with with
> > datagrid.
> > >>>
> > >>> /**
> > >>> * Creates the columns for the synonym data table
> > >>> *
> > >>> * @return
> > >>> */
> > >>> @SuppressWarnings("serial")
> > >>> private List<IColumn<EditStateSynonymWrapper>> createColumns() {
> > >>> List<IColumn<EditStateSynonymWrapper>> columns = new
> > >>> ArrayList<IColumn<EditStateSynonymWrapper>>();
> > >>>
> > >>> columns.add(new AbstractColumn<EditStateSynonymWrapper>(new
> > >>> Model<String>("Edit")) {
> > >>> public void
> populateItem(Item<ICellPopulator<EditStateSynonymWrapper>>
> > >>> cellItem, String componentId, IModel<EditStateSynonymWrapper> model)
> {
> > >>> AjaxFallbackLink<EditStateSynonymWrapper> editLink = new
> > >>> AjaxFallbackLink<EditStateSynonymWrapper>(componentId, model) {
> > >>> @Override
> > >>> public void onClick(AjaxRequestTarget target) {
> > >>> EditStateSynonymWrapper selected = (EditStateSynonymWrapper)
> > >>> getDefaultModelObject();
> > >>> System.out.println("selected value = " +
> > selected.wrappedSynonym.value);
> > >>> selected.setEditing(!selected.isEditing());
> > >>>
> > >>> // FIXME WHAT!? There must be a better way than this to get the
> parent
> > >>> table. :D
> > >>> MarkupContainer dataTable =
> > >>>
> > getParent().getParent().getParent().getParent().getParent().getParent();
> > >>> target.addComponent(dataTable);
> > >>> }
> > >>> };
> > >>> cellItem.add(editLink);
> > >>> // cellItem.add(new EditLinkFragment(componentId,
> > SynonymAdminPanel.this,
> > >>> model));
> > >>> }
> > >>> });
> > >>>
> > >>> columns.add(new PropertyColumn<EditStateSynonymWrapper>(new
> > >>> Model<String>("Category"), "wrappedSynonym.category"));
> > >>> // columns.add(new
> EditablePropertyColumn<EditStateSynonymWrapper>(new
> > >>> Model<String>("State"),
> > >>> // "wrappedSynonym.state", new PropertyModel<Synonym>(this,
> > "selected")));
> > >>> columns.add(new EditablePropertyColumn<EditStateSynonymWrapper>(new
> > >>> Model<String>("State"), "wrappedSynonym.state"));
> > >>> columns.add(new PropertyColumn<EditStateSynonymWrapper>(new
> > >>> Model<String>("Root"), "wrappedSynonym.root"));
> > >>> columns.add(new PropertyColumn<EditStateSynonymWrapper>(new
> > >>> Model<String>("Value"), "wrappedSynonym.value"));
> > >>> columns.add(new PropertyColumn<EditStateSynonymWrapper>(new
> > >>> Model<String>("Rational"), "wrappedSynonym.rational"));
> > >>> columns.add(new PropertyColumn<EditStateSynonymWrapper>(new
> > >>> Model<String>("Taxonomy parent"), "wrappedSynonym.taxonomyParent"));
> > >>>
> > >>> return columns;
> > >>> }
> > >>>
> > >>>
> > >>>
> > >>> On Thu, Oct 21, 2010 at 3:50 PM, Michael O'Cleirigh <
> > >>> michael.ocleir...@rivulet.ca> wrote:
> > >>>
> > >>>> Hi Mark,
> > >>>>
> > >>>> The cell's of a datatable are created by the IColumn. So you need to
> > >>>> create a wrapping object or additional IModel that contains the
> > edit-ability
> > >>>> of each row and then use that inside the populateItem(...) method of
> > the
> > >>>> column to figure out which case to show (i.e. the label or the
> > textfield).
> > >>>>
> > >>>> One way to persist the change immediately is to use an
> > >>>> AjaxFormComponentUpdatingBehavior on the onblur event of the
> textfield
> > to
> > >>>> push the changes through.
> > >>>>
> > >>>> Do something like this:
> > >>>>
> > >>>> class MyColumn extends AbstractColumn<BusinessObject> {
> > >>>>
> > >>>> public static enum ColumnType { LINK, COL1, COL2 };
> > >>>>
> > >>>> private ColumnType type;
> > >>>>
> > >>>> public MyColumn (IModel<String>header, ColumnType type) {
> > >>>> super (header);
> > >>>> this.type = type;
> > >>>> }
> > >>>> @Override
> > >>>> public void populateItem(Item<ICellPopulator<BusinessObject>>
> > >>>> cellItem,
> > >>>> String componentId, IModel<BusinessObject> rowModel) {
> > >>>>
> > >>>>
> > >>>> switch (this.type) {
> > >>>>
> > >>>> case LINK :
> > >>>> // add in the ajax link to the cell item
> > >>>> // inside the onclick do:
> > >>>> // get the row model object and then set its editable
> > >>>> field.
> > >>>> cellItem.add(new AjaxLink(componentId) {
> > >>>> public void onClick(AjaxRequestTarget target) {
> > >>>> BusinessObject bo =
> > >>>> rowModel.getObject();
> > >>>>
> > >>>>
> > >>>> bo.setEditable(true);
> > >>>> // get the table to rerender
> > >>>> target.addComponent(this.getParent());
> > >>>> }
> > >>>> });
> > >>>>
> > >>>> break;
> > >>>>
> > >>>> case COL1:
> > >>>> case COL2:
> > >>>>
> > >>>> BusinessObject bo = rowModel.getObject();
> > >>>>
> > >>>>
> > >>>> if (bo.isEditable()) {
> > >>>> // this might not work as textfield wants an input
> > >>>> tag but you can put the field on a panel and then add in the panel
> > here.
> > >>>> cellItem.add (new TextField(componentId, )
> > >>>> }
> > >>>> else {
> > >>>> cellItem.add(new Label(componentId, ...)
> > >>>> }
> > >>>>
> > >>>> }
> > >>>>
> > >>>> }
> > >>>> };
> > >>>>
> > >>>> Regards,
> > >>>>
> > >>>> Mike
> > >>>>
> > >>>> Hi all,
> > >>>>>
> > >>>>> I'm having a bit of trouble wrapping my head around the DataTable
> > with
> > >>>>> regards to what I need to do.
> > >>>>>
> > >>>>> The perfect example of my goal is in Wicket Examples, namely, the
> > Ajax
> > >>>>> Editable Tree Table:
> > >>>>> http://wicketstuff.org/wicket14/ajax/tree/table/editable.0
> > >>>>>
> > >>>>> <http://wicketstuff.org/wicket14/ajax/tree/table/editable.0>Rather
> > than
> > >>>>> use
> > >>>>> the Tree table I must alter an existing DataTable. I was thinking
> > that
> > >>>>> I could create an editable textfield for the cells which I could
> > enable
> > >>>>> or
> > >>>>> disable using an edit link in the first column.
> > >>>>>
> > >>>>> A bit like this:
> > >>>>>
> > >>>>> Edit | col1 | col2
> > >>>>> ============
> > >>>>> edit | text | ksfuh
> > >>>>> -------------------------
> > >>>>> edit | text | fsdkl
> > >>>>>
> > >>>>> Using the edit link I can get the model object of the row but I'm
> not
> > >>>>> sure
> > >>>>> how I can get the row that represents this and set it's cells to
> > >>>>> editable.
> > >>>>>
> > >>>>> The Editable text field is much like the one in the example and
> with
> > the
> > >>>>> entire table wrapped in a form. This means I can deal with the
> > >>>>> submission
> > >>>>> of the changes easy enough.
> > >>>>>
> > >>>>>
> > >>>>> Perhaps this is the wrong way to go about it....hmmm, thoughts?
> > >>>>>
> > >>>>>
> > >>>>
> > >>>>
> ---------------------------------------------------------------------
> > >>>> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
> > >>>> For additional commands, e-mail: users-h...@wicket.apache.org
> > >>>>
> > >>>>
> > >>>
> > >>
> >
>



-- 
Jeremy Thomerson
http://wickettraining.com
*Need a CMS for Wicket?  Use Brix! http://brixcms.org*

Reply via email to