

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.KeyStroke;
import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;

import com.jidesoft.swing.CheckBoxTree;
import com.jidesoft.swing.CheckBoxTreeSelectionModel;
import com.jidesoft.swing.JideTitledBorder;
import com.jidesoft.swing.PartialEtchedBorder;
import com.jidesoft.swing.PartialSide;
import com.jidesoft.swing.SearchableUtils;
import com.jidesoft.tree.FilterableCheckBoxTreeSelectionModel;
import com.jidesoft.tree.QuickTreeFilterField;

public class POC extends AbstractDemo{
	  @Override
	    public String getDemoFolder() {
	        return "G15.QuickFilter";
	    }
	  public String getName() {
	        return "QuickFilter (Tree) Demo";
	    }

	    public String getProduct() {
	        return PRODUCT_NAME_GRIDS;
	    }
	    private TreeModel createTreeModel() {
	    	  DefaultMutableTreeNode root=new DefaultMutableTreeNode("Root");
				DefaultMutableTreeNode node1=new DefaultMutableTreeNode("one");
				DefaultMutableTreeNode node2=new DefaultMutableTreeNode("two");	
				DefaultMutableTreeNode node3=new DefaultMutableTreeNode("three");
				DefaultMutableTreeNode node4=new DefaultMutableTreeNode("four");
				DefaultMutableTreeNode node5=new DefaultMutableTreeNode("five");
			//	root1.add(root);
				root.add(node1);
				root.add(node2);
				root.add(node3);
				root.add(node4);
				root.add(node5);
				DefaultMutableTreeNode node11=new DefaultMutableTreeNode("child1");
				DefaultMutableTreeNode node22=new DefaultMutableTreeNode("child2");
				DefaultMutableTreeNode node33=new DefaultMutableTreeNode("child3");
				node5.add(node11);node5.add(node22);node5.add(node33);
			    DefaultTreeModel treeModel = new DefaultTreeModel(root);
				return treeModel;
	    }
	  public Component getDemoPanel() {
		
			JPanel quickSearchPanel = new JPanel(new FlowLayout(FlowLayout.LEADING));
			quickSearchPanel.setBorder(new JideTitledBorder(new PartialEtchedBorder(PartialEtchedBorder.LOWERED, PartialSide.NORTH), "Find", JideTitledBorder.LEADING, JideTitledBorder.ABOVE_TOP));
			 final TreeModel treeModel = createTreeModel();
			final QuickTreeFilterField filterData=new QuickTreeFilterField(treeModel);
			filterData.setHintText("Type here to filter songs");
			filterData.setHideEmptyParentNode(true);
		    final JLabel label = new JLabel(getFilterStatus(filterData.getDisplayTreeModel(), treeModel));

			final CheckBoxTree tree=new CheckBoxTree(filterData.getDisplayTreeModel()){
				protected CheckBoxTreeSelectionModel createCheckBoxTreeSelectionModel(TreeModel model) {
									
					return new FilterableCheckBoxTreeSelectionModel(filterData.getDisplayTreeModel());
				 }
				
			};
			   tree.setRootVisible(false);
		        tree.setShowsRootHandles(true);
			filterData.setTree(tree);
			quickSearchPanel.add(filterData);
			 SearchableUtils.installSearchable(tree);
			 
			JPanel childPanel=new JPanel(new BorderLayout(2,2));
			JPanel masterPanel = new JPanel(new BorderLayout(6, 6));
			//here it will compute and display the data for tree
			masterPanel.add(quickSearchPanel, BorderLayout.BEFORE_FIRST_LINE);
			JPanel treePanel = new JPanel(new BorderLayout(2, 2));
			treePanel.setBorder(BorderFactory.createCompoundBorder(
					new JideTitledBorder(new PartialEtchedBorder(
							PartialEtchedBorder.LOWERED, PartialSide.NORTH),
							null, JideTitledBorder.LEADING,
							JideTitledBorder.ABOVE_TOP), BorderFactory
							.createEmptyBorder(0, 0, 0, 0)));
			tree.setDigIn(false);
			treePanel.add(new JScrollPane(tree));
			  tree.registerKeyboardAction(new AbstractAction() {
		            public void actionPerformed(ActionEvent e) {
		                TreePath[] selections = tree.getSelectionPaths();
		                for (TreePath selection : selections) {
		                    ((DefaultTreeModel) filterData.getTreeModel()).removeNodeFromParent((DefaultMutableTreeNode) selection.getLastPathComponent());
		                }
		            }
		        }, KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), JComponent.WHEN_FOCUSED);
			masterPanel.add(treePanel);
			childPanel.add(new JPanel(),BorderLayout.BEFORE_LINE_BEGINS);
			childPanel.add(masterPanel,BorderLayout.CENTER);
			  tree.getModel().addTreeModelListener(new TreeModelListener() {
		            public void treeNodesChanged(TreeModelEvent e) {
		                updateLabel(e);
		            }

		            public void treeNodesInserted(TreeModelEvent e) {
		                updateLabel(e);
		            }

		            public void treeNodesRemoved(TreeModelEvent e) {
		                updateLabel(e);
		            }

		            public void treeStructureChanged(TreeModelEvent e) {
		                updateLabel(e);
		            }

		            protected void updateLabel(TreeModelEvent e) {
		                if (e.getSource() instanceof TreeModel) {
		                    final TreeModel model = (TreeModel) e.getSource();
		                    label.setText(getFilterStatus(model, treeModel));
		                }
		            }
		        });
			  childPanel.add(new JButton(new AbstractAction("Remove") {
		            public void actionPerformed(ActionEvent e) {
		                DefaultTreeModel defaultTreeModel = ((DefaultTreeModel) filterData.getTreeModel());
		                if (tree.getSelectionPath() != null) {
		                    TreePath treePath = tree.getSelectionPath();
		                    DefaultMutableTreeNode node = (DefaultMutableTreeNode) treePath.getLastPathComponent();
//		                  TreeNode parent = node.getParent();
		                    defaultTreeModel.removeNodeFromParent(node);
//		                  defaultTreeModel.nodeStructureChanged(parent);
		                }
		            }
		        }), BorderLayout.PAGE_END);
			  
	
			return childPanel;
	  }
	public static void main(String [] args)
	{
		  showAsFrame(new POC());
		
		
	}
	

	 private   String getFilterStatus(TreeModel displayModel, TreeModel originalModel) {
	        int count = displayModel.getChildCount(displayModel.getRoot());
	        return count + " out of " + originalModel.getChildCount(originalModel.getRoot()) + " albums";
	    }
}
