| /******************************************************************************* |
| * Copyright (c) 2000, 2005 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jdt.internal.ui.browsing; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Item; |
| import org.eclipse.swt.widgets.Widget; |
| |
| import org.eclipse.jface.viewers.ITreeContentProvider; |
| import org.eclipse.jface.viewers.ViewerFilter; |
| |
| import org.eclipse.jdt.core.IPackageFragment; |
| import org.eclipse.jdt.core.JavaModelException; |
| |
| import org.eclipse.jdt.internal.ui.JavaPlugin; |
| import org.eclipse.jdt.internal.ui.viewsupport.ProblemTreeViewer; |
| |
| /** |
| * Special problem tree viewer to handle logical packages. |
| */ |
| public class PackagesViewTreeViewer extends ProblemTreeViewer implements IPackagesViewViewer{ |
| |
| public PackagesViewTreeViewer(Composite parent, int style) { |
| super(parent, style); |
| } |
| |
| /* |
| * @see org.eclipse.jface.viewers.StructuredViewer#mapElement(java.lang.Object, org.eclipse.swt.widgets.Widget) |
| */ |
| public void mapElement(Object element, Widget item) { |
| if (element instanceof LogicalPackage && item instanceof Item) { |
| LogicalPackage cp= (LogicalPackage) element; |
| IPackageFragment[] fragments= cp.getFragments(); |
| for (int i= 0; i < fragments.length; i++) { |
| IPackageFragment fragment= fragments[i]; |
| fResourceToItemsMapper.addToMap(fragment, (Item) item); |
| } |
| } |
| super.mapElement(element, item); |
| } |
| |
| /* |
| * @see org.eclipse.jface.viewers.StructuredViewer#unmapElement(java.lang.Object, org.eclipse.swt.widgets.Widget) |
| */ |
| public void unmapElement(Object element, Widget item) { |
| |
| if (element instanceof LogicalPackage && item instanceof Item) { |
| LogicalPackage cp= (LogicalPackage) element; |
| IPackageFragment[] fragments= cp.getFragments(); |
| for (int i= 0; i < fragments.length; i++) { |
| IPackageFragment fragment= fragments[i]; |
| fResourceToItemsMapper.removeFromMap((Object)fragment, (Item)item); |
| } |
| } |
| super.unmapElement(element, item); |
| } |
| |
| /* |
| * @see org.eclipse.jface.viewers.StructuredViewer#getFilteredChildren(java.lang.Object) |
| */ |
| protected Object[] getFilteredChildren(Object parent) { |
| List list= new ArrayList(); |
| Object[] result= getRawChildren(parent); |
| if (result != null) { |
| Object[] toBeFiltered= new Object[1]; |
| for (int i= 0; i < result.length; i++) { |
| Object object= result[i]; |
| toBeFiltered[0]= object; |
| if(object instanceof LogicalPackage) { |
| if(filterLogicalPackages((LogicalPackage)object)) |
| list.add(object); |
| } else if (isEssential(object) || filter(toBeFiltered).length == 1) |
| list.add(object); |
| } |
| } |
| return list.toArray(); |
| } |
| |
| |
| /* |
| * @see org.eclipse.jface.viewers.StructuredViewer#filter(java.lang.Object[]) |
| * @since 3.0 |
| */ |
| protected Object[] filter(Object[] elements) { |
| ViewerFilter[] filters= getFilters(); |
| if (filters == null || filters.length == 0) |
| return elements; |
| |
| ArrayList filtered= new ArrayList(elements.length); |
| Object root= getRoot(); |
| for (int i= 0; i < elements.length; i++) { |
| boolean add= true; |
| if (!isEssential(elements[i])) { |
| for (int j = 0; j < filters.length; j++) { |
| add= filters[j].select(this, root, |
| elements[i]); |
| if (!add) |
| break; |
| } |
| } |
| if (add) |
| filtered.add(elements[i]); |
| } |
| return filtered.toArray(); |
| } |
| |
| /* |
| * @see AbstractTreeViewer#isExpandable(java.lang.Object) |
| */ |
| public boolean isExpandable(Object parent) { |
| Object[] children= ((ITreeContentProvider)getContentProvider()).getChildren(parent); |
| Object[] toBeFiltered= new Object[1]; |
| for (int i = 0; i < children.length; i++) { |
| Object object= children[i]; |
| |
| if (isEssential(object)) |
| return true; |
| |
| toBeFiltered[0]= object; |
| Object[] filtered= filter(toBeFiltered); |
| if (filtered.length > 0) |
| return true; |
| } |
| return false; |
| } |
| |
| private boolean isEssential(Object object) { |
| try { |
| if (object instanceof IPackageFragment) { |
| IPackageFragment fragment= (IPackageFragment) object; |
| return !fragment.isDefaultPackage() && fragment.hasSubpackages(); |
| } |
| } catch (JavaModelException e) { |
| JavaPlugin.log(e); |
| } |
| |
| return false; |
| } |
| |
| private boolean filterLogicalPackages(LogicalPackage logicalPackage) { |
| IPackageFragment[] fragments= logicalPackage.getFragments(); |
| Object[] toBeFiltered= new Object[1]; |
| for (int i= 0; i < fragments.length; i++) { |
| IPackageFragment fragment= fragments[i]; |
| toBeFiltered[0]= fragment; |
| if(isEssential(fragment) || filter(toBeFiltered).length != 0) |
| return true; |
| } |
| return false; |
| } |
| |
| // --------- see: IPackagesViewViewer ---------- |
| |
| public Widget doFindItem(Object element) { |
| return super.doFindItem(element); |
| } |
| |
| public Widget doFindInputItem(Object element) { |
| return super.doFindInputItem(element); |
| } |
| |
| public List getSelectionFromWidget() { |
| return super.getSelectionFromWidget(); |
| } |
| |
| public void doUpdateItem(Widget item, Object element, boolean fullMap){ |
| super.doUpdateItem(item, element, fullMap); |
| } |
| |
| public void internalRefresh(Object element){ |
| super.internalRefresh(element); |
| } |
| |
| public void setSelectionToWidget(List l, boolean reveal){ |
| super.setSelectionToWidget(l, reveal); |
| } |
| } |