3m9 compatible;
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / core / PackageFragment.java
index 2b559f5..ea8f6b4 100644 (file)
  *******************************************************************************/
 package net.sourceforge.phpdt.internal.core;
 
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Map;
+
 import net.sourceforge.phpdt.core.ICompilationUnit;
 import net.sourceforge.phpdt.core.IJavaElement;
-import net.sourceforge.phpdt.core.IJavaProject;
 import net.sourceforge.phpdt.core.IPackageFragment;
 import net.sourceforge.phpdt.core.IPackageFragmentRoot;
 import net.sourceforge.phpdt.core.JavaModelException;
+import net.sourceforge.phpdt.internal.core.util.Util;
+import net.sourceforge.phpdt.internal.ui.util.PHPFileUtil;
 
 import org.eclipse.core.resources.IContainer;
 import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.Path;
 
@@ -31,31 +38,91 @@ public class PackageFragment extends Openable implements IPackageFragment {
         * Constant empty list of compilation units
         */
        protected static ICompilationUnit[] fgEmptyCompilationUnitList= new ICompilationUnit[] {};
-/**
- * Constructs a handle for a package fragment
- *
- * @see IPackageFragment
- */
-protected PackageFragment(IPackageFragmentRoot root, String name) {
-       super(PACKAGE_FRAGMENT, null, name);
-}
-/**
- * Compute the children of this package fragment.
- *
- * <p>Package fragments which are folders recognize files based on the
- * type of the fragment
- * <p>Package fragments which are in a jar only recognize .class files (
- * @see JarPackageFragment).
- */
+       /**
+        * Constructs a handle for a package fragment
+        *
+        * @see IPackageFragment
+        */
+       protected PackageFragment(PackageFragmentRoot root, String name) {
+               super(root, name);
+       }
+       /**
+        * @see Openable
+        */
+       protected boolean buildStructure(OpenableElementInfo info, IProgressMonitor pm, Map newElements, IResource underlyingResource) throws JavaModelException {
+
+               // check whether this pkg can be opened
+               if (!underlyingResource.isAccessible()) throw newNotPresentException();
+
+               int kind = getKind();
+               String extType;
+//             if (kind == IPackageFragmentRoot.K_SOURCE) {
+                       extType = "php"; //EXTENSION_java;
+//             } else {
+//                     extType = EXTENSION_class;
+//             }
+
+               // add compilation units/class files from resources
+               HashSet vChildren = new HashSet();
+               try {
+                   PackageFragmentRoot root = getPackageFragmentRoot();
+//                     char[][] inclusionPatterns = root.fullInclusionPatternChars();
+                       char[][] exclusionPatterns = root.fullExclusionPatternChars();
+                       IResource[] members = ((IContainer) underlyingResource).members();
+                       for (int i = 0, max = members.length; i < max; i++) {
+                               IResource child = members[i];
+                               if (child.getType() != IResource.FOLDER
+                                               && !Util.isExcluded(child, exclusionPatterns)) {
+                                       String extension = child.getProjectRelativePath().getFileExtension();
+                                       if (extension != null) {
+                                               if (extension.equalsIgnoreCase(extType)) {
+                                                       IJavaElement childElement;
+//                                                     if (kind == IPackageFragmentRoot.K_SOURCE && Util.isValidCompilationUnitName(child.getName())) {
+//                                                             childElement = new CompilationUnit(this, child.getName(), DefaultWorkingCopyOwner.PRIMARY);
+//                                                             vChildren.add(childElement);
+//                                                     } else if (Util.isValidClassFileName(child.getName())) {
+//                                                             childElement = getClassFile(child.getName());
+//                                                             vChildren.add(childElement);
+//                                                     }
+                                               }
+                                       }
+                               }
+                       }
+               } catch (CoreException e) {
+                       throw new JavaModelException(e);
+               }
+               
+//             if (kind == IPackageFragmentRoot.K_SOURCE) {
+//                     // add primary compilation units
+//                     ICompilationUnit[] primaryCompilationUnits = getCompilationUnits(DefaultWorkingCopyOwner.PRIMARY);
+//                     for (int i = 0, length = primaryCompilationUnits.length; i < length; i++) {
+//                             ICompilationUnit primary = primaryCompilationUnits[i];
+//                             vChildren.add(primary);
+//                     }
+//             }
+               
+               IJavaElement[] children = new IJavaElement[vChildren.size()];
+               vChildren.toArray(children);
+               info.setChildren(children);
+               return true;
+       }
+///**
+// * Compute the children of this package fragment.
+// *
+// * <p>Package fragments which are folders recognize files based on the
+// * type of the fragment
+// * <p>Package fragments which are in a jar only recognize .class files (
+// * @see JarPackageFragment).
+// */
 //protected boolean computeChildren(OpenableElementInfo info, IResource resource) throws JavaModelException {
 //     ArrayList vChildren = new ArrayList();
-//     int kind = getKind();
+////   int kind = getKind();
 //     String extType;
-//     if (kind == IPackageFragmentRoot.K_SOURCE) {
-//             extType = "java"; //$NON-NLS-1$
-//     } else {
-//             extType = "class"; //$NON-NLS-1$
-//     }
+////   if (kind == IPackageFragmentRoot.K_SOURCE) {
+//             extType = "php"; //$NON-NLS-1$
+////   } else {
+////           extType = "class"; //$NON-NLS-1$
+////   }
 //     try {
 //             char[][] exclusionPatterns = ((PackageFragmentRoot)getPackageFragmentRoot()).fullExclusionPatternChars();
 //             IResource[] members = ((IContainer) resource).members();
@@ -67,13 +134,13 @@ protected PackageFragment(IPackageFragmentRoot root, String name) {
 //                             if (extension != null) {
 //                                     if (extension.equalsIgnoreCase(extType)) {
 //                                             IJavaElement childElement;
-//                                             if (kind == IPackageFragmentRoot.K_SOURCE && Util.isValidCompilationUnitName(child.getName())) {
-//                                                     childElement = getCompilationUnit(child.getName());
-//                                                     vChildren.add(childElement);
-//                                             } else if (Util.isValidClassFileName(child.getName())) {
-//                                                     childElement = getClassFile(child.getName());
-//                                                     vChildren.add(childElement);
-//                                             }
+////                                           if (kind == IPackageFragmentRoot.K_SOURCE && Util.isValidCompilationUnitName(child.getName())) {
+////                                                   childElement = getCompilationUnit(child.getName());
+////                                                   vChildren.add(childElement);
+////                                           } else if (Util.isValidClassFileName(child.getName())) {
+////                                                   childElement = getClassFile(child.getName());
+////                                                   vChildren.add(childElement);
+////                                           }
 //                                     }
 //                             }
 //                     }
@@ -124,9 +191,9 @@ public ICompilationUnit createCompilationUnit(String name, String contents, bool
 /**
  * @see JavaElement
  */
-//protected OpenableElementInfo createElementInfo() {
-//     return new PackageFragmentInfo();
-//}
+protected Object createElementInfo() {
+       return new PackageFragmentInfo();
+}
 /**
  * @see ISourceManipulation
  */
@@ -134,9 +201,9 @@ public ICompilationUnit createCompilationUnit(String name, String contents, bool
 //     IJavaElement[] elements = new IJavaElement[] {this};
 //     getJavaModel().delete(elements, force, monitor);
 //}
-/**
- * @see Openable
- */
+///**
+// * @see Openable
+// */
 //protected boolean generateInfos(OpenableElementInfo info, IProgressMonitor pm, Map newElements, IResource underlyingResource) throws JavaModelException {
 //     
 //     return computeChildren(info, underlyingResource);
@@ -166,23 +233,33 @@ public ICompilationUnit createCompilationUnit(String name, String contents, bool
 //}
 /**
  * @see IPackageFragment#getCompilationUnit(String)
+ * @exception IllegalArgumentExcpetion if the name does not end with ".java"
  */
-public ICompilationUnit getCompilationUnit(String name) {
-       return new CompilationUnit(this, name);
+public ICompilationUnit getCompilationUnit(String cuName) {
+       if (!  PHPFileUtil.isPHPFileName(cuName)) {
+               throw new IllegalArgumentException(Util.bind("convention.unit.notJavaName")); //$NON-NLS-1$
+       }
+       return new CompilationUnit(this, cuName, DefaultWorkingCopyOwner.PRIMARY);
 }
 /**
  * @see IPackageFragment#getCompilationUnits()
  */
-//public ICompilationUnit[] getCompilationUnits() throws JavaModelException {
-//     if (getKind() == IPackageFragmentRoot.K_BINARY) {
-//             return fgEmptyCompilationUnitList;
-//     }
-//     
-//     ArrayList list = getChildrenOfType(COMPILATION_UNIT);
-//     ICompilationUnit[] array= new ICompilationUnit[list.size()];
-//     list.toArray(array);
-//     return array;
-//}
+public ICompilationUnit[] getCompilationUnits() throws JavaModelException {
+       if (getKind() == IPackageFragmentRoot.K_BINARY) {
+               return fgEmptyCompilationUnitList;
+       }
+       
+       ArrayList list = getChildrenOfType(COMPILATION_UNIT);
+       ICompilationUnit[] array= new ICompilationUnit[list.size()];
+       list.toArray(array);
+       return array;
+}
+/**
+ * @see IJavaElement
+ */
+public int getElementType() {
+       return PACKAGE_FRAGMENT;
+}
 /**
  * @see JavaElement#getHandleMementoDelimiter()
  */
@@ -192,9 +269,9 @@ protected char getHandleMementoDelimiter() {
 /**
  * @see IPackageFragment#getKind()
  */
-//public int getKind() throws JavaModelException {
-//     return ((IPackageFragmentRoot)getParent()).getKind();
-//}
+public int getKind() throws JavaModelException {
+       return ((IPackageFragmentRoot)getParent()).getKind();
+}
 /**
  * Returns an array of non-java resources contained in the receiver.
  */
@@ -209,14 +286,14 @@ protected char getHandleMementoDelimiter() {
 /**
  * @see IJavaElement#getPath()
  */
-//public IPath getPath() {
-//     PackageFragmentRoot root = this.getPackageFragmentRoot();
-//     if (root.isArchive()) {
-//             return root.getPath();
-//     } else {
-//             return root.getPath().append(this.getElementName().replace('.', '/'));
-//     }
-//}
+public IPath getPath() {
+       PackageFragmentRoot root = this.getPackageFragmentRoot();
+       if (root.isArchive()) {
+               return root.getPath();
+       } else {
+               return root.getPath().append(this.getElementName().replace('.', '/'));
+       }
+}
 /**
  * @see IJavaElement#getResource()
  */
@@ -237,7 +314,7 @@ public IResource getResource() {
  * @see IJavaElement#getUnderlyingResource()
  */
 public IResource getUnderlyingResource() throws JavaModelException {
-       IResource rootResource = fParent.getUnderlyingResource();
+       IResource rootResource = parent.getUnderlyingResource();
        if (rootResource == null) {
                //jar package fragment root that has no associated resource
                return null;
@@ -328,15 +405,15 @@ public boolean isDefaultPackage() {
 //     String[] renamings= new String[] {name};
 //     getJavaModel().rename(elements, dests, renamings, force, monitor);
 //}
-/*
- * @see JavaElement#rootedAt(IJavaProject)
- */
-public IJavaElement rootedAt(IJavaProject project) {
-       return
-               new PackageFragment(
-                       (IPackageFragmentRoot)((JavaElement)fParent).rootedAt(project), 
-                       fName);
-}
+///*
+// * @see JavaElement#rootedAt(IJavaProject)
+// */
+//public IJavaElement rootedAt(IJavaProject project) {
+//     return
+//             new PackageFragment(
+//                     (IPackageFragmentRoot)((JavaElement)parent).rootedAt(project), 
+//                     name);
+//}
 /**
  * Debugging purposes
  */