I think I may have circumnavigated this issue by discovering the wonders of AjaxEditableLabel and AjaxEditableChoiceLabel :D
I'll post my results when I've tested it. Hopefully this will be helpful to somebody else in the future. On Wed, Oct 27, 2010 at 10:59 AM, Mark Doyle <markjohndo...@googlemail.com>wrote: > Of course, here is the entire Panel constructor: > > private DropDownChoice<String> dropdown; > > public AjaxDropDownChoicePanel(String id, IModel<String> model, > IModel<List<String>> choicesModel) { > super(id); > System.out.println("dropdown model = " + model.getObject()); > > dropdown = new DropDownChoice<String>("dropdown", model, choicesModel); > dropdown.setOutputMarkupId(true); > dropdown.add(new AjaxFormComponentUpdatingBehavior("onchange") { > private static final long serialVersionUID = 1L; > > protected void onUpdate(AjaxRequestTarget target) { > dropdown.setEnabled(false); > System.err.println("Not yet implemented but you selected " + > dropdown.getDefaultModelObjectAsString()); > target.addComponent(dropdown); > } > }); > add(dropdown); > } > > On Wed, Oct 27, 2010 at 4:54 AM, Jeremy Thomerson < > jer...@wickettraining.com> wrote: > >> 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* >> > >