content: package editor.genuinecoder.main;
  
  import java.awt.event.WindowAdapter;
  import java.awt.event.WindowEvent;
  import java.io.File;
  import java.io.FileInputStream;
  import java.io.FileNotFoundException;
  import java.io.IOException;
  import java.io.PrintWriter;
  import java.util.Scanner;
  import java.util.logging.Level;
  import java.util.logging.Logger;
  import javax.imageio.ImageIO;
  import javax.swing.JFileChooser;
  import javax.swing.JOptionPane;
  import javax.swing.filechooser.FileNameExtensionFilter;
  
  public class MainFrame extends javax.swing.JFrame {
  
      File currentEditingFile = null;
      int fontSize = 14;
  
      public MainFrame() {
          initComponents();
          initUI();
      }
  
      public MainFrame(File file) {
          initComponents();
          this.currentEditingFile = file;
          readTheParamFile(file);
      }
  
      public void readTheParamFile(File file) {
          try {
              Scanner scn = new Scanner(file);
              String buffer = "";
              while (scn.hasNext()) {
                  buffer += scn.nextLine() + "\n";
              }
              display.setText(buffer);
          } catch (FileNotFoundException ex) {
              Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
          }
      }
  
      public void saveChanges() throws FileNotFoundException {
          try (PrintWriter printWriter = new PrintWriter(currentEditingFile)) {
              printWriter.write(display.getText());
          }
      }
  
      @SuppressWarnings("unchecked")
      // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
      private void initComponents() {
  
          fileOpener = new javax.swing.JFileChooser();
          saveDialog = new javax.swing.JFileChooser();
          jPanel1 = new javax.swing.JPanel();
          jToolBar1 = new javax.swing.JToolBar();
          jButton1 = new javax.swing.JButton();
          jButton2 = new javax.swing.JButton();
          jButton3 = new javax.swing.JButton();
          jButton4 = new javax.swing.JButton();
          jScrollPane1 = new javax.swing.JScrollPane();
          display = new javax.swing.JTextArea();
          jLabel1 = new javax.swing.JLabel();
  
          saveDialog.setDialogType(javax.swing.JFileChooser.SAVE_DIALOG);
          saveDialog.setFileSelectionMode(javax.swing.JFileChooser.DIRECTORIES_ONLY);
  
          setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
          setTitle("Java Text Editor");
  
          jToolBar1.setBackground(new java.awt.Color(255, 255, 255));
          jToolBar1.setRollover(true);
  
          jButton1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/editor/genuinecoder/res/open_new_file.png"))); // NOI18N
          jButton1.setText("Open");
          jButton1.setFocusable(false);
          jButton1.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
          jButton1.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
          jButton1.addActionListener(new java.awt.event.ActionListener() {
              public void actionPerformed(java.awt.event.ActionEvent evt) {
                  jButton1ActionPerformed(evt);
              }
          });
          jToolBar1.add(jButton1);
  
          jButton2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/editor/genuinecoder/res/Save_icon.png"))); // NOI18N
          jButton2.setText("Save");
          jButton2.setFocusable(false);
          jButton2.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
          jButton2.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
          jButton2.addActionListener(new java.awt.event.ActionListener() {
              public void actionPerformed(java.awt.event.ActionEvent evt) {
                  jButton2ActionPerformed(evt);
              }
          });
          jToolBar1.add(jButton2);
  
          jButton3.setIcon(new javax.swing.ImageIcon(getClass().getResource("/editor/genuinecoder/res/increase_font.png"))); // NOI18N
          jButton3.setText("Increase Font");
          jButton3.setFocusable(false);
          jButton3.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
          jButton3.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
          jButton3.addActionListener(new java.awt.event.ActionListener() {
              public void actionPerformed(java.awt.event.ActionEvent evt) {
                  jButton3ActionPerformed(evt);
              }
          });
          jToolBar1.add(jButton3);
  
          jButton4.setIcon(new javax.swing.ImageIcon(getClass().getResource("/editor/genuinecoder/res/decrease_font.png"))); // NOI18N
          jButton4.setText("Decrease Font");
          jButton4.setFocusable(false);
          jButton4.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
          jButton4.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
          jButton4.addActionListener(new java.awt.event.ActionListener() {
              public void actionPerformed(java.awt.event.ActionEvent evt) {
                  jButton4ActionPerformed(evt);
              }
          });
          jToolBar1.add(jButton4);
  
          display.setColumns(20);
          display.setFont(new java.awt.Font("Monospaced", 0, 14)); // NOI18N
          display.setLineWrap(true);
          display.setRows(5);
          jScrollPane1.setViewportView(display);
  
          jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
          jLabel1.setText("Genuine Coder");
  
          javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
          jPanel1.setLayout(jPanel1Layout);
          jPanel1Layout.setHorizontalGroup(
              jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
              .addComponent(jToolBar1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
              .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 662, Short.MAX_VALUE)
              .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
          );
          jPanel1Layout.setVerticalGroup(
              jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
              .addGroup(jPanel1Layout.createSequentialGroup()
                  .addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                  .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 427, Short.MAX_VALUE)
                  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                  .addComponent(jLabel1))
          );
  
          javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
          getContentPane().setLayout(layout);
          layout.setHorizontalGroup(
              layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
              .addComponent(jPanel1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
          );
          layout.setVerticalGroup(
              layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
              .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
          );
  
          pack();
      }// </editor-fold>//GEN-END:initComponents
  
      private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
          openNewFile();
      }//GEN-LAST:event_jButton1ActionPerformed
  
      private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
          saveFile();
      }//GEN-LAST:event_jButton2ActionPerformed
  
      private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton3ActionPerformed
          display.setFont(new java.awt.Font("Monospaced", 0, ++fontSize));
      }//GEN-LAST:event_jButton3ActionPerformed
  
      private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton4ActionPerformed
          display.setFont(new java.awt.Font("Monospaced", 0, --fontSize));
      }//GEN-LAST:event_jButton4ActionPerformed
  
      public static void main(String args[]) {
          /* Set the Nimbus look and feel */
          //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
          /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
           * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
           */
          try {
              for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                  if ("Nimbus".equals(info.getName())) {
                      javax.swing.UIManager.setLookAndFeel(info.getClassName());
                      break;
                  }
              }
          } catch (ClassNotFoundException ex) {
              java.util.logging.Logger.getLogger(MainFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
          } catch (InstantiationException ex) {
              java.util.logging.Logger.getLogger(MainFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
          } catch (IllegalAccessException ex) {
              java.util.logging.Logger.getLogger(MainFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
          } catch (javax.swing.UnsupportedLookAndFeelException ex) {
              java.util.logging.Logger.getLogger(MainFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
          }
          //</editor-fold>
  
          /* Create and display the form */
          java.awt.EventQueue.invokeLater(new Runnable() {
              public void run() {
                  new MainFrame().setVisible(true);
              }
          });
      }
  
      // Variables declaration - do not modify//GEN-BEGIN:variables
      private javax.swing.JTextArea display;
      private javax.swing.JFileChooser fileOpener;
      private javax.swing.JButton jButton1;
      private javax.swing.JButton jButton2;
      private javax.swing.JButton jButton3;
      private javax.swing.JButton jButton4;
      private javax.swing.JLabel jLabel1;
      private javax.swing.JPanel jPanel1;
      private javax.swing.JScrollPane jScrollPane1;
      private javax.swing.JToolBar jToolBar1;
      private javax.swing.JFileChooser saveDialog;
      // End of variables declaration//GEN-END:variables
  
      private void initUI() {
          initFileSelector();
          //Launch the application on the middle of Screen
          this.setLocationRelativeTo(null);
          this.addWindowListener(new WindowAdapter() {
              @Override
              public void windowClosing(WindowEvent e) {
                  super.windowClosing(e);
                  saveOnClose();
              }
  
              private void saveOnClose() {
                  int ans = JOptionPane.showConfirmDialog(rootPane, "Save Changes ?", "Confirm", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
                  if (ans == JOptionPane.YES_OPTION) {
                      try {
                          saveChanges();
                      } catch (FileNotFoundException ex) {
                          JOptionPane.showMessageDialog(rootPane, "Failed to save");
                      }
                  }
              }
          });
          try {
              this.setIconImage(ImageIO.read(getClass().getResourceAsStream("/editor/genuinecoder/res/logo.png")));
          } catch (IOException ex) {
              Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
          }
      }
  
      private void openNewFile() {
          //Show File Open dialouge here
          int status = fileOpener.showOpenDialog(rootPane);
          if (status == JFileChooser.APPROVE_OPTION) {
              if (currentEditingFile != null) {
                  // A file is opened and is being edited. Open the new file in new window  
                  loadNewWindow();
                  return;
              }
              currentEditingFile = fileOpener.getSelectedFile();
              System.out.println("File chosen. File name = " + fileOpener.getSelectedFile().getName());
              try {
                  //Now read the contents of file
                  Scanner scn = new Scanner(new FileInputStream(currentEditingFile));
                  String buffer = "";
                  while (scn.hasNext()) {
                      buffer += scn.nextLine() + "\n";
                  }
                  display.setText(buffer);
              } catch (FileNotFoundException ex) {
                  Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
              }
  
          } else {
              System.out.println("No file selected");
          }
      }
  
      private void saveFile() {
          if (currentEditingFile != null) {
              try {
                  saveChanges();
                  JOptionPane.showMessageDialog(rootPane, "Saved to " + currentEditingFile.getName(), "Done", JOptionPane.INFORMATION_MESSAGE);
              } catch (FileNotFoundException ex) {
                  JOptionPane.showMessageDialog(rootPane, "Failed to save");
              }
          } else {
              int status = saveDialog.showOpenDialog(rootPane);
              if (status == JFileChooser.APPROVE_OPTION) {
                  //We got directory. Now needs file name
                  String fileName = JOptionPane.showInputDialog("File Name", "Untitled.txt");
                  if (!fileName.contains(".txt")) {
                      fileName += ".txt";
                  }
                  File f = new File(saveDialog.getSelectedFile() + "\\" + fileName);
                  if (f.exists()) {
                      JOptionPane.showMessageDialog(rootPane, "File Already Exist.", "Error", JOptionPane.ERROR_MESSAGE);
                      return;
                  } else {
                      try {
                          f.createNewFile();
                          PrintWriter printWriter = new PrintWriter(f);
                          printWriter.write(display.getText());
                          printWriter.close();
                          JOptionPane.showMessageDialog(rootPane, "Saved", "Done", JOptionPane.INFORMATION_MESSAGE);
                      } catch (IOException ex) {
                          Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
                      }
                  }
              } else {
                  JOptionPane.showMessageDialog(rootPane, "Error Occured", "Cant Save", JOptionPane.ERROR_MESSAGE);
              }
          }
      }
  
      private void loadNewWindow() {
          MainFrame newWindow = new MainFrame(fileOpener.getSelectedFile());
          newWindow.setVisible(true);
          newWindow.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
          newWindow.pack();
      }
  
      private void initFileSelector() {
          FileNameExtensionFilter filter = new FileNameExtensionFilter("TEXT FILES", "txt", "text");
          fileOpener.setFileFilter(filter);
      }
  }
  