/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package examples.texteditor;

import java.awt.FileDialog;
import java.io.*;

/** This class is an entry point of the simple text editor.
 * It creates and shows the main application frame.
 */
public class Ted extends javax.swing.JFrame {

    /** Ted constructor.
     * It initializes all GUI components [menu bar, menu items, editor pane, etc.].
     */
    public Ted() {
        initComponents();
        setSize(500,300);
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the FormEditor.
     */
    private void initComponents() {//GEN-BEGIN:initComponents
        textScrollPane = new javax.swing.JScrollPane();
        textBox = new javax.swing.JTextArea();
        tedMenuBar = new javax.swing.JMenuBar();
        fileMenu = new javax.swing.JMenu();
        newMenuItem = new javax.swing.JMenuItem();
        jSeparator1 = new javax.swing.JSeparator();
        openMenuItem = new javax.swing.JMenuItem();
        saveMenuItem = new javax.swing.JMenuItem();
        saveAsMenuItem = new javax.swing.JMenuItem();
        jSeparator2 = new javax.swing.JSeparator();
        exitMenuItem = new javax.swing.JMenuItem();
        editMenu = new javax.swing.JMenu();
        findMenuItem = new javax.swing.JMenuItem();
        helpMenu = new javax.swing.JMenu();
        aboutMenuItem = new javax.swing.JMenuItem();

        setTitle("Ted");
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        getAccessibleContext().setAccessibleName("Ted Frame");
        getAccessibleContext().setAccessibleDescription("Ted frame.");
        textScrollPane.setViewportView(textBox);
        textBox.getAccessibleContext().setAccessibleName("Text Box");
        textBox.getAccessibleContext().setAccessibleDescription("Text box.");

        getContentPane().add(textScrollPane, java.awt.BorderLayout.CENTER);

        fileMenu.setMnemonic('f');
        fileMenu.setText("File");
        newMenuItem.setMnemonic('n');
        newMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_N, java.awt.event.InputEvent.CTRL_MASK));
        newMenuItem.setText("New");
        newMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                newMenuItemActionPerformed(evt);
            }
        });

        fileMenu.add(newMenuItem);
        newMenuItem.getAccessibleContext().setAccessibleName("New Menu Item");
        newMenuItem.getAccessibleContext().setAccessibleDescription("New menu item.");

        fileMenu.add(jSeparator1);

        openMenuItem.setMnemonic('o');
        openMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_O, java.awt.event.InputEvent.CTRL_MASK));
        openMenuItem.setText("Open ...");
        openMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                openMenuItemActionPerformed(evt);
            }
        });

        fileMenu.add(openMenuItem);
        openMenuItem.getAccessibleContext().setAccessibleName("Open Menu Item");
        openMenuItem.getAccessibleContext().setAccessibleDescription("Open menu item.");

        saveMenuItem.setMnemonic('s');
        saveMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.event.InputEvent.CTRL_MASK));
        saveMenuItem.setText("Save");
        saveMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                saveMenuItemActionPerformed(evt);
            }
        });

        fileMenu.add(saveMenuItem);
        saveMenuItem.getAccessibleContext().setAccessibleName("Save Menu Item");
        saveMenuItem.getAccessibleContext().setAccessibleDescription("Save menu item.");

        saveAsMenuItem.setMnemonic('a');
        saveAsMenuItem.setText("Save As ...");
        saveAsMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                saveAsMenuItemActionPerformed(evt);
            }
        });

        fileMenu.add(saveAsMenuItem);
        saveAsMenuItem.getAccessibleContext().setAccessibleName("Save As Menu Item");
        saveAsMenuItem.getAccessibleContext().setAccessibleDescription("Save As menu item.");

        fileMenu.add(jSeparator2);

        exitMenuItem.setMnemonic('x');
        exitMenuItem.setText("Exit");
        exitMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                exitMenuItemActionPerformed(evt);
            }
        });

        fileMenu.add(exitMenuItem);
        exitMenuItem.getAccessibleContext().setAccessibleName("Exit Menu Item");
        exitMenuItem.getAccessibleContext().setAccessibleDescription("Exit menu item.");

        tedMenuBar.add(fileMenu);
        fileMenu.getAccessibleContext().setAccessibleName("File Menu");
        fileMenu.getAccessibleContext().setAccessibleDescription("File menu.");

        editMenu.setMnemonic('e');
        editMenu.setText("Edit");
        findMenuItem.setMnemonic('f');
        findMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F, java.awt.event.InputEvent.CTRL_MASK));
        findMenuItem.setText("Find ...");
        findMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                findMenuItemActionPerformed(evt);
            }
        });

        editMenu.add(findMenuItem);
        findMenuItem.getAccessibleContext().setAccessibleName("Find Menu Item");
        findMenuItem.getAccessibleContext().setAccessibleDescription("Find menu item.");

        tedMenuBar.add(editMenu);
        editMenu.getAccessibleContext().setAccessibleName("Edit Menu");
        editMenu.getAccessibleContext().setAccessibleDescription("Edit menu.");

        helpMenu.setMnemonic('h');
        helpMenu.setText("Help");
        aboutMenuItem.setMnemonic('a');
        aboutMenuItem.setText("About ...");
        aboutMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                aboutMenuItemActionPerformed(evt);
            }
        });

        helpMenu.add(aboutMenuItem);
        aboutMenuItem.getAccessibleContext().setAccessibleName("About Menu Item");
        aboutMenuItem.getAccessibleContext().setAccessibleDescription("About menu item.");

        tedMenuBar.add(helpMenu);
        helpMenu.getAccessibleContext().setAccessibleName("Help Menu");
        helpMenu.getAccessibleContext().setAccessibleDescription("Help menu.");

        setJMenuBar(tedMenuBar);
        tedMenuBar.getAccessibleContext().setAccessibleName("Ted Menu Bar");
        tedMenuBar.getAccessibleContext().setAccessibleDescription("Ted menu bar.");

    }//GEN-END:initComponents

    /** This method is called when File -> Save menu item is invoked.
     * It saves the current opened file.
     * @param evt ActionEvent instance passed from actionPerformed event.
     */
    private void saveMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveMenuItemActionPerformed
        if ("".equals(fileName))
            doSaveAs();
        else
            doSave(fileName);
    }//GEN-LAST:event_saveMenuItemActionPerformed

    /** This method is called when File -> Exit menu item is invoked.
     * It closes the application.
     * @param evt ActionEvent instance passed from actionPerformed event.
     */
    private void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exitMenuItemActionPerformed
        System.exit(0);
    }//GEN-LAST:event_exitMenuItemActionPerformed

    /** This method is called when Edit -> Find menu item is invoked.
     * It creates and shows the Finder frame to allow the user to search in the text.
     * @param evt ActionEvent instance passed from actionPerformed event.
     */
    private void findMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_findMenuItemActionPerformed
        new Finder(this, textBox).show();
    }//GEN-LAST:event_findMenuItemActionPerformed

    /** This method is called when Help -> About menu item is invoked.
     * It creates and shows the About dialog.
     * @param evt ActionEvent instance passed from actionPerformed event.
     */
    private void aboutMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_aboutMenuItemActionPerformed
        new About(this). show();
    }//GEN-LAST:event_aboutMenuItemActionPerformed

    /** This method is called when File -> Save as menu item is invoked.
     * It asks for a new file name, then saves the file.
     * @param evt ActionEvent instance passed from actionPerformed event.
     */
    private void saveAsMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveAsMenuItemActionPerformed
        doSaveAs();
    }//GEN-LAST:event_saveAsMenuItemActionPerformed

    /** This method is called when File -> Open menu item is invoked.
     * It displays a dialog to choose the file to be opened and edited.
     * @param evt ActionEvent instance passed from actionPerformed event.
     */
    private void openMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_openMenuItemActionPerformed
        FileDialog fileDialog = new FileDialog(this, "Open...", FileDialog.LOAD);
        fileDialog.show();
        if (fileDialog.getFile() == null)
            return;
        fileName = fileDialog.getDirectory() + File.separator + fileDialog.getFile();

        FileInputStream fis = null;
        String str = null;
        try {
            fis = new FileInputStream(fileName);
            int size = fis.available();
            byte[] bytes = new byte [size];
            fis.read(bytes);
            str = new String(bytes);
        } catch (IOException e) {
        } finally {
            try {
                fis.close();
            } catch (IOException e2) {
            }
        }

        if (str != null)
            textBox.setText(str);
    }//GEN-LAST:event_openMenuItemActionPerformed

    /** This method is called when File -> New menu item is invoked.
     * It clears the editor pane.
     * @param evt ActionEvent instance passed from actionPerformed event.
     */
    private void newMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newMenuItemActionPerformed
        fileName = "";
        textBox.setText("");
    }//GEN-LAST:event_newMenuItemActionPerformed

    /** This method is called when the application frame is closed.
     * @param evt WindowEvent instance passed from windowClosing event.
     */
    private void exitForm(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_exitForm
        System.exit(0);
    }//GEN-LAST:event_exitForm

    /** Saves the current content of editor pane to the file.
     * @param fileName Name of the file.
     */
    private void doSave(String fileName) {
        FileOutputStream fos = null;
        String str = textBox.getText();
        try {
            fos = new FileOutputStream(fileName);
            fos.write(str.getBytes());
        } catch (IOException e) {
        } finally {
            try {
                fos.close();
            } catch (IOException e2) {
            }
        }
    }

    /** Asks for a file name. then saves the current content of editor pane to the file.
     */
    private void doSaveAs() {
        FileDialog fileDialog = new FileDialog(this, "Save As...", FileDialog.SAVE);
        fileDialog.show();
        if (fileDialog.getFile() == null)
            return;
        fileName = fileDialog.getDirectory() + File.separator + fileDialog.getFile();

        doSave(fileName);
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JMenuItem aboutMenuItem;
    private javax.swing.JMenu editMenu;
    private javax.swing.JMenuItem exitMenuItem;
    private javax.swing.JMenu fileMenu;
    private javax.swing.JMenuItem findMenuItem;
    private javax.swing.JMenu helpMenu;
    private javax.swing.JSeparator jSeparator1;
    private javax.swing.JSeparator jSeparator2;
    private javax.swing.JMenuItem newMenuItem;
    private javax.swing.JMenuItem openMenuItem;
    private javax.swing.JMenuItem saveAsMenuItem;
    private javax.swing.JMenuItem saveMenuItem;
    private javax.swing.JMenuBar tedMenuBar;
    private javax.swing.JTextArea textBox;
    private javax.swing.JScrollPane textScrollPane;
    // End of variables declaration//GEN-END:variables

    private String fileName = "";


    /** Starts the application.
     * @param args Application arguments.
     */    
    public static void main(java.lang.String[] args) {
        new Ted().show();
    }

}
