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

import org.apache.fop.events.EventBroadcaster;
import org.apache.fop.events.EventProducer;

/**
 * Event producer interface for AFP-specific events.
 */
public interface AFPEventProducer extends EventProducer {

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

        private Provider() {
        }

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

    /**
     * Warn about using default font setup.
     *
     * @param source the event source
     * @event.severity WARN
     */
    void warnDefaultFontSetup(Object source);

    /**
     * Warn about a missing default "any" font configuration.
     *
     * @param source the event source
     * @param style the font style
     * @param weight the font weight
     * @event.severity WARN
     */
    void warnMissingDefaultFont(Object source, String style, int weight);

    /**
     * A character set encoding error occurred.
     *
     * @param source the event source
     * @param charSetName the character set name
     * @param encoding the encoding
     * @event.severity ERROR
     */
    void characterSetEncodingError(Object source, String charSetName, String encoding);

    /**
     * Triggered when an external resource fails to be embedded.
     *
     * @param source the event source
     * @param resourceName the name of the resource where the error occurred
     * @param e the original exception
     * @event.severity ERROR
     */
    void resourceEmbeddingError(Object source, String resourceName, Exception e);

    /**
     * A mandatory font configuration node is missing at location.
     * @param source the event source
     * @param missingConfig the expected configuration element
     * @param location the position of the missing element within the config file.
     * @event.severity ERROR
     */
    void fontConfigMissing(Object source, String missingConfig, String location);

    /**
     * The character set given has an invalid name.
     * @param source the event source
     * @param msg the error message
     * @event.severity ERROR
     */
    void characterSetNameInvalid(Object source, String msg);

    /**
     * The code page for an AFP font could not be found.
     * @param source the event source
     * @param e the original exception
     * @event.severity ERROR
     */
    void codePageNotFound(Object source, Exception e);

    /**
     * This is a generic event for invalid configuration errors.
     * @param source the event source
     * @param e the original exception
     * @event.severity ERROR
     */
    void invalidConfiguration(Object source, Exception e);

    /**
     * The characterset is missing metric information for the specified character
     * @param source the event source
     * @param character the character with missing metric information.
     * @param charSet the character set containing missing metric information
     * @event.severity WARN
     */
    void charactersetMissingMetrics(Object source, char character, String charSet);

    /**
     * Double-byte fonts are not currently supported in SVG.
     * @param source the event source
     * @param fontFamily name of DB font
     * @event.severity WARN
     */
    void invalidDBFontInSVG(Object source, String fontFamily);
}
