/*
 * @(#)TestFilterMoveNodes.java 4/10/2013
 *
 * Copyright 2002 - 2013 JIDE Software Inc. All rights reserved.
 */

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.util.Arrays;
import java.util.List;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;

import com.jidesoft.plaf.LookAndFeelFactory;
import com.jidesoft.swing.CheckBoxTree;
import com.jidesoft.tree.FilterableTreeModel;
import com.jidesoft.tree.TreeUtils;
import com.jidesoft.utils.Lm;

public class TestFilterMoveNodes {

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                LookAndFeelFactory.installDefaultLookAndFeelAndExtension();
                final DefaultMutableTreeNode childA = new DefaultMutableTreeNode("child A");
                final DefaultMutableTreeNode childB = new DefaultMutableTreeNode("child B");
                final DefaultMutableTreeNode childC = new DefaultMutableTreeNode("child C");
                final DefaultMutableTreeNode childD = new DefaultMutableTreeNode("child D");

                final List<DefaultMutableTreeNode> moveNodes = Arrays
                        .asList(childD);

                final DefaultMutableTreeNode parent = new DefaultMutableTreeNode("parent");
                parent.add(childA);
                parent.add(childB);
                parent.add(childC);
                parent.add(childD);

                final DefaultMutableTreeNode root = new DefaultMutableTreeNode("root");
                root.add(parent);

                final DefaultTreeModel model = new DefaultTreeModel(root);
                FilterableTreeModel filterableTreeModel = new FilterableTreeModel(model);
                filterableTreeModel.addTreeModelListener(new TreeModelListener() {
                    @Override
                    public void treeNodesChanged(TreeModelEvent e) {
                        System.out.println(e);
                    }

                    @Override
                    public void treeNodesInserted(TreeModelEvent e) {
                        System.out.println(e);
                    }

                    @Override
                    public void treeNodesRemoved(TreeModelEvent e) {
                        System.out.println(e);
                    }

                    @Override
                    public void treeStructureChanged(TreeModelEvent e) {
                        System.out.println(e);
                    }
                });
                final JTree tree = new CheckBoxTree(filterableTreeModel);
                TreeUtils.expandAll(tree);

                JFrame frame = new JFrame("Jide " + Lm.getProductVersion() + " Java " + System.getProperty("java.runtime.version"));
                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                frame.getContentPane().add(new JScrollPane(tree));
                frame.getContentPane().add(new JButton(new AbstractAction("Remove child D") {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        for (DefaultMutableTreeNode child : moveNodes) {
                            model.removeNodeFromParent(child);
                        }
                        TreeUtils.expandAll(tree);
                    }
                }), BorderLayout.PAGE_START);
                frame.getContentPane().add(new JButton(new AbstractAction("Refresh") {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        model.nodeStructureChanged(parent);
                        TreeUtils.expandAll(tree);
                    }
                }), BorderLayout.PAGE_END);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}
