com.extjs.gxt.ui.client.widget.treetable.TreeTableItemUI.java Source code

Java tutorial

Introduction

Here is the source code for com.extjs.gxt.ui.client.widget.treetable.TreeTableItemUI.java

Source

/*
 * Ext GWT - Ext for GWT
 * Copyright(c) 2007-2009, Ext JS, LLC.
 * licensing@extjs.com
 * 
 * http://extjs.com/license
 */
package com.extjs.gxt.ui.client.widget.treetable;

import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
import com.extjs.gxt.ui.client.core.El;
import com.extjs.gxt.ui.client.event.BaseEvent;
import com.extjs.gxt.ui.client.event.TreeEvent;
import com.extjs.gxt.ui.client.util.Markup;
import com.extjs.gxt.ui.client.widget.table.TableColumnModel;
import com.extjs.gxt.ui.client.widget.tree.DefaultTreeItemUI;
import com.extjs.gxt.ui.client.widget.treegrid.TreeGrid;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Event;

/**
 * @deprecated see @link {@link TreeGrid}
 */
public class TreeTableItemUI extends DefaultTreeItemUI {

    boolean hovering;

    private Element tableItemEl;
    private Element rowTableEl;
    private Element rowTrEl;
    private Element[] cells;

    public TreeTableItemUI(TreeTableItem item) {
        bind(item);
        styleTreeOver = "my-treetbl-over";
        styleTreeChecked = "my-treetbl-checked";
        styleTreeNotChecked = "my-treetbl-notchecked";
        styleTreeLoading = "my-treetbl-loading";
        classTreeOpen = "my-treetbl-open";
        classTreeClose = "my-treetbl-close";
    }

    public TreeTableItem getTreeTableItem() {
        return (TreeTableItem) item;
    }

    @Override
    public void handleEvent(TreeEvent e) {
        TreeTableItem item = (TreeTableItem) e.getItem();
        Element target = e.getTarget();
        int type = e.getEventTypeInt();
        switch (type) {
        case Event.ONMOUSEOVER:
        case Event.ONMOUSEOUT:
            handleMouseEvent(e);
            break;
        case Event.ONCLICK:
        case Event.ONDBLCLICK:
            if (DOM.isOrHasChild(checkEl, target)) {
                e.stopEvent();
                item.setChecked(!item.isChecked());
            } else {
                handleClickEvent(e);
            }
            return;
        }
    }

    @Override
    public boolean isSelectableTarget(Element target) {
        if (DOM.isOrHasChild(jointEl, target)) {
            return false;
        }
        return true;
    }

    public void onMouseOut(BaseEvent be) {
        if (!item.isRoot()) {
            El.fly(tableItemEl).removeStyleName("my-treetbl-item-over");
        }
    }

    public void onMouseOver(BaseEvent be) {
        if (!item.isRoot()) {
            El.fly(tableItemEl).addStyleName("my-treetbl-item-over");
        }
    }

    @Override
    public void onSelectedChange(boolean selected) {
        if (item.isRendered()) {
            El.fly(tableItemEl).setStyleName("my-treetbl-item-sel", selected);
            if (!selected) {
                onMouseOut(null);
            }
        }
    }

    @Override
    public void onTextChange(String text) {
        if (!item.isRoot()) {
            textSpanEl.setInnerHTML(text);
        }
    }

    public void render(Element target, int index) {
        if (item.isRoot() == true) {
            return;
        }

        item.setTreeTableElement(DOM.createDiv());
        item.setStyleName("my-treeitem x-tree-item");
        DOM.insertChild(target, item.getElement(), index);

        TableColumnModel cm = getTreeTableItem().getTreeTable().getColumnModel();

        DOM.setInnerHTML(item.getElement(), Markup.TREETABLE_ITEM);
        tableItemEl = item.el().firstChild().dom;

        rowTableEl = DOM.getFirstChild(tableItemEl);
        rowTrEl = fly(rowTableEl).getSubChild(2);
        updateCellValues(0, DOM.getFirstChild(rowTrEl), cm.getColumn(0).getAlignment());
        itemEl = fly(rowTrEl).getSubChild(4);
        Element td = fly(itemEl).subChild(3).dom;
        indentEl = DOM.getFirstChild(td);
        jointEl = DOM.getNextSibling(td);
        jointDivEl = DOM.getFirstChild(jointEl);
        checkEl = DOM.getNextSibling(DOM.getNextSibling(jointEl));
        checkDivEl = DOM.getFirstChild(checkEl);
        iconEl = DOM.getNextSibling(checkEl);
        iconDivEl = DOM.getFirstChild(iconEl);
        textEl = DOM.getNextSibling(iconEl);
        textSpanEl = DOM.getFirstChild(textEl);
        Element tbl = DOM.getFirstChild(item.getElement());
        containerEl = new El(DOM.getNextSibling(tbl));

        int numColumns = cm.getColumnCount();
        cells = new Element[numColumns];

        for (int i = 1; i < numColumns; i++) {
            cells[i] = DOM.createTD();
            DOM.appendChild(rowTrEl, cells[i]);

            DOM.setElementProperty(cells[i], "className", "my-treetbl-cell");
            DOM.setElementAttribute(cells[i], "index", String.valueOf(i));

            Element overflowDiv = DOM.createDiv();
            DOM.setElementProperty(overflowDiv, "className", "my-treetbl-cell-overflow");
            DOM.appendChild(cells[i], overflowDiv);
            Element textDiv = DOM.createDiv();

            String textStyle = "my-treetbl-cell-text";
            if (((TreeTableItem) item).getCellStyle(i) != null) {
                textStyle += " " + ((TreeTableItem) item).getCellStyle(i);
            }
            DOM.setElementProperty(textDiv, "className", textStyle);
            DOM.appendChild(overflowDiv, textDiv);
            updateCellValues(i, cells[i], cm.getColumn(i).getAlignment());
        }

        boolean checkable = getTreeTableItem().getTreeTable().getCheckable();
        El.fly(checkEl).setVisible(checkable);

        onValuesChanged(getTreeTableItem().getTreeTable(), getTreeTableItem().getRenderedValues());

        item.updateIconStyle();
        item.updateJointStyle();

        if (item.isChecked()) {
            onCheckChange(true);
        }

        El.fly(indentEl).setWidth(item.getIndent());

        item.updateJointStyle();
        item.disableTextSelection(true);

    }

    public void setContainer(Element container) {
        containerEl = new El(container);
    }

    protected Element getTextCellElement(int column) {
        if (column == 0) {
            return textSpanEl;
        } else {
            return El.fly(cells[column]).getSubChild(2);
        }
    }

    @Override
    protected void handleMouseEvent(TreeEvent ce) {
        if (ce.getEvent().getTypeInt() == Event.ONMOUSEOVER) {
            if (!hovering) {
                hovering = true;
                onMouseOver(ce);
            }
        } else {
            hovering = false;
            onMouseOut(ce);
        }

    }

    protected void onValuesChanged(TreeTable table, String[] values) {
        onTextChange(values[0] != null ? values[0] : item.getText());
        for (int i = 1; i < cells.length; i++) {
            updateText(i, values[i]);
        }
    }

    protected void updateCellValues(int col, Element cell, HorizontalAlignment align) {
        String salign = "left";
        if (align == HorizontalAlignment.CENTER) {
            salign = "center";
        } else if (align == HorizontalAlignment.RIGHT) {
            salign = "right";
        }

        String widthClassName = ((TreeTableItem) item).treeTable.getId() + "-col-" + col;

        String className = cell.getClassName();
        className = (className == null) ? widthClassName : className + " " + widthClassName;
        cell.setClassName(className);

        className = DOM.getElementProperty(DOM.getFirstChild(cell), "className");
        className = (className == null) ? widthClassName : className + " " + widthClassName;
        DOM.setElementProperty(DOM.getFirstChild(cell), "className", className);

        El.fly(cell).subChild(2).setStyleAttribute("textAlign", salign);
    }

    protected void updateText(int column, String value) {
        Element textElem = getTextCellElement(column);
        if (textElem != null) {
            textElem.setInnerHTML(value);
        }
    }
}