#include "Control_Include.h"
#include "Cray_Protos.c"

CxObj *broker;

struct MsgPort *Commodity_MP;
struct MsgPort *APPIcon_MP;

BOOL Iconified = FALSE;

struct DiskObject   *dobj=NULL;
struct AppIcon      *appicon=NULL;
struct AppMessage   *appmsg=NULL;


struct NewBroker newbroker = 
{
   NB_VERSION,
   "Cray's Control",
   "Cray's Control By Cray-1",
   "Commodity To Catch Rouge Tasks.",
   NBU_NOTIFY,
   0, 0, 0, 0
};

extern int Start_GUI( void );
extern void Input_Handler( void );

main( void )
{
    //SetupScreen();
    NewList(&Main_List);
     Start_GUI();
     Input_Handler(); 
    //Start_Commodity();
    //OpenControlWindow();
    //Main_Window_IDCMP();
    //Kill_Commodity();
    //if(Iconified) Kill_AppIcon();
    //else  CloseControlWindow();
    //CloseDownScreen();
    Free_Memory();
   
}


void Main_Window_IDCMP( void )
{
 struct IntuiMessage *imsg;  
 struct Message      *msg;           
  ULONG signals;
 
 BOOL   terminated = FALSE;
 char   Error[]="System Standing By.....";        
 
 while(!terminated)
   {   
    
    signals = Wait(1L <<ControlWnd->UserPort->mp_SigBit|1L << Commodity_MP->mp_SigBit|1L << APPIcon_MP->mp_SigBit);
    if(signals & (1L <<ControlWnd->UserPort->mp_SigBit))
       {
        terminated = Handle_Window_Message(ControlWnd);
       }
       else
    if(signals & (1L << Commodity_MP->mp_SigBit))
      {
        terminated = Handle_Commodity_Message();
        /* This Is Where The Commodity Stuff Comes In */
      }
      else
    if(signals & (1L <<APPIcon_MP->mp_SigBit))
      {
        Handle_APPIcon_Message();
      }
      
             
   }
   
}
    

BOOL Handle_Window_Message( struct Window *CurrentWnd)
{
    
    BOOL   Vector_Display=FALSE;
    BOOL   Task_Display=FALSE;
    struct Gadget       *gad;
    
    char   Error[]="System Standing By.....";
    
    struct IntuiMessage *message;
    ULONG  code;
    SHORT  mousex, mousey;
    ULONG  class;
    UWORD  gad_class;
    
    while (NULL != (message = GT_GetIMsg(CurrentWnd->UserPort)))
         {
            class     = message->Class;
            code      = message->Code;
            mousex    = message->MouseX;
            mousey    = message->MouseY;
            gad       = (struct Gadget *)message->IAddress;
            gad_class = gad->GadgetID;
            
            GT_ReplyIMsg(message);
            
         switch(class)
                 {
                   case IDCMP_GADGETUP:
                         switch(gad_class)
                               {                  
                                 case GD_SLIDER:
                                       Handle_Vector_Input(code);
                                       break;
                   
                                 case GD_BUTTON_1:
                                       Clear_List_View();
                                       Vector_Display=FALSE;
                                       Task_Display=TRUE;
                                       Tasks_Display();
                                       GT_SetGadgetAttrs(ControlGadgets[GD_SLIDER],ControlWnd,NULL,
                                                            GTLV_Labels, &Main_List,TAG_END);
                                       break;
                                    
                                 case GD_BUTTON_2:
                                       Clear_List_View();
                                       Vector_Display=TRUE;
                                       Task_Display=FALSE;
                                       Vectors_Display();
                                       Init_Vector_Buttons();
                                       GT_SetGadgetAttrs(ControlGadgets[GD_SLIDER],ControlWnd,NULL,
                                                            GTLV_Labels, &Main_List,TAG_END);
                                       break;
                   
                                 case GD_BUTTON_3:
                                       Clear_List_View();
                                       Vector_Display=FALSE;
                                       Task_Display=FALSE;
                                       Information();
                                       GT_SetGadgetAttrs(ControlGadgets[GD_SLIDER],ControlWnd,NULL,
                                                            GTLV_Labels, &Main_List,TAG_END);
                                       break;
                   
                                 case GD_BUTTON_4:
                                       //Start_AppIcon();
                                       //CloseControlWindow();
                                       
                                       //ActivateCxObj(broker, FALSE);
                                       // demo();                                        
                                       //Problem("This Function Does Not Work Right Now",0);
                                       break;
         	               }    
                         break;
                       
                   case IDCMP_REFRESHWINDOW:
                         GT_BeginRefresh(ControlWnd);
                         GT_EndRefresh(ControlWnd,TRUE);
                        break;
                         
                   case IDCMP_CLOSEWINDOW:
                         return(TRUE);
                        break;
                        
                }
               
     
    }
return(FALSE);
}  

 
BOOL Handle_Commodity_Message( void )
{
    CxMsg *msg;
    
    ULONG sigrcvd, msgid, msgtype;
    
   
    
       while(msg = (CxMsg *)GetMsg(Commodity_MP))
        {
            /* Extract necessary information from the CxMessage and return it */
            msgid = CxMsgID(msg);
            msgtype = CxMsgType(msg);
            ReplyMsg((struct Message *)msg);
            
            switch(msgtype)
            {
                case CXM_IEVENT:
                     /* Shouldtn't Get Any Of These in This Example */
                    
                     break;
                     
                   
             
                case CXM_COMMAND:
                     /* Commodities has sent a command */
                  
                     switch(msgid)
                           {
                            case CXCMD_DISABLE:
                               
                                  /* The Use Clicked Commodities Exchange Disable
                                   * Gadget better disable
                                   */
                                   //Problem("Main Program Disabled From Commodity",0);
                                  Start_AppIcon();
                                  CloseControlWindow();
                                  
                                  ActivateCxObj(broker, FALSE);
                                 break;
                       
                            case CXCMD_ENABLE:
                                  /* User Clicked The Enable Gadget */
                                //Problem("Main Program Enabled From Commodity",0);
                                 ActivateCxObj(broker, TRUE);
                                 OpenControlWindow();
                                Kill_AppIcon();
                                
                                 break;
                       
                            case CXCMD_KILL:
                                 
                                 return(TRUE);
                                 break;
                      
                            case CXCMD_UNIQUE:
                                 Problem("Another Commodity The Same As Me Has Started",0);
                                
                                  break;
                    default:
                 
                    break;
                }
                break;
                default:
               
                break;
            }
        }
        return(FALSE);
            
}
void Problem(char *Error_String,int Error_Type)
{
    FILE *Bug_Report;
    struct EasyStruct *Error_Struct;
    Error_Struct = AllocRemember(&General_Memory,sizeof(struct EasyStruct),MEMF_CLEAR);
    Error_Struct->es_StructSize=sizeof(struct EasyStruct);
    Error_Struct->es_Flags=0;
    Error_Struct->es_Title="Control Problem....";
    Error_Struct->es_TextFormat=Error_String;
    Error_Struct->es_GadgetFormat="OK";
    EasyRequest( 0 , Error_Struct, 0 ,0 );
    Bug_Report = fopen("S:Control_Bugs","a+");
    fprintf(Bug_Report,"%s%c",Error_String,0x0A);
    fclose(Bug_Report);
    
}

void Handle_APPIcon_Message( void )
{
    struct AppMessage   *app_msg=NULL;
 
    if(app_msg=(struct AppMessage *)GetMsg(APPIcon_MP))
        {       
           OpenControlWindow();
       
           ReplyMsg((struct Message *)app_msg);
         
           Kill_AppIcon();
           ActivateCxObj(broker, TRUE); 
    }
}      
    
    
    

void Start_AppIcon( void)
{
     
    LONG dropcount=0L;
    ULONG x;
    BOOL success=0L;
    
    dobj=GetDiskObject("App_Icon");
    if(dobj!=0)
       {
        dobj->do_Type=NULL;
        APPIcon_MP=CreateMsgPort();
        appicon=AddAppIconA(0L,0L,"Sleeping Control",APPIcon_MP,NULL,dobj,NULL);
        
       }
   Iconified=TRUE;
}
    
void Kill_AppIcon( void  )
{
    Iconified=FALSE;
   RemoveAppIcon(appicon);        
   while(appmsg=(struct AppMessage *)GetMsg(APPIcon_MP))
   ReplyMsg((struct Message *)appmsg);  
   DeleteMsgPort(APPIcon_MP);    
   FreeDiskObject(dobj);
    
}    

void Start_Commodity(void )
{          
    CxMsg *msg;
    
    if(Commodity_MP = CreateMsgPort())
       {
        newbroker.nb_Port = Commodity_MP;  
         if(broker = CxBroker(&newbroker,NULL))
            {
              ActivateCxObj(broker, TRUE);    
             }
       }
    
}  

void Kill_Commodity( void )
{
  CxMsg *Cmsg;
  DeleteCxObj(broker);                               /* Kill Commodity */
  while(Cmsg = (CxMsg *)GetMsg(Commodity_MP))
  ReplyMsg((struct Message *)Cmsg);
  DeletePort(Commodity_MP);
}  

void Init_Vector_Buttons( void )
{
	int gadpos;
        gadpos = RemoveGadget(ControlWnd,ControlGadgets[GD_UNIVERSAL_1]);
        ControlGadgets[GD_UNIVERSAL_1]->GadgetText->IText="Fishy";
        AddGadget(ControlWnd,ControlGadgets[GD_UNIVERSAL_1],gadpos);
        RefreshGList(ControlGadgets[GD_UNIVERSAL_1],ControlWnd,NULL,1);
    }
