php formatter based on the JDT java formatter (very early version)
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / PHPCore.java
index 0f812e3..52d906b 100644 (file)
@@ -1,6 +1,9 @@
 package net.sourceforge.phpeclipse;
 
 import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.Hashtable;
 import java.util.List;
 
 import net.sourceforge.phpeclipse.resourcesview.PHPFile;
@@ -9,14 +12,668 @@ import net.sourceforge.phpeclipse.resourcesview.PHPProject;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.core.runtime.Preferences;
 
 public class PHPCore {
 
+  public static HashSet OptionNames = new HashSet(20);
+  /**
+   * The plug-in identifier of the Java core support
+   * (value <code>"org.phpeclipse.phpdt.core"</code>).
+   */
+  public static final String PLUGIN_ID = "net.sourceforge.phpeclipse.core"; //$NON-NLS-1$
+
+  /**
+     * Possible  configurable option ID.
+     * @see #getDefaultOptions
+     * @since 2.0
+     */
+  public static final String CORE_ENCODING = PLUGIN_ID + ".encoding"; //$NON-NLS-1$
+
+  /**
+     * Possible  configurable option ID.
+     * @see #getDefaultOptions
+     * @since 2.0
+     */
+  public static final String FORMATTER_NEWLINE_OPENING_BRACE = PLUGIN_ID + ".formatter.newline.openingBrace"; //$NON-NLS-1$
+  /**
+   * Possible  configurable option ID.
+   * @see #getDefaultOptions
+   * @since 2.0
+   */
+  public static final String FORMATTER_NEWLINE_CONTROL = PLUGIN_ID + ".formatter.newline.controlStatement"; //$NON-NLS-1$
+  /**
+   * Possible  configurable option ID.
+   * @see #getDefaultOptions
+   * @since 2.0
+   */
+  public static final String FORMATTER_NEWLINE_ELSE_IF = PLUGIN_ID + ".formatter.newline.elseIf"; //$NON-NLS-1$
+  /**
+   * Possible  configurable option ID.
+   * @see #getDefaultOptions
+   * @since 2.0
+   */
+  public static final String FORMATTER_NEWLINE_EMPTY_BLOCK = PLUGIN_ID + ".formatter.newline.emptyBlock"; //$NON-NLS-1$
+  /**
+   * Possible  configurable option ID.
+   * @see #getDefaultOptions
+   * @since 2.0
+   */
+  public static final String FORMATTER_CLEAR_BLANK_LINES = PLUGIN_ID + ".formatter.newline.clearAll"; //$NON-NLS-1$
+  /**
+   * Possible  configurable option ID.
+   * @see #getDefaultOptions
+   * @since 2.0
+   */
+  public static final String FORMATTER_LINE_SPLIT = PLUGIN_ID + ".formatter.lineSplit"; //$NON-NLS-1$
+  /**
+   * Possible  configurable option ID.
+   * @see #getDefaultOptions
+   * @since 2.0
+   */
+  public static final String FORMATTER_COMPACT_ASSIGNMENT = PLUGIN_ID + ".formatter.style.assignment"; //$NON-NLS-1$
+  /**
+   * Possible  configurable option ID.
+   * @see #getDefaultOptions
+   * @since 2.0
+   */
+  public static final String FORMATTER_TAB_CHAR = PLUGIN_ID + ".formatter.tabulation.char"; //$NON-NLS-1$
+  /**
+   * Possible  configurable option ID.
+   * @see #getDefaultOptions
+   * @since 2.0
+   */
+  public static final String FORMATTER_TAB_SIZE = PLUGIN_ID + ".formatter.tabulation.size"; //$NON-NLS-1$
+  /**
+   * Possible  configurable option value.
+   * @see #getDefaultOptions
+   * @since 2.0
+   */
+  public static final String INSERT = "insert"; //$NON-NLS-1$
+  /**
+   * Possible  configurable option value.
+   * @see #getDefaultOptions
+   * @since 2.0
+   */
+  public static final String DO_NOT_INSERT = "do not insert"; //$NON-NLS-1$
+
+  /**
+   * Possible  configurable option value.
+   * @see #getDefaultOptions
+   * @since 2.0
+   */
+  public static final String PRESERVE_ONE = "preserve one"; //$NON-NLS-1$
+  /**
+   * Possible  configurable option value.
+   * @see #getDefaultOptions
+   * @since 2.0
+   */
+  public static final String CLEAR_ALL = "clear all"; //$NON-NLS-1$
+  /**
+   * Possible  configurable option value.
+   * @see #getDefaultOptions
+   * @since 2.0
+   */
+  public static final String NORMAL = "normal"; //$NON-NLS-1$
+  /**
+   * Possible  configurable option value.
+   * @see #getDefaultOptions
+   * @since 2.0
+   */
+  public static final String COMPACT = "compact"; //$NON-NLS-1$
+  /**
+   * Possible  configurable option value.
+   * @see #getDefaultOptions
+   * @since 2.0
+   */
+  public static final String TAB = "tab"; //$NON-NLS-1$
+  /**
+   * Possible  configurable option value.
+   * @see #getDefaultOptions
+   * @since 2.0
+   */
+  public static final String SPACE = "space"; //$NON-NLS-1$
+  /**
+   * Possible  configurable option value.
+   * @see #getDefaultOptions
+   * @since 2.0
+   */
+  public static final String ENABLED = "enabled"; //$NON-NLS-1$
+  /**
+   * Possible  configurable option value.
+   * @see #getDefaultOptions
+   * @since 2.0
+   */
+  public static final String DISABLED = "disabled"; //$NON-NLS-1$
+  /**
+   * Possible  configurable option value.
+   * @see #getDefaultOptions
+   * @since 2.1
+   */
+  public static final String CLEAN = "clean"; //$NON-NLS-1$
+       
+  /**
+   * Returns a table of all known configurable options with their default values.
+   * These options allow to configure the behaviour of the underlying components.
+   * The client may safely use the result as a template that they can modify and
+   * then pass to <code>setOptions</code>.
+   * 
+   * Helper constants have been defined on JavaCore for each of the option ID and 
+   * their possible constant values.
+   * 
+   * Note: more options might be added in further releases.
+   * <pre>
+   * RECOGNIZED OPTIONS:
+   * COMPILER / Generating Local Variable Debug Attribute
+   *    When generated, this attribute will enable local variable names 
+   *    to be displayed in debugger, only in place where variables are 
+   *    definitely assigned (.class file is then bigger)
+   *     - option id:         "org.phpeclipse.phpdt.core.compiler.debug.localVariable"
+   *     - possible values:   { "generate", "do not generate" }
+   *     - default:           "generate"
+   *
+   * COMPILER / Generating Line Number Debug Attribute 
+   *    When generated, this attribute will enable source code highlighting in debugger 
+   *    (.class file is then bigger).
+   *     - option id:         "org.phpeclipse.phpdt.core.compiler.debug.lineNumber"
+   *     - possible values:   { "generate", "do not generate" }
+   *     - default:           "generate"
+   *    
+   * COMPILER / Generating Source Debug Attribute 
+   *    When generated, this attribute will enable the debugger to present the 
+   *    corresponding source code.
+   *     - option id:         "org.phpeclipse.phpdt.core.compiler.debug.sourceFile"
+   *     - possible values:   { "generate", "do not generate" }
+   *     - default:           "generate"
+   *    
+   * COMPILER / Preserving Unused Local Variables
+   *    Unless requested to preserve unused local variables (i.e. never read), the 
+   *    compiler will optimize them out, potentially altering debugging
+   *     - option id:         "org.phpeclipse.phpdt.core.compiler.codegen.unusedLocal"
+   *     - possible values:   { "preserve", "optimize out" }
+   *     - default:           "preserve"
+   * 
+   * COMPILER / Defining Target Java Platform
+   *    For binary compatibility reason, .class files can be tagged to with certain VM versions and later.
+   *    Note that "1.4" target require to toggle compliance mode to "1.4" too.
+   *     - option id:         "org.phpeclipse.phpdt.core.compiler.codegen.targetPlatform"
+   *     - possible values:   { "1.1", "1.2", "1.3", "1.4" }
+   *     - default:           "1.1"
+   *
+   * COMPILER / Reporting Unreachable Code
+   *    Unreachable code can optionally be reported as an error, warning or simply 
+   *    ignored. The bytecode generation will always optimized it out.
+   *     - option id:         "org.phpeclipse.phpdt.core.compiler.problem.unreachableCode"
+   *     - possible values:   { "error", "warning", "ignore" }
+   *     - default:           "error"
+   *
+   * COMPILER / Reporting Invalid Import
+   *    An import statement that cannot be resolved might optionally be reported 
+   *    as an error, as a warning or ignored.
+   *     - option id:         "org.phpeclipse.phpdt.core.compiler.problem.invalidImport"
+   *     - possible values:   { "error", "warning", "ignore" }
+   *     - default:           "error"
+   *
+   * COMPILER / Reporting Attempt to Override Package-Default Method
+   *    A package default method is not visible in a different package, and thus 
+   *    cannot be overridden. When enabling this option, the compiler will signal 
+   *    such scenarii either as an error or a warning.
+   *     - option id:         "org.phpeclipse.phpdt.core.compiler.problem.overridingPackageDefaultMethod"
+   *     - possible values:   { "error", "warning", "ignore" }
+   *     - default:           "warning"
+   *
+   * COMPILER / Reporting Method With Constructor Name
+   *    Naming a method with a constructor name is generally considered poor 
+   *    style programming. When enabling this option, the compiler will signal such 
+   *    scenarii either as an error or a warning.
+   *     - option id:         "org.phpeclipse.phpdt.core.compiler.problem.methodWithConstructorName"
+   *     - possible values:   { "error", "warning", "ignore" }
+   *     - default:           "warning"
+   *
+   * COMPILER / Reporting Deprecation
+   *    When enabled, the compiler will signal use of deprecated API either as an 
+   *    error or a warning.
+   *     - option id:         "org.phpeclipse.phpdt.core.compiler.problem.deprecation"
+   *     - possible values:   { "error", "warning", "ignore" }
+   *     - default:           "warning"
+   *
+   * COMPILER / Reporting Deprecation Inside Deprecated Code
+   *    When enabled, the compiler will signal use of deprecated API inside deprecated code.
+   *    The severity of the problem is controlled with option "org.phpeclipse.phpdt.core.compiler.problem.deprecation".
+   *     - option id:         "org.phpeclipse.phpdt.core.compiler.problem.deprecationInDeprecatedCode"
+   *     - possible values:   { "enabled", "disabled" }
+   *     - default:           "disabled"
+   *
+   * COMPILER / Reporting Hidden Catch Block
+   *    Locally to a try statement, some catch blocks may hide others , e.g.
+   *      try {  throw new java.io.CharConversionException();
+   *      } catch (java.io.CharConversionException e) {
+   *      } catch (java.io.IOException e) {}. 
+   *    When enabling this option, the compiler will issue an error or a warning for hidden 
+   *    catch blocks corresponding to checked exceptions
+   *     - option id:         "org.phpeclipse.phpdt.core.compiler.problem.hiddenCatchBlock"
+   *     - possible values:   { "error", "warning", "ignore" }
+   *     - default:           "warning"
+   *
+   * COMPILER / Reporting Unused Local
+   *    When enabled, the compiler will issue an error or a warning for unused local 
+   *    variables (i.e. variables never read from)
+   *     - option id:         "org.phpeclipse.phpdt.core.compiler.problem.unusedLocal"
+   *     - possible values:   { "error", "warning", "ignore" }
+   *     - default:           "ignore"
+   *
+   * COMPILER / Reporting Unused Parameter
+   *    When enabled, the compiler will issue an error or a warning for unused method 
+   *    parameters (i.e. parameters never read from)
+   *     - option id:         "org.phpeclipse.phpdt.core.compiler.problem.unusedParameter"
+   *     - possible values:   { "error", "warning", "ignore" }
+   *     - default:           "ignore"
+   *
+   * COMPILER / Reporting Unused Import
+   *    When enabled, the compiler will issue an error or a warning for unused import 
+   *    reference 
+   *     - option id:         "org.phpeclipse.phpdt.core.compiler.problem.unusedImport"
+   *     - possible values:   { "error", "warning", "ignore" }
+   *     - default:           "warning"
+   *
+   * COMPILER / Reporting Synthetic Access Emulation
+   *    When enabled, the compiler will issue an error or a warning whenever it emulates 
+   *    access to a non-accessible member of an enclosing type. Such access can have
+   *    performance implications.
+   *     - option id:         "org.phpeclipse.phpdt.core.compiler.problem.syntheticAccessEmulation"
+   *     - possible values:   { "error", "warning", "ignore" }
+   *     - default:           "ignore"
+   *
+   * COMPILER / Reporting Non-Externalized String Literal
+   *    When enabled, the compiler will issue an error or a warning for non externalized 
+   *    String literal (i.e. non tagged with //$NON-NLS-<n>$). 
+   *     - option id:         "org.phpeclipse.phpdt.core.compiler.problem.nonExternalizedStringLiteral"
+   *     - possible values:   { "error", "warning", "ignore" }
+   *     - default:           "ignore"
+   * 
+   * COMPILER / Reporting Usage of 'assert' Identifier
+   *    When enabled, the compiler will issue an error or a warning whenever 'assert' is 
+   *    used as an identifier (reserved keyword in 1.4)
+   *     - option id:         "org.phpeclipse.phpdt.core.compiler.problem.assertIdentifier"
+   *     - possible values:   { "error", "warning", "ignore" }
+   *     - default:           "ignore"
+   * 
+   * COMPILER / Reporting Usage of expression receiver on static invocation/field access
+   *    When enabled, the compiler will issue an error or a warning whenever a static field
+   *    or method is accessed with an expression receiver.
+   *     - option id:         "org.phpeclipse.phpdt.core.compiler.problem.staticAccessReceiver"
+   *     - possible values:   { "error", "warning", "ignore" }
+   *     - default:           "warning"
+   * 
+   * COMPILER / Reporting Assignment with no effect
+   *    When enabled, the compiler will issue an error or a warning whenever an assignment
+   *    has no effect (e.g 'x = x').
+   *     - option id:         "org.phpeclipse.phpdt.core.compiler.problem.noEffectAssignment"
+   *     - possible values:   { "error", "warning", "ignore" }
+   *     - default:           "warning"
+   * 
+   * COMPILER / Setting Source Compatibility Mode
+   *    Specify whether source is 1.3 or 1.4 compatible. From 1.4 on, 'assert' is a keyword
+   *    reserved for assertion support. Also note, than when toggling to 1.4 mode, the target VM
+   *   level should be set to "1.4" and the compliance mode should be "1.4".
+   *     - option id:         "org.phpeclipse.phpdt.core.compiler.source"
+   *     - possible values:   { "1.3", "1.4" }
+   *     - default:           "1.3"
+   * 
+   * COMPILER / Setting Compliance Level
+   *    Select the compliance level for the compiler. In "1.3" mode, source and target settings
+   *    should not go beyond "1.3" level.
+   *     - option id:         "org.phpeclipse.phpdt.core.compiler.compliance"
+   *     - possible values:   { "1.3", "1.4" }
+   *     - default:           "1.3"
+   * 
+   * COMPILER / Maximum number of problems reported per compilation unit
+   *    Specify the maximum number of problems reported on each compilation unit.
+   *     - option id:         "org.phpeclipse.phpdt.core.compiler.maxProblemPerUnit"
+   *     - possible values:    "<n>" where <n> is zero or a positive integer (if zero then all problems are reported).
+   *     - default:           "100"
+   * 
+   * COMPILER / Define the Automatic Task Tags
+   *    When the tag is non empty, the compiler will issue a task marker whenever it encounters
+   *    one of the corresponding tag inside any comment in Java source code.
+   *    Generated task messages will include the tag, and range until the next line separator or comment ending, and will be trimmed.
+   *     - option id:         "org.phpeclipse.phpdt.core.compiler.taskTags"
+   *     - possible values:   { "<tag>[,<tag>]*" } where <tag> is a String without any wild-card 
+   *     - default:           ""
+   * 
+   * COMPILER / Define the Automatic Task Priorities
+   *    In parallel with the Automatic Task Tags, this list defines the priorities (high, normal or low)
+   *    of the task markers issued by the compiler.
+   *    If the default is specified, the priority of each task marker is "NORMAL".
+   *     - option id:         "org.phpeclipse.phpdt.core.compiler.taskPriorities"
+   *     - possible values:   { "<priority>[,<priority>]*" } where <priority> is one of "HIGH", "NORMAL" or "LOW"
+   *     - default:           ""
+   * 
+   * BUILDER / Specifying Filters for Resource Copying Control
+   *    Allow to specify some filters to control the resource copy process.
+   *     - option id:         "org.phpeclipse.phpdt.core.builder.resourceCopyExclusionFilter"
+   *     - possible values:   { "<name>[,<name>]* } where <name> is a file name pattern (* and ? wild-cards allowed)
+   *       or the name of a folder which ends with '/'
+   *     - default:           ""
+   * 
+   * BUILDER / Abort if Invalid Classpath
+   *    Allow to toggle the builder to abort if the classpath is invalid
+   *     - option id:         "org.phpeclipse.phpdt.core.builder.invalidClasspath"
+   *     - possible values:   { "abort", "ignore" }
+   *     - default:           "ignore"
+   * 
+   * BUILDER / Cleaning Output Folder(s)
+   *    Indicate whether the JavaBuilder is allowed to clean the output folders
+   *    when performing full build operations.
+   *     - option id:         "org.phpeclipse.phpdt.core.builder.cleanOutputFolder"
+   *     - possible values:   { "clean", "ignore" }
+   *     - default:           "clean"
+   * 
+   * JAVACORE / Computing Project Build Order
+   *    Indicate whether JavaCore should enforce the project build order to be based on
+   *    the classpath prerequisite chain. When requesting to compute, this takes over
+   *    the platform default order (based on project references).
+   *     - option id:         "org.phpeclipse.phpdt.core.computeJavaBuildOrder"
+   *     - possible values:   { "compute", "ignore" }
+   *     - default:           "ignore"  
+   * 
+   * JAVACORE / Specify Default Source Encoding Format
+   *    Get the encoding format for compiled sources. This setting is read-only, it is equivalent
+   *    to 'ResourcesPlugin.getEncoding()'.
+   *     - option id:         "org.phpeclipse.phpdt.core.encoding"
+   *     - possible values:   { any of the supported encoding name}.
+   *     - default:           <platform default>
+   * 
+   * JAVACORE / Reporting Incomplete Classpath
+   *    An entry on the classpath doesn't exist or is not visible (e.g. a referenced project is closed).
+   *     - option id:         "org.phpeclipse.phpdt.core.incompleteClasspath"
+   *     - possible values:   { "error", "warning"}
+   *     - default:           "error"
+   * 
+   * JAVACORE / Reporting Classpath Cycle
+   *    A project is involved in a cycle.
+   *     - option id:         "org.phpeclipse.phpdt.core.circularClasspath"
+   *     - possible values:   { "error", "warning" }
+   *     - default:           "error"
+   * 
+   *   FORMATTER / Inserting New Line Before Opening Brace
+   *    When Insert, a new line is inserted before an opening brace, otherwise nothing
+   *    is inserted
+   *     - option id:         "org.phpeclipse.phpdt.core.formatter.newline.openingBrace"
+   *     - possible values:   { "insert", "do not insert" }
+   *     - default:           "do not insert"
+   * 
+   *   FORMATTER / Inserting New Line Inside Control Statement
+   *    When Insert, a new line is inserted between } and following else, catch, finally
+   *     - option id:         "org.phpeclipse.phpdt.core.formatter.newline.controlStatement"
+   *     - possible values:   { "insert", "do not insert" }
+   *     - default:           "do not insert"
+   * 
+   *   FORMATTER / Clearing Blank Lines
+   *    When Clear all, all blank lines are removed. When Preserve one, only one is kept
+   *    and all others removed.
+   *     - option id:         "org.phpeclipse.phpdt.core.formatter.newline.clearAll"
+   *     - possible values:   { "clear all", "preserve one" }
+   *     - default:           "preserve one"
+   * 
+   *   FORMATTER / Inserting New Line Between Else/If 
+   *    When Insert, a blank line is inserted between an else and an if when they are 
+   *    contiguous. When choosing to not insert, else-if will be kept on the same
+   *    line when possible.
+   *     - option id:         "org.phpeclipse.phpdt.core.formatter.newline.elseIf"
+   *     - possible values:   { "insert", "do not insert" }
+   *     - default:           "do not insert"
+   * 
+   *   FORMATTER / Inserting New Line In Empty Block
+   *    When insert, a line break is inserted between contiguous { and }, if } is not followed
+   *    by a keyword.
+   *     - option id:         "org.phpeclipse.phpdt.core.formatter.newline.emptyBlock"
+   *     - possible values:   { "insert", "do not insert" }
+   *     - default:           "insert"
+   * 
+   *   FORMATTER / Splitting Lines Exceeding Length
+   *    Enable splitting of long lines (exceeding the configurable length). Length of 0 will
+   *    disable line splitting
+   *     - option id:         "org.phpeclipse.phpdt.core.formatter.lineSplit"
+   *     - possible values:    "<n>", where n is zero or a positive integer
+   *     - default:           "80"
+   * 
+   *   FORMATTER / Compacting Assignment
+   *    Assignments can be formatted asymmetrically, e.g. 'int x= 2;', when Normal, a space
+   *    is inserted before the assignment operator
+   *     - option id:         "org.phpeclipse.phpdt.core.formatter.style.assignment"
+   *     - possible values:   { "compact", "normal" }
+   *     - default:           "normal"
+   * 
+   *   FORMATTER / Defining Indentation Character
+   *    Either choose to indent with tab characters or spaces
+   *     - option id:         "org.phpeclipse.phpdt.core.formatter.tabulation.char"
+   *     - possible values:   { "tab", "space" }
+   *     - default:           "tab"
+   * 
+   *   FORMATTER / Defining Space Indentation Length
+   *    When using spaces, set the amount of space characters to use for each 
+   *    indentation mark.
+   *     - option id:         "org.phpeclipse.phpdt.core.formatter.tabulation.size"
+   *     - possible values:    "<n>", where n is a positive integer
+   *     - default:           "4"
+   * 
+   *   CODEASSIST / Activate Visibility Sensitive Completion
+   *    When active, completion doesn't show that you can not see
+   *    (e.g. you can not see private methods of a super class).
+   *     - option id:         "org.phpeclipse.phpdt.core.codeComplete.visibilityCheck"
+   *     - possible values:   { "enabled", "disabled" }
+   *     - default:           "disabled"
+   * 
+   *   CODEASSIST / Automatic Qualification of Implicit Members
+   *    When active, completion automatically qualifies completion on implicit
+   *    field references and message expressions.
+   *     - option id:         "org.phpeclipse.phpdt.core.codeComplete.forceImplicitQualification"
+   *     - possible values:   { "enabled", "disabled" }
+   *     - default:           "disabled"
+   * 
+   *  CODEASSIST / Define the Prefixes for Field Name
+   *    When the prefixes is non empty, completion for field name will begin with
+   *    one of the proposed prefixes.
+   *     - option id:         "org.phpeclipse.phpdt.core.codeComplete.fieldPrefixes"
+   *     - possible values:   { "<prefix>[,<prefix>]*" } where <prefix> is a String without any wild-card 
+   *     - default:           ""
+   * 
+   *  CODEASSIST / Define the Prefixes for Static Field Name
+   *    When the prefixes is non empty, completion for static field name will begin with
+   *    one of the proposed prefixes.
+   *     - option id:         "org.phpeclipse.phpdt.core.codeComplete.staticFieldPrefixes"
+   *     - possible values:   { "<prefix>[,<prefix>]*" } where <prefix> is a String without any wild-card 
+   *     - default:           ""
+   * 
+   *  CODEASSIST / Define the Prefixes for Local Variable Name
+   *    When the prefixes is non empty, completion for local variable name will begin with
+   *    one of the proposed prefixes.
+   *     - option id:         "org.phpeclipse.phpdt.core.codeComplete.localPrefixes"
+   *     - possible values:   { "<prefix>[,<prefix>]*" } where <prefix> is a String without any wild-card 
+   *     - default:           ""
+   * 
+   *  CODEASSIST / Define the Prefixes for Argument Name
+   *    When the prefixes is non empty, completion for argument name will begin with
+   *    one of the proposed prefixes.
+   *     - option id:         "org.phpeclipse.phpdt.core.codeComplete.argumentPrefixes"
+   *     - possible values:   { "<prefix>[,<prefix>]*" } where <prefix> is a String without any wild-card 
+   *     - default:           ""
+   * 
+   *  CODEASSIST / Define the Suffixes for Field Name
+   *    When the suffixes is non empty, completion for field name will end with
+   *    one of the proposed suffixes.
+   *     - option id:         "org.phpeclipse.phpdt.core.codeComplete.fieldSuffixes"
+   *     - possible values:   { "<suffix>[,<suffix>]*" } where <suffix> is a String without any wild-card 
+   *     - default:           ""
+   * 
+   *  CODEASSIST / Define the Suffixes for Static Field Name
+   *    When the suffixes is non empty, completion for static field name will end with
+   *    one of the proposed suffixes.
+   *     - option id:         "org.phpeclipse.phpdt.core.codeComplete.staticFieldSuffixes"
+   *     - possible values:   { "<suffix>[,<suffix>]*" } where <suffix> is a String without any wild-card 
+   *     - default:           ""
+   * 
+   *  CODEASSIST / Define the Suffixes for Local Variable Name
+   *    When the suffixes is non empty, completion for local variable name will end with
+   *    one of the proposed suffixes.
+   *     - option id:         "org.phpeclipse.phpdt.core.codeComplete.localSuffixes"
+   *     - possible values:   { "<suffix>[,<suffix>]*" } where <suffix> is a String without any wild-card 
+   *     - default:           ""
+   * 
+   *  CODEASSIST / Define the Suffixes for Argument Name
+   *    When the suffixes is non empty, completion for argument name will end with
+   *    one of the proposed suffixes.
+   *     - option id:         "org.phpeclipse.phpdt.core.codeComplete.argumentSuffixes"
+   *     - possible values:   { "<suffix>[,<suffix>]*" } where <prefix> is a String without any wild-card 
+   *     - default:           ""
+   * </pre>
+   * 
+   * @return a mutable table containing the default settings of all known options
+   *   (key type: <code>String</code>; value type: <code>String</code>)
+   * @see #setOptions
+   */
+  public static Hashtable getDefaultOptions() {
+
+    Hashtable defaultOptions = new Hashtable(10);
+
+    // see #initializeDefaultPluginPreferences() for changing default settings
+    Preferences preferences = getPlugin().getPluginPreferences();
+    HashSet optionNames = OptionNames;
+
+    // get preferences set to their default
+    String[] defaultPropertyNames = preferences.defaultPropertyNames();
+    for (int i = 0; i < defaultPropertyNames.length; i++) {
+      String propertyName = defaultPropertyNames[i];
+      if (optionNames.contains(propertyName)) {
+        defaultOptions.put(
+          propertyName,
+          preferences.getDefaultString(propertyName));
+      }
+    }
+    // get preferences not set to their default
+    String[] propertyNames = preferences.propertyNames();
+    for (int i = 0; i < propertyNames.length; i++) {
+      String propertyName = propertyNames[i];
+      if (optionNames.contains(propertyName)) {
+        defaultOptions.put(
+          propertyName,
+          preferences.getDefaultString(propertyName));
+      }
+    }
+    // get encoding through resource plugin
+    defaultOptions.put(CORE_ENCODING, ResourcesPlugin.getEncoding());
+
+    return defaultOptions;
+  }
+  /**
+   * Helper method for returning one option value only. Equivalent to <code>(String)JavaCore.getOptions().get(optionName)</code>
+   * Note that it may answer <code>null</code> if this option does not exist.
+   * <p>
+   * For a complete description of the configurable options, see <code>getDefaultOptions</code>.
+   * </p>
+   * 
+   * @param optionName the name of an option
+   * @return the String value of a given option
+   * @see JavaCore#getDefaultOptions
+   * @since 2.0
+   */
+  public static String getOption(String optionName) {
+
+    if (CORE_ENCODING.equals(optionName)) {
+      return ResourcesPlugin.getEncoding();
+    }
+    if (OptionNames.contains(optionName)) {
+      Preferences preferences = getPlugin().getPluginPreferences();
+      return preferences.getString(optionName).trim();
+    }
+    return null;
+  }
+
+  /**
+   * Returns the table of the current options. Initially, all options have their default values,
+   * and this method returns a table that includes all known options.
+   * <p>
+   * For a complete description of the configurable options, see <code>getDefaultOptions</code>.
+   * </p>
+   * 
+   * @return table of current settings of all options 
+   *   (key type: <code>String</code>; value type: <code>String</code>)
+   * @see JavaCore#getDefaultOptions
+   */
+  public static Hashtable getOptions() {
+
+    Hashtable options = new Hashtable(10);
+
+    // see #initializeDefaultPluginPreferences() for changing default settings
+    Plugin plugin = getPlugin();
+    if (plugin != null) {
+      Preferences preferences = getPlugin().getPluginPreferences();
+      HashSet optionNames = OptionNames;
+
+      // get preferences set to their default
+      String[] defaultPropertyNames = preferences.defaultPropertyNames();
+      for (int i = 0; i < defaultPropertyNames.length; i++) {
+        String propertyName = defaultPropertyNames[i];
+        if (optionNames.contains(propertyName)) {
+          options.put(propertyName, preferences.getDefaultString(propertyName));
+        }
+      }
+      // get preferences not set to their default
+      String[] propertyNames = preferences.propertyNames();
+      for (int i = 0; i < propertyNames.length; i++) {
+        String propertyName = propertyNames[i];
+        if (optionNames.contains(propertyName)) {
+          options.put(propertyName, preferences.getString(propertyName).trim());
+        }
+      }
+      // get encoding through resource plugin
+      options.put(CORE_ENCODING, ResourcesPlugin.getEncoding());
+    }
+    return options;
+  }
+  /**
+   * Sets the current table of options. All and only the options explicitly included in the given table 
+   * are remembered; all previous option settings are forgotten, including ones not explicitly
+   * mentioned.
+   * <p>
+   * For a complete description of the configurable options, see <code>getDefaultOptions</code>.
+   * </p>
+   * 
+   * @param newOptions the new options (key type: <code>String</code>; value type: <code>String</code>),
+   *   or <code>null</code> to reset all options to their default values
+   * @see JavaCore#getDefaultOptions
+   */
+  public static void setOptions(Hashtable newOptions) {
+
+    // see #initializeDefaultPluginPreferences() for changing default settings
+    Preferences preferences = getPlugin().getPluginPreferences();
+
+    if (newOptions == null) {
+      newOptions = getDefaultOptions();
+    }
+    Enumeration keys = newOptions.keys();
+    while (keys.hasMoreElements()) {
+      String key = (String) keys.nextElement();
+      if (!OptionNames.contains(key))
+        continue; // unrecognized option
+      if (key.equals(CORE_ENCODING))
+        continue; // skipped, contributed by resource prefs
+      String value = (String) newOptions.get(key);
+      preferences.setValue(key, value);
+    }
+
+    // persist options
+    getPlugin().savePluginPreferences();
+  }
   public static IProject[] getPHPProjects() {
     List phpProjectsList = new ArrayList();
-    IProject[] workspaceProjects = PHPeclipsePlugin.getWorkspace().getRoot().getProjects();
+    IProject[] workspaceProjects =
+      PHPeclipsePlugin.getWorkspace().getRoot().getProjects();
 
     for (int i = 0; i < workspaceProjects.length; i++) {
       IProject iProject = workspaceProjects[i];
@@ -29,7 +686,8 @@ public class PHPCore {
   }
 
   public static PHPProject getPHPProject(String name) {
-    IProject aProject = PHPeclipsePlugin.getWorkspace().getRoot().getProject(name);
+    IProject aProject =
+      PHPeclipsePlugin.getWorkspace().getRoot().getProject(name);
     if (isPHPProject(aProject)) {
       PHPProject thePHPProject = new PHPProject();
       thePHPProject.setProject(aProject);
@@ -72,13 +730,15 @@ public class PHPCore {
         return project;
       }
     } catch (CoreException e) {
-      System.err.println("Exception occurred in PHPCore#create(IProject): " + e.toString());
+      System.err.println(
+        "Exception occurred in PHPCore#create(IProject): " + e.toString());
     }
 
     return null;
   }
 
-  public static void addPHPNature(IProject project, IProgressMonitor monitor) throws CoreException {
+  public static void addPHPNature(IProject project, IProgressMonitor monitor)
+    throws CoreException {
     if (!project.hasNature(PHPeclipsePlugin.PHP_NATURE_ID)) {
       IProjectDescription description = project.getDescription();
       String[] prevNatures = description.getNatureIds();
@@ -89,4 +749,184 @@ public class PHPCore {
       project.setDescription(description, monitor);
     }
   }
+
+  /**
+   * Returns the single instance of the PHP core plug-in runtime class.
+   * 
+   * @return the single instance of the PHP core plug-in runtime class
+   */
+  public static Plugin getPlugin() {
+    return PHPeclipsePlugin.getDefault();
+  }
+  
+/**
+   * Initializes the default preferences settings for this plug-in.
+   */
+  protected static void initializeDefaultPluginPreferences() {
+               
+    Preferences preferences = PHPeclipsePlugin.getDefault().getPluginPreferences();
+    HashSet optionNames = OptionNames;
+               
+//    // Compiler settings
+//    preferences.setDefault(COMPILER_LOCAL_VARIABLE_ATTR, GENERATE);
+//    optionNames.add(COMPILER_LOCAL_VARIABLE_ATTR);
+//
+//    preferences.setDefault(COMPILER_LINE_NUMBER_ATTR, GENERATE); 
+//    optionNames.add(COMPILER_LINE_NUMBER_ATTR);
+//
+//    preferences.setDefault(COMPILER_SOURCE_FILE_ATTR, GENERATE); 
+//    optionNames.add(COMPILER_SOURCE_FILE_ATTR);
+//
+//    preferences.setDefault(COMPILER_CODEGEN_UNUSED_LOCAL, PRESERVE); 
+//    optionNames.add(COMPILER_CODEGEN_UNUSED_LOCAL);
+//
+//    preferences.setDefault(COMPILER_CODEGEN_TARGET_PLATFORM, VERSION_1_1); 
+//    optionNames.add(COMPILER_CODEGEN_TARGET_PLATFORM);
+//
+//    preferences.setDefault(COMPILER_PB_UNREACHABLE_CODE, ERROR); 
+//    optionNames.add(COMPILER_PB_UNREACHABLE_CODE);
+//
+//    preferences.setDefault(COMPILER_PB_INVALID_IMPORT, ERROR); 
+//    optionNames.add(COMPILER_PB_INVALID_IMPORT);
+//
+//    preferences.setDefault(COMPILER_PB_OVERRIDING_PACKAGE_DEFAULT_METHOD, WARNING); 
+//    optionNames.add(COMPILER_PB_OVERRIDING_PACKAGE_DEFAULT_METHOD);
+//
+//    preferences.setDefault(COMPILER_PB_METHOD_WITH_CONSTRUCTOR_NAME, WARNING); 
+//    optionNames.add(COMPILER_PB_METHOD_WITH_CONSTRUCTOR_NAME);
+//
+//    preferences.setDefault(COMPILER_PB_DEPRECATION, WARNING);
+//    optionNames.add(COMPILER_PB_DEPRECATION);
+//
+//    preferences.setDefault(COMPILER_PB_DEPRECATION_IN_DEPRECATED_CODE, DISABLED);
+//    optionNames.add(COMPILER_PB_DEPRECATION_IN_DEPRECATED_CODE);
+//
+//    preferences.setDefault(COMPILER_PB_HIDDEN_CATCH_BLOCK, WARNING); 
+//    optionNames.add(COMPILER_PB_HIDDEN_CATCH_BLOCK);
+//
+//    preferences.setDefault(COMPILER_PB_UNUSED_LOCAL, IGNORE); 
+//    optionNames.add(COMPILER_PB_UNUSED_LOCAL);
+//
+//    preferences.setDefault(COMPILER_PB_UNUSED_PARAMETER, IGNORE); 
+//    optionNames.add(COMPILER_PB_UNUSED_PARAMETER);
+//
+//    preferences.setDefault(COMPILER_PB_UNUSED_IMPORT, WARNING); 
+//    optionNames.add(COMPILER_PB_UNUSED_IMPORT);
+//
+//    preferences.setDefault(COMPILER_PB_SYNTHETIC_ACCESS_EMULATION, IGNORE); 
+//    optionNames.add(COMPILER_PB_SYNTHETIC_ACCESS_EMULATION);
+//
+//    preferences.setDefault(COMPILER_PB_NON_NLS_STRING_LITERAL, IGNORE); 
+//    optionNames.add(COMPILER_PB_NON_NLS_STRING_LITERAL);
+//
+//    preferences.setDefault(COMPILER_PB_ASSERT_IDENTIFIER, IGNORE); 
+//    optionNames.add(COMPILER_PB_ASSERT_IDENTIFIER);
+//
+//    preferences.setDefault(COMPILER_PB_STATIC_ACCESS_RECEIVER, WARNING); 
+//    optionNames.add(COMPILER_PB_STATIC_ACCESS_RECEIVER);
+//
+//    preferences.setDefault(COMPILER_PB_NO_EFFECT_ASSIGNMENT, WARNING); 
+//    optionNames.add(COMPILER_PB_NO_EFFECT_ASSIGNMENT);
+//
+//    preferences.setDefault(COMPILER_TASK_TAGS, ""); //$NON-NLS-1$
+//    optionNames.add(COMPILER_TASK_TAGS);
+//
+//    preferences.setDefault(COMPILER_TASK_PRIORITIES, ""); //$NON-NLS-1$
+//    optionNames.add(COMPILER_TASK_PRIORITIES);
+//
+//    preferences.setDefault(COMPILER_SOURCE, VERSION_1_3);
+//    optionNames.add(COMPILER_SOURCE);
+//
+//    preferences.setDefault(COMPILER_COMPLIANCE, VERSION_1_3); 
+//    optionNames.add(COMPILER_COMPLIANCE);
+//
+//    preferences.setDefault(COMPILER_PB_MAX_PER_UNIT, "100"); //$NON-NLS-1$
+//    optionNames.add(COMPILER_PB_MAX_PER_UNIT);
+//             
+//    // Builder settings
+//    preferences.setDefault(CORE_JAVA_BUILD_RESOURCE_COPY_FILTER, ""); //$NON-NLS-1$
+//    optionNames.add(CORE_JAVA_BUILD_RESOURCE_COPY_FILTER);
+//
+//    preferences.setDefault(CORE_JAVA_BUILD_INVALID_CLASSPATH, ABORT); 
+//    optionNames.add(CORE_JAVA_BUILD_INVALID_CLASSPATH);
+//     
+//    preferences.setDefault(CORE_JAVA_BUILD_DUPLICATE_RESOURCE, WARNING); 
+//    optionNames.add(CORE_JAVA_BUILD_DUPLICATE_RESOURCE);
+//             
+//    preferences.setDefault(CORE_JAVA_BUILD_CLEAN_OUTPUT_FOLDER, CLEAN); 
+//    optionNames.add(CORE_JAVA_BUILD_CLEAN_OUTPUT_FOLDER);
+//
+//    // JavaCore settings
+//    preferences.setDefault(CORE_JAVA_BUILD_ORDER, IGNORE); 
+//    optionNames.add(CORE_JAVA_BUILD_ORDER);
+//     
+//    preferences.setDefault(CORE_CIRCULAR_CLASSPATH, ERROR); 
+//    optionNames.add(CORE_CIRCULAR_CLASSPATH);
+//             
+//    preferences.setDefault(CORE_INCOMPLETE_CLASSPATH, ERROR); 
+//    optionNames.add(CORE_INCOMPLETE_CLASSPATH);
+               
+    // encoding setting comes from resource plug-in
+    optionNames.add(CORE_ENCODING);
+               
+    // Formatter settings
+    preferences.setDefault(FORMATTER_NEWLINE_OPENING_BRACE, DO_NOT_INSERT); 
+    optionNames.add(FORMATTER_NEWLINE_OPENING_BRACE);
+
+    preferences.setDefault(FORMATTER_NEWLINE_CONTROL, DO_NOT_INSERT);
+    optionNames.add(FORMATTER_NEWLINE_CONTROL);
+
+    preferences.setDefault(FORMATTER_CLEAR_BLANK_LINES, PRESERVE_ONE); 
+    optionNames.add(FORMATTER_CLEAR_BLANK_LINES);
+
+    preferences.setDefault(FORMATTER_NEWLINE_ELSE_IF, DO_NOT_INSERT);
+    optionNames.add(FORMATTER_NEWLINE_ELSE_IF);
+
+    preferences.setDefault(FORMATTER_NEWLINE_EMPTY_BLOCK, INSERT); 
+    optionNames.add(FORMATTER_NEWLINE_EMPTY_BLOCK);
+
+    preferences.setDefault(FORMATTER_LINE_SPLIT, "80"); //$NON-NLS-1$
+    optionNames.add(FORMATTER_LINE_SPLIT);
+
+    preferences.setDefault(FORMATTER_COMPACT_ASSIGNMENT, NORMAL); 
+    optionNames.add(FORMATTER_COMPACT_ASSIGNMENT);
+
+    preferences.setDefault(FORMATTER_TAB_CHAR, TAB); 
+    optionNames.add(FORMATTER_TAB_CHAR);
+
+    preferences.setDefault(FORMATTER_TAB_SIZE, "4"); //$NON-NLS-1$ 
+    optionNames.add(FORMATTER_TAB_SIZE);
+               
+    // CodeAssist settings
+//    preferences.setDefault(CODEASSIST_VISIBILITY_CHECK, DISABLED); //$NON-NLS-1$
+//    optionNames.add(CODEASSIST_VISIBILITY_CHECK);
+//
+//    preferences.setDefault(CODEASSIST_IMPLICIT_QUALIFICATION, DISABLED); //$NON-NLS-1$
+//    optionNames.add(CODEASSIST_IMPLICIT_QUALIFICATION);
+//             
+//    preferences.setDefault(CODEASSIST_FIELD_PREFIXES, ""); //$NON-NLS-1$
+//    optionNames.add(CODEASSIST_FIELD_PREFIXES);
+//             
+//    preferences.setDefault(CODEASSIST_STATIC_FIELD_PREFIXES, ""); //$NON-NLS-1$
+//    optionNames.add(CODEASSIST_STATIC_FIELD_PREFIXES);
+//             
+//    preferences.setDefault(CODEASSIST_LOCAL_PREFIXES, ""); //$NON-NLS-1$
+//    optionNames.add(CODEASSIST_LOCAL_PREFIXES);
+//             
+//    preferences.setDefault(CODEASSIST_ARGUMENT_PREFIXES, ""); //$NON-NLS-1$
+//    optionNames.add(CODEASSIST_ARGUMENT_PREFIXES);
+//             
+//    preferences.setDefault(CODEASSIST_FIELD_SUFFIXES, ""); //$NON-NLS-1$
+//    optionNames.add(CODEASSIST_FIELD_SUFFIXES);
+//             
+//    preferences.setDefault(CODEASSIST_STATIC_FIELD_SUFFIXES, ""); //$NON-NLS-1$
+//    optionNames.add(CODEASSIST_STATIC_FIELD_SUFFIXES);
+//             
+//    preferences.setDefault(CODEASSIST_LOCAL_SUFFIXES, ""); //$NON-NLS-1$
+//    optionNames.add(CODEASSIST_LOCAL_SUFFIXES);
+//             
+//    preferences.setDefault(CODEASSIST_ARGUMENT_SUFFIXES, ""); //$NON-NLS-1$
+//    optionNames.add(CODEASSIST_ARGUMENT_SUFFIXES);
+               
+  }
 }
\ No newline at end of file