| /* |
| * 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.uibinder.elementparsers; |
| |
| import com.google.gwt.core.ext.UnableToCompleteException; |
| import com.google.gwt.uibinder.rebind.FieldManager; |
| import com.google.gwt.uibinder.rebind.FieldWriter; |
| import com.google.gwt.uibinder.rebind.UiBinderWriter; |
| import com.google.gwt.uibinder.rebind.XMLElement; |
| |
| /** |
| * Used by {@link RenderablePanelParser} to interpret renderable elements. |
| * Declares the appropriate {@link IsRenderable}, and returns the correct HTML |
| * to be inlined in the {@link RenderablePanel}. |
| */ |
| class IsRenderableInterpreter implements XMLElement.Interpreter<String> { |
| |
| private final String fieldName; |
| |
| private final UiBinderWriter uiWriter; |
| |
| public IsRenderableInterpreter(String fieldName, UiBinderWriter writer) { |
| this.fieldName = fieldName; |
| this.uiWriter = writer; |
| assert writer.useLazyWidgetBuilders(); |
| } |
| |
| public String interpretElement(XMLElement elem) |
| throws UnableToCompleteException { |
| if (!uiWriter.isRenderableElement(elem)) { |
| return null; |
| } |
| |
| String stamper = uiWriter.declareRenderableStamper(); |
| FieldManager fieldManager = uiWriter.getFieldManager(); |
| FieldWriter fieldWriter = fieldManager.require(fieldName); |
| FieldWriter childFieldWriter = uiWriter.parseElementToField(elem); |
| |
| fieldWriter.addAttachStatement( |
| "%s.claimElement(%s.findStampedElement());", |
| fieldManager.convertFieldToGetter(childFieldWriter.getName()), |
| fieldManager.convertFieldToGetter(stamper)); |
| |
| // Some operations are more efficient when the Widget isn't attached to |
| // the document. Perform them here. |
| fieldWriter.addDetachStatement( |
| "%s.initializeClaimedElement();", |
| fieldManager.convertFieldToGetter(childFieldWriter.getName())); |
| |
| fieldWriter.addDetachStatement( |
| "%s.logicalAdd(%s);", |
| fieldManager.convertFieldToGetter(fieldName), |
| fieldManager.convertFieldToGetter(childFieldWriter.getName())); |
| |
| // TODO(rdcastro): use the render() call that receives the SafeHtmlBuilder |
| String elementHtml = fieldManager.convertFieldToGetter(childFieldWriter.getName()) + ".render(" |
| + fieldManager.convertFieldToGetter(stamper) + ")"; |
| return uiWriter.tokenForSafeHtmlExpression(elem, elementHtml); |
| } |
| } |