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 >>> >>> >> >