blob: f3f173d8c543e3562cbd0bc7e02c07ccb99b4e37 [file] [log] [blame]
/*
* 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.
*/
/* $Id$ */
package org.apache.fop.layoutmgr;
import java.util.List;
import org.apache.fop.fo.Constants;
/**
* This class represents an unresolved break possibility.
*/
public class BreakElement extends UnresolvedListElement {
private int penaltyWidth;
private int penaltyValue;
private int breakClass;
private List pendingBeforeMarks;
private List pendingAfterMarks;
/**
* Main constructor
* @param position the Position instance needed by the addAreas stage of the LMs.
* @param penaltyValue the penalty value for the penalty element to be constructed
* @param context the layout context which contains the pending conditional elements
*/
public BreakElement(Position position, int penaltyValue, LayoutContext context) {
this(position, penaltyValue, Constants.EN_AUTO, context);
}
/**
* Create a new BreakElement for the given {@code position}, {@code penaltyValue}
* and {@code breakClass}. (Used principally to generate break-possibilities in
* ranges of content that must be kept together within the context corresponding
* to the {@code breakClass}; expected to be one of
* {@link org.apache.fop.fo.Constants#EN_AUTO},
* {@link org.apache.fop.fo.Constants#EN_LINE},
* {@link org.apache.fop.fo.Constants#EN_COLUMN} or
* {@link org.apache.fop.fo.Constants#EN_PAGE})
* @param position the corresponding {@link Position}
* @param penaltyValue the penalty value
* @param breakClass the break class
* @param context the {@link LayoutContext}
*/
public BreakElement(Position position, int penaltyValue, int breakClass,
LayoutContext context) {
this(position, 0, penaltyValue, breakClass, context);
}
/**
* Constructor for hard breaks.
*
* @param position the Position instance needed by the addAreas stage of the LMs.
* @param penaltyWidth the penalty width
* @param penaltyValue the penalty value for the penalty element to be constructed
* @param breakClass the break class of this penalty (one of
* {@link org.apache.fop.fo.Constants#EN_AUTO},
* {@link org.apache.fop.fo.Constants#EN_COLUMN},
* {@link org.apache.fop.fo.Constants#EN_PAGE},
* {@link org.apache.fop.fo.Constants#EN_EVEN_PAGE},
* {@link org.apache.fop.fo.Constants#EN_ODD_PAGE})
* @param context the layout context which contains the pending conditional elements
*/
public BreakElement(Position position, int penaltyWidth, int penaltyValue,
int breakClass, LayoutContext context) {
super(position);
this.penaltyWidth = penaltyWidth;
this.penaltyValue = penaltyValue;
setBreakClass(breakClass);
this.pendingBeforeMarks = context.getPendingBeforeMarks();
this.pendingAfterMarks = context.getPendingAfterMarks();
}
private static String getBreakClassName(int breakClass) {
return AbstractBreaker.getBreakClassName(breakClass);
}
/** {@inheritDoc} */
public boolean isConditional() {
return false; //Does not really apply here
}
/** {@inheritDoc} */
/*
public boolean isPenalty() {
return true; //not entirely true but a BreakElement will generate a penalty later
}*/
/** @return the penalty width */
public int getPenaltyWidth() {
return this.penaltyWidth;
}
/** @return the penalty value */
public int getPenaltyValue() {
return this.penaltyValue;
}
/**
* Sets the penalty value.
* @param p the new penalty value
*/
public void setPenaltyValue(int p) {
this.penaltyValue = p;
}
/** {@inheritDoc} */
public boolean isForcedBreak() {
return penaltyValue == -KnuthElement.INFINITE;
}
/**
* Returns the break class of this penalty.
*
* @return one of
* {@link org.apache.fop.fo.Constants#EN_AUTO},
* {@link org.apache.fop.fo.Constants#EN_COLUMN},
* {@link org.apache.fop.fo.Constants#EN_PAGE},
* {@link org.apache.fop.fo.Constants#EN_EVEN_PAGE},
* {@link org.apache.fop.fo.Constants#EN_ODD_PAGE}.
*/
public int getBreakClass() {
return breakClass;
}
/**
* Sets the break class.
*
* @param breakClass one of
* {@link org.apache.fop.fo.Constants#EN_AUTO},
* {@link org.apache.fop.fo.Constants#EN_LINE},
* {@link org.apache.fop.fo.Constants#EN_COLUMN},
* {@link org.apache.fop.fo.Constants#EN_PAGE},
* {@link org.apache.fop.fo.Constants#EN_EVEN_PAGE},
* {@link org.apache.fop.fo.Constants#EN_ODD_PAGE}.
*/
public void setBreakClass(int breakClass) {
switch (breakClass) {
case Constants.EN_AUTO:
case Constants.EN_LINE:
case Constants.EN_COLUMN:
case Constants.EN_PAGE:
case Constants.EN_EVEN_PAGE:
case Constants.EN_ODD_PAGE:
this.breakClass = breakClass;
break;
default: throw new IllegalArgumentException("Illegal value for break class: " + breakClass);
}
}
/** @return the pending border and padding elements at the before edge */
public List getPendingBeforeMarks() {
return this.pendingBeforeMarks;
}
/** @return the pending border and padding elements at the after edge */
public List getPendingAfterMarks() {
return this.pendingAfterMarks;
}
/**
* Clears all pending marks associated with this break element. This is used in break
* cases where we only know very late if the break is actually after all the content
* of an FO has been generated.
*/
public void clearPendingMarks() {
this.pendingBeforeMarks = null;
this.pendingAfterMarks = null;
}
/** {@inheritDoc} */
public String toString() {
StringBuffer sb = new StringBuffer(64);
sb.append("BreakPossibility[p:");
sb.append(KnuthPenalty.valueOf(this.penaltyValue));
if (isForcedBreak()) {
sb.append(" (forced break, ")
.append(getBreakClassName(this.breakClass))
.append(")");
} else if (this.penaltyValue >= 0 && this.breakClass != -1) {
sb.append(" (keep constraint, ")
.append(getBreakClassName(this.breakClass))
.append(")");
}
sb.append("; w:");
sb.append(penaltyWidth);
sb.append("]");
return sb.toString();
}
}