从CellTable处理点击事件,如何处理它们回到默认调度程序



我有一个有一个自定义列的CellTable,我手动渲染它,并把一个带有一堆HTMLPanel/Anchor/FlowPanel小部件的FlowPanel,其中包括DecoratorPanel。

DecoratorPanel呈现为一个表,当然。

渲染过程如下:

public class MyExpandableCell extends AbstractCell<String> {
    ...
    @Override
    public void render(com.google.gwt.cell.client.Cell.Context context, String value, SafeHtmlBuilder sb) {
        if (value != null) {
            FlowPanel fp = createDetailsFlowPanel(value);
            sb.appendHtmlConstant(fp.getElement().getString());
        }
    }

现在,我已经为我的主CellTable添加了一个点击事件处理程序。在我的处理程序中,我遍历树来找到属于我的CellTable的第一个TR,通过检查它是否包含"偶数行"或"奇数行"CSS类。

然而,当点击发生在DecoratorPanel内部(这是在我的单元格表的TD),我的处理程序也被触发,因为点击属于单元格表区域。

我可以检测到这一点,我看到父TR没有CellTable CSS类。

问题:我如何返回处理这样的点击事件到DecoratorPanel -它真正属于哪里?就像现在一样,我的DecoratorPanel没有展开,我认为是因为我的点击处理程序拦截并抑制了CellTable级别的所有点击。

table = setupMyCellTable(PAGE_SIZE, CLIENT_BUNDLE, myCellTableResources);
mydataprovider.addDataDisplay(table);
table.sinkEvents(Event.ONCLICK);
table.addDomHandler(new ClickHandler() {
    @Override
    public void onClick(ClickEvent e) {
        boolean isClick = "click".equals(e.getNativeEvent().getType());
        if (isClick) {
            Element originalElement = e.getNativeEvent().getEventTarget().cast();
            Element element = originalElement;
            String ctTrClassEven = CLIENT_BUNDLE.mainCss().cellTableEvenRow();
            String ctTrClassEven = CLIENT_BUNDLE.mainCss().cellTableOddRow();
            // Looking for closest parent TR which has one
            // of the two row class names (for this cellTable):
            while (element != null
                    && !"tr".equalsIgnoreCase(element.getTagName())
                    && !(element.getClassName().contains(ctTrClassEven) ||
                         element.getClassName().contains(ctTrClassEven))) {
                element = element.getParentElement();
            }
            if (element != null) {
                if (element.getClassName().contains(ctTrClassEven)
                        || element.getClassName().contains(ctTrClassEven)) {
                    // Found cell table's TR. Set new TR height.
                } else {
                    // Found TR from DecoratorPanel inside of the celltable's cell.
                    // Do nothing. But how do I make sure
                    // that decorator panel processes this click and expands?
                    return;
                    // Did not work: NS_ERROR_ILLEGAL_VALUE javascript exception.
                    // if (originalElement != null) {
                    //     originalElement.dispatchEvent(e.getNativeEvent());
                    // }
                }
            } else {
                debugStr.setText("(did not find tr)");
            }
        }
    }
}, ClickEvent.getType());

看起来像GWT中的一个bug,因为decorator panel使用table来呈现自己而触发:http://code.google.com/p/google-web-toolkit/issues/detail?id=5714(另一个例子http://code.google.com/p/google-web-toolkit/issues/detail?id=6750)

预计将随GWT 2.5一起发布

相关内容

  • 没有找到相关文章

最新更新