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: PercentLength.java 434497 2006-08-24 20:08:26Z adelmelle $ */
019:
020: package org.apache.fop.fo.properties;
021:
022: import org.apache.fop.datatypes.PercentBaseContext;
023: import org.apache.fop.datatypes.PercentBase;
024: import org.apache.fop.fo.expr.PropertyException;
025:
026: /**
027: * a percent specified length quantity in XSL
028: */
029: public class PercentLength extends LengthProperty {
030:
031: /**
032: * The percentage itself, expressed as a decimal value, e.g. for 95%, set
033: * the value to .95
034: */
035: private double factor;
036:
037: /**
038: * A PercentBase implementation that contains the base length to which the
039: * {@link #factor} should be applied to compute the actual length
040: */
041: private PercentBase lbase = null;
042:
043: private double resolvedValue;
044:
045: /**
046: * Main constructor. Construct an object based on a factor (the percent,
047: * as a factor) and an object which has a method to return the Length which
048: * provides the "base" for the actual length that is modeled.
049: * @param factor the percentage factor, expressed as a decimal (e.g. use
050: * .95 to represent 95%)
051: * @param lbase base property to which the factor should be applied
052: */
053: public PercentLength(double factor, PercentBase lbase) {
054: this .factor = factor;
055: this .lbase = lbase;
056: }
057:
058: /**
059: * @return the base
060: */
061: public PercentBase getBaseLength() {
062: return this .lbase;
063: }
064:
065: /**
066: * Used during property resolution to check for
067: * negative percentages
068: *
069: * @return the percentage value
070: */
071: protected double getPercentage() {
072: return factor * 100;
073: }
074:
075: /**
076: * Return false because percent-length are always relative.
077: * @see org.apache.fop.datatypes.Numeric#isAbsolute()
078: */
079: public boolean isAbsolute() {
080: return false;
081: }
082:
083: /**
084: * @see org.apache.fop.datatypes.Numeric#getNumericValue()
085: */
086: public double getNumericValue() {
087: return getNumericValue(null);
088: }
089:
090: /**
091: * @see org.apache.fop.datatypes.Numeric#getNumericValue(PercentBaseContext)
092: */
093: public double getNumericValue(PercentBaseContext context) {
094: try {
095: resolvedValue = factor * lbase.getBaseLength(context);
096: return resolvedValue;
097: } catch (PropertyException exc) {
098: log.error(exc);
099: return 0;
100: }
101: }
102:
103: /**
104: * Return the length of this PercentLength.
105: * @see org.apache.fop.datatypes.Length#getValue()
106: */
107: public int getValue() {
108: return (int) getNumericValue();
109: }
110:
111: /**
112: * @see org.apache.fop.datatypes.Numeric#getValue(PercentBaseContext)
113: */
114: public int getValue(PercentBaseContext context) {
115: return (int) getNumericValue(context);
116: }
117:
118: /**
119: * @return the String equivalent of this
120: */
121: public String toString() {
122: // TODO: What about the base value?
123: return (new Double(factor * 100.0).toString()) + "%";
124: }
125:
126: }
|