/******************************************************************************* * Copyright (c) 2004, 2010 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.internal.ui.dialogs.cpaths; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IPath; /** * @deprecated as of CDT 4.0. This class was used for property pages * for 3.X style projects. */ @Deprecated public class CPElementGroup { private CPElement parent; private final int kind; private IResource resource; private Map<Integer, List<CPElement>> childrenListMap; private List<CPElement> childrenList; public CPElementGroup(IResource resource) { this.kind = -1; this.resource = resource; this.childrenListMap = new LinkedHashMap<Integer, List<CPElement>>(2); } public CPElementGroup(CPElement parent, int kind) { this.parent = parent; this.kind = kind; this.childrenList = new ArrayList<CPElement>(); } public IResource getResource() { return resource; } public IPath getPath() { return resource != null ? resource.getFullPath() : parent.getPath(); } public CPElement getParent() { return parent; } public int getEntryKind() { return kind; } @Override public boolean equals(Object arg0) { if (arg0 == this) { return true; } if (arg0 instanceof CPElementGroup) { CPElementGroup other = (CPElementGroup)arg0; return (kind == other.kind && ( (parent == null && other.parent == null) || parent.equals(other.parent)) && ( (resource == null && other.resource == null) || resource.equals(other.resource))); } return false; } @Override public int hashCode() { int hashCode = parent != null ? parent.hashCode() : 0; hashCode += resource != null ? resource.hashCode() : 0; return hashCode + kind; } public int indexof(CPElement element) { List<CPElement> children = getChildrenList(element.getEntryKind(), false); return children != null ? children.indexOf(element) : -1; } public void addChild(CPElement element, int insertIndex) { List<CPElement> children = getChildrenList(element.getEntryKind(), true); children.add(insertIndex, element); element.setParent(this); } public void addChild(CPElement element) { List<CPElement> children = getChildrenList(element.getEntryKind(), true); int indx = children.indexOf(element); if (indx == -1) { indx = children.size(); if (element.getInherited() == null) { for (int i = 0; i < children.size(); i++) { CPElement next = children.get(i); if (next.getInherited() != null) { indx = i; break; } } } children.add(indx, element); element.setParent(this); } else { // add element with closes matching resource path. CPElement other = children.get(indx); if (other.getInherited() != null && element.getInherited() != null) { IPath otherPath = other.getInherited().getPath(); IPath elemPath = element.getInherited().getPath(); if (!otherPath.equals(elemPath) && otherPath.isPrefixOf(elemPath)) { children.remove(indx); other.setParent(null); children.add(element); element.setParent(this); } } } } public void setChildren(CPElement[] elements) { if (elements.length > 0) { if (childrenListMap != null) { childrenListMap.put(new Integer(elements[0].getEntryKind()), new ArrayList<CPElement>(Arrays.asList(elements))); } else { childrenList = new ArrayList<CPElement>(Arrays.asList(elements)); } } } public void addChildren(CPElement[] elements) { for (CPElement element : elements) { addChild(element); } } public boolean removeChild(CPElement element) { List<CPElement> children = getChildrenList(element.getEntryKind(), false); if (children == null) { return false; } boolean removed = children.remove(element); if (removed) { element.setParent(null); } return removed; } public CPElement[] getChildren(int kind) { List<CPElement> children = getChildrenList(kind, true); return children.toArray(new CPElement[children.size()]); } public CPElement[] getChildren() { if (childrenList != null) { return childrenList.toArray(new CPElement[childrenList.size()]); } Collection<List<CPElement>> lists = childrenListMap.values(); Iterator<List<CPElement>> iter = lists.iterator(); List<CPElement> children = new ArrayList<CPElement>(); while (iter.hasNext()) { children.addAll(iter.next()); } return children.toArray(new CPElement[children.size()]); } public boolean contains(CPElement element) { List<CPElement> children = getChildrenList(element.getEntryKind(), false); if (children == null) { return false; } return children.contains(element); } public void replaceChild(CPElement element, CPElement replaceWith) { List<CPElement> children = getChildrenList(element.getEntryKind(), false); if (children == null) { return; } int idx = children.indexOf(element); if (idx != -1) { children.remove(idx); children.add(idx, replaceWith); } } private List<CPElement> getChildrenList(int kind, boolean create) { List<CPElement> children = null; if (childrenList != null) { children = childrenList; } else { children = childrenListMap.get(new Integer(kind)); if (children == null && create) { children = new ArrayList<CPElement>(); childrenListMap.put(new Integer(kind), children); } } return children; } }