/******************************************************************************* * Copyright (c) 2002, 2009 QNX Software Systems 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: * QNX Software Systems - Initial API and implementation *******************************************************************************/ package org.eclipse.cdt.ui; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.cdt.core.model.CModelException; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.IMember; import org.eclipse.cdt.core.model.INamespace; import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.internal.ui.MembersGrouping; /** * NamespacesGrouping * * @noextend This class is not intended to be subclassed by clients. */ public class NamespacesGrouping extends CElementGrouping { protected ITranslationUnit fUnit; protected String fName; private final boolean fMemberGrouping; public NamespacesGrouping(ITranslationUnit unit, INamespace namespace) { this(unit, namespace, false); } /** * Create new namespace grouping and optional member grouping. * * @param unit the parent translation unit * @param namespace the namespace * @param memberGrouping whether member grouping is enabled * @since 5.1 */ public NamespacesGrouping(ITranslationUnit unit, INamespace namespace, boolean memberGrouping) { super(CElementGrouping.NAMESPACE_GROUPING); fUnit = unit; fName = namespace.getElementName(); fMemberGrouping = memberGrouping; } @Override public String getLabel(Object object) { return fName; } /* (non-Javadoc) * @see org.eclipse.ui.model.IWorkbenchAdapter#getChildren(java.lang.Object) */ @Override public Object[] getChildren(Object object) { Set<Object> list = new LinkedHashSet<Object>(); try { INamespace[] namespaces = getNamespaces(); for (INamespace iNamespace : namespaces) { list.addAll(getNamespaceChildren(iNamespace)); } } catch (CModelException exc) { // ignore at this point } return list.toArray(); } /** * @since 5.1 */ public INamespace[] getNamespaces() { List<INamespace> list = new ArrayList<INamespace>(); try { List<ICElement> namespaces = fUnit.getChildrenOfType(ICElement.C_NAMESPACE); for (ICElement icElement : namespaces) { if (fName.equals(icElement.getElementName())) { INamespace nspace = (INamespace) icElement; list.add(nspace); } } } catch (CModelException exc) { // ignore at this point } return list.toArray(new INamespace[list.size()]); } private Collection<Object> getNamespaceChildren(INamespace nspace) throws CModelException { Object[] children = nspace.getChildren(); if (!fMemberGrouping) { return Arrays.asList(children); } List<Object> list = new ArrayList<Object>(children.length); // check if there is another member with the same namespace for the same parent Map<String, MembersGrouping> map = new HashMap<String, MembersGrouping>(); for (int i = 0; i < children.length; ++i) { if (children[i] instanceof IMember) { final ICElement member = (ICElement)children[i]; String name = member.getElementName(); int idx = name.lastIndexOf("::"); //$NON-NLS-1$ if (idx < 0) { continue; } String namespace = name.substring(0, idx); MembersGrouping memberGrouping = map.get(namespace); if (memberGrouping == null) { memberGrouping = new MembersGrouping(this, namespace); map.put(namespace, memberGrouping); list.add(memberGrouping); } } else { list.add(children[i]); } } return list; } /* (non-Javadoc) * @see org.eclipse.ui.model.IWorkbenchAdapter#getParent(java.lang.Object) */ @Override public Object getParent(Object object) { return fUnit; } /** * @param nspace * @deprecated */ @Deprecated public void addNamespace(INamespace nspace) { } /* (non-Javadoc) * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj instanceof NamespacesGrouping) { NamespacesGrouping other = (NamespacesGrouping)obj; return fUnit.equals(other.fUnit) && fName.equals(other.fName); } return false; } /* * @see java.lang.Object#hashCode() */ @Override public int hashCode() { return fUnit.hashCode() * 17 + fName.hashCode(); } /* * @see org.eclipse.cdt.ui.CElementGrouping#toString() */ @Override public String toString() { return fName; } }