#include <Global/Main_Global.h>

Object *	ASM SAVEDS ProjConstructor( 	REG(a1) Object *, REG(a2) APTR   );
void		ASM SAVEDS ProjDestructor( 	REG(a1) Object *, REG(a2) APTR   );
LONG		ASM SAVEDS ProjDisplay(		REG(a1) Object *, REG(a2) char **);
                    SAVEDS ListDouble( 			Object *);


SAVEDS ASM ULONG Project_Dispatcher(REG(a0) struct IClass *cl,REG(a2) Object *obj,REG(a1) Msg msg)
{
        switch (msg->MethodID)
        {
        	case OM_NEW	     : return(prj_New	(cl,obj,(APTR) msg));
        	case OM_DISPOSE      : return(prj_Dispose  (cl,obj,(APTR) msg));
                case OM_SET          : return(prj_Set      (cl,obj,(APTR) msg));
                case OM_GET          : return(prj_Get      (cl,obj,(APTR) msg)); 
               
        }

        return(DoSuperMethodA(cl,obj,msg));
}

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

SAVEDS ULONG prj_New(struct IClass *cl,Object *obj,struct opSet *msg)
{
 
  static const struct Hook DoubledHook  = { { NULL,NULL },(VOID *)ListDouble,NULL,NULL };
  static const struct Hook ProjCONHook	= { { NULL,NULL },(VOID *)ProjConstructor,NULL,NULL };
  static const struct Hook ProjDESHook	= { { NULL,NULL },(VOID *)ProjDestructor,NULL,NULL };
  static const struct Hook ProjPOPHook	= { { NULL,NULL },(VOID *)ProjDisplay,NULL,NULL };
  struct ProjectInstance *Data;
          
 if(obj = (Object *)DoSuperNew(cl,obj,MUIA_Window_CloseGadget,TRUE,
                       		      MUIA_Window_Open       ,FALSE,
                       		      MUIA_Window_TopEdge    ,400,
                       		      MUIA_Window_LeftEdge   ,2,
                       		      MUIA_Window_Width	     ,MUIV_Window_Width_Screen(100),
                       		      MUIA_Window_Height     ,MUIV_Window_Height_Screen(20),
                       		      MUIA_Window_RootObject ,
                       		          VGroup,
                       		              Child,ListviewObject,
                       		                   MUIA_Listview_List, App->Lister = ListObject,
                       		                   MUIA_List_Format,",,,",
                       		                   MUIA_List_ConstructHook, &ProjCONHook,
                       		                   MUIA_List_DestructHook,  &ProjDESHook,
                       		                   MUIA_List_DisplayHook,   &ProjPOPHook,
                       		                   MUIA_Frame,MUIV_Frame_InputList, 
                       		                End,
                       		          End,                        		            
                       		     End,                      		                                                	                                   
	      TAG_MORE,msg->ops_AttrList))
	      {
	    Data = INST_DATA(cl,obj); 
	    Enable(Project_Add,TRUE);
	     
	    DoMethod(obj,MUIM_Notify,MUIA_Window_CloseRequest, TRUE,
                                obj,3,MUIM_Set,MUIA_Window_Open,FALSE);
                          
            DoMethod(App->Lister,MUIM_Notify,MUIA_Listview_DoubleClick,TRUE,
                         MUIV_Notify_Application,2,MUIM_CallHook,&DoubledHook);                                                     	   
	    
	         return((ULONG)obj);
	      }
  return(0);
  
}	

SAVEDS ULONG prj_Dispose(struct IClass *cl,Object *obj,Msg msg)
{
  LONG Numbers;
 
  char *FileName;
  struct ProjectInstance *Data = INST_DATA(cl,obj);
  
  get(App->Lister,MUIA_List_Entries,&Numbers);
  
  if(Numbers>0)
  {
    FileName = Allocate_Memory(strlen(Data->Project_File)+5);
    strcpy(FileName,Data->Project_File);
    strcat(FileName,".prj"); 
    FileName[strlen(FileName)+1]=NULL;
    Save_Project(FileName);  
    Free_Memory(FileName);
  }
            
 return(DoSuperMethodA(cl,obj,msg));

}


SAVEDS ULONG prj_Get( struct IClass *cl, Object *obj, struct opGet *msg )
{
        /* Get variable values */

        struct ProjectInstance *Data = INST_DATA( cl, obj );
        ULONG *Storage = msg->opg_Storage;

        switch( msg->opg_AttrID ) 
        {               
           case	MUIA_Project_File:	*Storage = Data->Project_File;		return(TRUE);
           case MUIA_Project_FileName:  *Storage = Data->Project_FileName;	return(TRUE);
           case	MUIA_Project_FilePath:	*Storage = Data->Project_FilePath;	return(TRUE);           
           case MUIA_Project_Title:	*Storage = Data->Project_Title;		return(TRUE);
              
        }

        return(DoSuperMethodA( cl, obj, msg ));
}        
SAVEDS ULONG prj_Set( struct IClass *cl, Object *obj, struct opSet *msg )
{
        struct ProjectInstance *Data = INST_DATA( cl, obj );       
        struct TagItem  *Current_Tag;
        struct TagItem  *Single_Tag;
        
        Single_Tag = msg->ops_AttrList;
        
        while( Current_Tag = NextTagItem( &Single_Tag ) )
        {
                switch( Current_Tag->ti_Tag )
                {  
                
                case MUIA_Project_File:
                       
                       Data->Project_File = Allocate_Memory(strlen(Current_Tag->ti_Data)-2);  		       
                       strncpy(Data->Project_File,Current_Tag->ti_Data,strlen(Current_Tag->ti_Data)-4);                      
                       Data->Project_File[strlen(Data->Project_File)+1]=NULL;
                       
                       Data->Project_FileName = Allocate_Memory(strlen(FilePart(Data->Project_File))+1);                                                                             
                       strcpy(Data->Project_FileName,FilePart(Data->Project_File));
                       Data->Project_FileName[strlen(Data->Project_FileName)+1]=NULL;
                       
                       Data->Project_FilePath = Allocate_Memory(strlen(Data->Project_File)-strlen(FilePart(Data->Project_File))+1);                                        
                       strncpy(Data->Project_FilePath,Data->Project_File,strlen(Data->Project_File)-strlen(FilePart(Data->Project_File) ));                                                                
                       Data->Project_FilePath[strlen(Data->Project_FilePath)+1]=NULL;
                       
                       Data->Project_Title = Allocate_Memory(strlen(Data->Project_FileName)+strlen("Project :")+1);
                       strcpy(Data->Project_Title,"Project: ");
                       strcat(Data->Project_Title,Data->Project_FileName);
                       Data->Project_Title[strlen(Data->Project_Title)+1]=NULL;                       
                      
                       set(obj,MUIA_Window_Title,Data->Project_Title);
                    break;
                       
                                                      
                }
        }

        return(DoSuperMethodA( cl, obj, msg ));
}
                        
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-ListHooks*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/


Object * ASM SAVEDS ProjConstructor( REG(a1) Object *Current ,REG(a2) APTR MemoryPool)
{
 return(Current);
}

void ASM SAVEDS ProjDestructor(  REG(a1) Object *Current , REG(a2) APTR MemoryPool)
{
 
}

LONG ASM SAVEDS ProjDisplay( REG(a1) Object *Current, REG(a2) char **array)
{ 
 //*array++   = Get(Current,MUIA_Source_Size);		Implement Me!
 //*array++   = Get(Current,MUIA_Source_DataSize);	Implement Me!
 //*array++   = Get(Current,MUIA_Source_CodeSize);	Implement Me!
 
 *array   = Get(Current,MUIA_Source_FileName);
 
 return(0);
}

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

SAVEDS ListDouble( Object *bob)
{
 Object *Active;
 DoMethod(App->Lister,MUIM_List_GetEntry,MUIV_List_GetEntry_Active,&Active);
 set(Active,MUIA_Window_Open,TRUE);
}


BOOL Save_Project( char *FileName )
{

 struct IFFHandle	*ProjectHandle;
 Object	*Current;
 char	*DirName;
   
 
 LONG	Numbers; 
 
             ProjectHandle = AllocIFF();
 
           if(ProjectHandle->iff_Stream = (ULONG) Open(FileName,MODE_NEWFILE))                       
             {              
              InitIFFasDOS(ProjectHandle);
              OpenIFF(ProjectHandle,IFFF_WRITE);              
              get(App->Lister,MUIA_List_Entries,&Numbers);
              if(Numbers<=0)
                 printf("Development Error: 2\a ** UNFINSHED WORK **\n");
              else
               {                   
                 PushChunk(ProjectHandle,MAKE_ID('C','R','A','Y'),ID_FORM,IFFSIZE_UNKNOWN);
                 PushChunk(ProjectHandle,MAKE_ID('C','R','A','Y'),MAKE_ID('I','N','F','O'),sizeof(LONG));
                 WriteChunkBytes(ProjectHandle,&Numbers,sizeof(LONG));
                 PopChunk(ProjectHandle);                 
                 while(Numbers!=0)
                      {
                       Numbers--;
                       DoMethod(App->Lister,MUIM_List_GetEntry,Numbers,&Current);  
                       get(Current,MUIA_Source_File,&DirName);
                       PushChunk(ProjectHandle,MAKE_ID('C','R','A','Y'),MAKE_ID('S','R','C','S'),IFFSIZE_UNKNOWN);                       
                       WriteChunkBytes(ProjectHandle,DirName,strlen(DirName));
                       PopChunk(ProjectHandle);                      
                      }     
               }
              CloseIFF(ProjectHandle);              
              Close(ProjectHandle->iff_Stream);                                                      
            }
          FreeIFF(ProjectHandle);
          
      
}


void Load_Project( char *FileName )
{
 struct	IFFHandle	*ProjectHandle;
 struct ContextNode     *CurrentNode;
 LONG chris;
 
 Object *NewSource;
 char	*NewFileName;
 char   *NewProjName;
 
 if(ProjectHandle           = AllocIFF())
  {
   if(ProjectHandle->iff_Stream = (ULONG) Open(FileName,MODE_OLDFILE))
      {
        InitIFFasDOS(ProjectHandle);
        if(!OpenIFF(ProjectHandle,IFFF_READ))
           {
            StopChunk(ProjectHandle,MAKE_ID('C','R','A','Y'),MAKE_ID('S','R','C','S'));
            while(ParseIFF(ProjectHandle,IFFPARSE_SCAN)==0)
              {
                 CurrentNode = CurrentChunk(ProjectHandle);
                 NewFileName = Allocate_Memory(CurrentNode->cn_Size+1);
                 ReadChunkBytes(ProjectHandle,NewFileName,CurrentNode->cn_Size);
                 NewFileName[strlen(NewFileName)+1]=NULL;
                 if(!(NewSource = NewObject(App->Source_Class->mcc_Class,NULL,TAG_DONE)))
                    MUI_Request(NULL,NULL,NULL, "Warning...","_Continue","Failed To Create Source Class!");
                 set(NewSource,MUIA_Source_File,NewFileName);
                 DoMethod(App->Lister,MUIM_List_InsertSingle,NewSource,MUIV_List_Insert_Top);
                 Free_Memory(NewFileName);
              }                                
            NewProjName = Allocate_Memory(strlen(FileName));
            strncpy(NewProjName,FileName,strlen(FileName)-4);                  
            set(App->ProjWindow,MUIA_Project_File,NewProjName);
     
            Free_Memory(NewProjName);      
            CloseIFF(ProjectHandle);
          }
          else
           printf("Unable oepn IFF\n");
        Close(ProjectHandle->iff_Stream);
     }   
     else
      printf("Unable to Open File\n");
   FreeIFF(ProjectHandle);
  }  
  else
   printf("Unable to Allocate IFF Struct\n");
}











