/******************************************************************************* * 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.core.internal.dtree; import org.eclipse.core.runtime.IPath; /** * A <code>DataDeltaNode</code> contains information that represents the differences between itself * and a node in another tree. Refer to the <code>DeltaDataTree</code> API and comments for details. * * @see DeltaDataTree */ public class DataDeltaNode extends DataTreeNode { /** * Creates a node with the given name and data, but with no children. */ DataDeltaNode(String name, Object data) { super(name, data); } /** * Creates a node with the given name, data and children. */ DataDeltaNode(String name, Object data, AbstractDataTreeNode[] children) { super(name, data, children); } /** * @see AbstractDataTreeNode#asBackwardDelta(DeltaDataTree, DeltaDataTree, IPath) */ AbstractDataTreeNode asBackwardDelta(DeltaDataTree myTree, DeltaDataTree parentTree, IPath key) { AbstractDataTreeNode[] newChildren; if (children.length == 0) { newChildren= NO_CHILDREN; } else { newChildren= new AbstractDataTreeNode[children.length]; for (int i= children.length; --i >= 0;) { newChildren[i]= children[i].asBackwardDelta(myTree, parentTree, key.append(children[i].getName())); } } return new DataDeltaNode(name, parentTree.getData(key), newChildren); } AbstractDataTreeNode compareWithParent(IPath key, DeltaDataTree parent, IComparator comparator) { AbstractDataTreeNode[] comparedChildren= compareWithParent(children, key, parent, comparator); Object oldData= parent.getData(key); Object newData= data; /* don't compare data of root */ int userComparison= 0; if (key != parent.rootKey()) { /* allow client to specify user comparison bits */ userComparison= comparator.compare(oldData, newData); } return new DataTreeNode(key.lastSegment(), new NodeComparison(oldData, newData, NodeComparison.K_CHANGED, userComparison), comparedChildren); } /** * Creates and returns a new copy of the receiver. Makes a deep copy of children, but a shallow * copy of name and data. */ AbstractDataTreeNode copy() { AbstractDataTreeNode[] childrenCopy; if (children.length == 0) { childrenCopy= NO_CHILDREN; } else { childrenCopy= new AbstractDataTreeNode[children.length]; System.arraycopy(children, 0, childrenCopy, 0, children.length); } return new DataDeltaNode(name, data, childrenCopy); } /** * Returns true if the receiver represents delta information, false if it represents the * complete information. */ boolean isDelta() { return true; } /** * Simplifies the given node, and answers its replacement. */ AbstractDataTreeNode simplifyWithParent(IPath key, DeltaDataTree parent, IComparator comparer) { AbstractDataTreeNode[] simplifiedChildren= simplifyWithParent(children, key, parent, comparer); /* don't compare root nodes */ if (!key.isRoot() && comparer.compare(parent.getData(key), data) == 0) return new NoDataDeltaNode(name, simplifiedChildren); return new DataDeltaNode(name, data, simplifiedChildren); } /** * Returns a unicode representation of the node. This method is used for debugging purposes only * (no NLS support needed) */ public String toString() { return "a DataDeltaNode(" + this.getName() + ") with " + getChildren().length + " children."; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } /** * Returns a constant describing the type of node. */ int type() { return T_DELTA_NODE; } }