/*******************************************************************************
* Copyright (c) 2011-2014 Fernando Petrola
*
* This file is part of Dragome SDK.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
******************************************************************************/
package com.dragome.examples.tree.views;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.dragome.examples.tree.TreeNode;
import com.dragome.guia.GuiaServiceLocator;
import com.dragome.guia.components.VisualLabelImpl;
import com.dragome.guia.components.VisualPanelImpl;
import com.dragome.guia.components.interfaces.VisualComponent;
import com.dragome.guia.components.interfaces.VisualPanel;
import com.dragome.guia.events.listeners.interfaces.ClickListener;
import com.dragome.render.DefaultView;
import com.dragome.render.interfaces.TemplateHandler;
import com.dragome.templates.TemplateRepeater;
import com.dragome.templates.interfaces.Template;
public class TreeNodeView extends DefaultView<TreeNode>
{
TemplateRepeater<TreeNode> templateRepeater= new TemplateRepeater<TreeNode>(false);
protected class PropertyListener implements PropertyChangeListener
{
private TreeNode treeNode;
private List<Template> templates;
private Template originalTemplate;
private TreeNodeView treeNodeView;
protected PropertyListener(TreeNode treeNode, List<Template> templates, Template originalTemplate, TreeNodeView treeNodeView)
{
this.treeNode= treeNode;
this.templates= templates;
this.originalTemplate= originalTemplate;
this.treeNodeView= treeNodeView;
}
public void propertyChange(PropertyChangeEvent evt)
{
List<Template> templates2= templates;
final Template template= templates2.get(0);
TemplateHandler templateHandler= GuiaServiceLocator.getInstance().getTemplateHandler();
templateHandler.makeInvisible(template);
if ((Boolean) evt.getOldValue())
templateHandler.makeInvisible(templates2.get(1));
templateRepeater.repeatItems(Arrays.asList(treeNode), templateRepeater.createItemAdder(template.getParent(), originalTemplate, Arrays.asList(treeNodeView), template.getName()));
template.getParent().removeChild(template.getName());
if ((Boolean) evt.getOldValue())
{
Template template2= templates2.get(1);
template2.getParent().removeChild(template2.getName());
}
}
}
Map<TreeNode, PropertyListener> listeners= new HashMap<TreeNode, PropertyListener>();
public TreeNodeView(Template originalTemplate)
{
super(originalTemplate);
}
public void composeView(final TreeNode model, List<Template> templates)
{
super.composeView(model, templates);
Template template= templates.get(0);
VisualPanel connectorPanel= new VisualPanelImpl(template);
connectorPanel.addChild(new VisualLabelImpl<String>("label", model.getName()));
if (model.isFolder())
{
addConnectorClickListener(model, connectorPanel, templates);
if (model.isOpen())
{
templateRepeater.repeatItems(model.getChildren(), templateRepeater.createItemAdder(templates.get(1), originalTemplate, Arrays.asList(this), "children"));
}
}
}
public void addConnectorClickListener(final TreeNode treeNode, final VisualPanel rowPanel, final List<Template> templates)
{
PropertyListener propertyChangeListener= listeners.get(treeNode);
if (propertyChangeListener != null)
{
propertyChangeListener.templates= templates;
}
else
{
PropertyListener propertyChangeListener2= new PropertyListener(treeNode, templates, originalTemplate, TreeNodeView.this);
listeners.put(treeNode, propertyChangeListener2);
treeNode.addPropertyChangeListener(this, propertyChangeListener2);
}
final VisualPanel connectorPanel= new VisualPanelImpl(templates.get(0).getChild("[event=click]"));
connectorPanel.addClickListener(new ClickListener()
{
public void clickPerformed(VisualComponent aVisualComponent)
{
treeNode.setOpen(!treeNode.isOpen());
}
});
rowPanel.addChild(connectorPanel);
}
}