/********************************************************************** Copyright (c) 2000, 2002 IBM Corp. and others. All rights reserved. This program and the accompanying materials 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: IBM Corporation - Initial implementation Klaus Hartlage - www.eclipseproject.de **********************************************************************/ package net.sourceforge.phpeclipse; import java.io.File; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import net.sourceforge.phpdt.externaltools.internal.model.ColorManager; import net.sourceforge.phpdt.externaltools.internal.model.ExternalToolsPlugin; import net.sourceforge.phpdt.externaltools.internal.model.VariableContextManager; import net.sourceforge.phpdt.internal.ui.preferences.TemplatePreferencePage; import net.sourceforge.phpdt.internal.ui.viewsupport.ImageDescriptorRegistry; import net.sourceforge.phpdt.ui.PreferenceConstants; import net.sourceforge.phpdt.ui.text.JavaTextTools; 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.PHPDocumentProvider; import net.sourceforge.phpeclipse.phpeditor.PHPSyntaxRdr; import net.sourceforge.phpeclipse.phpeditor.util.PHPColorProvider; import net.sourceforge.phpeclipse.resourcesview.PHPElement; import net.sourceforge.phpeclipse.resourcesview.PHPElementAdapterFactory; import net.sourceforge.phpeclipse.resourcesview.ResourceAdapterFactory; import org.eclipse.core.boot.BootLoader; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IAdapterManager; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IPluginDescriptor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.preference.PreferenceConverter; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.swt.widgets.Display; 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.plugin.AbstractUIPlugin; import org.eclipse.ui.texteditor.IDocumentProvider; import org.eclipse.ui.texteditor.ITextEditor; /** * The main plugin class to be used in the desktop. */ public class PHPeclipsePlugin extends AbstractUIPlugin implements IPreferenceConstants { /** * The id of the PHP plugin (value "net.sourceforge.phpeclipse"). */ public static final String PLUGIN_ID = "net.sourceforge.phpeclipse"; //$NON-NLS-1$ /** * id of builder - matches plugin.xml (concatenate pluginid.builderid) */ public static final String BUILDER_PARSER_ID = PLUGIN_ID + ".parserbuilder"; //public static final String BUILDER_INDEX_ID = PLUGIN_ID + ".indexbuilder"; /** General debug flag*/ public static final boolean DEBUG = false; /** * The maximum number of allowed proposals by category */ public final static int MAX_PROPOSALS = 200; private static ExternalToolsPlugin externalTools; /** * The Java virtual machine that we are running on. */ private static int jvm; /** MRJ 2.0 */ private static final int MRJ_2_0 = 0; /** MRJ 2.1 or later */ private static final int MRJ_2_1 = 1; /** Java on Mac OS X 10.0 (MRJ 3.0) */ private static final int MRJ_3_0 = 3; /** MRJ 3.1 */ private static final int MRJ_3_1 = 4; /** JVM constant for any other platform */ private static final int OTHER = -1; // public static final String PHP_RESOURCES_VIEW_ID = PLUGIN_ID + ".resourcesview.ViewPHPResources"; //$NON-NLS-1$ public static final String PHP_CODING_ACTION_SET_ID = PLUGIN_ID + ".ui.CodingActionSet"; //$NON-NLS-1$ public final static String PHP_NATURE_ID = PLUGIN_ID + ".phpnature"; public static final String PHPPARSER_ORIGINAL = "net.sourceforge.phpdt.internal.compiler.parser.Parser"; public static final String PHPPARSER_NEW = "test.PHPParser"; /** Change this if you want to switch PHP Parser. */ public static final String PHPPARSER = PHPPARSER_ORIGINAL; //The shared instance. private static PHPeclipsePlugin plugin; /** Windows 9x */ private static final int WINDOWS_9x = 6; /** Windows NT */ private static final int WINDOWS_NT = 5; private PHPDocumentProvider fCompilationUnitDocumentProvider; private ImageDescriptorRegistry fImageDescriptorRegistry; private HashMap fIndexManagerMap = new HashMap(); private JavaTextTools fJavaTextTools; private IFile fLastEditorFile = null; /** * The constructor. */ public PHPeclipsePlugin(IPluginDescriptor descriptor) { super(descriptor); plugin = this; setJVM(); externalTools = new ExternalToolsPlugin(); // try { // resourceBundle = ResourceBundle.getBundle("net.sourceforge.PHPeclipsePluginResources"); // } catch (MissingResourceException x) { // resourceBundle = null; // } } public static IWorkbenchPage getActivePage() { return getDefault().internalGetActivePage(); } public static Shell getActiveWorkbenchShell() { return getActiveWorkbenchWindow().getShell(); } /** * Returns an array of all editors that have an unsaved content. If the identical content is * presented in more than one editor, only one of those editor parts is part of the result. * * @return an array of all dirty editor parts. */ public static IEditorPart[] getDirtyEditors() { Set inputs = new HashSet(); List result = new ArrayList(0); IWorkbench workbench = getDefault().getWorkbench(); IWorkbenchWindow[] windows = workbench.getWorkbenchWindows(); for (int i = 0; i < windows.length; i++) { IWorkbenchPage[] pages = windows[i].getPages(); for (int x = 0; x < pages.length; x++) { IEditorPart[] editors = pages[x].getDirtyEditors(); for (int z = 0; z < editors.length; z++) { IEditorPart ep = editors[z]; IEditorInput input = ep.getEditorInput(); if (!inputs.contains(input)) { inputs.add(input); result.add(ep); } } } } return (IEditorPart[]) result.toArray(new IEditorPart[result.size()]); } public static IWorkbenchWindow getActiveWorkbenchWindow() { return getDefault().getWorkbench().getActiveWorkbenchWindow(); } /** * Returns the shared instance. */ public static PHPeclipsePlugin getDefault() { return plugin; } public static ImageDescriptorRegistry getImageDescriptorRegistry() { return getDefault().internalGetImageDescriptorRegistry(); } static IPath getInstallLocation() { return new Path(getDefault().getDescriptor().getInstallURL().getFile()); } public static int getJVM() { return jvm; } public static String getPluginId() { return getDefault().getDescriptor().getUniqueIdentifier(); } /** * Returns the standard display to be used. The method first checks, if * the thread calling this method has an associated display. If so, this * display is returned. Otherwise the method returns the default display. */ public static Display getStandardDisplay() { Display display = Display.getCurrent(); if (display == null) { display = Display.getDefault(); } return display; } // public static ExternalToolsPlugin getExternalTools() { // return externalTools; // } /** * Returns the workspace instance. */ public static IWorkspace getWorkspace() { return ResourcesPlugin.getWorkspace(); } public static boolean isDebug() { return getDefault().isDebugging(); } // public static void logErrorMessage(String message) { // log(new Status(IStatus.ERROR, getPluginId(), JavaStatusConstants.INTERNAL_ERROR, message, null)); // } // // public static void logErrorStatus(String message, IStatus status) { // if (status == null) { // logErrorMessage(message); // return; // } // MultiStatus multi= new MultiStatus(getPluginId(), JavaStatusConstants.INTERNAL_ERROR, message, null); // multi.add(status); // log(multi); // } // // public static void log(Throwable e) { // log(new Status(IStatus.ERROR, getPluginId(), JavaStatusConstants.INTERNAL_ERROR, JavaUIMessages.getString("JavaPlugin.internal_error"), e)); //$NON-NLS-1$ // } 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(IStatus status) { getDefault().getLog().log(status); } public static void log(Throwable e) { log(new Status(IStatus.ERROR, PLUGIN_ID, IStatus.ERROR, "PHPeclipsePlugin.internalErrorOccurred", e)); //$NON-NLS-1$ } private static void setJVM() { String osName = System.getProperty("os.name"); if (osName.startsWith("Mac OS")) { String mrjVersion = System.getProperty("mrj.version"); String majorMRJVersion = mrjVersion.substring(0, 3); jvm = OTHER; try { double version = Double.valueOf(majorMRJVersion).doubleValue(); if (version == 2) { jvm = MRJ_2_0; } else if (version >= 2.1 && version < 3) { jvm = MRJ_2_1; } else if (version == 3.0) { jvm = MRJ_3_0; } else if (version >= 3.1) { jvm = MRJ_3_1; } } catch (NumberFormatException nfe) { } } else if (osName.startsWith("Windows")) { if (osName.indexOf("9") != -1) { jvm = WINDOWS_9x; } else { jvm = WINDOWS_NT; } } } // TODO: refactor this into a better method name ! public synchronized PHPDocumentProvider getCompilationUnitDocumentProvider() { if (fCompilationUnitDocumentProvider == null) fCompilationUnitDocumentProvider = new PHPDocumentProvider(); return fCompilationUnitDocumentProvider; } /** * Get the identifier index manager for the given project * * @param iProject the current project * @return */ public IdentifierIndexManager getIndexManager(IProject iProject) { String indexFilename = iProject.getLocation() + File.separator + "project.index"; IdentifierIndexManager indexManager = (IdentifierIndexManager) fIndexManagerMap.get(indexFilename); if (indexManager == null) { indexManager = new IdentifierIndexManager(indexFilename); fIndexManagerMap.put(indexFilename, indexManager); } return indexManager; } public synchronized JavaTextTools getJavaTextTools() { if (fJavaTextTools == null) fJavaTextTools = new JavaTextTools(getPreferenceStore()); return fJavaTextTools; } public IFile getLastEditorFile() { return fLastEditorFile; } /** * Returns the string from the plugin's resource bundle, * or 'key' if not found. */ // public static String getResourceString(String key) { // ResourceBundle bundle = PHPeclipsePlugin.getDefault().getResourceBundle(); // try { // return bundle.getString(key); // } catch (MissingResourceException e) { // return key; // } // } /** * Returns the plugin's resource bundle, */ // public ResourceBundle getResourceBundle() { // return resourceBundle; // } protected void initializeDefaultPreferences(IPreferenceStore store) { // windows preferences: store.setDefault(LOCALHOST_PREF, "http://localhost"); store.setDefault(SHOW_EXTERNAL_PREVIEW_PREF, "true"); store.setDefault(USE_EXTERNAL_BROWSER_PREF, "false"); store.setDefault(SHOW_OUTPUT_IN_CONSOLE, "true"); String windowsSystem = BootLoader.getWS(); if (jvm == WINDOWS_9x) { store.setDefault(EXTERNAL_BROWSER_PREF, "command.com /c start iexplore {0}"); } else if (windowsSystem.equals(BootLoader.WS_WIN32)) { store.setDefault(EXTERNAL_BROWSER_PREF, "rundll32 url.dll,FileProtocolHandler {0}"); } else if (windowsSystem.equals(BootLoader.WS_CARBON)) { // TODO How do we start Safari on Mac OS X ? store.setDefault(EXTERNAL_BROWSER_PREF, "netscape {0}"); } else { store.setDefault(EXTERNAL_BROWSER_PREF, "netscape {0}"); } store.setDefault(DOCUMENTROOT_PREF, getWorkspace().getRoot().getLocation().toString()); // if ((jvm == WINDOWS_9x) || (jvm == WINDOWS_NT)) { // if (windowsSystem.equals(BootLoader.WS_WIN32)) { store.setDefault(PHP_RUN_PREF, "c:\\apache\\php\\php.exe"); store.setDefault(EXTERNAL_PARSER_PREF, "c:\\apache\\php\\php -l -f {0}"); store.setDefault(MYSQL_RUN_PREF, "c:\\apache\\mysql\\bin\\mysqld-nt.exe"); store.setDefault(APACHE_RUN_PREF, "c:\\apache\\apache.exe"); } else { store.setDefault(PHP_RUN_PREF, "/apache/php/php"); store.setDefault(EXTERNAL_PARSER_PREF, "/apache/php/php -l -f {0}"); store.setDefault(MYSQL_RUN_PREF, "/apache/mysql/bin/mysqld"); store.setDefault(APACHE_RUN_PREF, "/apache/apache"); } store.setDefault(MYSQL_PREF, "--standalone"); store.setDefault(APACHE_START_PREF, "-c \"DocumentRoot \"{0}\"\""); store.setDefault(APACHE_STOP_PREF, "-k shutdown"); store.setDefault(APACHE_RESTART_PREF, "-k restart"); store.setDefault(MYSQL_START_BACKGROUND, "true"); store.setDefault(APACHE_START_BACKGROUND, "true"); store.setDefault(APACHE_STOP_BACKGROUND, "true"); store.setDefault(APACHE_RESTART_BACKGROUND, "true"); store.setDefault(PHP_PARSER_DEFAULT, PHP_EXTERNAL_PARSER); store.setDefault(PHP_INTERNAL_PARSER, "false"); store.setDefault(PHP_EXTERNAL_PARSER, "true"); // store.setDefault(PHP_PARSE_ON_SAVE, "true"); // show line numbers: // store.setDefault(LINE_NUMBER_RULER, "false"); // store.setDefault(FORMATTER_TAB_SIZE, "4"); // php syntax highlighting store.setDefault(PHP_USERDEF_XMLFILE, ""); //assume there is none chooA PreferenceConverter.setDefault(store, PHP_MULTILINE_COMMENT, PHPColorProvider.MULTI_LINE_COMMENT); PreferenceConverter.setDefault(store, PHP_SINGLELINE_COMMENT, PHPColorProvider.SINGLE_LINE_COMMENT); PreferenceConverter.setDefault(store, PHP_TAG, PHPColorProvider.TAG); PreferenceConverter.setDefault(store, PHP_KEYWORD, PHPColorProvider.KEYWORD); PreferenceConverter.setDefault(store, PHP_VARIABLE, PHPColorProvider.VARIABLE); PreferenceConverter.setDefault(store, PHP_FUNCTIONNAME, PHPColorProvider.FUNCTION_NAME); PreferenceConverter.setDefault(store, PHP_CONSTANT, PHPColorProvider.CONSTANT); PreferenceConverter.setDefault(store, PHP_TYPE, PHPColorProvider.TYPE); PreferenceConverter.setDefault(store, PHP_STRING, PHPColorProvider.STRING); PreferenceConverter.setDefault(store, PHP_DEFAULT, PHPColorProvider.DEFAULT); PreferenceConverter.setDefault(store, PHPDOC_KEYWORD, PHPColorProvider.PHPDOC_KEYWORD); PreferenceConverter.setDefault(store, PHPDOC_TAG, PHPColorProvider.PHPDOC_TAG); PreferenceConverter.setDefault(store, PHPDOC_LINK, PHPColorProvider.PHPDOC_LINK); PreferenceConverter.setDefault(store, PHPDOC_DEFAULT, PHPColorProvider.PHPDOC_DEFAULT); // PreferenceConverter.setDefault( // store, // PHP_EDITOR_BACKGROUND, // PHPColorProvider.BACKGROUND); // PreferenceConverter.setDefault( // store, // LINKED_POSITION_COLOR, // PHPColorProvider.LINKED_POSITION_COLOR); // PreferenceConverter.setDefault( // store, // LINE_NUMBER_COLOR, // PHPColorProvider.LINE_NUMBER_COLOR); // // set default PHPDoc colors: // PreferenceConverter.setDefault( // store, // PHPDOC_KEYWORD, // PHPColorProvider.PHPDOC_KEYWORD); // PreferenceConverter.setDefault( // store, // PHPDOC_LINK, // PHPColorProvider.PHPDOC_LINK); // PreferenceConverter.setDefault( // store, // PHPDOC_DEFAULT, // PHPColorProvider.PHPDOC_DEFAULT); // PreferenceConverter.setDefault( // store, // PHPDOC_TAG, // PHPColorProvider.PHPDOC_TAG); // store.setDefault(PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT, "true"); // PreferenceConverter.setDefault( // store, // PREFERENCE_COLOR_BACKGROUND, // PHPColorProvider.BACKGROUND_COLOR); //language stuff store.setDefault(RESOURCE_BUNDLE, LANGUAGE_DEFAULT); store.setDefault(RESOURCE_BUNDLE_EN_GB, "true"); store.setDefault(RESOURCE_BUNDLE_DE, "false"); store.setDefault(RESOURCE_BUNDLE_FR, "false"); store.setDefault(RESOURCE_BUNDLE_ES, "false"); store.setDefault(PHP_OUTLINE_CLASS, "true"); //$NON-NLS-1$ store.setDefault(PHP_OUTLINE_FUNC, "true"); //$NON-NLS-1$ store.setDefault(PHP_OUTLINE_VAR, "true"); //$NON-NLS-1$ TemplatePreferencePage.initDefaults(store); //this will initialize the static fields in the syntaxrdr class new PHPSyntaxRdr(); PHPCore.initializeDefaultPluginPreferences(); PreferenceConstants.initializeDefaultValues(store); externalTools.initializeDefaultPreferences(store); } private IWorkbenchPage internalGetActivePage() { IWorkbenchWindow window = getWorkbench().getActiveWorkbenchWindow(); if (window != null) return window.getActivePage(); return null; } private ImageDescriptorRegistry internalGetImageDescriptorRegistry() { if (fImageDescriptorRegistry == null) fImageDescriptorRegistry = new ImageDescriptorRegistry(); return fImageDescriptorRegistry; } /** * 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().getFileForLocation(path); IEditorPart editor; ITextEditor textEditor; if (file != null && file.exists()) { editor = page.openEditor(file); 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.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; } /** * Open a file in the Workbench that may or may not exist in the workspace. * Must be run on the UI thread. * @param filename * @param line * @throws CoreException */ public void openFileAndGotoLine(String filename, int line) throws CoreException { ITextEditor textEditor = openFileInTextEditor(filename); if (textEditor != null) { // If a line number was given, go to it if (line > 0) { try { line--; // document is 0 based IDocument document = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput()); textEditor.selectAndReveal(document.getLineOffset(line), document.getLineLength(line)); } catch (BadLocationException e) { // invalid text position -> do nothing } } } } /** * Open a file in the Workbench that may or may not exist in the workspace. * Must be run on the UI thread. * @param filename * @param offset * @throws CoreException */ 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 void setLastEditorFile(IFile textEditor) { this.fLastEditorFile = textEditor; } /** * @see org.eclipse.ui.plugin.AbstractUIPlugin#shutdown() */ public void shutdown() throws CoreException { super.shutdown(); // externalTools.shutDown(); ColorManager.getDefault().dispose(); // save the information from the php index files if necessary Collection collection = fIndexManagerMap.values(); Iterator iterator = collection.iterator(); IdentifierIndexManager indexManager = null; while (iterator.hasNext()) { indexManager = (IdentifierIndexManager) iterator.next(); indexManager.writeFile(); } } public void startup() throws CoreException { super.startup(); IAdapterManager manager = Platform.getAdapterManager(); manager.registerAdapters(new PHPElementAdapterFactory(), PHPElement.class); manager.registerAdapters(new ResourceAdapterFactory(), IResource.class); // externalTools.startUp(); getStandardDisplay().asyncExec(new Runnable() { public void run() { //initialize the variable context manager VariableContextManager.getDefault(); } }); } }