Search code examples
javagwtgwt-celltable

How to make listener working in CellColumn getValue gwt?


My Requirement is to make the column as combination of text and hyperlink. Hence I can't use ClickableTextCell. I have done the following for it:-

private final Column < Trap, Widget > elementColumn = new Column < Trap, Widget > (new WidgetCell()) {
 @Override
 public Widget getValue(Trap trap) {
     Label label = null;
     Anchor anchor = null;

     if (trap.getNode() != null) {
         label = new InlineLabel(EmsEntryPoint.getMessagesInstance().device() + ": ");

         String name = trap.getNode().getName();
         if (name == null || name.isEmpty()) {
             name = DataConverter.convertLongToHexId(trap.getNode().getId());
         }

         final Map < String, String > params = new HashMap < String, String > ();
         params.put(NetworkActivity.PARAM_NODE_ID, String.valueOf(trap.getNode().getId()));
         anchor = new Anchor(name);
         anchor.addClickHandler(new ClickHandler() {

             @Override
             public void onClick(ClickEvent event) {
                 NodeDetail nodeDetail = new NodeDetail(mInjector, UrlHelper.getPlaceToken(null, params));
                 bindNodeDetailButtons(nodeDetail);
                 nodeDetail.showNodeDetailPopup();
             }
         });
     }
     FlowPanel panel = new FlowPanel();
     panel.add(label);
     panel.add(anchor);
     return panel;
 }
}

Everything is correct in my code, but I don't know why Anchor's listener not working. Kindly help.


Solution

  • You will have to override render method and add handlers to your cell.

    I have used the following class:

    abstract class CustomCell extends AbstractCell<String>{
    
        private MyObject object;
        private Set<String> set ;
    
        @Override
        public Set<String> getConsumedEvents() {
            set = new HashSet<String>();
            set.add("click");
            return set;
        }
    
        public void setObject(MyObject object) {
            this.object = object;
    
        }
    
        @Override
        public void render(com.google.gwt.cell.client.Cell.Context context,
                String value, SafeHtmlBuilder sb) {
            sb.appendHtmlConstant("<div><label>"+object.getLabel()+"</label><a id='idofthislelement'>"+object.getAnchor()+"</a></div>");
        }
    
        @Override
        public void onBrowserEvent(Context context, Element parent,
                String value, NativeEvent event,
                ValueUpdater<String> valueUpdater) {
            super.onBrowserEvent(context, parent, value, event, valueUpdater);
    
            if ("click".equals(event.getType())) {
                EventTarget eventTarget = (EventTarget) event.getEventTarget();
                Element targetElement = Element.as(eventTarget);
                if (parent.getFirstChildElement().isOrHasChild(targetElement)&&targetElement.getId().equals("idofthislelement")) {
                    doAction(value, valueUpdater,object);
                }
            }
        }
    
        protected abstract void doAction(String value, ValueUpdater<String> valueUpdater,MyObject object);
    

    }

    Here's the implementation:

    private void createTextAnchorCol() {
        final CustomCell<MyObject> cell = new CustomCell<MyObject>() {
    
            @Override
            protected void doAction(String value,
                    ValueUpdater<String> valueUpdater, MyObject object) {
                Window.alert("Clicked");
                //do whatever required
            }
        };
        Column<MyObject, String> abc = new Column<MyObject, String>(cell) {
    
            @Override
            public String getValue(MyObject object) {
                cell.setObject(object);
                return null;
            }
        };