package net.ms.designer.ui.view;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import net.ms.designer.core.MsContext;
import net.ms.designer.core.MsEditorInput;
import net.ms.designer.core.MsElement;
import net.ms.designer.core.MsProject;
import net.ms.designer.core.DBTool;
import net.ms.designer.core.IOStreams;
import net.ms.designer.editors.packages.ui.PackageEditor;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.internal.UIPlugin;
import org.eclipse.ui.part.ViewPart;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class MsTreeView extends ViewPart
{
private MsEditorInput editorInput = new MsEditorInput();
private MsContext context;
private List projectList;
public static TreeViewer tv;
// private List editorList = new ArrayList();
// 2006/10/08 update by mashuai
private MsProject project;
// static IWorkbenchPage workbenchpage = UIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage();
static String packageEditorID = "net.ms.designer.editors.packages.ui.PackageEditor";
static String workflowEditorID = "net.ms.designer.editors.workflow.ui.WorkflowEditor";
static String componentEditorID = "net.ms.designer.editors.component.ui.ComponentEditor";
static String enumDetailEditorID = "net.ms.designer.editors.enumcomponentdetail.ui.EnumDetailEditor";
static String componentDetailEditorID = "net.ms.designer.editors.componentdetail.ui.CompDetailEditor";
String viewID = "net.ms.designer.ui.view.MsTreeView";
public HashMap projectAndEditorInput = new HashMap();
// 2006/10/08 update by mashuai
public MsProject getProject()
{
return this.project;
}
public void setProject(MsProject project)
{
this.project = project;
}
public List getProjectList()
{
this.setProjectList();
return this.projectList;
}
public void setProjectList()
{
IProject[] project = ResourcesPlugin.getWorkspace().getRoot().getProjects();
projectList = new ArrayList();
for(int i =0 ; i<project.length ; i++)
{
projectList.add(project[i]);
}
}
public Composite openShell(Composite parent)
{
Composite c = new Composite(parent, SWT.NONE);
c.setLayout(new FillLayout());
tv = new TreeViewer(c, SWT.BORDER);
tv.setContentProvider(new TreeViewerContentProvider());
tv.setLabelProvider(new TreeViewerLableProvider());
//��TableViewerһ�������ݵ����Ҳ��setInput����
this.setProjectList();
this.getProjectList();
if(this.projectList == null){
//System.out.println("null");
}
//System.out.println("not null");
DataFactory.tv = this.tv;
Object inputObj = DataFactory.createTreeData(this.projectList);
tv.setInput(inputObj);
return c;
}
/**
* �Զ��巽����ȡ�õ�ǰѡ��Ľ��
*/
public ITreeEntry getSelTreeEntry()
{
IStructuredSelection selection = (IStructuredSelection) tv.getSelection();
ITreeEntry entry = (ITreeEntry) (selection.getFirstElement());
return entry;
}
public void createPartControl(Composite parent)
{
this.openShell(parent);
tv.addDoubleClickListener(new IDoubleClickListener()
{
public void doubleClick(DoubleClickEvent event)
{
ITreeEntry obj = getSelTreeEntry();
String editorType = obj.getType();
String projectName = obj.getProjectName();
String editorID = null;
IWorkbenchPage page = getViewSite().getPage();
try
{
if(editorType.toLowerCase().equals(("package").toLowerCase()))
{
// if project obj is null,the the project is exist;
if(project == null)
{
project = new MsProject();
project.setProjectName(projectName);
project.setDbtool(this.getDBTool(projectName));
project.setDirectory(ResourcesPlugin.getWorkspace().getRoot().getProject(projectName).getLocation().toOSString());
project.setGenPackageName(this.getGenPackageName(projectName));
}
}
if(editorType.toLowerCase().equals(("component").toLowerCase()))
{
PackageEntity packageEntity = (PackageEntity) obj;
// if(project == null){
if(project == null)
{
project = new MsProject();
}
project.setProjectName(projectName);
project.setPackageName(packageEntity.getName());
project.setDbtool(this.getDBTool(projectName));
project.setDirectory(ResourcesPlugin.getWorkspace().getRoot().getProject(projectName).getLocation().toOSString());
project.setGenPackageName(this.getGenPackageName(projectName));
// }
}
if(editorType.toLowerCase().equals(("componentdetail").toLowerCase()))
{
ComponentEntity componentEntity = (ComponentEntity) obj;
if(project == null)
{
project = new MsProject();
}
project.setProjectName(projectName);
project.setPackageName(componentEntity.getPackageName());
project.setComponentName(componentEntity.getName());
project.setDbtool(this.getDBTool(projectName));
project.setDirectory(ResourcesPlugin.getWorkspace().getRoot().getProject(projectName).getLocation().toOSString());
project.setGenPackageName(this.getGenPackageName(projectName));
}
if(editorType.toLowerCase().equals(("enumdetail").toLowerCase()))
{
EnumEntity enumEntity = (EnumEntity) obj;
if(project == null)
{
project = new MsProject();
}
project.setProjectName(projectName);
project.setPackageName(enumEntity.getPackageName());
project.setComponentName(enumEntity.getName());
project.setDbtool(this.getDBTool(projectName));
project.setDirectory(ResourcesPlugin.getWorkspace().getRoot().getProject(projectName).getLocation().toOSString());
project.setGenPackageName(this.getGenPackageName(projectName));
}
if(editorType.toLowerCase().equals(("workflow").toLowerCase()))
{
WorkflowEntity workflowEntity = (WorkflowEntity) obj;
if(project == null){
project = new MsProject();
project.setProjectName(projectName);
project.setPackageName(workflowEntity.getPackageName());
project.setComponentName(workflowEntity.getComponentName());
project.setWorkflowName(workflowEntity.getWorkflowName());
project.setDbtool(this.getDBTool(projectName));
project.setDirectory(ResourcesPlugin.getWorkspace().getRoot().getProject(projectName).getLocation().toOSString());
project.setGenPackageName(this.getGenPackageName(projectName));
}
}
project.setName(projectName);
project.setType(obj.getType());
PackageEditor editor = (PackageEditor)UIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow()
.getActivePage().getActiveEditor();
// IEditorPart [] editors = UIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow()
// .getActivePage().getEditors();
// if(editors.length != 0)
// {
// PackageEditor editor = null;
// for(int i = 0 ; i < editors.length ; i++)
// {
// if(editors[i].getEditorInput().getName().equals(obj.getName()))
// {
// editor = (PackageEditor)editors[i];
// }
// }
if(editor!=null)
{
MsContext context = editor.getContext();
MsElement element = context.getElement(obj.getType() + "_" + obj.getName());
if(element == null)
{
element = new MsElement();
element.setNodeName(editor.getNodeName());
element.setNodeType(editor.getNodeType());
element.setContainer(editor.getViewer().getContents().getModel());
context.addElement(element);
}
// editor.setCurrentElement(element);
// if(element.getParent() != null)
// {
// element.getParent().addChild(element);
// }
context.changeContext(obj.getType() , obj.getName());
page.bringToTop(editor);
}
// }
else
{
MsEditorInput input = new MsEditorInput();
input.setName(obj.getName());
input.setTreeView((MsTreeView)(UIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage()).findView(viewID));
input.setEditorName(obj.getName());
input.setEditorType(obj.getType());
// 2006/10/08 update by mashuai
input.setProject(project);
IOStreams stream = new IOStreams();
String contextPath = project.getConfigPath() + "context";
File file = new File(contextPath);
if(file.exists() && file.length() != 0)
{
try
{
context = (MsContext)stream.inputs(contextPath);
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (ClassNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
input.setContext(context);
page.openEditor(input,"net.ms.designer.editors.packages.ui.PackageEditor");
}
}
catch(Exception ee)
{
ee.printStackTrace();
}
}
private String getGenPackageName(String projectName)
{
String filePath = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName).getFolder(".configure").getFile("project.xml").getLocation().toOSString();
try
{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(filePath);
document.normalize();
if(document.getDocumentElement()==null)
{
return null;
}
Element genPackageName = (Element)document.getElementsByTagName("packagename").item(0);
String result = genPackageName.getFirstChild().getNodeValue();
return result;
// if(document.getDocumentElement()!=null)
// {
// Element richweb = document.getDocumentElement();
//
// if(richweb.getElementsByTagName("project")!=null||richweb.getElementsByTagName("project").getLength()>0)
// {
// Element projectXML = (Element) richweb.getElementsByTagName("project").item(0);
// NodeList companyList = projectXML.getElementsByTagName("company");
// if(companyList == null||companyList.getLength()<1)
// {
// return null;
// }
// else
// {
// String company = companyList.item(0).getFirstChild().getNodeValue().toString();
// String genPackageName = "com."+company;
// return genPackageName;
// }
// }
// }
}
catch(Exception e)
{
e.printStackTrace();
}
return null;
}
private DBTool getDBTool(String projectName){
String filePath = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName).getFolder(".configure").getFile("project.xml").getLocation().toOSString();
try{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(filePath);
document.normalize();
if(document.getDocumentElement()==null){
return null;
}
if(document.getDocumentElement()!=null){
Element richweb = document.getDocumentElement();
if(richweb.getElementsByTagName("project")!=null||richweb.getElementsByTagName("project").getLength()>0){
Element projectXML = (Element) richweb.getElementsByTagName("project").item(0);
NodeList DataSourceList = projectXML.getElementsByTagName("DataSource");
if(DataSourceList == null||DataSourceList.getLength()<1){
return null;
}
else{
DBTool tool = new DBTool();
Element dataSource = (Element) DataSourceList.item(0);
if(dataSource.getElementsByTagName("DataSourceName") != null
|| dataSource.getElementsByTagName("DataSourceName").getLength()>0)
tool.setConName(dataSource.getElementsByTagName("DataSourceName").item(0).getFirstChild().getNodeValue());
if(dataSource.getElementsByTagName("username") != null
|| dataSource.getElementsByTagName("username").getLength()>0)
tool.setUsername(dataSource.getElementsByTagName("username").item(0).getFirstChild().getNodeValue());
if(dataSource.getElementsByTagName("password") != null
|| dataSource.getElementsByTagName("password").getLength()>0)
tool.setPassword(dataSource.getElementsByTagName("password").item(0).getFirstChild().getNodeValue());
if(dataSource.getElementsByTagName("type") != null
|| dataSource.getElementsByTagName("type").getLength()>0)
tool.setDbType(dataSource.getElementsByTagName("type").item(0).getFirstChild().getNodeValue());
if(dataSource.getElementsByTagName("database") != null
|| dataSource.getElementsByTagName("database").getLength()>0)
tool.setDbName(dataSource.getElementsByTagName("database").item(0).getFirstChild().getNodeValue());
if(dataSource.getElementsByTagName("port") != null
|| dataSource.getElementsByTagName("port").getLength()>0)
tool.setPort(dataSource.getElementsByTagName("port").item(0).getFirstChild().getNodeValue());
if(dataSource.getElementsByTagName("server") != null
|| dataSource.getElementsByTagName("server").getLength()>0)
tool.setServer(dataSource.getElementsByTagName("server").item(0).getFirstChild().getNodeValue());
// if(dataSource.getElementsByTagName("maxConnections") != null
// || dataSource.getElementsByTagName("maxConnections").getLength()>0)
return tool;
}
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
return null;
}
});
}
public void setFocus()
{
// TODO Auto-generated method stub
}
public void refresh()
{
tv.setContentProvider(new TreeViewerContentProvider());
tv.setLabelProvider(new TreeViewerLableProvider());
this.setProjectList();
this.getProjectList();
DataFactory.tv = this.tv;
Object inputObj = DataFactory.createTreeData(this.projectList);
tv.setInput(inputObj);
tv.refresh();
}
public Document getDocument(String projectName)
{
String filePath = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName).getFolder("configure").getFile("project.xml").getLocation().toOSString();
Document document = null;
try
{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
document = builder.parse(filePath);
document.normalize();
}
catch(Exception e)
{
e.printStackTrace();
}
return document;
}
}