#include <Global/Main_Global.h>



struct  Library         *MUIMasterBase;			
struct  InstanceData    *App;


int main(int argc,char *argv[])
{
             
  	 ULONG			signals;                  
        struct WBStartup   	*StartupMsg;
         struct			ListLoadStruct *Envelope;
               
        if(Start_Application())
          {               
                set(App->MainWindow->Editor_Window,MUIA_Window_Open,TRUE);          
                if(Cli())
                {
                printf("CLI run\n");
                /*	RUN FROM A CLI		*/
                 /*if(argc>1)
                   DoMethod(App->SourceList,MUIM_List_InsertSingle,argv[1],MUIV_List_Insert_Top);
                 */
                }
                else
                {
                /*	RUN FROM WB		*/
                StartupMsg = (struct WBStartup *)&argv[0];
                if(StartupMsg->sm_NumArgs>1)
                   {
                     /* Envelope            = Allocate_Memory(sizeof(struct ListLoadStruct));
                     Envelope->FileName  = Allocate_Memory(1024);
                     stcgfe(Envelope->FileName,StartupMsg->sm_ArgList[1].wa_Name);                    
                     NameFromLock(StartupMsg->sm_ArgList[1].wa_Lock,Envelope->FileName,1024);                           
                       if(Envelope->FileName[strlen(Envelope->FileName)-1]!=':')
                          strcat(Envelope->FileName,"/");
                     strcat(Envelope->FileName,StartupMsg->sm_ArgList[1].wa_Name); 
                     Envelope->Load = TRUE;
                     if(!strcmp("PROJECT",strupr(StartupMsg->sm_ArgList[1].wa_Name)))
                     {
                         Load_Project(Envelope->FileName);
                     }
                         else
                     DoMethod(App->SourceList,MUIM_List_InsertSingle,Envelope,MUIV_List_Insert_Top);
                     
                     Free_Memory(Envelope->FileName); 
                     Free_Memory(Envelope);
                     */
                   }
                }    
                                                              
                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  )
{ 

/*---------- Custom Classes ---------------*/

   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!");
          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!");
          return(FALSE);
     }     
  
  
/*----------- Solo Object -----------------*/
  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);
     }
      
  
      
/*---------- Application Object -----------*/
               
  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,  				   				 				  
  		  	End))
     {
         
     	 MUI_Request(NULL,NULL,NULL, "Warning...","_Continue","Failed To Create Application Object!");
         return(FALSE);
     }
      
/*------------ Notifications --------------*/ 

 DoMethod(App->MainWindow->Editor_Window,MUIM_Notify,MUIA_Window_CloseRequest, TRUE,
          App->Application,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit);
          
 return(TRUE);
 
}

void	Shutdown_GUIManager( void )
{
 if(App->MainWindow)
    {
     set(App->MainWindow->Editor_Window,MUIA_Window_Open,FALSE);
     DoMethod(App->Application,OM_REMMEMBER,App->MainWindow->Editor_Window);
    // printf("DISPOSE Main Editor:........");
     DisposeEditor_Window(App->MainWindow);
   //  printf("OK\n");
    }
  
 if(App->Application)
    {
   //  printf("DISPOSE Application:.........");
     MUI_DisposeObject(App->Application);
    // printf("OK\n");
    }          
     
 if(App->Project_Class)
    {
   //  printf("DISPOSE ProjectClass:........");    
     MUI_DeleteCustomClass(App->Project_Class);
    // printf("OK\n");    
    }
       
 if(App->Source_Class)
    {
  //   printf("DISPOSE SourceClass:.........");    
     MUI_DeleteCustomClass(App->Source_Class);
//     printf("OK\n");
    }
}



/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- 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;
}

