package com.netifera.platform.ui.probe;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import com.netifera.platform.api.log.ILogger;
import com.netifera.platform.api.model.ISpace;
import com.netifera.platform.api.model.IWorkspace;
import com.netifera.platform.api.probe.IProbe;
import com.netifera.platform.ui.actions.SpaceAction;
import com.netifera.platform.ui.spaces.SpaceEditorInput;
public class OpenSpaceAction extends SpaceAction {
private final IProbe probe;
private final ILogger logger;
private final IWorkbenchPage page;
public OpenSpaceAction(IProbe probe, ILogger logger) {
super("Open New Space For This Probe");
setImageDescriptor(Activator.getDefault().getImageCache().getDescriptor("icons/new_space.png"));
this.probe = probe;
this.logger = logger;
this.page = getActivePage();
}
private IWorkbenchPage getActivePage() {
/* hack around stupid java 'final' rule for anonymous inner classes */
final IWorkbenchPage[] pageHolder = new IWorkbenchPage[1];
PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
public void run() {
final IWorkbench wb = PlatformUI.getWorkbench();
if(wb == null) return;
final IWorkbenchWindow window = wb.getActiveWorkbenchWindow();
if(window == null) return;
pageHolder[0] = window.getActivePage();
}
});
return pageHolder[0];
}
public void run() {
if(page == null) {
logger.warning("Cannot open editor on probe because no active page was found");
return;
}
final IWorkspace workspace = Activator.getDefault().getModel().getCurrentWorkspace();
final ISpace space = workspace.createSpace(probe.getEntity(), probe);
space.open();
final IEditorInput input = new SpaceEditorInput(space);
PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
public void run() {
try {
page.openEditor(input, SpaceEditorInput.ID);
} catch(PartInitException e) {
logger.error("Failed to open editor", e);
}
}
});
}
}