X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse.ui/src/net/sourceforge/phpeclipse/ui/WebUI.java b/net.sourceforge.phpeclipse.ui/src/net/sourceforge/phpeclipse/ui/WebUI.java index eb7b852..7c3cddc 100644 --- a/net.sourceforge.phpeclipse.ui/src/net/sourceforge/phpeclipse/ui/WebUI.java +++ b/net.sourceforge.phpeclipse.ui/src/net/sourceforge/phpeclipse/ui/WebUI.java @@ -4,176 +4,888 @@ * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v10.html - * + * * Contributors: * Christopher Lenz - initial implementation - * - * $Id: WebUI.java,v 1.4 2005-02-12 23:21:46 axelcl Exp $ + * + * $Id: WebUI.java,v 1.11 2007-11-08 01:37:06 scorphus Exp $ */ package net.sourceforge.phpeclipse.ui; +import org.eclipse.jface.resource.JFaceResources; +import java.io.File; import java.io.IOException; +//import java.io.InputStream; import java.net.URL; +//import java.util.Enumeration; +import java.util.HashMap; +//import java.util.PropertyResourceBundle; -import net.sourceforge.phpeclipse.ui.templates.template.HTMLContextType; -import net.sourceforge.phpeclipse.ui.templates.template.JSContextType; -import net.sourceforge.phpeclipse.ui.templates.template.SmartyContextType; -import net.sourceforge.phpeclipse.ui.templates.template.XMLContextType; +//import net.sourceforge.phpdt.core.JavaCore; +import net.sourceforge.phpdt.core.IBuffer; +import net.sourceforge.phpdt.core.ICompilationUnit; +import net.sourceforge.phpdt.core.IJavaElement; +import net.sourceforge.phpdt.core.WorkingCopyOwner; +import net.sourceforge.phpdt.internal.core.JavaModelManager; +import net.sourceforge.phpdt.internal.core.util.Util; +import net.sourceforge.phpdt.internal.corext.template.php.CodeTemplateContextType; +import net.sourceforge.phpdt.internal.corext.template.php.HTMLContextType; +import net.sourceforge.phpdt.internal.corext.template.php.JavaContextType; +import net.sourceforge.phpdt.internal.corext.template.php.JavaDocContextType; +import net.sourceforge.phpdt.internal.ui.IJavaStatusConstants; +import net.sourceforge.phpdt.internal.ui.JavaElementAdapterFactory; +import net.sourceforge.phpdt.internal.ui.ResourceAdapterFactory; +import net.sourceforge.phpdt.internal.ui.preferences.MembersOrderPreferenceCache; +import net.sourceforge.phpdt.internal.ui.preferences.MockupPreferenceStore; +import net.sourceforge.phpdt.internal.ui.text.PreferencesAdapter; +import net.sourceforge.phpdt.internal.ui.text.folding.JavaFoldingStructureProviderRegistry; +import net.sourceforge.phpdt.internal.ui.text.java.hover.JavaEditorTextHoverDescriptor; +import net.sourceforge.phpdt.internal.ui.viewsupport.ImageDescriptorRegistry; +import net.sourceforge.phpdt.internal.ui.viewsupport.ProblemMarkerManager; +import net.sourceforge.phpdt.ui.IContextMenuConstants; +import net.sourceforge.phpdt.ui.IWorkingCopyManager; +import net.sourceforge.phpdt.ui.text.JavaTextTools; +import net.sourceforge.phpdt.ui.PreferenceConstants; +import net.sourceforge.phpeclipse.PHPeclipsePlugin; +import net.sourceforge.phpeclipse.builder.ExternalEditorInput; +import net.sourceforge.phpeclipse.builder.ExternalStorageDocumentProvider; +import net.sourceforge.phpeclipse.builder.FileStorage; +import net.sourceforge.phpeclipse.builder.IdentifierIndexManager; +import net.sourceforge.phpeclipse.phpeditor.DocumentAdapter; +import net.sourceforge.phpeclipse.phpeditor.ICompilationUnitDocumentProvider; +import net.sourceforge.phpeclipse.phpeditor.PHPDocumentProvider; +//import net.sourceforge.phpeclipse.phpeditor.PHPSyntaxRdr; +import net.sourceforge.phpeclipse.phpeditor.WorkingCopyManager; +//import net.sourceforge.phpeclipse.phpeditor.util.PHPColorProvider; + +import net.sourceforge.phpeclipse.ui.templates.template.HTMLTemplateContextType; +//import net.sourceforge.phpdt.internal.corext.template.php.HTMLContextType; + +import net.sourceforge.phpeclipse.ui.templates.template.JSTemplateContextType; +import net.sourceforge.phpeclipse.ui.templates.template.SmartyTemplateContextType; +import net.sourceforge.phpeclipse.ui.templates.template.XMLTemplateContextType; + +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.ISavedState; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.resources.WorkspaceJob; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IAdapterManager; +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Path; +import org.eclipse.core.runtime.Platform; +//import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.Preferences.IPropertyChangeListener; +import org.eclipse.core.runtime.Preferences.PropertyChangeEvent; +import org.eclipse.core.runtime.jobs.Job; +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.preference.PreferenceConverter; +//import org.eclipse.jface.preference.PreferenceConverter; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.ImageRegistry; +//import org.eclipse.jface.resource.JFaceResources; +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.templates.ContextTypeRegistry; import org.eclipse.jface.text.templates.persistence.TemplateStore; +//import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.IEditorDescriptor; +import org.eclipse.ui.IEditorInput; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.IEditorRegistry; +import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.editors.text.EditorsUI; import org.eclipse.ui.editors.text.templates.ContributionContextTypeRegistry; import org.eclipse.ui.editors.text.templates.ContributionTemplateStore; +import org.eclipse.ui.ide.IDE; import org.eclipse.ui.plugin.AbstractUIPlugin; +import org.eclipse.ui.texteditor.ChainedPreferenceStore; +import org.eclipse.ui.texteditor.ConfigurationElementSorter; +import org.eclipse.ui.texteditor.IDocumentProvider; +import org.eclipse.ui.texteditor.ITextEditor; +import org.osgi.framework.BundleContext; /** * The web development tools UI plugin. */ public class WebUI extends AbstractUIPlugin implements IPreferenceConstants { - private static final String CUSTOM_TEMPLATES_KEY = "net.sourceforge.phpeclipse.ui.templates"; //$NON-NLS-1$ - - // Constants --------------------------------------------------------------- - - public static final String ICON_OVERLAY_ERROR = "full/ovr16/error_co.gif"; //$NON-NLS-1$ - - public static final String ICON_OVERLAY_WARNING = "full/ovr16/warning_co.gif"; //$NON-NLS-1$ - - // Instance Variables ------------------------------------------------------ - - /** The shared instance. */ - private static WebUI plugin; - - public static IWorkbenchPage getActivePage() { - return getDefault().internalGetActivePage(); - } - - private IWorkbenchPage internalGetActivePage() { - return getWorkbench().getActiveWorkbenchWindow().getActivePage(); - } - - public static Shell getActiveWorkbenchShell() { - return getActiveWorkbenchWindow().getShell(); - } - - public static IWorkbenchWindow getActiveWorkbenchWindow() { - return getDefault().getWorkbench().getActiveWorkbenchWindow(); - } - // Public Methods ---------------------------------------------------------- - - /** - * Returns the shared instance. - */ - public static WebUI getDefault() { - return plugin; - } - - /** - * Returns the workspace instance. - */ - public static IWorkspace getWorkspace() { - return ResourcesPlugin.getWorkspace(); - } - - /** The context type registry. */ - private ContributionContextTypeRegistry fRegistry; - - /** The template store. */ - private TemplateStore fStore; - - // Constructors ------------------------------------------------------------ - - /** - * The constructor. - */ - public WebUI() { - plugin = this; - } - - /** - * Returns this plug-in's context type registry. - * - * @return the context type registry for this plug-in instance - */ - public ContextTypeRegistry getContextTypeRegistry() { - if (fRegistry == null) { - // create an configure the contexts available in the editor - fRegistry = new ContributionContextTypeRegistry(); - fRegistry.addContextType(XMLContextType.XML_CONTEXT_TYPE); - fRegistry.addContextType(HTMLContextType.HTML_CONTEXT_TYPE); - fRegistry.addContextType(SmartyContextType.SMARTY_CONTEXT_TYPE); - fRegistry.addContextType(JSContextType.JS_CONTEXT_TYPE); - } - return fRegistry; - } - - // Private Methods --------------------------------------------------------- - - /** - * Returns an image descriptor for the image corresponding to the specified key (which is the name of the image file). - * - * @param key - * The key of the image - * @return The descriptor for the requested image, or null if the image could not be found - */ - private ImageDescriptor getImageDescriptor(String key) { - try { - URL url = getBundle().getEntry("/icons/" + key); //$NON-NLS-1$ - return ImageDescriptor.createFromURL(url); - } catch (IllegalStateException e) { - return null; - } - } - - /** - * Returns this plug-in's template store. - * - * @return the template store of this plug-in instance - */ - public TemplateStore getTemplateStore() { - if (fStore == null) { - fStore = new ContributionTemplateStore(getContextTypeRegistry(), getDefault().getPreferenceStore(), CUSTOM_TEMPLATES_KEY); - try { - fStore.load(); - } catch (IOException e) { - WebUI.getDefault().getLog().log(new Status(IStatus.ERROR, "net.sourceforge.phpeclipse.ui", IStatus.OK, "", e)); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - return fStore; - } - - protected void initializeDefaultPreferences(IPreferenceStore store) { - store.setDefault(PHP_LOCALHOST_PREF, "http://localhost"); - store.setDefault(PHP_DOCUMENTROOT_PREF, getWorkspace().getRoot().getLocation().toString()); - store.setDefault(PHP_BOOKMARK_DEFAULT, ""); - - store.setDefault(PHP_AUTO_PREVIEW_DEFAULT, "true"); - store.setDefault(PHP_BRING_TO_TOP_PREVIEW_DEFAULT, "true"); - store.setDefault(PHP_SHOW_HTML_FILES_LOCAL, "true"); - store.setDefault(PHP_SHOW_XML_FILES_LOCAL, "false"); - } - - /* - * @see AbstractUIPlugin#initializeImageRegistry(ImageRegistry) - */ - protected void initializeImageRegistry(ImageRegistry reg) { - reg.put(ICON_OVERLAY_ERROR, getImageDescriptor(ICON_OVERLAY_ERROR)); - reg.put(ICON_OVERLAY_WARNING, getImageDescriptor(ICON_OVERLAY_WARNING)); - } - // private IWorkbenchPage internalGetActivePage() { - // IWorkbenchWindow window = getWorkbench().getActiveWorkbenchWindow(); - // if (window != null) - // return window.getActivePage(); - // return null; - // } + + public static final String PLUGIN_ID = "net.sourceforge.phpeclipse.ui"; + + public static final String EDITOR_ID = WebUI.PLUGIN_ID + ".PHPUnitEditor"; + + private static final String CUSTOM_TEMPLATES_KEY = "net.sourceforge.phpeclipse.ui.templates"; //$NON-NLS-1$ + + /** + * The key to store customized code templates. + * + * @since 3.0 + */ + private static final String CODE_TEMPLATES_KEY = "net.sourceforge.phpdt.ui.text.custom_code_templates"; //$NON-NLS-1$ + /** + * The maximum number of allowed proposals by category + */ + public final static int MAX_PROPOSALS = 200; + + public final static String PHP_NATURE_ID = PLUGIN_ID + ".phpnature"; + + // Constants --------------------------------------------------------------- + + public static final String ICON_OVERLAY_ERROR = "full/ovr16/error_co.gif"; //$NON-NLS-1$ + + public static final String ICON_OVERLAY_WARNING = "full/ovr16/warning_co.gif"; //$NON-NLS-1$ + + // Instance Variables ------------------------------------------------------ + + /** The shared instance. */ + private static WebUI plugin; + + /** + * The combined preference store. + * + * @since 3.0 + */ + private IPreferenceStore fCombinedPreferenceStore; + + /** + * The coded template store for the java editor. + * + * @since 3.0 + */ + private TemplateStore fCodeTemplateStore; + + /** + * The code template context type registry for the java editor. + * + * @since 3.0 + */ + private ContextTypeRegistry fCodeTemplateContextTypeRegistry; + + /** + * The template context type registry for the java editor. + * + * @since 3.0 + */ + private ContextTypeRegistry fContextTypeRegistry; + + private ResourceAdapterFactory fResourceAdapterFactory; + + private JavaElementAdapterFactory fJavaElementAdapterFactory; + + private ICompilationUnitDocumentProvider fCompilationUnitDocumentProvider; + + private JavaTextTools fJavaTextTools; + + private IWorkingCopyManager fWorkingCopyManager; + + private IPropertyChangeListener fFontPropertyChangeListener; + + private ProblemMarkerManager fProblemMarkerManager; + + private MockupPreferenceStore fMockupPreferenceStore; + + private ImageDescriptorRegistry fImageDescriptorRegistry; + + private JavaEditorTextHoverDescriptor[] fJavaEditorTextHoverDescriptors; + + private MembersOrderPreferenceCache fMembersOrderPreferenceCache; + + private HashMap fIndexManagerMap = new HashMap(); + + /** + * The extension point registry for the + * net.sourceforge.phpdt.ui.javaFoldingStructureProvider + * extension point. + * + * @since 3.0 + */ + private JavaFoldingStructureProviderRegistry fFoldingStructureProviderRegistry; + + public static IWorkbenchPage getActivePage() { + return getDefault().internalGetActivePage(); + } + + private IWorkbenchPage internalGetActivePage() { + return getWorkbench().getActiveWorkbenchWindow().getActivePage(); + } + + public static Shell getActiveWorkbenchShell() { + return getActiveWorkbenchWindow().getShell(); + } + + public static IWorkbenchWindow getActiveWorkbenchWindow() { + return getDefault().getWorkbench().getActiveWorkbenchWindow(); + } + + // Public Methods ---------------------------------------------------------- + + /** + * Returns the shared instance. + */ + public static WebUI getDefault() { + return plugin; + } + + /** + * Returns the workspace instance. + */ + public static IWorkspace getWorkspace() { + return ResourcesPlugin.getWorkspace(); + } + + /** The context type registry. */ + private ContributionContextTypeRegistry fRegistry; + + /** The template store. */ + private TemplateStore fStore; + + // Constructors ------------------------------------------------------------ + + /** + * The constructor. + */ + public WebUI() { + plugin = this; + } + + /** + * Returns this plug-in's context type registry. + * + * @return the context type registry for this plug-in instance + */ + public ContextTypeRegistry getContextTypeRegistry() { + if (fRegistry == null) { + // create an configure the contexts available in the editor + fRegistry = new ContributionContextTypeRegistry(); + fRegistry.addContextType(XMLTemplateContextType.XML_CONTEXT_TYPE); + fRegistry.addContextType(HTMLTemplateContextType.HTML_CONTEXT_TYPE); + fRegistry.addContextType(SmartyTemplateContextType.SMARTY_CONTEXT_TYPE); + fRegistry.addContextType(JSTemplateContextType.JS_CONTEXT_TYPE); + } + return fRegistry; + } + + // Private Methods --------------------------------------------------------- + + /** + * Returns an image descriptor for the image corresponding to the specified + * key (which is the name of the image file). + * + * @param key + * The key of the image + * @return The descriptor for the requested image, or null if + * the image could not be found + */ + private ImageDescriptor getImageDescriptor(String key) { + try { + URL url = getBundle().getEntry("/icons/" + key); //$NON-NLS-1$ + return ImageDescriptor.createFromURL(url); + } catch (IllegalStateException e) { + return null; + } + } + + /** + * Returns this plug-in's template store. + * + * @return the template store of this plug-in instance + */ + public TemplateStore getTemplateStore() { + if (fStore == null) { + fStore = new ContributionTemplateStore(getContextTypeRegistry(), + getDefault().getPreferenceStore(), CUSTOM_TEMPLATES_KEY); + try { + fStore.load(); + } catch (IOException e) { + WebUI + .getDefault() + .getLog() + .log( + new Status( + IStatus.ERROR, + "net.sourceforge.phpeclipse.ui", IStatus.OK, "", e)); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + return fStore; + } + + /* + * @see AbstractUIPlugin#initializeImageRegistry(ImageRegistry) + */ + protected void initializeImageRegistry(ImageRegistry reg) { + reg.put(ICON_OVERLAY_ERROR, getImageDescriptor(ICON_OVERLAY_ERROR)); + reg.put(ICON_OVERLAY_WARNING, getImageDescriptor(ICON_OVERLAY_WARNING)); + } + + // private IWorkbenchPage internalGetActivePage() { + // IWorkbenchWindow window = getWorkbench().getActiveWorkbenchWindow(); + // if (window != null) + // return window.getActivePage(); + // return null; + // } + + public static void log(IStatus status) { + getDefault().getLog().log(status); + } + + public static void log(Throwable e) { + log(new Status(IStatus.ERROR, PLUGIN_ID, IStatus.ERROR, "" + + e.getLocalizedMessage(), e)); + } + + public static String getPluginId() { + return getDefault().getBundle().getSymbolicName(); + } + + /** + * Returns a combined preference store, this store is read-only. + * + * @return the combined preference store + * + * @since 3.0 + */ + public IPreferenceStore getCombinedPreferenceStore() { + if (fCombinedPreferenceStore == null) { + IPreferenceStore generalTextStore = EditorsUI.getPreferenceStore(); + fCombinedPreferenceStore = new ChainedPreferenceStore( + new IPreferenceStore[] { + getPreferenceStore(), + new PreferencesAdapter(WebUI + .getDefault().getPluginPreferences()), + generalTextStore }); + } + return fCombinedPreferenceStore; + } + + // TODO: refactor this into a better method name ! + public synchronized ICompilationUnitDocumentProvider getCompilationUnitDocumentProvider() { + if (fCompilationUnitDocumentProvider == null) + fCompilationUnitDocumentProvider = new PHPDocumentProvider(); + return fCompilationUnitDocumentProvider; + } + + public synchronized JavaTextTools getJavaTextTools() { + if (fJavaTextTools == null) + fJavaTextTools = new JavaTextTools(getPreferenceStore(), /*JavaCore + .getPlugin().*/getPluginPreferences()); + return fJavaTextTools; + } + + public synchronized IWorkingCopyManager getWorkingCopyManager() { + if (fWorkingCopyManager == null) { + ICompilationUnitDocumentProvider provider = getCompilationUnitDocumentProvider(); + fWorkingCopyManager = new WorkingCopyManager(provider); + } + return fWorkingCopyManager; + } + + public synchronized ProblemMarkerManager getProblemMarkerManager() { + if (fProblemMarkerManager == null) + fProblemMarkerManager = new ProblemMarkerManager(); + return fProblemMarkerManager; + } + + /** + * Returns the mockup preference store for firing events and registering + * listeners on project setting changes. Temporary solution. + */ + public MockupPreferenceStore getMockupPreferenceStore() { + if (fMockupPreferenceStore == null) + fMockupPreferenceStore = new MockupPreferenceStore(); + + return fMockupPreferenceStore; + } + + public static ImageDescriptorRegistry getImageDescriptorRegistry() { + return getDefault().internalGetImageDescriptorRegistry(); + } + + private ImageDescriptorRegistry internalGetImageDescriptorRegistry() { + if (fImageDescriptorRegistry == null) + fImageDescriptorRegistry = new ImageDescriptorRegistry(); + return fImageDescriptorRegistry; + } + + /** + * Returns the registry of the extensions to the + * net.sourceforge.phpdt.ui.javaFoldingStructureProvider + * extension point. + * + * @return the registry of contributed + * IJavaFoldingStructureProvider + * @since 3.0 + */ + public synchronized JavaFoldingStructureProviderRegistry getFoldingStructureProviderRegistry() { + if (fFoldingStructureProviderRegistry == null) + fFoldingStructureProviderRegistry = new JavaFoldingStructureProviderRegistry(); + return fFoldingStructureProviderRegistry; + } + /** + * Returns all Java editor text hovers contributed to the workbench. + * + * @return an array of JavaEditorTextHoverDescriptor + * @since 2.1 + */ + public JavaEditorTextHoverDescriptor[] getJavaEditorTextHoverDescriptors() { + if (fJavaEditorTextHoverDescriptors == null) { + fJavaEditorTextHoverDescriptors = JavaEditorTextHoverDescriptor + .getContributedHovers(); + ConfigurationElementSorter sorter = new ConfigurationElementSorter() { + /* + * @see org.eclipse.ui.texteditor.ConfigurationElementSorter#getConfigurationElement(java.lang.Object) + */ + public IConfigurationElement getConfigurationElement( + Object object) { + return ((JavaEditorTextHoverDescriptor) object) + .getConfigurationElement(); + } + }; + sorter.sort(fJavaEditorTextHoverDescriptors); + + // The Problem hover has to be the first and the Annotation hover + // has to + // be the last one in the JDT UI's hover list + int length = fJavaEditorTextHoverDescriptors.length; + int first = -1; + int last = length - 1; + int problemHoverIndex = -1; + int annotationHoverIndex = -1; + for (int i = 0; i < length; i++) { + if (!fJavaEditorTextHoverDescriptors[i].getId().startsWith( + PLUGIN_ID)) { + if (problemHoverIndex == -1 || annotationHoverIndex == -1) + continue; + else { + last = i - 1; + break; + } + } + if (first == -1) + first = i; + + if (fJavaEditorTextHoverDescriptors[i].getId().equals( + "net.sourceforge.phpdt.ui.AnnotationHover")) { //$NON-NLS-1$ + annotationHoverIndex = i; + continue; + } + if (fJavaEditorTextHoverDescriptors[i].getId().equals( + "net.sourceforge.phpdt.ui.ProblemHover")) { //$NON-NLS-1$ + problemHoverIndex = i; + continue; + } + } + + JavaEditorTextHoverDescriptor hoverDescriptor = null; + + if (first > -1 && problemHoverIndex > -1 + && problemHoverIndex != first) { + // move problem hover to beginning + hoverDescriptor = fJavaEditorTextHoverDescriptors[first]; + fJavaEditorTextHoverDescriptors[first] = fJavaEditorTextHoverDescriptors[problemHoverIndex]; + fJavaEditorTextHoverDescriptors[problemHoverIndex] = hoverDescriptor; + + // update annotation hover index if needed + if (annotationHoverIndex == first) + annotationHoverIndex = problemHoverIndex; + } + + if (annotationHoverIndex > -1 && annotationHoverIndex != last) { + // move annotation hover to end + hoverDescriptor = fJavaEditorTextHoverDescriptors[last]; + fJavaEditorTextHoverDescriptors[last] = fJavaEditorTextHoverDescriptors[annotationHoverIndex]; + fJavaEditorTextHoverDescriptors[annotationHoverIndex] = hoverDescriptor; + } + + // Move Best Match hover to front + for (int i = 0; i < fJavaEditorTextHoverDescriptors.length - 1; i++) { + if (PreferenceConstants.ID_BESTMATCH_HOVER + .equals(fJavaEditorTextHoverDescriptors[i].getId())) { + hoverDescriptor = fJavaEditorTextHoverDescriptors[i]; + for (int j = i; j > 0; j--) + fJavaEditorTextHoverDescriptors[j] = fJavaEditorTextHoverDescriptors[j - 1]; + fJavaEditorTextHoverDescriptors[0] = hoverDescriptor; + break; + } + + } + } + + return fJavaEditorTextHoverDescriptors; + } + + public synchronized MembersOrderPreferenceCache getMemberOrderPreferenceCache() { + if (fMembersOrderPreferenceCache == null) + fMembersOrderPreferenceCache = new MembersOrderPreferenceCache(); + return fMembersOrderPreferenceCache; + } + /** + * Open a file in the Workbench that may or may not exist in the workspace. + * Must be run on the UI thread. + * + * @param filename + * @throws CoreException + */ + public ITextEditor openFileInTextEditor(String filename) + throws CoreException { + // reject directories + if (new File(filename).isDirectory()) + return null; + IWorkbench workbench = PlatformUI.getWorkbench(); + IWorkbenchWindow window = workbench.getWorkbenchWindows()[0]; + IWorkbenchPage page = window.getActivePage(); + IPath path = new Path(filename); + // If the file exists in the workspace, open it + IFile file = getWorkspace().getRoot().getFile(path); + IEditorPart editor; + ITextEditor textEditor; + if (file != null && file.exists()) { + editor = IDE.openEditor(page, file, true); + textEditor = (ITextEditor) editor.getAdapter(ITextEditor.class); + } else { + // Otherwise open the stream directly + if (page == null) + return null; + FileStorage storage = new FileStorage(path); + IEditorRegistry registry = getWorkbench().getEditorRegistry(); + IEditorDescriptor desc = registry.getDefaultEditor(filename); + if (desc == null) { + desc = registry + .findEditor(IEditorRegistry.SYSTEM_EXTERNAL_EDITOR_ID); + // desc = registry.getDefaultEditor(); + } + IEditorInput input = new ExternalEditorInput(storage); + editor = page.openEditor(input, desc.getId()); + textEditor = (ITextEditor) editor.getAdapter(ITextEditor.class); + // If the storage provider is not ours, we can't guarantee + // read/write. + if (textEditor != null) { + IDocumentProvider documentProvider = textEditor + .getDocumentProvider(); + if (!(documentProvider instanceof ExternalStorageDocumentProvider)) { + storage.setReadOnly(); + } + } + } + return textEditor; + } + /** + * Creates the PHP plugin standard groups in a context menu. + */ + 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_GENERATE)); + menu.add(new Separator(IContextMenuConstants.GROUP_SEARCH)); + menu.add(new Separator(IContextMenuConstants.GROUP_BUILD)); + menu.add(new Separator(IContextMenuConstants.GROUP_ADDITIONS)); + menu.add(new Separator(IContextMenuConstants.GROUP_VIEWER_SETUP)); + menu.add(new Separator(IContextMenuConstants.GROUP_PROPERTIES)); + } + + public IdentifierIndexManager getIndexManager(IProject iProject) { + IPath path = iProject.getWorkingLocation(/*WebUI*/PHPeclipsePlugin.PLUGIN_ID); + path = path.append("project.index"); + String indexFilename = path.toString(); + // try { + // IdentDB db = IdentDB.getInstance(); + // } catch (ClassNotFoundException e) { + // e.printStackTrace(); + // } catch (SQLException e) { + // e.printStackTrace(); + // } + IdentifierIndexManager indexManager = (IdentifierIndexManager) fIndexManagerMap + .get(indexFilename); + if (indexManager == null) { + indexManager = new IdentifierIndexManager(indexFilename); + fIndexManagerMap.put(indexFilename, indexManager); + } + return indexManager; + } + + /** + * 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 ContributionTemplateStore( + getCodeTemplateContextRegistry(), getPreferenceStore(), + CODE_TEMPLATES_KEY); + try { + fCodeTemplateStore.load(); + } catch (IOException e) { + log(e); + } + } + + return fCodeTemplateStore; + } + /** + * Returns the template context type registry for the code generation + * templates. + * + * @return the template context type registry for the code generation + * templates + * @since 3.0 + */ + public ContextTypeRegistry getCodeTemplateContextRegistry() { + if (fCodeTemplateContextTypeRegistry == null) { + fCodeTemplateContextTypeRegistry = new ContributionContextTypeRegistry(); + + CodeTemplateContextType + .registerContextTypes(fCodeTemplateContextTypeRegistry); + } + + return fCodeTemplateContextTypeRegistry; + } + + public void openFileAndGotoOffset(String filename, int offset, int length) + throws CoreException { + ITextEditor textEditor = openFileInTextEditor(filename); + if (textEditor != null) { + // If a line number was given, go to it + if (offset >= 0) { + IDocument document = textEditor.getDocumentProvider() + .getDocument(textEditor.getEditorInput()); + textEditor.selectAndReveal(offset, length); + } + } + } + + public void openFileAndFindString(String filename, String findString) + throws CoreException { + ITextEditor textEditor = openFileInTextEditor(filename); + if (textEditor != null) { + // If a string was given, go to it + if (findString != null) { + try { + IDocument document = textEditor.getDocumentProvider() + .getDocument(textEditor.getEditorInput()); + int offset = document.search(0, findString, true, false, + true); + textEditor.selectAndReveal(offset, findString.length()); + } catch (BadLocationException e) { + // invalid text position -> do nothing + } + } + } + } + + public static void logErrorMessage(String message) { + log(new Status(IStatus.ERROR, getPluginId(),IJavaStatusConstants.INTERNAL_ERROR, message, null)); + } + public static void log(int severity, String message) { + Status status = new Status(severity, PLUGIN_ID, IStatus.OK, message, + null); + log(status); + } + + public static void log(String message, Throwable t) { + log(error(message, t)); + } + public static IStatus error(Throwable t) { + return error("PHPeclipsePlugin.internalErrorOccurred", t); //$NON-NLS-1$ + } + + public static IStatus error(String message, Throwable t) { + return new Status(IStatus.ERROR, PLUGIN_ID, IStatus.ERROR, message, t); + } + + /** + * Resets the Java editor text hovers contributed to the workbench. + *

+ * This will force a rebuild of the descriptors the next time a client asks + * for them. + *

+ * + * @return an array of JavaEditorTextHoverDescriptor + * @since 2.1 + */ + public void resetJavaEditorTextHoverDescriptors() { + fJavaEditorTextHoverDescriptors = null; + } + + /** + * Returns the template context type registry for the java plugin. + * + * @return the template context type registry for the java plugin + * @since 3.0 + */ + public ContextTypeRegistry getTemplateContextRegistry() { + if (fContextTypeRegistry == null) { + fContextTypeRegistry = new ContributionContextTypeRegistry(); + + fContextTypeRegistry.addContextType(new JavaContextType()); + fContextTypeRegistry.addContextType(new JavaDocContextType()); + fContextTypeRegistry.addContextType(new HTMLContextType()); + } + + return fContextTypeRegistry; + } + // public static void logErrorMessage(String message) { + // log(new Status(IStatus.ERROR, getPluginId(), + // JavaStatusConstants.INTERNAL_ERROR, message, null)); + // } + + + + /* + * (non - Javadoc) Method declared in Plugin + */ + public void start(BundleContext context) throws Exception { + super.start(context); + + // JavaCore.start(this, context); + final JavaModelManager modelManager = JavaModelManager + .getJavaModelManager(); + try { + modelManager.configurePluginDebugOptions(); + + // request state folder creation (workaround 19885) + getStateLocation(); + // retrieve variable values + PHPeclipsePlugin.getDefault().getPluginPreferences() + .addPropertyChangeListener( + new JavaModelManager.PluginPreferencesListener()); + // manager.loadVariablesAndContainers(); + + final IWorkspace workspace = ResourcesPlugin.getWorkspace(); + workspace.addResourceChangeListener(modelManager.deltaState, + IResourceChangeEvent.PRE_BUILD + | IResourceChangeEvent.POST_BUILD + | IResourceChangeEvent.POST_CHANGE + | IResourceChangeEvent.PRE_DELETE + | IResourceChangeEvent.PRE_CLOSE); + + ISavedState savedState = workspace.addSaveParticipant( + /*PHPeclipsePlugin*/WebUI.this, modelManager); + + WorkspaceJob processSavedState = new WorkspaceJob( + Util.bind("savedState.jobName")) { //$NON-NLS-1$ + public IStatus runInWorkspace(IProgressMonitor monitor) + throws CoreException { + ISavedState savedState = workspace.addSaveParticipant( + /*PHPeclipsePlugin*/WebUI.this, modelManager); + if (savedState != null) { + modelManager.deltaState.getDeltaProcessor().overridenEventType + = IResourceChangeEvent.POST_CHANGE; + savedState.processResourceChangeEvents(modelManager.deltaState); + } + return Status.OK_STATUS; + } + }; + processSavedState.setSystem(true); + processSavedState.setPriority(Job.SHORT); // process asap + processSavedState.schedule(); + } catch (RuntimeException e) { + modelManager.shutdown(); + throw e; + } + + registerAdapters(); + + // if (USE_WORKING_COPY_OWNERS) { + WorkingCopyOwner.setPrimaryBufferProvider(new WorkingCopyOwner() { + public IBuffer createBuffer(ICompilationUnit workingCopy) { + ICompilationUnit original = workingCopy.getPrimary(); + IResource resource = original.getResource(); + if (resource instanceof IFile) + return new DocumentAdapter(workingCopy, (IFile) resource); + return DocumentAdapter.NULL; + } + }); + // } + + installPreferenceStoreBackwardsCompatibility(); + + } + + + private void registerAdapters() { + fJavaElementAdapterFactory = new JavaElementAdapterFactory(); + fResourceAdapterFactory = new ResourceAdapterFactory(); + + IAdapterManager manager = Platform.getAdapterManager(); + manager + .registerAdapters(fJavaElementAdapterFactory, + IJavaElement.class); + manager.registerAdapters(fResourceAdapterFactory, IResource.class); + } + + + + /** + * Installs backwards compatibility for the preference store. + */ + private void installPreferenceStoreBackwardsCompatibility() { + + /* + * Installs backwards compatibility: propagate the Java editor font from + * a pre-2.1 plug-in to the Platform UI's preference store to preserve + * the Java editor font from a pre-2.1 workspace. This is done only + * once. + */ + String fontPropagatedKey = "fontPropagated"; //$NON-NLS-1$ + if (getPreferenceStore().contains(JFaceResources.TEXT_FONT) + && !getPreferenceStore().isDefault(JFaceResources.TEXT_FONT)) { + if (!getPreferenceStore().getBoolean(fontPropagatedKey)) + PreferenceConverter + .setValue(PlatformUI.getWorkbench() + .getPreferenceStore(), + PreferenceConstants.EDITOR_TEXT_FONT, + PreferenceConverter.getFontDataArray( + getPreferenceStore(), + JFaceResources.TEXT_FONT)); + } + getPreferenceStore().setValue(fontPropagatedKey, true); + + /* + * Backwards compatibility: set the Java editor font in this plug-in's + * preference store to let older versions access it. Since 2.1 the Java + * editor font is managed by the workbench font preference page. + */ + PreferenceConverter.putValue(getPreferenceStore(), + JFaceResources.TEXT_FONT, JFaceResources.getFontRegistry() + .getFontData(PreferenceConstants.EDITOR_TEXT_FONT)); + + fFontPropertyChangeListener = new IPropertyChangeListener() { + public void propertyChange(PropertyChangeEvent event) { + if (PreferenceConstants.EDITOR_TEXT_FONT.equals(event + .getProperty())) + PreferenceConverter.putValue(getPreferenceStore(), + JFaceResources.TEXT_FONT, + JFaceResources.getFontRegistry().getFontData( + PreferenceConstants.EDITOR_TEXT_FONT)); + } + }; + // incastrix + /*JFaceResources.getFontRegistry().addListener( + fFontPropertyChangeListener);*/ + } + + } \ No newline at end of file