blob: ecdfa015756d427a96b0da6850e33c301ce5952c [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.afp.modca;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import org.apache.fop.afp.Factory;
import org.apache.fop.afp.fonts.AFPFont;
/**
* An Active Environment Group (AEG) is associated with each page,
* and is contained in the page's begin-end envelope in the data stream.
* The active environment group contains layout and formatting information
* that defines the measurement units and size of the page, and may contain
* resource information.
*
* Any objects that are required for page presentation and that are to be
* treated as resource objects must be mapped with a map structured field
* in the AEG. The scope of an active environment group is the scope of its
* containing page or overlay.
*
*/
public final class ActiveEnvironmentGroup extends AbstractEnvironmentGroup {
/** The collection of MapCodedFont objects */
private final List/*<MapCodedFonts>*/ mapCodedFonts
= new java.util.ArrayList/*<MapCodedFonts>*/();
/** the collection of MapPageSegments objects */
private List mapPageSegments = null;
/** the Object Area Descriptor for the active environment group */
private ObjectAreaDescriptor objectAreaDescriptor = null;
/** the Object Area Position for the active environment group */
private ObjectAreaPosition objectAreaPosition = null;
/** the PresentationTextDescriptor for the active environment group */
private PresentationTextDescriptor presentationTextDataDescriptor = null;
/** the PageDescriptor for the active environment group */
private PageDescriptor pageDescriptor = null;
/** the resource manager */
private final Factory factory;
/**
* Constructor for the ActiveEnvironmentGroup, this takes a
* name parameter which must be 8 characters long.
*
* @param factory the object factory
* @param name the active environment group name
* @param width the page width
* @param height the page height
* @param widthRes the page width resolution
* @param heightRes the page height resolution
*/
public ActiveEnvironmentGroup(Factory factory,
String name, int width, int height, int widthRes, int heightRes) {
super(name);
this.factory = factory;
// Create PageDescriptor
this.pageDescriptor
= factory.createPageDescriptor(width, height, widthRes, heightRes);
// Create ObjectAreaDescriptor
this.objectAreaDescriptor
= factory.createObjectAreaDescriptor(width, height, widthRes, heightRes);
// Create PresentationTextDataDescriptor
this.presentationTextDataDescriptor
= factory.createPresentationTextDataDescriptor(width, height,
widthRes, heightRes);
}
/**
* Set the position of the object area
*
* @param x the x offset
* @param y the y offset
* @param rotation the rotation
*/
public void setObjectAreaPosition(int x, int y, int rotation) {
this.objectAreaPosition = factory.createObjectAreaPosition(x, y, rotation);
}
/**
* Accessor method to obtain the PageDescriptor object of the
* active environment group.
*
* @return the page descriptor object
*/
public PageDescriptor getPageDescriptor() {
return pageDescriptor;
}
/**
* Accessor method to obtain the PresentationTextDataDescriptor object of
* the active environment group.
*
* @return the presentation text descriptor
*/
public PresentationTextDescriptor getPresentationTextDataDescriptor() {
return presentationTextDataDescriptor;
}
/** {@inheritDoc} */
public void writeContent(OutputStream os) throws IOException {
super.writeTriplets(os);
writeObjects(mapCodedFonts, os);
writeObjects(mapDataResources, os);
writeObjects(mapPageOverlays, os);
writeObjects(mapPageSegments, os);
if (pageDescriptor != null) {
pageDescriptor.writeToStream(os);
}
if (objectAreaDescriptor != null && objectAreaPosition != null) {
objectAreaDescriptor.writeToStream(os);
objectAreaPosition.writeToStream(os);
}
if (presentationTextDataDescriptor != null) {
presentationTextDataDescriptor.writeToStream(os);
}
}
/** {@inheritDoc} */
protected void writeStart(OutputStream os) throws IOException {
byte[] data = new byte[17];
copySF(data, Type.BEGIN, Category.ACTIVE_ENVIRONMENT_GROUP);
os.write(data);
}
/** {@inheritDoc} */
protected void writeEnd(OutputStream os) throws IOException {
byte[] data = new byte[17];
copySF(data, Type.END, Category.ACTIVE_ENVIRONMENT_GROUP);
os.write(data);
}
/**
* Method to create a map coded font object
*
* @param fontRef the font number used as the resource identifier
* @param font the font
* @param size the point size of the font
* @param orientation the orientation of the font (e.g. 0, 90, 180, 270)
*/
public void createFont(int fontRef, AFPFont font, int size, int orientation) {
MapCodedFont mapCodedFont = getCurrentMapCodedFont();
if (mapCodedFont == null) {
mapCodedFont = factory.createMapCodedFont();
mapCodedFonts.add(mapCodedFont);
}
try {
mapCodedFont.addFont(fontRef, font, size, orientation);
} catch (MaximumSizeExceededException msee) {
mapCodedFont = factory.createMapCodedFont();
mapCodedFonts.add(mapCodedFont);
try {
mapCodedFont.addFont(fontRef, font, size, orientation);
} catch (MaximumSizeExceededException ex) {
// Should never happen (but log just in case)
log.error("createFont():: resulted in a MaximumSizeExceededException");
}
}
}
/**
* Getter method for the most recent MapCodedFont added to the
* Active Environment Group (returns null if no MapCodedFonts exist)
*
* @return the most recent Map Coded Font.
*/
private MapCodedFont getCurrentMapCodedFont() {
int size = mapCodedFonts.size();
if (size > 0) {
return (MapCodedFont)mapCodedFonts.get(size - 1);
} else {
return null;
}
}
public void addMapPageSegment(String name) {
try {
needMapPageSegment().addPageSegment(name);
} catch (MaximumSizeExceededException e) {
//Should not happen, handled internally
throw new IllegalStateException("Internal error: " + e.getMessage());
}
}
private MapPageSegment getCurrentMapPageSegment() {
return (MapPageSegment)getLastElement(this.mapPageSegments);
}
private MapPageSegment needMapPageSegment() {
if (this.mapPageSegments == null) {
this.mapPageSegments = new java.util.ArrayList();
}
MapPageSegment seg = getCurrentMapPageSegment();
if (seg == null || seg.isFull()) {
seg = new MapPageSegment();
this.mapPageSegments.add(seg);
}
return seg;
}
}