Package org.itsnat.feashow.features.comp.trees

Source Code of org.itsnat.feashow.features.comp.trees.FreeTreeTableTreeNode

/*
* This file is not part of the ItsNat framework.
*
* Original source code use and closed source derivatives are authorized
* to third parties with no restriction or fee.
* The original source code is owned by the author.
*
* This program is distributed AS IS in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* (C) Innowhere Software a service of Jose Maria Arranz Santamaria, Spanish citizen.
*/

package org.itsnat.feashow.features.comp.trees;

import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.ButtonModel;
import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.MutableTreeNode;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
import org.itsnat.comp.ItsNatComponentManager;
import org.itsnat.comp.button.normal.ItsNatHTMLInputButton;
import org.itsnat.comp.button.toggle.ItsNatHTMLInputCheckBox;
import org.itsnat.comp.text.ItsNatHTMLInputText;
import org.itsnat.comp.tree.ItsNatFreeTree;
import org.itsnat.core.ItsNatDocument;
import org.itsnat.core.NameValue;
import org.itsnat.feashow.FeatureTreeNode;
import org.itsnat.feashow.FreeTreeDecorator;
import org.w3c.dom.Element;
import org.w3c.dom.events.Event;
import org.w3c.dom.events.EventListener;
import org.w3c.dom.events.EventTarget;

public class FreeTreeTableTreeNode extends FeatureTreeNode implements EventListener,TreeModelListener,TreeSelectionListener,ItemListener
{
    protected ItsNatHTMLInputCheckBox useSingleClickComp;
    protected ItsNatFreeTree treeComp;
    protected ItsNatHTMLInputButton removeButton;
    protected ItsNatHTMLInputText itemPrincipalComp;
    protected ItsNatHTMLInputText itemSecondaryComp;
    protected ItsNatHTMLInputText posComp;
    protected ItsNatHTMLInputButton updateButton;
    protected ItsNatHTMLInputButton insertBeforeButton;
    protected ItsNatHTMLInputButton insertAfterButton;
    protected ItsNatHTMLInputButton insertChildButton;
    protected ItsNatHTMLInputCheckBox joystickModeComp;

    public FreeTreeTableTreeNode()
    {
    }

    public void startExamplePanel()
    {
        ItsNatDocument itsNatDoc = getItsNatDocument();
        ItsNatComponentManager compMgr = itsNatDoc.getItsNatComponentManager();

        this.useSingleClickComp = (ItsNatHTMLInputCheckBox)compMgr.createItsNatComponentById("useSingleClickId");
        useSingleClickComp.getToggleButtonModel().addItemListener(this);

        NameValue[] artifacts = new NameValue[]{new NameValue("treeTable","true")};
        this.treeComp = (ItsNatFreeTree)compMgr.createItsNatComponentById("compId","freeTree",artifacts);

        treeComp.setItsNatTreeCellRenderer(new TreeTableItemRenderer(itsNatDoc));
        treeComp.setItsNatTreeCellEditor(new TreeTableItemEditor(treeComp.getItsNatTreeCellEditor()));

        new FreeTreeDecorator(treeComp).bind();

        DefaultTreeModel dataModel = (DefaultTreeModel)treeComp.getTreeModel();

        TreeTableItem rootItem = new TreeTableItem("Grey's Anatomy","Famous TV series");
        DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(rootItem);
        dataModel.setRoot(rootNode);

        DefaultMutableTreeNode parentNode;

            parentNode = addNode(new TreeTableItem("Characters","Actors"),rootNode);

                addNode(new TreeTableItem("Meredith Grey","Ellen Pompeo"),parentNode);
                addNode(new TreeTableItem("Cristina Yang","Sandra Oh"),parentNode);
                addNode(new TreeTableItem("Alex Karev","Justin Chambers"),parentNode);
                addNode(new TreeTableItem("George O'Malley","T.R. Knight"),parentNode);

            parentNode = addNode(new TreeTableItem("Other","Category"),rootNode);

                addNode(new TreeTableItem("Shonda Rhimes","Creator"),parentNode);
                addNode(new TreeTableItem("USA","Country"),parentNode);
                addNode(new TreeTableItem("English","Language"),parentNode);

        TreeSelectionModel selModel = treeComp.getTreeSelectionModel();
        selModel.setSelectionMode(TreeSelectionModel.CONTIGUOUS_TREE_SELECTION);

        selModel.addSelectionPath(new TreePath(parentNode.getPath())); // Other

        treeComp.addEventListener("click",this);
        dataModel.addTreeModelListener(this);
        selModel.addTreeSelectionListener(this);

        this.removeButton = (ItsNatHTMLInputButton)compMgr.createItsNatComponentById("removeId");
        removeButton.addEventListener("click",this);

        DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode)selModel.getSelectionPath().getLastPathComponent();
        TreeTableItem selectedItem = (TreeTableItem)selectedNode.getUserObject();
        this.itemPrincipalComp = (ItsNatHTMLInputText)compMgr.createItsNatComponentById("itemPrincipalId");
        itemPrincipalComp.setText(selectedItem.getPrincipal());
        this.itemSecondaryComp = (ItsNatHTMLInputText)compMgr.createItsNatComponentById("itemSecondaryId");
        itemSecondaryComp.setText(selectedItem.getSecondary());

        this.posComp = (ItsNatHTMLInputText)compMgr.createItsNatComponentById("posId");
        posComp.setText(Integer.toString(selModel.getMinSelectionRow()));

        this.updateButton = (ItsNatHTMLInputButton)compMgr.createItsNatComponentById("updateId");
        updateButton.addEventListener("click",this);

        this.insertBeforeButton = (ItsNatHTMLInputButton)compMgr.createItsNatComponentById("insertBeforeId");
        insertBeforeButton.addEventListener("click",this);

        this.insertAfterButton = (ItsNatHTMLInputButton)compMgr.createItsNatComponentById("insertAfterId");
        insertAfterButton.addEventListener("click",this);

        this.insertChildButton = (ItsNatHTMLInputButton)compMgr.createItsNatComponentById("insertChildId");
        insertChildButton.addEventListener("click",this);

        this.joystickModeComp = (ItsNatHTMLInputCheckBox)compMgr.createItsNatComponentById("joystickModeId");
        joystickModeComp.getToggleButtonModel().addItemListener(this);
        joystickModeComp.setSelected(isJoystickModePreferred());

    }

    public DefaultMutableTreeNode addNode(Object userObject,DefaultMutableTreeNode parentNode)
    {
        DefaultMutableTreeNode childNode = new DefaultMutableTreeNode(userObject);
        DefaultTreeModel dataModel = (DefaultTreeModel)treeComp.getTreeModel();
        int count = dataModel.getChildCount(parentNode);
        dataModel.insertNodeInto(childNode,parentNode,count);
        return childNode;
    }

    public void endExamplePanel()
    {
        useSingleClickComp.dispose();
        this.useSingleClickComp = null;

        this.treeComp.dispose();
        this.treeComp = null;

        this.removeButton.dispose();
        this.removeButton = null;

        this.itemPrincipalComp.dispose();
        this.itemPrincipalComp = null;

        this.itemSecondaryComp.dispose();
        this.itemSecondaryComp = null;

        this.posComp.dispose();
        this.posComp = null;

        this.updateButton.dispose();
        this.updateButton = null;

        this.insertBeforeButton.dispose();
        this.insertBeforeButton = null;

        this.insertAfterButton.dispose();
        this.insertAfterButton = null;

        this.insertChildButton.dispose();
        this.insertChildButton = null;

        this.joystickModeComp.dispose();
        this.joystickModeComp = null;
    }

    public static boolean isInTree(MutableTreeNode node,DefaultTreeModel dataModel)
    {
        if (node == null) return false;
        if (node == dataModel.getRoot()) return true;
        return isInTree((MutableTreeNode)node.getParent(),dataModel);
    }

    public void handleEvent(Event evt)
    {
        log(evt);

        EventTarget currentTarget = evt.getCurrentTarget();
        if (currentTarget == removeButton.getHTMLInputElement())
        {
            DefaultTreeModel dataModel = (DefaultTreeModel)treeComp.getTreeModel();
            TreeSelectionModel selModel = treeComp.getTreeSelectionModel();
            if (!selModel.isSelectionEmpty())
            {
                // Selection Model is in CONTIGUOUS_TREE_SELECTION mode
                TreePath[] paths = selModel.getSelectionPaths();
                for(int i = 0; i < paths.length; i++)
                {
                    MutableTreeNode node = (MutableTreeNode)paths[i].getLastPathComponent();
                    if (node == dataModel.getRoot())
                        dataModel.setRoot(null);
                    else if (isInTree(node,dataModel)) // If false is already removed (a previous removed node was the parent)
                        dataModel.removeNodeFromParent(node);
                }
            }
        }
        else if ((currentTarget == updateButton.getHTMLInputElement()) ||
                 (currentTarget == insertBeforeButton.getHTMLInputElement()) ||
                 (currentTarget == insertAfterButton.getHTMLInputElement()) ||
                 (currentTarget == insertChildButton.getHTMLInputElement()) )
        {
            String newPrincipalItem = itemPrincipalComp.getText();
            String newSecondaryItem = itemSecondaryComp.getText();
            int row;
            try
            {
                row = Integer.parseInt(posComp.getText());
                DefaultTreeModel dataModel = (DefaultTreeModel)treeComp.getTreeModel();
                if (currentTarget == updateButton.getHTMLInputElement())
                {
                    TreePath path = treeComp.getTreePathForRow(row);
                    if (path != null)
                    {
                        DefaultMutableTreeNode node = (DefaultMutableTreeNode)path.getLastPathComponent();
                        TreeTableItem newItem = (TreeTableItem)node.getUserObject();
                        newItem.setPrincipal(newPrincipalItem);
                        newItem.setSecondary(newSecondaryItem);
                        dataModel.nodeChanged(node); // To notify
                    }
                    else getItsNatDocument().addCodeToSend("alert('Bad Position');");
                }
                else if ((currentTarget == insertBeforeButton.getHTMLInputElement()) ||
                         (currentTarget == insertAfterButton.getHTMLInputElement()) ||
                         (currentTarget == insertChildButton.getHTMLInputElement()))
                {
                    TreeTableItem newItem = new TreeTableItem(newPrincipalItem,newSecondaryItem);
                    DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(newItem);
                    TreePath refPath = treeComp.getTreePathForRow(row);
                    if (refPath != null)
                    {
                        DefaultMutableTreeNode refNode = (DefaultMutableTreeNode)refPath.getLastPathComponent();
                        if ((currentTarget == insertBeforeButton.getHTMLInputElement()) ||
                            (currentTarget == insertAfterButton.getHTMLInputElement()))
                        {
                            if (row == 0)
                            {
                                getItsNatDocument().addCodeToSend("alert('Bad Position');");
                            }
                            else
                            {
                                TreePath parentPath = refPath.getParentPath();
                                DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode)parentPath.getLastPathComponent();
                                int childIndex = dataModel.getIndexOfChild(parentNode,refNode);
                                if (currentTarget == insertAfterButton.getHTMLInputElement())
                                    childIndex = childIndex + 1;
                                dataModel.insertNodeInto(newNode,parentNode,childIndex);
                            }
                        }
                        else // insert child
                        {
                            // refNode is the parent node
                            int childIndex = dataModel.getChildCount(refNode);
                            dataModel.insertNodeInto(newNode,refNode,childIndex);
                        }
                    }
                    else
                    {
                        if ((row == 0) && (dataModel.getRoot() == null))
                            dataModel.setRoot(newNode);
                        else
                            getItsNatDocument().addCodeToSend("alert('Bad Position');");
                    }
                }

            }
            catch(NumberFormatException ex)
            {
                getItsNatDocument().addCodeToSend("alert('Bad Position');");
            }
            catch(ArrayIndexOutOfBoundsException ex)
            {
                getItsNatDocument().addCodeToSend("alert('Bad Position');");
            }
        }
    }

    public void treeNodesChanged(TreeModelEvent e)
    {
        treeChangedLog(e);
    }

    public void treeNodesInserted(TreeModelEvent e)
    {
        treeChangedLog(e);
    }

    public void treeNodesRemoved(TreeModelEvent e)
    {
        treeChangedLog(e);
    }

    public void treeStructureChanged(TreeModelEvent e)
    {
        treeChangedLog(e);
    }

    public void treeChangedLog(TreeModelEvent e)
    {
        log(e.toString());
    }

    public void valueChanged(TreeSelectionEvent e)
    {
        TreeSelectionModel selModel = treeComp.getTreeSelectionModel();

        TreePath[] paths = e.getPaths();
        String fact = "";
        for(int i = 0; i < paths.length; i++)
        {
            TreePath path = paths[i];
            boolean selected = selModel.isPathSelected(path);
            if (selected)
                fact += ", selected ";
            else
                fact += ", deselected ";
            fact += path.getLastPathComponent();
        }

        log(e.getClass().toString() + " " + fact);

        int row = selModel.getMinSelectionRow(); // First selected
        if (row != -1)
        {
            TreePath path = treeComp.getTreePathForRow(row);
            DefaultMutableTreeNode node = (DefaultMutableTreeNode)path.getLastPathComponent();
            TreeTableItem value = (TreeTableItem)node.getUserObject();
            itemPrincipalComp.setText(value.getPrincipal());
            itemSecondaryComp.setText(value.getSecondary());
            posComp.setText(Integer.toString(row));
        }
    }

    public void itemStateChanged(ItemEvent e)
    {
        boolean selected = (e.getStateChange() == ItemEvent.SELECTED);
        ButtonModel model = (ButtonModel)e.getSource();
        if (model == joystickModeComp.getToggleButtonModel())
            treeComp.setJoystickMode(selected);
        else if (model == useSingleClickComp.getToggleButtonModel())
            treeComp.setEditorActivatorEvent(selected? "click" : "dblclick");
    }
}
TOP

Related Classes of org.itsnat.feashow.features.comp.trees.FreeTreeTableTreeNode

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.