Listing 3 demo.c — Short demonstration program

#include <stdio.h>
#include "gui.h"

#define MY_EXIT   1
#define MY_NEW    2
#define MY_CLOSE  3
#define MY_TEXT   4
#define MY_NAME   5

class MY_BUTTON: public GUI_BUTTON {
   public:
      MY_BUTTON(GUI_WINDOW *pParent, int id, int x=0, int y=0,
                int width=MAX_X, int height=MAX_Y, char *text="")
          :GUI_BUTTON(pParent, id, x, y, width, height, text) {}
      int Activate(void);
      int RightClick(void);
};

class MY_ENTRY: public GUI_ENTRY {
   public:
      MY_ENTRY(GUI_WINDOW* pParent, int id, int x=0, int y=0,
               int width=MAX_X, int height=0,
               char* text="", int length=10)
          :GUI_ENTRY(pParent, id, x, y, width, height, text,
                      length) {}
      int Activate(void);
};

GUI_APPLICATION *pApplication;

void CreateMyWindow(int id);
void DeleteMyWindow(GUI_WINDOW *pWindow);

void main(int argc, char **argv)
{
   pApplication = new GUI_APPLICATION(&argc, argv, "demo.log");
   CreateMyWindow(1);
   pApplication->MainLoop();
   delete pApplication;
}

int MY_BUTTON::Activate(void)
{
   static int windowCount = 1;

   switch(GetId() - pParent->GetId()) {
   case MY_EXIT:
      pApplication->Terminate();
      break;
   case MY_NEW:
      if(windowCount < 10) {
         CreateMyWindow(pParent->GetId() + 100);
         windowCount++;
      }
      else {
         GetParent()->Message("Application message",
                          "Too many windows");
      }
      break;
   case MY_CLOSE:
      if(--windowCount) DeleteMyWindow(GetParent());
      else              pApplication->Terminate();
      break;
   }
   return(0);
}

int MY_BUTTON::RightClick(void)
{
   GetParent()->Message("Applicaton Message", "RightClick");
   return(0);
}

int MY_ENTRY::Activate(void)
{
   char text[20+1];

   GetText(text, 20);
   GetParent()->SetText(text);
   return(0);
}

void CreateMyWindow(int id)
{
   int        color, childId;
   char       title[100];
   GUI_WINDOW *pWindow;

   color = id / 100;
   sprintf(title, "Window %d", id);
   pWindow = new GUI_WINDOW(pApplication, id, 15*id, 4900 - 10*id,
                        5000, 5000, color, title,
                        FRAME_TITLE | FRAME_SIZEABLE | FRAME_MAX_BUTTON);

   // create buttons, text and entry field
   new MY_BUTTON(pWindow, id+MY_EXIT,  1000, 9000, 2000, 0, "Exit");
   new MY_BUTTON(pWindow, id+MY_CLOSE, 4000, 9000, 2000, 0, "Close");
   new MY_BUTTON(pWindow, id+MY_NEW,   7000, 9000, 2000, 0, "New");
   new GUI_TEXT(pWindow,  id+MY_TEXT,  1000, 7500, 2500, 0, "New title:");
   new MY_ENTRY(pWindow,  id+MY_MAME,  4000, 7500, 2000, 0, "", 20);

   // create little figure
   childId = id + MY_NAME;
   //body
   new GUI_LINE(pWindow, ++childId, 7500, 7000, 8000, 6500, color+1, 2);
   new GUI_LINE(pWindow, ++childId, 8500, 7000, 8000, 6500, color+1, 2);
   new GUI_LINE(pWindow, ++childId, 8000, 6500, 8000, 4000, color+1, 2);
   new GUI_LINE(pWindow, ++childId, 7500, 5000, 8000, 4500, color+1, 2);
   new GUI_LINE(pWindow, ++childId, 8500, 5000, 8000, 4500, color+1, 2);
   //left eye
   new GUI_ELLIPSE(pWindow, ++childId, 7700, 2900, 300, 300, color+2,
                FILL_SOLID);
   //right eye
   new GUI_ELLIPSE(pWindow, ++childId, 8300, 2900, 300, 300, color+2,
                FILL_SOLID);
   //nose
   new GUI_LINE(pWindow, ++childId, 8000, 3200, 8000, 3600, color+2, 1);
   //mouth
   new GUI_LINE(pWindow, ++childId, 7900, 3800, 8100, 3800, color+2, 1);
   new GUI_LINE(pWindow, ++childId, 7800, 3700, 7900, 3800, color+2, 1);
   new GUI_LINE(pWindow, ++childId, 8100, 3800, 8200, 3700, color+2, 1);
   //head
   new GUI_ELLIPSE(pWindow, ++childId, 8000, 3200, 1400, 1600, color+1,
                FILL_SOLID);

   pWindow->Show();
}

void DeleteMyWindow(GUI_WINDOW *pWindow)
{
   int        id;
   GUI_OBJECT *pObj;

   for(id = MY_EXIT + pWindow->GetId();
      pObj = pWindow->GetChildFromId(id) ;
      id++) delete pObj;
   delete pWindow;
}
/* End of File */