| /* |
| * Copyright 2011 Google Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| * use this file except in compliance with the License. You may obtain a copy of |
| * the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| * License for the specific language governing permissions and limitations under |
| * the License. |
| */ |
| package com.google.gwt.dom.builder.shared; |
| |
| import com.google.gwt.dom.client.AnchorElement; |
| import com.google.gwt.dom.client.AreaElement; |
| import com.google.gwt.dom.client.AudioElement; |
| import com.google.gwt.dom.client.BRElement; |
| import com.google.gwt.dom.client.BaseElement; |
| import com.google.gwt.dom.client.BodyElement; |
| import com.google.gwt.dom.client.ButtonElement; |
| import com.google.gwt.dom.client.CanvasElement; |
| import com.google.gwt.dom.client.DListElement; |
| import com.google.gwt.dom.client.DivElement; |
| import com.google.gwt.dom.client.Element; |
| import com.google.gwt.dom.client.FieldSetElement; |
| import com.google.gwt.dom.client.FormElement; |
| import com.google.gwt.dom.client.FrameElement; |
| import com.google.gwt.dom.client.FrameSetElement; |
| import com.google.gwt.dom.client.HRElement; |
| import com.google.gwt.dom.client.HeadElement; |
| import com.google.gwt.dom.client.HeadingElement; |
| import com.google.gwt.dom.client.IFrameElement; |
| import com.google.gwt.dom.client.ImageElement; |
| import com.google.gwt.dom.client.InputElement; |
| import com.google.gwt.dom.client.LIElement; |
| import com.google.gwt.dom.client.LabelElement; |
| import com.google.gwt.dom.client.LegendElement; |
| import com.google.gwt.dom.client.LinkElement; |
| import com.google.gwt.dom.client.MapElement; |
| import com.google.gwt.dom.client.MetaElement; |
| import com.google.gwt.dom.client.OListElement; |
| import com.google.gwt.dom.client.OptGroupElement; |
| import com.google.gwt.dom.client.OptionElement; |
| import com.google.gwt.dom.client.ParagraphElement; |
| import com.google.gwt.dom.client.ParamElement; |
| import com.google.gwt.dom.client.PreElement; |
| import com.google.gwt.dom.client.QuoteElement; |
| import com.google.gwt.dom.client.ScriptElement; |
| import com.google.gwt.dom.client.SelectElement; |
| import com.google.gwt.dom.client.SourceElement; |
| import com.google.gwt.dom.client.SpanElement; |
| import com.google.gwt.dom.client.StyleElement; |
| import com.google.gwt.dom.client.TableCaptionElement; |
| import com.google.gwt.dom.client.TableCellElement; |
| import com.google.gwt.dom.client.TableColElement; |
| import com.google.gwt.dom.client.TableElement; |
| import com.google.gwt.dom.client.TableRowElement; |
| import com.google.gwt.dom.client.TableSectionElement; |
| import com.google.gwt.dom.client.TextAreaElement; |
| import com.google.gwt.dom.client.UListElement; |
| import com.google.gwt.dom.client.VideoElement; |
| import com.google.gwt.safehtml.shared.SafeHtml; |
| |
| /** |
| * Abstract base class for implementations of {@link ElementBuilderBase}. |
| * |
| * <p> |
| * Subclasses of {@link AbstractElementBuilderBase} act as typed wrappers around |
| * a shared implementation that handles the actual building. The wrappers merely |
| * delegate to the shared implementation, so wrapper instances can be reused, |
| * avoiding object creation. This approach is necessary so that the return value |
| * of common methods, such as {@link #id(String)}, return a typed builder |
| * instead of the generic {@link ElementBuilderBase}. |
| * </p> |
| * |
| * @param <R> the builder type returned from build methods |
| */ |
| public abstract class AbstractElementBuilderBase<R extends ElementBuilderBase<?>> implements |
| ElementBuilderBase<R> { |
| |
| private final ElementBuilderImpl delegate; |
| private final boolean isEndTagForbidden; |
| private final R returnBuilder; |
| |
| @SuppressWarnings("unchecked") |
| protected AbstractElementBuilderBase(ElementBuilderImpl delegate, boolean isEndTagForbidden) { |
| this.delegate = delegate; |
| this.isEndTagForbidden = isEndTagForbidden; |
| |
| // Cache the return builder to avoid repeated cast checks. |
| this.returnBuilder = (R) this; |
| } |
| |
| @Override |
| public void end() { |
| delegate.end(); |
| } |
| |
| @Override |
| public void end(String tagName) { |
| delegate.end(tagName); |
| } |
| |
| @Override |
| public void endAnchor() { |
| end(AnchorElement.TAG); |
| } |
| |
| @Override |
| public void endArea() { |
| end(AreaElement.TAG); |
| } |
| |
| @Override |
| public void endAudio() { |
| end(AudioElement.TAG); |
| } |
| |
| @Override |
| public void endBase() { |
| end(BaseElement.TAG); |
| } |
| |
| @Override |
| public void endBlockQuote() { |
| end(QuoteElement.TAG_BLOCKQUOTE); |
| } |
| |
| @Override |
| public void endBody() { |
| end(BodyElement.TAG); |
| } |
| |
| @Override |
| public void endBR() { |
| end(BRElement.TAG); |
| } |
| |
| @Override |
| public void endButton() { |
| end(ButtonElement.TAG); |
| } |
| |
| @Override |
| public void endCanvas() { |
| end(CanvasElement.TAG); |
| } |
| |
| @Override |
| public void endCol() { |
| end(TableColElement.TAG_COL); |
| } |
| |
| @Override |
| public void endColGroup() { |
| end(TableColElement.TAG_COLGROUP); |
| } |
| |
| @Override |
| public void endDiv() { |
| end(DivElement.TAG); |
| } |
| |
| @Override |
| public void endDList() { |
| end(DListElement.TAG); |
| } |
| |
| @Override |
| public void endFieldSet() { |
| end(FieldSetElement.TAG); |
| } |
| |
| @Override |
| public void endForm() { |
| end(FormElement.TAG); |
| } |
| |
| @Override |
| public void endFrame() { |
| end(FrameElement.TAG); |
| } |
| |
| @Override |
| public void endFrameSet() { |
| end(FrameSetElement.TAG); |
| } |
| |
| @Override |
| public void endH1() { |
| end(HeadingElement.TAG_H1); |
| } |
| |
| @Override |
| public void endH2() { |
| end(HeadingElement.TAG_H2); |
| } |
| |
| @Override |
| public void endH3() { |
| end(HeadingElement.TAG_H3); |
| } |
| |
| @Override |
| public void endH4() { |
| end(HeadingElement.TAG_H4); |
| } |
| |
| @Override |
| public void endH5() { |
| end(HeadingElement.TAG_H5); |
| } |
| |
| @Override |
| public void endH6() { |
| end(HeadingElement.TAG_H6); |
| } |
| |
| @Override |
| public void endHead() { |
| end(HeadElement.TAG); |
| } |
| |
| @Override |
| public void endHR() { |
| end(HRElement.TAG); |
| } |
| |
| @Override |
| public void endIFrame() { |
| end(IFrameElement.TAG); |
| } |
| |
| @Override |
| public void endImage() { |
| end(ImageElement.TAG); |
| } |
| |
| @Override |
| public void endInput() { |
| end(InputElement.TAG); |
| } |
| |
| @Override |
| public void endLabel() { |
| end(LabelElement.TAG); |
| } |
| |
| @Override |
| public void endLegend() { |
| end(LegendElement.TAG); |
| } |
| |
| @Override |
| public void endLI() { |
| end(LIElement.TAG); |
| } |
| |
| @Override |
| public void endLink() { |
| end(LinkElement.TAG); |
| } |
| |
| @Override |
| public void endMap() { |
| end(MapElement.TAG); |
| } |
| |
| @Override |
| public void endMeta() { |
| end(MetaElement.TAG); |
| } |
| |
| @Override |
| public void endOList() { |
| end(OListElement.TAG); |
| } |
| |
| @Override |
| public void endOptGroup() { |
| end(OptGroupElement.TAG); |
| } |
| |
| @Override |
| public void endOption() { |
| end(OptionElement.TAG); |
| } |
| |
| @Override |
| public void endParagraph() { |
| end(ParagraphElement.TAG); |
| } |
| |
| @Override |
| public void endParam() { |
| end(ParamElement.TAG); |
| } |
| |
| @Override |
| public void endPre() { |
| end(PreElement.TAG); |
| } |
| |
| @Override |
| public void endQuote() { |
| end(QuoteElement.TAG_Q); |
| } |
| |
| @Override |
| public void endScript() { |
| end(ScriptElement.TAG); |
| } |
| |
| @Override |
| public void endSelect() { |
| end(SelectElement.TAG); |
| } |
| |
| @Override |
| public void endSource() { |
| end(SourceElement.TAG); |
| } |
| |
| @Override |
| public void endSpan() { |
| end(SpanElement.TAG); |
| } |
| |
| @Override |
| public void endStyle() { |
| end(StyleElement.TAG); |
| } |
| |
| @Override |
| public void endTable() { |
| end(TableElement.TAG); |
| } |
| |
| @Override |
| public void endTableCaption() { |
| end(TableCaptionElement.TAG); |
| } |
| |
| @Override |
| public void endTBody() { |
| end(TableSectionElement.TAG_TBODY); |
| } |
| |
| @Override |
| public void endTD() { |
| end(TableCellElement.TAG_TD); |
| } |
| |
| @Override |
| public void endTextArea() { |
| end(TextAreaElement.TAG); |
| } |
| |
| @Override |
| public void endTFoot() { |
| end(TableSectionElement.TAG_TFOOT); |
| } |
| |
| @Override |
| public void endTH() { |
| end(TableCellElement.TAG_TH); |
| } |
| |
| @Override |
| public void endTHead() { |
| end(TableSectionElement.TAG_THEAD); |
| } |
| |
| @Override |
| public void endTR() { |
| end(TableRowElement.TAG); |
| } |
| |
| @Override |
| public void endUList() { |
| end(UListElement.TAG); |
| } |
| |
| @Override |
| public void endVideo() { |
| end(VideoElement.TAG); |
| } |
| |
| @Override |
| public Element finish() { |
| return delegate.finish(); |
| } |
| |
| @Override |
| public int getDepth() { |
| return delegate.getDepth(); |
| } |
| |
| @Override |
| public R html(SafeHtml html) { |
| delegate.html(html); |
| return getReturnBuilder(); |
| } |
| |
| @Override |
| public boolean isChildElementSupported() { |
| return !isEndTagForbidden; |
| } |
| |
| @Override |
| public boolean isEndTagForbidden() { |
| return isEndTagForbidden; |
| } |
| |
| @Override |
| public StylesBuilder style() { |
| return delegate.style(); |
| } |
| |
| @Override |
| public R text(String text) { |
| delegate.text(text); |
| return getReturnBuilder(); |
| } |
| |
| /** |
| * Get the builder to return from build methods. |
| * |
| * @return the return builder |
| */ |
| protected R getReturnBuilder() { |
| return returnBuilder; |
| } |
| } |