WaarpUiPassword.java

/*
 * This file is part of Waarp Project (named also Waarp or GG).
 *
 *  Copyright (c) 2019, Waarp SAS, and individual contributors by the @author
 *  tags. See the COPYRIGHT.txt in the distribution for a full listing of
 * individual contributors.
 *
 *  All Waarp Project is free software: you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or (at your
 * option) any later version.
 *
 * Waarp is distributed in the hope that it will be useful, but WITHOUT ANY
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
 * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License along with
 * Waarp . If not, see <http://www.gnu.org/licenses/>.
 */
package org.waarp.uip;

import org.waarp.common.crypto.Blowfish;
import org.waarp.common.crypto.Des;
import org.waarp.common.exception.CryptoException;
import org.waarp.common.logging.SysErrLogger;

import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JSeparator;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import javax.swing.LayoutStyle;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
import javax.swing.border.BevelBorder;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.IOException;
import java.util.Locale;

/**
 * GUI for GoldenGate Password Management for GoldenGate products.
 */
public class WaarpUiPassword extends JFrame {

  /**
   *
   */
  private static final long serialVersionUID = -4276191288898099362L;
  protected WaarpUiPassword myself;
  private JMenuItem helpMenuItem;
  private JMenu jMenu5;
  private AbstractAction saveAsKeyAction;
  private AbstractAction saveKeyAction;
  private AbstractAction newKeyAction;
  private AbstractAction openKeyAction;
  private AbstractAction loadPswdAction;
  private AbstractAction exitAction;
  private JPanel jPanel1;
  private JTextField jTextFieldPasswordFile;
  private JPasswordField jPasswordField;
  private JTextField jPasswordFieldTxt;
  private JTextField jTextFieldCryptedPassword;
  private JTextField jTextFieldKeyFile;
  private JMenuItem savePasswordMenuItem;
  private AbstractAction helpAction;
  private AbstractAction savePaswdAction;
  private JMenuItem loadPasswordMenuItem;
  private JMenu jMenuPassword;
  private JMenuItem exitMenuItem;
  private JSeparator jSeparator2;
  private JMenuItem saveAsMenuItem;
  private JMenuItem saveMenuItem;
  private JMenuItem openFileMenuItem;
  private JMenuItem newFileMenuItem;
  private JMenu jMenu3;
  private JMenuBar jMenuBar1;

  private final JFileChooser chooserKeyFile;
  private transient final FileNameExtensionFilter filterKey;
  private final JFileChooser chooserPwdFile;
  private transient final FileNameExtensionFilter filterPwdKey;

  private AbstractAction closeHelpAction;
  private JTextPane jTextPaneHelp;
  private JButton jButtonHelp;
  private JDialog jDialogHelp;
  private transient WaarpPassword waarpPassword;
  boolean passwordModified;
  boolean extended;

  /**
   * Auto-generated main method to display this JFrame
   */
  public static void main(final String[] args) {
    if (!WaarpPassword.loadOptions(args)) {
      // Bad options
      System.exit(2);//NOSONAR
    }
    SwingUtilities.invokeLater(new Runnable() {
      @Override
      public void run() {
        final WaarpUiPassword inst = new WaarpUiPassword();
        inst.setLocationRelativeTo(null);
        inst.setVisible(true);
      }
    });
  }

  protected WaarpUiPassword(final boolean extended_ignore) throws Exception {
    extended = true;
    chooserKeyFile = new JFileChooser();
    filterKey = new FileNameExtensionFilter(
        "DES or Blowfish Key (" + Des.EXTENSION + ", " + Blowfish.EXTENSION +
        ')', Des.EXTENSION, Blowfish.EXTENSION);
    chooserKeyFile.setFileFilter(filterKey);
    chooserKeyFile.setFileSelectionMode(JFileChooser.FILES_ONLY);

    chooserPwdFile = new JFileChooser();
    filterPwdKey = new FileNameExtensionFilter(
        "GoldenGate Password Files (" + WaarpPassword.GGPEXTENSION + ')',
        WaarpPassword.GGPEXTENSION);
    chooserPwdFile.setFileFilter(filterPwdKey);
    chooserPwdFile.setFileSelectionMode(JFileChooser.FILES_ONLY);

    waarpPassword = new WaarpPassword();

    initGUI();
    initFromGgPassword();
  }

  public WaarpUiPassword() {
    myself = this;
    chooserKeyFile = new JFileChooser();
    filterKey = new FileNameExtensionFilter(
        "DES or Blowfish Key (" + Des.EXTENSION + ", " + Blowfish.EXTENSION +
        ')', Des.EXTENSION, Blowfish.EXTENSION);
    chooserKeyFile.setFileFilter(filterKey);
    chooserKeyFile.setFileSelectionMode(JFileChooser.FILES_ONLY);

    chooserPwdFile = new JFileChooser();
    filterPwdKey = new FileNameExtensionFilter(
        "GoldenGate Password Files (" + WaarpPassword.GGPEXTENSION + ')',
        WaarpPassword.GGPEXTENSION);
    chooserPwdFile.setFileFilter(filterPwdKey);
    chooserPwdFile.setFileSelectionMode(JFileChooser.FILES_ONLY);

    try {
      waarpPassword = new WaarpPassword();
    } catch (final Exception e) {
      SysErrLogger.FAKE_LOGGER.syserr(e);
      System.exit(3);//NOSONAR
    }

    initGUI();
    initFromGgPassword();
  }

  private void initFromGgPassword() {
    final File keyFile = waarpPassword.getKeyFile();
    if (keyFile != null) {
      jTextFieldKeyFile.setText(keyFile.getAbsolutePath());
      enableMenuWithKey();
    }
    final File pFile = waarpPassword.getPasswordFile();
    if (pFile != null) {
      jTextFieldPasswordFile.setText(pFile.getAbsolutePath());
    }
    String clpwd = waarpPassword.getClearPassword();
    if (clpwd != null) {
      setUncryptedPassword(clpwd);
      clpwd = waarpPassword.getCryptedPassword();
      jTextFieldCryptedPassword.setText(clpwd);
    }
  }

  public void exit(final ActionEvent evt) {
    if (passwordModified) {
      getSavePaswdAction().actionPerformed(evt);
    }
    if (extended) {
      myself.dispose();
    } else {
      System.exit(1);//NOSONAR
    }
  }

  private void initGUI() {
    try {
      final GroupLayout thisLayout = new GroupLayout(getContentPane());
      getContentPane().setLayout(thisLayout);
      addWindowListener(new WindowAdapter() {
        @Override
        public void windowClosing(final WindowEvent evt) {
          myself.exit(null);
        }

        @Override
        public void windowClosed(final WindowEvent evt) {
          myself.exit(null);
        }
      });
      setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
      setTitle("Waarp Password GUI");
      setLocale(new Locale("en", "GB"));
      {
        jTextFieldKeyFile = new JTextField();
        jTextFieldKeyFile.setText("Key File");
        jTextFieldKeyFile.setEditable(false);
        jTextFieldKeyFile.setBorder(BorderFactory.createCompoundBorder(
            BorderFactory.createMatteBorder(1, 1, 1, 1, new Color(0, 0, 0)),
            BorderFactory.createCompoundBorder(null, null)));
      }
      {
        jPanel1 = new JPanel();
        final GroupLayout jPanel1Layout = new GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
        {
          jTextFieldPasswordFile = new JTextField();
          jTextFieldPasswordFile.setText("Password File");
          jTextFieldPasswordFile.setEditable(false);
          jTextFieldPasswordFile.setBorder(BorderFactory.createCompoundBorder(
              BorderFactory.createMatteBorder(1, 1, 1, 1, new Color(0, 0, 0)),
              BorderFactory.createCompoundBorder(null, null)));
        }
        {
          if (WaarpPassword.clearPasswordView) {
            jPasswordFieldTxt = new JTextField();
            jPasswordFieldTxt.addFocusListener(new FocusAdapter() {
              @Override
              public void focusLost(final FocusEvent evt) {
                final String paswd = jPasswordFieldTxt.getText();
                if (!paswd.equals(waarpPassword.getClearPassword())) {
                  try {
                    waarpPassword.setClearPassword(paswd);
                  } catch (final Exception e) {
                    SysErrLogger.FAKE_LOGGER.syserr(e);
                  }
                  jTextFieldCryptedPassword.setText(
                      waarpPassword.getCryptedPassword());
                  passwordModified = true;
                }
              }
            });
          } else {
            jPasswordField = new JPasswordField();
            jPasswordField.addFocusListener(new FocusAdapter() {
              @Override
              public void focusLost(final FocusEvent evt) {
                final String paswd = new String(jPasswordField.getPassword());
                if (!paswd.equals(waarpPassword.getClearPassword())) {
                  try {
                    waarpPassword.setClearPassword(paswd);
                  } catch (final Exception e) {
                    SysErrLogger.FAKE_LOGGER.syserr(e);
                  }
                  jTextFieldCryptedPassword.setText(
                      waarpPassword.getCryptedPassword());
                  passwordModified = true;
                }
              }
            });
          }
        }
        {
          jTextFieldCryptedPassword = new JTextField();
          jTextFieldCryptedPassword.addFocusListener(new FocusAdapter() {
            @Override
            public void focusLost(final FocusEvent evt) {
              final String paswd = jTextFieldCryptedPassword.getText();
              if (!paswd.equals(waarpPassword.getCryptedPassword())) {
                try {
                  waarpPassword.setCryptedPassword(paswd);
                } catch (final Exception e1) {
                  SysErrLogger.FAKE_LOGGER.syserr(e1);
                }
                setUncryptedPassword(waarpPassword.getClearPassword());
                jTextFieldCryptedPassword.setText(
                    waarpPassword.getCryptedPassword());
                passwordModified = true;
              }
            }
          });
        }
        if (WaarpPassword.clearPasswordView) {
          jPanel1Layout.setHorizontalGroup(
              jPanel1Layout.createSequentialGroup().addContainerGap().addGroup(
                               jPanel1Layout.createParallelGroup().addGroup(
                                                jPanel1Layout.createSequentialGroup()
                                                             .addComponent(jTextFieldPasswordFile,
                                                                           GroupLayout.PREFERRED_SIZE,
                                                                           340,
                                                                           GroupLayout.PREFERRED_SIZE)
                                                             .addGap(0, 0, Short.MAX_VALUE))
                                            .addComponent(jPasswordFieldTxt,
                                                          GroupLayout.Alignment.LEADING, 0,
                                                          341, Short.MAX_VALUE)
                                            .addComponent(jTextFieldCryptedPassword,
                                                          GroupLayout.Alignment.LEADING, 0,
                                                          338, Short.MAX_VALUE))
                           .addContainerGap());
          jPanel1Layout.setVerticalGroup(
              jPanel1Layout.createSequentialGroup().addContainerGap()
                           .addComponent(jTextFieldPasswordFile,
                                         GroupLayout.PREFERRED_SIZE, 28,
                                         GroupLayout.PREFERRED_SIZE).addGap(18)
                           .addComponent(jPasswordFieldTxt,
                                         GroupLayout.PREFERRED_SIZE, 26,
                                         GroupLayout.PREFERRED_SIZE)
                           .addPreferredGap(
                               LayoutStyle.ComponentPlacement.UNRELATED, 1,
                               Short.MAX_VALUE)
                           .addComponent(jTextFieldCryptedPassword,
                                         GroupLayout.PREFERRED_SIZE, 28,
                                         GroupLayout.PREFERRED_SIZE)
                           .addContainerGap());
        } else {
          jPanel1Layout.setHorizontalGroup(
              jPanel1Layout.createSequentialGroup().addContainerGap().addGroup(
                               jPanel1Layout.createParallelGroup().addGroup(
                                                jPanel1Layout.createSequentialGroup()
                                                             .addComponent(jTextFieldPasswordFile,
                                                                           GroupLayout.PREFERRED_SIZE,
                                                                           340,
                                                                           GroupLayout.PREFERRED_SIZE)
                                                             .addGap(0, 0, Short.MAX_VALUE))
                                            .addComponent(jPasswordField,
                                                          GroupLayout.Alignment.LEADING, 0,
                                                          341, Short.MAX_VALUE)
                                            .addComponent(jTextFieldCryptedPassword,
                                                          GroupLayout.Alignment.LEADING, 0,
                                                          338, Short.MAX_VALUE))
                           .addContainerGap());
          jPanel1Layout.setVerticalGroup(
              jPanel1Layout.createSequentialGroup().addContainerGap()
                           .addComponent(jTextFieldPasswordFile,
                                         GroupLayout.PREFERRED_SIZE, 28,
                                         GroupLayout.PREFERRED_SIZE).addGap(18)
                           .addComponent(jPasswordField,
                                         GroupLayout.PREFERRED_SIZE, 26,
                                         GroupLayout.PREFERRED_SIZE)
                           .addPreferredGap(
                               LayoutStyle.ComponentPlacement.UNRELATED, 1,
                               Short.MAX_VALUE)
                           .addComponent(jTextFieldCryptedPassword,
                                         GroupLayout.PREFERRED_SIZE, 28,
                                         GroupLayout.PREFERRED_SIZE)
                           .addContainerGap());
        }
      }
      thisLayout.setVerticalGroup(
          thisLayout.createSequentialGroup().addContainerGap()
                    .addComponent(jTextFieldKeyFile, GroupLayout.PREFERRED_SIZE,
                                  28, GroupLayout.PREFERRED_SIZE).addGap(21)
                    .addComponent(jPanel1, GroupLayout.PREFERRED_SIZE, 143,
                                  GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(31, Short.MAX_VALUE));
      thisLayout.setHorizontalGroup(
          thisLayout.createSequentialGroup().addContainerGap().addGroup(
              thisLayout.createParallelGroup()
                        .addComponent(jPanel1, GroupLayout.Alignment.LEADING, 0,
                                      366, Short.MAX_VALUE)
                        .addGroup(GroupLayout.Alignment.LEADING,
                                  thisLayout.createSequentialGroup().addGap(7)
                                            .addComponent(jTextFieldKeyFile, 0,
                                                          353, Short.MAX_VALUE)
                                            .addGap(6))).addGap(6));
      setSize(400, 300);
      {
        jMenuBar1 = new JMenuBar();
        setJMenuBar(jMenuBar1);
        {
          jMenu3 = new JMenu();
          jMenuBar1.add(jMenu3);
          jMenu3.setText("File");
          {
            openFileMenuItem = new JMenuItem();
            jMenu3.add(openFileMenuItem);
            openFileMenuItem.setText("Open Key");
            openFileMenuItem.setAction(getOpenKeyAction());
          }
          {
            newFileMenuItem = new JMenuItem();
            jMenu3.add(newFileMenuItem);
            newFileMenuItem.setText("New Key");
            newFileMenuItem.setAction(getNewKeyAction());
          }
          {
            saveMenuItem = new JMenuItem();
            jMenu3.add(saveMenuItem);
            saveMenuItem.setText("Save Key");
            saveMenuItem.setAction(getSaveKeyAction());
            saveMenuItem.setEnabled(false);
          }
          {
            saveAsMenuItem = new JMenuItem();
            jMenu3.add(saveAsMenuItem);
            saveAsMenuItem.setText("Save Key As ...");
            saveAsMenuItem.setAction(getSaveAsKeyAction());
            saveAsMenuItem.setEnabled(false);
          }
          {
            jSeparator2 = new JSeparator();
            jMenu3.add(jSeparator2);
          }
          {
            exitMenuItem = new JMenuItem();
            jMenu3.add(exitMenuItem);
            exitMenuItem.setText("Exit");
            exitMenuItem.setAction(getExitAction());
          }
        }
        {
          jMenuPassword = new JMenu();
          jMenuBar1.add(jMenuPassword);
          jMenuPassword.setText("Password");
          jMenuPassword.setEnabled(false);
          {
            loadPasswordMenuItem = new JMenuItem();
            jMenuPassword.add(loadPasswordMenuItem);
            loadPasswordMenuItem.setText("Load");
            loadPasswordMenuItem.setAction(getLoadPswdAction());
          }
          {
            savePasswordMenuItem = new JMenuItem();
            jMenuPassword.add(savePasswordMenuItem);
            savePasswordMenuItem.setText("Save");
            savePasswordMenuItem.setAction(getSavePaswdAction());
          }
        }
        {
          jMenu5 = new JMenu();
          jMenuBar1.add(jMenu5);
          jMenu5.setText("Help");
          {
            helpMenuItem = new JMenuItem();
            jMenu5.add(helpMenuItem);
            helpMenuItem.setText("Help");
            helpMenuItem.setAction(getHelpAction());
          }
        }
      }
    } catch (final Exception e) {
      SysErrLogger.FAKE_LOGGER.syserr(e);
    }
  }

  private AbstractAction getExitAction() {
    if (exitAction == null) {
      exitAction = new AbstractAction("Exit", null) {
        /**
         *
         */
        private static final long serialVersionUID = 7484447837851868127L;

        @Override
        public void actionPerformed(final ActionEvent evt) {
          myself.exit(evt);
        }
      };
    }
    return exitAction;
  }

  private String getUncryptedPassword() {
    if (WaarpPassword.clearPasswordView) {
      return jPasswordFieldTxt.getText();
    } else {
      return new String(jPasswordField.getPassword());
    }
  }

  private void setUncryptedPassword(final String passwd) {
    if (WaarpPassword.clearPasswordView) {
      jPasswordFieldTxt.setText(passwd);
    } else {
      jPasswordField.setText(passwd);
    }
  }

  private void updateCryptedPassword() {
    try {
      waarpPassword.setClearPassword(getUncryptedPassword());
    } catch (final Exception e) {
      SysErrLogger.FAKE_LOGGER.syserr(e);
    }
    jTextFieldCryptedPassword.setText(waarpPassword.getCryptedPassword());
    passwordModified = true;
  }

  private void enableMenuWithKey() {
    saveAsMenuItem.setEnabled(true);
    saveMenuItem.setEnabled(true);
    jMenuPassword.setEnabled(true);
  }

  private AbstractAction getOpenKeyAction() {
    if (openKeyAction == null) {
      openKeyAction = new AbstractAction("Open Key", null) {
        /**
         *
         */
        private static final long serialVersionUID = -3840578648343599999L;

        @Override
        public void actionPerformed(final ActionEvent evt) {
          jTextFieldPasswordFile.setText("");
          jTextFieldCryptedPassword.setText("");
          chooserKeyFile.setDialogType(JFileChooser.OPEN_DIALOG);
          final int response = chooserKeyFile.showOpenDialog(rootPane);
          if (response == JFileChooser.APPROVE_OPTION) {
            final File file = chooserKeyFile.getSelectedFile();
            jTextFieldKeyFile.setText(file.getAbsolutePath());
            try {
              waarpPassword.loadKey(file);
              updateCryptedPassword();
              enableMenuWithKey();
            } catch (final CryptoException e) {
              SysErrLogger.FAKE_LOGGER.syserr(e);
            }
          }
        }
      };
    }
    return openKeyAction;
  }

  private AbstractAction getNewKeyAction() {
    if (newKeyAction == null) {
      newKeyAction = new AbstractAction("New Key", null) {
        /**
         *
         */
        private static final long serialVersionUID = 10107370851157816L;

        @Override
        public void actionPerformed(final ActionEvent evt) {
          try {
            waarpPassword.createNewKey();
          } catch (final Exception e) {
            SysErrLogger.FAKE_LOGGER.syserr(e);
          }
          updateCryptedPassword();
          enableMenuWithKey();
        }
      };
    }
    return newKeyAction;
  }

  private AbstractAction getSaveKeyAction() {
    if (saveKeyAction == null) {
      saveKeyAction = new AbstractAction("Save Key", null) {
        /**
         *
         */
        private static final long serialVersionUID = 4400661431842092244L;

        @Override
        public void actionPerformed(final ActionEvent evt) {
          try {
            waarpPassword.saveKey(null);
          } catch (final CryptoException e) {
            SysErrLogger.FAKE_LOGGER.syserr(e);
          }
          passwordModified = false;
        }
      };
    }
    return saveKeyAction;
  }

  private AbstractAction getSaveAsKeyAction() {
    if (saveAsKeyAction == null) {
      saveAsKeyAction = new AbstractAction("Save Key As...", null) {
        /**
         *
         */
        private static final long serialVersionUID = 565842888109816432L;

        @Override
        public void actionPerformed(final ActionEvent evt) {
          chooserKeyFile.setDialogType(JFileChooser.SAVE_DIALOG);
          final int response = chooserKeyFile.showSaveDialog(rootPane);
          if (response == JFileChooser.APPROVE_OPTION) {
            File file = chooserKeyFile.getSelectedFile();
            if (!filterKey.accept(file)) {
              if (WaarpPassword.desModel) {
                file = new File(file.getAbsoluteFile() + "." + Des.EXTENSION);
              } else {
                file =
                    new File(file.getAbsoluteFile() + "." + Blowfish.EXTENSION);
              }
            }
            jTextFieldKeyFile.setText(file.getAbsolutePath());
            try {
              waarpPassword.saveKey(file);
            } catch (final CryptoException e) {
              SysErrLogger.FAKE_LOGGER.syserr(e);
            }
            passwordModified = false;
          }
        }
      };
    }
    return saveAsKeyAction;
  }

  private AbstractAction getLoadPswdAction() {
    if (loadPswdAction == null) {
      loadPswdAction = new AbstractAction("Load", null) {
        /**
         *
         */
        private static final long serialVersionUID = -3100726446117809610L;

        @Override
        public void actionPerformed(final ActionEvent evt) {
          chooserPwdFile.setDialogType(JFileChooser.OPEN_DIALOG);
          final int response = chooserPwdFile.showOpenDialog(rootPane);
          if (response == JFileChooser.APPROVE_OPTION) {
            final File file = chooserPwdFile.getSelectedFile();
            jTextFieldPasswordFile.setText(file.getAbsolutePath());
            waarpPassword.setPasswordFile(file);
            try {
              waarpPassword.loadPasswordFile();
            } catch (final CryptoException e) {
              SysErrLogger.FAKE_LOGGER.syserr(e);
            } catch (final Exception e) {
              SysErrLogger.FAKE_LOGGER.syserr(e);
            }
            setUncryptedPassword(waarpPassword.getClearPassword());
            jTextFieldCryptedPassword.setText(
                waarpPassword.getCryptedPassword());
            passwordModified = false;
          }
        }
      };
    }
    return loadPswdAction;
  }

  private AbstractAction getSavePaswdAction() {
    if (savePaswdAction == null) {
      savePaswdAction = new AbstractAction("Save", null) {
        /**
         *
         */
        private static final long serialVersionUID = -5712120697650940845L;

        @Override
        public void actionPerformed(final ActionEvent evt) {
          chooserPwdFile.setDialogType(JFileChooser.SAVE_DIALOG);
          final int response = chooserPwdFile.showSaveDialog(rootPane);
          if (response == JFileChooser.APPROVE_OPTION) {
            File file = chooserPwdFile.getSelectedFile();
            if (!filterPwdKey.accept(file)) {
              file = new File(
                  file.getAbsoluteFile() + "." + WaarpPassword.GGPEXTENSION);
            }
            jTextFieldPasswordFile.setText(file.getAbsolutePath());
            waarpPassword.setPasswordFile(file);
            try {
              waarpPassword.savePasswordFile();
            } catch (final IOException e) {
              SysErrLogger.FAKE_LOGGER.syserr(e);
            }
            passwordModified = false;
          }
        }
      };
    }
    return savePaswdAction;
  }

  private AbstractAction getHelpAction() {
    if (helpAction == null) {
      helpAction = new AbstractAction("Help", null) {
        /**
         *
         */
        private static final long serialVersionUID = -8528091873190483826L;

        @Override
        public void actionPerformed(final ActionEvent evt) {
          getJDialogHelp().setVisible(true);
        }
      };
    }
    return helpAction;
  }

  private JDialog getJDialogHelp() {
    if (jDialogHelp == null) {
      jDialogHelp = new JDialog(this);
      final GroupLayout jDialogHelpLayout =
          new GroupLayout(jDialogHelp.getContentPane());
      jDialogHelp.getContentPane().setLayout(jDialogHelpLayout);
      jDialogHelp.getContentPane().setBackground(new Color(255, 255, 255));
      jDialogHelp.setPreferredSize(new Dimension(670, 479));
      jDialogHelp.setSize(670, 479);
      jDialogHelpLayout.setHorizontalGroup(
          jDialogHelpLayout.createSequentialGroup().addContainerGap(27, 27)
                           .addGroup(jDialogHelpLayout.createParallelGroup()
                                                      .addComponent(
                                                          getJTextPaneHelp(),
                                                          GroupLayout.Alignment.LEADING,
                                                          0, 604,
                                                          Short.MAX_VALUE)
                                                      .addGroup(
                                                          GroupLayout.Alignment.LEADING,
                                                          jDialogHelpLayout.createSequentialGroup()
                                                                           .addGap(
                                                                               254)
                                                                           .addComponent(
                                                                               getJButtonHelp(),
                                                                               GroupLayout.PREFERRED_SIZE,
                                                                               111,
                                                                               GroupLayout.PREFERRED_SIZE)
                                                                           .addGap(
                                                                               0,
                                                                               239,
                                                                               Short.MAX_VALUE)))
                           .addContainerGap(23, 23));
      jDialogHelpLayout.setVerticalGroup(
          jDialogHelpLayout.createSequentialGroup().addContainerGap()
                           .addComponent(getJTextPaneHelp(), 0, 395,
                                         Short.MAX_VALUE)
                           .addComponent(getJButtonHelp(),
                                         GroupLayout.PREFERRED_SIZE,
                                         GroupLayout.PREFERRED_SIZE,
                                         GroupLayout.PREFERRED_SIZE)
                           .addContainerGap());
    }
    return jDialogHelp;
  }

  private JButton getJButtonHelp() {
    if (jButtonHelp == null) {
      jButtonHelp = new JButton();
      jButtonHelp.setText("OK");
      jButtonHelp.setAction(getCloseHelpAction());
    }
    return jButtonHelp;
  }

  private JTextPane getJTextPaneHelp() {
    if (jTextPaneHelp == null) {
      jTextPaneHelp = new JTextPane();
      jTextPaneHelp.setText("                                            " +
                            "                            GoldenGate GUI Password Tool\r\n\r\n" +
                            "A) Key for crypto support\r\n\r\n" +
                            "* First you need to open a Key File (Open) or to create a " +
                            "New Key File (New Key) and to save it (Save Key As...)\r\n" +
                            "* You can at any moment save the Key File to a new " +
                            "Key File (Save Key As...)\r\n\r\n" +
                            "B) Password with Crypto Key\r\n" +
                            "* Then you need to get a Password:\r\n" +
                            "1) Enter a password in the Password field\r\n" +
                            "2) Load a password from a Password file (compatible with " +
                            "the current Key) (Load)\r\n" +
                            "* Then you need to save this password (encrypted) to " +
                            "a File (Save)\r\n\r\n" + "C) " +
                            WaarpPassword.HELPOPTIONS);
      jTextPaneHelp.setEditable(false);
      jTextPaneHelp.setBackground(new Color(255, 255, 255));
    }
    return jTextPaneHelp;
  }

  private AbstractAction getCloseHelpAction() {
    if (closeHelpAction == null) {
      closeHelpAction = new AbstractAction("Close", null) {
        /**
         *
         */
        private static final long serialVersionUID = -2310092372166868386L;

        @Override
        public void actionPerformed(final ActionEvent evt) {
          getJDialogHelp().dispose();
        }
      };
    }
    return closeHelpAction;
  }

}