package org.flowerplatform.eclipse.part;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.browser.BrowserFunction;
import org.eclipse.swt.browser.LocationAdapter;
import org.eclipse.swt.browser.LocationEvent;
import org.eclipse.swt.browser.ProgressAdapter;
import org.eclipse.swt.browser.ProgressEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorLauncher;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IPersistableElement;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.model.AdaptableList;
import org.eclipse.ui.part.FileEditorInput;
import org.flowerplatform.editor.EditorPlugin;
import org.flowerplatform.editor.remote.EditableResource;
public class FlowerDiagramEditorLauncher implements IEditorLauncher {
/**
* Called when the user duble-click on a notation file.
* Loads the file if not loaded, else set focus on it
*
* @author Sebastian Solomon
*/
//it will be set when the answer comes from javascript
boolean isOpenedFlag = false;
//needed to know in what editor is the file oppend when the answer comes from javascrips
FlowerDiagramEditor currentEditor;
@Override
public void open(IPath file) {
// transformation from IPath to IFile
IFile[] iFiles = ResourcesPlugin.getWorkspace().getRoot()
.findFilesForLocation(file);
final FileEditorInput fileEditorInput = new FileEditorInput(iFiles[0]);
if (!isFileOpened(fileEditorInput)) {
PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
public void run() {
try {
IEditorPart editor = PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getActivePage()
.getActiveEditor();
if (editor != null) {
if (editor instanceof FlowerDiagramEditor) {
((FlowerDiagramEditor) editor).getBrowser()
.execute(
"handleLink('openResources="
+ fileEditorInput
.getFile()
.getFullPath()
+ "')");
return;
} else {// find the last opened FlowerDiagramEditor,
// &set focus on it
IEditorReference[] editorReference = PlatformUI
.getWorkbench()
.getActiveWorkbenchWindow()
.getActivePage().getEditorReferences();
for (int i = editorReference.length - 1; i >= 0; i--) {
IEditorPart edit = editorReference[i]
.getEditor(false);
if (edit instanceof FlowerDiagramEditor) {
((FlowerDiagramEditor) edit)
.getBrowser()
.execute(
"handleLink('openResources="
+ fileEditorInput
.getFile()
.getFullPath()
+ "')");
PlatformUI.getWorkbench()
.getActiveWorkbenchWindow()
.getActivePage().activate(edit);
return;
}
}
}
}
// if no FlowerDiagram editors, open a new one
IDE.openEditor(PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getActivePage(),
fileEditorInput, FlowerDiagramEditor.EDITOR_ID);
} catch (Exception e) {
throw new RuntimeException("Could not open editor.", e);
}
}
});
}
}
private boolean isFileOpened(FileEditorInput file) {
IEditorReference[] editorReference = PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getActivePage()
.getEditorReferences();
for (int i = 0; i < editorReference.length; i++) {
IEditorPart edit = editorReference[i].getEditor(false);
if (edit instanceof FlowerDiagramEditor) {
final Browser browser = ((FlowerDiagramEditor) edit)
.getBrowser();
final BrowserFunction function = new GetIsDiagramOpened(browser,
"sendIsDiagramOpenedToJava");
browser.addProgressListener(new ProgressAdapter() {
public void completed(ProgressEvent event) {
browser.addLocationListener(new LocationAdapter() {
public void changed(LocationEvent event) {
browser.removeLocationListener(this);
// System.out.println
// ("left java function-aware page, so disposed CustomFunction");
function.dispose();
}
});
}
});
currentEditor = (FlowerDiagramEditor) edit;
((FlowerDiagramEditor) edit).getBrowser().execute(
"isFileOpened('" + file.getFile().getFullPath() + "')");
}
}
return isOpenedFlag;
}
// Called by JavaScript
class GetIsDiagramOpened extends BrowserFunction {
GetIsDiagramOpened(Browser browser, String name) {
super(browser, name);
}
public Object function(Object[] arguments) {
boolean isOpened = ((Boolean) arguments[0]).booleanValue();
FlowerDiagramEditorLauncher.this.isOpenedFlag = isOpened;
if (isOpened) {
PlatformUI.getWorkbench().getActiveWorkbenchWindow()
.getActivePage().activate(currentEditor);
}
return null;
}
}
}