/*
 * 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.fo;

import java.util.HashSet;
import java.util.Set;

/**
 * Context class providing information needed while building the FO tree.
 */
public class FOTreeBuilderContext {

    /**
     * The current set of id's in the FO tree.
     * This is used so we know if the FO tree contains duplicates.
     */
    private Set idReferences = new HashSet();

    /**
     * The property list maker.
     */
    protected PropertyListMaker propertyListMaker;

    /**
     * The XMLWhitespaceHandler for this tree
     */
    protected XMLWhiteSpaceHandler whiteSpaceHandler = new XMLWhiteSpaceHandler();

    /**
     * Indicates whether processing descendants of a marker
     */
    private boolean inMarker = false;

    /**
     * Returns the set of ID references.
     * @return the ID references
     */
    public Set getIDReferences() {
        return idReferences;
    }

    /**
     * Return the propertyListMaker.
     *
     * @return the currently active {@link PropertyListMaker}
     */
    public PropertyListMaker getPropertyListMaker() {
        return propertyListMaker;
    }

    /**
     * Set a new propertyListMaker.
     *
     * @param propertyListMaker the new {@link PropertyListMaker} to use
     */
    public void setPropertyListMaker(PropertyListMaker propertyListMaker) {
        this.propertyListMaker = propertyListMaker;
    }

    /**
     * Return the XMLWhiteSpaceHandler
     * @return the whiteSpaceHandler
     */
    public XMLWhiteSpaceHandler getXMLWhiteSpaceHandler() {
        return whiteSpaceHandler;
    }

    /**
     * Switch to or from marker context
     * (used by FOTreeBuilder when processing
     *  a marker)
     *
     * @param inMarker  true if a marker is being processed;
     *                  false otherwise
     *
     */
    protected void switchMarkerContext(boolean inMarker) {
        this.inMarker = inMarker;
    }

    /**
     * Check whether in marker context
     *
     * @return true if a marker is being processed
     */
    protected boolean inMarker() {
        return this.inMarker;
    }

}
