1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.templating.editor.client.dom;
35
36 import java.util.LinkedList;
37 import java.util.List;
38
39 import com.google.gwt.dom.client.Element;
40
41
42
43
44
45
46 public class MgnlElement {
47
48 private CMSComment comment;
49 private MgnlElement parent;
50 private boolean isArea = false;
51 private boolean isComponent = false;
52
53 private Element firstElement;
54 private Element lastElement;
55
56 private LinkedList<MgnlElement> children = new LinkedList<MgnlElement>();
57
58 private static final String MARKER_AREA = "cms:area";
59 private static final String MARKER_COMPONENT = "cms:component";
60
61 public MgnlElement(CMSComment comment, MgnlElement parent) throws IllegalArgumentException {
62
63 if (!isMgnlElement(comment.getTagName())) {
64 throw new IllegalArgumentException("The tagname must be one of the defined marker Strings.");
65 }
66 this.comment = comment;
67 this.parent = parent;
68 }
69 public boolean isMgnlElement(String tagName) {
70 if (tagName.equals(MARKER_AREA)) {
71 this.isArea = true;
72 return true;
73 }
74 else if (tagName.equals(MARKER_COMPONENT)) {
75 this.isComponent = true;
76 return true;
77 }
78
79 return false;
80 }
81
82 public boolean isArea() {
83 return isArea;
84 }
85
86 public boolean isComponent() {
87 return isComponent;
88 }
89
90 public MgnlElement getParent() {
91 return parent;
92 }
93
94 public void setParent(MgnlElement parent) {
95 this.parent = parent;
96 }
97
98 public LinkedList<MgnlElement> getChildren() {
99 return children;
100 }
101
102 public List<MgnlElement> getDescendants() {
103
104 List<MgnlElement> descendants = new LinkedList<MgnlElement>();
105
106 for (MgnlElement element : getChildren()) {
107 descendants.add(element);
108 descendants.addAll(element.getDescendants());
109 }
110 return descendants;
111 }
112
113 public List<MgnlElement> getAscendants() {
114 List<MgnlElement> ascendants = new LinkedList<MgnlElement>();
115 MgnlElement parent = this.parent;
116 while (parent != null) {
117 ascendants.add(parent);
118 parent = parent.getParent();
119 }
120 return ascendants;
121 }
122
123 public MgnlElement getRootArea() {
124 MgnlElement rootArea = null;
125 for (MgnlElement parent = this; parent != null; parent = parent.getParent()) {
126 if (parent.isArea()) {
127 rootArea = parent;
128 }
129 }
130 return rootArea;
131 }
132
133 public MgnlElement getParentArea() {
134 MgnlElement parentArea = null;
135 for (MgnlElement parent = this; parent != null; parent = parent.getParent()) {
136 if (parent.isArea()) {
137 parentArea = parent;
138 break;
139 }
140 }
141 return parentArea;
142 }
143
144 public CMSComment getComment() {
145 return comment;
146 }
147
148 public List<MgnlElement> getComponents() {
149 List<MgnlElement> components = new LinkedList<MgnlElement>();
150 for (MgnlElement element : getChildren()) {
151 if (element.isComponent()) {
152 components.add(element);
153 }
154 }
155 return components;
156 }
157 public List<MgnlElement> getAreas() {
158 List<MgnlElement> areas = new LinkedList<MgnlElement>();
159 for (MgnlElement element : getChildren()) {
160 if (element.isArea()) {
161 areas.add(element);
162 }
163 }
164 return areas;
165 }
166
167 public MgnlElement getRoot() {
168 MgnlElement root = null;
169 for (MgnlElement parent = this; parent != null; parent = parent.getParent()) {
170 root = parent;
171 }
172 return root;
173 }
174
175 public boolean isRelated(MgnlElement relative) {
176
177 if (relative != null && this.getRoot() == relative.getRoot()) {
178 return true;
179 }
180 return false;
181 }
182
183 public Element getFirstElement() {
184 return firstElement;
185 }
186
187 public void setFirstElement(Element firstElement) {
188 this.firstElement = firstElement;
189 }
190
191 public Element getLastElement() {
192 return lastElement;
193 }
194
195 public void setLastElement(Element lastElement) {
196 this.lastElement = lastElement;
197 }
198 }