Обработка событий кликов из CellTable, как обработать их обратно диспетчеру по умолчанию? - PullRequest
0 голосов
/ 27 октября 2011

У меня есть CellTable с одним настраиваемым столбцом, в котором я отображаю его вручную и помещаю FlowPanel с кучей виджетов HTMLPanel / Anchor / 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.В моем обработчике я просматриваю дерево, чтобы найти первый TR, принадлежащий моему CellTable, проверяя, содержит ли оно классы CSS «четная строка» или «нечетная строка».

Однако, когда щелчок происходит внутри DecoratorPanel (который находится внутри TD таблицы моих ячеек), мой обработчик также срабатывает, поскольку щелчок принадлежит области таблицы ячеек.

Я могу обнаружить это, увидев, что родительский TR не имеет CSS-классов CellTable.

ВОПРОС: как я могу вернуть обработку таких событий кликов в 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());

1 Ответ

0 голосов
/ 01 ноября 2011

Похоже на ошибку в GWT, вызванную тем, что панель декоратора использует таблицу для визуализации: 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.

...