/*
 * 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 org.xml.sax.Locator;

import org.apache.fop.events.EventBroadcaster;
import org.apache.fop.events.EventProducer;
import org.apache.fop.fo.pagination.PageProductionException;

/**
 * Event producer interface for block-level layout managers.
 */
public interface BlockLevelEventProducer extends EventProducer {

    /**
     * Provider class for the event producer.
     */
    final class Provider {

        private Provider() { }

        /**
         * Returns an event producer.
         * @param broadcaster the event broadcaster to use
         * @return the event producer
         */
        public static BlockLevelEventProducer get(EventBroadcaster broadcaster) {
            return broadcaster.getEventProducerFor(BlockLevelEventProducer.class);
        }
    }

    /**
     * The contents of a table-row are too big to fit in the constraints.
     * @param source the event source
     * @param row the row number
     * @param effCellBPD the effective extent in block-progression direction of the cell
     * @param maxCellBPD the maximum extent in block-progression direction of the cell
     * @param loc the location of the error or null
     * @event.severity WARN
     */
    void rowTooTall(Object source, int row, int effCellBPD, int maxCellBPD, Locator loc);

    /**
     * Auto-table layout is not supported, yet.
     * @param source the event source
     * @param loc the location of the error or null
     * @event.severity INFO
     */
    void tableFixedAutoWidthNotSupported(Object source, Locator loc);

    /**
     * An formatting object is too wide.
     * @param source the event source
     * @param elementName the formatting object
     * @param effIPD the effective extent in inline-progression direction of the table contents
     * @param maxIPD the maximum extent in inline-progression direction available
     * @param loc the location of the error or null
     * @event.severity WARN
     */
    void objectTooWide(Object source, String elementName, int effIPD, int maxIPD, Locator loc);

    /**
     * An overconstrained geometry adjustment rule was triggered (5.3.4, XSL 1.0).
     * @param source the event source
     * @param elementName the formatting object
     * @param amount the amount of the adjustment (in mpt)
     * @param loc the location of the error or null
     * @event.severity INFO
     */
    void overconstrainedAdjustEndIndent(Object source, String elementName, int amount, Locator loc);

    /**
     * Contents IPD overflow a viewport.
     * @param source the event source
     * @param elementName the formatting object
     * @param amount the amount by which the contents overflow (in mpt)
     * @param clip true if the content will be clipped
     * @param canRecover indicates whether FOP can recover from this problem and continue working
     * @param loc the location of the error or null
     * @event.severity ERROR
     */
    void viewportIPDOverflow(Object source, String elementName, int amount, boolean clip,
            boolean canRecover, Locator loc);

    /**
     * Contents BPD overflow a viewport.
     * @param source the event source
     * @param elementName the formatting object
     * @param amount the amount by which the contents overflow (in mpt)
     * @param clip true if the content will be clipped
     * @param canRecover indicates whether FOP can recover from this problem and continue working
     * @param loc the location of the error or null
     * @event.severity ERROR
     */
    void viewportBPDOverflow(Object source, String elementName, int amount, boolean clip,
            boolean canRecover, Locator loc);

    /**
     * Contents overflow a region viewport.
     * @param source the event source
     * @param elementName the formatting object
     * @param page the page number/name where the overflow happened
     * @param amount the amount by which the contents overflow (in mpt)
     * @param clip true if the content will be clipped
     * @param canRecover indicates whether FOP can recover from this problem and continue working
     * @param loc the location of the error or null
     * @throws LayoutException the layout error provoked by the method call
     * @event.severity FATAL
     */
    void regionOverflow(Object source, String elementName,
            String page,
            int amount, boolean clip, boolean canRecover,
            Locator loc) throws LayoutException;

    /**
     * Contents overflow a static region viewport.
     * @param source the event source
     * @param elementName the formatting object
     * @param page the page number/name where the overflow happened
     * @param amount the amount by which the contents overflow (in mpt)
     * @param clip true if the content will be clipped
     * @param canRecover indicates whether FOP can recover from this problem and continue working
     * @param loc the location of the error or null
     * @throws LayoutException the layout error provoked by the method call
     * @event.severity FATAL
     */
    void staticRegionOverflow(Object source, String elementName,
            String page,
            int amount, boolean clip, boolean canRecover,
            Locator loc) throws LayoutException;

    /**
     * Indicates that FOP doesn't support flows that are not mapped to region-body, yet.
     * @param source the event source
     * @param flowName the flow name
     * @param masterName the page master name
     * @param loc the location of the error or null
     * @throws UnsupportedOperationException the layout error provoked by the method call
     * @event.severity FATAL
     */
    void flowNotMappingToRegionBody(Object source, String flowName, String masterName,
            Locator loc) throws UnsupportedOperationException;

    /**
     * A page sequence master is exhausted.
     * @param source the event source
     * @param pageSequenceMasterName the name of the page sequence master
     * @param canRecover indicates whether FOP can recover from this problem and continue working
     * @param loc the location of the error or null
     * @throws PageProductionException the error provoked by the method call
     * @event.severity FATAL
     */
    void pageSequenceMasterExhausted(Object source, String pageSequenceMasterName,
            boolean canRecover, Locator loc) throws PageProductionException;

    /**
     * No subsequences in page sequence master.
     * @param source the event source
     * @param pageSequenceMasterName the name of the page sequence master
     * @param loc the location of the error or null
     * @throws PageProductionException the error provoked by the method call
     * @event.severity FATAL
     */
    void missingSubsequencesInPageSequenceMaster(Object source, String pageSequenceMasterName,
            Locator loc) throws PageProductionException;

    /**
     * No single-page-master matching in page sequence master.
     * @param source the event source
     * @param pageSequenceMasterName the name of the page sequence master
     * @param pageMasterName the name of the page master not matching
     * @param loc the location of the error or null
     * @throws PageProductionException the error provoked by the method call
     * @event.severity FATAL
     */
    void noMatchingPageMaster(Object source, String pageSequenceMasterName,
            String pageMasterName, Locator loc) throws PageProductionException;

    /**
     * An element that cannot handle changing IPD (list, table) is flowing to a narrower
     * page. Some content may be lost.
     *
     * @param source the event source
     * @event.severity WARN
     */
    void nonRestartableContentFlowingToNarrowerPage(Object source);

    /**
     * A feasible layout has reached the given number of parts (columns or pages).
     *
     * @param source the event source
     * @param partCount the number of parts that the layout has reached
     * @event.severity INFO
     */
    void layoutHasReachedParts(Object source, int partCount);

    /**
     * Last page master reference missing.
     *
     * @param source the event source
     * @event.severity WARN
     */
    void lastPageMasterReferenceMissing(Object source, Locator loc);
}
