added first version of codetemplates (needs to fix some bugs)
authorjsurfer <jsurfer>
Thu, 23 Sep 2004 19:45:15 +0000 (19:45 +0000)
committerjsurfer <jsurfer>
Thu, 23 Sep 2004 19:45:15 +0000 (19:45 +0000)
17 files changed:
net.sourceforge.phpeclipse/plugin.xml
net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/builder/PHPBuilder.java
net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/corext/codemanipulation/CodeGenerationSettings.java [new file with mode: 0644]
net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/corext/codemanipulation/StubUtility.java
net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/corext/template/php/CodeTemplateContext.java
net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/PHPUIMessages.properties
net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/PHPUIStatus.java
net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/preferences/CodeTemplateBlock.java [new file with mode: 0644]
net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/preferences/CodeTemplatePreferencePage.java [new file with mode: 0644]
net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/spelling/SpellReconcileStrategy.java
net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/CodeGeneration.java [new file with mode: 0644]
net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/PreferenceConstants.java
net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/wizards/NewTypeWizardPage.java
net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/PHPeclipsePlugin.java
net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/wizards/PHPFileWizard.java
net.sourceforge.phpeclipse/templates/default-codetemplates.xml
net.sourceforge.phpeclipse/templates/default-templates.properties

index a767b83..b82edda 100644 (file)
             id="net.sourceforge.phpeclipse.preference.PHPEclipsePreferencePage">
       </page>
       <page
+            name="Code Templates"
+            category="net.sourceforge.phpeclipse.preference.PHPEclipsePreferencePage"
+            class="net.sourceforge.phpdt.internal.ui.preferences.CodeTemplatePreferencePage"
+            id="net.sourceforge.phpeclipse.preference.CodeTemplatePreferencePage">
+      </page>
+  <!--    <page
+            name="Members Sort Order"
+            category="net.sourceforge.phpeclipse.preference.PHPEclipsePreferencePage"
+            class="net.sourceforge.phpdt.internal.ui.preferences.MembersOrderPreferencePage"
+            id="net.sourceforge.phpeclipse.preference.MembersOrderPreferencePage">
+      </page> -->
+      <page
             name="PHP External Parser Command"
             category="net.sourceforge.phpeclipse.preference.PHPEclipsePreferencePage"
             class="net.sourceforge.phpeclipse.preferences.PHPEclipseParserPreferencePage"
             category="net.sourceforge.phpeclipse.preference.PHPEclipsePreferencePage"
             class="net.sourceforge.phpeclipse.PHPLanguagePreferencePage"
             id="net.sourceforge.phpeclipse.preference.PHPLanguagePreferencePage">
-      </page> 
+      </page> -->
       <page 
             name="%spellingPrefName"
             category= "net.sourceforge.phpeclipse.preference.PHPEclipsePreferencePage"
             class="net.sourceforge.phpdt.internal.ui.preferences.SpellingPreferencePage"
             id = "net.sourceforge.phpdt.internal.ui.preferences.SpellingPreferencePage">
-      </page>  -->
+      </page> 
    </extension>
    <extension
          point="org.eclipse.ui.editors.documentProviders">
                </provider>
        </extension>
        
-       <!-- =========================================================================== -->
+<!-- =========================================================================== -->
 <!-- Templates                                                                   -->
 <!-- =========================================================================== -->
    <extension
index b345248..6cd1981 100644 (file)
@@ -45,11 +45,12 @@ import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.OperationCanceledException;
+
 public class PHPBuilder extends IncrementalProjectBuilder {
   IProject currentProject;
   JavaProject javaProject;
   IWorkspaceRoot workspaceRoot;
-  NameEnvironment nameEnvironment;
+  NameEnvironment nameEnvironment; 
   SimpleLookupTable binaryLocationsPerProject; // maps a project to its binary
   // resources (output folders,
   // class folders, zip/jar files)
@@ -688,10 +689,10 @@ public class PHPBuilder extends IncrementalProjectBuilder {
     JavaModelManager.getJavaModelManager().setLastBuiltState(currentProject,
         state);
   }
-  /**
-   * String representation for debugging purposes
-   */
-  public String toString() {
+  /** 
+   * String representation for debugging purposes 
+   */ 
+  public String toString() { 
     return currentProject == null ? "JavaBuilder for unknown project" //$NON-NLS-1$
         : "JavaBuilder for " + currentProject.getName(); //$NON-NLS-1$
   }
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/corext/codemanipulation/CodeGenerationSettings.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/corext/codemanipulation/CodeGenerationSettings.java
new file mode 100644 (file)
index 0000000..2e8bf98
--- /dev/null
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation 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 API and implementation
+ *******************************************************************************/
+package net.sourceforge.phpdt.internal.corext.codemanipulation;
+
+public class CodeGenerationSettings {
+       
+       /**
+        * @deprecated
+        */
+       public boolean createFileComments= true;
+
+       public boolean createComments= true;
+       
+       public boolean useKeywordThis= false;
+       
+       /**
+        * @deprecated
+        */
+       public boolean createNonJavadocComments= true;
+       
+       public String[] importOrder= new String[0];
+       public int importThreshold= 99;
+               
+       public int tabWidth;
+       
+       public void setSettings(CodeGenerationSettings settings) {
+               settings.createComments= createComments;
+               settings.useKeywordThis= useKeywordThis;
+               settings.importOrder= importOrder;
+               settings.importThreshold= importThreshold;
+               settings.tabWidth= tabWidth;
+       }
+       
+
+}
+
index ca646ed..8c4c7e0 100644 (file)
  */
 package net.sourceforge.phpdt.internal.corext.codemanipulation;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+import java.util.StringTokenizer;
+import java.util.jar.Attributes.Name;
+
+import net.sourceforge.phpdt.core.Flags;
+import net.sourceforge.phpdt.core.IBuffer;
 import net.sourceforge.phpdt.core.ICodeFormatter;
+import net.sourceforge.phpdt.core.ICompilationUnit;
+import net.sourceforge.phpdt.core.IJavaElement;
 import net.sourceforge.phpdt.core.IJavaProject;
+import net.sourceforge.phpdt.core.IMethod;
+import net.sourceforge.phpdt.core.IPackageFragment;
+import net.sourceforge.phpdt.core.IType;
 import net.sourceforge.phpdt.core.JavaCore;
+import net.sourceforge.phpdt.core.JavaModelException;
+import net.sourceforge.phpdt.core.Signature;
 import net.sourceforge.phpdt.core.ToolFactory;
+import net.sourceforge.phpdt.internal.corext.template.php.CodeTemplateContext;
+import net.sourceforge.phpdt.internal.corext.template.php.CodeTemplateContextType;
+import net.sourceforge.phpdt.internal.corext.util.JavaModelUtil;
+import net.sourceforge.phpdt.internal.corext.util.Strings;
+import net.sourceforge.phpdt.internal.ui.PHPUIStatus;
+import net.sourceforge.phpeclipse.PHPeclipsePlugin;
 
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
 import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.Document;
 import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.templates.Template;
+import org.eclipse.jface.text.templates.TemplateBuffer;
+import org.eclipse.jface.text.templates.TemplateException;
+import org.eclipse.jface.text.templates.TemplateVariable;
+import org.eclipse.swt.SWT;
 
 public class StubUtility {
        
        
-//     public static class GenStubSettings extends CodeGenerationSettings {
-//     
-//             public boolean callSuper;
-//             public boolean methodOverwrites;
-//             public boolean noBody;
-//             
-//             public GenStubSettings(CodeGenerationSettings settings) {
-//                     settings.setSettings(this);     
-//             }
-//             
-//             public GenStubSettings() {
-//             }
-//                     
-//     }
-//     
-//
-//     /**
-//      * Generates a stub. Given a template method, a stub with the same signature
-//      * will be constructed so it can be added to a type.
-//      * @param destTypeName The name of the type to which the method will be added to (Used for the constructor)
-//      * @param method A method template (method belongs to different type than the parent)
-//      * @param options Options as defined above (<code>GenStubSettings</code>)
-//      * @param imports Imports required by the stub are added to the imports structure. If imports structure is <code>null</code>
-//      * all type names are qualified.
-//      * @throws JavaModelException
-//      */
-//     public static String genStub(String destTypeName, IMethod method, GenStubSettings settings, IImportsStructure imports) throws JavaModelException {
-//             IType declaringtype= method.getDeclaringType(); 
-//             StringBuffer buf= new StringBuffer();
-//             String methodName= method.getElementName();
-//             String[] paramTypes= method.getParameterTypes();
-//             String[] paramNames= method.getParameterNames();
-//             String[] excTypes= method.getExceptionTypes();
-//             String retTypeSig= method.getReturnType();
-//             int flags= method.getFlags();
-//             boolean isConstructor= method.isConstructor();
-//             
-//             int lastParam= paramTypes.length -1;            
-//             
-//             
-//             if (settings.createComments) {
-//                     if (isConstructor) {
-//                             String desc= "Constructor for " + destTypeName; //$NON-NLS-1$
-//                             genJavaDocStub(desc, paramNames, Signature.SIG_VOID, excTypes, buf);
-//                     } else {                        
-//                             // php doc
-//                             if (settings.methodOverwrites) {
-//                                     boolean isDeprecated= Flags.isDeprecated(flags);
-//                                     genJavaDocSeeTag(declaringtype, methodName, paramTypes, settings.createNonJavadocComments, isDeprecated, buf);
-//                             } else {
-//                                     // generate a default php doc comment
-//                                     String desc= "Method " + methodName; //$NON-NLS-1$
-//                                     genJavaDocStub(desc, paramNames, retTypeSig, excTypes, buf);
-//                             }
+       public static class GenStubSettings extends CodeGenerationSettings {
+               
+                       public boolean callSuper;
+                       public boolean methodOverwrites;
+                       public boolean noBody;
+                       public int methodModifiers;
+                       
+                       public GenStubSettings(CodeGenerationSettings settings) {
+                               settings.setSettings(this);
+                               methodModifiers= -1;    
+                       }
+                       
+               }
+                       
+               private static final String[] EMPTY= new String[0];
+               
+               /**
+                * Generates a method stub including the method comment. Given a template
+                * method, a stub with the same signature will be constructed so it can be
+                * added to a type. The method body will be empty or contain a return or
+                * super call.
+                * @param destTypeName The name of the type to which the method will be
+                * added to
+                * @param method A method template (method belongs to different type than the parent)
+                * @param definingType The type that defines the method.
+                * @param settings Options as defined above (<code>GenStubSettings</code>)
+                * @param imports Imports required by the stub are added to the imports structure. If imports structure is <code>null</code>
+                * all type names are qualified.
+                * @throws JavaModelException
+                */
+               public static String genStub(ICompilationUnit cu, String destTypeName, IMethod method, IType definingType, GenStubSettings settings) throws CoreException { 
+                 //IImportsStructure imports) throws CoreException {
+                       String methName= method.getElementName();
+                       String[] paramNames= suggestArgumentNames(method.getJavaProject(), method.getParameterNames());
+                       String returnType= method.isConstructor() ? null : method.getReturnType();
+                       String lineDelimiter= String.valueOf('\n'); // reformatting required
+                       
+                       
+                       StringBuffer buf= new StringBuffer();
+                       // add method comment
+                       if (settings.createComments && cu != null) {
+                               IMethod overridden= null;
+                               if (settings.methodOverwrites && returnType != null) {
+                                       overridden= JavaModelUtil.findMethod(methName, method.getParameterTypes(), false, definingType.getMethods());
+                               }
+                               String comment= getMethodComment(cu, destTypeName, methName, paramNames, method.getExceptionTypes(), returnType, overridden, lineDelimiter);
+                               if (comment != null) {
+                                       buf.append(comment);
+                               } else {
+                                       buf.append("/**").append(lineDelimiter); //$NON-NLS-1$
+                                       buf.append(" *").append(lineDelimiter); //$NON-NLS-1$
+                                       buf.append(" */").append(lineDelimiter); //$NON-NLS-1$                                                  
+                               }
+                               buf.append(lineDelimiter);
+                       }
+                       // add method declaration
+                       String bodyContent= null;
+                       if (!settings.noBody) {
+                               String bodyStatement= getDefaultMethodBodyStatement(methName, paramNames, returnType, settings.callSuper);
+                               bodyContent= getMethodBodyContent(returnType == null, method.getJavaProject(), destTypeName, methName, bodyStatement, lineDelimiter);
+                               if (bodyContent == null) {
+                                       bodyContent= ""; //$NON-NLS-1$
+                               }
+                       }
+                       int flags= settings.methodModifiers;
+                       if (flags == -1) {
+                               flags= method.getFlags();
+                       }
+                       
+                       genMethodDeclaration(destTypeName, method, flags, bodyContent, buf); // imports, buf);
+                       return buf.toString();
+               }
+
+               /**
+                * Generates a method stub not including the method comment. Given a
+                * template method and the body content, a stub with the same signature will
+                * be constructed so it can be added to a type.
+                * @param destTypeName The name of the type to which the method will be
+                * added to
+                * @param method A method template (method belongs to different type than the parent)
+                * @param bodyContent Content of the body
+                * @param imports Imports required by the stub are added to the imports
+                * structure. If imports structure is <code>null</code> all type names are
+                * qualified.
+                * @param buf The buffer to append the gerenated code.
+                * @throws JavaModelException
+                */
+               public static void genMethodDeclaration(String destTypeName, IMethod method, String bodyContent, StringBuffer buf) throws CoreException { // IImportsStructure imports, StringBuffer buf) throws CoreException {
+                       genMethodDeclaration(destTypeName, method, method.getFlags(), bodyContent, buf);
+               }
+               
+               /**
+                * Generates a method stub not including the method comment. Given a
+                * template method and the body content, a stub with the same signature will
+                * be constructed so it can be added to a type.
+                * @param destTypeName The name of the type to which the method will be
+                * added to
+                * @param method A method template (method belongs to different type than the parent)
+                * @param bodyContent Content of the body
+                * @param imports Imports required by the stub are added to the imports
+                * structure. If imports structure is <code>null</code> all type names are
+                * qualified.
+                * @param buf The buffer to append the gerenated code.
+                * @throws JavaModelException
+                */
+               public static void genMethodDeclaration(String destTypeName, IMethod method, int flags, String bodyContent, StringBuffer buf) throws CoreException {
+                 //IImportsStructure imports, StringBuffer buf) throws CoreException {
+                       IType parentType= method.getDeclaringType();    
+                       String methodName= method.getElementName();
+                       String[] paramTypes= method.getParameterTypes();
+                       String[] paramNames= suggestArgumentNames(parentType.getJavaProject(), method.getParameterNames());
+
+                       String[] excTypes= method.getExceptionTypes();
+
+                       boolean isConstructor= method.isConstructor();
+                       String retTypeSig= isConstructor ? null : method.getReturnType();
+                       
+                       int lastParam= paramTypes.length -1;
+                       
+                       if (Flags.isPublic(flags) || (parentType.isInterface() && bodyContent != null)) {
+                               buf.append("public "); //$NON-NLS-1$
+                       } else if (Flags.isProtected(flags)) {
+                               buf.append("protected "); //$NON-NLS-1$
+                       } else if (Flags.isPrivate(flags)) {
+                               buf.append("private "); //$NON-NLS-1$
+                       }
+//                     if (Flags.isSynchronized(flags)) {
+//                             buf.append("synchronized "); //$NON-NLS-1$
+//                     }               
+//                     if (Flags.isVolatile(flags)) {
+//                             buf.append("volatile "); //$NON-NLS-1$
 //                     }
-//                     buf.append('\n');
-//             }
-//             
-//             if (Flags.isPublic(flags) || isConstructor || (declaringtype.isInterface() && !settings.noBody)) {
-//                     buf.append("public "); //$NON-NLS-1$
-//             } else if (Flags.isProtected(flags)) {
-//                     buf.append("protected "); //$NON-NLS-1$
-//             } else if (Flags.isPrivate(flags)) {
-//                     buf.append("private "); //$NON-NLS-1$
-//             }
-//             if (Flags.isSynchronized(flags)) {
-//                     buf.append("synchronized "); //$NON-NLS-1$
-//             }               
-//             if (Flags.isVolatile(flags)) {
-//                     buf.append("volatile "); //$NON-NLS-1$
-//             }
-//             if (Flags.isStrictfp(flags)) {
-//                     buf.append("strictfp "); //$NON-NLS-1$
+//                     if (Flags.isStrictfp(flags)) {
+//                             buf.append("strictfp "); //$NON-NLS-1$
+//                     }
+                       if (Flags.isStatic(flags)) {
+                               buf.append("static "); //$NON-NLS-1$
+                       }               
+                               
+                       if (isConstructor) {
+                               buf.append(destTypeName);
+                       } else {
+                               String retTypeFrm;
+                               if (!isPrimitiveType(retTypeSig)) {
+                                       retTypeFrm= resolveAndAdd(retTypeSig, parentType);
+                               } else {
+                                       retTypeFrm= Signature.toString(retTypeSig);
+                               }
+                               buf.append(retTypeFrm);
+                               buf.append(' ');
+                               buf.append(methodName);
+                       }
+                       buf.append('(');
+                       for (int i= 0; i <= lastParam; i++) {
+                               String paramTypeSig= paramTypes[i];
+                               String paramTypeFrm;
+                               
+                               if (!isPrimitiveType(paramTypeSig)) {
+                                       paramTypeFrm= resolveAndAdd(paramTypeSig, parentType);
+                               } else {
+                                       paramTypeFrm= Signature.toString(paramTypeSig);
+                               }
+                               buf.append(paramTypeFrm);
+                               buf.append(' ');
+                               buf.append(paramNames[i]);
+                               if (i < lastParam) {
+                                       buf.append(", "); //$NON-NLS-1$
+                               }
+                       }
+                       buf.append(')');
+                       
+                       int lastExc= excTypes.length - 1;
+                       if (lastExc >= 0) {
+                               buf.append(" throws "); //$NON-NLS-1$
+                               for (int i= 0; i <= lastExc; i++) {
+                                       String excTypeSig= excTypes[i];
+                                       String excTypeFrm= resolveAndAdd(excTypeSig, parentType);
+                                       buf.append(excTypeFrm);
+                                       if (i < lastExc) {
+                                               buf.append(", "); //$NON-NLS-1$
+                                       }
+                               }
+                       }
+                       if (bodyContent == null) {
+                               buf.append(";\n\n"); //$NON-NLS-1$
+                       } else {
+                               buf.append(" {\n\t"); //$NON-NLS-1$
+                               if ((bodyContent != null) && (bodyContent.length() > 0)) {
+                                       buf.append(bodyContent);
+                                       buf.append('\n');
+                               }
+                               buf.append("}\n");                       //$NON-NLS-1$
+                       }
+               }
+               
+               public static String getDefaultMethodBodyStatement(String methodName, String[] paramNames, String retTypeSig, boolean callSuper) {
+                       StringBuffer buf= new StringBuffer();
+                       if (callSuper) {
+                               if (retTypeSig != null) {
+                                       if (!Signature.SIG_VOID.equals(retTypeSig)) {
+                                               buf.append("return "); //$NON-NLS-1$
+                                       }
+                                       buf.append("super."); //$NON-NLS-1$
+                                       buf.append(methodName);
+                               } else {
+                                       buf.append("super"); //$NON-NLS-1$
+                               }
+                               buf.append('(');                        
+                               for (int i= 0; i < paramNames.length; i++) {
+                                       if (i > 0) {
+                                               buf.append(", "); //$NON-NLS-1$
+                                       }
+                                       buf.append(paramNames[i]);
+                               }
+                               buf.append(");"); //$NON-NLS-1$
+                       } else {
+                               if (retTypeSig != null && !retTypeSig.equals(Signature.SIG_VOID)) {
+                                       if (!isPrimitiveType(retTypeSig) || Signature.getArrayCount(retTypeSig) > 0) {
+                                               buf.append("return null;"); //$NON-NLS-1$
+                                       } else if (retTypeSig.equals(Signature.SIG_BOOLEAN)) {
+                                               buf.append("return false;"); //$NON-NLS-1$
+                                       } else {
+                                               buf.append("return 0;"); //$NON-NLS-1$
+                                       }
+                               }                       
+                       }
+                       return buf.toString();
+               }       
+
+               public static String getMethodBodyContent(boolean isConstructor, IJavaProject project, String destTypeName, String methodName, String bodyStatement, String lineDelimiter) throws CoreException {
+                       String templateName= isConstructor ? CodeTemplateContextType.CONSTRUCTORSTUB : CodeTemplateContextType.METHODSTUB;
+                       Template template= PHPeclipsePlugin.getDefault().getCodeTemplateStore().findTemplate(templateName);
+                       if (template == null) {
+                               return bodyStatement;
+                       }
+                       CodeTemplateContext context= new CodeTemplateContext(template.getContextTypeId(), project, lineDelimiter);
+                       context.setVariable(CodeTemplateContextType.ENCLOSING_METHOD, methodName);
+                       context.setVariable(CodeTemplateContextType.ENCLOSING_TYPE, destTypeName);
+                       context.setVariable(CodeTemplateContextType.BODY_STATEMENT, bodyStatement);
+                       String str= evaluateTemplate(context, template);
+                       if (str == null && !Strings.containsOnlyWhitespaces(bodyStatement)) {
+                               return bodyStatement;
+                       }
+                       return str;
+               }
+               
+               public static String getGetterMethodBodyContent(IJavaProject project, String destTypeName, String methodName, String fieldName, String lineDelimiter) throws CoreException {
+                       String templateName= CodeTemplateContextType.GETTERSTUB;
+                       Template template= PHPeclipsePlugin.getDefault().getCodeTemplateStore().findTemplate(templateName);
+                       if (template == null) {
+                               return null;
+                       }
+                       CodeTemplateContext context= new CodeTemplateContext(template.getContextTypeId(), project, lineDelimiter);
+                       context.setVariable(CodeTemplateContextType.ENCLOSING_METHOD, methodName);
+                       context.setVariable(CodeTemplateContextType.ENCLOSING_TYPE, destTypeName);
+                       context.setVariable(CodeTemplateContextType.FIELD, fieldName);
+                       
+                       return evaluateTemplate(context, template);
+               }
+               
+               public static String getSetterMethodBodyContent(IJavaProject project, String destTypeName, String methodName, String fieldName, String paramName, String lineDelimiter) throws CoreException {
+                       String templateName= CodeTemplateContextType.SETTERSTUB;
+                       Template template= PHPeclipsePlugin.getDefault().getCodeTemplateStore().findTemplate(templateName);
+                       if (template == null) {
+                               return null;
+                       }
+                       CodeTemplateContext context= new CodeTemplateContext(template.getContextTypeId(), project, lineDelimiter);
+                       context.setVariable(CodeTemplateContextType.ENCLOSING_METHOD, methodName);
+                       context.setVariable(CodeTemplateContextType.ENCLOSING_TYPE, destTypeName);
+                       context.setVariable(CodeTemplateContextType.FIELD, fieldName);
+                       context.setVariable(CodeTemplateContextType.FIELD_TYPE, fieldName);
+                       context.setVariable(CodeTemplateContextType.PARAM, paramName);
+                       
+                       return evaluateTemplate(context, template);
+               }
+               
+               public static String getCatchBodyContent(ICompilationUnit cu, String exceptionType, String variableName, String lineDelimiter) throws CoreException {
+                       Template template= PHPeclipsePlugin.getDefault().getCodeTemplateStore().findTemplate(CodeTemplateContextType.CATCHBLOCK);
+                       if (template == null) {
+                               return null;
+                       }
+
+                       CodeTemplateContext context= new CodeTemplateContext(template.getContextTypeId(), cu.getJavaProject(), lineDelimiter);
+                       context.setVariable(CodeTemplateContextType.EXCEPTION_TYPE, exceptionType);
+                       context.setVariable(CodeTemplateContextType.EXCEPTION_VAR, variableName); //$NON-NLS-1$
+                       return evaluateTemplate(context, template);
+               }               
+               
+               /**
+                * @see org.eclipse.jdt.ui.CodeGeneration#getTypeComment(ICompilationUnit, String, String)
+                */     
+               public static String getCompilationUnitContent(ICompilationUnit cu, String typeComment, String typeContent, String lineDelimiter) throws CoreException {
+                       IPackageFragment pack= (IPackageFragment) cu.getParent();
+                       String packDecl= pack.isDefaultPackage() ? "" : "package " + pack.getElementName() + ';'; //$NON-NLS-1$ //$NON-NLS-2$
+
+                       Template template= PHPeclipsePlugin.getDefault().getCodeTemplateStore().findTemplate(CodeTemplateContextType.NEWTYPE);
+                       if (template == null) {
+                               return null;
+                       }
+                       
+                       IJavaProject project= cu.getJavaProject();
+                       CodeTemplateContext context= new CodeTemplateContext(template.getContextTypeId(), project, lineDelimiter);
+                       context.setCompilationUnitVariables(cu);
+                       context.setVariable(CodeTemplateContextType.PACKAGE_DECLARATION, packDecl);
+                       context.setVariable(CodeTemplateContextType.TYPE_COMMENT, typeComment != null ? typeComment : ""); //$NON-NLS-1$
+                       context.setVariable(CodeTemplateContextType.TYPE_DECLARATION, typeContent);
+                       context.setVariable(CodeTemplateContextType.TYPENAME, Signature.getQualifier(cu.getElementName()));
+                       return evaluateTemplate(context, template);
+               }               
+
+               /*
+                * @see org.eclipse.jdt.ui.CodeGeneration#getTypeComment(ICompilationUnit, String, String)
+                */             
+               public static String getTypeComment(ICompilationUnit cu, String typeQualifiedName, String lineDelim) throws CoreException {
+                       Template template= PHPeclipsePlugin.getDefault().getCodeTemplateStore().findTemplate(CodeTemplateContextType.TYPECOMMENT);
+                       if (template == null) {
+                               return null;
+                       }
+                       CodeTemplateContext context= new CodeTemplateContext(template.getContextTypeId(), cu.getJavaProject(), lineDelim);
+                       context.setCompilationUnitVariables(cu);
+                       context.setVariable(CodeTemplateContextType.ENCLOSING_TYPE, Signature.getQualifier(typeQualifiedName));
+                       context.setVariable(CodeTemplateContextType.TYPENAME, Signature.getSimpleName(typeQualifiedName));
+                       return evaluateTemplate(context, template);
+               }
+
+//             private static String[] getParameterTypesQualifiedNames(IMethodBinding binding) {
+//                     ITypeBinding[] typeBindings= binding.getParameterTypes();
+//                     String[] result= new String[typeBindings.length];
+//                     for (int i= 0; i < result.length; i++) {
+//                             result[i]= typeBindings[i].getQualifiedName();
+//                     }
+//                     return result;
 //             }
-//             if (Flags.isStatic(flags)) {
-//                     buf.append("static "); //$NON-NLS-1$
-//             }               
-//                     
-//             if (isConstructor) {
-//                     buf.append(destTypeName);
-//             } else {
-//                     String retTypeFrm;
-//                     if (!isPrimitiveType(retTypeSig)) {
-//                             retTypeFrm= resolveAndAdd(retTypeSig, declaringtype, imports);
+
+               private static String getSeeTag(String declaringClassQualifiedName, String methodName, String[] parameterTypesQualifiedNames) {
+                       StringBuffer buf= new StringBuffer();
+                       buf.append("@see "); //$NON-NLS-1$
+                       buf.append(declaringClassQualifiedName);
+                       buf.append('#'); 
+                       buf.append(methodName);
+                       buf.append('(');
+                       for (int i= 0; i < parameterTypesQualifiedNames.length; i++) {
+                               if (i > 0) {
+                                       buf.append(", "); //$NON-NLS-1$
+                               }
+                               buf.append(parameterTypesQualifiedNames[i]);
+                       }
+                       buf.append(')');
+                       return buf.toString();
+               }
+               
+               private static String getSeeTag(IMethod overridden) throws JavaModelException {
+                       IType declaringType= overridden.getDeclaringType();
+                       StringBuffer buf= new StringBuffer();
+                       buf.append("@see "); //$NON-NLS-1$
+                       buf.append(declaringType.getFullyQualifiedName('.'));
+                       buf.append('#'); 
+                       buf.append(overridden.getElementName());
+                       buf.append('(');
+                       String[] paramTypes= overridden.getParameterTypes();
+                       for (int i= 0; i < paramTypes.length; i++) {
+                               if (i > 0) {
+                                       buf.append(", "); //$NON-NLS-1$
+                               }
+                               String curr= paramTypes[i];
+                               buf.append(JavaModelUtil.getResolvedTypeName(curr, declaringType));
+                               int arrayCount= Signature.getArrayCount(curr);
+                               while (arrayCount > 0) {
+                                       buf.append("[]"); //$NON-NLS-1$
+                                       arrayCount--;
+                               }
+                       }
+                       buf.append(')');
+                       return buf.toString();
+               }
+               
+               /**
+                * @see org.eclipse.jdt.ui.CodeGeneration#getMethodComment(IMethod,IMethod,String)
+                */
+               public static String getMethodComment(IMethod method, IMethod overridden, String lineDelimiter) throws CoreException {
+                       String retType= method.isConstructor() ? null : method.getReturnType();
+                       String[] paramNames= method.getParameterNames();
+                       
+                       return getMethodComment(method.getCompilationUnit(), method.getDeclaringType().getElementName(),
+                               method.getElementName(), paramNames, method.getExceptionTypes(), retType, overridden, lineDelimiter);
+               }
+
+               /**
+                * @see org.eclipse.jdt.ui.CodeGeneration#getMethodComment(ICompilationUnit, String, String, String[], String[], String, IMethod, String)
+                */
+               public static String getMethodComment(ICompilationUnit cu, String typeName, String methodName, String[] paramNames, String[] excTypeSig, String retTypeSig, IMethod overridden, String lineDelimiter) throws CoreException {
+                       String templateName= CodeTemplateContextType.METHODCOMMENT;
+                       if (retTypeSig == null) {
+                               templateName= CodeTemplateContextType.CONSTRUCTORCOMMENT;
+                       } else if (overridden != null) {
+                               templateName= CodeTemplateContextType.OVERRIDECOMMENT;
+                       }
+                       Template template= PHPeclipsePlugin.getDefault().getCodeTemplateStore().findTemplate(templateName);
+                       if (template == null) {
+                               return null;
+                       }               
+                       CodeTemplateContext context= new CodeTemplateContext(template.getContextTypeId(), cu.getJavaProject(), lineDelimiter);
+                       context.setCompilationUnitVariables(cu);
+                       context.setVariable(CodeTemplateContextType.ENCLOSING_TYPE, typeName);
+                       context.setVariable(CodeTemplateContextType.ENCLOSING_METHOD, methodName);
+                                       
+                       if (retTypeSig != null) {
+                               context.setVariable(CodeTemplateContextType.RETURN_TYPE, Signature.toString(retTypeSig));
+                       }
+                       if (overridden != null) {
+                               context.setVariable(CodeTemplateContextType.SEE_TAG, getSeeTag(overridden));
+                       }
+                       TemplateBuffer buffer;
+                       try {
+                               buffer= context.evaluate(template);
+                       } catch (BadLocationException e) {
+                               throw new CoreException(Status.CANCEL_STATUS);
+                       } catch (TemplateException e) {
+                               throw new CoreException(Status.CANCEL_STATUS);
+                       }
+                       if (buffer == null) {
+                               return null;
+                       }
+                       
+                       String str= buffer.getString();
+                       if (Strings.containsOnlyWhitespaces(str)) {
+                               return null;
+                       }
+                       TemplateVariable position= findTagVariable(buffer); // look if Javadoc tags have to be added
+                       if (position == null) {
+                               return str;
+                       }
+                               
+                       IDocument textBuffer= new Document(str);
+                       String[] exceptionNames= new String[excTypeSig.length];
+                       for (int i= 0; i < excTypeSig.length; i++) {
+                               exceptionNames[i]= Signature.toString(excTypeSig[i]);
+                       }
+                       String returnType= retTypeSig != null ? Signature.toString(retTypeSig) : null;
+                       int[] tagOffsets= position.getOffsets();
+                       for (int i= tagOffsets.length - 1; i >= 0; i--) { // from last to first
+                               try {
+                                       insertTag(textBuffer, tagOffsets[i], position.getLength(), paramNames, exceptionNames, returnType, false, lineDelimiter);
+                               } catch (BadLocationException e) {
+                                       throw new CoreException(PHPUIStatus.createError(IStatus.ERROR, e));
+                               }
+                       }
+                       return textBuffer.get();
+               }
+
+               public static String getFieldComment(ICompilationUnit cu, String typeName, String fieldName, String lineDelimiter) throws CoreException {
+                       Template template= PHPeclipsePlugin.getDefault().getCodeTemplateStore().findTemplate(CodeTemplateContextType.FIELDCOMMENT);
+                       if (template == null) {
+                               return null;
+                       }
+                       CodeTemplateContext context= new CodeTemplateContext(template.getContextTypeId(), cu.getJavaProject(), lineDelimiter);
+                       context.setCompilationUnitVariables(cu);
+                       context.setVariable(CodeTemplateContextType.FIELD_TYPE, typeName);
+                       context.setVariable(CodeTemplateContextType.FIELD, fieldName);
+                       
+                       return evaluateTemplate(context, template);
+               }       
+               
+               
+               /**
+                * @see org.eclipse.jdt.ui.CodeGeneration#getSetterComment(ICompilationUnit, String, String, String, String, String, String, String)
+                */
+               public static String getSetterComment(ICompilationUnit cu, String typeName, String methodName, String fieldName, String fieldType, String paramName, String bareFieldName, String lineDelimiter) throws CoreException {
+                       String templateName= CodeTemplateContextType.SETTERCOMMENT;
+                       Template template= PHPeclipsePlugin.getDefault().getCodeTemplateStore().findTemplate(templateName);
+                       if (template == null) {
+                               return null;
+                       }
+                       
+                       CodeTemplateContext context= new CodeTemplateContext(template.getContextTypeId(), cu.getJavaProject(), lineDelimiter);
+                       context.setCompilationUnitVariables(cu);
+                       context.setVariable(CodeTemplateContextType.ENCLOSING_TYPE, typeName);
+                       context.setVariable(CodeTemplateContextType.ENCLOSING_METHOD, methodName);
+                       context.setVariable(CodeTemplateContextType.FIELD, fieldName);
+                       context.setVariable(CodeTemplateContextType.FIELD_TYPE, fieldType);
+                       context.setVariable(CodeTemplateContextType.BARE_FIELD_NAME, bareFieldName);
+                       context.setVariable(CodeTemplateContextType.PARAM, paramName);
+
+                       return evaluateTemplate(context, template);
+               }       
+               
+               /**
+                * @see org.eclipse.jdt.ui.CodeGeneration#getGetterComment(ICompilationUnit, String, String, String, String, String, String)
+                */
+               public static String getGetterComment(ICompilationUnit cu, String typeName, String methodName, String fieldName, String fieldType, String bareFieldName, String lineDelimiter) throws CoreException {
+                       String templateName= CodeTemplateContextType.GETTERCOMMENT;
+                       Template template= PHPeclipsePlugin.getDefault().getCodeTemplateStore().findTemplate(templateName);
+                       if (template == null) {
+                               return null;
+                       }               
+                       CodeTemplateContext context= new CodeTemplateContext(template.getContextTypeId(), cu.getJavaProject(), lineDelimiter);
+                       context.setCompilationUnitVariables(cu);
+                       context.setVariable(CodeTemplateContextType.ENCLOSING_TYPE, typeName);
+                       context.setVariable(CodeTemplateContextType.ENCLOSING_METHOD, methodName);
+                       context.setVariable(CodeTemplateContextType.FIELD, fieldName);
+                       context.setVariable(CodeTemplateContextType.FIELD_TYPE, fieldType);
+                       context.setVariable(CodeTemplateContextType.BARE_FIELD_NAME, bareFieldName);
+
+                       return evaluateTemplate(context, template);
+               }
+               
+               public static String evaluateTemplate(CodeTemplateContext context, Template template) throws CoreException {
+                       TemplateBuffer buffer;
+                       try {
+                               buffer= context.evaluate(template);
+                       } catch (BadLocationException e) {
+                               throw new CoreException(Status.CANCEL_STATUS);
+                       } catch (TemplateException e) {
+                               throw new CoreException(Status.CANCEL_STATUS);
+                       }
+                       if (buffer == null)
+                               return null;
+                       String str= buffer.getString();
+                       if (Strings.containsOnlyWhitespaces(str)) {
+                               return null;
+                       }
+                       return str;
+               }
+
+               /**
+                * @see org.eclipse.jdt.ui.CodeGeneration#getMethodComment(ICompilationUnit, String, MethodDeclaration, IMethodBinding, String)
+                */
+//             public static String getMethodComment(ICompilationUnit cu, String typeName, IMethodBinding overridden, String lineDelimiter) throws CoreException {
+//                     if (overridden != null) {
+//                             String declaringClassQualifiedName= overridden.getDeclaringClass().getQualifiedName();
+//                             String[] parameterTypesQualifiedNames= getParameterTypesQualifiedNames(overridden);                     
+//                             return getMethodComment(cu, typeName, decl, true, overridden.isDeprecated(), declaringClassQualifiedName, parameterTypesQualifiedNames, lineDelimiter);
 //                     } else {
-//                             retTypeFrm= Signature.toString(retTypeSig);
+//                             return getMethodComment(cu, typeName, decl, false, false, null, null, lineDelimiter);
 //                     }
-//                     buf.append(retTypeFrm);
-//                     buf.append(' ');
-//                     buf.append(methodName);
 //             }
-//             buf.append('(');
-//             for (int i= 0; i <= lastParam; i++) {
-//                     String paramTypeSig= paramTypes[i];
-//                     String paramTypeFrm;
+               
+               /**
+                * Returns the comment for a method using the comment code templates.
+                * <code>null</code> is returned if the template is empty.
+                * @param cu The compilation unit to which the method belongs
+                * @param typeName Name of the type to which the method belongs.
+                * @param decl The AST MethodDeclaration node that will be added as new
+                * method.
+                * @param isOverridden <code>true</code> iff decl overrides another method
+                * @param isDeprecated <code>true</code> iff the method that decl overrides is deprecated.
+                * Note: it must not be <code>true</code> if isOverridden is <code>false</code>.
+                * @param declaringClassQualifiedName Fully qualified name of the type in which the overriddden 
+                * method (if any exists) in declared. If isOverridden is <code>false</code>, this is ignored.
+                * @param parameterTypesQualifiedNames Fully qualified names of parameter types of the type in which the overriddden 
+                * method (if any exists) in declared. If isOverridden is <code>false</code>, this is ignored.
+                * @return String Returns the method comment or <code>null</code> if the
+                * configured template is empty. 
+                * (formatting required)
+                * @throws CoreException
+                */
+//             public static String getMethodComment(ICompilationUnit cu, String typeName, MethodDeclaration decl, boolean isOverridden, boolean isDeprecated, String declaringClassQualifiedName, String[] parameterTypesQualifiedNames, String lineDelimiter) throws CoreException {
+//                     String templateName= CodeTemplateContextType.METHODCOMMENT;
+//                     if (decl.isConstructor()) {
+//                             templateName= CodeTemplateContextType.CONSTRUCTORCOMMENT;
+//                     } else if (isOverridden) {
+//                             templateName= CodeTemplateContextType.OVERRIDECOMMENT;
+//                     }
+//                     Template template= PHPeclipsePlugin.getDefault().getCodeTemplateStore().findTemplate(templateName);
+//                     if (template == null) {
+//                             return null;
+//                     }               
+//                     CodeTemplateContext context= new CodeTemplateContext(template.getContextTypeId(), cu.getJavaProject(), lineDelimiter);
+//                     context.setCompilationUnitVariables(cu);
+//                     context.setVariable(CodeTemplateContextType.ENCLOSING_TYPE, typeName);
+//                     context.setVariable(CodeTemplateContextType.ENCLOSING_METHOD, decl.getName().getIdentifier());
+//                     if (!decl.isConstructor()) {
+//                             context.setVariable(CodeTemplateContextType.RETURN_TYPE, ASTNodes.asString(decl.getReturnType()));
+//                     }
+//                     if (isOverridden) {
+//                             String methodName= decl.getName().getIdentifier();
+//                             context.setVariable(CodeTemplateContextType.SEE_TAG, getSeeTag(declaringClassQualifiedName, methodName, parameterTypesQualifiedNames));
+//                     }
 //                     
-//                     if (!isPrimitiveType(paramTypeSig)) {
-//                             paramTypeFrm= resolveAndAdd(paramTypeSig, declaringtype, imports);
-//                     } else {
-//                             paramTypeFrm= Signature.toString(paramTypeSig);
+//                     TemplateBuffer buffer;
+//                     try {
+//                             buffer= context.evaluate(template);
+//                     } catch (BadLocationException e) {
+//                             throw new CoreException(Status.CANCEL_STATUS);
+//                     } catch (TemplateException e) {
+//                             throw new CoreException(Status.CANCEL_STATUS);
 //                     }
-//                     buf.append(paramTypeFrm);
-//                     buf.append(' ');
-//                     buf.append(paramNames[i]);
-//                     if (i < lastParam) {
-//                             buf.append(", "); //$NON-NLS-1$
+//                     if (buffer == null)
+//                             return null;
+//                     String str= buffer.getString();
+//                     if (Strings.containsOnlyWhitespaces(str)) {
+//                             return null;
 //                     }
-//             }
-//             buf.append(')');
-//             
-//             int lastExc= excTypes.length - 1;
-//             if (lastExc >= 0) {
-//                     buf.append(" throws "); //$NON-NLS-1$
-//                     for (int i= 0; i <= lastExc; i++) {
-//                             String excTypeSig= excTypes[i];
-//                             String excTypeFrm= resolveAndAdd(excTypeSig, declaringtype, imports);
-//                             buf.append(excTypeFrm);
-//                             if (i < lastExc) {
-//                                     buf.append(", "); //$NON-NLS-1$
+//                     TemplateVariable position= findTagVariable(buffer);  // look if Javadoc tags have to be added
+//                     if (position == null) {
+//                             return str;
+//                     }
+//                             
+//                     IDocument textBuffer= new Document(str);
+//                     List params= decl.parameters();
+//                     String[] paramNames= new String[params.size()];
+//                     for (int i= 0; i < params.size(); i++) {
+//                             SingleVariableDeclaration elem= (SingleVariableDeclaration) params.get(i);
+//                             paramNames[i]= elem.getName().getIdentifier();
+//                     }
+//                     List exceptions= decl.thrownExceptions();
+//                     String[] exceptionNames= new String[exceptions.size()];
+//                     for (int i= 0; i < exceptions.size(); i++) {
+//                             exceptionNames[i]= ASTNodes.getSimpleNameIdentifier((Name) exceptions.get(i));
+//                     }
+//                     String returnType= !decl.isConstructor() ? ASTNodes.asString(decl.getReturnType()) : null;
+//                     int[] tagOffsets= position.getOffsets();
+//                     for (int i= tagOffsets.length - 1; i >= 0; i--) { // from last to first
+//                             try {
+//                                     insertTag(textBuffer, tagOffsets[i], position.getLength(), paramNames, exceptionNames, returnType, isDeprecated, lineDelimiter);
+//                             } catch (BadLocationException e) {
+//                                     throw new CoreException(PHPUIStatus.createError(IStatus.ERROR, e));
 //                             }
 //                     }
+//                     return textBuffer.get();
 //             }
-//             if (settings.noBody) {
-//                     buf.append(";\n\n"); //$NON-NLS-1$
-//             } else {
-//                     buf.append(" {\n\t"); //$NON-NLS-1$
-//                     if (!settings.callSuper) {
-//                             if (retTypeSig != null && !retTypeSig.equals(Signature.SIG_VOID)) {
-//                                     buf.append('\t');
-//                                     if (!isPrimitiveType(retTypeSig) || Signature.getArrayCount(retTypeSig) > 0) {
-//                                             buf.append("return null;\n\t"); //$NON-NLS-1$
-//                                     } else if (retTypeSig.equals(Signature.SIG_BOOLEAN)) {
-//                                             buf.append("return false;\n\t"); //$NON-NLS-1$
-//                                     } else {
-//                                             buf.append("return 0;\n\t"); //$NON-NLS-1$
-//                                     }
-//                             }
-//                     } else {
-//                             buf.append('\t');
-//                             if (!isConstructor) {
-//                                     if (!Signature.SIG_VOID.equals(retTypeSig)) {
-//                                             buf.append("return "); //$NON-NLS-1$
-//                                     }
-//                                     buf.append("super."); //$NON-NLS-1$
-//                                     buf.append(methodName);
+               
+               private static TemplateVariable findTagVariable(TemplateBuffer buffer) {
+                       TemplateVariable[] positions= buffer.getVariables();
+                       for (int i= 0; i < positions.length; i++) {
+                               TemplateVariable curr= positions[i];
+                               if (CodeTemplateContextType.TAGS.equals(curr.getType())) {
+                                       return curr;
+                               }
+                       }
+                       return null;            
+               }       
+               
+               private static void insertTag(IDocument textBuffer, int offset, int length, String[] paramNames, String[] exceptionNames, String returnType, boolean isDeprecated, String lineDelimiter) throws BadLocationException {
+                       IRegion region= textBuffer.getLineInformationOfOffset(offset);
+                       if (region == null) {
+                               return;
+                       }
+                       String lineStart= textBuffer.get(region.getOffset(), offset - region.getOffset());
+                       
+                       StringBuffer buf= new StringBuffer();
+                       for (int i= 0; i < paramNames.length; i++) {
+                               if (buf.length() > 0) {
+                                       buf.append(lineDelimiter); buf.append(lineStart);
+                               }
+                               buf.append("@param "); buf.append(paramNames[i]); //$NON-NLS-1$
+                       }
+                       if (returnType != null && !returnType.equals("void")) { //$NON-NLS-1$
+                               if (buf.length() > 0) {
+                                       buf.append(lineDelimiter); buf.append(lineStart);
+                               }                       
+                               buf.append("@return"); //$NON-NLS-1$
+                       }
+                       if (exceptionNames != null) {
+                               for (int i= 0; i < exceptionNames.length; i++) {
+                                       if (buf.length() > 0) {
+                                               buf.append(lineDelimiter); buf.append(lineStart);
+                                       }
+                                       buf.append("@throws "); buf.append(exceptionNames[i]); //$NON-NLS-1$
+                               }
+                       }               
+                       if (isDeprecated) {
+                               if (buf.length() > 0) {
+                                       buf.append(lineDelimiter); buf.append(lineStart);
+                               }
+                               buf.append("@deprecated"); //$NON-NLS-1$
+                       }
+                       textBuffer.replace(offset, length, buf.toString());
+               }
+               
+               private static boolean isPrimitiveType(String typeName) {
+                       char first= Signature.getElementType(typeName).charAt(0);
+                       return (first != Signature.C_RESOLVED && first != Signature.C_UNRESOLVED);
+               }
+
+               private static String resolveAndAdd(String refTypeSig, IType declaringType) throws JavaModelException {//, IImportsStructure imports) throws JavaModelException {
+                       String resolvedTypeName= JavaModelUtil.getResolvedTypeName(refTypeSig, declaringType);
+                       if (resolvedTypeName != null) {
+                               StringBuffer buf= new StringBuffer();
+//                             if (imports != null) {
+//                                     buf.append(imports.addImport(resolvedTypeName));
 //                             } else {
-//                                     buf.append("super"); //$NON-NLS-1$
+                                       buf.append(resolvedTypeName);
 //                             }
-//                             buf.append('(');                        
-//                             for (int i= 0; i <= lastParam; i++) {
-//                                     buf.append(paramNames[i]);
-//                                     if (i < lastParam) {
-//                                             buf.append(", "); //$NON-NLS-1$
+                               int arrayCount= Signature.getArrayCount(refTypeSig);
+                               for (int i= 0; i < arrayCount; i++) {
+                                       buf.append("[]"); //$NON-NLS-1$
+                               }
+                               return buf.toString();
+                       }
+                       return Signature.toString(refTypeSig);
+               }
+                       
+               /**
+                * Finds a method in a list of methods.
+                * @return The found method or null, if nothing found
+                */
+               private static IMethod findMethod(IMethod method, List allMethods) throws JavaModelException {
+                       String name= method.getElementName();
+                       String[] paramTypes= method.getParameterTypes();
+                       boolean isConstructor= method.isConstructor();
+
+                       for (int i= allMethods.size() - 1; i >= 0; i--) {
+                               IMethod curr= (IMethod) allMethods.get(i);
+                               if (JavaModelUtil.isSameMethodSignature(name, paramTypes, isConstructor, curr)) {
+                                       return curr;
+                               }                       
+                       }
+                       return null;
+               }
+
+               /**
+                * Creates needed constructors for a type.
+                * @param type The type to create constructors for
+                * @param supertype The type's super type
+                * @param settings Options for comment generation
+                * @param imports Required imports are added to the import structure. Structure can be <code>null</code>, types are qualified then.
+                * @return Returns the generated stubs or <code>null</code> if the creation has been canceled
+                */
+//             public static String[] evalConstructors(IType type, IType supertype, IImportsStructure imports) throws CoreException {
+//                     IMethod[] superMethods= supertype.getMethods();
+//                     String typeName= type.getElementName();
+//                     ICompilationUnit cu= type.getCompilationUnit();
+//                     IMethod[] methods= type.getMethods();
+//                     GenStubSettings genStubSettings= new GenStubSettings(settings);
+//                     genStubSettings.callSuper= true;
+//                     
+//                     ArrayList newMethods= new ArrayList(superMethods.length);
+//                     for (int i= 0; i < superMethods.length; i++) {
+//                             IMethod curr= superMethods[i];
+//                             if (curr.isConstructor() && (JavaModelUtil.isVisibleInHierarchy(curr, type.getPackageFragment()))) {
+//                                     if (JavaModelUtil.findMethod(typeName, curr.getParameterTypes(), true, methods) == null) {
+//                                             genStubSettings.methodModifiers= Flags.AccPublic | JdtFlags.clearAccessModifiers(curr.getFlags());
+//                                             String newStub= genStub(cu, typeName, curr, curr.getDeclaringType(), genStubSettings, imports);
+//                                             newMethods.add(newStub);
 //                                     }
 //                             }
-//                             buf.append(");\n\t"); //$NON-NLS-1$
 //                     }
-//                     buf.append("}\n");                       //$NON-NLS-1$
+//                     return (String[]) newMethods.toArray(new String[newMethods.size()]);
 //             }
-//             return buf.toString();
-//     }
-//     
-//     private static boolean isSet(int options, int flag) {
-//             return (options & flag) != 0;
-//     }       
-//
-//     private static boolean isPrimitiveType(String typeName) {
-//             char first= Signature.getElementType(typeName).charAt(0);
-//             return (first != Signature.C_RESOLVED && first != Signature.C_UNRESOLVED);
-//     }
+               
+               /**
+                * Returns all unimplemented constructors of a type including root type default 
+                * constructors if there are no other superclass constructors unimplemented. 
+                * @param type The type to create constructors for
+                * @return Returns the generated stubs or <code>null</code> if the creation has been canceled
+                */
+//             public static IMethod[] getOverridableConstructors(IType type) throws CoreException {
+//                     List constructorMethods= new ArrayList();
+//                     ITypeHierarchy hierarchy= type.newSupertypeHierarchy(null);                             
+//                     IType supertype= hierarchy.getSuperclass(type);
+//                     if (supertype == null)
+//                             return (new IMethod[0]);
 //
-//     private static String resolveAndAdd(String refTypeSig, IType declaringType, IImportsStructure imports) throws JavaModelException {
-//             String resolvedTypeName= JavaModelUtil.getResolvedTypeName(refTypeSig, declaringType);
-//             if (resolvedTypeName != null) {
-//                     StringBuffer buf= new StringBuffer();
-//                     if (imports != null) {
-//                             buf.append(imports.addImport(resolvedTypeName));
-//                     } else {
-//                             buf.append(resolvedTypeName);
-//                     }
-//                     int arrayCount= Signature.getArrayCount(refTypeSig);
-//                     for (int i= 0; i < arrayCount; i++) {
-//                             buf.append("[]"); //$NON-NLS-1$
-//                     }
-//                     return buf.toString();
-//             }
-//             return Signature.toString(refTypeSig);
-//     }
-//     
-//     /**
-//      * Generates a default JavaDoc comment stub for a method.
-//      */
-//     public static void genJavaDocStub(String descr, String[] paramNames, String retTypeSig, String[] excTypeSigs, StringBuffer buf) {
-//             buf.append("/**\n"); //$NON-NLS-1$
-//             buf.append(" * "); buf.append(descr); buf.append(".\n"); //$NON-NLS-2$ //$NON-NLS-1$
-//             for (int i= 0; i < paramNames.length; i++) {
-//                     buf.append(" * @param "); buf.append(paramNames[i]); buf.append('\n'); //$NON-NLS-1$
-//             }
-//             if (retTypeSig != null && !retTypeSig.equals(Signature.SIG_VOID)) {
-//                     String simpleName= Signature.getSimpleName(Signature.toString(retTypeSig));
-//                     buf.append(" * @return "); buf.append(simpleName); buf.append('\n'); //$NON-NLS-1$
-//             }
-//             if (excTypeSigs != null) {
-//                     for (int i= 0; i < excTypeSigs.length; i++) {
-//                             String simpleName= Signature.getSimpleName(Signature.toString(excTypeSigs[i]));
-//                             buf.append(" * @throws "); buf.append(simpleName); buf.append('\n'); //$NON-NLS-1$
-//                     }
-//             }
-//             buf.append(" */"); //$NON-NLS-1$
-//     }
-//     
-//     /**
-//      * Generates a '@see' tag to the defined method.
-//      */
-//     public static void genJavaDocSeeTag(IType declaringType, String methodName, String[] paramTypes, boolean nonJavaDocComment, boolean isDeprecated, StringBuffer buf) throws JavaModelException {
-//             String[] fullParamNames= new String[paramTypes.length];
-//             for (int i= 0; i < paramTypes.length; i++) {
-//                     fullParamNames[i]= JavaModelUtil.getResolvedTypeName(paramTypes[i], declaringType);
-//             }
-//             String fullTypeName= JavaModelUtil.getFullyQualifiedName(declaringType);
-//             
-//             genJavaDocSeeTag(fullTypeName, methodName, fullParamNames, nonJavaDocComment, isDeprecated, buf);
-//     }
-//     
-//     /**
-//      * Generates a '@see' tag to the defined method.
-//      */
-//     public static void genJavaDocSeeTag(String fullyQualifiedTypeName, String methodName, String[] fullParamTypeNames, boolean nonJavaDocComment, boolean isDeprecated, StringBuffer buf) throws JavaModelException {
-//             // create a @see link
-//             buf.append("/*"); //$NON-NLS-1$
-//             if (!nonJavaDocComment) {
-//                     buf.append('*');
-//             } else {
-//                     buf.append(" (non-Javadoc)"); //$NON-NLS-1$
-//             }
-//             buf.append("\n * @see "); //$NON-NLS-1$
-//             buf.append(fullyQualifiedTypeName);
-//             buf.append('#'); 
-//             buf.append(methodName);
-//             buf.append('(');
-//             for (int i= 0; i < fullParamTypeNames.length; i++) {
-//                     if (i > 0) {
-//                             buf.append(", "); //$NON-NLS-1$
+//                     IMethod[] superMethods= supertype.getMethods();
+//                     boolean constuctorFound= false;
+//                     String typeName= type.getElementName();
+//                     IMethod[] methods= type.getMethods();
+//                     for (int i= 0; i < superMethods.length; i++) {
+//                                     IMethod curr= superMethods[i];
+//                                     if (curr.isConstructor())  {
+//                                             constuctorFound= true;
+//                                             if (JavaModelUtil.isVisibleInHierarchy(curr, type.getPackageFragment()))
+//                                                     if (JavaModelUtil.findMethod(typeName, curr.getParameterTypes(), true, methods) == null)
+//                                                             constructorMethods.add(curr);
+//                     
+//                                     }
 //                     }
-//                     buf.append(fullParamTypeNames[i]);
-//             }
-//             buf.append(")\n"); //$NON-NLS-1$
-//             if (isDeprecated) {
-//                     buf.append(" * @deprecated\n"); //$NON-NLS-1$
-//             }
-//             buf.append(" */"); //$NON-NLS-1$
-//     }       
-//     
-//     
-//
-//     /**
-//      * Finds a method in a list of methods.
-//      * @return The found method or null, if nothing found
-//      */
-//     private static IMethod findMethod(IMethod method, List allMethods) throws JavaModelException {
-//             String name= method.getElementName();
-//             String[] paramTypes= method.getParameterTypes();
-//             boolean isConstructor= method.isConstructor();
-//
-//             for (int i= allMethods.size() - 1; i >= 0; i--) {
-//                     IMethod curr= (IMethod) allMethods.get(i);
-//                     if (JavaModelUtil.isSameMethodSignature(name, paramTypes, isConstructor, curr)) {
-//                             return curr;
-//                     }                       
-//             }
-//             return null;
-//     }
-
-
-       /**
-        * Creates needed constructors for a type.
-        * @param type The type to create constructors for
-        * @param supertype The type's super type
-        * @param settings Options for comment generation
-        * @param imports Required imports are added to the import structure. Structure can be <code>null</code>, types are qualified then.
-        * @return Returns the generated stubs or <code>null</code> if the creation has been canceled
-        */
-//     public static String[] evalConstructors(IType type, IType supertype, CodeGenerationSettings settings, IImportsStructure imports) throws JavaModelException {
-//             IMethod[] superMethods= supertype.getMethods();
-//             String typeName= type.getElementName();
-//             IMethod[] methods= type.getMethods();
-//             GenStubSettings genStubSettings= new GenStubSettings(settings);
-//             genStubSettings.callSuper= true;
-//             ArrayList newMethods= new ArrayList(superMethods.length);
-//             for (int i= 0; i < superMethods.length; i++) {
-//                     IMethod curr= superMethods[i];
-//                     if (curr.isConstructor() && (JavaModelUtil.isVisible(curr, type.getPackageFragment()) || Flags.isProtected(curr.getFlags()))) {
+//                     
+//                     // http://bugs.eclipse.org/bugs/show_bug.cgi?id=38487
+//                     if (!constuctorFound)  {
+//                             IType objectType= type.getJavaProject().findType("java.lang.Object"); //$NON-NLS-1$
+//                             IMethod curr= objectType.getMethod("Object", EMPTY);  //$NON-NLS-1$
 //                             if (JavaModelUtil.findMethod(typeName, curr.getParameterTypes(), true, methods) == null) {
-//                                     String newStub= genStub(typeName, superMethods[i], genStubSettings, imports);
-//                                     newMethods.add(newStub);
+//                                     constructorMethods.add(curr);
 //                             }
 //                     }
+//                     return (IMethod[]) constructorMethods.toArray(new IMethod[constructorMethods.size()]);
 //             }
-//             return (String[]) newMethods.toArray(new String[newMethods.size()]);
-//     }
-//
-//     /**
-//      * Searches for unimplemented methods of a type.
-//      * @param isSubType If set, the evaluation is for a subtype of the given type. If not set, the
-//      * evaluation is for the type itself.
-//      * @param settings Options for comment generation
-//      * @param selectionQuery If not null will select the methods to implement.
-//      * @param imports Required imports are added to the import structure. Structure can be <code>null</code>, types are qualified then.
-//      * @return Returns the generated stubs or <code>null</code> if the creation has been canceled
-//      */
-//     public static String[] evalUnimplementedMethods(IType type, ITypeHierarchy hierarchy, boolean isSubType, CodeGenerationSettings settings, 
-//                             IOverrideMethodQuery selectionQuery, IImportsStructure imports) throws JavaModelException {
-//             List allMethods= new ArrayList();
-//             List toImplement= new ArrayList();
+
+               /**
+                * Returns all overridable methods of a type
+                * @param type The type to search the overridable methods for 
+                * @param hierarchy The type hierarchy of the type
+                * @param isSubType If set, the result can include methods of the passed type, if not only methods from super
+                * types are considered
+                * @return Returns the all methods that can be overridden
+                */
+//             public static IMethod[] getOverridableMethods(IType type, ITypeHierarchy hierarchy, boolean isSubType) throws JavaModelException {
+//                     List allMethods= new ArrayList();
 //
-//             IMethod[] typeMethods= type.getMethods();
-//             for (int i= 0; i < typeMethods.length; i++) {
-//                     IMethod curr= typeMethods[i];
-//                     if (!curr.isConstructor() && !Flags.isStatic(curr.getFlags()) && !Flags.isPrivate(curr.getFlags())) {
-//                             allMethods.add(curr);
+//                     IMethod[] typeMethods= type.getMethods();
+//                     for (int i= 0; i < typeMethods.length; i++) {
+//                             IMethod curr= typeMethods[i];
+//                             if (!curr.isConstructor() && !Flags.isStatic(curr.getFlags()) && !Flags.isPrivate(curr.getFlags())) {
+//                                     allMethods.add(curr);
+//                             }
 //                     }
-//             }
 //
-//             IType[] superTypes= hierarchy.getAllSuperclasses(type);
-//             for (int i= 0; i < superTypes.length; i++) {
-//                     IMethod[] methods= superTypes[i].getMethods();
-//                     for (int k= 0; k < methods.length; k++) {
-//                             IMethod curr= methods[k];
-//                             if (!curr.isConstructor() && !Flags.isStatic(curr.getFlags()) && !Flags.isPrivate(curr.getFlags())) {
-//                                     if (findMethod(curr, allMethods) == null) {
-//                                             allMethods.add(curr);
+//                     IType[] superTypes= hierarchy.getAllSuperclasses(type);
+//                     for (int i= 0; i < superTypes.length; i++) {
+//                             IMethod[] methods= superTypes[i].getMethods();
+//                             for (int k= 0; k < methods.length; k++) {
+//                                     IMethod curr= methods[k];
+//                                     if (!curr.isConstructor() && !Flags.isStatic(curr.getFlags()) && !Flags.isPrivate(curr.getFlags())) {
+//                                             if (findMethod(curr, allMethods) == null) {
+//                                                     allMethods.add(curr);
+//                                             }
 //                                     }
 //                             }
 //                     }
-//             }
 //
-//             // do not call super
-//             for (int i= 0; i < allMethods.size(); i++) {
-//                     IMethod curr= (IMethod) allMethods.get(i);
-//                     if ((Flags.isAbstract(curr.getFlags()) || curr.getDeclaringType().isInterface()) && (isSubType || !type.equals(curr.getDeclaringType()))) {
-//                             // implement all abstract methods
-//                             toImplement.add(curr);
-//                     }
-//             }
+//                     IType[] superInterfaces= hierarchy.getAllSuperInterfaces(type);
+//                     for (int i= 0; i < superInterfaces.length; i++) {
+//                             IMethod[] methods= superInterfaces[i].getMethods();
+//                             for (int k= 0; k < methods.length; k++) {
+//                                     IMethod curr= methods[k];
 //
-//             IType[] superInterfaces= hierarchy.getAllSuperInterfaces(type);
-//             for (int i= 0; i < superInterfaces.length; i++) {
-//                     IMethod[] methods= superInterfaces[i].getMethods();
-//                     for (int k= 0; k < methods.length; k++) {
-//                             IMethod curr= methods[k];
-//
-//                             // binary interfaces can contain static initializers (variable intializations)
-//                             // 1G4CKUS
-//                             if (!Flags.isStatic(curr.getFlags())) {
-//                                     IMethod impl= findMethod(curr, allMethods);
-//                                     if (impl == null || ((curr.getExceptionTypes().length < impl.getExceptionTypes().length) && !Flags.isFinal(impl.getFlags()))) {
-//                                             if (impl != null) {
-//                                                     allMethods.remove(impl);
+//                                     // binary interfaces can contain static initializers (variable intializations)
+//                                     // 1G4CKUS
+//                                     if (!Flags.isStatic(curr.getFlags())) {
+//                                             IMethod impl= findMethod(curr, allMethods);
+//                                             if (impl == null || !JavaModelUtil.isVisibleInHierarchy(impl, type.getPackageFragment()) || prefereInterfaceMethod(hierarchy, curr, impl)) {
+//                                                     if (impl != null) {
+//                                                             allMethods.remove(impl);
+//                                                     }
+//                                                     // implement an interface method when it does not exist in the hierarchy
+//                                                     // or when it throws less exceptions that the implemented
+//                                                     allMethods.add(curr);
 //                                             }
-//                                             // implement an interface method when it does not exist in the hierarchy
-//                                             // or when it throws less exceptions that the implemented
-//                                             toImplement.add(curr);
-//                                             allMethods.add(curr);
 //                                     }
 //                             }
 //                     }
-//             }
-//             IMethod[] toImplementArray= (IMethod[]) toImplement.toArray(new IMethod[toImplement.size()]);
-//             if (selectionQuery != null) {
 //                     if (!isSubType) {
 //                             allMethods.removeAll(Arrays.asList(typeMethods));
 //                     }
@@ -394,54 +890,102 @@ public class StubUtility {
 //                                     allMethods.remove(i);
 //                             }
 //                     }
-//                     IMethod[] choice= (IMethod[]) allMethods.toArray(new IMethod[allMethods.size()]);
-//                     toImplementArray= selectionQuery.select(choice, toImplementArray, hierarchy);
-//                     if (toImplementArray == null) {
-//                             //cancel pressed
-//                             return null;
+//                     return (IMethod[]) allMethods.toArray(new IMethod[allMethods.size()]);
+//             }
+               
+//             private static boolean prefereInterfaceMethod(ITypeHierarchy hierarchy, IMethod interfaceMethod, IMethod curr) throws JavaModelException {
+//                     if (Flags.isFinal(curr.getFlags())) {
+//                             return false;
+//                     }
+//                     IType interfaceType= interfaceMethod.getDeclaringType();
+//                     IType[] interfaces= hierarchy.getAllSuperInterfaces(curr.getDeclaringType());
+//                     for (int i= 0; i < interfaces.length; i++) {
+//                             if (interfaces[i] == interfaceType) {
+//                                     return false;
+//                             }
 //                     }
+//                     return curr.getExceptionTypes().length > interfaceMethod.getExceptionTypes().length;
 //             }
-//             GenStubSettings genStubSettings= new GenStubSettings(settings);
-//             genStubSettings.methodOverwrites= true;
-//             String[] result= new String[toImplementArray.length];
-//             for (int i= 0; i < toImplementArray.length; i++) {
-//                     IMethod curr= toImplementArray[i];
-//                     IMethod overrides= JavaModelUtil.findMethodImplementationInHierarchy(hierarchy, type, curr.getElementName(), curr.getParameterTypes(), curr.isConstructor());
-//                     genStubSettings.callSuper= (overrides != null);
-//                                             
-//                     IMethod desc= JavaModelUtil.findMethodDeclarationInHierarchy(hierarchy, type, curr.getElementName(), curr.getParameterTypes(), curr.isConstructor());
-//                     if (desc != null) {
-//                             curr= desc;
+               
+               /**
+                * Generate method stubs for methods to overrride
+                * @param type The type to search the overridable methods for 
+                * @param hierarchy The type hierarchy of the type
+                * @param methodsToImplement Methods to override or implement
+                * @param settings Options for comment generation
+                * @param imports Required imports are added to the import structure. Structure can be <code>null</code>, types are qualified then.
+                * @return Returns the generated stubs
+                */
+//             public static String[] genOverrideStubs(IMethod[] methodsToImplement, IType type, ITypeHierarchy hierarchy, CodeGenerationSettings settings, IImportsStructure imports) throws CoreException {
+//                     GenStubSettings genStubSettings= new GenStubSettings(settings);
+//                     genStubSettings.methodOverwrites= true;
+//                     ICompilationUnit cu= type.getCompilationUnit();
+//                     String[] result= new String[methodsToImplement.length];
+//                     for (int i= 0; i < methodsToImplement.length; i++) {
+//                             IMethod curr= methodsToImplement[i];
+//                             IMethod overrides= JavaModelUtil.findMethodImplementationInHierarchy(hierarchy, type, curr.getElementName(), curr.getParameterTypes(), curr.isConstructor());
+//                             if (overrides != null) {
+//                                     genStubSettings.callSuper= true;
+//                                     curr= overrides;
+//                             }
+//                             genStubSettings.methodModifiers= curr.getFlags();
+//                             IMethod desc= JavaModelUtil.findMethodDeclarationInHierarchy(hierarchy, type, curr.getElementName(), curr.getParameterTypes(), curr.isConstructor());
+//                             if (desc == null) {
+//                                     desc= curr;
+//                             }
+//                             result[i]= genStub(cu, type.getElementName(), curr, desc.getDeclaringType(), genStubSettings, imports);
 //                     }
-//                     result[i]= genStub(type.getElementName(), curr, genStubSettings, imports);
+//                     return result;
 //             }
-//             return result;
-//     }
-
-       /**
-        * Examines a string and returns the first line delimiter found.
-        */
-//     public static String getLineDelimiterUsed(IJavaElement elem) throws JavaModelException {
-//             ICompilationUnit cu= (ICompilationUnit) elem.getAncestor(IJavaElement.COMPILATION_UNIT);
-//             if (cu != null && cu.exists()) {
-//                     IBuffer buf= cu.getBuffer();
-//                     int length= buf.getLength();
-//                     for (int i= 0; i < length; i++) {
-//                             char ch= buf.getChar(i);
-//                             if (ch == SWT.CR) {
-//                                     if (i + 1 < length) {
-//                                             if (buf.getChar(i + 1) == SWT.LF) {
-//                                                     return "\r\n"; //$NON-NLS-1$
-//                                             }
-//                                     }
-//                                     return "\r"; //$NON-NLS-1$
-//                             } else if (ch == SWT.LF) {
-//                                     return "\n"; //$NON-NLS-1$
+               /**
+                * Searches for unimplemented methods of a type.
+                * @param isSubType If set, the evaluation is for a subtype of the given type. If not set, the
+                * evaluation is for the type itself.
+                * @param settings Options for comment generation
+                * @param imports Required imports are added to the import structure. Structure can be <code>null</code>, types are qualified then.
+                * @return Returns the generated stubs or <code>null</code> if the creation has been canceled
+                */
+//             public static String[] evalUnimplementedMethods(IType type, ITypeHierarchy hierarchy, boolean isSubType, CodeGenerationSettings settings, 
+//                             IImportsStructure imports) throws CoreException {
+//                                             
+//                     IMethod[] inheritedMethods= getOverridableMethods(type, hierarchy, isSubType);
+//                     
+//                     List toImplement= new ArrayList();
+//                     for (int i= 0; i < inheritedMethods.length; i++) {
+//                             IMethod curr= inheritedMethods[i];
+//                             if (JdtFlags.isAbstract(curr)) {
+//                                     toImplement.add(curr);
 //                             }
 //                     }
+//                     IMethod[] toImplementArray= (IMethod[]) toImplement.toArray(new IMethod[toImplement.size()]);           
+//                     return genOverrideStubs(toImplementArray, type, hierarchy, settings, imports);
 //             }
-//             return System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$
-//     }
+
+               /**
+                * Examines a string and returns the first line delimiter found.
+                */
+               public static String getLineDelimiterUsed(IJavaElement elem) throws JavaModelException {
+                       ICompilationUnit cu= (ICompilationUnit) elem.getAncestor(IJavaElement.COMPILATION_UNIT);
+                       if (cu != null && cu.exists()) {
+                               IBuffer buf= cu.getBuffer();
+                               int length= buf.getLength();
+                               for (int i= 0; i < length; i++) {
+                                       char ch= buf.getChar(i);
+                                       if (ch == SWT.CR) {
+                                               if (i + 1 < length) {
+                                                       if (buf.getChar(i + 1) == SWT.LF) {
+                                                               return "\r\n"; //$NON-NLS-1$
+                                                       }
+                                               }
+                                               return "\r"; //$NON-NLS-1$
+                                       } else if (ch == SWT.LF) {
+                                               return "\n"; //$NON-NLS-1$
+                                       }
+                               }
+                       }
+                       return System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$
+               }
+
 
        /**
         * Embodies the policy which line delimiter to use when inserting into
@@ -530,5 +1074,119 @@ public class StubUtility {
                }
                return null;
        }
+       /*
+        * Workarounds for bug 38111
+        */
+//     public static String[] getArgumentNameSuggestions(IJavaProject project, String baseName, int dimensions, String[] excluded) {
+//             String name= workaround38111(baseName);
+//             String[] res= NamingConventions.suggestArgumentNames(project, "", name, dimensions, excluded); //$NON-NLS-1$
+//             return sortByLength(res); // longest first
+//     }
+//              
+//     public static String[] getFieldNameSuggestions(IJavaProject project, String baseName, int dimensions, int modifiers, String[] excluded) {
+//             String name= workaround38111(baseName);
+//             String[] res= NamingConventions.suggestFieldNames(project, "", name, dimensions, modifiers, excluded); //$NON-NLS-1$
+//             return sortByLength(res); // longest first
+//     }
+//     
+//     public static String[] getLocalNameSuggestions(IJavaProject project, String baseName, int dimensions, String[] excluded) {
+//             String name= workaround38111(baseName);
+//             String[] res= NamingConventions.suggestLocalVariableNames(project, "", name, dimensions, excluded); //$NON-NLS-1$
+//             return sortByLength(res); // longest first
+//     }
+       
+       private static String[] sortByLength(String[] proposals) {
+               Arrays.sort(proposals, new Comparator() {
+                       public int compare(Object o1, Object o2) {
+                               return ((String) o2).length() - ((String) o1).length();
+                       }
+               });
+               return proposals;
+       }
+       
+       private static String workaround38111(String baseName) {
+               if (BASE_TYPES.contains(baseName))
+                       return baseName;
+               return Character.toUpperCase(baseName.charAt(0)) + baseName.substring(1);
+       }
+       
+       private static final List BASE_TYPES= Arrays.asList(
+                       new String[] {"boolean", "byte", "char", "double", "float", "int", "long", "short"});  //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
+
+       public static String suggestArgumentName(IJavaProject project, String baseName, String[] excluded) {
+//             String[] argnames= getArgumentNameSuggestions(project, baseName, 0, excluded);
+//             if (argnames.length > 0) {
+//                     return argnames[0];
+//             }
+               return baseName;
+       }
+       
+       public static String[] suggestArgumentNames(IJavaProject project, String[] paramNames) {
+               String prefixes= project.getOption(JavaCore.CODEASSIST_ARGUMENT_PREFIXES, true);
+               String suffixes= project.getOption(JavaCore.CODEASSIST_ARGUMENT_SUFFIXES, true);
+               if (prefixes.length() + suffixes.length() == 0) {
+                       return paramNames;
+               }
+               
+               String[] newNames= new String[paramNames.length];
+               // Ensure that the codegeneration preferences are respected
+               for (int i= 0; i < paramNames.length; i++) {
+                       String curr= paramNames[i];
+                       if (!hasPrefixOrSuffix(prefixes, suffixes, curr)) {
+                               newNames[i]= suggestArgumentName(project, paramNames[i], null);
+                       } else {
+                               newNames[i]= curr;
+                       }
+               }
+               return newNames;
+       }
+       
+       public static boolean hasFieldName(IJavaProject project, String name) {
+               String prefixes= project.getOption(JavaCore.CODEASSIST_FIELD_PREFIXES, true);
+               String suffixes= project.getOption(JavaCore.CODEASSIST_FIELD_SUFFIXES, true);
+               String staticPrefixes= project.getOption(JavaCore.CODEASSIST_STATIC_FIELD_PREFIXES, true);
+               String staticSuffixes= project.getOption(JavaCore.CODEASSIST_STATIC_FIELD_SUFFIXES, true);
+               
+               
+               return hasPrefixOrSuffix(prefixes, suffixes, name) 
+                       || hasPrefixOrSuffix(staticPrefixes, staticSuffixes, name);
+       }
+       
+       public static boolean hasParameterName(IJavaProject project, String name) {
+               String prefixes= project.getOption(JavaCore.CODEASSIST_ARGUMENT_PREFIXES, true);
+               String suffixes= project.getOption(JavaCore.CODEASSIST_ARGUMENT_SUFFIXES, true);
+               return hasPrefixOrSuffix(prefixes, suffixes, name);
+       }
+       
+       public static boolean hasLocalVariableName(IJavaProject project, String name) {
+               String prefixes= project.getOption(JavaCore.CODEASSIST_LOCAL_PREFIXES, true);
+               String suffixes= project.getOption(JavaCore.CODEASSIST_LOCAL_SUFFIXES, true);
+               return hasPrefixOrSuffix(prefixes, suffixes, name);
+       }
+       
+       public static boolean hasConstantName(String name) {
+               return Character.isUpperCase(name.charAt(0));
+       }
+       
+       
+       private static boolean hasPrefixOrSuffix(String prefixes, String suffixes, String name) {
+               final String listSeparartor= ","; //$NON-NLS-1$
+
+               StringTokenizer tok= new StringTokenizer(prefixes, listSeparartor);
+               while (tok.hasMoreTokens()) {
+                       String curr= tok.nextToken();
+                       if (name.startsWith(curr)) {
+                               return true;
+                       }
+               }
 
+               tok= new StringTokenizer(suffixes, listSeparartor);
+               while (tok.hasMoreTokens()) {
+                       String curr= tok.nextToken();
+                       if (name.endsWith(curr)) {
+                               return true;
+                       }
+               }
+               return false;
+       }
 }
index 9aef349..01908fe 100644 (file)
@@ -52,7 +52,7 @@ public class CodeTemplateContext extends TemplateContext {
                while (iterator.hasNext()) {
                        TemplateVariableResolver var= (TemplateVariableResolver) iterator.next();
                        if (var instanceof CodeTemplateContextType.CodeTemplateVariableResolver) {
-                               Assert.isNotNull(getVariable(var.getType()), "Variable " + var.getType() + "not defined"); //$NON-NLS-1$ //$NON-NLS-2$
+                       //      Assert.isNotNull(getVariable(var.getType()), "Variable " + var.getType() + "not defined"); //$NON-NLS-1$ //$NON-NLS-2$
                        }
                }
 
index fb30956..b5a8f8f 100644 (file)
@@ -540,6 +540,20 @@ ResourceTransferDragAdapter.moving_resource=Moving Resources via DND
 ResourceTransferDragAdapter.cannot_delete_files=Cannot delete the following file(s)
 
 #########
+# Spelling
+#########
+
+Spelling.dictionary.file.extension=dictionary
+Spelling.error.label=The word ''{0}'' is not correctly spelled
+Spelling.correct.label=Change to ''{0}''
+Spelling.add.info=Adds the word ''{0}'' to the dictionary
+Spelling.add.label=Add ''{0}'' to dictionary
+Spelling.ignore.info=Always ignores ''{0}'' during the current session
+Spelling.ignore.label=Always ignore ''{0}''
+Spelling.case.label=Change to upper case
+Spelling.error.case.label= The word ''{0}'' should have an initial upper case letter
+
+#########
 # misc
 #########
 
index 91e1537..4fcf12a 100644 (file)
@@ -29,7 +29,15 @@ public class PHPUIStatus extends Status {
   public PHPUIStatus(int code, String message, Throwable throwable) {
     super(IStatus.ERROR, PHPeclipsePlugin.getPluginId(), code, message, throwable);
   }
-
+  
+  public static IStatus createError(int code, Throwable throwable) {
+       String message= throwable.getMessage();
+       if (message == null) {
+               message= throwable.getClass().getName();
+       }
+       return new PHPUIStatus(IStatus.ERROR, code, message, throwable);
+  }
+  
   public static IStatus createError(int code, String message, Throwable throwable) {
     return new PHPUIStatus(IStatus.ERROR, code, message, throwable);
   }
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/preferences/CodeTemplateBlock.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/preferences/CodeTemplateBlock.java
new file mode 100644 (file)
index 0000000..a1e4f67
--- /dev/null
@@ -0,0 +1,514 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation 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 API and implementation
+ *******************************************************************************/
+package net.sourceforge.phpdt.internal.ui.preferences;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import net.sourceforge.phpdt.internal.corext.template.php.CodeTemplateContextType;
+import net.sourceforge.phpdt.internal.ui.text.IPHPPartitions;
+import net.sourceforge.phpdt.internal.ui.text.template.preferences.TemplateVariableProcessor;
+import net.sourceforge.phpdt.internal.ui.util.PixelConverter;
+import net.sourceforge.phpdt.internal.ui.wizards.dialogfields.DialogField;
+import net.sourceforge.phpdt.internal.ui.wizards.dialogfields.IDialogFieldListener;
+import net.sourceforge.phpdt.internal.ui.wizards.dialogfields.ITreeListAdapter;
+import net.sourceforge.phpdt.internal.ui.wizards.dialogfields.LayoutUtil;
+import net.sourceforge.phpdt.internal.ui.wizards.dialogfields.SelectionButtonDialogField;
+import net.sourceforge.phpdt.internal.ui.wizards.dialogfields.TreeListDialogField;
+import net.sourceforge.phpdt.ui.PreferenceConstants;
+import net.sourceforge.phpdt.ui.text.JavaTextTools;
+import net.sourceforge.phpeclipse.PHPeclipsePlugin;
+import net.sourceforge.phpeclipse.phpeditor.JavaSourceViewer;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.jface.text.templates.Template;
+import org.eclipse.jface.text.templates.TemplateContextType;
+import org.eclipse.jface.text.templates.persistence.TemplatePersistenceData;
+import org.eclipse.jface.text.templates.persistence.TemplateReaderWriter;
+import org.eclipse.jface.text.templates.persistence.TemplateStore;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ */
+public class CodeTemplateBlock {
+
+  private class CodeTemplateAdapter implements ITreeListAdapter, IDialogFieldListener {
+
+    private final Object[] NO_CHILDREN = new Object[0];
+
+    public void customButtonPressed(TreeListDialogField field, int index) {
+      doButtonPressed(index, field.getSelectedElements());
+    }
+
+    public void selectionChanged(TreeListDialogField field) {
+      List selected = field.getSelectedElements();
+      field.enableButton(IDX_EDIT, canEdit(selected));
+      field.enableButton(IDX_EXPORT, !selected.isEmpty());
+
+      updateSourceViewerInput(selected);
+    }
+
+    public void doubleClicked(TreeListDialogField field) {
+      List selected = field.getSelectedElements();
+      if (canEdit(selected)) {
+        doButtonPressed(IDX_EDIT, selected);
+      }
+    }
+
+    public Object[] getChildren(TreeListDialogField field, Object element) {
+      if (element == COMMENT_NODE || element == CODE_NODE) {
+        return getTemplateOfCategory(element == COMMENT_NODE);
+      }
+      return NO_CHILDREN;
+    }
+
+    public Object getParent(TreeListDialogField field, Object element) {
+      if (element instanceof TemplatePersistenceData) {
+        TemplatePersistenceData data = (TemplatePersistenceData) element;
+        if (data.getTemplate().getName().endsWith(CodeTemplateContextType.COMMENT_SUFFIX)) {
+          return COMMENT_NODE;
+        }
+        return CODE_NODE;
+      }
+      return null;
+    }
+
+    public boolean hasChildren(TreeListDialogField field, Object element) {
+      return (element == COMMENT_NODE || element == CODE_NODE);
+    }
+
+    public void dialogFieldChanged(DialogField field) {
+    }
+
+    public void keyPressed(TreeListDialogField field, KeyEvent event) {
+    }
+
+  }
+
+  private static class CodeTemplateLabelProvider extends LabelProvider {
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
+     */
+    public Image getImage(Object element) {
+      return null;
+
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
+     */
+    public String getText(Object element) {
+      if (element == COMMENT_NODE || element == CODE_NODE) {
+        return (String) element;
+      }
+      TemplatePersistenceData data = (TemplatePersistenceData) element;
+      Template template = data.getTemplate();
+      String name = template.getName();
+      if (CodeTemplateContextType.CATCHBLOCK.equals(name)) {
+        return PreferencesMessages.getString("CodeTemplateBlock.catchblock.label"); //$NON-NLS-1$
+      } else if (CodeTemplateContextType.METHODSTUB.equals(name)) {
+        return PreferencesMessages.getString("CodeTemplateBlock.methodstub.label"); //$NON-NLS-1$
+      } else if (CodeTemplateContextType.CONSTRUCTORSTUB.equals(name)) {
+        return PreferencesMessages.getString("CodeTemplateBlock.constructorstub.label"); //$NON-NLS-1$
+      } else if (CodeTemplateContextType.GETTERSTUB.equals(name)) {
+        return PreferencesMessages.getString("CodeTemplateBlock.getterstub.label"); //$NON-NLS-1$
+      } else if (CodeTemplateContextType.SETTERSTUB.equals(name)) {
+        return PreferencesMessages.getString("CodeTemplateBlock.setterstub.label"); //$NON-NLS-1$
+      } else if (CodeTemplateContextType.NEWTYPE.equals(name)) {
+        return PreferencesMessages.getString("CodeTemplateBlock.newtype.label"); //$NON-NLS-1$
+      } else if (CodeTemplateContextType.TYPECOMMENT.equals(name)) {
+        return PreferencesMessages.getString("CodeTemplateBlock.typecomment.label"); //$NON-NLS-1$
+      } else if (CodeTemplateContextType.FIELDCOMMENT.equals(name)) {
+        return PreferencesMessages.getString("CodeTemplateBlock.fieldcomment.label"); //$NON-NLS-1$
+      } else if (CodeTemplateContextType.METHODCOMMENT.equals(name)) {
+        return PreferencesMessages.getString("CodeTemplateBlock.methodcomment.label"); //$NON-NLS-1$
+      } else if (CodeTemplateContextType.OVERRIDECOMMENT.equals(name)) {
+        return PreferencesMessages.getString("CodeTemplateBlock.overridecomment.label"); //$NON-NLS-1$
+      } else if (CodeTemplateContextType.CONSTRUCTORCOMMENT.equals(name)) {
+        return PreferencesMessages.getString("CodeTemplateBlock.constructorcomment.label"); //$NON-NLS-1$
+      } else if (CodeTemplateContextType.GETTERCOMMENT.equals(name)) {
+        return PreferencesMessages.getString("CodeTemplateBlock.gettercomment.label"); //$NON-NLS-1$
+      } else if (CodeTemplateContextType.SETTERCOMMENT.equals(name)) {
+        return PreferencesMessages.getString("CodeTemplateBlock.settercomment.label"); //$NON-NLS-1$
+      }
+      return template.getDescription();
+    }
+
+  }
+
+  private final static int IDX_EDIT = 0;
+
+  private final static int IDX_IMPORT = 2;
+
+  private final static int IDX_EXPORT = 3;
+
+  private final static int IDX_EXPORTALL = 4;
+
+  protected final static Object COMMENT_NODE = PreferencesMessages.getString("CodeTemplateBlock.templates.comment.node"); //$NON-NLS-1$
+
+  protected final static Object CODE_NODE = PreferencesMessages.getString("CodeTemplateBlock.templates.code.node"); //$NON-NLS-1$
+
+  private static final String PREF_JAVADOC_STUBS = PreferenceConstants.CODEGEN_ADD_COMMENTS;
+
+  private TreeListDialogField fCodeTemplateTree;
+
+  private SelectionButtonDialogField fCreateJavaDocComments;
+
+  protected TemplateStore fTemplates;
+
+  private PixelConverter fPixelConverter;
+
+  private SourceViewer fPatternViewer;
+
+  private Control fSWTWidget;
+
+  private TemplateVariableProcessor fTemplateProcessor;
+
+  public CodeTemplateBlock() {
+
+    fTemplates = PHPeclipsePlugin.getDefault().getCodeTemplateStore();
+    fTemplateProcessor = new TemplateVariableProcessor();
+
+    CodeTemplateAdapter adapter = new CodeTemplateAdapter();
+
+    String[] buttonLabels = new String[] {
+    /* IDX_EDIT */PreferencesMessages.getString("CodeTemplateBlock.templates.edit.button"), //$NON-NLS-1$
+        /* */null,
+        /* IDX_IMPORT */PreferencesMessages.getString("CodeTemplateBlock.templates.import.button"), //$NON-NLS-1$
+        /* IDX_EXPORT */PreferencesMessages.getString("CodeTemplateBlock.templates.export.button"), //$NON-NLS-1$
+        /* IDX_EXPORTALL */PreferencesMessages.getString("CodeTemplateBlock.templates.exportall.button") //$NON-NLS-1$
+
+    };
+    fCodeTemplateTree = new TreeListDialogField(adapter, buttonLabels, new CodeTemplateLabelProvider());
+    fCodeTemplateTree.setDialogFieldListener(adapter);
+    fCodeTemplateTree.setLabelText(PreferencesMessages.getString("CodeTemplateBlock.templates.label")); //$NON-NLS-1$
+
+    fCodeTemplateTree.enableButton(IDX_EXPORT, false);
+    fCodeTemplateTree.enableButton(IDX_EDIT, false);
+
+    fCodeTemplateTree.addElement(COMMENT_NODE);
+    fCodeTemplateTree.addElement(CODE_NODE);
+
+    fCreateJavaDocComments = new SelectionButtonDialogField(SWT.CHECK | SWT.WRAP);
+    fCreateJavaDocComments.setLabelText(PreferencesMessages.getString("CodeTemplateBlock.createcomment.label")); //$NON-NLS-1$
+    fCreateJavaDocComments.setSelection(PreferenceConstants.getPreferenceStore().getBoolean(PREF_JAVADOC_STUBS));
+
+    fCodeTemplateTree.selectFirstElement();
+  }
+
+  protected Control createContents(Composite parent) {
+    fPixelConverter = new PixelConverter(parent);
+    fSWTWidget = parent;
+
+    Composite composite = new Composite(parent, SWT.NONE);
+    GridLayout layout = new GridLayout();
+    layout.marginHeight = 0;
+    layout.marginWidth = 0;
+    layout.numColumns = 2;
+    composite.setLayout(layout);
+
+    fCodeTemplateTree.doFillIntoGrid(composite, 3);
+    LayoutUtil.setHorizontalSpan(fCodeTemplateTree.getLabelControl(null), 2);
+    LayoutUtil.setHorizontalGrabbing(fCodeTemplateTree.getTreeControl(null));
+
+    fPatternViewer = createViewer(composite, 2);
+
+    fCreateJavaDocComments.doFillIntoGrid(composite, 2);
+
+    DialogField label = new DialogField();
+    label.setLabelText(PreferencesMessages.getString("CodeTemplateBlock.createcomment.description")); //$NON-NLS-1$
+    label.doFillIntoGrid(composite, 2);
+
+    return composite;
+
+  }
+
+  private Shell getShell() {
+    if (fSWTWidget != null) {
+      return fSWTWidget.getShell();
+    }
+    return PHPeclipsePlugin.getActiveWorkbenchShell();
+  }
+
+  private SourceViewer createViewer(Composite parent, int nColumns) {
+    Label label = new Label(parent, SWT.NONE);
+    label.setText(PreferencesMessages.getString("CodeTemplateBlock.preview")); //$NON-NLS-1$
+    GridData data = new GridData();
+    data.horizontalSpan = nColumns;
+    label.setLayoutData(data);
+
+    IDocument document = new Document();
+    JavaTextTools tools = PHPeclipsePlugin.getDefault().getJavaTextTools();
+    tools.setupJavaDocumentPartitioner(document, IPHPPartitions.PHP_PARTITIONING);
+    IPreferenceStore store = PHPeclipsePlugin.getDefault().getCombinedPreferenceStore();
+    SourceViewer viewer = new JavaSourceViewer(parent, null, null, false, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL, store);
+    TemplateEditorSourceViewerConfiguration configuration = new TemplateEditorSourceViewerConfiguration(tools.getColorManager(),
+        store, null, fTemplateProcessor);
+    viewer.configure(configuration);
+    viewer.setEditable(false);
+    viewer.setDocument(document);
+
+    Font font = JFaceResources.getFont(PreferenceConstants.EDITOR_TEXT_FONT);
+    viewer.getTextWidget().setFont(font);
+    new JavaSourcePreviewerUpdater(viewer, configuration, store);
+
+    Control control = viewer.getControl();
+    data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.FILL_VERTICAL);
+    data.horizontalSpan = nColumns;
+    data.heightHint = fPixelConverter.convertHeightInCharsToPixels(5);
+    control.setLayoutData(data);
+
+    return viewer;
+  }
+
+  protected TemplatePersistenceData[] getTemplateOfCategory(boolean isComment) {
+    ArrayList res = new ArrayList();
+    TemplatePersistenceData[] templates = fTemplates.getTemplateData(false);
+    for (int i = 0; i < templates.length; i++) {
+      TemplatePersistenceData curr = templates[i];
+      if (isComment == curr.getTemplate().getName().endsWith(CodeTemplateContextType.COMMENT_SUFFIX)) {
+        res.add(curr);
+      }
+    }
+    return (TemplatePersistenceData[]) res.toArray(new TemplatePersistenceData[res.size()]);
+  }
+
+  protected static boolean canEdit(List selected) {
+    return selected.size() == 1 && (selected.get(0) instanceof TemplatePersistenceData);
+  }
+
+  protected void updateSourceViewerInput(List selection) {
+    if (fPatternViewer == null || fPatternViewer.getTextWidget().isDisposed()) {
+      return;
+    }
+    if (selection.size() == 1 && selection.get(0) instanceof TemplatePersistenceData) {
+      TemplatePersistenceData data = (TemplatePersistenceData) selection.get(0);
+      Template template = data.getTemplate();
+      TemplateContextType type = PHPeclipsePlugin.getDefault().getCodeTemplateContextRegistry().getContextType(
+          template.getContextTypeId());
+      fTemplateProcessor.setContextType(type);
+      fPatternViewer.getDocument().set(template.getPattern());
+    } else {
+      fPatternViewer.getDocument().set(""); //$NON-NLS-1$
+    }
+  }
+
+  protected void doButtonPressed(int buttonIndex, List selected) {
+    if (buttonIndex == IDX_EDIT) {
+      edit((TemplatePersistenceData) selected.get(0));
+    } else if (buttonIndex == IDX_EXPORT) {
+      export(selected);
+    } else if (buttonIndex == IDX_EXPORTALL) {
+      exportAll();
+    } else if (buttonIndex == IDX_IMPORT) {
+      import_();
+    }
+  }
+
+  private void edit(TemplatePersistenceData data) {
+    Template newTemplate = new Template(data.getTemplate());
+    EditTemplateDialog dialog = new EditTemplateDialog(getShell(), newTemplate, true, false, PHPeclipsePlugin.getDefault()
+        .getCodeTemplateContextRegistry());
+    if (dialog.open() == Window.OK) {
+      // changed
+      data.setTemplate(newTemplate);
+      fCodeTemplateTree.refresh(data);
+      fCodeTemplateTree.selectElements(new StructuredSelection(data));
+    }
+  }
+
+  private void import_() {
+    FileDialog dialog = new FileDialog(getShell());
+    dialog.setText(PreferencesMessages.getString("CodeTemplateBlock.import.title")); //$NON-NLS-1$
+    dialog.setFilterExtensions(new String[] { PreferencesMessages.getString("CodeTemplateBlock.import.extension") }); //$NON-NLS-1$
+    String path = dialog.open();
+
+    if (path == null)
+      return;
+
+    try {
+      TemplateReaderWriter reader = new TemplateReaderWriter();
+      File file = new File(path);
+      if (file.exists()) {
+        InputStream input = new BufferedInputStream(new FileInputStream(file));
+        TemplatePersistenceData[] datas = reader.read(input, null);
+        for (int i = 0; i < datas.length; i++) {
+          updateTemplate(datas[i]);
+        }
+      }
+
+      fCodeTemplateTree.refresh();
+      updateSourceViewerInput(fCodeTemplateTree.getSelectedElements());
+
+    } catch (FileNotFoundException e) {
+      openReadErrorDialog(e);
+    } catch (IOException e) {
+      openReadErrorDialog(e);
+    }
+
+  }
+
+  private void updateTemplate(TemplatePersistenceData data) {
+    TemplatePersistenceData[] datas = fTemplates.getTemplateData(true);
+    for (int i = 0; i < datas.length; i++) {
+      String id = datas[i].getId();
+      if (id != null && id.equals(data.getId())) {
+        datas[i].setTemplate(data.getTemplate());
+        break;
+      }
+    }
+  }
+
+  private void exportAll() {
+    export(fTemplates.getTemplateData(false));
+  }
+
+  private void export(List selected) {
+    List datas = new ArrayList();
+    for (int i = 0; i < selected.size(); i++) {
+      Object curr = selected.get(i);
+      if (curr instanceof TemplatePersistenceData) {
+        datas.add(curr);
+      } else {
+        TemplatePersistenceData[] cat = getTemplateOfCategory(curr == COMMENT_NODE);
+        datas.addAll(Arrays.asList(cat));
+      }
+    }
+    export((TemplatePersistenceData[]) datas.toArray(new TemplatePersistenceData[datas.size()]));
+  }
+
+  private void export(TemplatePersistenceData[] templates) {
+    FileDialog dialog = new FileDialog(getShell(), SWT.SAVE);
+    dialog.setText(PreferencesMessages.getFormattedString("CodeTemplateBlock.export.title", String.valueOf(templates.length))); //$NON-NLS-1$
+    dialog.setFilterExtensions(new String[] { PreferencesMessages.getString("CodeTemplateBlock.export.extension") }); //$NON-NLS-1$
+    dialog.setFileName(PreferencesMessages.getString("CodeTemplateBlock.export.filename")); //$NON-NLS-1$
+    String path = dialog.open();
+
+    if (path == null)
+      return;
+
+    File file = new File(path);
+
+    if (file.isHidden()) {
+      String title = PreferencesMessages.getString("CodeTemplateBlock.export.error.title"); //$NON-NLS-1$ 
+      String message = PreferencesMessages.getFormattedString("CodeTemplateBlock.export.error.hidden", file.getAbsolutePath()); //$NON-NLS-1$
+      MessageDialog.openError(getShell(), title, message);
+      return;
+    }
+
+    if (file.exists() && !file.canWrite()) {
+      String title = PreferencesMessages.getString("CodeTemplateBlock.export.error.title"); //$NON-NLS-1$
+      String message = PreferencesMessages.getFormattedString("CodeTemplateBlock.export.error.canNotWrite", file.getAbsolutePath()); //$NON-NLS-1$
+      MessageDialog.openError(getShell(), title, message);
+      return;
+    }
+
+    if (!file.exists() || confirmOverwrite(file)) {
+      try {
+        OutputStream output = new BufferedOutputStream(new FileOutputStream(file));
+        TemplateReaderWriter writer = new TemplateReaderWriter();
+        writer.save(templates, output);
+      } catch (IOException e) {
+        openWriteErrorDialog(e);
+      }
+    }
+
+  }
+
+  private boolean confirmOverwrite(File file) {
+    return MessageDialog.openQuestion(getShell(), PreferencesMessages.getString("CodeTemplateBlock.export.exists.title"), //$NON-NLS-1$
+        PreferencesMessages.getFormattedString("CodeTemplateBlock.export.exists.message", file.getAbsolutePath())); //$NON-NLS-1$
+  }
+
+  public void performDefaults() {
+    IPreferenceStore prefs = PHPeclipsePlugin.getDefault().getPreferenceStore();
+    fCreateJavaDocComments.setSelection(prefs.getDefaultBoolean(PREF_JAVADOC_STUBS));
+
+    fTemplates.restoreDefaults();
+
+    // refresh
+    fCodeTemplateTree.refresh();
+    updateSourceViewerInput(fCodeTemplateTree.getSelectedElements());
+  }
+
+  public boolean performOk(boolean enabled) {
+    IPreferenceStore prefs = PreferenceConstants.getPreferenceStore();
+    prefs.setValue(PREF_JAVADOC_STUBS, fCreateJavaDocComments.isSelected());
+    PHPeclipsePlugin.getDefault().savePluginPreferences();
+
+    try {
+      fTemplates.save();
+    } catch (IOException e) {
+      PHPeclipsePlugin.log(e);
+      openWriteErrorDialog(e);
+    }
+    return true;
+  }
+
+  public void performCancel() {
+    try {
+      fTemplates.load();
+    } catch (IOException e) {
+      openReadErrorDialog(e);
+    }
+  }
+
+  private void openReadErrorDialog(Exception e) {
+    String title = PreferencesMessages.getString("CodeTemplateBlock.error.read.title"); //$NON-NLS-1$
+
+    String message = e.getLocalizedMessage();
+    if (message != null)
+      message = PreferencesMessages.getFormattedString("CodeTemplateBlock.error.parse.message", message); //$NON-NLS-1$
+    else
+      message = PreferencesMessages.getString("CodeTemplateBlock.error.read.message"); //$NON-NLS-1$
+    MessageDialog.openError(getShell(), title, message);
+  }
+
+  private void openWriteErrorDialog(Exception e) {
+    String title = PreferencesMessages.getString("CodeTemplateBlock.error.write.title"); //$NON-NLS-1$
+    String message = PreferencesMessages.getString("CodeTemplateBlock.error.write.message"); //$NON-NLS-1$
+    MessageDialog.openError(getShell(), title, message);
+  }
+
+}
\ No newline at end of file
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/preferences/CodeTemplatePreferencePage.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/preferences/CodeTemplatePreferencePage.java
new file mode 100644 (file)
index 0000000..292083a
--- /dev/null
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation 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 API and implementation
+ *******************************************************************************/
+package net.sourceforge.phpdt.internal.ui.preferences;
+
+import net.sourceforge.phpdt.internal.ui.IJavaHelpContextIds;
+import net.sourceforge.phpdt.internal.ui.dialogs.StatusUtil;
+import net.sourceforge.phpdt.internal.ui.wizards.IStatusChangeListener;
+import net.sourceforge.phpeclipse.PHPeclipsePlugin;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.ui.help.WorkbenchHelp;
+
+/*
+ * The page to configure the code formatter options.
+ */
+public class CodeTemplatePreferencePage extends PreferencePage implements IWorkbenchPreferencePage, IStatusChangeListener {
+
+       private CodeTemplateBlock fCodeTemplateConfigurationBlock;
+
+       public CodeTemplatePreferencePage() {
+               setPreferenceStore(PHPeclipsePlugin.getDefault().getPreferenceStore());
+               //setDescription(PreferencesMessages.getString("CodeTemplatesPreferencePage.description")); //$NON-NLS-1$
+               
+               // only used when page is shown programatically
+               setTitle(PreferencesMessages.getString("CodeTemplatesPreferencePage.title"));            //$NON-NLS-1$
+               
+               fCodeTemplateConfigurationBlock= new CodeTemplateBlock();
+       }
+
+       /*
+        * @see IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
+        */     
+       public void init(IWorkbench workbench) {
+       }
+
+       /*
+        * @see PreferencePage#createControl(Composite)
+        */
+       public void createControl(Composite parent) {
+               super.createControl(parent);
+               WorkbenchHelp.setHelp(getControl(), IJavaHelpContextIds.CODE_MANIPULATION_PREFERENCE_PAGE);
+       }       
+
+       /*
+        * @see PreferencePage#createContents(Composite)
+        */
+       protected Control createContents(Composite parent) {
+               Control composite= fCodeTemplateConfigurationBlock.createContents(parent);
+               Dialog.applyDialogFont(composite);
+               return composite;
+       }
+
+       /*
+        * @see IPreferencePage#performOk()
+        */
+       public boolean performOk() {
+               if (!fCodeTemplateConfigurationBlock.performOk(true)) {
+                       return false;
+               }                       
+               return super.performOk();
+       }
+       
+       /*
+        * @see PreferencePage#performDefaults()
+        */
+       protected void performDefaults() {
+               fCodeTemplateConfigurationBlock.performDefaults();
+               super.performDefaults();
+       }
+       
+       /* (non-Javadoc)
+        * @see net.sourceforge.phpdt.internal.ui.wizards.IStatusChangeListener#statusChanged(org.eclipse.core.runtime.IStatus)
+        */
+       public void statusChanged(IStatus status) {
+               setValid(!status.matches(IStatus.ERROR));
+               StatusUtil.applyToStatusLine(this, status);             
+       }
+
+       /* (non-Javadoc)
+        * @see org.eclipse.jface.preference.IPreferencePage#performCancel()
+        */
+       public boolean performCancel() {
+               fCodeTemplateConfigurationBlock.performCancel();
+               
+               return super.performCancel();
+       }
+
+}
+
+
+
index a977166..84d5f35 100644 (file)
@@ -226,7 +226,7 @@ public class SpellReconcileStrategy implements IReconcilingStrategy, IReconcilin
                }
        }
 
-       /** The document to operate on */
+       /** The document to operate on */ 
        private IDocument fDocument= null;
 
        /** The text editor to operate on */
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/CodeGeneration.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/CodeGeneration.java
new file mode 100644 (file)
index 0000000..a6d10fc
--- /dev/null
@@ -0,0 +1,241 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation 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 API and implementation
+ *******************************************************************************/
+package net.sourceforge.phpdt.ui;
+
+import org.eclipse.core.runtime.CoreException;
+
+import net.sourceforge.phpdt.core.ICompilationUnit;
+import net.sourceforge.phpdt.core.IMethod;
+//import net.sourceforge.phpdt.core.dom.IMethodBinding;
+//import net.sourceforge.phpdt.core.dom.MethodDeclaration;
+
+import net.sourceforge.phpdt.internal.corext.codemanipulation.StubUtility;
+
+/**
+ * Class that offers access to the templates contained in the 'code templates' preference page.
+ * 
+ * @since 2.1
+ */
+public class CodeGeneration {
+       
+       private CodeGeneration() {
+       }
+       
+       /**
+        * Returns the content for a new compilation unit using the 'new Java file' code template.
+        * @param cu The compilation to create the source for. The compilation unit does not need to exist.
+        * @param typeComment The comment for the type to be created. Used when the code template contains a <i>${typecomment}</i> variable. Can be <code>null</code> if
+        * no comment should be added.
+        * @param typeContent The code of the type, including type declaration and body.
+        * @param lineDelimiter The line delimiter to be used.
+        * @return Returns the new content or <code>null</code> if the template is undefined or empty.
+        * @throws CoreException Thrown when the evaluation of the code template fails.
+        */
+       public static String getCompilationUnitContent(ICompilationUnit cu, String typeComment, String typeContent, String lineDelimiter) throws CoreException {        
+               return StubUtility.getCompilationUnitContent(cu, typeComment, typeContent, lineDelimiter);
+       }
+       
+       /**
+        * Returns the content for a new type comment using the 'type comment' code template. The returned content is unformatted and is not indented.
+        * @param cu The compilation where the type is contained. The compilation unit does not need to exist.
+        * @param typeQualifiedName The name of the type to which the comment is added. For inner types the name must be qualified and include the outer
+        * types names (dot separated). See {@link net.sourceforge.phpdt.core.IType#getTypeQualifiedName(char)}.
+        * @param lineDelimiter The line delimiter to be used.
+        * @return Returns the new content or <code>null</code> if the code template is undefined or empty. The returned content is unformatted and is not indented.
+        * @throws CoreException Thrown when the evaluation of the code template fails.
+        */     
+       public static String getTypeComment(ICompilationUnit cu, String typeQualifiedName, String lineDelimiter) throws CoreException {
+               return StubUtility.getTypeComment(cu, typeQualifiedName, lineDelimiter);
+       }
+
+       /**
+        * Returns the content for a new field comment using the 'field comment' code template. The returned content is unformatted and is not indented.
+        * @param cu The compilation where the field is contained. The compilation unit does not need to exist.
+        * @param typeName The name of the field declared type.
+        * @param fieldName The name of the field to which the comment is added.
+        * @param lineDelimiter The line delimiter to be used.
+        * @return Returns the new content or <code>null</code> if the code template is undefined or empty. The returned content is unformatted and is not indented.
+        * @throws CoreException Thrown when the evaluation of the code template fails.
+        * @since 3.0
+        */     
+       public static String getFieldComment(ICompilationUnit cu, String typeName, String fieldName, String lineDelimiter) throws CoreException {
+               return StubUtility.getFieldComment(cu, typeName, fieldName, lineDelimiter);
+       }       
+       
+       /**
+        * Returns the comment for a method or constructor using the comment code templates (constructor / method / overriding method).
+        * <code>null</code> is returned if the template is empty.
+        * @param cu The compilation unit to which the method belongs. The compilation unit does not need to exist.
+        * @param declaringTypeName Name of the type to which the method belongs. For inner types the name must be qualified and include the outer
+        * types names (dot separated). See {@link net.sourceforge.phpdt.core.IType#getTypeQualifiedName(char)}.
+        * @param decl The MethodDeclaration AST node that will be added as new
+        * method. The node does not need to exist in an AST (no parent needed) and does not need to resolve.
+        * See {@link net.sourceforge.phpdt.core.dom.AST#newMethodDeclaration()} for how to create such a node.
+        * @param overridden The binding of the method that will be overridden by the created
+        * method or <code>null</code> if no method is overridden.
+        * @param lineDelimiter The line delimiter to be used.
+        * @return Returns the generated method comment or <code>null</code> if the
+        * code template is empty. The returned content is unformatted and not indented (formatting required).
+        * @throws CoreException Thrown when the evaluation of the code template fails.
+        */
+//     public static String getMethodComment(ICompilationUnit cu, String declaringTypeName, MethodDeclaration decl, IMethodBinding overridden, String lineDelimiter) throws CoreException {
+//             return StubUtility.getMethodComment(cu, declaringTypeName, decl, overridden, lineDelimiter);
+//     }
+
+       /**
+        * Returns the comment for a method or constructor using the comment code templates (constructor / method / overriding method).
+        * <code>null</code> is returned if the template is empty.
+        * <p>The returned string is unformatted and not indented.
+        * <p>Exception types and return type are in signature notation. e.g. a source method declared as <code>public void foo(String text, int length)</code>
+        * would return the array <code>{"QString;","I"}</code> as parameter types. See {@link net.sourceforge.phpdt.core.Signature}.
+        * 
+        * @param cu The compilation unit to which the method belongs. The compilation unit does not need to exist.
+        * @param declaringTypeName Name of the type to which the method belongs. For inner types the name must be qualified and include the outer
+        * types names (dot separated). See {@link net.sourceforge.phpdt.core.IType#getTypeQualifiedName(char)}.
+        * @param methodName Name of the method.
+        * @param paramNames Names of the parameters for the method.
+        * @param excTypeSig Thrown exceptions (Signature notation).
+        * @param retTypeSig Return type (Signature notation) or <code>null</code>
+        * for constructors.
+        * @param overridden The method that will be overridden by the created method or
+        * <code>null</code> for non-overriding methods. If not <code>null</code>, the method must exist.
+        * @param lineDelimiter The line delimiter to be used.
+        * @return Returns the constructed comment or <code>null</code> if
+        * the comment code template is empty. The returned content is unformatted and not indented (formatting required).
+        * @throws CoreException Thrown when the evaluation of the code template fails.
+        */
+       public static String getMethodComment(ICompilationUnit cu, String declaringTypeName, String methodName, String[] paramNames, String[] excTypeSig, String retTypeSig, IMethod overridden, String lineDelimiter) throws CoreException {
+               return StubUtility.getMethodComment(cu, declaringTypeName, methodName, paramNames, excTypeSig, retTypeSig, overridden, lineDelimiter);
+       }
+               
+       /**
+        * Returns the comment for a method or constructor using the comment code templates (constructor / method / overriding method).
+        * <code>null</code> is returned if the template is empty.
+        * <p>The returned string is unformatted and not indented.
+        * 
+        * @param method The method to be documented. The method must exist.
+        * @param overridden The method that will be overridden by the created method or
+        * <code>null</code> for non-overriding methods. If not <code>null</code>, the method must exist.
+        * @param lineDelimiter The line delimiter to be used.
+        * @return Returns the constructed comment or <code>null</code> if
+        * the comment code template is empty. The returned string is unformatted and and has no indent (formatting required).
+        * @throws CoreException Thrown when the evaluation of the code template fails.
+        */
+       public static String getMethodComment(IMethod method, IMethod overridden, String lineDelimiter) throws CoreException {
+               return StubUtility.getMethodComment(method, overridden, lineDelimiter);
+       }       
+
+       /**
+        * Returns the content of the body for a method or constructor using the method body templates.
+        * <code>null</code> is returned if the template is empty.
+        * <p>The returned string is unformatted and not indented.
+        * 
+        * @param cu The compilation unit to which the method belongs. The compilation unit does not need to exist.
+        * @param declaringTypeName Name of the type to which the method belongs. For inner types the name must be qualified and include the outer
+        * types names (dot separated). See {@link net.sourceforge.phpdt.core.IType#getTypeQualifiedName(char)}.
+        * @param methodName Name of the method.
+        * @param isConstructor Defines if the created body is for a constructor.
+        * @param bodyStatement The code to be entered at the place of the variable ${body_statement}. 
+        * @param lineDelimiter The line delimiter to be used.
+        * @return Returns the constructed body content or <code>null</code> if
+        * the comment code template is empty. The returned string is unformatted and and has no indent (formatting required).
+        * @throws CoreException Thrown when the evaluation of the code template fails.
+        */     
+       public static String getMethodBodyContent(ICompilationUnit cu, String declaringTypeName, String methodName, boolean isConstructor, String bodyStatement, String lineDelimiter) throws CoreException {
+               return StubUtility.getMethodBodyContent(isConstructor, cu.getJavaProject(), declaringTypeName, methodName, bodyStatement, lineDelimiter);
+       }
+       
+       /**
+        * Returns the content of body for a getter method using the getter method body template.
+        * <code>null</code> is returned if the template is empty.
+        * <p>The returned string is unformatted and not indented.
+        * 
+        * @param cu The compilation unit to which the method belongs. The compilation unit does not need to exist.
+        * @param declaringTypeName Name of the type to which the method belongs. For inner types the name must be qualified and include the outer
+        * types names (dot separated). See {@link net.sourceforge.phpdt.core.IType#getTypeQualifiedName(char)}.
+        * @param methodName The name of the getter method.
+        * @param fieldName The name of the field to get in the getter method, corresponding to the template variable for ${field}. 
+        * @param lineDelimiter The line delimiter to be used.
+        * @return Returns the constructed body content or <code>null</code> if
+        * the comment code template is empty. The returned string is unformatted and and has no indent (formatting required).
+        * @throws CoreException Thrown when the evaluation of the code template fails.
+        * @since 3.0
+        */     
+       public static String getGetterMethodBodyContent(ICompilationUnit cu, String declaringTypeName, String methodName, String fieldName, String lineDelimiter) throws CoreException {
+               return StubUtility.getGetterMethodBodyContent(cu.getJavaProject(), declaringTypeName, methodName, fieldName, lineDelimiter);
+       }
+       
+       /**
+        * Returns the content of body for a setter method using the setter method body template.
+        * <code>null</code> is returned if the template is empty.
+        * <p>The returned string is unformatted and not indented.
+        * 
+        * @param cu The compilation unit to which the method belongs. The compilation unit does not need to exist.
+        * @param declaringTypeName Name of the type to which the method belongs. For inner types the name must be qualified and include the outer
+        * types names (dot separated). See {@link net.sourceforge.phpdt.core.IType#getTypeQualifiedName(char)}.
+        * @param methodName The name of the setter method.
+        * @param fieldName The name of the field to be set in the setter method, corresponding to the template variable for ${field}.
+        * @param paramName The name of the parameter passed to the setter method, corresponding to the template variable for $(param).
+        * @param lineDelimiter The line delimiter to be used.
+        * @return Returns the constructed body content or <code>null</code> if
+        * the comment code template is empty. The returned string is unformatted and and has no indent (formatting required).
+        * @throws CoreException Thrown when the evaluation of the code template fails.
+        * @since 3.0
+        */     
+       public static String getSetterMethodBodyContent(ICompilationUnit cu, String declaringTypeName, String methodName, String fieldName, String paramName, String lineDelimiter) throws CoreException {
+               return StubUtility.getSetterMethodBodyContent(cu.getJavaProject(), declaringTypeName, methodName, fieldName, paramName, lineDelimiter);
+       }
+       
+       /**
+        * Returns the comment for a getter method using the getter comment template.
+        * <code>null</code> is returned if the template is empty.
+        * <p>The returned string is unformatted and not indented.
+        * 
+        * @param cu The compilation unit to which the method belongs. The compilation unit does not need to exist.
+        * @param declaringTypeName Name of the type to which the method belongs. For inner types the name must be qualified and include the outer
+        * types names (dot separated). See {@link net.sourceforge.phpdt.core.IType#getTypeQualifiedName(char)}.
+        * @param methodName Name of the method.
+        * @param fieldName Name of the field to get.
+        * @param fieldType The type of the field to get.
+        * @param bareFieldName The field name without prefix or suffix.
+        * @param lineDelimiter The line delimiter to be used.
+        * @return Returns the generated getter comment or <code>null</code> if the
+        * code template is empty. The returned content is not indented.
+        * @throws CoreException Thrown when the evaluation of the code template fails.
+        * @since 3.0
+        */
+       public static String getGetterComment(ICompilationUnit cu, String declaringTypeName, String methodName, String fieldName, String fieldType, String bareFieldName, String lineDelimiter) throws CoreException {
+               return StubUtility.getGetterComment(cu, declaringTypeName, methodName, fieldName, fieldType, bareFieldName, lineDelimiter);
+       }
+       
+       /**
+        * Returns the comment for a setter method using the setter method body template.
+        * <code>null</code> is returned if the template is empty.
+        * <p>The returned string is unformatted and not indented.
+        * 
+        * @param cu The compilation unit to which the method belongs. The compilation unit does not need to exist.
+        * @param declaringTypeName Name of the type to which the method belongs. For inner types the name must be qualified and include the outer
+        * types names (dot separated). See {@link net.sourceforge.phpdt.core.IType#getTypeQualifiedName(char)}.
+        * @param methodName Name of the method.
+        * @param fieldName Name of the field that is set.
+        * @param fieldType The type of the field that is to set.
+        * @param paramName The name of the parameter that used to set.
+        * @param bareFieldName The field name without prefix or suffix.
+        * @param lineDelimiter The line delimiter to be used.
+        * @return Returns the generated setter comment or <code>null</code> if the
+        * code template is empty. The returned comment is not indented.
+        * @throws CoreException Thrown when the evaluation of the code template fails.
+        * @since 3.0
+        */
+       public static String getSetterComment(ICompilationUnit cu, String declaringTypeName, String methodName, String fieldName, String fieldType, String paramName, String bareFieldName, String lineDelimiter) throws CoreException {
+               return StubUtility.getSetterComment(cu, declaringTypeName, methodName, fieldName, fieldType, paramName, bareFieldName, lineDelimiter);
+       }               
+}
index 52017fc..f751f9f 100644 (file)
@@ -147,14 +147,24 @@ public class PreferenceConstants {
    * @see #CODEGEN_USE_GETTERSETTER_SUFFIX
    */
   public static final String CODEGEN_GETTERSETTER_SUFFIX = "net.sourceforge.phpdt.ui.gettersetter.suffix.list"; //$NON-NLS-1$
+  /**
+        * A named preference that controls if comment stubs will be added
+        * automatically to newly created types and methods.
+        * <p>
+        * Value is of type <code>Boolean</code>.
+        * </p>
+        * @since 2.1
+        */
+       public static final String CODEGEN_ADD_COMMENTS= "net.sourceforge.phpdt.ui.phpdoc"; //$NON-NLS-1$
 
   /**
    * A name preference that controls if a JavaDoc stub gets added to newly created types and methods.
    * <p>
    * Value is of type <code>Boolean</code>.
    * </p>
+   * @deprecated Use CODEGEN_ADD_COMMENTS instead (Name is more precise).
    */
-  public static final String CODEGEN__JAVADOC_STUBS = "net.sourceforge.phpdt.ui.phpdoc"; //$NON-NLS-1$
+//  public static final String CODEGEN__JAVADOC_STUBS = CODEGEN_ADD_COMMENTS; //$NON-NLS-1$
 
   /**
    * A named preference that controls if a non-phpdoc comment gets added to methods generated via the 
@@ -2256,14 +2266,14 @@ public final static String EDITOR_TEXT_FONT= "net.sourceforge.phpdt.ui.editors.t
     store.setDefault(PreferenceConstants.CODEGEN_USE_GETTERSETTER_SUFFIX, false);
     store.setDefault(PreferenceConstants.CODEGEN_GETTERSETTER_PREFIX, "fg, f, _$, _, m_"); //$NON-NLS-1$
     store.setDefault(PreferenceConstants.CODEGEN_GETTERSETTER_SUFFIX, "_"); //$NON-NLS-1$
-    store.setDefault(PreferenceConstants.CODEGEN__JAVADOC_STUBS, true);
+    store.setDefault(PreferenceConstants.CODEGEN_ADD_COMMENTS, true);
     store.setDefault(PreferenceConstants.CODEGEN__NON_JAVADOC_COMMENTS, false);
     store.setDefault(PreferenceConstants.CODEGEN__FILE_COMMENTS, false);
 
     // MembersOrderPreferencePage
     store.setDefault(PreferenceConstants.APPEARANCE_MEMBER_SORT_ORDER, "T,SI,SF,SM,I,F,C,M"); //$NON-NLS-1$
     // must add here to guarantee that it is the first in the listener list
-    // store.addPropertyChangeListener(PHPeclipsePlugin.getDefault().getMemberOrderPreferenceCache());
+    store.addPropertyChangeListener(PHPeclipsePlugin.getDefault().getMemberOrderPreferenceCache());
 
     // PHPEditorPreferencePage
     /*
index 582eda6..0d8a251 100644 (file)
@@ -18,6 +18,7 @@ import net.sourceforge.phpdt.core.IBuffer;
 import net.sourceforge.phpdt.core.ICompilationUnit;
 import net.sourceforge.phpdt.core.IJavaElement;
 import net.sourceforge.phpdt.core.IPackageFragment;
+import net.sourceforge.phpdt.core.IPackageFragmentRoot;
 import net.sourceforge.phpdt.core.ISourceRange;
 import net.sourceforge.phpdt.core.IType;
 import net.sourceforge.phpdt.core.ToolFactory;
@@ -28,6 +29,7 @@ import net.sourceforge.phpdt.externaltools.internal.ui.StatusInfo;
 import net.sourceforge.phpdt.internal.corext.codemanipulation.StubUtility;
 import net.sourceforge.phpdt.internal.corext.template.php.JavaContext;
 import net.sourceforge.phpdt.internal.corext.template.php.Templates;
+import net.sourceforge.phpdt.internal.corext.util.JavaModelUtil;
 import net.sourceforge.phpdt.internal.ui.PHPUiImages;
 import net.sourceforge.phpdt.internal.ui.util.SWTUtil;
 import net.sourceforge.phpdt.internal.ui.wizards.NewWizardMessages;
@@ -43,6 +45,7 @@ import net.sourceforge.phpdt.internal.ui.wizards.dialogfields.Separator;
 import net.sourceforge.phpdt.internal.ui.wizards.dialogfields.StringButtonDialogField;
 import net.sourceforge.phpdt.internal.ui.wizards.dialogfields.StringButtonStatusDialogField;
 import net.sourceforge.phpdt.internal.ui.wizards.dialogfields.StringDialogField;
+import net.sourceforge.phpdt.ui.CodeGeneration;
 import net.sourceforge.phpdt.ui.PreferenceConstants;
 import net.sourceforge.phpeclipse.PHPeclipsePlugin;
 
@@ -1321,17 +1324,17 @@ public abstract class NewTypeWizardPage extends NewContainerWizardPage {
 //      if (!isInnerClass) {
         lineDelimiter = System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$
 //
-//        ICompilationUnit parentCU = pack.createCompilationUnit(clName + ".php", "", false, new SubProgressMonitor(monitor, 2)); //$NON-NLS-1$ //$NON-NLS-2$
+//         ICompilationUnit parentCU = pack.createCompilationUnit(clName + ".php", "", false, new SubProgressMonitor(monitor, 2)); //$NON-NLS-1$ //$NON-NLS-2$
 //        createdWorkingCopy = (ICompilationUnit) parentCU.getSharedWorkingCopy(null, JavaUI.getBufferFactory(), null);
 //
 //        imports = new ImportsStructure(createdWorkingCopy, prefOrder, threshold, false);
 //        // add an import that will be removed again. Having this import solves 14661
 //        imports.addImport(pack.getElementName(), getTypeName());
 //
-//        String typeContent = constructTypeStub(new ImportsManager(imports), lineDelimiter);
-//
+          String typeContent = constructTypeStub(lineDelimiter);//new ImportsManager(imports), lineDelimiter);
+
 //        String cuContent = constructCUContent(parentCU, typeContent, lineDelimiter);
-//
+
 //        createdWorkingCopy.getBuffer().setContents(cuContent);
 //
         createdType = createdWorkingCopy.getType(clName);
@@ -1493,25 +1496,25 @@ public abstract class NewTypeWizardPage extends NewContainerWizardPage {
   /*
    * Called from createType to construct the source for this type
    */
-  //   private String constructTypeStub(ImportsManager imports, String lineDelimiter) {        
-  //           StringBuffer buf= new StringBuffer();
-  //                   
-  //           int modifiers= getModifiers();
-  //           buf.append(Flags.toString(modifiers));
-  //           if (modifiers != 0) {
-  //                   buf.append(' ');
-  //           }
-  //           buf.append(fIsClass ? "class " : "interface "); //$NON-NLS-2$ //$NON-NLS-1$
-  //           buf.append(getTypeName());
-  //           writeSuperClass(buf, imports);
-  //           writeSuperInterfaces(buf, imports);     
-  //           buf.append('{');
-  //           buf.append(lineDelimiter);
-  //           buf.append(lineDelimiter);
-  //           buf.append('}');
-  //           buf.append(lineDelimiter);
-  //           return buf.toString();
-  //   }
+       private String constructTypeStub(String lineDelimiter) { // ImportsManager imports, String lineDelimiter) {     
+               StringBuffer buf= new StringBuffer();
+                       
+               int modifiers= getModifiers();
+               buf.append(Flags.toString(modifiers));
+               if (modifiers != 0) {
+                       buf.append(' ');
+               }
+               buf.append(fIsClass ? "class " : "interface "); //$NON-NLS-2$ //$NON-NLS-1$
+               buf.append(getTypeName());
+//             writeSuperClass(buf, imports);
+//             writeSuperInterfaces(buf, imports);     
+               buf.append('{');
+               buf.append(lineDelimiter);
+               buf.append(lineDelimiter);
+               buf.append('}');
+               buf.append(lineDelimiter);
+               return buf.toString();
+       }
 
   /**
    * @deprecated Overwrite createTypeMembers(IType, IImportsManager, IProgressMonitor) instead
@@ -1582,24 +1585,24 @@ public abstract class NewTypeWizardPage extends NewContainerWizardPage {
    * @return the type comment or <code>null</code> if a type comment 
    * is not desired
    */
-  //   protected String getTypeComment(ICompilationUnit parentCU) {
-  //           if (PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.CODEGEN_ADD_COMMENTS)) {
-  //                   try {
-  //                           StringBuffer typeName= new StringBuffer();
-  //                           if (isEnclosingTypeSelected()) {
-  //                                   typeName.append(JavaModelUtil.getTypeQualifiedName(getEnclosingType())).append('.');
-  //                           }
-  //                           typeName.append(getTypeName());
-  //                           String comment= CodeGeneration.getTypeComment(parentCU, typeName.toString(), String.valueOf('\n'));
-  //                           if (comment != null && isValidComment(comment)) {
-  //                                   return comment;
-  //                           }
-  //                   } catch (CoreException e) {
-  //                           PHPeclipsePlugin.log(e);
-  //                   }
-  //           }
-  //           return null;
-  //   }
+       protected String getTypeComment(ICompilationUnit parentCU) {
+               if (PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.CODEGEN_ADD_COMMENTS)) {
+                       try {
+                               StringBuffer typeName= new StringBuffer();
+                               if (isEnclosingTypeSelected()) {
+                                       typeName.append(JavaModelUtil.getTypeQualifiedName(getEnclosingType())).append('.');
+                               }
+                               typeName.append(getTypeName());
+                               String comment= CodeGeneration.getTypeComment(parentCU, typeName.toString(), String.valueOf('\n'));
+                               if (comment != null && isValidComment(comment)) {
+                                       return comment;
+                               }
+                       } catch (CoreException e) {
+                               PHPeclipsePlugin.log(e);
+                       }
+               }
+               return null;
+       }
 
   /**
    * @deprecated Use getTemplate(String,ICompilationUnit,int)
index 341a36a..b0b2811 100644 (file)
@@ -31,6 +31,7 @@ import net.sourceforge.phpdt.externaltools.internal.model.ColorManager;
 import net.sourceforge.phpdt.externaltools.internal.model.ExternalToolsPlugin;
 import net.sourceforge.phpdt.internal.core.BatchOperation;
 import net.sourceforge.phpdt.internal.core.JavaModelManager;
+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;
@@ -1530,7 +1531,7 @@ public class PHPeclipsePlugin extends AbstractUIPlugin implements
                if (fCodeTemplateContextTypeRegistry == null) {
                        fCodeTemplateContextTypeRegistry= new ContributionContextTypeRegistry();
                        
-//                     CodeTemplateContextType.registerContextTypes(fCodeTemplateContextTypeRegistry);
+                       CodeTemplateContextType.registerContextTypes(fCodeTemplateContextTypeRegistry);
                }
 
                return fCodeTemplateContextTypeRegistry;
index d172145..ea1a3fb 100644 (file)
@@ -17,6 +17,11 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.lang.reflect.InvocationTargetException;
 
+import net.sourceforge.phpdt.internal.corext.codemanipulation.StubUtility;
+import net.sourceforge.phpdt.internal.corext.template.php.CodeTemplateContext;
+import net.sourceforge.phpdt.internal.corext.template.php.CodeTemplateContextType;
+import net.sourceforge.phpeclipse.PHPeclipsePlugin;
+
 import org.eclipse.core.resources.IContainer;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IResource;
@@ -29,12 +34,14 @@ import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.text.templates.Template;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.wizard.Wizard;
 import org.eclipse.ui.INewWizard;
 import org.eclipse.ui.IWorkbench;
 import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWizard;
 import org.eclipse.ui.PartInitException;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.ide.IDE;
@@ -177,20 +184,36 @@ public class PHPFileWizard extends Wizard implements INewWizard {
    * We will initialize file contents with a sample text.
    */
   private InputStream openContentStream() {
-    StringBuffer contents = new StringBuffer("<?php\n\n");
-    contents.append("function f0() {\n\n");
-    contents.append("}\n\n");
-    contents.append("function f1() {\n\n");
-    contents.append("}\n\n");
-    contents.append("switch($func) {\n");
-    contents.append("    case \"f1\":\n");
-    contents.append("    f1();\n");
-    contents.append("    break;\n\n");
-    contents.append("    default:\n");
-    contents.append("    f0();\n");
-    contents.append("    break;\n\n");
-    contents.append("}\n\n?>");
-    return new ByteArrayInputStream(contents.toString().getBytes());
+       try {
+    Template template= PHPeclipsePlugin.getDefault().getCodeTemplateStore().findTemplate(CodeTemplateContextType.NEWTYPE);
+       if (template == null) {
+               return null;
+       }
+       String lineDelimiter = System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$
+       CodeTemplateContext context= new CodeTemplateContext(template.getContextTypeId(), null, lineDelimiter);
+//     context.setCompilationUnitVariables(cu);
+
+
+    return new ByteArrayInputStream(StubUtility.evaluateTemplate(context, template).getBytes());
+  } catch (CoreException e) {
+    e.printStackTrace();
+    return null;
+  }
+    
+//    StringBuffer contents = new StringBuffer("<?php\n\n");
+//    contents.append("function f0() {\n\n");
+//    contents.append("}\n\n");
+//    contents.append("function f1() {\n\n");
+//    contents.append("}\n\n");
+//    contents.append("switch($func) {\n");
+//    contents.append("    case \"f1\":\n");
+//    contents.append("    f1();\n");
+//    contents.append("    break;\n\n");
+//    contents.append("    default:\n");
+//    contents.append("    f0();\n");
+//    contents.append("    break;\n\n");
+//    contents.append("}\n\n?>");
+//    return new ByteArrayInputStream(contents.toString().getBytes());
   }
 
   private void throwCoreException(String message) throws CoreException {
index 645b950..45d2b09 100644 (file)
  * ${see_to_overridden}
  */</template>
 
-<template name="newtype" id="net.sourceforge.phpdt.ui.text.codetemplates.newtype" description="%CodeTemplates.newfile" context="newtype_context" enabled="true">/*
+<template name="newtype" id="net.sourceforge.phpdt.ui.text.codetemplates.newtype" description="%CodeTemplates.newfile" context="newtype_context" enabled="true">&lt;?php
+/*
  * %CodeTemplates.newfile.content1
  *
- * ${todo} %CodeTemplates.newfile.content2
+ * %CodeTemplates.newfile.content2
  * %CodeTemplates.newfile.content3
  */
-${package_declaration}
-
-${typecomment}
-${type_declaration}</template>
+?&gt;
+</template>
 
 <template name="catchblock" id="net.sourceforge.phpdt.ui.text.codetemplates.catchblock" description="%CodeTemplates.catchblock" context="catchblock_context" enabled="true">// ${todo} %CodeTemplates.catchblock.tododesc
 ${exception_var}.printStackTrace();</template>
@@ -64,7 +63,7 @@ ${body_statement}</template>
 
 <template name="constructorbody" id="net.sourceforge.phpdt.ui.text.codetemplates.constructorbody" description="%CodeTemplates.constructorstub" context="constructorbody_context" enabled="true">${body_statement}
 // ${todo} %CodeTemplates.constructorstub.tododesc</template>
-
 <template name="getterbody" id="net.sourceforge.phpdt.ui.text.codetemplates.getterbody" description="%CodeTemplates.getterstub" context="getterbody_context" enabled="true">return ${field};</template>
 
 <template name="setterbody" id="net.sourceforge.phpdt.ui.text.codetemplates.setterbody" description="%CodeTemplates.setterstub" context="setterbody_context" enabled="true">${field} = ${param};</template>
index ca68397..a0c3f56 100644 (file)
@@ -134,7 +134,7 @@ CodeTemplates.overridecomment.nonjd=(non-Javadoc)
 # ! Do not translate ${date} !
 CodeTemplates.newfile.content1=Created on ${date}
 CodeTemplates.newfile.content2=To change the template for this generated file go to
-CodeTemplates.newfile.content3=Window - Preferences - Java - Code Style - Code Templates
+CodeTemplates.newfile.content3=Window - Preferences - PHPeclipse - PHP - Code Templates
 
 CodeTemplates.catchblock.tododesc=Auto-generated catch block
 CodeTemplates.methodstub.tododesc=Auto-generated method stub