/* ================================================================= */

/* Module name: main.c */
  
/* ----------------------------------------------------------------- */

#define ALLOCATE_GLOBALS

#include "general.h"
#include <workbench/startup.h>


#define MAIN_COUNT 6

UBYTE (*main_list[])(void) = {
  
        OpenInt,
        OpenGraphics,       
        OpenGadtools,
        OpenAsl,
        LockScreen,
        GetVisInfo
  
         };


UBYTE (*event_handler[])(void) = {
  
        NULL,          /* not using zero entry */
        EventHandler1, /* entry 1 for window 1 */
        EventHandler2, /* entry 2 for window 2 */
        EventHandler3  /* entry 3 for window 3 */       
        };


int wbmain(struct WBStartup *wbs)

{

main(0,0);

}

int  main(int argc, char *argv[])

{

UBYTE i,error_number=NO_ERROR;

TEXT *s_p="DummyDummyDummyDummy";

if(!(g_resource_stack_p=CreateStack(void *))) error_number=NO_STACK; 
        
else  {

      /* attempt to allocate resources... */

       error_number=AllocateResource(MAIN_COUNT,main_list);

       if (error_number) DisplayBeep(NULL); 
            
         else {

              /* use the empty database header for the
                 preliminary position variable calculations */
                   
             
              g_new_node.ln_Node.ln_Type=NT_USER;
              
              g_font_width=(TextLength(&(*g_public_screen_p)
              .RastPort,s_p,LABEL_SIZE))/LABEL_SIZE;
              g_font_height=(*g_public_screen_p).RastPort.TxHeight;
              g_field_height=g_font_height+2*FIELD_GAP;   
              g_offset=g_field_height;
              g_w1_height=W1_MINIMUM_HEIGHT;

              /* now experiment until we find a 
                 maximum window width field size */

              g_w3_label_space=g_offset+g_font_width*LABEL_SIZE;


              for (i=10;i<200;i+=2)
              
                  {
                    
                   g_database_header.dh_FieldSize=i;        
                   g_w3_width=g_w3_label_space+g_font_width
                   *g_database_header.dh_FieldSize+3*g_offset;

                   if (g_w3_width>g_public_screen_p->Width)
                    
                       {
                        
                       g_maximum_field_size=i-2; i=200;
                       
                       }
                  
                   }

                      
              SetHeaderDefaults(&g_database_header);

              CalculateGadgetPositions(&g_database_header); 
                                  
              SetOrigWindowPositions();
       
              Execute("run >NIL: EasyBaseHelp",NULL,NULL);
                                                  
              error_number=OpenWindow1();
                                                                        
              error_number=MainEventHandler();   
                                         
              if (g_handler_sigbit[1]) CloseWindow1();                    
              if (g_handler_sigbit[2]) CloseWindow2(); 
              if (g_handler_sigbit[3]) CloseWindow3(); 
                        
              }
            
       g_database_list_p=ClearList(g_database_list_p); /* remove list */
                      
       while(!PopStack(g_resource_stack_p,g_function1)) g_function1(); 


       KillStack(g_resource_stack_p);
     
     }

return(0);

} /* Logical end of program */
  
/* ----------------------------------------------------------------- */

UBYTE MainEventHandler(void)

{           

UBYTE error_number=NO_ERROR; 

ULONG signals;  

do { 

    signals=Wait(g_port_mask); 

    if (signals & g_handler_sigbit[2])
    
        error_number=event_handler[2]();



    if (signals & g_handler_sigbit[3])
    
        error_number=event_handler[3]();



    if (signals & g_handler_sigbit[1])
    
        error_number=event_handler[1]();

 
                                                               

   if(error_number==REFRESH)
    
        { 

        if (g_handler_sigbit[1]) 
        
          {
            CloseWindow1(); 
             
            error_number=OpenWindow1();
                                              
          }
 

        if (g_handler_sigbit[2]) 
        
          { 
            if (g_handler_sigbit[3]) CloseWindow3();
             
            CloseWindow2(); 
         
            error_number=OpenWindow2();

          }         

        
         
        if (g_handler_sigbit[3]) 
                
          {            
                      
            CloseWindow3(); 
         
            error_number=OpenWindow3();      
           
          }

         
        }
        
   }while(error_number!=PROGRAM_EXIT);


return(error_number);

}

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

void SetOrigWindowPositions(void)

{
    
g_w1_x=20;
g_w1_y=20;

g_w3_x=50;
g_w3_y=50;
                         
g_w2_x=80;
g_w2_y=80;             
 
g_asl_x=20;
g_asl_y=20;                       

}

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

void SetHeaderDefaults(struct DatabaseHeader *header_p)
               
{

header_p->dh_ID=FILE_ID; /* note - field count and size already set */

header_p->dh_DatabaseHeaderDataSize=sizeof(struct DatabaseHeader)-6;

header_p->dh_FieldCount=DEFAULT_FIELD_COUNT;

header_p->dh_FieldSize=DEFAULT_FIELD_SIZE;    

header_p->dh_KeyField=1;

header_p->dh_Pad=0;

header_p->dh_Flags=0;

g_descriptor.rh_ID=RECORD_ID; /* note - field count and size already set */

g_descriptor.rh_RecordHeaderDataSize=sizeof(struct RecordHeader)-6; 

g_descriptor.rh_FieldCount=DEFAULT_FIELD_COUNT;  

g_descriptor.rh_FieldSize=DEFAULT_FIELD_SIZE;

g_descriptor.rh_KeyField=1;

g_descriptor.rh_Pad=0;

g_descriptor.rh_Flags=0;

}


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

void CalculateGadgetPositions(struct DatabaseHeader *header_p)

{
    
g_w3_width=g_w3_label_space+g_font_width*header_p->dh_FieldSize+3*g_offset;

g_w3_height=(header_p->dh_FieldCount+2)*(g_field_height+FIELD_GAP)+2*g_offset;

g_w3_gadget1_x=g_w3_label_space;

g_w3_gadget1_y=g_offset;

g_w3_gadget1_width=g_font_width*header_p->dh_FieldSize;


g_w3_gadget1_height=g_field_height;

g_w1_width=g_w3_width;

g_w1_height=g_w3_height;

if(g_w1_height<W1_MINIMUM_HEIGHT) g_w1_height=W1_MINIMUM_HEIGHT;

g_w1_gadget1_x=g_offset;

g_w1_gadget1_y=g_offset;

g_w1_gadget1_width=g_w1_width-3*g_offset-IMAGE_SIZE;

g_w1_gadget1_height=g_w1_height-2*g_w1_gadget1_y;

g_w1_title_x=g_w1_gadget1_x+g_w1_gadget1_width;

g_w1_title_y=g_w1_gadget1_y;



g_asl_width=g_w1_width;

g_asl_height=g_w3_height;


g_w2_width=g_w3_width;
    
g_w2_height=g_w3_height;  

g_w2_gadget1_x=g_w3_label_space;  

g_w2_gadget1_y=g_offset;

g_w2_gadget1_width=g_w3_gadget1_width;  

g_w2_gadget1_height=g_field_height;  

g_w2_gadget2_x=g_offset;  

g_w2_gadget2_y=g_w2_height-2*g_offset;

g_w2_gadget2_width=(g_w2_width-5*g_offset)/2;  

g_w2_gadget2_height=g_field_height;  

SetBlankString(&g_database_header);

}

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

void SetBlankString(struct DatabaseHeader *header_p)

{
    
UBYTE i;

for (i=0;i<header_p->dh_FieldSize;i++) 

     g_blank_string[i]=' ';

g_blank_string[i]=NULL;

}

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

void SetGadgetLabels(struct List *list_p,UBYTE count)

{

UBYTE i,j;

struct ListNode *node_p;
                            
if(!IsListEmpty(list_p))
        
     {
         
      node_p=(struct ListNode *)(list_p->lh_Head);

 
      for(i=0;i<count;i++)
                 
          {
                     
             for(j=0;j<LABEL_SIZE;j++)
                        
                {

                 g_w3_gadget_labels[i][j]=node_p->ln_Field[i][j];
                           
                }
               
           }
        
      }  

}

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


void CalculateNewRecordLayout(void)

{

g_database_header.dh_FieldSize=
g_maximum_field_size*(g_w2_width-g_w3_label_space)
/(g_public_screen_p->Width-g_w3_label_space);        

g_database_header.dh_FieldCount=
            (g_w2_height-2*g_offset)/(g_field_height+FIELD_GAP)-2;

if(g_database_header.dh_FieldCount>=MAX_FIELD_COUNT)
        
    g_database_header.dh_FieldCount=MAX_FIELD_COUNT-1;
   
       else
        
          {

           if(g_database_header.dh_FieldCount<MIN_FIELD_COUNT)
       
           g_database_header.dh_FieldCount=MIN_FIELD_COUNT;          
              
          }

}

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

void SetDefaultFieldLabels(void)

{
 
UBYTE i;

    
    for (i=0;i<MAX_FIELD_COUNT;i++)
 
    sprintf(&g_w3_gadget_labels[i][0],"Field Title %2.d",i+1);

} 

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

