// Java2DExample.java
// Java2DExample is an application that applies filters to an
// image using Java 2D.
package ip.j2d;

// Java core packages

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Main extends JFrame {

    private JMenu filterMenu;
    private ImagePanel imagePanel;

    // image filters
    private BufferedImageProcess invertFilter = new InvertFilter();
    private BufferedImageProcess sharpenFilter = new SharpenFilter();
    private BufferedImageProcess blurFilter = new BlurFilter();
    private BufferedImageProcess colorFilter = new ColorFilter();
    private BufferedImageProcess pseudoColor = new PseudoColor();

    // initialize JMenuItems
    public Main() {
        super("Java 2D Image Processing Demo");

        // initialize ImagePanel
        initGui();

    } // end Java2DExample constructor

    private void initGui() {
        imagePanel = new ImagePanel(
                futils.Futil.getReadFile("select an image"));

        // create JMenuBar
        JMenuBar menuBar = new JMenuBar();
        setJMenuBar(menuBar);

        // create JMenu
        filterMenu = new JMenu("Image Filters");
        filterMenu.setMnemonic('I');

        // create JMenuItem for displaying orginal Image
        JMenuItem originalMenuItem =
                new JMenuItem("Display Original");
        originalMenuItem.setMnemonic('O');

        originalMenuItem.addActionListener(
                new ActionListener() {

                    // show original Image
                    public void actionPerformed(ActionEvent action) {
                        imagePanel.displayOriginalImage();
                    }

                } // end anonymous inner class
        );

        // create JMenuItems for Java2DImageFilter
        JMenuItem invertMenuItem = createMenuItem(
                "Invert", 'I', invertFilter);
        JMenuItem sharpenMenuItem = createMenuItem(
                "Sharpen", 'S', sharpenFilter);
        JMenuItem blurMenuItem = createMenuItem(
                "Blur", 'B', blurFilter);
        JMenuItem changeColorsMenuItem = createMenuItem(
                 "Change Colors", 'C', colorFilter);
        JMenuItem pseudoColorMenuItem = createMenuItem(
                 "pseudoColor", 'p', pseudoColor);

        // add JMenuItems to JMenu
        filterMenu.add(originalMenuItem);
        filterMenu.add(invertMenuItem);
        filterMenu.add(sharpenMenuItem);
        filterMenu.add(blurMenuItem);
        filterMenu.add(changeColorsMenuItem);
        filterMenu.add(pseudoColorMenuItem);

        // add JMenu to JMenuBar
        menuBar.add(filterMenu);

        getContentPane().add(imagePanel, BorderLayout.CENTER);
    }



    // create JMenuItem and ActionListener for given filter
    public JMenuItem createMenuItem(String menuItemName,
                                    char mnemonic,
                                    final BufferedImageProcess filter) {
        // create JMenuItem
        JMenuItem menuItem = new JMenuItem(menuItemName);

        // set Mnemonic
        menuItem.setMnemonic(mnemonic);

        menuItem.addActionListener(
                new ActionListener() {

                    // apply Java2DImageFilter when MenuItem accessed
                    public void actionPerformed(ActionEvent action) {
                        imagePanel.applyFilter(filter);
                    }

                } // end anonymous inner class
        );

        return menuItem;

    } // end method createMenuItem

    // start program
    public static void main(String args[]) {
        Main m = new Main();
        m.setDefaultCloseOperation(EXIT_ON_CLOSE);
        m.pack();
        m.setVisible(true);
    }
}