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: */
017: package org.apache.wicket.markup.resolver;
018:
019: import org.apache.wicket.MarkupContainer;
020: import org.apache.wicket.markup.ComponentTag;
021: import org.apache.wicket.markup.MarkupStream;
022: import org.apache.wicket.markup.WicketTag;
023: import org.apache.wicket.markup.html.WebMarkupContainer;
024: import org.apache.wicket.markup.parser.filter.WicketTagIdentifier;
025:
026: /**
027: * Detect <wicket:extend> and <wicket:child> tags, which are
028: * silently ignored, because they have already been processed.
029: *
030: * @author Juergen Donnerstag
031: */
032: public class MarkupInheritanceResolver implements IComponentResolver {
033: private static final long serialVersionUID = 1L;
034:
035: static {
036: // register "wicket:extend" and "wicket:child"
037: WicketTagIdentifier.registerWellKnownTagName("extend");
038: WicketTagIdentifier.registerWellKnownTagName("child");
039: }
040:
041: /**
042: * @see org.apache.wicket.markup.resolver.IComponentResolver#resolve(MarkupContainer,
043: * MarkupStream, ComponentTag)
044: * @param container
045: * The container parsing its markup
046: * @param markupStream
047: * The current markupStream
048: * @param tag
049: * The current component tag while parsing the markup
050: * @return true, if componentId was handle by the resolver. False, otherwise
051: */
052: public boolean resolve(final MarkupContainer container,
053: final MarkupStream markupStream, final ComponentTag tag) {
054: // It must be <wicket:...>
055: if (tag instanceof WicketTag) {
056: final WicketTag wicketTag = (WicketTag) tag;
057: final String id = wicketTag.getId()
058: + container.getPage().getAutoIndex();
059:
060: // It must be <wicket:extend...>
061: if (wicketTag.isExtendTag()) {
062: container.autoAdd(
063: new TransparentWebMarkupContainer(id),
064: markupStream);
065: return true;
066: }
067:
068: // It must be <wicket:child...>
069: if (wicketTag.isChildTag()) {
070: container.autoAdd(
071: new TransparentWebMarkupContainer(id),
072: markupStream);
073: return true;
074: }
075: }
076: // We were not able to handle the componentId
077: return false;
078: }
079:
080: /**
081: * This is a WebMarkupContainer, except that it is transparent for it child
082: * components.
083: */
084: private static class TransparentWebMarkupContainer extends
085: WebMarkupContainer {
086: private static final long serialVersionUID = 1L;
087:
088: /**
089: * @param id
090: */
091: public TransparentWebMarkupContainer(final String id) {
092: super (id);
093: }
094:
095: /**
096: * @see org.apache.wicket.MarkupContainer#isTransparentResolver()
097: */
098: public boolean isTransparentResolver() {
099: return true;
100: }
101: }
102: }
|