protected IModelElement findInputForJavaElement(IModelElement je) { // null check has to take place here as well (not only in // findInputForJavaElement(IJavaElement, boolean) since we // are accessing the Java element if (je == null) return null; if (je.getElementType() == IModelElement.PROJECT_FRAGMENT || je.getElementType() == IModelElement.SCRIPT_PROJECT) return findInputForJavaElement(je, true); else return findInputForJavaElement(je, false); }
public boolean isModelChangesProvidedFor(IModelElement modelElement, String name) { IScriptProject project = modelElement.getScriptProject(); if (!"ModelMembersq".equals(project.getElementName())) { return false; } if (modelElement.getElementType() == IModelElement.PROJECT_FRAGMENT) { return true; } return false; }
@Override public void processDelta(IModelElementDelta delta) { if (this.needsInitialize) return; IModelElement element = delta.getElement(); switch (element.getElementType()) { case IModelElement.SCRIPT_MODEL: IModelElementDelta[] children = delta.getAffectedChildren(); for (int i = 0, length = children.length; i < length; i++) { IModelElementDelta child = children[i]; this.processDelta(child); } break; case IModelElement.SCRIPT_PROJECT: int kind = delta.getKind(); switch (kind) { case IModelElementDelta.ADDED: case IModelElementDelta.REMOVED: this.needsInitialize = true; break; case IModelElementDelta.CHANGED: int flags = delta.getFlags(); if ((flags & IModelElementDelta.F_CLOSED) != 0 || (flags & IModelElementDelta.F_OPENED) != 0) { this.needsInitialize = true; } else { children = delta.getAffectedChildren(); for (int i = 0, length = children.length; i < length; i++) { IModelElementDelta child = children[i]; this.processDelta(child); } } break; } break; case IModelElement.PROJECT_FRAGMENT: kind = delta.getKind(); switch (kind) { case IModelElementDelta.ADDED: case IModelElementDelta.REMOVED: this.needsInitialize = true; break; case IModelElementDelta.CHANGED: int flags = delta.getFlags(); if ((flags & IModelElementDelta.F_ADDED_TO_BUILDPATH) > 0 || (flags & IModelElementDelta.F_REMOVED_FROM_BUILDPATH) > 0) { this.needsInitialize = true; } break; } break; } }
public void provideModelChanges(IModelElement parentElement, List children) { IScriptProject project = parentElement.getScriptProject(); if (!"ModelMembersq".equals(project.getElementName())) { return; } switch (parentElement.getElementType()) { case IModelElement.PROJECT_FRAGMENT: List addon = new ArrayList(); for (Iterator iterator = children.iterator(); iterator.hasNext(); ) { IModelElement el = (IModelElement) iterator.next(); if (el.getElementType() == IModelElement.SCRIPT_FOLDER) { addon.add( new TestFolder( (ModelElement) parentElement, el.getPath().removeFirstSegments(el.getParent().getPath().segmentCount()))); } } children.addAll(addon); break; case IModelElement.SCRIPT_FOLDER: break; } }
/* * (non-Javadoc) * * @see org.eclipse.jdt.internal.ui.browsing.JavaBrowsingPart#findElementToSelect(org.eclipse.jdt.core.IJavaElement) */ protected IModelElement findElementToSelect(IModelElement je) { if (je == null) return null; switch (je.getElementType()) { case IModelElement.SCRIPT_FOLDER: return je; case IModelElement.SOURCE_MODULE: return ((ISourceModule) je).getParent(); case IModelElement.TYPE: return ((IType) je).getScriptFolder(); default: return findElementToSelect(je.getParent()); } }
/** * Returns all of the openables defined in the region of this type hierarchy. Returns a map from * IJavaProject to ArrayList of Openable */ private HashMap determineOpenablesInRegion(IProgressMonitor monitor) { try { HashMap allOpenables = new HashMap(); IModelElement[] roots = ((RegionBasedTypeHierarchy) this.hierarchy).region.getElements(); int length = roots.length; if (monitor != null) { monitor.beginTask("", length); // $NON-NLS-1$ } for (int i = 0; i < length; i++) { IModelElement root = roots[i]; IScriptProject javaProject = root.getScriptProject(); ArrayList openables = (ArrayList) allOpenables.get(javaProject); if (openables == null) { openables = new ArrayList(); allOpenables.put(javaProject, openables); } switch (root.getElementType()) { case IModelElement.SCRIPT_PROJECT: injectAllOpenablesForJavaProject((IScriptProject) root, openables); break; case IModelElement.PROJECT_FRAGMENT: injectAllOpenablesForPackageFragmentRoot((IProjectFragment) root, openables); break; case IModelElement.SCRIPT_FOLDER: injectAllOpenablesForPackageFragment((IScriptFolder) root, openables); break; case IModelElement.SOURCE_MODULE: openables.add(root); break; case IModelElement.TYPE: IType type = (IType) root; openables.add(type.getSourceModule()); break; default: break; } worked(monitor, 1); } return allOpenables; } finally { if (monitor != null) { monitor.done(); } } }
private static boolean hasReadOnlyResourcesAndSubResources(IModelElement modelElement) throws CoreException { switch (modelElement.getElementType()) { case IModelElement.SOURCE_MODULE: IResource resource = ReorgUtils.getResource(modelElement); return (resource != null && Resources.isReadOnly(resource)); case IModelElement.SCRIPT_FOLDER: IResource packResource = ReorgUtils.getResource(modelElement); if (packResource == null) return false; IScriptFolder pack = (IScriptFolder) modelElement; if (Resources.isReadOnly(packResource)) return true; Object[] nonScript = pack.getForeignResources(); for (int i = 0; i < nonScript.length; i++) { Object object = nonScript[i]; if (object instanceof IResource && hasReadOnlyResourcesAndSubResources((IResource) object)) return true; } return hasReadOnlyResourcesAndSubResources(pack.getChildren()); case IModelElement.PROJECT_FRAGMENT: IProjectFragment root = (IProjectFragment) modelElement; if (root.isArchive()) return false; IResource pfrResource = ReorgUtils.getResource(modelElement); if (pfrResource == null) return false; if (Resources.isReadOnly(pfrResource)) return true; Object[] nonScript1 = root.getForeignResources(); for (int i = 0; i < nonScript1.length; i++) { Object object = nonScript1[i]; if (object instanceof IResource && hasReadOnlyResourcesAndSubResources((IResource) object)) return true; } return hasReadOnlyResourcesAndSubResources(root.getChildren()); case IModelElement.FIELD: // case IModelElement.IMPORT_CONTAINER: // case IModelElement.IMPORT_DECLARATION: // case IModelElement.INITIALIZER: case IModelElement.METHOD: // case IModelElement.PACKAGE_DECLARATION: case IModelElement.TYPE: return false; default: Assert.isTrue(false); // not handled here return false; } }
protected IModelElement findInputForJavaElement(IModelElement je, boolean canChangeInputType) { if (je == null || !je.exists()) return null; if (isValidInput(je)) { // don't update if input must be project (i.e. project is used as // source folder) if (canChangeInputType) fLastInputWasProject = je.getElementType() == IModelElement.SCRIPT_PROJECT; return je; } else if (fLastInputWasProject) { IProjectFragment packageFragmentRoot = (IProjectFragment) je.getAncestor(IModelElement.PROJECT_FRAGMENT); if (!packageFragmentRoot.isExternal()) return je.getScriptProject(); } return findInputForJavaElement(je.getParent(), canChangeInputType); }
private IPath getPath(IModelElement element, boolean relativeToRoot) { switch (element.getElementType()) { case IModelElement.SCRIPT_MODEL: return Path.EMPTY; case IModelElement.SCRIPT_PROJECT: return element.getPath(); case IModelElement.PROJECT_FRAGMENT: if (relativeToRoot) return Path.EMPTY; return element.getPath(); case IModelElement.SCRIPT_FOLDER: String relativePath = element.getElementName() + '/'; return getPath(element.getParent(), relativeToRoot).append(new Path(relativePath)); case IModelElement.SOURCE_MODULE: return getPath(element.getParent(), relativeToRoot) .append(new Path(element.getElementName())); default: return getPath(element.getParent(), relativeToRoot); } }
/* * Overridden from JavaBrowsingPart to handel LogicalPackages and tree * structure. * * @see org.eclipse.jdt.internal.ui.browsing.JavaBrowsingPart#adjustInputAndSetSelection(org.eclipse.jdt.core.IJavaElement) */ void adjustInputAndSetSelection(IModelElement je) { IModelElement jElementToSelect = findElementToSelect(je); LogicalPackagesProvider p = (LogicalPackagesProvider) fWrappedViewer.getContentProvider(); Object elementToSelect = jElementToSelect; if (jElementToSelect != null && jElementToSelect.getElementType() == IModelElement.SCRIPT_FOLDER) { IScriptFolder pkgFragment = (IScriptFolder) jElementToSelect; elementToSelect = p.findLogicalPackage(pkgFragment); if (elementToSelect == null) elementToSelect = pkgFragment; } IModelElement newInput = findInputForJavaElement(je); if (elementToSelect == null && !isValidInput(newInput)) setInput(null); else if (elementToSelect == null || getViewer().testFindItem(elementToSelect) == null) { // optimization, if you are in the same project but expansion hasn't // happened Object input = getViewer().getInput(); if (elementToSelect != null && newInput != null) { if (newInput.equals(input)) { getViewer().reveal(elementToSelect); // Adjust input to selection } else { setInput(newInput); getViewer().reveal(elementToSelect); } } else setInput(newInput); if (elementToSelect instanceof IScriptFolder) { IScriptFolder pkgFragment = (IScriptFolder) elementToSelect; elementToSelect = p.findLogicalPackage(pkgFragment); if (elementToSelect == null) elementToSelect = pkgFragment; } } ISelection selection; if (elementToSelect != null) selection = new StructuredSelection(elementToSelect); else selection = StructuredSelection.EMPTY; setSelection(selection, true); }
public void processDelta(IModelElementDelta delta) { switch (delta.getKind()) { case IModelElementDelta.CHANGED: IModelElementDelta[] children = delta.getAffectedChildren(); for (int i = 0, length = children.length; i < length; i++) { IModelElementDelta child = children[i]; this.processDelta(child); } break; case IModelElementDelta.REMOVED: IModelElement element = delta.getElement(); if (this.encloses(element)) { if (this.elements != null) { this.elements.remove(element); } IPath path = null; switch (element.getElementType()) { case IModelElement.SCRIPT_PROJECT: path = ((IScriptProject) element).getProject().getFullPath(); case IModelElement.PROJECT_FRAGMENT: if (path == null) { path = ((IProjectFragment) element).getPath(); } int toRemove = -1; for (int i = 0; i < this.pathsCount; i++) { if (this.relativePaths[i].equals(path.toString())) { toRemove = i; break; } } if (toRemove != -1) { this.relativePaths[toRemove] = null; rehash(); } } } break; } }
@Override public Image getImage(Object element) { IModelElement modelElement = null; if (element instanceof ExternalProjectFragment) { return PHPPluginImages.get(PHPPluginImages.IMG_OBJS_LIBRARY); } if (element instanceof IncludePath) { Object entry = ((IncludePath) element).getEntry(); // An included PHP project if (entry instanceof IBuildpathEntry) { int entryKind = ((IBuildpathEntry) entry).getEntryKind(); if (entryKind == IBuildpathEntry.BPE_PROJECT) { return PHPPluginImages.get(PHPPluginImages.IMG_OBJS_PHP_PROJECT); } // A library if (entryKind == IBuildpathEntry.BPE_LIBRARY || entryKind == IBuildpathEntry.BPE_CONTAINER) { return PHPPluginImages.get(PHPPluginImages.IMG_OBJS_LIBRARY); } } if (entry instanceof ExternalProjectFragment) { return PHPPluginImages.get(PHPPluginImages.IMG_OBJS_LIBRARY); } // Folder in the include path, should have same image as in the PHP // Explorer . if (entry instanceof IFolder) { IModelElement createdScriptFolder = DLTKCore.create((IFolder) entry); if (null == createdScriptFolder) return getImage(entry); return getImage(createdScriptFolder); } if (entry instanceof IResource) { return (getImage((IResource) entry)); } return null; } if (element instanceof IResource) { modelElement = DLTKCore.create((IResource) element); } else if (element instanceof IModelElement) { modelElement = (IModelElement) element; } if (modelElement != null) { IScriptProject project = modelElement.getScriptProject(); if (!project.isOnBuildpath(modelElement)) { // not in build path, // hence: hollow, // non-pakg icons if (modelElement.getElementType() == IModelElement.SOURCE_MODULE) return PHPPluginImages.get(PHPPluginImages.IMG_OBJS_CUNIT_RESOURCE); if (modelElement.getElementType() == IModelElement.PROJECT_FRAGMENT || modelElement.getElementType() == IModelElement.SCRIPT_FOLDER) return PHPPluginImages.get(PHPPluginImages.IMG_OBJS_PHP_FOLDER); } else { // in build path ... if (modelElement.getElementType() == IModelElement.SCRIPT_FOLDER || element instanceof IFolder) return PHPPluginImages.get(PHPPluginImages.IMG_OBJS_PHPFOLDER_ROOT); } } try { if (element instanceof IType && PHPFlags.isTrait(((IType) element).getFlags())) { return PHPPluginImages.get(PHPPluginImages.IMG_OBJS_TRAIT); } } catch (ModelException e) { } if (element != null) { for (ILabelProvider provider : TreeContentProviderRegistry.getInstance().getLabelProviders()) { Image image = provider.getImage(element); if (image != null) { return image; } } } return super.getImage(element); }
/** * Add an element to the script search scope. * * @param element The element we want to add to current script search scope * @throws ModelException May happen if some Script Model info are not available */ public void add(IModelElement element) throws ModelException { if (!natureFilter(element)) { return; } IPath containerPath = null; String containerPathToString = null; int includeMask = SOURCES | APPLICATION_LIBRARIES | SYSTEM_LIBRARIES; switch (element.getElementType()) { case IModelElement.SCRIPT_MODEL: // a workspace scope should be used break; case IModelElement.SCRIPT_PROJECT: add((ScriptProject) element, null, includeMask, new HashSet<IProject>(2), null); break; case IModelElement.PROJECT_FRAGMENT: IProjectFragment root = (IProjectFragment) element; String projectPath = null; if (!root.isExternal()) { IPath rootPath = root.getPath(); containerPath = root.getKind() == IProjectFragment.K_SOURCE ? root.getParent().getPath() : rootPath; containerPathToString = containerPath.toString(); IResource rootResource = root.getResource(); projectPath = root.getScriptProject().getPath().toString(); if (rootResource != null && rootResource.isAccessible()) { String relativePath = Util.relativePath(rootResource.getFullPath(), containerPath.segmentCount()); add(projectPath, relativePath, containerPathToString, false /* not a package */, null); } else { add( projectPath, org.eclipse.dltk.compiler.util.Util.EMPTY_STRING, containerPathToString, false /* not a package */, null); } } else { projectPath = root.getScriptProject().getPath().toString(); containerPath = root.getPath(); containerPathToString = containerPath.toString(); add( projectPath, org.eclipse.dltk.compiler.util.Util.EMPTY_STRING, containerPathToString, false /* not a package */, null); } break; case IModelElement.SCRIPT_FOLDER: root = (IProjectFragment) element.getParent(); projectPath = root.getScriptProject().getPath().toString(); if (root.isArchive()) { if (DLTKCore.DEBUG) { System.err.println("TODO: Check. Bug possible..."); // $NON-NLS-1$ } String relativePath = ((ModelElement) element).getPath().toString() + '/'; containerPath = root.getPath(); containerPathToString = containerPath.toString(); add(projectPath, relativePath, containerPathToString, true /* package */, null); } else { IResource resource = element.getResource(); if (resource != null) { if (resource.isAccessible()) { containerPath = root.getKind() == IProjectFragment.K_SOURCE ? root.getParent().getPath() : root.getPath(); } else { // for working copies, get resource container full path containerPath = resource.getParent().getFullPath(); } containerPathToString = containerPath.toString(); String relativePath = Util.relativePath(resource.getFullPath(), containerPath.segmentCount()); add(projectPath, relativePath, containerPathToString, true /* package */, null); } } break; default: // remember sub-cu (or sub-class file) script elements if (element instanceof IMember) { if (this.elements == null) { this.elements = new ArrayList<IModelElement>(); } this.elements.add(element); } root = (IProjectFragment) element.getAncestor(IModelElement.PROJECT_FRAGMENT); projectPath = root.getScriptProject().getPath().toString(); String relativePath; if (root.getKind() == IProjectFragment.K_SOURCE && !root.isExternal()) { containerPath = root.getParent().getPath(); relativePath = Util.relativePath(getPath(element, false /* full path */), 1 /* * remove * project * segmet */); } else { containerPath = root.getPath(); relativePath = getPath(element, true /* relative path */).toString(); } containerPathToString = containerPath.toString(); add(projectPath, relativePath, containerPathToString, false /* * not a * package */, null); } if (containerPath != null) addEnclosingProjectOrArchive(containerPath); }
/** * Processes a delta recursively. When more than two children are affected the tree is fully * refreshed starting at this node. * * @param delta the delta to process * @param runnables the resulting view changes as runnables (type {@link Runnable} ) * @return true is returned if the conclusion is to refresh a parent of an element. In that case * no siblings need to be processed * @throws JavaModelException thrown when the access to an element failed */ private boolean processDelta(final IModelElementDelta delta, final Collection<Runnable> runnables) throws ModelException { int kind = delta.getKind(); int flags = delta.getFlags(); IModelElement element = delta.getElement(); int elementType = element.getElementType(); if (elementType != IModelElement.SCRIPT_MODEL && elementType != IModelElement.SCRIPT_PROJECT) { IScriptProject proj = element.getScriptProject(); if (proj == null || !proj.getProject().isOpen()) { // TODO: Not needed if parent already did the 'open' check! return false; } } if (elementType == IModelElement.SCRIPT_FOLDER) { if ((flags & (IModelElementDelta.F_CONTENT | IModelElementDelta.F_CHILDREN)) == IModelElementDelta.F_CONTENT) { if (!fIsFlatLayout) { Object parent = getHierarchicalPackageParent((IScriptFolder) element); if (!(parent instanceof IProjectFragment)) { postRefresh(internalGetParent(parent), GRANT_PARENT, element, runnables); return true; } } // content change, without children info (for example resource // added/removed to class folder package) postRefresh(internalGetParent(element), PARENT, element, runnables); return true; } if (!fIsFlatLayout) { if (kind == IModelElementDelta.REMOVED) { final Object parent = getHierarchicalPackageParent((IScriptFolder) element); if (parent instanceof IProjectFragment) { postRemove(element, runnables); return false; } else { postRefresh(internalGetParent(parent), GRANT_PARENT, element, runnables); return true; } } else if (kind == IModelElementDelta.ADDED) { final Object parent = getHierarchicalPackageParent((IScriptFolder) element); if (parent instanceof IProjectFragment) { if (fFoldPackages) { postRefresh(parent, PARENT, element, runnables); return true; } else { postAdd(parent, element, runnables); return false; } } else { postRefresh(internalGetParent(parent), GRANT_PARENT, element, runnables); return true; } } handleAffectedChildren(delta, element, runnables); return false; } } if (elementType == IModelElement.SOURCE_MODULE) { ISourceModule cu = (ISourceModule) element; if (!ScriptModelUtil.isPrimary(cu)) { return false; } if (!getProvideMembers() && cu.isWorkingCopy() && kind == IModelElementDelta.CHANGED) { return false; } if (kind == IModelElementDelta.CHANGED && !isStructuralCUChange(flags)) { return false; // test moved ahead } if (!isOnClassPath(cu)) { // TODO: isOnClassPath expensive! Should // be put after all cheap tests return false; } } if (elementType == IModelElement.SCRIPT_PROJECT) { // handle open and closing of a project if ((flags & (IModelElementDelta.F_CLOSED | IModelElementDelta.F_OPENED)) != 0) { postRefresh(element, ORIGINAL, element, runnables); return false; } // if the class path has changed we refresh the entire project if ((flags & IModelElementDelta.F_BUILDPATH_CHANGED) != 0) { postRefresh(element, ORIGINAL, element, runnables); return false; } // if added it could be that the corresponding IProject is already // shown. Remove it first. // bug 184296 if (kind == IModelElementDelta.ADDED) { postRemove(element.getResource(), runnables); postAdd(element.getParent(), element, runnables); return false; } } if (kind == IModelElementDelta.REMOVED) { Object parent = internalGetParent(element); if (element instanceof IScriptFolder) { // refresh package fragment root to allow filtering empty // (parent) packages: bug 72923 if (fViewer.testFindItem(parent) != null) { postRefresh(parent, PARENT, element, runnables); } return true; } else if (element instanceof IProjectFragment && ((IProjectFragment) element).getKind() != IProjectFragment.K_SOURCE) { // libs and class folders can show up twice (in library // container and as resource at original location) IResource resource = element.getResource(); if (resource != null) postRemove(resource, runnables); } postRemove(element, runnables); if (parent instanceof IScriptFolder) { postUpdateIcon((IScriptFolder) parent, runnables); } // we are filtering out empty subpackages, so we // a package becomes empty we remove it from the viewer. if (isScriptFolderEmpty(element.getParent())) { if (fViewer.testFindItem(parent) != null) { postRefresh(internalGetParent(parent), GRANT_PARENT, element, runnables); } return true; } return false; } if (kind == IModelElementDelta.ADDED) { Object parent = internalGetParent(element); // we are filtering out empty subpackages, so we // have to handle additions to them specially. if (parent instanceof IScriptFolder) { Object grandparent = internalGetParent(parent); // 1GE8SI6: ITPJUI:WIN98 - Rename is not shown in Packages View // avoid posting a refresh to an invisible parent if (parent.equals(fInput)) { postRefresh(parent, PARENT, element, runnables); } else { // refresh from grandparent if parent isn't visible yet if (fViewer.testFindItem(parent) == null) { postRefresh(grandparent, GRANT_PARENT, element, runnables); } else { postRefresh(parent, PARENT, element, runnables); } } return true; } else { postAdd(parent, element, runnables); } } if (elementType == IModelElement.SOURCE_MODULE || elementType == IModelElement.BINARY_MODULE) { if (kind == IModelElementDelta.CHANGED) { // isStructuralCUChange already performed above postRefresh(element, ORIGINAL, element, runnables); } return false; } if (elementType == IModelElement.PROJECT_FRAGMENT) { // the contents of an external JAR or class folder has changed if ((flags & IModelElementDelta.F_ARCHIVE_CONTENT_CHANGED) != 0) { postRefresh(element, ORIGINAL, element, runnables); return false; } if ((flags & (IModelElementDelta.F_CONTENT | IModelElementDelta.F_CHILDREN)) == IModelElementDelta.F_CONTENT) { // content change, without children info (for example resource // added/removed to class folder package) postRefresh(internalGetParent(element), PARENT, element, runnables); return true; } // the source attachment of a JAR has changed // if ((flags & ( | IModelElementDelta.F_SOURCEDETACHED)) != 0) { // postUpdateIcon(element, runnables); // } if (isBuildPathChange(delta)) { // throw the towel and do a full refresh of the affected java // project. postRefresh(element.getScriptProject(), PROJECT, element, runnables); return true; } } handleAffectedChildren(delta, element, runnables); return false; }