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

Reply via email to