/*******************************************************************************
* Copyright (c) 2009 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
* Zend Technologies
*******************************************************************************/
package org2.eclipse.php.internal.core.ast.rewrite;
import java.util.ArrayList;
import java.util.List;
import org2.eclipse.php.internal.core.ast.nodes.ASTNode;
/**
*
*/
@SuppressWarnings({"unchecked", "rawtypes"})
public class ListRewriteEvent extends RewriteEvent {
public final static int NEW = 1;
public final static int OLD = 2;
public final static int BOTH = NEW | OLD;
/** original list of 'ASTNode' */
private List originalNodes;
/** list of type 'RewriteEvent' */
private List listEntries;
/**
* Creates a ListRewriteEvent from the original ASTNodes. The resulting
* event represents the unmodified list.
*
* @param originalNodes
* The original nodes (type ASTNode)
*/
public ListRewriteEvent(List originalNodes) {
this.originalNodes = new ArrayList(originalNodes);
}
/**
* Creates a ListRewriteEvent from existing rewrite events.
*
* @param children
* The rewrite events for this list.
*/
public ListRewriteEvent(RewriteEvent[] children) {
this.listEntries = new ArrayList(children.length * 2);
this.originalNodes = new ArrayList(children.length * 2);
for (int i = 0; i < children.length; i++) {
RewriteEvent curr = children[i];
this.listEntries.add(curr);
if (curr.getOriginalValue() != null) {
this.originalNodes.add(curr.getOriginalValue());
}
}
}
private List getEntries() {
if (this.listEntries == null) {
// create if not yet existing
int nNodes = this.originalNodes.size();
this.listEntries = new ArrayList(nNodes * 2);
for (int i = 0; i < nNodes; i++) {
ASTNode node = (ASTNode) this.originalNodes.get(i);
// all nodes unchanged
this.listEntries.add(new NodeRewriteEvent(node, node));
}
}
return this.listEntries;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jdt.internal.corext.dom.ASTRewriteChange#getChangeKind()
*/
public int getChangeKind() {
if (this.listEntries != null) {
for (int i = 0; i < this.listEntries.size(); i++) {
RewriteEvent curr = (RewriteEvent) this.listEntries.get(i);
if (curr.getChangeKind() != UNCHANGED) {
return CHILDREN_CHANGED;
}
}
}
return UNCHANGED;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jdt.internal.corext.dom.ASTRewriteChange#isListChange()
*/
public boolean isListRewrite() {
return true;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jdt.internal.corext.dom.RewriteEvent#getChildren()
*/
public RewriteEvent[] getChildren() {
List entries = getEntries();
return (RewriteEvent[]) entries
.toArray(new RewriteEvent[entries.size()]);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jdt.internal.corext.dom.RewriteEvent#getOriginalNode()
*/
public Object getOriginalValue() {
return this.originalNodes;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jdt.internal.corext.dom.RewriteEvent#getNewValue()
*/
public Object getNewValue() {
List entries = getEntries();
ArrayList res = new ArrayList(entries.size());
for (int i = 0; i < entries.size(); i++) {
RewriteEvent curr = (RewriteEvent) entries.get(i);
Object newVal = curr.getNewValue();
if (newVal != null) {
res.add(newVal);
}
}
return res;
}
// API to modify the list nodes
public RewriteEvent removeEntry(ASTNode originalEntry) {
return replaceEntry(originalEntry, null);
}
public RewriteEvent replaceEntry(ASTNode originalEntry, ASTNode newEntry) {
if (originalEntry == null) {
throw new IllegalArgumentException();
}
List entries = getEntries();
int nEntries = entries.size();
for (int i = 0; i < nEntries; i++) {
NodeRewriteEvent curr = (NodeRewriteEvent) entries.get(i);
if (curr.getOriginalValue() == originalEntry) {
curr.setNewValue(newEntry);
return curr;
}
}
return null;
}
public void revertChange(NodeRewriteEvent event) {
Object originalValue = event.getOriginalValue();
if (originalValue == null) {
List entries = getEntries();
entries.remove(event);
} else {
event.setNewValue(originalValue);
}
}
public int getIndex(ASTNode node, int kind) {
List entries = getEntries();
for (int i = entries.size() - 1; i >= 0; i--) {
RewriteEvent curr = (RewriteEvent) entries.get(i);
if (((kind & OLD) != 0) && (curr.getOriginalValue() == node)) {
return i;
}
if (((kind & NEW) != 0) && (curr.getNewValue() == node)) {
return i;
}
}
return -1;
}
public RewriteEvent insert(ASTNode insertedNode, int insertIndex) {
NodeRewriteEvent change = new NodeRewriteEvent(null, insertedNode);
if (insertIndex != -1) {
getEntries().add(insertIndex, change);
} else {
getEntries().add(change);
}
return change;
}
public void setNewValue(ASTNode newValue, int insertIndex) {
NodeRewriteEvent curr = (NodeRewriteEvent) getEntries()
.get(insertIndex);
curr.setNewValue(newValue);
}
public int getChangeKind(int index) {
return ((NodeRewriteEvent) getEntries().get(index)).getChangeKind();
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
public String toString() {
StringBuffer buf = new StringBuffer();
buf.append(" [list change\n\t"); //$NON-NLS-1$
RewriteEvent[] events = getChildren();
for (int i = 0; i < events.length; i++) {
if (i != 0) {
buf.append("\n\t"); //$NON-NLS-1$
}
buf.append(events[i]);
}
buf.append("\n]"); //$NON-NLS-1$
return buf.toString();
}
}