KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > jdt > internal > core > dom > rewrite > ListRewriteEvent


1 /*******************************************************************************
2  * Copyright (c) 2000, 2004 IBM Corporation and others.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Eclipse Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/epl-v10.html
7  *
8  * Contributors:
9  * IBM Corporation - initial API and implementation
10  *******************************************************************************/

11 package org.eclipse.jdt.internal.core.dom.rewrite;
12
13 import java.util.ArrayList JavaDoc;
14 import java.util.List JavaDoc;
15
16 import org.eclipse.jdt.core.dom.ASTNode;
17
18 /**
19  *
20  */

21 public class ListRewriteEvent extends RewriteEvent {
22     
23     public final static int NEW= 1;
24     public final static int OLD= 2;
25     public final static int BOTH= NEW | OLD;
26     
27     /** original list of 'ASTNode' */
28     private List JavaDoc originalNodes;
29
30     /** list of type 'RewriteEvent' */
31     private List JavaDoc listEntries;
32     
33     /**
34      * Creates a ListRewriteEvent from the original ASTNodes. The resulting event
35      * represents the unmodified list.
36      * @param originalNodes The original nodes (type ASTNode)
37      */

38     public ListRewriteEvent(List JavaDoc originalNodes) {
39         this.originalNodes= new ArrayList JavaDoc(originalNodes);
40     }
41
42     /**
43      * Creates a ListRewriteEvent from existing rewrite events.
44      * @param children The rewrite events for this list.
45      */

46     public ListRewriteEvent(RewriteEvent[] children) {
47         this.listEntries= new ArrayList JavaDoc(children.length * 2);
48         this.originalNodes= new ArrayList JavaDoc(children.length * 2);
49         for (int i= 0; i < children.length; i++) {
50             RewriteEvent curr= children[i];
51             this.listEntries.add(curr);
52             if (curr.getOriginalValue() != null) {
53                 this.originalNodes.add(curr.getOriginalValue());
54             }
55         }
56     }
57     
58     private List JavaDoc getEntries() {
59         if (this.listEntries == null) {
60             // create if not yet existing
61
int nNodes= this.originalNodes.size();
62             this.listEntries= new ArrayList JavaDoc(nNodes * 2);
63             for (int i= 0; i < nNodes; i++) {
64                 ASTNode node= (ASTNode) this.originalNodes.get(i);
65                 // all nodes unchanged
66
this.listEntries.add(new NodeRewriteEvent(node, node));
67             }
68         }
69         return this.listEntries;
70     }
71         
72     /* (non-Javadoc)
73      * @see org.eclipse.jdt.internal.corext.dom.ASTRewriteChange#getChangeKind()
74      */

75     public int getChangeKind() {
76         if (this.listEntries != null) {
77             for (int i= 0; i < this.listEntries.size(); i++) {
78                 RewriteEvent curr= (RewriteEvent) this.listEntries.get(i);
79                 if (curr.getChangeKind() != UNCHANGED) {
80                     return CHILDREN_CHANGED;
81                 }
82             }
83         }
84         return UNCHANGED;
85     }
86
87     /* (non-Javadoc)
88      * @see org.eclipse.jdt.internal.corext.dom.ASTRewriteChange#isListChange()
89      */

90     public boolean isListRewrite() {
91         return true;
92     }
93     
94     /* (non-Javadoc)
95      * @see org.eclipse.jdt.internal.corext.dom.RewriteEvent#getChildren()
96      */

97     public RewriteEvent[] getChildren() {
98         List JavaDoc entries= getEntries();
99         return (RewriteEvent[]) entries.toArray(new RewriteEvent[entries.size()]);
100     }
101
102     /* (non-Javadoc)
103      * @see org.eclipse.jdt.internal.corext.dom.RewriteEvent#getOriginalNode()
104      */

105     public Object JavaDoc getOriginalValue() {
106         return this.originalNodes;
107     }
108
109     /* (non-Javadoc)
110      * @see org.eclipse.jdt.internal.corext.dom.RewriteEvent#getNewValue()
111      */

112     public Object JavaDoc getNewValue() {
113         List JavaDoc entries= getEntries();
114         ArrayList JavaDoc res= new ArrayList JavaDoc(entries.size());
115         for (int i= 0; i < entries.size(); i++) {
116             RewriteEvent curr= (RewriteEvent) entries.get(i);
117             Object JavaDoc newVal= curr.getNewValue();
118             if (newVal != null) {
119                 res.add(newVal);
120             }
121         }
122         return res;
123     }
124     
125     // API to modify the list nodes
126

127     public RewriteEvent removeEntry(ASTNode originalEntry) {
128         return replaceEntry(originalEntry, null);
129     }
130     
131     public RewriteEvent replaceEntry(ASTNode originalEntry, ASTNode newEntry) {
132         if (originalEntry == null) {
133             throw new IllegalArgumentException JavaDoc();
134         }
135         
136         List JavaDoc entries= getEntries();
137         int nEntries= entries.size();
138         for (int i= 0; i < nEntries; i++) {
139             NodeRewriteEvent curr= (NodeRewriteEvent) entries.get(i);
140             if (curr.getOriginalValue() == originalEntry) {
141                 curr.setNewValue(newEntry);
142                 return curr;
143             }
144         }
145         return null;
146     }
147     
148     public void revertChange(NodeRewriteEvent event) {
149         Object JavaDoc originalValue = event.getOriginalValue();
150         if(originalValue == null) {
151             List JavaDoc entries= getEntries();
152             entries.remove(event);
153         } else {
154             event.setNewValue(originalValue);
155         }
156     }
157     
158     public int getIndex(ASTNode node, int kind) {
159         List JavaDoc entries= getEntries();
160         for (int i= entries.size() - 1; i >= 0; i--) {
161             RewriteEvent curr= (RewriteEvent) entries.get(i);
162             if (((kind & OLD) != 0) && (curr.getOriginalValue() == node)) {
163                 return i;
164             }
165             if (((kind & NEW) != 0) && (curr.getNewValue() == node)) {
166                 return i;
167             }
168         }
169         return -1;
170     }
171         
172     public RewriteEvent insert(ASTNode insertedNode, int insertIndex) {
173         NodeRewriteEvent change= new NodeRewriteEvent(null, insertedNode);
174         if (insertIndex != -1) {
175             getEntries().add(insertIndex, change);
176         } else {
177             getEntries().add(change);
178         }
179         return change;
180     }
181     
182     public void setNewValue(ASTNode newValue, int insertIndex) {
183         NodeRewriteEvent curr= (NodeRewriteEvent) getEntries().get(insertIndex);
184         curr.setNewValue(newValue);
185     }
186     
187     public int getChangeKind(int index) {
188         return ((NodeRewriteEvent) getEntries().get(index)).getChangeKind();
189     }
190     
191     /* (non-Javadoc)
192      * @see java.lang.Object#toString()
193      */

194     public String JavaDoc toString() {
195         StringBuffer JavaDoc buf= new StringBuffer JavaDoc();
196         buf.append(" [list change\n\t"); //$NON-NLS-1$
197

198         RewriteEvent[] events= getChildren();
199         for (int i= 0; i < events.length; i++) {
200             if (i != 0) {
201                 buf.append("\n\t"); //$NON-NLS-1$
202
}
203             buf.append(events[i]);
204         }
205         buf.append("\n]"); //$NON-NLS-1$
206
return buf.toString();
207     }
208
209
210     
211 }
212
Popular Tags