#include <intuition/intuisup.h>
#include <clib/macros.h>
#include <proto/all.h>

struct   GfxBase        *GfxBase;
struct   IntuitionBase  *IntuitionBase;
struct   Window         *sr_window;

#ifdef ISUP_RUNTIME
struct   Library  *iSupBase;
#else
struct   Device   *ConsoleDevice;
struct   IOStdReq  ConsoleMsg;
#endif


VOID   Resize();


struct IntuiText  Body[3] =
   {
      { 0, 0, JAM1, 0,0, NULL, "This is requester One", &Body[1] },
      { 2, 0, JAM1, 0,0, NULL, "It has 3 text lines", &Body[2] },
      { 3, 0, JAM1, 0,0, NULL, "and 2 string gadgets", NULL }
   };

UBYTE Buffer1[40] = "Hi!";
UBYTE Buffer2[10] = "123456789";
UBYTE UBuffer1[40], UBuffer2[10];

struct StringInfoList Gad[2] =
   {
      { &Gad[1], { Buffer1, UBuffer1, 0, 40, 0, 0,0,0,0,0,NULL,0L,NULL } },
      { NULL,    { Buffer2, UBuffer2, 0, 10, 0, 0,0,0,0,0,NULL,0L,NULL } }
   };

struct SmartReq   sm =
   {
   Body,
   Gad,
   "Ok", "Cancel",
   NULL, NULL,
   Resize,
   NULL
   };

struct IntuiText  BBody[5] =
   {
      { 0, 0, JAM1, 0,0, NULL, "This is the second one", &BBody[1] },
      { 0, 0, JAM1, 0,0, NULL, "", &BBody[2] },
      { 0, 0, JAM1, 0,0, NULL, "The text attributes can", &BBody[3] },
      { 0, 0, JAM1, 0,0, NULL, "be controlled for each", &BBody[4] },
      { 2, 0, JAM1, 0,0, NULL, "individual line", NULL }
   };

UBYTE BBuffer0[40] = "This is Gadget 1";
UBYTE BBuffer1[40] = "This is Gadget 2";
UBYTE BBuffer2[40] = "This is Gadget 3";
UBYTE BBuffer3[40] = "This is Gadget 4";
UBYTE BBuffer4[40] = "This is Gadget 5";
UBYTE UUBuffer0[40];
UBYTE UUBuffer1[40];
UBYTE UUBuffer2[40];
UBYTE UUBuffer3[40];
UBYTE UUBuffer4[40];

struct StringInfoList GGad[10] =
   {
      { &GGad[1], { BBuffer0, UUBuffer0, 0, 40, 0, 0,0,0,0,0,NULL,0L,NULL } },
      { &GGad[2], { BBuffer1, UUBuffer1, 0, 40, 0, 0,0,0,0,0,NULL,0L,NULL } },
      { &GGad[3], { BBuffer2, UUBuffer2, 0, 40, 0, 0,0,0,0,0,NULL,0L,NULL } },
      { &GGad[4], { BBuffer3, UUBuffer3, 0, 40, 0, 0,0,0,0,0,NULL,0L,NULL } },
      { NULL,     { BBuffer4, UUBuffer4, 0, 40, 0, 0,0,0,0,0,NULL,0L,NULL } },
   };

struct SmartReq   ssm =
   {
   BBody,
   GGad,
   "Ok", NULL,
   NULL, NULL,
   Resize,
   NULL
   };


UBYTE buf1[20] = "";
UBYTE buf2[20] = "";
UBYTE buf3[20] = "";


VOID Resize()
{
   RemakeStdWindow(sr_window, "SmartReq Example", NULL);
}

VOID
Cleanup(err)
BYTE  err;
{

   if (sr_window)       CloseStdWindow(sr_window);

#ifdef ISUP_RUNTIME
      if (iSupBase)      CloseLibrary(iSupBase);
#else
      if (ConsoleDevice) CloseDevice(&ConsoleMsg);
#endif
   if (GfxBase)         CloseLibrary(GfxBase);
   if (IntuitionBase)   CloseLibrary(IntuitionBase);

   exit(err);
}

VOID
main()
{
   extern struct WIndow *DisplayWindow();


   if (  !(GfxBase       = (struct Library *)OpenLibrary("graphics.library", 0))
      || !(IntuitionBase = (struct Library *)OpenLibrary("intuition.library", 0))
#ifdef ISUP_RUNTIME
      || !(iSupBase      = (struct Library *)OpenLibrary("isup.library", 0))
#else
      || !(!OpenDevice("console.device", -1, &ConsoleMsg, 0) && (ConsoleDevice=ConsoleMsg.io_Device))
#endif
      ) Cleanup(10);

   if (!(sr_window = OpenStdWindow("SmartReq Example", 0x17, 10,15, 360,180, NULL))) Cleanup(15);

   SmartReq(sr_window, &sm);
   SmartReq(sr_window, &ssm);

   AutoSmartRequest(sr_window, 2, "Simple text only", "example", 0,
                        "Ok", NULL, Resize, NULL);
   AutoSmartRequest(sr_window, 1, "Enter a file name:", 1, buf1, 20, "Ok", NULL, Resize, NULL);

   AutoSmartRequest(sr_window, 1, "Software Failure?", 0, "Nope", NULL, Resize, NULL);

   AutoSmartRequest(sr_window, 2, "Enter string to search,", "replacement, and wildcard",
                         3, buf1, 20, buf2, 20, buf3, 20,
                        "Replace", "Cancel", Resize, NULL);

   Cleanup(0);
}

