package cnp.ew.image;

import java.awt.*;
import java.awt.image.*;
import java.util.*;
import java.net.*;
import java.applet.*;
import java.io.*;

/**
 * Provides an application-wide manager for images that retrieves
 * them in groups transparently.  To use it:
 * - access the default imagegetter, by sending the static message
 *   getDefault(). Then send this the messages below.
 * - register an image, using either registerImageUrl() or
 *   registerImageName().  This will answer an id that should be stored
 *   to access the image.
 * - access the image, with getImage(), passing in the registered id.
 *
 * When an image is accessed, and has not yet been retrieved, all images
 * that are currently registered that haven't yet been retrieved will
 * be in parallel.  The method will block until all images have been
 * retrieved.
 */
public class CpImageGetter
{
    public static CpImageGetter defaultImageGetter = new CpImageGetter();

    Applet applet;
    Vector registeredFileNames;
    Hashtable images;
    Hashtable grayedImages;
    Vector packedImages;
    // TBD: Remove this, and figure out a better way
    public boolean isApplet = true;

    static {
        registerPackedImages();
    }


    public CpImageGetter()
    {
        registeredFileNames = new Vector();
        images = new Hashtable();
        grayedImages = new Hashtable();
        packedImages = new Vector();
    }



    public void setApplet(Applet newApplet)
    {
        applet = newApplet;
    }

    public static CpImageGetter getDefault()
    {
        return defaultImageGetter;
    }


    /**
     * Register an image filename, and answer an id to use
     * when retrieving the image with this filename.
     */
    public int registerImageName(String fileName)
    {
        registeredFileNames.addElement(fileName);
        return registeredFileNames.size() - 1;
    }

    public Image getImage(Component c, int id)
    {
        return getImage(c, (String)registeredFileNames.elementAt(id));
    }


    public Image getImage(Component c, String fileName)
    {
        return getImage(c, fileName, true);
    }

    public Image getImage(Component c, String fileName, boolean searchPackedImages)
    {

        Image image;


        image = (Image)images.get(fileName);

        if (image != null) {
            return image;
        }

        if (searchPackedImages) {
            image = getImageInPackedImages(fileName);
            if (image != null) {
                images.put(fileName, image);
                return image;
            }
        }

        try {
            retrieveAllRegisteredImages(c);
        }
        catch(InterruptedException e) {
            // TBD: this should probably not be caught...
        }

        image = (Image)images.get(fileName);
        return image;
    }

    public void addPackedImage(CpPackedImage packedImage)
    {
        packedImages.addElement(packedImage);
    }

    public void retrieveAllRegisteredImages(Component c)
    throws InterruptedException
    {
        String fileName;
        Image image;
        MediaTracker tracker = new MediaTracker(c);
        for (int i = 0; i < registeredFileNames.size(); i++) {
            fileName = (String)registeredFileNames.elementAt(i);
            if (images.get(fileName) == null && !isImageInPackedImages(fileName)) {
                try {
                    if (isApplet && applet != null) {
                        URL url = new URL(applet.getCodeBase() + "images/" + fileName);
                        image = Toolkit.getDefaultToolkit().getImage(url);
                    } else {
                        image = Toolkit.getDefaultToolkit().getImage("images" + File.separator + fileName);
                    }

                    images.put(fileName, image);
                    tracker.addImage(image, i);

                }
                catch(MalformedURLException e) {
                    e.printStackTrace();
                }
            }
        }
        tracker.waitForAll();
    }


    public Image getGrayedImage(Component c, Image image)
    {
        Image grayedImage = (Image)grayedImages.get(image);

        if (grayedImage == null) {
            ImageFilter f = new CpGrayFilter();
            ImageProducer producer = new FilteredImageSource(image.getSource(), f);
            grayedImage = c.createImage(producer);
            MediaTracker tracker = new MediaTracker(c);
            tracker.addImage(grayedImage, 1);
            try {
                tracker.waitForID(1);
            }
            catch(InterruptedException e) {
            }
            grayedImages.put(image, grayedImage);
        }

        return grayedImage;
    }


    Image getImageInPackedImages(String fileName)
    {
        Image image;
        CpPackedImage packedImage;
        for (int i=0; i < packedImages.size(); i++) {
            packedImage = (CpPackedImage)packedImages.elementAt(i);
            if ((image = packedImage.getImage(fileName)) != null) {
                return image;
            }
        }
        return null;
    }

    boolean isImageInPackedImages(String fileName)
    {
        Image image;
        CpPackedImage packedImage;
        for (int i=0; i < packedImages.size(); i++) {
            packedImage = (CpPackedImage)packedImages.elementAt(i);
            if (packedImage.isImageInPackedImage(fileName)) {
                return true;
            }
        }
        return false;
    }


    static void registerPackedImages()
    {
        registerPackedImageForLcImages();
        registerPackedImageForWpImages();
        registerPackedImageForIbImages();
        registerPackedImageForDemoImages();
        registerPackedImageForSsImages();
        registerPackedImageForChartImages();
        registerPackedImageForDlgdemoImages();
    }


    static void registerPackedImageForLcImages()
    {
        CpPackedImage packedImage = new CpPackedImage("lc.gif");
        packedImage.registerCroppedImage("darrow12.gif", new Rectangle(158, 0, 12, 12));
        packedImage.registerCroppedImage("plus.gif", new Rectangle(305, 0, 16, 16));
        packedImage.registerCroppedImage("falsep.gif", new Rectangle(24, 0, 17, 17));
        packedImage.registerCroppedImage("hslider.gif", new Rectangle(86, 0, 11, 21));
        packedImage.registerCroppedImage("larrow12.gif", new Rectangle(135, 0, 12, 12));
        packedImage.registerCroppedImage("folder.gif", new Rectangle(321, 0, 16, 16));
        packedImage.registerCroppedImage("darrow5.gif", new Rectangle(0, 0, 7, 5));
        packedImage.registerCroppedImage("openfold.gif", new Rectangle(289, 0, 16, 16));
        packedImage.registerCroppedImage("vslider.gif", new Rectangle(246, 0, 11, 21));
        packedImage.registerCroppedImage("false.gif", new Rectangle(7, 0, 17, 17));
        packedImage.registerCroppedImage("truep.gif", new Rectangle(210, 0, 17, 17));
        packedImage.registerCroppedImage("minus.gif", new Rectangle(273, 0, 16, 16));
        packedImage.registerCroppedImage("doc.gif", new Rectangle(257, 0, 16, 16));
        packedImage.registerCroppedImage("larrow7.gif", new Rectangle(147, 0, 11, 11));
        packedImage.registerCroppedImage("uarrow5.gif", new Rectangle(239, 0, 7, 5));
        packedImage.registerCroppedImage("true.gif", new Rectangle(193, 0, 17, 17));
        packedImage.registerCroppedImage("uarrow12.gif", new Rectangle(227, 0, 12, 12));
        packedImage.registerCroppedImage("rarrow12.gif", new Rectangle(170, 0, 12, 12));
        packedImage.registerCroppedImage("info.gif", new Rectangle(97, 0, 38, 39));
        packedImage.registerCroppedImage("rarrow7.gif", new Rectangle(182, 0, 11, 11));
        packedImage.registerCroppedImage("hbslider.gif", new Rectangle(41, 0, 45, 20));
        packedImage.registerCroppedImage("question.gif", new Rectangle(337, 0, 32, 32));

        CpImageGetter.getDefault().addPackedImage(packedImage);
    }

    static void registerPackedImageForDemoImages()
    {
        CpPackedImage packedImage = new CpPackedImage("demo.gif");
        packedImage.registerCroppedImage("stars.gif", new Rectangle(0, 0, 64, 16));
        packedImage.registerCroppedImage("th_dn.gif", new Rectangle(194, 0, 25, 19));
        packedImage.registerCroppedImage("mbox-emp.gif", new Rectangle(161, 0, 33, 30));
        packedImage.registerCroppedImage("th_up.gif", new Rectangle(219, 0, 25, 19));
        packedImage.registerCroppedImage("spot2.gif", new Rectangle(129, 0, 32, 32));
        packedImage.registerCroppedImage("mbox-ful.gif", new Rectangle(64, 0, 33, 30));
        packedImage.registerCroppedImage("star.gif", new Rectangle(244, 0, 17, 14));
        packedImage.registerCroppedImage("spot.gif", new Rectangle(97, 0, 32, 32));

        CpImageGetter.getDefault().addPackedImage(packedImage);
    }

    static void registerPackedImageForIbImages()
    {
        CpPackedImage packedImage = new CpPackedImage("ib.gif");
        packedImage.registerCroppedImage("ibentry.gif", new Rectangle(110, 0, 22, 22));
        packedImage.registerCroppedImage("ibmatchsizev.gif", new Rectangle(60, 22, 20, 19));
        packedImage.registerCroppedImage("ibmatchsizeh.gif", new Rectangle(40, 22, 20, 19));
        packedImage.registerCroppedImage("ibmatchsizeb.gif", new Rectangle(20, 22, 20, 19));
        packedImage.registerCroppedImage("ibalignt.gif", new Rectangle(180, 22, 20, 19));
        packedImage.registerCroppedImage("ibline.gif", new Rectangle(240, 0, 22, 22));
        packedImage.registerCroppedImage("ibgraphics.gif", new Rectangle(132, 0, 22, 22));
        packedImage.registerCroppedImage("maximize.gif", new Rectangle(440, 0, 16, 14));
        packedImage.registerCroppedImage("ibdistribh.gif", new Rectangle(80, 22, 20, 19));
        packedImage.registerCroppedImage("ibarrow.gif", new Rectangle(22, 0, 22, 22));
        packedImage.registerCroppedImage("ibalignr.gif", new Rectangle(200, 22, 20, 19));
        packedImage.registerCroppedImage("iblist.gif", new Rectangle(262, 0, 22, 22));
        packedImage.registerCroppedImage("ibvscroll.gif", new Rectangle(402, 0, 22, 22));
        packedImage.registerCroppedImage("ibzoomin.gif", new Rectangle(240, 22, 20, 19));
        packedImage.registerCroppedImage("ibdistribv.gif", new Rectangle(0, 22, 20, 19));
        packedImage.registerCroppedImage("ibtogglegrid.gif", new Rectangle(100, 22, 20, 19));
        packedImage.registerCroppedImage("ibimage.gif", new Rectangle(0, 0, 22, 22));
        packedImage.registerCroppedImage("ibcheckBox.gif", new Rectangle(66, 0, 22, 22));
        packedImage.registerCroppedImage("ibsizer.gif", new Rectangle(343, 0, 15, 15));
        packedImage.registerCroppedImage("ibradio.gif", new Rectangle(321, 0, 22, 22));
        packedImage.registerCroppedImage("ibalignl.gif", new Rectangle(220, 0, 20, 19));
        packedImage.registerCroppedImage("ibtime.gif", new Rectangle(380, 0, 22, 22));
        packedImage.registerCroppedImage("ibnotebook.gif", new Rectangle(299, 0, 22, 22));
        packedImage.registerCroppedImage("ibstaticText.gif", new Rectangle(358, 0, 22, 22));
        packedImage.registerCroppedImage("ibgrid.gif", new Rectangle(154, 0, 22, 22));
        packedImage.registerCroppedImage("iconize.gif", new Rectangle(456, 0, 16, 14));
        packedImage.registerCroppedImage("ibzoomout.gif", new Rectangle(220, 22, 20, 19));
        packedImage.registerCroppedImage("ibalignch.gif", new Rectangle(120, 22, 20, 19));
        packedImage.registerCroppedImage("winicon.gif", new Rectangle(424, 0, 16, 16));
        packedImage.registerCroppedImage("ibmover.gif", new Rectangle(284, 0, 15, 15));
        packedImage.registerCroppedImage("ibbutton.gif", new Rectangle(44, 0, 22, 22));
        packedImage.registerCroppedImage("close.gif", new Rectangle(472, 0, 16, 14));
        packedImage.registerCroppedImage("ibcombo.gif", new Rectangle(88, 0, 22, 22));
        packedImage.registerCroppedImage("ibgroupBox.gif", new Rectangle(176, 0, 22, 22));
        packedImage.registerCroppedImage("ibhscroll.gif", new Rectangle(198, 0, 22, 22));
        packedImage.registerCroppedImage("ibaligncv.gif", new Rectangle(140, 22, 20, 19));
        packedImage.registerCroppedImage("ibalignb.gif", new Rectangle(160, 22, 20, 19));

        CpImageGetter.getDefault().addPackedImage(packedImage);
    }


       static void registerPackedImageForWpImages()
    {
        CpPackedImage packedImage = new CpPackedImage("wp.gif");
        packedImage.registerCroppedImage("wpright.gif", new Rectangle(322, 0, 19, 18));
        packedImage.registerCroppedImage("wprightmargin.gif", new Rectangle(237, 0, 9, 8));
        packedImage.registerCroppedImage("wpbullet.gif", new Rectangle(57, 0, 19, 18));
        packedImage.registerCroppedImage("wpcut.gif", new Rectangle(133, 0, 19, 18));
        packedImage.registerCroppedImage("wpnew.gif", new Rectangle(246, 0, 19, 18));
        packedImage.registerCroppedImage("wpitalic.gif", new Rectangle(199, 0, 19, 18));
        packedImage.registerCroppedImage("wpprint.gif", new Rectangle(303, 0, 19, 18));
        packedImage.registerCroppedImage("wppaste.gif", new Rectangle(0, 0, 19, 18));
        packedImage.registerCroppedImage("wpcopy.gif", new Rectangle(114, 0, 19, 18));
        packedImage.registerCroppedImage("wpfind.gif", new Rectangle(152, 0, 19, 18));
        packedImage.registerCroppedImage("wpleft.gif", new Rectangle(218, 0, 19, 18));
        packedImage.registerCroppedImage("wpleftmargin.gif", new Rectangle(171, 0, 9, 14));
        packedImage.registerCroppedImage("wpopen.gif", new Rectangle(265, 0, 19, 18));
        packedImage.registerCroppedImage("wpbold.gif", new Rectangle(38, 0, 19, 18));
        packedImage.registerCroppedImage("wppreview.gif", new Rectangle(284, 0, 19, 18));
        packedImage.registerCroppedImage("wpundo.gif", new Rectangle(379, 0, 19, 18));
        packedImage.registerCroppedImage("wpsave.gif", new Rectangle(341, 0, 19, 18));
        packedImage.registerCroppedImage("wpaddgif.gif", new Rectangle(19, 0, 19, 18));
        packedImage.registerCroppedImage("wpunderline.gif", new Rectangle(360, 0, 19, 18));
        packedImage.registerCroppedImage("wpcenter.gif", new Rectangle(76, 0, 19, 18));
        packedImage.registerCroppedImage("wpinsertdate.gif", new Rectangle(180, 0, 19, 18));
        packedImage.registerCroppedImage("wpcolor.gif", new Rectangle(95, 0, 19, 18));

        CpImageGetter.getDefault().addPackedImage(packedImage);
    }

    static void registerPackedImageForSsImages()
    {
        CpPackedImage packedImage = new CpPackedImage("ss.gif");
        packedImage.registerCroppedImage("sssum.gif", new Rectangle(428, 0, 19, 18));
        packedImage.registerCroppedImage("ssinsertlc.gif", new Rectangle(329, 0, 22, 22));
        packedImage.registerCroppedImage("ssborder9.gif", new Rectangle(223, 0, 17, 17));
        packedImage.registerCroppedImage("ssborder8.gif", new Rectangle(206, 0, 17, 17));
        packedImage.registerCroppedImage("ssborder7.gif", new Rectangle(189, 0, 17, 17));
        packedImage.registerCroppedImage("ssborder11.gif", new Rectangle(87, 0, 17, 17));
        packedImage.registerCroppedImage("ssshowgrid.gif", new Rectangle(351, 0, 20, 19));
        packedImage.registerCroppedImage("ssbottom.gif", new Rectangle(240, 0, 19, 18));
        packedImage.registerCroppedImage("ssborder6.gif", new Rectangle(172, 0, 17, 17));
        packedImage.registerCroppedImage("ssborder10.gif", new Rectangle(70, 0, 17, 17));
        packedImage.registerCroppedImage("ssbackcolor.gif", new Rectangle(466, 0, 19, 18));
        packedImage.registerCroppedImage("ssborder5.gif", new Rectangle(155, 0, 17, 17));
        packedImage.registerCroppedImage("sswrap.gif", new Rectangle(0, 0, 19, 18));
        packedImage.registerCroppedImage("sssortup.gif", new Rectangle(409, 0, 19, 18));
        packedImage.registerCroppedImage("ssborder4.gif", new Rectangle(138, 0, 17, 17));
        packedImage.registerCroppedImage("sscenterv.gif", new Rectangle(259, 0, 19, 18));
        packedImage.registerCroppedImage("ssborder3.gif", new Rectangle(121, 0, 17, 17));
        packedImage.registerCroppedImage("ssborder2.gif", new Rectangle(104, 0, 17, 17));
        packedImage.registerCroppedImage("sstop.gif", new Rectangle(447, 0, 19, 18));
        packedImage.registerCroppedImage("ssborder.gif", new Rectangle(19, 0, 17, 15));
        packedImage.registerCroppedImage("ssborder1.gif", new Rectangle(53, 0, 17, 17));
        packedImage.registerCroppedImage("ssfunction.gif", new Rectangle(310, 0, 19, 18));
        packedImage.registerCroppedImage("ssborder0.gif", new Rectangle(36, 0, 17, 17));
        packedImage.registerCroppedImage("sscheck.gif", new Rectangle(278, 0, 13, 14));
        packedImage.registerCroppedImage("ssx.gif", new Rectangle(485, 0, 13, 14));
        packedImage.registerCroppedImage("ssshowheaders.gif", new Rectangle(371, 0, 19, 18));
        packedImage.registerCroppedImage("sssortdown.gif", new Rectangle(390, 0, 19, 18));
        packedImage.registerCroppedImage("ssforecolor.gif", new Rectangle(291, 0, 19, 18));

        CpImageGetter.getDefault().addPackedImage(packedImage);
    }

    static void registerPackedImageForChartImages()
    {
        CpPackedImage packedImage = new CpPackedImage("chart.gif");
        packedImage.registerCroppedImage("sailor.gif", new Rectangle(332, 0, 110, 150));
        packedImage.registerCroppedImage("guy.gif", new Rectangle(224, 0, 108, 147));
        packedImage.registerCroppedImage("inventor.gif", new Rectangle(442, 0, 110, 150));
        packedImage.registerCroppedImage("ptbarnum.gif", new Rectangle(0, 0, 114, 143));
        packedImage.registerCroppedImage("guy2.gif", new Rectangle(114, 0, 110, 149));

        CpImageGetter.getDefault().addPackedImage(packedImage);
    }

    static void registerPackedImageForDlgdemoImages()
    {
        CpPackedImage packedImage = new CpPackedImage("dlgdemo.gif");
        packedImage.registerCroppedImage("msgdlg.gif", new Rectangle(58, 0, 58, 34));
        packedImage.registerCroppedImage("progressdlg.gif", new Rectangle(0, 0, 58, 34));
        packedImage.registerCroppedImage("promptdlg.gif", new Rectangle(232, 0, 58, 40));
        packedImage.registerCroppedImage("okcanceldlg.gif", new Rectangle(116, 0, 58, 34));
        packedImage.registerCroppedImage("listdlg.gif", new Rectangle(174, 0, 58, 40));

        CpImageGetter.getDefault().addPackedImage(packedImage);
    }
}





