0

我扩展了一个gwt celltable 来创建一个自定义的celltable,我注册了sinkevents,即onmouseover/onmouseout。当您将鼠标悬停在表格的行上时,行数据将填充在悬停 wiget(自定义悬停弹出面板)上。它的工作原理与它在开发模式下所做的一样,但是一旦部署在 tomcat 上,当您将鼠标移到 celltable 上的不同行上时,它不会更新弹出面板上的悬停数据,除非您单击远离表格(松散焦点)和再次悬停在行上。

public class MyCellTable<T> extends CellTable<T> {
    private Tooltip popup = new Tooltip();
    private List<String> tooltipHiddenColumn = new ArrayList<String>();
    private boolean showTooltip;

    public MyCellTable() {
        super();
        sinkEvents(Event.ONMOUSEOVER | Event.ONMOUSEOUT);
    }

    @Override
    public void onBrowserEvent2(Event event) {
        super.onBrowserEvent2(event);
        if (isShowTooltip()) {
            switch (DOM.eventGetType(event)) {
                case Event.ONMOUSEOUT: {
                    popup.hide(true);
                    break;
                }
                case Event.ONMOUSEOVER: {
                    popup.setAutoHideEnabled(true);
                    showToolTip(event);
                    break;
                }
            }
        }
    }

    private void showToolTip(final Event event) {
        EventTarget eventTarget = event.getEventTarget();
        if (!Element.is(eventTarget)) {
            return;
        }
        final Element target = event.getEventTarget().cast();
        // Find the cell where the event occurred.
        TableCellElement tableCell = findNearestParentCell(target);
        if (tableCell == null) {
            return;
        }
        Element trElem = tableCell.getParentElement();
        if (trElem == null) {
            return;
        }
        TableRowElement tr = TableRowElement.as(trElem);
        Element sectionElem = tr.getParentElement();
        if (sectionElem == null) {
            return;
        }
        TableSectionElement section = TableSectionElement.as(sectionElem);
        if (section == getTableHeadElement()) {
            return;
        }
        NodeList<TableCellElement> cellElements = tr.getCells().cast();
        NodeList<TableCellElement> headers = getTableHeadElement().getRows().getItem(0).getCells().cast();
        popup.getGrid().clear(true);
        popup.getGrid().resizeRows(cellElements.getLength());
        for (int i = 0; i < cellElements.getLength(); i++) {
            if (getTooltipHiddenColumn().indexOf(headers.getItem(i).getInnerHTML()) == -1) {
                TableCellElement tst = TableCellElement.as(cellElements.getItem(i));
                popup.getGrid().setHTML(i, 0, headers.getItem(i).getInnerHTML());
                popup.getGrid().setHTML(i, 1, tst.getInnerHTML());
            }
        }
        // Here the constant values are used to give some gap between mouse pointer and popup panel
        popup.setPopupPositionAndShow(new PopupPanel.PositionCallback() {
            public void setPosition(int offsetWidth, int offsetHeight) {
                int left = event.getClientX() + 5;
                int top = event.getClientY() + 5;
                if ((offsetHeight + top + 20) > Window.getClientHeight()) {
                    top = top - offsetHeight - 10;
                }
                popup.setPopupPosition(left, top);
            }
        });
        popup.show();
    }

    public ArrayList<ReorderColumnsDetails> getColumnsHeaders(int index){ 
        ArrayList<ReorderColumnsDetails> column = new ArrayList<ReorderColumnsDetails>();
        NodeList<TableCellElement> headers = getTableHeadElement().getRows().getItem(0).getCells().cast();
        for (int i = 0; i < index; i++) {
            ReorderColumnsDetails clm = new ReorderColumnsDetails();
            clm.setHearder(headers.getItem(i).getInnerHTML().toString());
            clm.setItemIndex(i);
            column.add(clm);
        }    
        return  column;     
    }

    private TableCellElement findNearestParentCell(Element elem) {
        while ((elem != null) && (elem != getElement())) {
            String tagName = elem.getTagName();
            if ("td".equalsIgnoreCase(tagName) || "th".equalsIgnoreCase(tagName)) {
                return elem.cast();
            }
            elem = elem.getParentElement();
        }
        return null;
    }

    /**
     * Specify Name of the column's which is not to shown in the Tooltip
     */
    public List<String> getTooltipHiddenColumn() {
        return tooltipHiddenColumn;
    }

    /**
     * Set title to tooltip
     * 
     * @param title
     */
    public void setTooltipTitle(String title) {
        popup.setHTML(title);
    }

    public boolean isShowTooltip() {
        return showTooltip;
    }

    public void setShowTooltip(boolean showTooltip) {
        this.showTooltip = showTooltip;
    }
}
4

0 回答 0