package com.netifera.platform.ui.internal.spaces; import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.action.ICoolBarManager; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.ToolBarContributionItem; import org.eclipse.jface.action.ToolBarManager; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorReference; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction; import org.eclipse.ui.plugin.AbstractUIPlugin; import org.osgi.framework.BundleContext; import org.osgi.util.tracker.ServiceTracker; import com.netifera.platform.api.log.ILogManager; import com.netifera.platform.api.model.IModelService; import com.netifera.platform.api.probe.IProbe; import com.netifera.platform.api.probe.IProbeManagerService; import com.netifera.platform.ui.api.actions.IEntityActionProviderService; import com.netifera.platform.ui.api.inputbar.IInputBarActionProviderService; import com.netifera.platform.ui.api.model.IEntityLabelProviderService; import com.netifera.platform.ui.application.ApplicationPlugin; import com.netifera.platform.ui.application.Perspective; import com.netifera.platform.ui.images.ImageCache; import com.netifera.platform.ui.spaces.IStatusContribution; import com.netifera.platform.ui.spaces.SpaceEditorInput; import com.netifera.platform.ui.spaces.actions.SpaceCreator; import com.netifera.platform.ui.spaces.inputbar.InputBar; import com.netifera.platform.ui.spaces.inputbar.InputBarAction; import com.netifera.platform.ui.spaces.visualizations.ISpaceVisualizationFactory; import com.netifera.platform.ui.workbench.IWorkbenchChangeListener; import com.netifera.platform.ui.workbench.WorkbenchChangeManager; /** * The activator class controls the plug-in life cycle */ public class Activator extends AbstractUIPlugin { // The plug-in ID public static final String PLUGIN_ID = "com.netifera.platform.ui.spaces"; // The shared instance private static Activator plugin; public static Activator getDefault() { return plugin; } private ServiceTracker modelTracker; private ServiceTracker probeManagerTracker; private ServiceTracker modelLabelsTracker; private ServiceTracker actionProviderServiceTracker; private ServiceTracker inputBarActionProviderTracker; private ServiceTracker logManagerTracker; private ServiceTracker visualizationFactoryTracker; private ServiceTracker statusContributionTracker; private InputBar inputBar; private IContributionItem inputBarItem; private IWorkbenchAction inputBarAction; private ToolBarContributionItem toolbarItem; private boolean isDisabled; private boolean saveActionState; private WorkbenchChangeManager workbenchManager; private ImageCache imageCache; /** * The constructor */ public Activator() { } public void initialize() { workbenchManager = new WorkbenchChangeManager(getWindow(), Perspective.ID, createChangeListener()); PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() { public void run() { workbenchManager.initialize(); } }); } private void createFirstSpaceIfNeeded(IWorkbenchWindow window) { if(hasSpaces()) return; SpaceCreator creator = new SpaceCreator(window); creator.create(); } private boolean hasSpaces() { return getModel().getCurrentWorkspace().getAllSpaces().size() > 0; } public void start(BundleContext context) throws Exception { super.start(context); plugin = this; imageCache = new ImageCache(PLUGIN_ID); modelTracker = new ServiceTracker(context, IModelService.class.getName(), null); modelTracker.open(); probeManagerTracker = new ServiceTracker(context, IProbeManagerService.class.getName(), null); probeManagerTracker.open(); modelLabelsTracker = new ServiceTracker(context, IEntityLabelProviderService.class.getName(), null); modelLabelsTracker.open(); actionProviderServiceTracker = new ServiceTracker(context, IEntityActionProviderService.class.getName(), null); actionProviderServiceTracker.open(); inputBarActionProviderTracker = new ServiceTracker(context, IInputBarActionProviderService.class.getName(), null); inputBarActionProviderTracker.open(); logManagerTracker = new ServiceTracker(context, ILogManager.class.getName(), null); logManagerTracker.open(); visualizationFactoryTracker = new ServiceTracker(context, ISpaceVisualizationFactory.class.getName(), null); visualizationFactoryTracker.open(); statusContributionTracker = new ServiceTracker(context, IStatusContribution.class.getName(), null); statusContributionTracker.open(); } private IWorkbenchChangeListener createChangeListener() { return new IWorkbenchChangeListener() { public void activePageOpened(IWorkbenchPage page) { runActivePageSetup(page); } public void partChange() { updateState(); // setStatusLine(); } public void perspectiveClosed() { if(toolbarItem != null) { ApplicationPlugin.getDefault().getCoolBar().remove(toolbarItem); toolbarItem.dispose(); toolbarItem = null; inputBarItem = null; inputBarAction = null; } } public void perspectiveOpened() { displayToolbar(); } }; } private void runActivePageSetup(final IWorkbenchPage page) { closeDeadEditors(page); getWorkbench().getDisplay().asyncExec(new Runnable() { public void run() { createFirstSpaceIfNeeded(page.getWorkbenchWindow()); // setStatusLine(); } }); } private void closeDeadEditors(final IWorkbenchPage page) { /* Detect RCP error editors */ final IEditorReference[] editorReferences = page.getEditorReferences(); for(IEditorReference ref : editorReferences) { IEditorPart part = ref.getEditor(true); IEditorInput editorInput = part.getEditorInput(); if(!(editorInput instanceof SpaceEditorInput)) { page.closeEditor(part, false); } } } private void updateState() { enableToolbar(); IEditorPart editor = getActiveEditor(); if(editor == null) { disableToolbar("Open a space to enable."); return; } IEditorInput input = editor.getEditorInput(); if(!(input instanceof SpaceEditorInput)) { disableToolbar("Internal error"); return; } IProbe probe = ((SpaceEditorInput) input).getProbeForSpace(); if(!probe.isConnected()) { disableToolbar("Connect to probe to enable."); } } private void disableToolbar(String message) { if(isDisabled || toolbarItem == null) return; isDisabled = true; saveActionState = inputBarAction.isEnabled(); inputBarAction.setEnabled(false); inputBar.setDisabled(message); } private void enableToolbar() { if(!isDisabled || toolbarItem == null) return; isDisabled = false; inputBarAction.setEnabled(saveActionState); inputBar.setEnabled(); } private IWorkbenchWindow getWindow() { IWorkbenchWindow[] windows = getWorkbench().getWorkbenchWindows(); if(windows.length == 0) { return null; } return windows[0]; } private void displayToolbar() { if(toolbarItem != null) { return; } final ICoolBarManager coolbar = ApplicationPlugin.getDefault().getCoolBar(); final IToolBarManager toolbar = new ToolBarManager(coolbar.getStyle()); toolbarItem = new ToolBarContributionItem(toolbar); coolbar.add(toolbarItem); // coolbar.appendToGroup("space-actions", toolbarItem); inputBar = new InputBar("input.bar"); inputBarItem = inputBar; inputBarAction = new InputBarAction(inputBar); toolbar.add(inputBarItem); toolbar.add(inputBarAction); PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { public void run() { coolbar.update(true); updateState(); } }); } /* private void setStatusLine() { IEditorPart editor = getActiveEditor(); if(editor == null) return; IStatusLineManager statusLine = editor.getEditorSite().getActionBars().getStatusLineManager(); // In case it already exists statusLine.remove(statusLineItem); statusLine.add(statusLineItem); statusLine.update(true); } */ public void stop(BundleContext context) throws Exception { imageCache.dispose(); imageCache = null; plugin = null; super.stop(context); } /** * Returns an image descriptor for the image file at the given * plug-in relative path * * @param path the path * @return the image descriptor */ public static ImageDescriptor getImageDescriptor(String path) { return imageDescriptorFromPlugin(PLUGIN_ID, path); } public IModelService getModel() { return (IModelService) modelTracker.getService(); } public IProbeManagerService getProbeManager() { return (IProbeManagerService) probeManagerTracker.getService(); } public IEntityLabelProviderService getLabelProvider() { return (IEntityLabelProviderService) modelLabelsTracker.getService(); } public IEntityActionProviderService getActionProvider() { return (IEntityActionProviderService) actionProviderServiceTracker.getService(); } public IInputBarActionProviderService getInputBarActionProvider() { return (IInputBarActionProviderService) inputBarActionProviderTracker.getService(); } public ILogManager getLogManager() { return (ILogManager) logManagerTracker.getService(); } public ImageCache getImageCache() { return imageCache; } public ISpaceVisualizationFactory getVisualizationFactory() { try { return (ISpaceVisualizationFactory) visualizationFactoryTracker.waitForService(10000L); } catch (InterruptedException e) { Thread.currentThread().interrupt(); return null; } } public IStatusContribution getStatusContribution() { return (IStatusContribution) statusContributionTracker.getService(); } public IEditorPart getActiveEditor() { IWorkbenchWindow window = getWorkbench().getActiveWorkbenchWindow(); if(window == null) { return null; } IWorkbenchPage activePage = window.getActivePage(); if(activePage == null) { return null; } return activePage.getActiveEditor(); } }