/* * 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 = new java.util.ArrayList/**/(); /** 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; } }