/** | |
* 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(); | |
} | |
} |