/*
 * @(#)$RCSfile: ParagraphRenderer.java,v $ $Revision: 1.2 $ $Date: 2002/02/16 03:06:44 $
 *
 * (C) Copyright IBM Corp. 1998-1999.  All Rights Reserved.
 *
 * The program is provided "as is" without any warranty express or
 * implied, including the warranty of non-infringement and the implied
 * warranties of merchantibility and fitness for a particular purpose.
 * IBM will not be liable for any damages suffered by you as a result
 * of using the Program. In no event will IBM be liable for any
 * special, indirect or consequential damages or lost profits even if
 * IBM has been advised of the possibility of their occurrence. IBM
 * will not be liable for any third party claims against you.
 */
// Requires Java2
package com.ibm.richtext.textformat;

import com.ibm.richtext.textlayout.attributes.AttributeMap;
import com.ibm.richtext.textlayout.attributes.TextAttribute;

import com.ibm.richtext.styledtext.MConstText;

import java.awt.Color;

///*JDK12IMPORTS
import java.awt.font.FontRenderContext;
import java.awt.font.LineBreakMeasurer;
import java.awt.Graphics2D;
//JDK12IMPORTS*/

/*JDK11IMPORTS
import com.ibm.richtext.textlayout.FontRenderContext;
import com.ibm.richtext.textlayout.LineBreakMeasurer;
import com.ibm.richtext.textlayout.Graphics2D;
JDK11IMPORTS*/

/**
 * ParagraphRenderer is a factory for LayoutInfo objects.
 */
abstract class ParagraphRenderer {

    static final String COPYRIGHT =
                "(C) Copyright IBM Corp. 1998-1999 - All Rights Reserved";
    // If renderers can ever travel with their styles, then this attribute will denote a
    // renderer.  For now, renderers are not added as styles so this isn't needed.
    //static final TextAttribute PARAGRAPH_RENDERER = new TextAttribute("Paragraph_Renderer") {};

    /**
     * Reset the renderer to use information from this style. Since renderers may be shared, you should
     * make sure the renderer is initialized for the style you wish to render before you use it.
     */
    public void initRenderer(AttributeMap pStyle) {
    }

    /**
     * Return a LayoutInfo for the paragraph represented by
     * measurer.
     * @param text the text containing the paragraph
     * @param layoutToReuse clients can pass in a LayoutInfo
     * which the ParagraphRenderer may choose to reuse
     * and return.  If null, a new LayoutInfo will be
     * created and returned.
     * @param measurer the LineBreakMeasurer for this paragraph.
     *  Current position should be the first character on the line.
     *  If null, a 0-length line is generated.  If measurer is null
     *  then paragraphStart and paragraphLimit should be equal.
     * @param frc the FontRenderContext used for measurerment
     * @param paragraphStart the index in the text where the
     * current paragraph begins
     * @param paragraphLimit the index of the first character
     * after the current paragraph
     * @param totalFormatWidth the width in which the line should fit
     * @param lineBound where right-aligned lines are aligned
     */
    public abstract LayoutInfo layout(MConstText text,
                                      LayoutInfo layoutToReuse,
                                      LineBreakMeasurer measurer,
                                      FontRenderContext frc,
                                      int paragraphStart,
                                      int paragraphLimit,
                                      int totalFormatWidth,
                                      int lineBound);

}
