/* GraphDraw main file */

#define __NOLIBBASE__

#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/intuition.h>

#include <priv/syscpp/sysmenu.h>
#include <priv/syscpp/syswindow.h>
#include <priv/syserr.h>

#include "graph-win.h"
#include "graph-ps.h"
#include "datastream.h"


extern Library *DOSBase, *SysBase;

Library *IntuitionBase, *GfxBase, *AslBase, *GadToolsBase;

/* menu identifiers */

#define MENU_SAVE_AS_PS     7
#define MENU_QUIT         8

NewMenu AppMenu[] = {
  {NM_TITLE, "Project", 0, 0, 0, 0},
    {NM_ITEM, "SaveAs", 0, 0, 0, 0},
      {NM_SUB, "PostScript (EPS)", 0, 0, 0, (APTR)MENU_SAVE_AS_PS},
    {NM_ITEM, NM_BARLABEL, 0, 0, 0, 0},
    {NM_ITEM, "Quit", "Q", 0, 0, (APTR)MENU_QUIT},
  {NM_END, 0, 0, 0, 0}};

char *VString = "$VER: DrawGraph 0.3 (3.3.2002) by Grzegorz \"Krashan\" Kraszewski\n";

/*----------------------------------------------------------------------------------------------------*/

int graph(void)
  {
    TagItem lrt[] = {
      ASLFR_RejectIcons, TRUE,
      ASLFR_TitleText, (long)"Select ASCII data file",
      ASLFR_PositiveText, (long)"Load",
      TAG_END, 0};

    SysMenu m(AppMenu);
    ReqFile f(MODE_OLDFILE, lrt);
    GdDataStreamAsciiFile s((BPTR)f);
    GraphWin w(&s);
    unsigned long signals, sigmask, run = TRUE, msgclass, msgcode;
    IntuiMessage *msg;
    MenuItem *menu_item;

    w.add_menu(&m);
    w.drawgraph();
    sigmask = (1 << (w.get_userport())->mp_SigBit);

    while (run)
      {
        signals = Wait(sigmask | SIGBREAKF_CTRL_C);
        if (signals & SIGBREAKF_CTRL_C) run = FALSE;
        else if (signals & sigmask)
          {
            while(msg = (IntuiMessage*)GetMsg(w.get_userport()))
              {
                msgclass = msg->Class;
                msgcode = msg->Code;
                ReplyMsg((Message*)msg);

                switch (msg->Class)
                  {
                    case IDCMP_CLOSEWINDOW:
                      run = false;
                    break;

                    case IDCMP_MENUPICK:
                      menu_item = ItemAddress((Menu*)m, msgcode);
                      if (menu_item)
                        {
                          switch ((long)GTMENUITEM_USERDATA(menu_item))
                            {
                              case MENU_SAVE_AS_PS:
                                {
                                  try {
                                    GraphEps eps(&s);
                                    eps.drawgraph();
                                  }
                                  catch (RequestAborted) {}
                                }
                              break;
                              case MENU_QUIT: run = FALSE; break;
                            }
                        }
                    break;

                    case IDCMP_NEWSIZE:
                      w.resize();
                    break;
                  }
              }
          }
      }
  }


int main(void)
  {
    long ret = 0;

    if (GfxBase = OpenLibrary((UBYTE*)"graphics.library", 39))
      {
        if (IntuitionBase = OpenLibrary((UBYTE*)"intuition.library", 39))
          {
            try
              {
                if (AslBase = OpenLibrary((UBYTE*)"asl.library", 39))
                  {
                    if (GadToolsBase = OpenLibrary((UBYTE*)"gadtools.library", 39))
                      {
                        graph();
                        CloseLibrary(GadToolsBase);
                      }
                    CloseLibrary(AslBase);
                  }
              }
            catch (SysErr)
              {
                Printf("System error %ld.\n", IoErr());
                ret = 10;
              }
            catch (RequestAborted)
              {
                Printf("File requester aborted.\n");
              }
            CloseLibrary(IntuitionBase);
          }
        CloseLibrary(GfxBase);
      }
    return ret;
  }


