package com.dragome.render.serverside.swing;
import java.awt.Component;
import java.awt.Dimension;
import java.io.ByteArrayInputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.io.output.ByteArrayOutputStream;
import com.dragome.render.interfaces.TemplateHandler;
import com.dragome.templates.TemplateImpl;
import com.dragome.templates.interfaces.Content;
import com.dragome.templates.interfaces.Template;
public class SwingTemplateHandler implements TemplateHandler
{
public void makeVisible(Template template)
{
((Component) template.getContent().getValue()).setVisible(true);
}
public void makeInvisible(Template template)
{
Component component= (Component) template.getContent().getValue();
component.setPreferredSize(new Dimension(1, 1));
component.setVisible(false);
}
public void markWith(Template child, String name)
{
}
public void releaseTemplate(Template template)
{
}
public Template clone(Template mainPanel)
{
return cloneTemplate(mainPanel);
}
private Template cloneTemplate(Template template)
{
Template clonedTemplate= cloneChildren(template);
return clonedTemplate;
}
private Template cloneChildren(Template template)
{
Template clonedTemplate= new TemplateImpl(template.getName());
Content<?> content= template.getContent();
Component component= (Component) content.getValue();
Component clonedObject= cloneObjectBySerialization(component);
clonedTemplate= SwingTemplateLoadingStrategy.createTemplate(clonedObject, clonedTemplate);
// clonedTemplate.setFiringEvents(false);
// Component clonedObject= cloneObjectBySerialization(component);
//
// clonedTemplate.setContent(new SwingContent(clonedObject));
//
// clonedTemplate.setFiringEvents(true);
//
// for (Template child : template.getChildrenMap().values())
// {
// Template clonedChild= cloneChildren(child);
// clonedTemplate.addChild(clonedChild);
// }
//
// clonedTemplate.setFiringEvents(true);
return clonedTemplate;
}
private <T> T cloneObjectBySerialization(T object)
{
Object result;
try
{
ByteArrayOutputStream f= new ByteArrayOutputStream();
ObjectOutputStream ostream= new ObjectOutputStream(f);
ostream.writeObject(object);
ostream.close();
ObjectInputStream in= new ObjectInputStream(new ByteArrayInputStream(f.toByteArray()));
result= in.readObject();
in.close();
}
catch (Exception e)
{
throw new RuntimeException(e);
}
return (T) result;
}
public List<Template> cloneTemplates(List<Template> templates)
{
List<Template> clonedTemplates= new ArrayList<Template>();
for (Template childTemplate : templates)
clonedTemplates.add(clone(childTemplate));
return clonedTemplates;
}
}