package net.ms.designer.core;
import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import net.ms.designer.editors.component.models.BizComponent;
import net.ms.designer.editors.component.models.CompDiagram;
import net.ms.designer.editors.component.tools.PaletteFactory;
import net.ms.designer.editors.packages.models.Package;
import net.ms.designer.editors.packages.models.PackageDiagram;
import net.ms.designer.editors.packages.ui.PackageEditor;
import org.eclipse.gef.DefaultEditDomain;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.palette.PaletteRoot;
import org.eclipse.gef.ui.palette.PaletteViewer;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.internal.UIPlugin;
public class MsContext implements Serializable
{
private static final long serialVersionUID = 1162255464;
MsProject project;
transient IWorkbenchPage page;
transient DefaultEditDomain domain;
transient PaletteViewer view;
transient PaletteRoot root;
transient PackageEditor editor;
PaletteRootFactory factory = new PaletteRootFactory();
transient ContainerFactory containerFactory;
Map elements = new HashMap();
public MsContext()
{
}
public void addElement(MsElement element)
{
elements.put(element.getKey() , element);
}
public MsElement getElement(String key)
{
return (MsElement)elements.get(key);
}
public void removeElement(String key)
{
elements.remove(key);
}
public Map getElements()
{
return this.elements;
}
// project info
public MsProject getProject()
{
return this.project;
}
public void setProject(MsProject project)
{
this.project = project;
}
/**
*
* @param element
*/
public void changeContext(MsElement element)
{
if(element != null)
this.changeContext(element.nodeType , element.nodeName);
else
return;
}
/**
*
* @param nodeType
* @param nodeName
*/
public void changeContext(String nodeType , String nodeName)
{
page = this.getActivePage();
editor = this.getEditor();
domain = this.getEditDomain();
view = this.getPaletteViewer();
root = factory.getPaletteFactory(nodeType);
//change the PaletteRoot
view.getEditPartRegistry().put(root.getDefaultEntry() ,
new org.eclipse.gef.internal.ui.palette.editparts.ToolEntryEditPart(root.getDefaultEntry()));
domain.setPaletteRoot(root);
MsElement oldElement = editor.getCurrentElement();
MsElement newElement = new MsElement();
newElement.setNodeType(nodeType);
newElement.setNodeName(nodeName);
if(getElement(newElement.getKey()) != null)
{
editor.setCurrentElement(getElement(newElement.getKey()));
Object container = getElement(newElement.getKey()).getContainer();
editor.setContainer(container);
((PackageEditor)page.getActiveEditor()).getViewer().setContents(container);
}
else
{
containerFactory = new ContainerFactory(this.getProject());
((PackageEditor)page.getActiveEditor()).getViewer().setContents(containerFactory.getContainer(nodeType,nodeName));
editor.setContainer(containerFactory.getContainer(nodeType,nodeName));
newElement.setContainer(containerFactory.getContainer(nodeType,nodeName));
newElement.setParent(oldElement);
editor.setCurrentElement(newElement);
}
editor.setNodeName(nodeName);
editor.setNodeType(nodeType);
}
//get all the packages
public List getPackages()
{
List list = new ArrayList();
Iterator iterator = this.getIterator();
MsElement element;
while(iterator.hasNext())
{
element = (MsElement)iterator.next();
if(element.getNodeType().equals("package"))
{
list.add(element);
}
}
return list;
}
//get all the components
public List getComponents()
{
List list = new ArrayList();
Iterator iterator = this.getIterator();
MsElement element;
while(iterator.hasNext())
{
element = (MsElement)iterator.next();
if(element.getNodeType().equals("component"))
{
list.add(element);
}
}
return list;
}
//get all the details
public List getDetails()
{
List list = new ArrayList();
Iterator iterator = this.getIterator();
MsElement element;
while(iterator.hasNext())
{
element = (MsElement)iterator.next();
if(!element.getNodeType().equals("package") && !element.getNodeType().equals("component"))
{
list.add(element);
}
}
return list;
}
//get the num of the elements
public int getCount()
{
return this.getElements().size();
}
//get iterator
public Iterator getIterator()
{
Map map = this.getElements();
Collection col = map.values();
Iterator iterator = col.iterator();
return iterator;
}
public IWorkbenchPage getActivePage()
{
return UIPlugin.getDefault().getWorkbench()
.getActiveWorkbenchWindow().getActivePage();
}
public PackageEditor getEditor()
{
return (PackageEditor)getActivePage().getActiveEditor();
}
public DefaultEditDomain getEditDomain()
{
return (DefaultEditDomain)getEditor().getViewer().getEditDomain();
}
public PaletteViewer getPaletteViewer()
{
return getEditDomain().getPaletteViewer();
}
/**
*
* @param obj
* @param type
*/
public void updateContext(Object obj , String type)
{
String name = "";
String id = "";
String idType = "";
if(type.equals("component"))
{
idType = "packageID";
}
if(type.equals("componentdetail") || type.equals("enumdetail"))
{
idType = "componentID";
}
if(type.equals("workflow"))
{
idType = "id";
}
if(type.equals("subflow"))
{
idType = "subflowId";
}
try
{
name = (String)PropertyUtils.getProperty(obj, "name");
id = (String)PropertyUtils.getProperty(obj, idType);
}
catch (IllegalAccessException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (InvocationTargetException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (NoSuchMethodException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
containerFactory = new ContainerFactory(this.getProject());
editor = this.getEditor();
MsElement parent = editor.getCurrentElement();
MsElement newElement = new MsElement();
newElement.setContainer(containerFactory.getContainer(type , name));
newElement.setNodeType(type);
newElement.setId(id);
newElement.setNodeName(name);
if(parent == null)
{
parent = new MsElement();
parent.setNodeName(editor.getInput().getEditorName());
parent.setNodeType(editor.getInput().getEditorType());
parent.setContainer(editor.getViewer().getContents().getModel());
}
parent.addChild(newElement);
newElement.setParent(parent);
editor.setCurrentElement(parent);
this.addElement(newElement);
}
/**
*
*
*/
public void preOperation()
{
PackageEditor editor = this.getEditor();
MsElement element = editor.getCurrentElement();
if(element == null)
{
element = new MsElement();
element.setNodeName(editor.getInput().getEditorName());
element.setNodeType(editor.getInput().getEditorType());
}
element.setContainer(editor.getViewer().getContents().getModel());
this.addElement(element);
// if(element.getParent() != null)
// {
// element.getParent().addChild(element);
// }
}
/**
*
* @param editPart
* @param type
*/
public void change(EditPart editPart , String type)
{
PackageEditor editor = this.getEditor();
Object container = editPart.getParent().getModel();
Object node = editPart.getModel();
String name = editor.getNodeName();
MsElement current = editor.getCurrentElement();
if(current == null)
{
current = new MsElement();
current.setContainer(container);
current.setNodeName(name);
current.setNodeType(type);
}
editor.setCurrentElement(current);
project = editor.getProject();
String nodeName = "";
try
{
nodeName = (String)PropertyUtils.getProperty(node, "name");
}
catch (IllegalAccessException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (InvocationTargetException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (NoSuchMethodException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
// if(current.getParent() != null)
// {
// current.getParent().addChild(current);
// }
if(type.equals("package"))
{
project.setPackageName(nodeName);
editor.setProject(project);
this.setProject(project);
this.addElement(current);
this.changeContext("component",nodeName);
}
if(type.equals("component"))
{
if(node instanceof net.ms.designer.editors.component.models.EnumComponent)
{
project.setComponentName(nodeName);
editor.setProject(project);
this.setProject(project);
this.addElement(current);
this.changeContext("enumdetail",nodeName);
}
if(node instanceof net.ms.designer.editors.component.models.BizComponent)
{
project.setComponentName(nodeName);
editor.setProject(project);
this.setProject(project);
this.addElement(current);
this.changeContext("componentdetail",nodeName);
}
}
if(type.equals("componentdetail"))
{
project.setWorkflowName(nodeName);
editor.setProject(project);
this.setProject(project);
this.addElement(current);
this.changeContext("workflow",nodeName);
}
if(type.equals("workflow"))
{
project.setWorkflowName(nodeName);
editor.setProject(project);
this.setProject(project);
this.addElement(current);
this.changeContext("subflow",nodeName);
}
}
}