#include <Global/Main_Global.h>

struct  Library         *MUIMasterBase;                 
struct  InstanceData    *App;


int main(int argc,char *argv[])
{
             
         ULONG                  signals;                                  
                 
        printf("New Console Window\n");
        if(Start_Application())
          {               
            set(App->MainWindow->Editor_Window,MUIA_Window_Open,TRUE);  
            printf("Application Started Everything Is OK\n");      
                               
            while(DoMethod(App->Application,MUIM_Application_NewInput,&signals) != MUIV_Application_ReturnID_Quit)
                  {                  
                   if(signals)
                      {
                       signals = Wait(signals | SIGBREAKF_CTRL_C);
                       if (signals & SIGBREAKF_CTRL_C) break;
                      }
                  }                   
           
            set(App->MainWindow->Editor_Window,MUIA_Window_Open,FALSE);                            
            Stop_Application();                                   
          }
       return;
} 
        
                                                                         
                                                                         
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- Subroutines -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/

BOOL    Start_Application( void )
{                
                       
        if(!(MUIMasterBase = OpenLibrary( MUIMASTER_NAME, MUIMASTER_VMIN )))
          {
           printf( "Couldn't Open %s, Version : %d!\n",MUIMASTER_NAME,MUIMASTER_VMIN );
           return( FALSE );
          }                    
        
        if(!(App = AllocMem(sizeof(struct InstanceData),MEMF_PUBLIC|MEMF_CLEAR) ))
          {
           MUI_Request(NULL,NULL,NULL, "Warning...","_Continue","Failed To Allocate Instance Memory!");
           return(FALSE);
          }                                           
        
        if(!Startup_MemoryManager())
          {
           MUI_Request(NULL,NULL,NULL, "Warning...","_Continue","Failed To Start Internal Memory Manager!");
           return(FALSE);
          }                       
             
        if(!Startup_GUIManager())
          {
           MUI_Request(NULL,NULL,NULL, "Warning...","_Continue","Failed To Start Internal GUI Manager!");
           return(FALSE);
          }              
       
   return( TRUE );
}  



void    Stop_Application( void )
{

  if(App->Application)
      Shutdown_GUIManager();
   
  if(App->MemoryPool)
      Shutdown_MemoryManager(); 
 
  if(App)
      FreeMem(App,sizeof(struct InstanceData));
     
  if(MUIMasterBase)
      CloseLibrary(MUIMasterBase);

}
                                                                         
                                                                         
                                                                         
BOOL    Startup_GUIManager( void  )
{

   if(!(App->Project_Class = MUI_CreateCustomClass(NULL,MUIC_Window,NULL,sizeof(struct ProjectInstance),Project_Dispatcher)))
     {
          MUI_Request(NULL,NULL,NULL, "Warning...","_Continue","Failed To Create Project_Class Dispatcher!");
          KPrintF("Failed To Create Project Class Dispatcher\n");
          return(FALSE);
     }

   if(!(App->Source_Class = MUI_CreateCustomClass(NULL,MUIC_Window, NULL, sizeof(struct SourceInstance),Source_Dispatcher)))
     {
          MUI_Request(NULL,NULL,NULL, "Warning...","_Continue","Failed To Create Source_Class Dispatcher!");
          KPrintF("Failed To Create Source Class Dispatcher\n");
          return(FALSE);
     } 
  
   if(!(App->SourcePanel_Class = MUI_CreateCustomClass(NULL,MUIC_Area,NULL,0,SourcePanel_Dispatcher)))
    {
          MUI_Request(NULL,NULL,NULL, "Warning...","_Continue","Failed To Create SourcePanel_Class Dispatcher!");
          KPrintF("Failed To Create Source Class Dispatcher\n");
          return(FALSE);
     }
  if(!(App->Menustrip = Create_Menus()))
     {
          MUI_Request(NULL,NULL,NULL, "Warning...","_Continue","Failed To Create Main Window!");         
          return(FALSE);
     }
  
  if(!(App->MainWindow = CreateEditor_Window()))  
     {
          MUI_Request(NULL,NULL,NULL, "Warning...","_Continue","Failed To Create Main Window!");         
          return(FALSE);
     }
      
  if(!(App->Application = ApplicationObject,
                        MUIA_Application_Author,        "Cray-1",
                        MUIA_Application_Base,          "SAS_TURBOEDITOR",
                        MUIA_Application_Title,         "SAS Turbo Editor",
                        MUIA_Application_Menustrip,     App->Menustrip,
                        MUIA_Application_Version,       "$VER:  SAS Turbo Editor "EDITVER" ("EDITDATE").",
                        MUIA_Application_Copyright,     "Big Time Digital Design.",
                        MUIA_Application_Description,   "A Replacment For The SAS/C Editor.",
                        SubWindow,                      App->MainWindow->Editor_Window, 
			SubWindow,			App->ProjWindow = NewObject(App->Project_Class->mcc_Class,NULL,TAG_DONE),
                        End))
     {
         
         MUI_Request(NULL,NULL,NULL, "Warning...","_Continue","Failed To Create Application Object!");
         return(FALSE);
     }
        
    if(!App->ProjWindow)
      {
      printf("Projwindow Window Object Failed To Create\n");
      return(FALSE);
      }
      
    
 return(TRUE);
 
}

void    Shutdown_GUIManager( void )
{
  
  
  if(App->ProjWindow) 
         {       
          set(App->ProjWindow,MUIA_Window_Open,FALSE);
          DoMethod(App->Application,OM_REMMEMBER,App->ProjWindow);  
          DisposeObject(App->ProjWindow);         
         } 
 if(App->MainWindow)     
         {     
         set(App->MainWindow->Editor_Window,MUIA_Window_Open,FALSE);
         DoMethod(App->Application,OM_REMMEMBER,App->MainWindow->Editor_Window);    
         DisposeEditor_Window(App->MainWindow);          
         }
     
  if(App->Application)        
     MUI_DisposeObject(App->Application);    
             
 if(App->Project_Class)       
     MUI_DeleteCustomClass(App->Project_Class);       
       
 if(App->Source_Class)        
     MUI_DeleteCustomClass(App->Source_Class);         
 if(App->SourcePanel_Class)
     MUI_DeleteCustomClass(App->SourcePanel_Class);
 
}



/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- Support -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/

ULONG Get( Object *obj, ULONG attr)
{
  ULONG retval;
  if(!GetAttr(attr,obj,&retval))
         return( NULL );
      return( retval);
}

ULONG __stdargs DoSuperNew(struct IClass *cl,Object *obj,ULONG tag1,...)
{
        return(DoSuperMethod(cl,obj,OM_NEW,&tag1,NULL));
}  


PrepFileName( char *Buffer ,struct FileRequester *Requester)
{
 strcpy(Buffer,Requester->fr_Drawer);
 if(Buffer[strlen(Buffer)-1]!=':')
    strcat(Buffer,"/");
 strcat(Buffer,Requester->fr_File);
 Buffer[strlen(Buffer)+1]=NULL;
}

