Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GWT CellTable, disable ButtonCell when clicked

I'm pretty new to GWT, but I've been making pretty fast progress until now.

I have a cell table, most of which is read only data returned from an RPC.

I have two columns in the cell table that the user can interact with. One is a TextInputCell, one is a ButtonCell.

When the user clicks the ButtonCell, i want to send the value in the TextInputCell for that row to an RPC.

I have all this working.

The part I cannot get to work is that when the button (ButtonCell) is clicked, I want to disable the button in that row until the RPC returns, and then re-enable it. I also want to clear the text in the input cell for that row when the RPC returns.

I cannot figure out how to get handles to the actual ButtonCell object that was clicked or the TextInputCell to monkey with them.

Any help appreciated.

bq

like image 622
user1128157 Avatar asked Jan 03 '12 15:01

user1128157


2 Answers

The problem is that there's no object for the button that was clicked. Your ButtonCell creates HTML that renders buttons - every button in the whole column was written by the same button cell, but there's no java object associated with them.

To disable the button directly, you'll have to first create a handle to it. You could do this by rendering an id in the html your ButtonCell creates, and then getting the element by id from the DOM.

What I do in a similar case is just re-render the entire table when there's a state change. It doesn't take that long, and you don't need to store any references (the whole reason you're using CellTable instead of Grid anyway). When you know your button should be disabled, you just render it disabled.

Both of these suggestions would require you to subclass your Cell objects so that you can do some custom rendering. It's not very difficult, but wrapping your head around the order of operations can be confusing. Good luck!

PS: If you just want to disable the button (and not empty the text field), I think onBrowserEvent gives you a handle to the Element that was clicked - you might be able to use that to disable it.

like image 110
Riley Lark Avatar answered Oct 03 '22 19:10

Riley Lark


I have gone through this problem, but eventually I solved it.

check this code

package com.ex7.client;

import com.google.gwt.cell.client.ButtonCell;
import com.google.gwt.cell.client.ValueUpdater;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;

public class CWButton extends ButtonCell {
    private int row = -1;
    private String alternativevalue;
    private String exTitle = "";

    private String value;
    private String title = "";

    public CWButton( ) {
        super();

    }

    @Override
    public void render(com.google.gwt.cell.client.Cell.Context context,
            String src, SafeHtmlBuilder sb) {

        if (row == -1) {
            sb.appendHtmlConstant("<button   title='" + title + "'  >" +value+"</button>");
            return;
        }

        if (row != context.getIndex()) {

            sb.appendHtmlConstant("<Button   disabled='disabled'   title='" + title + "'  >"+ value+"</button>");
        } else {
            sb.appendHtmlConstant("<button    title='" + exTitle + "' >"+ alternativevalue+"</button>");
        }

    }

    @Override
    public void onBrowserEvent(com.google.gwt.cell.client.Cell.Context context,
            Element parent, String value, NativeEvent event,
            ValueUpdater<String> valueUpdater) {

        if (row == -1 || row == context.getIndex()) {
            super.onBrowserEvent(context, parent, value, event, valueUpdater);
            return;
        }

    }

    public void setTitle(String title) {

        this.title = title;
    }

    public int getRow() {
        return row;
    }

    public String getExTitle() {
        return exTitle;
    }

    public void setExTitle(String exTitle) {
        this.exTitle = exTitle;
    }

    public void setRow(int row) {
        this.row = row;
    }

    public String getAlternativeValue() {
        return alternativevalue;
    }

    public void setAlternativeValue(String alternativeValue) {
        this.alternativevalue = alternativeValue;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

}
like image 32
Moe Avatar answered Oct 03 '22 19:10

Moe