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:
018: /* $Id: PropertyInfo.java 495371 2007-01-11 21:03:07Z adelmelle $ */
019:
020: package org.apache.fop.fo.expr;
021:
022: import java.util.Stack;
023:
024: import org.apache.fop.datatypes.Length;
025: import org.apache.fop.datatypes.PercentBase;
026: import org.apache.fop.fo.Constants;
027: import org.apache.fop.fo.FObj;
028: import org.apache.fop.fo.PropertyList;
029: import org.apache.fop.fo.properties.PropertyMaker;
030:
031: /**
032: * This class holds context information needed during property expression
033: * evaluation.
034: * It holds the Maker object for the property, the PropertyList being
035: * built, and the FObj parent of the FObj for which the property is being set.
036: */
037: public class PropertyInfo {
038: private PropertyMaker maker;
039: private PropertyList plist;
040: private FObj fo;
041: private Stack stkFunction; // Stack of functions being evaluated
042:
043: /**
044: * Constructor
045: * @param maker Property.Maker object
046: * @param plist PropertyList object
047: * @param fo FObj
048: */
049: public PropertyInfo(PropertyMaker maker, PropertyList plist) {
050: this .maker = maker;
051: this .plist = plist;
052: this .fo = plist.getParentFObj();
053: }
054:
055: /**
056: * Return the PercentBase object used to calculate the absolute value from
057: * a percent specification.
058: * Propagates to the Maker.
059: * @return The PercentBase object or null if percentLengthOK()=false.
060: */
061: public PercentBase getPercentBase() throws PropertyException {
062: PercentBase pcbase = getFunctionPercentBase();
063: return (pcbase != null) ? pcbase : maker.getPercentBase(plist);
064: }
065:
066: /**
067: * @return the current font-size value as base units (milli-points).
068: */
069: public Length currentFontSize() throws PropertyException {
070: return plist.get(Constants.PR_FONT_SIZE).getLength();
071: }
072:
073: /**
074: * accessor for FObj
075: * @return FObj
076: */
077: public FObj getFO() {
078: return fo;
079: }
080:
081: /**
082: * accessor for PropertyList
083: * @return PropertyList object
084: */
085: public PropertyList getPropertyList() {
086: return plist;
087: }
088:
089: /**
090: * accessor for PropertyMaker
091: * @return PropertyMaker object
092: */
093: public PropertyMaker getPropertyMaker() {
094: return maker;
095: }
096:
097: /**
098: * push a function onto the function stack
099: * @param func function to push onto stack
100: */
101: public void pushFunction(Function func) {
102: if (stkFunction == null) {
103: stkFunction = new Stack();
104: }
105: stkFunction.push(func);
106: }
107:
108: /**
109: * pop a function off of the function stack
110: */
111: public void popFunction() {
112: if (stkFunction != null) {
113: stkFunction.pop();
114: }
115: }
116:
117: private PercentBase getFunctionPercentBase() {
118: if (stkFunction != null) {
119: Function f = (Function) stkFunction.peek();
120: if (f != null) {
121: return f.getPercentBase();
122: }
123: }
124: return null;
125: }
126:
127: }
|