/* * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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 org.apache.flex.compiler.internal.fxg.dom.richtext; import static org.apache.flex.compiler.fxg.FXGConstants.FXG_BASELINEOFFSET_ASCENT_VALUE; import static org.apache.flex.compiler.fxg.FXGConstants.FXG_BASELINEOFFSET_AUTO_VALUE; import static org.apache.flex.compiler.fxg.FXGConstants.FXG_BASELINEOFFSET_LINEHEIGHT_VALUE; import static org.apache.flex.compiler.fxg.FXGConstants.FXG_BLOCKPROGRESSION_ATTRIBUTE; import static org.apache.flex.compiler.fxg.FXGConstants.FXG_COLUMNCOUNT_ATTRIBUTE; import static org.apache.flex.compiler.fxg.FXGConstants.FXG_COLUMNGAP_ATTRIBUTE; import static org.apache.flex.compiler.fxg.FXGConstants.FXG_COLUMNWIDTH_ATTRIBUTE; import static org.apache.flex.compiler.fxg.FXGConstants.FXG_FIRSTBASELINEOFFSET_ATTRIBUTE; import static org.apache.flex.compiler.fxg.FXGConstants.FXG_INHERIT_VALUE; import static org.apache.flex.compiler.fxg.FXGConstants.FXG_LINEBREAK_ATTRIBUTE; import static org.apache.flex.compiler.fxg.FXGConstants.FXG_NUMBERAUTO_AUTO_VALUE; import static org.apache.flex.compiler.fxg.FXGConstants.FXG_PADDINGBOTTOM_ATTRIBUTE; import static org.apache.flex.compiler.fxg.FXGConstants.FXG_PADDINGLEFT_ATTRIBUTE; import static org.apache.flex.compiler.fxg.FXGConstants.FXG_PADDINGRIGHT_ATTRIBUTE; import static org.apache.flex.compiler.fxg.FXGConstants.FXG_PADDINGTOP_ATTRIBUTE; import static org.apache.flex.compiler.fxg.FXGConstants.FXG_VERTICALALIGN_ATTRIBUTE; import java.util.Collection; import org.apache.flex.compiler.fxg.dom.IFXGNode; import org.apache.flex.compiler.internal.fxg.dom.DOMParserHelper; import org.apache.flex.compiler.internal.fxg.dom.types.BaselineOffset; import org.apache.flex.compiler.internal.fxg.dom.types.BaselineOffset.BaselineOffsetAsEnum; import org.apache.flex.compiler.internal.fxg.dom.types.BlockProgression; import org.apache.flex.compiler.internal.fxg.dom.types.LineBreak; import org.apache.flex.compiler.internal.fxg.dom.types.NumberAuto; import org.apache.flex.compiler.internal.fxg.dom.types.NumberAuto.NumberAutoAsEnum; import org.apache.flex.compiler.internal.fxg.dom.types.NumberInherit; import org.apache.flex.compiler.internal.fxg.dom.types.NumberInherit.NumberInheritAsEnum; import org.apache.flex.compiler.internal.fxg.dom.types.VerticalAlign; import org.apache.flex.compiler.problems.FXGUnknownAttributeValueProblem; import org.apache.flex.compiler.problems.ICompilerProblem; /** * A base class that represents a block text. */ public abstract class AbstractRichBlockTextNode extends AbstractRichParagraphNode { protected static final double PADDING_MIN_INCLUSIVE = 0.0; protected static final double PADDING_MAX_INCLUSIVE = 1000.0; protected static final double BASELINEOFFSET_MIN_INCLUSIVE = 0.0; protected static final double BASELINEOFFSET_MAX_INCLUSIVE = 1000.0; protected static final int COLUMNCOUNT_MIN_INCLUSIVE = 0; protected static final int COLUMNCOUNT_MAX_INCLUSIVE = 50; protected static final double COLUMNGAP_MIN_INCLUSIVE = 0.0; protected static final double COLUMNGAP_MAX_INCLUSIVE = 1000.0; protected static final double COLUMNWIDTH_MIN_INCLUSIVE = 0.0; protected static final double COLUMNWIDTH_MAX_INCLUSIVE = 8000.0; //-------------------------------------------------------------------------- // // Attributes // //-------------------------------------------------------------------------- // Text Flow Attributes public BlockProgression blockProgression = BlockProgression.TB; public NumberInherit paddingLeft = NumberInherit.newInstance(0.0); public NumberInherit paddingRight = NumberInherit.newInstance(0.0); public NumberInherit paddingTop = NumberInherit.newInstance(0.0); public NumberInherit paddingBottom = NumberInherit.newInstance(0.0); public LineBreak lineBreak = LineBreak.TOFIT; public NumberInherit columnGap = NumberInherit.newInstance(20.0); public NumberAuto columnCount = NumberAuto.newInstance(NumberAutoAsEnum.AUTO); public NumberAuto columnWidth = NumberAuto.newInstance(NumberAutoAsEnum.AUTO); public BaselineOffset firstBaselineOffset = BaselineOffset.newInstance(BaselineOffsetAsEnum.AUTO); public VerticalAlign verticalAlign = VerticalAlign.TOP; /** * This implementation processes text flow extra attributes that are * relevant to the <p> tag, as well as delegates to the parent class * to process text leaf or paragraph attributes that are also relevant to * the <p> tag. * * @param name the attribute name * @param value the attribute value * @see AbstractRichParagraphNode#setAttribute(String, String, Collection) */ @Override public void setAttribute(String name, String value, Collection<ICompilerProblem> problems) { if (FXG_BLOCKPROGRESSION_ATTRIBUTE.equals(name)) { blockProgression = TextHelper.getBlockProgression(this, value, blockProgression, problems); } else if (FXG_PADDINGLEFT_ATTRIBUTE.equals(name)) { paddingLeft = getNumberInherit(this, name, value, PADDING_MIN_INCLUSIVE, PADDING_MAX_INCLUSIVE, paddingLeft.getNumberInheritAsDbl(), problems); } else if (FXG_PADDINGRIGHT_ATTRIBUTE.equals(name)) { paddingRight = getNumberInherit(this, name, value, PADDING_MIN_INCLUSIVE, PADDING_MAX_INCLUSIVE, paddingRight.getNumberInheritAsDbl(), problems); } else if (FXG_PADDINGTOP_ATTRIBUTE.equals(name)) { paddingTop = getNumberInherit(this, name, value, PADDING_MIN_INCLUSIVE, PADDING_MAX_INCLUSIVE, paddingTop.getNumberInheritAsDbl(), problems); } else if (FXG_PADDINGBOTTOM_ATTRIBUTE.equals(name)) { paddingBottom = getNumberInherit(this, name, value, PADDING_MIN_INCLUSIVE, PADDING_MAX_INCLUSIVE, paddingBottom.getNumberInheritAsDbl(), problems); } else if (FXG_LINEBREAK_ATTRIBUTE.equals(name)) { lineBreak = TextHelper.getLineBreak(this, value, lineBreak, problems); } else if (FXG_COLUMNGAP_ATTRIBUTE.equals(name)) { columnGap = getNumberInherit(this, name, value, COLUMNGAP_MIN_INCLUSIVE, COLUMNGAP_MAX_INCLUSIVE, columnGap.getNumberInheritAsDbl(), problems); } else if (FXG_COLUMNCOUNT_ATTRIBUTE.equals(name)) { columnCount = getNumberAutoInt(this, name, value, COLUMNCOUNT_MIN_INCLUSIVE, COLUMNCOUNT_MAX_INCLUSIVE, columnCount.getNumberAutoAsInt(), problems); } else if (FXG_COLUMNWIDTH_ATTRIBUTE.equals(name)) { columnWidth = getNumberAutoDbl(this, name, value, COLUMNWIDTH_MIN_INCLUSIVE, COLUMNWIDTH_MAX_INCLUSIVE, columnWidth.getNumberAutoAsDbl(), problems); } else if (FXG_FIRSTBASELINEOFFSET_ATTRIBUTE.equals(name)) { firstBaselineOffset = getFirstBaselineOffset(this, name, value, BASELINEOFFSET_MIN_INCLUSIVE, BASELINEOFFSET_MAX_INCLUSIVE, firstBaselineOffset.getBaselineOffsetAsDbl(), problems); } else if (FXG_VERTICALALIGN_ATTRIBUTE.equals(name)) { verticalAlign = TextHelper.getVerticalAlign(this, value, verticalAlign, problems); } else { super.setAttribute(name, value, problems); return; } // Remember attribute was set on this node. rememberAttribute(name, value); } //-------------------------------------------------------------------------- // // Helper Methods // //-------------------------------------------------------------------------- /** * Convert an FXG String value to a BaselineOffset object. * * @param value - the FXG String value. * @param name - the FXG attribute name. * @param min - the smallest double value that the result must be greater * or equal to. * @param max - the largest double value that the result must be smaller * than or equal to. * @param defaultValue - the default double value; if the encountered minor * version is later than the supported minor version and the attribute value * is out-of-range, the default value is returned. * @param problems problem collection used to collect problems occurred within this method * @return the matching BaselineOffset rule. * BaselineOffset rule or the value falls out of the specified range * (inclusive). */ private BaselineOffset getFirstBaselineOffset(IFXGNode node, String name, String value, double min, double max, double defaultValue, Collection<ICompilerProblem> problems) { if (FXG_BASELINEOFFSET_AUTO_VALUE.equals(value)) { return BaselineOffset.newInstance(BaselineOffsetAsEnum.AUTO); } else if (FXG_BASELINEOFFSET_ASCENT_VALUE.equals(value)) { return BaselineOffset.newInstance(BaselineOffsetAsEnum.ASCENT); } else if (FXG_BASELINEOFFSET_LINEHEIGHT_VALUE.equals(value)) { return BaselineOffset.newInstance(BaselineOffsetAsEnum.LINEHEIGHT); } else { try { return BaselineOffset.newInstance(DOMParserHelper.parseDouble(this, value, min, max)); } catch(Exception e) { //Unknown first baseline offset. problems.add(new FXGUnknownAttributeValueProblem(node.getDocumentPath(), node.getStartLine(), node.getStartColumn(), name, value)); return BaselineOffset.newInstance(defaultValue); } } } /** * Convert an FXG String value to a NumberAuto object. * * @param value - the FXG String value. * @param name - the FXG attribute name. * @param min - the smallest double value that the result must be greater * or equal to. * @param max - the largest double value that the result must be smaller * than or equal to. * @param defaultValue - the default double value; if the encountered minor * version is later than the supported minor version and the attribute value * is out-of-range, the default value is returned. * @param problems problem collection used to collect problems occurred within this method * @return the matching NumberAuto rule. * NumberAuto rule. */ private NumberAuto getNumberAutoDbl(IFXGNode node, String name, String value, double min, double max, double defaultValue, Collection<ICompilerProblem> problems) { try { return NumberAuto.newInstance(DOMParserHelper.parseDouble(this, value, min, max)); } catch(Exception e) { if (FXG_NUMBERAUTO_AUTO_VALUE.equals(value)) return NumberAuto.newInstance(NumberAutoAsEnum.AUTO); else if (FXG_INHERIT_VALUE.equals(value)) return NumberAuto.newInstance(NumberAutoAsEnum.INHERIT); //Unknown number auto. problems.add(new FXGUnknownAttributeValueProblem(node.getDocumentPath(), node.getStartLine(), node.getStartColumn(), name, value)); return NumberAuto.newInstance(defaultValue); } } /** * Convert an FXG String value to a NumberAuto object. * * @param value - the FXG String value. * @param name - the FXG attribute name. * @param min - the smallest int value that the result must be greater * or equal to. * @param max - the largest int value that the result must be smaller * than or equal to. * @param defaultValue - the default int value; if the encountered minor * version is later than the supported minor version and the attribute value * is out-of-range, the default value is returned. * @param problems problem collection used to collect problems occurred within this method * @return the matching NumberAuto rule. * NumberAuto rule. */ private NumberAuto getNumberAutoInt(IFXGNode node, String name, String value, int min, int max, int defaultValue, Collection<ICompilerProblem> problems) { try { return NumberAuto.newInstance(DOMParserHelper.parseInt(this, value, min, max)); } catch(Exception e) { if (FXG_NUMBERAUTO_AUTO_VALUE.equals(value)) return NumberAuto.newInstance(NumberAutoAsEnum.AUTO); else if (FXG_INHERIT_VALUE.equals(value)) return NumberAuto.newInstance(NumberAutoAsEnum.INHERIT); // Unknown number auto. problems.add(new FXGUnknownAttributeValueProblem(node.getDocumentPath(), node.getStartLine(), node.getStartColumn(), name, value)); return NumberAuto.newInstance(defaultValue); } } /** * Convert an FXG String value to a NumberInherit enumeration. * * @param value - the FXG String value. * @param name - the FXG attribute name. * @param min - the smallest double value that the result must be greater * or equal to. * @param max - the largest double value that the result must be smaller * than or equal to. * @param defaultValue - the default double value; if the encountered minor * version is later than the supported minor version and the attribute value * is out-of-range, the default value is returned. * @param problems problem collection used to collect problems occurred within this method * @return the matching NumberInherit rule. * NumberInherit rule or the value falls out of the specified range * (inclusive). */ private NumberInherit getNumberInherit(IFXGNode node, String name, String value, double min, double max, double defaultValue, Collection<ICompilerProblem> problems) { try { return NumberInherit.newInstance(DOMParserHelper.parseDouble(this, value, min, max)); } catch(Exception e) { if (FXG_INHERIT_VALUE.equals(value)) return NumberInherit.newInstance(NumberInheritAsEnum.INHERIT); problems.add(new FXGUnknownAttributeValueProblem(node.getDocumentPath(), node.getStartLine(), node.getStartColumn(), name, value)); return NumberInherit.newInstance(defaultValue); } } }