01: /*
02: * $Id: BodyOnLoadHandler.java 461655 2006-07-30 12:37:49Z jdonnerstag $
03: * $Revision: 461655 $ $Date: 2006-07-30 14:37:49 +0200 (Sun, 30 Jul 2006) $
04: *
05: * ==============================================================================
06: * Licensed under the Apache License, Version 2.0 (the "License"); you may not
07: * use this file except in compliance with the License. You may obtain a copy of
08: * the License at
09: *
10: * http://www.apache.org/licenses/LICENSE-2.0
11: *
12: * Unless required by applicable law or agreed to in writing, software
13: * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14: * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
15: * License for the specific language governing permissions and limitations under
16: * the License.
17: */
18: package wicket.markup.parser.filter;
19:
20: import java.text.ParseException;
21:
22: import wicket.markup.ComponentTag;
23: import wicket.markup.MarkupElement;
24: import wicket.markup.parser.AbstractMarkupFilter;
25:
26: /**
27: * If you want to package and share ready-made components and if you want this
28: * components to be easily pluggable than this component must have all the
29: * relevant information. That includes javascript (inline or referenced file) as
30: * well as CSS. With HTML these information have to be in the header of the
31: * markup return to the browser. This is true for body onLoad attributes as
32: * well. This markup inline filter detects &t;body> tags with an 'onLoad'
33: * attribute and which have <b>no</b> wicket:id attribute. The onLoad attribute
34: * will be copied from the component's markup to the Page's markup to allow for
35: * completely self-contained components. No changes to the Pages will be
36: * necessary to use the component.
37: * <p>
38: * Note: The markup must contain a <wicket:head> tag which contains the
39: * javascript and/or CSS to be copied to the Page's header.
40: * <p>
41: * Note: this handler is not relevant for Pages
42: *
43: * @see wicket.markup.MarkupParser
44: * @author Juergen Donnerstag
45: */
46: public final class BodyOnLoadHandler extends AbstractMarkupFilter {
47: /** The automatically assigned wicket:id to >body< tag */
48: public static final String BODY_ID = "_<body>";
49:
50: /**
51: * Construct.
52: */
53: public BodyOnLoadHandler() {
54: }
55:
56: /**
57: * Get the next tag from the next MarkupFilter in the chain and search for
58: * Wicket specific tags.
59: *
60: * @see wicket.markup.parser.IMarkupFilter#nextTag()
61: * @return The next tag from markup to be processed. If null, no more tags
62: * are available
63: */
64: public MarkupElement nextTag() throws ParseException {
65: // Get the next tag from the markup.
66: // If null, no more tags are available
67: ComponentTag tag = (ComponentTag) getParent().nextTag();
68: if (tag == null) {
69: return tag;
70: }
71:
72: // must be <body onload="...">
73: if (tag.isOpen() && "body".equalsIgnoreCase(tag.getName())
74: && (tag.getNamespace() == null)) {
75: if (tag.getId() == null) {
76: tag.setId(BODY_ID);
77: }
78: }
79:
80: return tag;
81: }
82: }
|