package scribble3; 

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*; 
import java.net.URL;

public class Scribble extends JFrame {

  public Scribble(String title) {
    super(title);
    // calling factory method 
    canvas = makeCanvas(); 
    getContentPane().setLayout(new BorderLayout()); 
    menuBar = createMenuBar(); 
    getContentPane().add(menuBar, BorderLayout.NORTH); 
    getContentPane().add(canvas, BorderLayout.CENTER);
    addWindowListener(new WindowAdapter() {
	public void windowClosing(WindowEvent e) {
	  if (exitAction != null) { 
	    exitAction.actionPerformed(new ActionEvent(Scribble.this, 0, null)); 
	  }
	}
      }); 
  }

  protected JMenuBar createMenuBar() {
    JMenuBar menuBar = new JMenuBar();
    JMenu menu; 
    JMenuItem mi;

    // File menu 
    menu = new JMenu("File"); 
    menuBar.add(menu); 

    mi = new JMenuItem("New");
    menu.add(mi);
    mi.addActionListener(new NewFileListener()); 

    mi = new JMenuItem("Open");
    menu.add(mi);
    mi.addActionListener(new OpenFileListener()); 

    mi = new JMenuItem("Save");
    menu.add(mi);
    mi.addActionListener(new SaveFileListener()); 

    mi = new JMenuItem("Save As");
    menu.add(mi);
    mi.addActionListener(new SaveAsFileListener()); 

    menu.add(new JSeparator()); 

    exitAction = new ExitListener(); 
    mi = new JMenuItem("Exit");
    menu.add(mi);
    mi.addActionListener(exitAction); 

    // option menu
    menu = new JMenu("Option"); 
    menuBar.add(menu); 

    mi = new JMenuItem("Color");
    menu.add(mi);
    mi.addActionListener(new ColorListener()); 
  
      menu.add(new JSeparator()); 

    mi = new JMenuItem("Background Color");
    menu.add(mi);
    mi.addActionListener(new BackColorListener()); 

    mi = new JMenuItem("Background image");
    menu.add(mi);
    mi.addActionListener(new BackImageListener()); 

    // horizontal space 
    menuBar.add(Box.createHorizontalGlue());

    // Help menu 
    menu = new JMenu("Help"); 
    menuBar.add(menu); 

    mi = new JMenuItem("About");
    menu.add(mi);
    mi.addActionListener(new AboutListener()); 

    return menuBar; 
  }

  // factory method 
  protected ScribbleCanvas makeCanvas() {
    return new ScribbleCanvas(); 
  }

  protected void newFile() { 
    currentFilename = null; 
    canvas.newFile(); 
    setTitle("Scribble Pad");
  }

  protected void openFile(String filename) { 
    currentFilename = filename; 
    canvas.openFile(filename);
    setTitle("Scribble Pad [" + currentFilename + "]"); 
  }

  protected void saveFile() { 
    if (currentFilename == null) {
      currentFilename = "Untitled"; 
    }
    canvas.saveFile(currentFilename); 
    setTitle("Scribble Pad [" + currentFilename + "]");
  }

  protected void saveFileAs(String filename) { 
    currentFilename = filename; 
    canvas.saveFile(filename); 
    setTitle("Scribble Pad [" + currentFilename + "]");
  }

  class NewFileListener implements ActionListener { 
    
    public void actionPerformed(ActionEvent e) {
      newFile(); 
    }

  }

  class OpenFileListener implements ActionListener { 

    public void actionPerformed(ActionEvent e) {
      int retval = chooser.showDialog(null, "Open");
      if (retval == JFileChooser.APPROVE_OPTION) {
	File theFile = chooser.getSelectedFile();
	if (theFile != null) {
	  if (theFile.isFile()) {
	    String filename = chooser.getSelectedFile().getAbsolutePath();
	    openFile(filename); 
	  }
	}
      }
    }

  }

  class BackImageListener implements ActionListener { 

    public void actionPerformed(ActionEvent e) {
      int retval = chooser.showDialog(null, "Open");
      if (retval == JFileChooser.APPROVE_OPTION) {
	File theFile = chooser.getSelectedFile();
	if (theFile != null) {
	  if (theFile.isFile()) {
	    String filename = chooser.getSelectedFile().getAbsolutePath();
	    Image img = getImage(filename);
	    canvas.setBackImage(img); 
	
  }
	}
      }
    }

  }


    // get an image from the given filename
    private static Image getImage(String filename) {

        // to read from file
        ImageIcon icon = new ImageIcon(filename);

        // try to read from URL
        if ((icon == null) || (icon.getImageLoadStatus() != MediaTracker.COMPLETE)) {
            try {
                URL url = new URL(filename);
                icon = new ImageIcon(url);
            } catch (Exception e) { /* not a url */ }
        }

        // in case file is inside a .jar
        if ((icon == null) || (icon.getImageLoadStatus() != MediaTracker.COMPLETE)) {
            URL url = StdDraw.class.getResource(filename);
            if (url == null) throw new RuntimeException("image " + filename + " not found");
            icon = new ImageIcon(url);
        }

        return icon.getImage();
    }




  class SaveFileListener implements ActionListener { 
    
    public void actionPerformed(ActionEvent e) {
      saveFile(); 
    }

  }

  class SaveAsFileListener implements ActionListener { 

    public void actionPerformed(ActionEvent e) {
      int retval = chooser.showDialog(null, "Save As");
      if (retval == JFileChooser.APPROVE_OPTION) {
	File theFile = chooser.getSelectedFile();
	if (theFile != null) {
	  if (!theFile.isDirectory()) {
	    String filename = chooser.getSelectedFile().getAbsolutePath();
	    saveFileAs(filename); 
	  }
	}
      }
    }

  }

  class ExitListener implements ActionListener { 
    
    public void actionPerformed(ActionEvent e) {
      int result = JOptionPane.showConfirmDialog(null,
						 "Do you want to exit Scribble Pad?", 
						 "Exit Scribble Pad?",
						 JOptionPane.YES_NO_OPTION);
      if (result == JOptionPane.YES_OPTION) {
	saveFile(); 
	System.exit(0); 
      }
    }

  }

  class ColorListener implements ActionListener { 
    
    public void actionPerformed(ActionEvent e) {
      Color result = dialog.showDialog();
      if (result != null) { 
	canvas.setCurColor(result);
      }
    }

    protected ColorDialog dialog = 
      new ColorDialog(Scribble.this, "Choose color", canvas.getCurColor());

  }


  class BackColorListener implements ActionListener { 
    
    public void actionPerformed(ActionEvent e) {
       
      Color result = dialog.showDialog();
      if (result != null) { 
        canvas.setBack(result);
        
      }
    }

    protected ColorDialog dialog = 
      new ColorDialog(Scribble.this, "Choose color", canvas.getCurColor());

  }

  class AboutListener implements ActionListener { 
    
    public void actionPerformed(ActionEvent e) {
      JOptionPane.showMessageDialog(null, 
				    "DrawingPad version 1.0\nCopyright (c) Xiaoping Jia 2002", "About", 
				    JOptionPane.INFORMATION_MESSAGE); 
    }

  }

  protected ScribbleCanvas canvas; 
  protected JMenuBar menuBar; 

  protected String currentFilename = null; 
  protected ActionListener exitAction; 
  protected JFileChooser chooser = new JFileChooser(".");

  public static void main(String[] args) {
    JFrame frame = new Scribble("Scribble Pad");
    frame.setSize(width, height);
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    frame.setLocation(screenSize.width/2 - width/2,
		      screenSize.height/2 - height/2);
    frame.show();
  }

  protected static int width = 600; 
  protected static int height = 400; 

}