001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.juneau.bean.html5;
018
019import static org.apache.juneau.xml.annotation.XmlFormat.*;
020
021import java.util.*;
022
023import org.apache.juneau.*;
024import org.apache.juneau.annotation.*;
025import org.apache.juneau.internal.*;
026import org.apache.juneau.xml.annotation.*;
027
028/**
029 * A subclass of HTML elements that contain mixed content (elements and text).
030 *
031 * <h5 class='section'>See Also:</h5><ul>
032 *    <li class='link'><a class="doclink" href="https://juneau.apache.org/docs/topics/JuneauBeanHtml5">juneau-bean-html5</a>
033 * </ul>
034 */
035public class HtmlElementMixed extends HtmlElement {
036
037   private List<Object> children;
038
039   @Override /* Overridden from HtmlElement */
040   public HtmlElementMixed _class(String value) { // NOSONAR - Intentional naming.
041      super._class(value);
042      return this;
043   }
044
045   @Override /* Overridden from HtmlElement */
046   public HtmlElementMixed accesskey(String value) {
047      super.accesskey(value);
048      return this;
049   }
050
051   @Override /* Overridden from HtmlElement */
052   public HtmlElementMixed attr(String key, Object val) {
053      super.attr(key, val);
054      return this;
055   }
056
057   @Override /* Overridden from HtmlElement */
058   public HtmlElementMixed attrUri(String key, Object val) {
059      super.attrUri(key, val);
060      return this;
061   }
062
063   /**
064    * Adds a child element to this element.
065    *
066    * @param value
067    *    The child to add as a child element.
068    *    Can be a string or {@link HtmlElement}.
069    *    Can also be a container of strings and elements.
070    * @return This object.
071    */
072   public HtmlElement child(Object value) {
073      if (this.children == null)
074         this.children = new LinkedList<>();
075      if (value instanceof Collection<?> value2)
076         this.children.addAll(value2);
077      else
078         this.children.add(value);
079      return this;
080   }
081
082   /**
083    * Adds one or more child elements to this element.
084    *
085    * @param value
086    *    The children to add as child elements.
087    *    Can be a mixture of strings and {@link HtmlElement} objects.
088    *    Can also be containers of strings and elements.
089    * @return This object.
090    */
091   public HtmlElement children(Object...value) {
092      if (value.length != 0)
093         for (var c : value)
094            child(c);
095      return this;
096   }
097
098   @Override /* Overridden from HtmlElement */
099   public HtmlElementMixed contenteditable(Object value) {
100      super.contenteditable(value);
101      return this;
102   }
103
104   @Override /* Overridden from HtmlElement */
105   public HtmlElementMixed dir(String value) {
106      super.dir(value);
107      return this;
108   }
109
110   /**
111    * Returns the child node at the specified index.
112    *
113    * @param <T> he class type of the node.
114    * @param type The class type of the node.
115    * @param index The index of the node in the list of children.
116    * @return The child node, or <jk>null</jk> if it doesn't exist.
117    * @throws InvalidDataConversionException If node is not the expected type.
118    */
119   public <T> T getChild(Class<T> type, int index) {
120      return (children == null || children.size() <= index || index < 0 ? null : ConverterUtils.toType(children.get(index), type));
121   }
122
123   /**
124    * Returns the child node at the specified index.
125    *
126    * @param index The index of the node in the list of children.
127    * @return The child node, or <jk>null</jk> if it doesn't exist.
128    */
129   public Object getChild(int index) {
130      return (children == null || children.size() <= index || index < 0 ? null : children.get(index));
131   }
132
133   /**
134    * Returns the child node at the specified address.
135    *
136    * <p>
137    * Indexes are zero-indexed.
138    *
139    * <p>
140    * For example, calling <c>getChild(1,2,3);</c> will return the 4th child of the 3rd child of the 2nd child.
141    *
142    * @param index The child indexes.
143    * @return The child node, or <jk>null</jk> if it doesn't point to a valid child.
144    */
145   public Object getChild(int...index) {
146      if (index.length == 0)
147         return null;
148      if (index.length == 1)
149         return getChild(index[0]);
150      Object c = this;
151      for (var element : index) {
152         if (c instanceof HtmlElementMixed c2)
153            c = c2.getChild(element);
154         else if (c instanceof HtmlElementContainer c2)
155            c = c2.getChild(element);
156         else
157            return null;
158      }
159      return c;
160   }
161
162   /**
163    * The children of this element.
164    *
165    * @return The children of this element.
166    */
167   @Xml(format = MIXED)
168   @Beanp(dictionary = HtmlBeanDictionary.class, name = "c")
169   public List<Object> getChildren() { return children; }
170
171   @Override /* Overridden from HtmlElement */
172   public HtmlElementMixed hidden(Object value) {
173      super.hidden(value);
174      return this;
175   }
176
177   @Override /* Overridden from HtmlElement */
178   public HtmlElementMixed id(String value) {
179      super.id(value);
180      return this;
181   }
182
183   @Override /* Overridden from HtmlElement */
184   public HtmlElementMixed lang(String value) {
185      super.lang(value);
186      return this;
187   }
188
189   @Override /* Overridden from HtmlElement */
190   public HtmlElementMixed onabort(String value) {
191      super.onabort(value);
192      return this;
193   }
194
195   @Override /* Overridden from HtmlElement */
196   public HtmlElementMixed onblur(String value) {
197      super.onblur(value);
198      return this;
199   }
200
201   @Override /* Overridden from HtmlElement */
202   public HtmlElementMixed oncancel(String value) {
203      super.oncancel(value);
204      return this;
205   }
206
207   @Override /* Overridden from HtmlElement */
208   public HtmlElementMixed oncanplay(String value) {
209      super.oncanplay(value);
210      return this;
211   }
212
213   @Override /* Overridden from HtmlElement */
214   public HtmlElementMixed oncanplaythrough(String value) {
215      super.oncanplaythrough(value);
216      return this;
217   }
218
219   @Override /* Overridden from HtmlElement */
220   public HtmlElementMixed onchange(String value) {
221      super.onchange(value);
222      return this;
223   }
224
225   @Override /* Overridden from HtmlElement */
226   public HtmlElementMixed onclick(String value) {
227      super.onclick(value);
228      return this;
229   }
230
231   @Override /* Overridden from HtmlElement */
232   public HtmlElementMixed oncuechange(String value) {
233      super.oncuechange(value);
234      return this;
235   }
236
237   @Override /* Overridden from HtmlElement */
238   public HtmlElementMixed ondblclick(String value) {
239      super.ondblclick(value);
240      return this;
241   }
242
243   @Override /* Overridden from HtmlElement */
244   public HtmlElementMixed ondurationchange(String value) {
245      super.ondurationchange(value);
246      return this;
247   }
248
249   @Override /* Overridden from HtmlElement */
250   public HtmlElementMixed onemptied(String value) {
251      super.onemptied(value);
252      return this;
253   }
254
255   @Override /* Overridden from HtmlElement */
256   public HtmlElementMixed onended(String value) {
257      super.onended(value);
258      return this;
259   }
260
261   @Override /* Overridden from HtmlElement */
262   public HtmlElementMixed onerror(String value) {
263      super.onerror(value);
264      return this;
265   }
266
267   @Override /* Overridden from HtmlElement */
268   public HtmlElementMixed onfocus(String value) {
269      super.onfocus(value);
270      return this;
271   }
272
273   @Override /* Overridden from HtmlElement */
274   public HtmlElementMixed oninput(String value) {
275      super.oninput(value);
276      return this;
277   }
278
279   @Override /* Overridden from HtmlElement */
280   public HtmlElementMixed oninvalid(String value) {
281      super.oninvalid(value);
282      return this;
283   }
284
285   @Override /* Overridden from HtmlElement */
286   public HtmlElementMixed onkeydown(String value) {
287      super.onkeydown(value);
288      return this;
289   }
290
291   @Override /* Overridden from HtmlElement */
292   public HtmlElementMixed onkeypress(String value) {
293      super.onkeypress(value);
294      return this;
295   }
296
297   @Override /* Overridden from HtmlElement */
298   public HtmlElementMixed onkeyup(String value) {
299      super.onkeyup(value);
300      return this;
301   }
302
303   @Override /* Overridden from HtmlElement */
304   public HtmlElementMixed onload(String value) {
305      super.onload(value);
306      return this;
307   }
308
309   @Override /* Overridden from HtmlElement */
310   public HtmlElementMixed onloadeddata(String value) {
311      super.onloadeddata(value);
312      return this;
313   }
314
315   @Override /* Overridden from HtmlElement */
316   public HtmlElementMixed onloadedmetadata(String value) {
317      super.onloadedmetadata(value);
318      return this;
319   }
320
321   @Override /* Overridden from HtmlElement */
322   public HtmlElementMixed onloadstart(String value) {
323      super.onloadstart(value);
324      return this;
325   }
326
327   @Override /* Overridden from HtmlElement */
328   public HtmlElementMixed onmousedown(String value) {
329      super.onmousedown(value);
330      return this;
331   }
332
333   @Override /* Overridden from HtmlElement */
334   public HtmlElementMixed onmouseenter(String value) {
335      super.onmouseenter(value);
336      return this;
337   }
338
339   @Override /* Overridden from HtmlElement */
340   public HtmlElementMixed onmouseleave(String value) {
341      super.onmouseleave(value);
342      return this;
343   }
344
345   @Override /* Overridden from HtmlElement */
346   public HtmlElementMixed onmousemove(String value) {
347      super.onmousemove(value);
348      return this;
349   }
350
351   @Override /* Overridden from HtmlElement */
352   public HtmlElementMixed onmouseout(String value) {
353      super.onmouseout(value);
354      return this;
355   }
356
357   @Override /* Overridden from HtmlElement */
358   public HtmlElementMixed onmouseover(String value) {
359      super.onmouseover(value);
360      return this;
361   }
362
363   @Override /* Overridden from HtmlElement */
364   public HtmlElementMixed onmouseup(String value) {
365      super.onmouseup(value);
366      return this;
367   }
368
369   @Override /* Overridden from HtmlElement */
370   public HtmlElementMixed onmousewheel(String value) {
371      super.onmousewheel(value);
372      return this;
373   }
374
375   @Override /* Overridden from HtmlElement */
376   public HtmlElementMixed onpause(String value) {
377      super.onpause(value);
378      return this;
379   }
380
381   @Override /* Overridden from HtmlElement */
382   public HtmlElementMixed onplay(String value) {
383      super.onplay(value);
384      return this;
385   }
386
387   @Override /* Overridden from HtmlElement */
388   public HtmlElementMixed onplaying(String value) {
389      super.onplaying(value);
390      return this;
391   }
392
393   @Override /* Overridden from HtmlElement */
394   public HtmlElementMixed onprogress(String value) {
395      super.onprogress(value);
396      return this;
397   }
398
399   @Override /* Overridden from HtmlElement */
400   public HtmlElementMixed onratechange(String value) {
401      super.onratechange(value);
402      return this;
403   }
404
405   @Override /* Overridden from HtmlElement */
406   public HtmlElementMixed onreset(String value) {
407      super.onreset(value);
408      return this;
409   }
410
411   @Override /* Overridden from HtmlElement */
412   public HtmlElementMixed onresize(String value) {
413      super.onresize(value);
414      return this;
415   }
416
417   @Override /* Overridden from HtmlElement */
418   public HtmlElementMixed onscroll(String value) {
419      super.onscroll(value);
420      return this;
421   }
422
423   @Override /* Overridden from HtmlElement */
424   public HtmlElementMixed onseeked(String value) {
425      super.onseeked(value);
426      return this;
427   }
428
429   @Override /* Overridden from HtmlElement */
430   public HtmlElementMixed onseeking(String value) {
431      super.onseeking(value);
432      return this;
433   }
434
435   @Override /* Overridden from HtmlElement */
436   public HtmlElementMixed onselect(String value) {
437      super.onselect(value);
438      return this;
439   }
440
441   @Override /* Overridden from HtmlElement */
442   public HtmlElementMixed onshow(String value) {
443      super.onshow(value);
444      return this;
445   }
446
447   @Override /* Overridden from HtmlElement */
448   public HtmlElementMixed onstalled(String value) {
449      super.onstalled(value);
450      return this;
451   }
452
453   @Override /* Overridden from HtmlElement */
454   public HtmlElementMixed onsubmit(String value) {
455      super.onsubmit(value);
456      return this;
457   }
458
459   @Override /* Overridden from HtmlElement */
460   public HtmlElementMixed onsuspend(String value) {
461      super.onsuspend(value);
462      return this;
463   }
464
465   @Override /* Overridden from HtmlElement */
466   public HtmlElementMixed ontimeupdate(String value) {
467      super.ontimeupdate(value);
468      return this;
469   }
470
471   @Override /* Overridden from HtmlElement */
472   public HtmlElementMixed ontoggle(String value) {
473      super.ontoggle(value);
474      return this;
475   }
476
477   @Override /* Overridden from HtmlElement */
478   public HtmlElementMixed onvolumechange(String value) {
479      super.onvolumechange(value);
480      return this;
481   }
482
483   @Override /* Overridden from HtmlElement */
484   public HtmlElementMixed onwaiting(String value) {
485      super.onwaiting(value);
486      return this;
487   }
488
489   /**
490    * Sets the children of this element.
491    *
492    * @param children The new children of this element.
493    * @return This object.
494    */
495   @Beanp("c")
496   public HtmlElement setChildren(List<Object> children) {
497      this.children = children;
498      return this;
499   }
500
501   @Override /* Overridden from HtmlElement */
502   public HtmlElementMixed spellcheck(Object value) {
503      super.spellcheck(value);
504      return this;
505   }
506
507   @Override /* Overridden from HtmlElement */
508   public HtmlElementMixed style(String value) {
509      super.style(value);
510      return this;
511   }
512
513   @Override /* Overridden from HtmlElement */
514   public HtmlElementMixed tabindex(Object value) {
515      super.tabindex(value);
516      return this;
517   }
518
519   @Override /* Overridden from HtmlElement */
520   public HtmlElementMixed title(String value) {
521      super.title(value);
522      return this;
523   }
524
525   @Override /* Overridden from HtmlElement */
526   public HtmlElementMixed translate(Object value) {
527      super.translate(value);
528      return this;
529   }
530}