/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.editor;
import java.util.StringTokenizer;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.*;
import org.eclipse.ui.part.*;
import org.jboss.tools.common.core.resources.XModelObjectEditorInput;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.common.model.ui.ModelUIPlugin;
import org.jboss.tools.common.model.ui.editor.*;
public class XMLEditorLauncher implements IEditorLauncher {
public void open(IFile file) {
FileEditorInput f = new FileEditorInput(file);
IEditorInput input = XModelObjectEditorInput.checkInput(f);
String entity = computeEntity(input);
EditorPartWrapperExtension extension = EditorPartWrapperExtension.getInstance();
EditorPartFactory factory = extension.getFactory(entity);
String id = factory.getEditorId();
if(id == null) id = "org.jboss.tools.common.text.xml.internal.ui.xmleditor.XmlEditor"; //$NON-NLS-1$
new Thread(new LaunchThread(id, input)).start();
}
static String DEFAULT_ENTITY = "xml"; //$NON-NLS-1$
private String computeEntity(IEditorInput input) {
if(!(input instanceof IModelObjectEditorInput)) return DEFAULT_ENTITY;
IModelObjectEditorInput i = (IModelObjectEditorInput)input;
XModelObject o = i.getXModelObject();
if(o == null) return DEFAULT_ENTITY;
EditorPartWrapperExtension extension = EditorPartWrapperExtension.getInstance();
EditorPartFactory f = extension.getFactory(o.getModelEntity().getName());
if(f == null) return DEFAULT_ENTITY;
return o.getModelEntity().getName();
}
class LaunchThread implements Runnable {
String id;
IEditorInput input;
LaunchThread(String id, IEditorInput input) {
this.id = id;
this.input = input;
}
public void run() {
Display.getDefault().syncExec(
new Runnable() {
public void run() {
IWorkbenchPage workbenchPage = ModelUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage();
int time = 100;
while(workbenchPage.findEditor(input) != null) {
if(time > 1000) return;
try {
Thread.sleep(time);
} catch (InterruptedException e) {
//ignore
}
time *= 2;
}
try {
workbenchPage.openEditor(input, id);
} catch (PartInitException e) {
ModelUIPlugin.getPluginLog().logError((Exception)e);
}
}
}
);
}
}
public static IFile convert(IPath path) {
String location = path.toFile().getAbsolutePath();
IProject[] projects = ModelUIPlugin.getWorkspace().getRoot().getProjects();
for (int i = 0; projects != null && i < projects.length; i++) {
if (!projects[i].isOpen()) continue;
IFile f = find(projects[i], location);
if(f != null) return f;
IResource[] rs = null;
try {
rs = projects[i].members(true);
} catch (CoreException e) {
//ignore
}
if(rs != null) for (int j = 0; j < rs.length; j++) {
if(!rs[j].isLinked()) continue;
f = find(rs[j], location);
if(f != null) return f;
}
}
return ModelUIPlugin.getWorkspace().getRoot().getFile(path);
}
public void open(IPath path) {
open(convert(path));
}
private static IFile find(IResource resource, String location) {
String l = resource.getLocation().toFile().getAbsolutePath();
if (!location.startsWith(l)) return null;
String relative = location.substring(l.length()).replace('\\', '/');
StringTokenizer st = new StringTokenizer(relative, "/"); //$NON-NLS-1$
while(st.hasMoreTokens()) {
String token = st.nextToken();
if (resource instanceof IContainer) {
IContainer container = (IContainer)resource;
resource = container.findMember(token);
if (resource == null) break;
else if(!st.hasMoreTokens() && resource instanceof IFile) return (IFile)resource;
} else break;
}
return null;
}
}