
 
//import the packages for using the classes in them into the program
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;


/**
 *A PUBLIC CLASS FOR NOTEPAD.JAVA
 */
public class Notepad extends JFrame{
    //for using the methods in these classes
    public Actions actions = new Actions(this);
    public Center center = new Center(this);
	

    //for using undo & redo
    //    UndoManager undo = new UndoManager();
    //UndoAction undoAction = new UndoAction(this);
    //RedoAction redoAction = new RedoAction(this);

	
    //declaration of the private variables used in the program
    //create the text area
    JTextArea textArea;
    //create the Menu Bar that contains the JMenu "filE, ediT, vieW, formaT, helP"
    JMenuBar Menubar;
    //Create the menu that contains the items
    JMenu filE, ediT, vieW, formaT, helP;
    //Create the menu items
    JMenuItem neW, opeN, prinT, exiT, abouT,
	cuT, copY, pastE, selectALL;
    JCheckBoxMenuItem lineWraP;
    //Create the Tool Bar that contains the JButton
    JToolBar toolBar;
    //Create the buttons
    JButton newButton, openButton,  printButton, 
	cutButton, copyButton, pasteButton,
	aboutButton;
    //Create Scroll pane (JScrollPane) for the JTextArea
    JScrollPane scrollpane;
	
    //for using lineWrap & textArea @Actions.java
    public JCheckBoxMenuItem getLineWrap(){
        return lineWraP;
    }
    public JTextArea getTextArea(){
        return textArea;
    }



    void setup() {
        actions = new Actions(this);
        center = new Center(this);
    }


    void initMenuBar() {
        //for setting the menu bar
        Menubar = new JMenuBar();
        setJMenuBar(Menubar);
        //adding file, edit, view, format, help to the menu bar
        Menubar.add(filE   = new JMenu("File"));
        Menubar.add(ediT   = new JMenu("Edit"));
        Menubar.add(vieW   = new JMenu("View"));
        Menubar.add(formaT = new JMenu("Format"));
        Menubar.add(helP   = new JMenu("Help"));
    }       

    void initMenuItems() {
	
        /**
         *adding neW, opeN, savE, saveAS, prinT & exiT to the filE Menu,
         *adding a small image icon to the menu item &
         *adding separator between the menu item
         */
        filE.add(neW    = new JMenuItem("New", new ImageIcon(this.getClass().getResource("images/new.gif"))));
        filE.add(opeN   = new JMenuItem("Open", new ImageIcon(this.getClass().getResource("images/open.gif"))));

        filE.add(prinT  = new JMenuItem("Print", new ImageIcon(this.getClass().getResource("images/print.gif"))));
        filE.add(exiT   = new JMenuItem("Exit")); //, new ImageIcon(this.getClass().getResource("images/exit.gif"))));  -- exit.gif missing
        filE.insertSeparator(4);
        filE.insertSeparator(6);
		
        /**
         *adding cuT, copY, pastE, finD, findNexT & selectALL to the ediT Menu,
         *adding a small image icon to the menu item &
         *adding separator between the menu item
         */

        ediT.add(cuT  = new JMenuItem("Cut",  new ImageIcon(this.getClass().getResource("images/cut.gif"))));
        ediT.add(copY = new JMenuItem("Copy", new ImageIcon(this.getClass().getResource("images/copy.gif"))));
        ediT.add(pastE= new JMenuItem("Paste",new ImageIcon(this.getClass().getResource("images/paste.gif"))));

        ediT.addSeparator();

        ediT.add(selectALL= new JMenuItem("Select All"));


		
        /**
         *adding lineWraP & fonT to the formaT Menu,
         *adding abouT to the helP Menu & 
         *adding a samll image icon to the menu item
         */
        formaT.add(lineWraP = new JCheckBoxMenuItem("Line Wrap"));

        helP.add(abouT = new JMenuItem("About Notepad", new ImageIcon(this.getClass().getResource("images/about.gif"))));
                
    }

    void initMnemonics() {
        /**
         *allowing the file   menu to be selected by pressing ALT + F
         *allowing the edit   menu to be selected by pressing ALT + E
         *allowing the view   menu to be selected by pressing ALT + V
         *allowing the format menu to be selected by pressing ALT + O
         *allowing the help   menu to be selected by pressing ALT + H
         */
        filE.setMnemonic('f');
        ediT.setMnemonic('e');
        vieW.setMnemonic('v');
        formaT.setMnemonic('o');
        helP.setMnemonic('h');
    }

    void initAccelerators() {

        /**
         *allowing the neW       menu item to be selected by pressing ALT + N
         *allowing the opeN      menu item to be selected by pressing ALT + O
         *allowing the savE      menu item to be selected by pressing ALT + S
         *allowing the prinT     menu item to be selected by pressing ALT + P
         *allowing the exiT      menu item to be selected by pressing ALT + F4
         *allowing the cuT       menu item to be selected by pressing ALT + X
         *allowing the copY      menu item to be selected by pressing ALT + C
         *allowing the pastE     menu item to be selected by pressing ALT + V
         *allowing the finD      menu item to be selected by pressing ALT + F
         *allowing the findNexT  menu item to be selected by pressing ALT + F3
         *allowing the selectAll menu item to be selected by pressing ALT + A
         */
        neW.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, ActionEvent.CTRL_MASK));
        opeN.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, ActionEvent.CTRL_MASK));
        
        prinT.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, ActionEvent.CTRL_MASK));
        exiT.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4, ActionEvent.CTRL_MASK));
        cuT.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.CTRL_MASK));
        copY.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, ActionEvent.CTRL_MASK));
        pastE.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, ActionEvent.CTRL_MASK));

        selectALL.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, ActionEvent.CTRL_MASK));
	
    }

    void initToolBar() {
        /**
         *adding newButton, openButton, saveButton, saveAsButton, printButton,
         *cutButton, copyButton, pasteButton, fontButton & aboutButton to tool bar,
         *adding a small image icon to the menu item &
         *adding separator between the button
         */
        toolBar.add(newButton   = new JButton(new ImageIcon(this.getClass().getResource("images/new.gif"))));
        toolBar.add(openButton  = new JButton(new ImageIcon(this.getClass().getResource("images/open.gif"))));

        toolBar.add(printButton = new JButton(new ImageIcon(this.getClass().getResource("images/print.gif"))));

        toolBar.addSeparator();
        toolBar.add(cutButton   = new JButton(new ImageIcon(this.getClass().getResource("images/cut.gif"))));
        toolBar.add(copyButton  = new JButton(new ImageIcon(this.getClass().getResource("images/copy.gif"))));
        toolBar.add(pasteButton = new JButton(new ImageIcon(this.getClass().getResource("images/paste.gif"))));

        toolBar.addSeparator();
        
        toolBar.add(aboutButton = new JButton(new ImageIcon(this.getClass().getResource("images/about.gif"))));

    }

    void initToolTips() {
        //adding a tool tip text to the button for descriping the image icon.
        newButton.setToolTipText("New");
        openButton.setToolTipText("Open");
        
        printButton.setToolTipText("Print");
        cutButton.setToolTipText("Cut");
        copyButton.setToolTipText("Copy");
        pasteButton.setToolTipText("Paste");
        
        
        aboutButton.setToolTipText("About Notepad");
    }

    void initActionListeners() {
        /**
         *adding action listener for menu item: neW, opeN, savE, saveAS, prinT, exiT,
         *copY, cuT, pastE, finD, findNexT, selectALL, lineWraP, fonT & abouT
         *the actions was written @Actions.java
         */
        neW.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent ae){
                    actions.neW();
                }
            });
        opeN.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent ae){
                    actions.opeN();
                }
            });
        
        prinT.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent ae){
                    actions.prinT();
                }
            });
        exiT.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent ae){
                    actions.exiT();
                }
            });
        cuT.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent ae){
                    actions.cuT();
                }
            });
        copY.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent ae){
                    actions.copY();
                }
            });
        pastE.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent ae){
                    actions.pastE();
                }
            });
        selectALL.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent ae){
                    actions.selectALL();
                }
            });
        
        lineWraP.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent ae){
                    actions.lineWraP();
                }
            });
        
        abouT.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent ae){
                    actions.abouT();
                }
            });
		
        /**
         *adding action listener for the button in the tool bar: newButton, 
         *openButton, saveButton, saveAsButton, printButton, cutButton, pasteButton, 
         *findButton, selectALL, lineWraP, fontButton & aboutButton
         *the actions was written @Actions.java
         */
        newButton.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent ae){
                    actions.neW();
                }
            });
        openButton.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent ae){
                    actions.opeN();
                }
            });
        
        printButton.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent ae){
                    actions.prinT();
                }
            });
        cutButton.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent ae){
                    actions.cuT();
                }
            });
        copyButton.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent ae){
                    actions.copY();
                }
            });
        pasteButton.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent ae){
                    actions.pastE();
                }
            });
        
        
        aboutButton.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent ae){
                    actions.abouT();
                }
            });			
        
    }


    //Constructor of Notepad
    public Notepad(){

        setup();

        //set the title for Notepad and set the size for it.
        setTitle("Untitled - JAVA Notepad");
        setSize(800,600);
		
        //get the graphical user interface components display area
        Container cp = getContentPane();
        /**
         *adding the text area,
         *adding the tool bar &
         *adding the scroll pane to the container
         */
        cp.add(textArea = new JTextArea());
        cp.add("North", toolBar = new JToolBar("Tool Bar"));
        cp.add(scrollpane = new JScrollPane(textArea)); 



	initMenuBar();
        initMenuItems();
        initMnemonics();
        initAccelerators();
        initToolBar();
        initToolTips();
		
		
        /**
         *setting the default close operation to false &
         *using own action (exiT action @Actions.java)
         */
        setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
        addWindowListener(new WindowAdapter(){
                public void windowClosing(WindowEvent e){
                    actions.exiT();
                }
            });
	

        initActionListeners();
	
        /**
         *Setting the Line Wrap & Wrap Style Word features are true 
         */
        textArea.setLineWrap(true);
        textArea.setWrapStyleWord(true);
        /**
         *for making the program at the center, 
         *@see Center.java 
         */
        center.nCenter();
        show();
    }
    //Main Method
    public static void main(String[] args){
        new Notepad();
		
    }
}			
