/******************************************************************************* * Copyright (c) 2009, 2014 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation * Zend Technologies *******************************************************************************/ package org.eclipse.php.internal.ui; import java.io.IOException; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.*; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.core.runtime.preferences.InstanceScope; import org.eclipse.dltk.core.ISourceModule; import org.eclipse.dltk.ui.DLTKUIPlugin; import org.eclipse.dltk.ui.IWorkingCopyManager; import org.eclipse.dltk.ui.MembersOrderPreferenceCache; import org.eclipse.jface.action.GroupMarker; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.text.formatter.IContentFormatter; import org.eclipse.jface.text.formatter.MultiPassContentFormatter; import org.eclipse.jface.text.templates.ContextTypeRegistry; import org.eclipse.jface.text.templates.persistence.TemplateStore; import org.eclipse.osgi.service.environment.EnvironmentInfo; import org.eclipse.php.core.libfolders.LibraryFolderManager; import org.eclipse.php.internal.core.PHPCorePlugin; import org.eclipse.php.internal.ui.corext.template.php.CodeTemplateContextType; import org.eclipse.php.internal.ui.editor.ASTProvider; import org.eclipse.php.internal.ui.editor.templates.PHPCommentTemplateContextType; import org.eclipse.php.internal.ui.editor.templates.PHPTemplateContextType; import org.eclipse.php.internal.ui.explorer.LibraryFolderChangeListener; import org.eclipse.php.internal.ui.folding.PHPFoldingStructureProviderRegistry; import org.eclipse.php.internal.ui.preferences.PHPTemplateStore; import org.eclipse.php.internal.ui.preferences.PreferenceConstants; import org.eclipse.php.internal.ui.text.PHPTextTools; import org.eclipse.php.internal.ui.text.correction.CorrectionCommandInstaller; import org.eclipse.php.internal.ui.text.hover.PHPEditorTextHoverDescriptor; import org.eclipse.php.internal.ui.util.ElementCreationProxy; import org.eclipse.php.internal.ui.util.ImageDescriptorRegistry; import org.eclipse.php.internal.ui.util.PHPManualSiteDescriptor; import org.eclipse.php.internal.ui.viewsupport.ImagesOnFileSystemRegistry; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.*; import org.eclipse.ui.editors.text.templates.ContributionContextTypeRegistry; import org.eclipse.ui.plugin.AbstractUIPlugin; import org.eclipse.ui.preferences.ScopedPreferenceStore; import org.eclipse.ui.texteditor.ConfigurationElementSorter; import org.eclipse.wst.html.core.text.IHTMLPartitions; import org.eclipse.wst.jsdt.core.ITypeRoot; import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredPartitioning; import org.osgi.framework.BundleContext; import org.osgi.util.tracker.ServiceTracker; /** * The main plugin class to be used in the desktop. */ public class PHPUiPlugin extends AbstractUIPlugin { // The shared instance. private static PHPUiPlugin plugin; // the active formatter for this execution private IContentFormatter fActiveFormatter = null; public static final String ID = "org.eclipse.php.ui"; //$NON-NLS-1$ public static final int INTERNAL_ERROR = 10001; public static final boolean isDebugMode; public static final String PERSPECTIVE_ID = "org.eclipse.php.perspective"; //$NON-NLS-1$ public static final String FORMATTER_PROCESSOR_ID = "org.eclipse.php.ui.phpFormatterProcessor"; //$NON-NLS-1$ public static final String FORMATTER_PROCESSOR = "processor"; //$NON-NLS-1$ static { String value = Platform.getDebugOption("org.eclipse.php.ui/debug"); //$NON-NLS-1$ isDebugMode = value != null && value.equalsIgnoreCase("true"); //$NON-NLS-1$ } private ImageDescriptorRegistry fImageDescriptorRegistry; protected TemplateStore templateStore = null; protected ContextTypeRegistry codeTypeRegistry = null; private MembersOrderPreferenceCache fMembersOrderPreferenceCache; private PHPFoldingStructureProviderRegistry fFoldingStructureProviderRegistry; private PHPEditorTextHoverDescriptor[] fPHPEditorTextHoverDescriptors; private PHPManualSiteDescriptor[] fPHPManualSiteDescriptors; private ImagesOnFileSystemRegistry fImagesOnFSRegistry; private LibraryFolderChangeListener libraryFolderChangeListener; /** * The AST provider. * * @since 3.0 */ private ASTProvider fASTProvider; private ColorManager fColorManager; private PHPTextTools fTextTools; private ContributionContextTypeRegistry fContextTypeRegistry; private PHPTemplateStore fCodeTemplateStore; private IPreferenceStore fCorePreferenceStore; public static String OPEN_CALL_HIERARCHY_ACTION_FAMILY_NAME = PHPUIMessages.PHPUiPlugin_4; public static String OPEN_TYPE_HIERARCHY_ACTION_FAMILY_NAME = PHPUIMessages.PHPUiPlugin_5; /** * The constructor. */ public PHPUiPlugin() { plugin = this; } /** * This method is called upon plug-in activation */ @Override public void start(BundleContext context) throws Exception { super.start(context); initializeAfterStart(context); } /** * This method is used for later initialization. This trick should release * plug-in start-up. * * @param context */ void initializeAfterStart(final BundleContext context) { CorrectionCommandInstaller.registerCommands(); Job job = new Job("") { //$NON-NLS-1$ @Override protected IStatus run(IProgressMonitor monitor) { libraryFolderChangeListener = new LibraryFolderChangeListener(); LibraryFolderManager.getInstance().addListener(libraryFolderChangeListener); PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { @Override public void run() { processCommandLine(context); } }); if (PlatformUI.isWorkbenchRunning()) { new InitializeAfterLoadJob().schedule(); // must be last // call in // start() // method } return Status.OK_STATUS; } }; job.schedule(Job.LONG); } static void initializeAfterLoad(IProgressMonitor monitor) { org.eclipse.dltk.internal.corext.util.OpenTypeHistory.getInstance(PHPUILanguageToolkit.getInstance()) .checkConsistency(monitor); } private void processCommandLine(BundleContext context) { ServiceTracker environmentTracker = new ServiceTracker(context, EnvironmentInfo.class.getName(), null); environmentTracker.open(); EnvironmentInfo environmentInfo = (EnvironmentInfo) environmentTracker.getService(); environmentTracker.close(); if (environmentInfo == null) { return; } String[] args = environmentInfo.getNonFrameworkArgs(); if (args == null || args.length == 0) { return; } return; } /** * This method is called when the plug-in is stopped */ @Override public void stop(BundleContext context) throws Exception { super.stop(context); CorrectionCommandInstaller.unregisterCommands(); if (libraryFolderChangeListener != null) { LibraryFolderManager.getInstance().removeListener(libraryFolderChangeListener); libraryFolderChangeListener = null; } Job.getJobManager().cancel(OPEN_TYPE_HIERARCHY_ACTION_FAMILY_NAME); Job.getJobManager().cancel(OPEN_CALL_HIERARCHY_ACTION_FAMILY_NAME); fASTProvider = null; plugin = null; } /** * Returns the shared instance. */ public static PHPUiPlugin getDefault() { return plugin; } /** * 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 AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.php.ui", //$NON-NLS-1$ path); } public static Shell getActiveWorkbenchShell() { IWorkbenchWindow window = getActiveWorkbenchWindow(); if (window != null) { return window.getShell(); } return null; } public static IWorkbenchWindow getActiveWorkbenchWindow() { return getDefault().getWorkbench().getActiveWorkbenchWindow(); } public static void logErrorMessage(String message) { log(new Status(IStatus.ERROR, ID, INTERNAL_ERROR, message, null)); } public static void log(IStatus status) { getDefault().getLog().log(status); } public static void log(Throwable e) { log(new Status(IStatus.ERROR, ID, INTERNAL_ERROR, "PHP ui plugin internal error", e)); //$NON-NLS-1$ } public static ImageDescriptorRegistry getImageDescriptorRegistry() { return getDefault().internalGetImageDescriptorRegistry(); } private synchronized ImageDescriptorRegistry internalGetImageDescriptorRegistry() { if (fImageDescriptorRegistry == null) fImageDescriptorRegistry = new ImageDescriptorRegistry(); return fImageDescriptorRegistry; } public static IWorkspace getWorkspace() { return ResourcesPlugin.getWorkspace(); } public static IWorkbenchPage getActivePage() { return getDefault().internalGetActivePage(); } public static IEditorPart getActiveEditor() { IWorkbenchPage activePage = getActivePage(); if (activePage != null) { return activePage.getActiveEditor(); } return null; } private IWorkbenchPage internalGetActivePage() { IWorkbenchWindow window = getWorkbench().getActiveWorkbenchWindow(); if (window == null) return null; return getWorkbench().getActiveWorkbenchWindow().getActivePage(); } public static void createStandardGroups(IMenuManager menu) { if (!menu.isEmpty()) return; menu.add(new Separator(IContextMenuConstants.GROUP_NEW)); menu.add(new GroupMarker(IContextMenuConstants.GROUP_GOTO)); menu.add(new Separator(IContextMenuConstants.GROUP_OPEN)); menu.add(new GroupMarker(IContextMenuConstants.GROUP_SHOW)); menu.add(new Separator(IContextMenuConstants.GROUP_REORGANIZE)); menu.add(new Separator(IContextMenuConstants.GROUP_BUILD)); menu.add(new Separator(IContextMenuConstants.GROUP_ADDITIONS)); menu.add(new Separator(IContextMenuConstants.GROUP_PROPERTIES)); } /** * Returns the template store for the xml editor templates. * * @return the template store for the xml editor templates */ public TemplateStore getTemplateStore() { if (templateStore == null) { templateStore = new PHPTemplateStore(getTemplateContextRegistry(), getPreferenceStore(), PreferenceConstants.TEMPLATES_KEY); try { templateStore.load(); } catch (IOException e) { Logger.logException(e); } } return templateStore; } /** * Returns the template store for the code generation templates. * * @return the template store for the code generation templates * @since 3.0 */ public TemplateStore getCodeTemplateStore() { if (fCodeTemplateStore == null) { fCodeTemplateStore = new PHPTemplateStore(getCodeTemplateContextRegistry(), getPreferenceStore(), PreferenceConstants.CODE_TEMPLATES_KEY); try { fCodeTemplateStore.load(); } catch (IOException e) { Logger.logException(e); } } return fCodeTemplateStore; } /** * Returns the template context type registry for the xml plugin. * * @return the template context type registry for the xml plugin */ public ContextTypeRegistry getCodeTemplateContextRegistry() { if (codeTypeRegistry == null) { ContributionContextTypeRegistry registry = new ContributionContextTypeRegistry(); CodeTemplateContextType.registerContextTypes(registry); codeTypeRegistry = registry; } return codeTypeRegistry; } /** * Returns the template context type registry for the java plug-in. * * @return the template context type registry for the java plug-in * @since 3.0 */ public synchronized ContextTypeRegistry getTemplateContextRegistry() { if (fContextTypeRegistry == null) { ContributionContextTypeRegistry registry = new ContributionContextTypeRegistry(); registry.addContextType(PHPTemplateContextType.PHP_CONTEXT_TYPE_ID); registry.addContextType(PHPTemplateContextType.PHP_STATEMENTS_CONTEXT_TYPE_ID); registry.addContextType(PHPTemplateContextType.PHP_TYPE_MEMBERS_CONTEXT_TYPE_ID); registry.addContextType(PHPTemplateContextType.PHP_GLOBAL_MEMBERS_CONTEXT_TYPE_ID); registry.addContextType(PHPTemplateContextType.PHP_TYPE_METHOD_STATEMENTS_CONTEXT_TYPE_ID); registry.addContextType(PHPTemplateContextType.PHP_CLASS_MEMBERS_CONTEXT_TYPE_ID); registry.addContextType(PHPCommentTemplateContextType.PHP_COMMENT_CONTEXT_TYPE_ID); fContextTypeRegistry = registry; } return fContextTypeRegistry; } public synchronized MembersOrderPreferenceCache getMemberOrderPreferenceCache() { if (fMembersOrderPreferenceCache == null) fMembersOrderPreferenceCache = new MembersOrderPreferenceCache(); return fMembersOrderPreferenceCache; } public static String getPluginId() { return ID; } /** * Returns the registry of the extensions to the * <code>org.eclipse.php.ui.phpFoldingStructureProvider</code> extension * point. * * @return the registry of contributed * <code>IPHPFoldingStructureProvider</code> * @since 3.1 */ public synchronized PHPFoldingStructureProviderRegistry getFoldingStructureProviderRegistry() { if (fFoldingStructureProviderRegistry == null) fFoldingStructureProviderRegistry = new PHPFoldingStructureProviderRegistry(); return fFoldingStructureProviderRegistry; } /** * Returns all PHP editor text hovers contributed to the workbench. * * @return an array of PHPEditorTextHoverDescriptor * @since 2.1 */ public PHPEditorTextHoverDescriptor[] getPHPEditorTextHoverDescriptors() { if (fPHPEditorTextHoverDescriptors == null) { fPHPEditorTextHoverDescriptors = PHPEditorTextHoverDescriptor.getContributedHovers(); ConfigurationElementSorter sorter = new ConfigurationElementSorter() { /* * @seeorg.eclipse.ui.texteditor.ConfigurationElementSorter# * getConfigurationElement(java.lang.Object) */ @Override public IConfigurationElement getConfigurationElement(Object object) { return ((PHPEditorTextHoverDescriptor) object).getConfigurationElement(); } }; sorter.sort(fPHPEditorTextHoverDescriptors); // Move Best Match hover to front for (int i = 0; i < fPHPEditorTextHoverDescriptors.length - 1; i++) { if (PreferenceConstants.ID_BESTMATCH_HOVER.equals(fPHPEditorTextHoverDescriptors[i].getId())) { PHPEditorTextHoverDescriptor hoverDescriptor = fPHPEditorTextHoverDescriptors[i]; for (int j = i; j > 0; j--) fPHPEditorTextHoverDescriptors[j] = fPHPEditorTextHoverDescriptors[j - 1]; fPHPEditorTextHoverDescriptors[0] = hoverDescriptor; break; } } } return fPHPEditorTextHoverDescriptors; } /** * Resets the PHP editor text hovers contributed to the workbench. * <p> * This will force a rebuild of the descriptors the next time a client asks * for them. * </p> * * @since 2.1 */ public void resetPHPEditorTextHoverDescriptors() { fPHPEditorTextHoverDescriptors = null; } /** * Returns all PHP manual sites contributed to the workbench. */ public PHPManualSiteDescriptor[] getPHPManualSiteDescriptors() { if (fPHPManualSiteDescriptors == null) { fPHPManualSiteDescriptors = PHPManualSiteDescriptor.getContributedSites(); } return fPHPManualSiteDescriptors; } /** * Returns the AST provider. * * @return the AST provider * @since 3.0 */ public synchronized ASTProvider getASTProvider() { if (fASTProvider == null) fASTProvider = new ASTProvider(); return fASTProvider; } /** * Returns color manager * * @return the color manager * @since 3.0 */ public synchronized ColorManager getColorManager() { if (fColorManager == null) fColorManager = new ColorManager(); return fColorManager; } /** * Returns text tools * * @return the text tools * @since 3.0 */ public synchronized PHPTextTools getTextTools() { if (fTextTools == null) fTextTools = new PHPTextTools(true); return fTextTools; } /** * Returns the {@link ITypeRoot} wrapped by the given editor input. * * @param editorInput * the editor input * @return the {@link ITypeRoot} wrapped by <code>editorInput</code> or * <code>null</code> if the editor input does not stand for a * ITypeRoot * * @since 3.4 */ public static ISourceModule getEditorInputTypeRoot(IEditorInput editorInput) { // Performance: check working copy manager first: this is faster ISourceModule cu = DLTKUIPlugin.getDefault().getWorkingCopyManager().getWorkingCopy(editorInput); if (cu != null) return cu; ISourceModule je = (ISourceModule) editorInput.getAdapter(ISourceModule.class); return je; } /** * Returns the working copy manager for the Java UI plug-in. * * @return the working copy manager for the Java UI plug-in */ public static IWorkingCopyManager getWorkingCopyManager() { return DLTKUIPlugin.getDefault().getWorkingCopyManager(); } /** * Returns the current active formatter. In case of a PHP formatter it * should also implement IFormatterProcessorFactory. * * @return */ public IContentFormatter getActiveFormatter() { if (fActiveFormatter == null) { IConfigurationElement[] elements = Platform.getExtensionRegistry() .getConfigurationElementsFor(FORMATTER_PROCESSOR_ID); for (int i = 0; i < elements.length; i++) { IConfigurationElement element = elements[i]; if (FORMATTER_PROCESSOR.equals(element.getName())) { ElementCreationProxy ecProxy = new ElementCreationProxy(element, FORMATTER_PROCESSOR_ID); fActiveFormatter = (IContentFormatter) ecProxy.getObject(); } } if (fActiveFormatter == null) { fActiveFormatter = new MultiPassContentFormatter( IStructuredPartitioning.DEFAULT_STRUCTURED_PARTITIONING, IHTMLPartitions.HTML_DEFAULT); } } return fActiveFormatter; } /** * Returns the image registry that keeps its images on the local file * system. * * @return the image registry */ public ImagesOnFileSystemRegistry getImagesOnFSRegistry() { if (fImagesOnFSRegistry == null) { fImagesOnFSRegistry = new ImagesOnFileSystemRegistry(); } return fImagesOnFSRegistry; } public IPreferenceStore getCorePreferenceStore() { if (fCorePreferenceStore == null) { fCorePreferenceStore = new ScopedPreferenceStore(InstanceScope.INSTANCE, PHPCorePlugin.ID); } return fCorePreferenceStore; } }