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*