
// DialogsTest.java (was DialogsTextGUIBasicTest.java)
// Martin Berglund, 2020
// Modified by Andrew Davison, ad@coe.psu.ac.th, March 2023

/* A GUI window using an ActionBoxList to display 7 forms of dialog:
     * Text Input Dialog
     * Password Dialog
     * a multi-line dialog created with 
       TextInputDialogBuilder
     * a dialog that only accepts numerical input,
       created with TextInputDialogBuilder
     * a File Dialog for openning
     * a File Dialog for saving
     * an ActionList Dialog
   and
     * a separator line
     * a GUI close button

   Uses Lanterna 3
   https://github.com/mabe02/lanterna

   Usage (Windows):
     > compile.bat DialogsTest.java
     > run.bat DialogsTest

   Usage (Linux):
     > ./compile.sh DialogsTest.java
     > ./run.sh DialogsTest

*/

import java.io.*;
import java.util.regex.Pattern;

import com.googlecode.lanterna.*;
import com.googlecode.lanterna.gui2.*;
import com.googlecode.lanterna.gui2.dialogs.*;
import com.googlecode.lanterna.screen.*;
import com.googlecode.lanterna.terminal.*;



public class DialogsTest
{

  public static void main(String[] args) 
  {
    // build screen, gui, window
    Screen screen = Utils.createScreen();
    WindowBasedTextGUI gui = new MultiWindowTextGUI(screen);
    BasicWindow window = new BasicWindow("Dialog test");

    // a box list to hold various dialogs
    ActionListBox dialogs = new ActionListBox();

    dialogs.addItem("Simple TextInputDialog", () -> {
      String res = TextInputDialog.showDialog(gui, 
                      "TextInputDialog sample",
                      "This is the description",
                      "initial Content");
      System.err.println("Simple Res: " + res);
    });

    dialogs.addItem("Password input", () -> {
      String res =
        TextInputDialog.showPasswordDialog(gui, 
              "Test password input",
              "This is a password input dialog", "");
      System.err.println("Password Res: " + res);
    });

    dialogs.addItem("Multi-line input", () -> {
      String res = new TextInputDialogBuilder().
               setTitle("Multi-line editor").
               setTextBoxSize(new TerminalSize(35, 5)).
               build().showDialog(gui);
      System.err.println("Multi-line Res: \"" + res + "\"");
    });

    dialogs.addItem("Numeric input", () -> {
      String res = new TextInputDialogBuilder().
              setTitle("Numeric input").
              setDescription("Enter a number").
              setValidationPattern(
                   Pattern.compile("[0-9]+"),
                   "Please enter a valid number").
              build().showDialog(gui);
      System.err.println("Numeric Res: " + res);
    });

    dialogs.addItem("File dialog (open)", () -> {
      File res = new FileDialogBuilder().
             setTitle("Open File").
             setDescription("Choose a file:").
             setActionLabel(LocalizedString.Open.toString()).
             build().showDialog(gui);
      System.err.println("File Res: " + res);
    });

    dialogs.addItem("File dialog (save)", () -> {
      File res = new FileDialogBuilder().
            setTitle("Save File").
            setDescription("Choose a file:").
            setActionLabel(LocalizedString.Save.toString()).
            build().showDialog(gui);
      System.err.println("Save Res: " + res);
    });

    dialogs.addItem("Action list dialog", () -> 
       new ActionListDialogBuilder().
          setTitle("Action List Dialog").
          setDescription("Choose an item").
          addAction("First Item", () -> 
             MessageDialog.showMessageDialog(
                gui, "Action List Dialog",
                "First Item chosen",
                MessageDialogButton.OK)).
          addAction("Second Item", () -> 
             MessageDialog.showMessageDialog(
                gui, "Action List Dialog",
                "Second Item chosen",
                MessageDialogButton.OK)).
          addAction("Third Item", () -> 
             MessageDialog.showMessageDialog(
                gui, "Action List Dialog",
                "Third Item chosen",
                MessageDialogButton.OK)).
          build().showDialog(gui));

    // a panel for the dialogs and a close button
    Panel p = new Panel();
    p.addComponent(dialogs);
    p.addComponent( new EmptySpace(TerminalSize.ONE));
    p.addComponent( new Button("Exit", window::close));

    // link panel, window, and gui
    window.setComponent(p);
    gui.addWindowAndWait(window);

    Utils.close(screen);
  } /* main */


}  // end of DialogsTest class
