/*
 *  Source generated with GadToolsBox V1.4
 *  which is (c) Copyright 1991,92 Jaba Development
 */

#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 "windows.h"

struct Screen         *Scr = NULL;
APTR                   VisualInfo = NULL;
struct Window         *MainWnd = NULL;
struct Window         *KnotInfoWnd = NULL;
struct Window         *ExpandedViewWnd = NULL;
struct Window         *Scale_GroupWnd = NULL;
struct Window         *Rotate_GroupWnd = NULL;
struct Window         *Move_GroupWnd = NULL;
struct Window         *ConfigWnd = NULL;
struct Gadget         *MainGList = NULL;
struct Gadget         *KnotInfoGList = NULL;
struct Gadget         *ExpandedViewGList = NULL;
struct Gadget         *Scale_GroupGList = NULL;
struct Gadget         *Rotate_GroupGList = NULL;
struct Gadget         *Move_GroupGList = NULL;
struct Gadget         *ConfigGList = NULL;
struct Menu           *MainMenus = NULL;
struct Gadget         *MainGadgets[5];
struct Gadget         *KnotInfoGadgets[10];
struct Gadget         *ExpandedViewGadgets[2];
struct Gadget         *Scale_GroupGadgets[5];
struct Gadget         *Rotate_GroupGadgets[3];
struct Gadget         *Move_GroupGadgets[4];
struct Gadget         *ConfigGadgets[12];
UWORD                  MainLeft = 0;
UWORD                  MainTop = 1;
UWORD                  MainWidth = 640;
UWORD                  MainHeight = 244;
UWORD                  KnotInfoLeft = 379;
UWORD                  KnotInfoTop = 16;
UWORD                  KnotInfoWidth = 251;
UWORD                  KnotInfoHeight = 86;
UWORD                  ExpandedViewLeft = 0;
UWORD                  ExpandedViewTop = 0;
UWORD                  ExpandedViewWidth = 640;
UWORD                  ExpandedViewHeight = 245;
UWORD                  Scale_GroupLeft = 403;
UWORD                  Scale_GroupTop = 19;
UWORD                  Scale_GroupWidth = 230;
UWORD                  Scale_GroupHeight = 65;
UWORD                  Rotate_GroupLeft = 418;
UWORD                  Rotate_GroupTop = 22;
UWORD                  Rotate_GroupWidth = 221;
UWORD                  Rotate_GroupHeight = 64;
UWORD                  Move_GroupLeft = 482;
UWORD                  Move_GroupTop = 21;
UWORD                  Move_GroupWidth = 138;
UWORD                  Move_GroupHeight = 72;
UWORD                  ConfigLeft = 0;
UWORD                  ConfigTop = 1;
UWORD                  ConfigWidth = 640;
UWORD                  ConfigHeight = 244;
UBYTE                 *MainWdt = (UBYTE *)"Main Window";
UBYTE                 *KnotInfoWdt = (UBYTE *)"Knot Information";
UBYTE                 *ExpandedViewWdt = (UBYTE *)"ICoons";
UBYTE                 *Scale_GroupWdt = (UBYTE *)"Scale group";
UBYTE                 *Rotate_GroupWdt = (UBYTE *)"Rotate group";
UBYTE                 *Move_GroupWdt = (UBYTE *)"Move group";
UBYTE                 *ConfigWdt = (UBYTE *)"Configuration";

UBYTE         *Rotate_Group_Axis4Labels[] = {
    (UBYTE *)"Rotate around X",
    (UBYTE *)"Rotate around Y",
    (UBYTE *)"Rotate around Z",
    NULL };

struct TextAttr topaz8 = {
    ( STRPTR )"topaz.font", 8, 0x00, 0x00 };

struct IntuiText  ConfigIText[] = {
    11, 1, JAM2,186, 2, &topaz8, (UBYTE *)"   Configuration parameters:   ", &ConfigIText[1],
    4, 0, JAM1,80, 13, &topaz8, (UBYTE *)"Grid :", &ConfigIText[2],
    4, 0, JAM1,236, 13, &topaz8, (UBYTE *)"Graphics :", &ConfigIText[3],
    4, 0, JAM1,410, 13, &topaz8, (UBYTE *)"Interaction :", NULL };

struct NewMenu MainNewMenu[] = {
    NM_TITLE, (STRPTR)"Project", NULL, 0, 0L, NULL,
    NM_ITEM, (STRPTR)"About ...", NULL, 0, 0L, NULL,
    NM_ITEM, (STRPTR)"New", NULL, 0, 0L, NULL,
    NM_ITEM, (STRPTR)"Load", NULL, 0, 0L, NULL,
    NM_SUB, (STRPTR)"ICoons object", (STRPTR)"L", 0, 0L, NULL,
    NM_SUB, (STRPTR)"JourneyMan object", NULL, 0, 0L, NULL,
    NM_ITEM, (STRPTR)"Save", (STRPTR)"S", 0, 0L, NULL,
    NM_ITEM, (STRPTR)"Generate", NULL, 0, 0L, NULL,
    NM_SUB, (STRPTR)"TTDDD format", NULL, 0, 0L, NULL,
    NM_ITEM, (STRPTR)"Configuration", NULL, 0, 0L, NULL,
    NM_SUB, (STRPTR)"Load  ", NULL, 0, 0L, NULL,
    NM_SUB, (STRPTR)"Save  ", NULL, 0, 0L, NULL,
    NM_SUB, (STRPTR)"Edit  ", NULL, 0, 0L, NULL,
    NM_ITEM, (STRPTR)"Quit", (STRPTR)"Q", 0, 0L, NULL,
    NM_TITLE, (STRPTR)"Display", NULL, 0, 0L, NULL,
    NM_ITEM, (STRPTR)"Zoom in", (STRPTR)"I", 0, 0L, NULL,
    NM_ITEM, (STRPTR)"Zoom out", (STRPTR)"O", 0, 0L, NULL,
    NM_ITEM, (STRPTR)"Center", (STRPTR)"C", 0, 0L, NULL,
    NM_ITEM, (STRPTR)"Rotate P.", NULL, 0, 0L, NULL,
    NM_ITEM, (STRPTR)"Pan        (p)", NULL, 0, 0L, NULL,
    NM_ITEM, (STRPTR)"Grid", NULL, CHECKIT|MENUTOGGLE, 0L, NULL,
    NM_ITEM, (STRPTR)"Grid snap", NULL, CHECKIT|MENUTOGGLE, 0L, NULL,
    NM_ITEM, (STRPTR)"Resolution", NULL, 0, 0L, NULL,
    NM_SUB, (STRPTR)"Up   (+)", NULL, 0, 0L, NULL,
    NM_SUB, (STRPTR)"Down (-)", NULL, 0, 0L, NULL,
    NM_ITEM, (STRPTR)"Redraw     ( )", NULL, 0, 0L, NULL,
    NM_TITLE, (STRPTR)"Windows", NULL, 0, 0L, NULL,
    NM_ITEM, (STRPTR)"Knot...", (STRPTR)"K", 0, 0L, NULL,
    NM_ITEM, (STRPTR)"Scale...", (STRPTR)"Z", 0, 0L, NULL,
    NM_ITEM, (STRPTR)"Rotate...", (STRPTR)"R", 0, 0L, NULL,
    NM_ITEM, (STRPTR)"Move...", (STRPTR)"M", 0, 0L, NULL,
    NM_TITLE, (STRPTR)"Render", NULL, 0, 0L, NULL,
    NM_ITEM, (STRPTR)"Mode", NULL, 0, 8L, NULL,
    NM_SUB, (STRPTR)"Line", NULL, CHECKIT, 14L, NULL,
    NM_SUB, (STRPTR)"Flat", NULL, CHECKIT, 13L, NULL,
    NM_SUB, (STRPTR)"Gouraud", NULL, CHECKIT|CHECKED, 11L, NULL,
    NM_SUB, (STRPTR)"Phong", NULL, CHECKIT, 7L, NULL,
    NM_ITEM, (STRPTR)"Render   (r)", NULL, 0, 0L, NULL,
    NM_ITEM, (STRPTR)"Re-render(R)", NULL, 0, 0L, NULL,
    NM_TITLE, (STRPTR)"Select", NULL, 0, 0L, NULL,
    NM_ITEM, (STRPTR)"Group box    (g)", NULL, 0, 0L, NULL,
    NM_ITEM, (STRPTR)"Group spline (,)", NULL, 0, 0L, NULL,
    NM_ITEM, (STRPTR)"Group all    (.)", NULL, 0, 0L, NULL,
    NM_ITEM, (STRPTR)"Group knot   (;)", NULL, 0, 0L, NULL,
    NM_ITEM, (STRPTR)"Select next  (n)", NULL, 0, 0L, NULL,
    NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
    NM_ITEM, (STRPTR)"Deselect all (Ret)", NULL, 0, 0L, NULL,
    NM_TITLE, (STRPTR)"Commands", NULL, 0, 0L, NULL,
    NM_ITEM, (STRPTR)"Add        (a)", NULL, 0, 0L, NULL,
    NM_ITEM, (STRPTR)"Combine    (C)", NULL, 0, 0L, NULL,
    NM_ITEM, (STRPTR)"Cut        (c)", NULL, 0, 0L, NULL,
    NM_ITEM, (STRPTR)"Delete     (d)", NULL, 0, 0L, NULL,
    NM_ITEM, (STRPTR)"Disconnect (D)", NULL, 0, 0L, NULL,
    NM_ITEM, (STRPTR)"Hide       (h)", NULL, 0, 0L, NULL,
    NM_ITEM, (STRPTR)"Move origin", NULL, 0, 0L, NULL,
    NM_END, NULL, NULL, 0, 0L, NULL };

UWORD MainGTypes[] = {
    BUTTON_KIND,
    BUTTON_KIND,
    BUTTON_KIND,
    BUTTON_KIND,
    BUTTON_KIND
};

UWORD KnotInfoGTypes[] = {
    BUTTON_KIND,
    STRING_KIND,
    BUTTON_KIND,
    STRING_KIND,
    BUTTON_KIND,
    STRING_KIND,
    NUMBER_KIND,
    TEXT_KIND,
    TEXT_KIND,
    TEXT_KIND
};

UWORD ExpandedViewGTypes[] = {
    BUTTON_KIND,
    BUTTON_KIND
};

UWORD Scale_GroupGTypes[] = {
    CHECKBOX_KIND,
    CHECKBOX_KIND,
    CHECKBOX_KIND,
    BUTTON_KIND,
    STRING_KIND
};

UWORD Rotate_GroupGTypes[] = {
    MX_KIND,
    BUTTON_KIND,
    STRING_KIND
};

UWORD Move_GroupGTypes[] = {
    STRING_KIND,
    STRING_KIND,
    STRING_KIND,
    BUTTON_KIND
};

UWORD ConfigGTypes[] = {
    STRING_KIND,
    STRING_KIND,
    INTEGER_KIND,
    INTEGER_KIND,
    INTEGER_KIND,
    INTEGER_KIND,
    INTEGER_KIND,
    INTEGER_KIND,
    INTEGER_KIND,
    BUTTON_KIND,
    BUTTON_KIND,
    INTEGER_KIND
};

struct NewGadget MainNGad[] = {
    0, 0, 17, 120, (UBYTE *)"Z", NULL, GD_G_Z_Expand, PLACETEXT_IN ,NULL, NULL,
    0, 121, 17, 120, (UBYTE *)"Y", NULL, GD_G_Y_Expand, 0 ,NULL, NULL,
    316, 0, 17, 104, (UBYTE *)"P", NULL, GD_G_Persp_Expand, PLACETEXT_IN ,NULL, NULL,
    316, 121, 17, 120, (UBYTE *)"X", NULL, GD_G_X_Expand, 0 ,NULL, NULL,
    316, 104, 17, 16, (UBYTE *)"R", NULL, GD_G_Persp_Rotate, PLACETEXT_IN ,NULL, NULL
};

struct NewGadget KnotInfoNGad[] = {
    16, 35, 117, 13, (UBYTE *)"Tension", NULL, GD_G_Tension, PLACETEXT_IN ,NULL, NULL,
    144, 35, 93, 13, NULL, NULL, GD_G_Tension_Value, 0 ,NULL, NULL,
    16, 51, 117, 13, (UBYTE *)"Bias", NULL, GD_G_Bias, PLACETEXT_IN ,NULL, NULL,
    144, 51, 93, 13, NULL, NULL, GD_G_Bias_Value, 0 ,NULL, NULL,
    16, 67, 117, 13, (UBYTE *)"Continuity", NULL, GD_G_Continuity, PLACETEXT_IN ,NULL, NULL,
    144, 67, 93, 13, NULL, NULL, GD_G_Continuity_Value, 0 ,NULL, NULL,
    120, 2, 57, 13, (UBYTE *)"Point", NULL, GD_G_Point_Id, PLACETEXT_LEFT ,NULL, NULL,
    60, 17, 57, 13, (UBYTE *)"Pos. ", NULL, GD_G_Knot_Pos_X, PLACETEXT_LEFT ,NULL, NULL,
    120, 17, 57, 13, NULL, NULL, GD_G_Knot_Pos_Y, 0 ,NULL, NULL,
    180, 17, 57, 13, NULL, NULL, GD_G_Knot_Pos_Z, 0 ,NULL, NULL
};

struct NewGadget ExpandedViewNGad[] = {
    0, 0, 17, 212, (UBYTE *)"B", NULL, GD_G_Unexpand, PLACETEXT_IN ,NULL, NULL,
    0, 212, 17, 30, (UBYTE *)"R", NULL, GD_G_Persp_Rotate_E, PLACETEXT_IN ,NULL, NULL
};

struct NewGadget Scale_GroupNGad[] = {
    123, 3, 26, 11, (UBYTE *)"Scale X", NULL, GD_Scale_Group_X, PLACETEXT_LEFT ,NULL, NULL,
    123, 17, 26, 11, (UBYTE *)"Scale Y", NULL, GD_Scale_Group_Y, PLACETEXT_LEFT ,NULL, NULL,
    123, 31, 26, 11, (UBYTE *)"Scale Z", NULL, GD_Scale_Group_Z, PLACETEXT_LEFT ,NULL, NULL,
    4, 45, 133, 13, (UBYTE *)"Scale factor", NULL, GD_Scale_Group_Factor, PLACETEXT_IN ,NULL, NULL,
    144, 45, 73, 13, NULL, NULL, GD_Scale_Group_Factor_Value, 0 ,NULL, NULL
};

struct NewGadget Rotate_GroupNGad[] = {
    164, 3, 17, 9, NULL, NULL, GD_Rotate_Group_Axis, PLACETEXT_LEFT ,NULL, NULL,
    8, 45, 109, 13, (UBYTE *)"Angle", NULL, GD_Rotate_Group_Angle, PLACETEXT_IN ,NULL, NULL,
    124, 45, 85, 13, NULL, NULL, GD_Rotate_Group_Angle_Value, 0 ,NULL, NULL
};

struct NewGadget Move_GroupNGad[] = {
    32, 3, 89, 13, (UBYTE *)"X", NULL, GD_Move_Group_X_Value, PLACETEXT_LEFT ,NULL, NULL,
    32, 19, 89, 13, (UBYTE *)"Y", NULL, GD_Move_Group_Y_Value, PLACETEXT_LEFT ,NULL, NULL,
    32, 35, 89, 13, (UBYTE *)"Z", NULL, GD_Move_Group_Z_Value, PLACETEXT_LEFT ,NULL, NULL,
    12, 53, 109, 13, (UBYTE *)"Move", NULL, GD_Move_Group_Move, PLACETEXT_IN ,NULL, NULL
};

struct NewGadget ConfigNGad[] = {
    98, 25, 67, 14, (UBYTE *)"Grid size", NULL, GD_Grid_Size_Value, PLACETEXT_LEFT ,NULL, NULL,
    464, 25, 71, 14, (UBYTE *)"Draw delay", NULL, GD_Delay_Draw_Value, PLACETEXT_LEFT ,NULL, NULL,
    284, 25, 48, 14, (UBYTE *)"Spl. resol. ", NULL, GD_Spline_Resolution_Value, PLACETEXT_LEFT ,NULL, NULL,
    464, 45, 48, 14, (UBYTE *)"Knot", NULL, GD_MQ_Size_KnotInfo_Value, PLACETEXT_LEFT ,NULL, NULL,
    464, 66, 48, 14, (UBYTE *)"Rot. Persp.", NULL, GD_MQ_Size_Rotate_P_Value, PLACETEXT_LEFT ,NULL, NULL,
    464, 87, 48, 14, (UBYTE *)"Rot. group ", NULL, GD_MQ_Size_Rotate_G_Value, PLACETEXT_LEFT ,NULL, NULL,
    464, 108, 48, 14, (UBYTE *)"Scale group", NULL, GD_MQ_Size_Scale_G_Value, PLACETEXT_LEFT ,NULL, NULL,
    464, 129, 48, 14, (UBYTE *)"Move group", NULL, GD_MQ_Size_Move_G_Value, PLACETEXT_LEFT ,NULL, NULL,
    464, 150, 48, 14, (UBYTE *)"Move", NULL, GD_MQ_Size_Move_Value, PLACETEXT_LEFT ,NULL, NULL,
    0, 169, 315, 15, (UBYTE *)"Ok", NULL, GD_Config_Ok, PLACETEXT_IN ,NULL, NULL,
    317, 169, 315, 15, (UBYTE *)"Cancel", NULL, GD_Config_Cancel, PLACETEXT_IN ,NULL, NULL,
    284, 46, 48, 14, (UBYTE *)"Patch resol.", NULL, GD_Patch_Resolution_Value, PLACETEXT_LEFT ,NULL, NULL
};

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

ULONG KnotInfoGTags[] = {
    (TAG_DONE),
    (GTST_String), (ULONG)"0", (GTST_MaxChars), 10, (TAG_DONE),
    (TAG_DONE),
    (GTST_String), (ULONG)"0", (GTST_MaxChars), 10, (TAG_DONE),
    (TAG_DONE),
    (GTST_String), (ULONG)"0", (GTST_MaxChars), 10, (TAG_DONE),
    (GTNM_Number), -1, (GTNM_Border), TRUE, (TAG_DONE),
    (GTTX_Text), (ULONG)"0.0", (GTTX_Border), TRUE, (TAG_DONE),
    (GTTX_Text), (ULONG)"0.0", (GTTX_Border), TRUE, (TAG_DONE),
    (GTTX_Text), (ULONG)"0.0", (GTTX_Border), TRUE, (TAG_DONE)
};

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

ULONG Scale_GroupGTags[] = {
    (GTCB_Checked), TRUE, (TAG_DONE),
    (GTCB_Checked), TRUE, (TAG_DONE),
    (GTCB_Checked), TRUE, (TAG_DONE),
    (TAG_DONE),
    (GTST_String), (ULONG)"1.0", (GTST_MaxChars), 10, (TAG_DONE)
};

ULONG Rotate_GroupGTags[] = {
    (GTMX_Labels), (ULONG)&Rotate_Group_Axis4Labels[ 0 ], (TAG_DONE),
    (TAG_DONE),
    (GTST_String), (ULONG)"0.0", (GTST_MaxChars), 10, (TAG_DONE)
};

ULONG Move_GroupGTags[] = {
    (GTST_String), (ULONG)"0.0", (GTST_MaxChars), 10, (TAG_DONE),
    (GTST_String), (ULONG)"0.0", (GTST_MaxChars), 10, (TAG_DONE),
    (GTST_String), (ULONG)"0.0", (GTST_MaxChars), 10, (TAG_DONE),
    (TAG_DONE)
};

ULONG ConfigGTags[] = {
    (GTST_String), (ULONG)"20.0", (GTST_MaxChars), 10, (TAG_DONE),
    (GTST_String), (ULONG)"0.5", (GTST_MaxChars), 10, (TAG_DONE),
    (GTIN_Number), 4, (GTIN_MaxChars), 10, (TAG_DONE),
    (GTIN_Number), 4, (GTIN_MaxChars), 10, (TAG_DONE),
    (GTIN_Number), 4, (GTIN_MaxChars), 10, (TAG_DONE),
    (GTIN_Number), 4, (GTIN_MaxChars), 10, (TAG_DONE),
    (GTIN_Number), 4, (GTIN_MaxChars), 10, (TAG_DONE),
    (GTIN_Number), 4, (GTIN_MaxChars), 10, (TAG_DONE),
    (GTIN_Number), 0, (GTIN_MaxChars), 10, (TAG_DONE),
    (TAG_DONE),
    (TAG_DONE),
    (GTIN_Number), 4, (GTIN_MaxChars), 10, (TAG_DONE)
};

struct ColorSpec  ScreenColors[] = {
     0, 0x02, 0x02, 0x02,
     1, 0x07, 0x07, 0x07,
     2, 0x0A, 0x0A, 0x0A,
     3, 0x06, 0x08, 0x0B,
     4, 0x0F, 0x00, 0x00,
     5, 0x0F, 0x0F, 0x00,
     6, 0x00, 0x0F, 0x00,
     7, 0x0D, 0x07, 0x06,
     8, 0x0C, 0x05, 0x0C,
     9, 0x0E, 0x05, 0x00,
    10, 0x09, 0x0F, 0x01,
    11, 0x0F, 0x0F, 0x06,
    12, 0x05, 0x05, 0x0F,
    13, 0x09, 0x02, 0x0F,
    14, 0x00, 0x0F, 0x08,
    15, 0x0C, 0x0C, 0x0C,
    ~0, 0x00, 0x00, 0x00 };

UWORD             DriPens[] = {
    2,3,11,2,1,3,5,1,4,~0 };

int SetupScreen( void )
{
    if ( ! ( Scr = OpenScreenTags( NULL, SA_Left,          0,
                                         SA_Top,           0,
                                         SA_Width,         640,
                                         SA_Height,        256,
                                         SA_Depth,         4,
                                         SA_Colors,        &ScreenColors[0],
                                         SA_Font,          &topaz8,
                                         SA_Type,          CUSTOMSCREEN,
                                         SA_DisplayID,     PAL_MONITOR_ID|HIRES_KEY,
                                         SA_Pens,          &DriPens[0],
                                         SA_Title,         "ICoons",
                                         TAG_DONE )))
        return( 1L );

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

    return( 0L );
}

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

    if ( Scr        ) {
        CloseScreen( Scr );
        Scr = NULL;
    }
}

void MainRender( void )
{
    UWORD        offx, offy;

    offx = MainWnd->BorderLeft;
    offy = MainWnd->BorderTop;


    DrawBevelBox( MainWnd->RPort, offx + 335, offy + 121, 296, 120, GT_VisualInfo, VisualInfo, TAG_DONE );
    DrawBevelBox( MainWnd->RPort, offx + 334, offy + 0, 297, 120, GT_VisualInfo, VisualInfo, TAG_DONE );
    DrawBevelBox( MainWnd->RPort, offx + 18, offy + 0, 297, 120, GT_VisualInfo, VisualInfo, TAG_DONE );
    DrawBevelBox( MainWnd->RPort, offx + 18, offy + 121, 297, 120, GT_VisualInfo, VisualInfo, TAG_DONE );
}

int OpenMainWindow( void )
{
    struct NewGadget     ng;
    struct Gadget       *g;
    UWORD                lc, tc;
    UWORD                offx = Scr->WBorLeft,offy = Scr->WBorTop + Scr->RastPort.TxHeight + 1;

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

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

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

        ng.ng_VisualInfo = VisualInfo;
        ng.ng_TextAttr   = &topaz8;
        ng.ng_LeftEdge  += offx;
        ng.ng_TopEdge   += offy;

        MainGadgets[ lc ] = g = CreateGadgetA((ULONG)MainGTypes[ lc ], g, &ng, ( struct TagItem * )&MainGTags[ tc ] );

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

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

    if ( ! ( MainMenus = CreateMenus( MainNewMenu, GTMN_FrontPen, 0L, TAG_DONE )))
        return( 3L );

    LayoutMenus( MainMenus, VisualInfo, GTMN_TextAttr, &topaz8, TAG_DONE );

    if ( ! ( MainWnd = OpenWindowTags( NULL,
                    WA_Left,          MainLeft,
                    WA_Top,           MainTop,
                    WA_Width,         MainWidth,
                    WA_Height,        MainHeight + offy,
                    WA_IDCMP,         BUTTONIDCMP|IDCMP_GADGETDOWN|IDCMP_INTUITICKS|IDCMP_MOUSEMOVE|IDCMP_MOUSEBUTTONS|IDCMP_MENUPICK|IDCMP_CLOSEWINDOW|IDCMP_RAWKEY|IDCMP_VANILLAKEY|IDCMP_REFRESHWINDOW,
                    WA_Flags,         WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH|WFLG_REPORTMOUSE|WFLG_ACTIVATE,
                    WA_Gadgets,       MainGList,
                    WA_Title,         MainWdt,
                    WA_ScreenTitle,   "ICoons",
                    WA_CustomScreen,  Scr,
                    TAG_DONE )))
        return( 4L );

    SetMenuStrip( MainWnd, MainMenus );
    GT_RefreshWindow( MainWnd, NULL );

    MainRender();

    return( 0L );
}

void CloseMainWindow( void )
{
    if ( MainMenus      ) {
        ClearMenuStrip( MainWnd );
        FreeMenus( MainMenus );
        MainMenus = NULL;    }

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

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

int OpenKnotInfoWindow( void )
{
    struct NewGadget     ng;
    struct Gadget       *g;
    UWORD                lc, tc;
    UWORD                offx = Scr->WBorLeft,offy = Scr->WBorTop + Scr->RastPort.TxHeight + 1;

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

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

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

        ng.ng_VisualInfo = VisualInfo;
        ng.ng_TextAttr   = &topaz8;
        ng.ng_LeftEdge  += offx;
        ng.ng_TopEdge   += offy;

        KnotInfoGadgets[ lc ] = g = CreateGadgetA((ULONG)KnotInfoGTypes[ lc ], g, &ng, ( struct TagItem * )&KnotInfoGTags[ tc ] );

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

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

    if ( ! ( KnotInfoWnd = OpenWindowTags( NULL,
                    WA_Left,          KnotInfoLeft,
                    WA_Top,           KnotInfoTop,
                    WA_Width,         KnotInfoWidth,
                    WA_Height,        KnotInfoHeight + offy,
                    WA_IDCMP,         BUTTONIDCMP|STRINGIDCMP|NUMBERIDCMP|TEXTIDCMP|IDCMP_MENUPICK|IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW,
                    WA_Flags,         WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH,
                    WA_Gadgets,       KnotInfoGList,
                    WA_Title,         KnotInfoWdt,
                    WA_ScreenTitle,   "ICoons",
                    WA_CustomScreen,  Scr,
                    TAG_DONE )))
        return( 4L );

    GT_RefreshWindow( KnotInfoWnd, NULL );

    return( 0L );
}

void CloseKnotInfoWindow( void )
{
    if ( KnotInfoWnd        ) {
        CloseWindow( KnotInfoWnd );
        KnotInfoWnd = NULL;
    }

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

int OpenExpandedViewWindow( void )
{
    struct NewGadget     ng;
    struct Gadget       *g;
    UWORD                lc, tc;
    UWORD                offx = Scr->WBorLeft,offy = Scr->WBorTop + Scr->RastPort.TxHeight + 1;

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

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

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

        ng.ng_VisualInfo = VisualInfo;
        ng.ng_TextAttr   = &topaz8;
        ng.ng_LeftEdge  += offx;
        ng.ng_TopEdge   += offy;

        ExpandedViewGadgets[ lc ] = g = CreateGadgetA((ULONG)ExpandedViewGTypes[ lc ], g, &ng, ( struct TagItem * )&ExpandedViewGTags[ tc ] );

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

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

    if ( ! ( ExpandedViewWnd = OpenWindowTags( NULL,
                    WA_Left,          ExpandedViewLeft,
                    WA_Top,           ExpandedViewTop,
                    WA_Width,         ExpandedViewWidth,
                    WA_Height,        ExpandedViewHeight + offy,
                    WA_IDCMP,         BUTTONIDCMP|IDCMP_INTUITICKS|IDCMP_MOUSEMOVE|IDCMP_MOUSEBUTTONS|IDCMP_MENUPICK|IDCMP_CLOSEWINDOW|IDCMP_RAWKEY|IDCMP_VANILLAKEY|IDCMP_REFRESHWINDOW,
                    WA_Flags,         WFLG_CLOSEGADGET|WFLG_SMART_REFRESH|WFLG_REPORTMOUSE|WFLG_ACTIVATE,
                    WA_Gadgets,       ExpandedViewGList,
                    WA_Title,         ExpandedViewWdt,
                    WA_ScreenTitle,   "ICoons",
                    WA_CustomScreen,  Scr,
                    TAG_DONE )))
        return( 4L );

    GT_RefreshWindow( ExpandedViewWnd, NULL );

    return( 0L );
}

void CloseExpandedViewWindow( void )
{
    if ( ExpandedViewWnd        ) {
        CloseWindow( ExpandedViewWnd );
        ExpandedViewWnd = NULL;
    }

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

int OpenScale_GroupWindow( void )
{
    struct NewGadget     ng;
    struct Gadget       *g;
    UWORD                lc, tc;
    UWORD                offx = Scr->WBorLeft,offy = Scr->WBorTop + Scr->RastPort.TxHeight + 1;

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

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

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

        ng.ng_VisualInfo = VisualInfo;
        ng.ng_TextAttr   = &topaz8;
        ng.ng_LeftEdge  += offx;
        ng.ng_TopEdge   += offy;

        Scale_GroupGadgets[ lc ] = g = CreateGadgetA((ULONG)Scale_GroupGTypes[ lc ], g, &ng, ( struct TagItem * )&Scale_GroupGTags[ tc ] );

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

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

    if ( ! ( Scale_GroupWnd = OpenWindowTags( NULL,
                    WA_Left,          Scale_GroupLeft,
                    WA_Top,           Scale_GroupTop,
                    WA_Width,         Scale_GroupWidth,
                    WA_Height,        Scale_GroupHeight + offy,
                    WA_IDCMP,         CHECKBOXIDCMP|BUTTONIDCMP|STRINGIDCMP|IDCMP_MENUPICK|IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW,
                    WA_Flags,         WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH,
                    WA_Gadgets,       Scale_GroupGList,
                    WA_Title,         Scale_GroupWdt,
                    WA_ScreenTitle,   "ICoons",
                    WA_CustomScreen,  Scr,
                    TAG_DONE )))
        return( 4L );

    GT_RefreshWindow( Scale_GroupWnd, NULL );

    return( 0L );
}

void CloseScale_GroupWindow( void )
{
    if ( Scale_GroupWnd        ) {
        CloseWindow( Scale_GroupWnd );
        Scale_GroupWnd = NULL;
    }

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

int OpenRotate_GroupWindow( void )
{
    struct NewGadget     ng;
    struct Gadget       *g;
    UWORD                lc, tc;
    UWORD                offx = Scr->WBorLeft,offy = Scr->WBorTop + Scr->RastPort.TxHeight + 1;

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

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

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

        ng.ng_VisualInfo = VisualInfo;
        ng.ng_TextAttr   = &topaz8;
        ng.ng_LeftEdge  += offx;
        ng.ng_TopEdge   += offy;

        Rotate_GroupGadgets[ lc ] = g = CreateGadgetA((ULONG)Rotate_GroupGTypes[ lc ], g, &ng, ( struct TagItem * )&Rotate_GroupGTags[ tc ] );

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

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

    if ( ! ( Rotate_GroupWnd = OpenWindowTags( NULL,
                    WA_Left,          Rotate_GroupLeft,
                    WA_Top,           Rotate_GroupTop,
                    WA_Width,         Rotate_GroupWidth,
                    WA_Height,        Rotate_GroupHeight + offy,
                    WA_IDCMP,         MXIDCMP|BUTTONIDCMP|STRINGIDCMP|IDCMP_MENUPICK|IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW,
                    WA_Flags,         WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE,
                    WA_Gadgets,       Rotate_GroupGList,
                    WA_Title,         Rotate_GroupWdt,
                    WA_ScreenTitle,   "ICoons",
                    WA_CustomScreen,  Scr,
                    TAG_DONE )))
        return( 4L );

    GT_RefreshWindow( Rotate_GroupWnd, NULL );

    return( 0L );
}

void CloseRotate_GroupWindow( void )
{
    if ( Rotate_GroupWnd        ) {
        CloseWindow( Rotate_GroupWnd );
        Rotate_GroupWnd = NULL;
    }

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

int OpenMove_GroupWindow( void )
{
    struct NewGadget     ng;
    struct Gadget       *g;
    UWORD                lc, tc;
    UWORD                offx = Scr->WBorLeft,offy = Scr->WBorTop + Scr->RastPort.TxHeight + 1;

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

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

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

        ng.ng_VisualInfo = VisualInfo;
        ng.ng_TextAttr   = &topaz8;
        ng.ng_LeftEdge  += offx;
        ng.ng_TopEdge   += offy;

        Move_GroupGadgets[ lc ] = g = CreateGadgetA((ULONG)Move_GroupGTypes[ lc ], g, &ng, ( struct TagItem * )&Move_GroupGTags[ tc ] );

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

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

    if ( ! ( Move_GroupWnd = OpenWindowTags( NULL,
                    WA_Left,          Move_GroupLeft,
                    WA_Top,           Move_GroupTop,
                    WA_Width,         Move_GroupWidth,
                    WA_Height,        Move_GroupHeight + offy,
                    WA_IDCMP,         STRINGIDCMP|BUTTONIDCMP|IDCMP_GADGETDOWN|IDCMP_MENUPICK|IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW,
                    WA_Flags,         WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE,
                    WA_Gadgets,       Move_GroupGList,
                    WA_Title,         Move_GroupWdt,
                    WA_ScreenTitle,   "ICoons",
                    WA_CustomScreen,  Scr,
                    TAG_DONE )))
        return( 4L );

    GT_RefreshWindow( Move_GroupWnd, NULL );

    return( 0L );
}

void CloseMove_GroupWindow( void )
{
    if ( Move_GroupWnd        ) {
        CloseWindow( Move_GroupWnd );
        Move_GroupWnd = NULL;
    }

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

void ConfigRender( void )
{
    UWORD        offx, offy;

    offx = ConfigWnd->BorderLeft;
    offy = ConfigWnd->BorderTop;

    PrintIText( ConfigWnd->RPort, ConfigIText, offx, offy );

    DrawBevelBox( ConfigWnd->RPort, offx + 184, offy + 1, 250, 10, GT_VisualInfo, VisualInfo, TAG_DONE );
}

int OpenConfigWindow( void )
{
    struct NewGadget     ng;
    struct Gadget       *g;
    UWORD                lc, tc;
    UWORD                offx = Scr->WBorLeft,offy = Scr->WBorTop + Scr->RastPort.TxHeight + 1;

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

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

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

        ng.ng_VisualInfo = VisualInfo;
        ng.ng_TextAttr   = &topaz8;
        ng.ng_LeftEdge  += offx;
        ng.ng_TopEdge   += offy;

        ConfigGadgets[ lc ] = g = CreateGadgetA((ULONG)ConfigGTypes[ lc ], g, &ng, ( struct TagItem * )&ConfigGTags[ tc ] );

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

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

    if ( ! ( ConfigWnd = OpenWindowTags( NULL,
                    WA_Left,          ConfigLeft,
                    WA_Top,           ConfigTop,
                    WA_Width,         ConfigWidth,
                    WA_Height,        ConfigHeight + offy,
                    WA_IDCMP,         STRINGIDCMP|INTEGERIDCMP|BUTTONIDCMP|IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW,
                    WA_Flags,         WFLG_SMART_REFRESH|WFLG_ACTIVATE,
                    WA_Gadgets,       ConfigGList,
                    WA_Title,         ConfigWdt,
                    WA_ScreenTitle,   "ICoons",
                    WA_CustomScreen,  Scr,
                    TAG_DONE )))
        return( 4L );

    GT_RefreshWindow( ConfigWnd, NULL );

    ConfigRender();

    return( 0L );
}

void CloseConfigWindow( void )
{
    if ( ConfigWnd        ) {
        CloseWindow( ConfigWnd );
        ConfigWnd = NULL;
    }

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

