blob: 21b2f089f9bf7ac47c84119a21060761d8281728 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2010 Soyatec (http://www.soyatec.com) and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Soyatec - initial API and implementation
*******************************************************************************/
package org.eclipse.xwt.tools.ui.designer.loader;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Path;
import org.eclipse.xwt.XWTLoader;
import org.eclipse.xwt.metadata.IMetaclass;
import org.eclipse.xwt.metadata.IProperty;
import org.eclipse.xwt.utils.PathHelper;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.xwt.tools.ui.designer.editor.XWTDesigner;
import org.eclipse.xwt.tools.ui.designer.editor.model.XWTModelBuilder;
import org.eclipse.xwt.tools.ui.designer.loader.metadata.HeightProperty;
import org.eclipse.xwt.tools.ui.designer.loader.metadata.WidthProperty;
import org.eclipse.xwt.tools.ui.xaml.XamlDocument;
import org.eclipse.xwt.ui.utils.ProjectContext;
/**
* @author jliu jin.liu@soyatec.com
*/
public class XWTVisualLoader extends XWTLoader {
private static IProperty widthProperty;
private static IProperty heightProperty;
private IFile file;
public XWTVisualLoader(IFile file) {
if (file != null && file.exists()) {
IJavaProject project = JavaCore.create(file.getProject());
if (project != null && project.exists()) {
ProjectContext context = ProjectContext.getContext(project);
setLoadingContext(context);
}
this.file = file;
}
}
public URL getResourcePath() {
if (file != null && file.exists()) {
try {
return file.getLocation().toFile().toURI().toURL();
} catch (MalformedURLException e) {
}
}
return null;
}
/*
* (non-Javadoc)
* @see org.eclipse.xwt.XWTLoader#loadWithOptions(java.io.InputStream, java.net.URL, java.util.Map)
*/
public synchronized Object loadWithOptions(InputStream stream, URL base, Map<String, Object> options)
throws Exception {
// FIXME:
return super.loadWithOptions(stream, base, options);
}
/*
* (non-Javadoc)
* @see org.eclipse.xwt.XWTLoader#loadWithOptions(java.net.URL, java.util.Map)
*/
public synchronized Control loadWithOptions(URL url, Map<String, Object> options) throws Exception {
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IWorkspaceRoot root = workspace.getRoot();
String fileStr = url.getFile();
if (fileStr.indexOf(PathHelper.WHITE_SPACE_ASCII) != -1) {
fileStr = fileStr.replace(PathHelper.WHITE_SPACE_ASCII, " ");
}
IFile file = root.getFileForLocation(new Path(fileStr));
if (file != null) {
try {
// the url given an binary file of project, we need find the source file of it and the load and open.
IProject project = file.getProject();
String fullPath = file.getFullPath().toString();
IJavaProject javaProject = JavaCore.create(project);
String outputPath = javaProject.getOutputLocation().toString();
if (fullPath != null && outputPath != null && fullPath.startsWith(outputPath)) {
String fileSourcePath = fullPath.substring(outputPath.length());
IPackageFragmentRoot[] allPackageFragmentRoots = javaProject.getAllPackageFragmentRoots();
for (IPackageFragmentRoot pRoot : allPackageFragmentRoots) {
if (pRoot.getKind() == IPackageFragmentRoot.K_SOURCE) {
IFolder resource = (IFolder) pRoot.getResource();
IFile sourceFile = resource.getFile(new Path(fileSourcePath));
if (sourceFile != null && sourceFile.exists()) {
file = sourceFile;
break;
}
}
}
}
} catch (Exception e) {
}
}
if (file != null) {
IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
IEditorPart activeEditor = activePage.getActiveEditor();
try {
XWTDesigner designer = (XWTDesigner) activePage.openEditor(new FileEditorInput(file),
XWTDesigner.EDITOR_ID, false);
XamlDocument xamlDocument = (XamlDocument) designer.getDocumentRoot();
XWTModelBuilder builder = null;
if (xamlDocument == null) {
builder = new XWTModelBuilder();
builder.doLoad(designer, null);
xamlDocument = builder.getDiagram();
}
Control control = (Control) new XWTProxy(file).load(xamlDocument.getRootElement(), options);
if (builder != null) {
builder.dispose();
}
return control;
} finally {
activePage.activate(activeEditor);
}
}
return null;
}
/*
* (non-Javadoc)
* @see org.eclipse.xwt.XWTLoader#registerMetaclass(java.lang.Class)
*/
public synchronized IMetaclass registerMetaclass(Class<?> type) {
IMetaclass metaclass = super.registerMetaclass(type);
if (metaclass != null && type != null && Control.class.isAssignableFrom(type)) {
IProperty[] properties = metaclass.getProperties();
if (properties != null) {
if (widthProperty == null) {
widthProperty = new WidthProperty();
}
if (heightProperty == null) {
heightProperty = new HeightProperty();
}
List<IProperty> propList = Arrays.asList(properties);
if (!propList.contains(widthProperty)) {
metaclass.addProperty(widthProperty);
}
if (!propList.contains(heightProperty)) {
metaclass.addProperty(heightProperty);
}
}
}
return metaclass;
}
}