| /** |
| * Copyright (c) 2009-2010 Thales Corporate Services S.A.S. |
| * This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-v2.0 |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * Thales Corporate Services S.A.S - initial API and implementation |
| */ |
| package org.eclipse.egf.core.pde; |
| |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.resources.IResourceChangeEvent; |
| import org.eclipse.core.resources.ISaveContext; |
| import org.eclipse.core.resources.ISaveParticipant; |
| import org.eclipse.core.resources.ISavedState; |
| import org.eclipse.core.resources.IWorkspace; |
| import org.eclipse.core.resources.IWorkspaceRunnable; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.core.runtime.jobs.Job; |
| import org.eclipse.egf.common.helper.ProjectHelper; |
| import org.eclipse.egf.common.ui.activator.EGFAbstractUIPlugin; |
| import org.eclipse.egf.core.fcore.IResourceFcoreListener; |
| import org.eclipse.egf.core.pde.extension.IFcoreExtensionFactory; |
| import org.eclipse.egf.core.pde.internal.FcoreGeneratorHelper; |
| import org.eclipse.egf.core.pde.internal.extension.FcoreExtensionFactory; |
| import org.eclipse.egf.core.pde.internal.resource.FcoreResourceListener; |
| import org.eclipse.egf.core.pde.l10n.EGFPDEMessages; |
| import org.eclipse.pde.core.plugin.IPluginModelBase; |
| import org.eclipse.pde.internal.core.ICoreConstants; |
| import org.eclipse.pde.internal.core.build.WorkspaceBuildModel; |
| import org.eclipse.swt.widgets.Display; |
| import org.eclipse.swt.widgets.Shell; |
| import org.eclipse.ui.IWorkbenchWindow; |
| import org.eclipse.ui.PlatformUI; |
| import org.osgi.framework.BundleContext; |
| |
| /** |
| * The activator class controls the plug-in life cycle |
| */ |
| public class EGFPDEPlugin extends EGFAbstractUIPlugin implements ISaveParticipant { |
| |
| /** |
| * The shared instance |
| */ |
| private static EGFPDEPlugin __plugin; |
| |
| /** |
| * Fcore Resource listener |
| */ |
| private FcoreResourceListener _fcoreResourceListener; |
| |
| /** |
| * Return the display. |
| * |
| * @return display |
| */ |
| public static Display getDisplay() { |
| // Get the display. |
| Display display = null; |
| if (PlatformUI.isWorkbenchRunning()) { |
| display = PlatformUI.getWorkbench().getDisplay(); |
| } else { |
| // Case of the headless mode. |
| display = Display.getDefault(); |
| } |
| return display; |
| } |
| |
| /** |
| * Returns the currently active window for this workbench (if any). Returns |
| * <code>null</code> if there is no active workbench window. Returns |
| * <code>null</code> if called from a non-UI thread. |
| * |
| * @return the active workbench window, or <code>null</code> if there is |
| * no active workbench window or if called from a non-UI thread |
| */ |
| public static IWorkbenchWindow getActiveWorkbenchWindow() { |
| return getDefault().getWorkbench().getActiveWorkbenchWindow(); |
| } |
| |
| /** |
| * Returns the currently active shell for this workbench (if any). |
| * |
| * @return the active workbench shell. |
| */ |
| public static Shell getActiveWorkbenchShell() { |
| IWorkbenchWindow window = getActiveWorkbenchWindow(); |
| if (window == null) { |
| IWorkbenchWindow[] windows = getDefault().getWorkbench().getWorkbenchWindows(); |
| if (windows.length > 0) { |
| return windows[0].getShell(); |
| } |
| } else { |
| return window.getShell(); |
| } |
| return null; |
| } |
| |
| /** |
| * @see org.eclipse.core.runtime.Plugin#start(org.osgi.framework.BundleContext) |
| */ |
| @Override |
| @SuppressWarnings("deprecation") |
| public void start(BundleContext context) throws Exception { |
| super.start(context); |
| __plugin = this; |
| // Listener initalization |
| _fcoreResourceListener = new FcoreResourceListener(); |
| // process deltas since last activated in indexer thread so that indexes are |
| // up-to-date. |
| // see https://bugs.eclipse.org/bugs/show_bug.cgi?id=38658 |
| final IWorkspace workspace = ResourcesPlugin.getWorkspace(); |
| Job processSavedState = new Job(EGFPDEMessages.savedState_jobName) { |
| |
| @Override |
| protected IStatus run(IProgressMonitor monitor) { |
| try { |
| // add save participant and process delta atomically |
| // see https://bugs.eclipse.org/bugs/show_bug.cgi?id=59937 |
| workspace.run(new IWorkspaceRunnable() { |
| |
| public void run(IProgressMonitor progress) throws CoreException { |
| if (__plugin == null) { |
| return; |
| } |
| |
| // Preserve deprecated API for backward compatibility |
| ISavedState savedState = workspace.addSaveParticipant(__plugin, __plugin); |
| if (savedState != null) { |
| // the event type coming from the saved state is always POST_BUILD |
| // force it to be POST_CHANGE so that the delta processor can handle it |
| _fcoreResourceListener._overridenEventType = IResourceChangeEvent.POST_CHANGE; |
| savedState.processResourceChangeEvents(_fcoreResourceListener); |
| _fcoreResourceListener._overridenEventType = -1; |
| } |
| } |
| }, monitor); |
| } catch (CoreException e) { |
| return e.getStatus(); |
| } |
| return Status.OK_STATUS; |
| } |
| }; |
| processSavedState.setSystem(true); |
| processSavedState.setPriority(Job.SHORT); |
| processSavedState.schedule(); |
| } |
| |
| public void doneSaving(ISaveContext saveContext) { |
| // Nothing to do |
| } |
| |
| public void prepareToSave(ISaveContext saveContext) throws CoreException { |
| // Nothing to do |
| } |
| |
| public void rollback(ISaveContext saveContext) { |
| // Nothing to do |
| } |
| |
| public void saving(ISaveContext saveContext) throws CoreException { |
| // no state to be saved by the plug-in, but request a |
| // resource delta to be used on next activation. |
| saveContext.needDelta(); |
| } |
| |
| /** |
| * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext) |
| */ |
| @Override |
| public void stop(BundleContext context) throws Exception { |
| // Stop our listeners |
| _fcoreResourceListener.dispose(); |
| _fcoreResourceListener = null; |
| super.stop(context); |
| __plugin = null; |
| } |
| |
| /** |
| * Returns the shared instance |
| * |
| * @return the shared instance |
| */ |
| public static EGFPDEPlugin getDefault() { |
| return __plugin; |
| } |
| |
| /** |
| * Get a factory component extension helper. |
| * |
| * @return IFcoreExtensionFactory |
| */ |
| public static IFcoreExtensionFactory getFcoreExtensionHelper() { |
| return FcoreExtensionFactory.getInstance(); |
| } |
| |
| /** |
| * Add a listener |
| * |
| * @param listener |
| * the listener to be added |
| */ |
| public void addResourceFcoreListener(IResourceFcoreListener listener) { |
| _fcoreResourceListener.addResourceFcoreListener(listener); |
| } |
| |
| /** |
| * Remove a listener |
| * |
| * @param listener |
| * the listener to be removed |
| */ |
| public void removeResourceFcoreListener(IResourceFcoreListener listener) { |
| _fcoreResourceListener.removeResourceFcoreListener(listener); |
| } |
| |
| /** |
| * Get the plug-in file from an {@link IPluginModelBase} element. |
| * |
| * @param pluginModelBase |
| * @return null if file does not exist. |
| */ |
| public IFile getFile(IPluginModelBase pluginModelBase) { |
| return getFile(ProjectHelper.getProject(pluginModelBase)); |
| } |
| |
| /** |
| * Get the plug-in file for given project. |
| * |
| * @param project |
| * @return null if file does not exist. |
| */ |
| public IFile getFile(IProject project) { |
| // Precondition. |
| if (project == null) { |
| return null; |
| } |
| IFile plugin = project.getFile(ICoreConstants.PLUGIN_FILENAME_DESCRIPTOR); |
| return plugin.exists() ? plugin : null; |
| } |
| |
| /** |
| * Is the given file the plug-in file hosts in an {@link IProject}. |
| * |
| * @param resource |
| * @return true if given resource is the plug-in file (plugin.xml); false |
| * otherwise. |
| */ |
| public boolean isPluginFile(IResource resource) { |
| // Check if given resource is an IFile and the plug-in file ? |
| if (resource != null && resource instanceof IFile) { |
| return ((IFile) resource).getName().equals(ICoreConstants.PLUGIN_FILENAME_DESCRIPTOR); |
| } |
| return false; |
| } |
| |
| /** |
| * Add an entry with specified entry name in the binary build for given |
| * project. |
| */ |
| public void addEntryInBinaryBuild(IProject project, String entryName) throws CoreException { |
| // Preconditions. |
| if (project == null || entryName == null) { |
| return; |
| } |
| WorkspaceBuildModel buildModel = FcoreGeneratorHelper.getBuildModel(project); |
| FcoreGeneratorHelper.addEntryInBinaryBuild(buildModel, entryName); |
| buildModel.save(); |
| } |
| |
| } |