// Copyright 2007 FreeHEP
package org.freehep.graphicsio.emf.gdi;

import java.awt.Color;
import java.awt.Font;

import org.freehep.graphicsio.emf.EMFConstants;

/**
 * StockObjects.java
 *
 * Created: Wed Dec 20 14:20:00 2006
 *
 * Copyright:
 * Company:
 *
 * @author Daniel Noll daniel@nuix.com
 * @version $Id: freehep-graphicsio-emf/src/main/java/org/freehep/graphicsio/emf/gdi/StockObjects.java c0f15e7696d3 2007/01/22 19:26:48 duns $
 */

public class StockObjects {
    // Supported by all versions of Win32...
    private static final int WHITE_BRUSH         = 0;
    private static final int LTGRAY_BRUSH        = 1;
    private static final int GRAY_BRUSH          = 2;
    private static final int DKGRAY_BRUSH        = 3;
    private static final int BLACK_BRUSH         = 4;
    private static final int NULL_BRUSH          = 5;
    private static final int WHITE_PEN           = 6;
    private static final int BLACK_PEN           = 7;
    private static final int NULL_PEN            = 8;
    private static final int OEM_FIXED_FONT      = 10;
    private static final int ANSI_FIXED_FONT     = 11;
    private static final int ANSI_VAR_FONT       = 12;
    private static final int SYSTEM_FONT         = 13;
    private static final int DEVICE_DEFAULT_FONT = 14;
    private static final int DEFAULT_PALETTE     = 15;
    private static final int SYSTEM_FIXED_FONT   = 16;

    // Windows 2000 or later...
    private static final int DEFAULT_GUI_FONT    = 17;

    // Windows XP or later...
    // These ones are magic.  They take the colour of the current device context
    // as set by SetDCBrushColor and SetDCPenColor
    private static final int DC_BRUSH            = 18;
    private static final int DC_PEN              = 19;

    private static final GDIObject[] objects = new GDIObject[20];
    static {
        Color nullColor = new Color(0, 0, 0, 0);

        objects[WHITE_BRUSH] = new LogBrush32(EMFConstants.BS_SOLID, Color.WHITE, 0);
        objects[LTGRAY_BRUSH] = new LogBrush32(EMFConstants.BS_SOLID, Color.LIGHT_GRAY, 0);
        objects[GRAY_BRUSH] = new LogBrush32(EMFConstants.BS_SOLID, Color.GRAY, 0);
        objects[DKGRAY_BRUSH] = new LogBrush32(EMFConstants.BS_SOLID, Color.DARK_GRAY, 0);
        objects[BLACK_BRUSH] = new LogBrush32(EMFConstants.BS_SOLID, Color.BLACK, 0);
        objects[NULL_BRUSH] = new LogBrush32(EMFConstants.BS_NULL, nullColor, 0);

        objects[WHITE_PEN] = new LogPen(EMFConstants.PS_SOLID, 1, Color.WHITE);
        objects[BLACK_PEN] = new LogPen(EMFConstants.PS_SOLID, 1, Color.BLACK);
        objects[NULL_PEN] = new LogPen(EMFConstants.PS_NULL, 1, nullColor);

        // XXX: Should these depend on the look and feel?
        objects[OEM_FIXED_FONT] = new LogFontW(new Font("Monospaced", Font.PLAIN, 12));
        objects[ANSI_FIXED_FONT] = objects[OEM_FIXED_FONT];
        objects[ANSI_VAR_FONT] = new LogFontW(new Font("SansSerif", Font.PLAIN, 12));
        objects[SYSTEM_FONT] = new LogFontW(new Font("Dialog", Font.PLAIN, 12));
        objects[DEVICE_DEFAULT_FONT] = objects[ANSI_VAR_FONT];
        objects[SYSTEM_FIXED_FONT] = objects[OEM_FIXED_FONT];
        objects[DEFAULT_GUI_FONT] = objects[SYSTEM_FONT];

        // TODO: DEFAULT_PALETTE, DC_BRUSH and DC_PEN
    }

    /**
     * Gets a stock object by value.
     *
     * @param value the value.
     * @return the stock object.
     */
    public static GDIObject getStockObject(int value) {
        if (value >= 0) {
            throw new IllegalArgumentException("Value does not represent a stock object: " + value);
        }

        value ^= 0x80000000;

        if (value >= objects.length) {
            throw new IllegalArgumentException("Stock object is out of bounds: " + value);
        }

        GDIObject object = objects[value];
        if (object == null) {
            throw new UnsupportedOperationException("Stock object not yet supported: " + value);
        }

        return object;
    }
}
