/*
 *  Source machine generated by GadToolsBox V2.0b
 *  which is (c) Copyright 1991-1993 Jaba Development
 *
 *  GUI Designed by : Matthias Meixner
 */

#include <exec/types.h>
#include <intuition/intuition.h>
#include <intuition/classes.h>
#include <intuition/classusr.h>
#include <intuition/imageclass.h>
#include <intuition/gadgetclass.h>
#include <libraries/gadtools.h>
#include <graphics/displayinfo.h>
#include <graphics/gfxbase.h>
#include <clib/exec_protos.h>
#include <clib/intuition_protos.h>
#include <clib/gadtools_protos.h>
#include <clib/graphics_protos.h>
#include <clib/utility_protos.h>
#include <string.h>
#include <pragmas/exec_pragmas.h>
#include <pragmas/intuition_pragmas.h>
#include <pragmas/gadtools_pragmas.h>
#include <pragmas/graphics_pragmas.h>
#include <pragmas/utility_pragmas.h>

#include "cell_gui.h"

#ifdef GERMAN
#define STR(a,b) a
#else
#define STR(a,b) b
#endif


struct Screen         *Scr = NULL;
UBYTE                 *PubScreenName = "Workbench";
APTR                   VisualInfo = NULL;
struct Window         *CellWnd = NULL;
struct Window         *PasteWnd = NULL;
struct Gadget         *CellGList = NULL;
struct Gadget         *PasteGList = NULL;
struct Menu           *CellMenus = NULL;
struct Menu           *PasteMenus = NULL;
struct IntuiMessage    CellMsg;
struct IntuiMessage    PasteMsg;
struct Gadget         *CellGadgets[7];
struct Gadget         *PasteGadgets[2];
UWORD                  CellLeft = 174;
UWORD                  CellTop = 78;
UWORD                  CellWidth = 297;
UWORD                  CellHeight = 192;
UWORD                  PasteLeft = 80;
UWORD                  PasteTop = 78;
UWORD                  PasteWidth = 85;
UWORD                  PasteHeight = 55;
UBYTE                 *CellWdt = (UBYTE *)STR("Drahtautomat","Cell");
UBYTE                 *PasteWdt = NULL;
struct TextAttr       *Font, Attr;
UWORD                  FontX, FontY;
UWORD                  OffX, OffY;

UBYTE *Folge0Labels[] = {
   (UBYTE *)STR("Stop","stop"),
   (UBYTE *)STR("Folge","running"),
   NULL };

UBYTE *Draht0Labels[] = {
   (UBYTE *)STR("Draht","wire"),
   (UBYTE *)STR("Elektron","electron"),
   NULL };

struct NewMenu CellNewMenu[] = {
   NM_TITLE, (STRPTR)STR("Projekt","project"), NULL, 0, NULL, NULL,
   NM_ITEM, (STRPTR)STR("Neu","New"), (STRPTR)"N", 0, 0L, (APTR)CellNeu,
   NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
   NM_ITEM, (STRPTR)STR("Laden...","Load file ..."), (STRPTR)STR("L","O"), 0, 0L, (APTR)CellLaden,
   NM_ITEM, (STRPTR)STR("Speichern...","Save as ..."), (STRPTR)"S", 0, 0L, (APTR)CellSpeichern,
   NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
   NM_ITEM, (STRPTR)STR("Ende","Quit"), (STRPTR)STR("E","Q"), 0, 0L, (APTR)CellEnde,
   NM_TITLE, (STRPTR)"Edit", NULL, 0, NULL, NULL,
   NM_ITEM, (STRPTR)STR("Markierung löschen","Delete mark"), (STRPTR)"M", 0, 0L, (APTR)CellMLoeschen,
   NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
   NM_ITEM, (STRPTR)STR("Bereich ausschneiden","Cut"), (STRPTR)"X", 0, 0L, (APTR)CellMCut,
   NM_ITEM, (STRPTR)STR("Bereich kopieren","Copy"), (STRPTR)"C", 0, 0L, (APTR)CellMCopy,
   NM_ITEM, (STRPTR)STR("Bereich speichern...","Save region"), NULL, 0, 0L, (APTR)CellMSave,
   NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
   NM_ITEM, (STRPTR)STR("Clip einkleben","Paste"), (STRPTR)"P", 0, 0L, (APTR)CellMPaste,
   NM_ITEM, (STRPTR)STR("Datei einkleben...","Paste file"), NULL, 0, 0L, (APTR)CellMInsert,
   NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
   NM_ITEM, (STRPTR)STR("Clip Drehen","Rotate clip"), NULL, NM_ITEMDISABLED, NULL, NULL,
   NM_SUB, (STRPTR)"+90°", NULL, 0, 0L, (APTR)CellRot90,
   NM_SUB, (STRPTR)"+180°", NULL, 0, 0L, (APTR)CellRot180,
   NM_SUB, (STRPTR)"-90°", NULL, 0, 0L, (APTR)CellRot270,
   NM_ITEM, (STRPTR)STR("Clip spiegeln","Mirror"), NULL, NM_ITEMDISABLED, NULL, NULL,
   NM_SUB, (STRPTR)"X", NULL, 0, 0L, (APTR)CellMirrorX,
   NM_SUB, (STRPTR)"Y", NULL, 0, 0L, (APTR)CellMirrorY,
   NM_END, NULL, NULL, 0, 0L, NULL };

struct NewMenu PasteNewMenu[] = {
   NM_TITLE, (STRPTR)"Edit", NULL, 0, NULL, NULL,
   NM_ITEM, (STRPTR)STR("Clip Drehen","Rotate clip"), NULL, 0, NULL, NULL,
   NM_SUB, (STRPTR)"+90°", NULL, 0, 0L, (APTR)PasteRot90,
   NM_SUB, (STRPTR)"+180°", NULL, 0, 0L, (APTR)PasteRot180,
   NM_SUB, (STRPTR)"-90°", NULL, 0, 0L, (APTR)PasteRot270,
   NM_ITEM, (STRPTR)STR("Clip spiegeln","Mirror"), NULL, 0, NULL, NULL,
   NM_SUB, (STRPTR)"X", NULL, 0, 0L, (APTR)PasteMirrorX,
   NM_SUB, (STRPTR)"Y", NULL, 0, 0L, (APTR)PasteMirrorY,
   NM_END, NULL, NULL, 0, 0L, NULL };

UWORD CellGTypes[] = {
   BUTTON_KIND,
   CYCLE_KIND,
   CYCLE_KIND,
   SLIDER_KIND,
   INTEGER_KIND,
   INTEGER_KIND,
   BUTTON_KIND
};

UWORD PasteGTypes[] = {
   BUTTON_KIND,
   BUTTON_KIND
};

struct NewGadget CellNGad[] = {
   8, 5, 88, 22, (UBYTE *)STR("Schritt","step"), NULL, GD_Schritt, PLACETEXT_IN, NULL, (APTR)SchrittClicked,
   8, 31, 88, 22, NULL, NULL, GD_Folge, 0, NULL, (APTR)FolgeClicked,
   8, 57, 88, 22, NULL, NULL, GD_Draht, 0, NULL, (APTR)DrahtClicked,
   78, 83, 18, 95, (UBYTE *)STR("Geschw.","speed"), NULL, GD_Speed, PLACETEXT_LEFT, NULL, (APTR)SpeedClicked,
   27, 83, 45, 13, (UBYTE *)"X", NULL, GD_Width, PLACETEXT_LEFT, NULL, (APTR)WidthClicked,
   27, 100, 45, 13, (UBYTE *)"Y", NULL, GD_Height, PLACETEXT_LEFT, NULL, (APTR)HeightClicked,
   8, 156, 64, 22, (UBYTE *)STR("Bereich","mark"), NULL, GD_Bereich, PLACETEXT_IN, NULL, (APTR)BereichClicked
};

struct NewGadget PasteNGad[] = {
   9, 5, 68, 20, (UBYTE *)"OK", NULL, GD_OK, PLACETEXT_IN, NULL, (APTR)OKClicked,
   9, 29, 68, 20, (UBYTE *)STR("Abbruch","Cancel"), NULL, GD_Abbruch, PLACETEXT_IN, NULL, (APTR)AbbruchClicked
};

ULONG CellGTags[] = {
   (GT_Underscore), '_', (TAG_DONE),
   (GTCY_Labels), (ULONG)&Folge0Labels[ 0 ], (TAG_DONE),
   (GTCY_Labels), (ULONG)&Draht0Labels[ 0 ], (TAG_DONE),
   (GTSL_Min), 1, (GTSL_Max), 30, (GTSL_Level), 5, (GTSL_MaxLevelLen), 4, (GTSL_LevelFormat), (ULONG)"%2ld", (GTSL_LevelPlace), (PLACETEXT_BELOW), (PGA_Freedom), LORIENT_VERT, (GA_RelVerify), TRUE, (
TAG_DONE),
   (GTIN_Number), 20, (GTIN_MaxChars), 10, (TAG_DONE),
   (GTIN_Number), 20, (GTIN_MaxChars), 10, (TAG_DONE),
   (TAG_DONE)
};

ULONG PasteGTags[] = {
   (TAG_DONE),
   (TAG_DONE)
};

static UWORD ComputeX( UWORD value )
{
   return(( UWORD )((( FontX * value ) + 4 ) / 8 ));
}

static UWORD ComputeY( UWORD value )
{
   return(( UWORD )((( FontY * value ) + 4 ) / 8 ));
}

static void ComputeFont( UWORD width, UWORD height )
{
   Font = &Attr;
   Font->ta_Name = (STRPTR)Scr->RastPort.Font->tf_Message.mn_Node.ln_Name;
   Font->ta_YSize = FontY = Scr->RastPort.Font->tf_YSize;
   FontX = Scr->RastPort.Font->tf_XSize;

   OffX = Scr->WBorLeft;
   OffY = Scr->RastPort.TxHeight + Scr->WBorTop + 1;

   if ( width && height ) {
      if (( ComputeX( width ) + OffX + Scr->WBorRight ) > Scr->Width )
         goto UseTopaz;
      if (( ComputeY( height ) + OffY + Scr->WBorBottom ) > Scr->Height )
         goto UseTopaz;
   }
   return;

UseTopaz:
   Font->ta_Name = (STRPTR)"topaz.font";
   FontX = FontY = Font->ta_YSize = 8;
}

int SetupScreen( void )
{
   if ( ! ( Scr = LockPubScreen( PubScreenName )))
      return( 1L );

   ComputeFont( 0, 0 );

   if ( ! ( VisualInfo = GetVisualInfo( Scr, TAG_DONE )))
      return( 2L );

   return( 0L );
}

void CloseDownScreen( void )
{
   if ( VisualInfo ) {
      FreeVisualInfo( VisualInfo );
      VisualInfo = NULL;
   }

   if ( Scr        ) {
      UnlockPubScreen( NULL, Scr );
      Scr = NULL;
   }
}

int HandleCellIDCMP( void )
{
   struct IntuiMessage   *m;
   struct MenuItem      *n;
   int         (*func)();
   BOOL         running = TRUE;

   while( m = GT_GetIMsg( CellWnd->UserPort )) {

      CopyMem(( char * )m, ( char * )&CellMsg, (long)sizeof( struct IntuiMessage ));

      GT_ReplyIMsg( m );

      switch ( CellMsg.Class ) {

         case   IDCMP_REFRESHWINDOW:
            GT_BeginRefresh( CellWnd );
            GT_EndRefresh( CellWnd, TRUE );
            break;

         case   IDCMP_CLOSEWINDOW:
            running = CellCloseWindow();
            break;

         case   IDCMP_NEWSIZE:
            running = CellNewSize();
            break;

         case   IDCMP_MOUSEBUTTONS:
            running = CellMouseButtons();
            break;

         case   IDCMP_GADGETUP:
         case   IDCMP_GADGETDOWN:
            func = ( void * )(( struct Gadget * )CellMsg.IAddress )->UserData;
            running = func();
            break;

         case   IDCMP_MENUPICK:
            while( CellMsg.Code != MENUNULL ) {
               n = ItemAddress( CellMenus, CellMsg.Code );
               func = (void *)(GTMENUITEM_USERDATA( n ));
               running = func();
               CellMsg.Code = n->NextSelect;
            }
            break;
      }
   }
   return( running );
}

int OpenCellWindow( void )
{
   struct NewGadget   ng;
   struct Gadget   *g;
   UWORD      lc, tc;
   UWORD      wleft = CellLeft, wtop = CellTop, ww, wh;

   ComputeFont( CellWidth, CellHeight );

   ww = ComputeX( CellWidth );
   wh = ComputeY( CellHeight );

   if (( wleft + ww + OffX + Scr->WBorRight ) > Scr->Width ) wleft = Scr->Width - ww;
   if (( wtop + wh + OffY + Scr->WBorBottom ) > Scr->Height ) wtop = Scr->Height - wh;

   if ( ! ( g = CreateContext( &CellGList )))
      return( 1L );

   for( lc = 0, tc = 0; lc < Cell_CNT; lc++ ) {

      CopyMem((char * )&CellNGad[ lc ], (char * )&ng, (long)sizeof( struct NewGadget ));

      ng.ng_VisualInfo = VisualInfo;
      ng.ng_TextAttr   = Font;
      ng.ng_LeftEdge   = OffX + ComputeX( ng.ng_LeftEdge );
      ng.ng_TopEdge    = OffY + ComputeY( ng.ng_TopEdge );
      ng.ng_Width      = ComputeX( ng.ng_Width );
      ng.ng_Height     = ComputeY( ng.ng_Height);

      CellGadgets[ lc ] = g = CreateGadgetA((ULONG)CellGTypes[ lc ], g, &ng, ( struct TagItem * )&CellGTags[ tc ] );

      while( CellGTags[ tc ] ) tc += 2;
      tc++;

      if ( NOT g )
         return( 2L );
   }

   if ( ! ( CellMenus = CreateMenus( CellNewMenu, GTMN_FrontPen, 0L, TAG_DONE )))
      return( 3L );

   LayoutMenus( CellMenus, VisualInfo, TAG_DONE );

   if ( ! ( CellWnd = OpenWindowTags( NULL,
            WA_Left,   wleft,
            WA_Top,      wtop,
            WA_Width,   ww + OffX + Scr->WBorRight,
            WA_Height,   wh + OffY + Scr->WBorBottom,
            WA_IDCMP,   BUTTONIDCMP|CYCLEIDCMP|SLIDERIDCMP|INTEGERIDCMP|IDCMP_MOUSEBUTTONS|IDCMP_NEWSIZE|IDCMP_MENUPICK|IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW,
            WA_Flags,   WFLG_SIZEGADGET|WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE,
            WA_Gadgets,   CellGList,
            WA_Title,   CellWdt,
            WA_ScreenTitle,   STR("Drahtautomat","Cell"),
            WA_MinWidth,   300,
            WA_MinHeight,   185,
            WA_MaxWidth,   640,
            WA_MaxHeight,   480,
            WA_AutoAdjust,   TRUE,
            TAG_DONE )))
   return( 4L );

   SetMenuStrip( CellWnd, CellMenus );
   GT_RefreshWindow( CellWnd, NULL );

   return( 0L );
}

void CloseCellWindow( void )
{
   if ( CellMenus      ) {
      ClearMenuStrip( CellWnd );
      FreeMenus( CellMenus );
      CellMenus = NULL;   }

   if ( CellWnd        ) {
      CloseWindow( CellWnd );
      CellWnd = NULL;
   }

   if ( CellGList      ) {
      FreeGadgets( CellGList );
      CellGList = NULL;
   }
}

int HandlePasteIDCMP( void )
{
   struct IntuiMessage   *m;
   struct MenuItem      *n;
   int         (*func)();
   BOOL         running = TRUE;

   while( m = GT_GetIMsg( PasteWnd->UserPort )) {

      CopyMem(( char * )m, ( char * )&PasteMsg, (long)sizeof( struct IntuiMessage ));

      GT_ReplyIMsg( m );

      switch ( PasteMsg.Class ) {

         case   IDCMP_REFRESHWINDOW:
            GT_BeginRefresh( PasteWnd );
            GT_EndRefresh( PasteWnd, TRUE );
            break;

         case   IDCMP_GADGETUP:
            func = ( void * )(( struct Gadget * )PasteMsg.IAddress )->UserData;
            running = func();
            break;

         case   IDCMP_MENUPICK:
            while( PasteMsg.Code != MENUNULL ) {
               n = ItemAddress( PasteMenus, PasteMsg.Code );
               func = (void *)(GTMENUITEM_USERDATA( n ));
               running = func();
               PasteMsg.Code = n->NextSelect;
            }
            break;
      }
   }
   return( running );
}

int OpenPasteWindow( void )
{
   struct NewGadget   ng;
   struct Gadget   *g;
   UWORD      lc, tc;
   UWORD      wleft = PasteLeft, wtop = PasteTop, ww, wh;

   ComputeFont( PasteWidth, PasteHeight );

   ww = ComputeX( PasteWidth );
   wh = ComputeY( PasteHeight );

   if (( wleft + ww + OffX + Scr->WBorRight ) > Scr->Width ) wleft = Scr->Width - ww;
   if (( wtop + wh + OffY + Scr->WBorBottom ) > Scr->Height ) wtop = Scr->Height - wh;

   if ( ! ( g = CreateContext( &PasteGList )))
      return( 1L );

   for( lc = 0, tc = 0; lc < Paste_CNT; lc++ ) {

      CopyMem((char * )&PasteNGad[ lc ], (char * )&ng, (long)sizeof( struct NewGadget ));

      ng.ng_VisualInfo = VisualInfo;
      ng.ng_TextAttr   = Font;
      ng.ng_LeftEdge   = OffX + ComputeX( ng.ng_LeftEdge );
      ng.ng_TopEdge    = OffY + ComputeY( ng.ng_TopEdge );
      ng.ng_Width      = ComputeX( ng.ng_Width );
      ng.ng_Height     = ComputeY( ng.ng_Height);

      PasteGadgets[ lc ] = g = CreateGadgetA((ULONG)PasteGTypes[ lc ], g, &ng, ( struct TagItem * )&PasteGTags[ tc ] );

      while( PasteGTags[ tc ] ) tc += 2;
      tc++;

      if ( NOT g )
         return( 2L );
   }

   if ( ! ( PasteMenus = CreateMenus( PasteNewMenu, GTMN_FrontPen, 0L, TAG_DONE )))
      return( 3L );

   LayoutMenus( PasteMenus, VisualInfo, TAG_DONE );

   if ( ! ( PasteWnd = OpenWindowTags( NULL,
            WA_Left,   wleft,
            WA_Top,      wtop,
            WA_Width,   ww + OffX + Scr->WBorRight,
            WA_Height,   wh + OffY + Scr->WBorBottom,
            WA_IDCMP,   BUTTONIDCMP|IDCMP_MENUPICK|IDCMP_REFRESHWINDOW,
            WA_Flags,   WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_SMART_REFRESH|WFLG_SIMPLE_REFRESH|WFLG_ACTIVATE,
            WA_Gadgets,   PasteGList,
            WA_Title,   PasteWdt,
            TAG_DONE )))
   return( 4L );

   SetMenuStrip( PasteWnd, PasteMenus );
   GT_RefreshWindow( PasteWnd, NULL );

   return( 0L );
}

void ClosePasteWindow( void )
{
   if ( PasteMenus      ) {
      ClearMenuStrip( PasteWnd );
      FreeMenus( PasteMenus );
      PasteMenus = NULL;   }

   if ( PasteWnd        ) {
      CloseWindow( PasteWnd );
      PasteWnd = NULL;
   }

   if ( PasteGList      ) {
      FreeGadgets( PasteGList );
      PasteGList = NULL;
   }
}

