/**************************************************************************/
/*                                                                        */
/*  Multitool II   -   DOS-Hilfsprogramm                Version 1.3r000   */
/*                                                                        */
/*  ©1992 Boris Jakubaschk                                                */
/*                                                                        */
/*  Modul 7 - Aktion: Zu Datei passendes Programm aufrufen                */
/*                                                                        */
/**************************************************************************/

#include "MToolDefs.h"
#define MENU_OFFSET 28

/* Aktion      : Führt zu jeder selektierten Datei eine passende Aktion aus
    Act          0=linkes, 1=rechtes Dateienfenster */

Aktion( Act )
    {
    int i;
    struct ExAllData *EAD;

    EAD = VL_Data[Act];

    if (TestSelect( Act ))
        {
        for (i=0; i<VL_NumEntry[Act]; i++)
            {
            if ( VL_Select[Act][i] & EAD->ed_Type<0 )
                {
                FileAkt( Act, EAD->ed_Name );
                VL_Select[Act][i]=0;
                if ( i>=VL_OldFI[Act] & i<VL_OldFI[Act]+LY_LNumLines )
                    {
                    ShowDirLine( Act, VL_OldFI[Act], i-VL_OldFI[Act] );
                    };
                };
            EAD = EAD->ed_Next;
            };
        };
    }


/* FileAktion  : Führt eine zur angegebenen Datei passende Aktion aus
    Name         Kompletter Dateiname mit Pfad
    Typ          Dateityp: 0=unbekannt, 1=IFF-ILBM, 9=unbek. IFF,
                           200=MTool-Prefs */

long FileAktion( char *Name, LONG Typ )
    {
    char Command[256];
    char *Key = "????ILBMSMUSASC MOD ANIMHXEDLHAxLHAaLHAdLHAlSCRwSCRhSCRmSCRtFNGnFNGsFNLnFNLsCMod????ADirWNDxWNDyWNDwWNDhDIR0DIR1MENU";
    LONG MenuOffset = MENU_OFFSET;
    struct FileHandle *FH;
    LONG Offset = 0l;
    LONG Help;
    short i, j;


    if (Typ==200)
        {
        if( FH=(struct FileHandle *)Open( Name, MODE_OLDFILE ) )
            {
            if (Ana_Prefs)
                {
                FreeMem( Ana_Prefs, Ana_Len );
                for (i=0; i<40; i++) Ana_Command[i]=NULL;
                };
            Seek( (BPTR)FH, 0, OFFSET_END );
            Ana_Len = Seek( (BPTR)FH, 0, OFFSET_BEGINNING );

            if ( Ana_Prefs = AllocMem( Ana_Len, MEMF_ANY ) )
                {
                Read( (BPTR)FH, Ana_Prefs, Ana_Len );
                while( Offset+4<Ana_Len )
                    {
                    for( i=0; strncmp( &Ana_Prefs[Offset], &Key[i], 4 )!=0 & i<116; i=i+4 );
                    if (i<112) Ana_Command[i>>2]=&Ana_Prefs[Offset+5];
                    if (i==112 & MenuOffset<42)
                       {
                       Ana_Command[MenuOffset++]=&Ana_Prefs[Offset+5];
                       j=0;
                       while( Ana_Prefs[Offset+5+j]!='#' ) j++;
                       Ana_Prefs[Offset+5+j]='\0';
                       j++;
                       while( Ana_Prefs[Offset+5+j]!='#' ) j++;
                       Ana_Prefs[Offset+5+j]='\0';
                       NewMenu[MenuOffset+15-MENU_OFFSET].nm_Label = &Ana_Prefs[Offset+6+j];
                       NewMenu[MenuOffset+15-MENU_OFFSET].nm_Type = NM_ITEM;
                       };
                    for( Offset=Offset+5 ; Offset<Ana_Len & Ana_Prefs[Offset]!='\n'; Offset++ );
                    if (Ana_Prefs[Offset]=='\n') Ana_Prefs[Offset]='\0';
                    Offset++;
                    };
                NewMenu[MenuOffset+16-MENU_OFFSET].nm_Type = NM_END;
                };
            Close( (BPTR)FH );
            CM = 0x0623;
            AutoDir = 1;
            if (Ana_Command[11])
                {
                ScreenTags[2].ti_Tag  = SA_Width;
                sscanf(Ana_Command[11],"%li",&ScreenTags[2].ti_Data);
                CustomScreen = 1;
                };
            if (Ana_Command[12])
                {
                ScreenTags[3].ti_Tag  = SA_Height;
                sscanf(Ana_Command[12],"%li",&ScreenTags[3].ti_Data);
                CustomScreen = 1;
                };
            if (Ana_Command[13])
                {
                sscanf(Ana_Command[13],"%li",&ScreenTags[8].ti_Data);
                CustomScreen = 1;
                };
            if (Ana_Command[14])
                {
                CustomScreen = (strcmp(Ana_Command[14],"CUSTOM")==0);
                };
            if (Ana_Command[15])
                {
                strcpy( GadgetFontName, Ana_Command[15] );
                };
            if (Ana_Command[16])
                {
                sscanf(Ana_Command[16],"%hi",&LY_GFontH );
                GadgetFont.ta_YSize = LY_GFontH;
                };
            if (Ana_Command[17])
                {
                strcpy( ListFontName, Ana_Command[17] );
                };
            if (Ana_Command[18])
                {
                sscanf(Ana_Command[18],"%hi",&LY_LFontH );
                ListFont.ta_YSize = LY_LFontH;
                };
            if (Ana_Command[19])
                {
                sscanf(Ana_Command[19],"%hi",&CM);
                if (CM & 0x0010) NewMenu[12].nm_Flags = CHECKIT|MENUTOGGLE|CHECKED;
                };
            if (Ana_Command[20])
                {
                };
            if (Ana_Command[21])
                {
                if (Ana_Command[21][0]=='N')
                    {
                    AutoDir = 0;
                    NewMenu[13].nm_Flags = CHECKIT|MENUTOGGLE;
                    };
                };
            if (Ana_Command[22])
                {
                sscanf(Ana_Command[22],"%i",&WB_Win_x);
                };
            if (Ana_Command[23])
                {
                sscanf(Ana_Command[23],"%i",&WB_Win_y);
                };
            if (Ana_Command[24])
                {
                sscanf(Ana_Command[24],"%i",&WB_Win_w);
                };
            if (Ana_Command[25])
                {
                sscanf(Ana_Command[25],"%i",&WB_Win_h);
                };
            if (Ana_Command[26])
                {
                strcpy( VL_Name1, Ana_Command[26] );
                };
            if (Ana_Command[27])
                {
                strcpy( VL_Name2, Ana_Command[27] );
                };
            NewMenu[10].nm_Flags = CHECKIT|MENUTOGGLE|((CustomScreen) ? CHECKED : 0);
            };
        }
    else if (Typ==201)
        {
        if( FH=(struct FileHandle *)Open( Name, MODE_NEWFILE ) )
            {
            for (i=0; i<38; i++)
                {
                switch (i)
                  {
                  case 11: if ( ScreenTags[2].ti_Tag == SA_Width )
                               {
                               sprintf( Command, "SCRw %d\n", ScreenTags[2].ti_Data );
                               FPuts( (BPTR)FH, Command );
                               };
                           break;
                  case 12: if ( ScreenTags[3].ti_Tag == SA_Height )
                               {
                               sprintf( Command, "SCRh %d\n", ScreenTags[3].ti_Data );
                               FPuts( (BPTR)FH, Command );
                               };
                           break;
                  case 13: sprintf( Command, "SCRm 0x%x\n", ScreenTags[8].ti_Data );
                           FPuts( (BPTR)FH, Command );
                           break;
                  case 14: if ( CustomScreen )
                               {
                               FPuts( (BPTR)FH, "SCRt CUSTOM\n" );
                               }
                           else FPuts( (BPTR)FH, "SCRt WORKBENCH\n" );
                           break;
                  case 15: sprintf( Command, "FNGn %s\n", GadgetFontName );
                           FPuts( (BPTR)FH, Command );
                           break;
                  case 16: sprintf( Command, "FNGs %d\n", LY_GFontH );
                           FPuts( (BPTR)FH, Command );
                           break;
                  case 17: sprintf( Command, "FNLn %s\n", ListFontName );
                           FPuts( (BPTR)FH, Command );
                           break;
                  case 18: sprintf( Command, "FNLs %d\n", LY_LFontH );
                           FPuts( (BPTR)FH, Command );
                           break;
                  case 19: sprintf( Command, "CMod 0x%x\n", CM );
                           FPuts( (BPTR)FH, Command );
                           break;
                  case 20: 
                           break;
                  case 21: sprintf( Command, "ADir %c\n", (AutoDir)?'J':'N' );
                           FPuts( (BPTR)FH, Command );
                           break;
                  case 22: if ((WB_Win_w>=600) && (WB_Win_h>=200))
                              {
                              sprintf( Command, "WNDx %d\n", WB_Win_x );
                              FPuts( (BPTR)FH, Command );
                              };
                           break;
                  case 23: if ((WB_Win_w>=600) && (WB_Win_h>=200))
                              {
                              sprintf( Command, "WNDy %d\n", WB_Win_y );
                              FPuts( (BPTR)FH, Command );
                              };
                           break;
                  case 24: if ((WB_Win_w>=600) && (WB_Win_h>=200))
                              {
                              sprintf( Command, "WNDw %d\n", WB_Win_w );
                              FPuts( (BPTR)FH, Command );
                              };
                           break;
                  case 25: if ((WB_Win_w>=600) && (WB_Win_h>=200))
                              {
                              sprintf( Command, "WNDh %d\n", WB_Win_h );
                              FPuts( (BPTR)FH, Command );
                              };
                           break;
                  case 26: sprintf( Command, "DIR0 %s\n", VL_Name[0] );
                           FPuts( (BPTR)FH, Command );
                           break;
                  case 27: sprintf( Command, "DIR1 %s\n", VL_Name[1] );
                           FPuts( (BPTR)FH, Command );
                           break;
                  default:
                           if (i>=MENU_OFFSET)
                               {
                               if (Ana_Command[i])
                                   {
                                   strncpy( &Command[0], "MENU", 4 );
                                   Command[4] = ' ';
                                   sprintf( &Command[5], "%s#%s#%s\n", Ana_Command[i],
                                      Ana_Command[i]+strlen(Ana_Command[i])+1,
                                      Ana_Command[i]+strlen(Ana_Command[i])+1+strlen(Ana_Command[i]+strlen(Ana_Command[i])+1)+1);
                                   FPuts( (BPTR)FH, Command );
                                   };
                               }
                           else
                               {
                               if (Ana_Command[i])
                                   {
                                   strncpy( &Command[0], &Key[i*4], 4 );
                                   Command[4] = ' ';
                                   strcpy( &Command[5], Ana_Command[i] );
                                   FPuts( (BPTR)FH, Command );
                                   FPutC( (BPTR)FH, '\n' );
                                   };
                               };
                           break;
                  };
                };
            Close( (BPTR)FH );
            };
        }
    else if (Ana_Command[Typ])
        {
        sprintf( Command, Ana_Command[Typ], Name ); 
        if (SystemTags( Command, TAG_DONE))
            {
            ErrorMsg( LS[ MSG_7_T_ActFail ] );
            return( 0l );
            }
        else return( 1l );
        }
    else
        {
        ErrorMsg( LS[ MSG_7_T_NoAction ] );
        return( 0l );
        };
    return( 0l );
    }


/* FileAkt    : Wie FileAktion, allerdings wird nur der Dateiname ohne
                Pfad übergeben. Der Dateityp wird ermittelt */

FileAkt( char Act, char *Name )
    {
    char FileName[130];
    char *Buffer;
    struct FileHandle *FH;
    LONG BytesRead;
    short i,j;

    strcpy( FileName, VL_Name[Act] );
    AddPart( FileName, Name, 130 );

    if (Buffer = AllocMem( 256, MEMF_ANY ))    
        {
        if (FH = (struct FileHandle *)Open( FileName, MODE_OLDFILE ))
            {        
            BytesRead=Read( (BPTR)FH, Buffer, 256 );
            Close( (BPTR)FH );

            if( BytesRead>=12 )
                {
                if (strncmp( Buffer, "FORM", 4 )==0)
                    {
                    if ( strncmp( &Buffer[8], "ILBM", 4 )==0 )
                        {
                        FileAktion( FileName, 1);
                        }
                    else if ( strncmp( &Buffer[8], "SMUS", 4 )==0 )
                        {
                        FileAktion( FileName, 2);
                        }
                    else if ( strncmp( &Buffer[8], "ANIM", 4 )==0 )
                        {
                        FileAktion( FileName, 5);
                        }
                    }
                else if (strncmp( Buffer+2, "-lh", 3)==0 && Buffer[6] == '-')
                    {
                    if ((VL_Archiv==~0) && (FileAktion( FileName, 10)==1))
                        {
                        GetArcList(Act, FileName);
                        };
                    }
                else if (strnicmp( Name, "mod.", 4 )==0 ||
                         strnicmp( Name + strlen(Name) - 4, ".mod", 4 )==0 )
                    {
                    FileAktion( FileName, 4);
                    }
                else
                    {
                    j = 0;
                    for (i=0; i<BytesRead; i++)
                        if ( (Buffer[i]>31 & Buffer[i]<127) || Buffer[i]=='\n' || Buffer[i]=='\t' ) j++;
                    if ( j*10 > i*8 )
                        {
                        FileAktion( FileName, 3 );
                        }
                    else FileAktion( FileName, 0 );
                    }
                };
            };
        FreeMem( Buffer, 256 );
        };
    }

MakeFileList( char Act, char pos, char flag )
    {
    struct ExAllData *EAD;
    short  i;
    char   FileName[130];
    struct FileHandle *FH;
    char   TempFile[] = "T:MToolFL ";

    TempFile[9] = 48+pos;

    if (FH = (struct FileHandle *)Open( TempFile, MODE_NEWFILE ))
        {
        EAD = VL_Data[Act];

        for (i=0; i<VL_NumEntry[Act]; i++)
            {
            if ( VL_Select[Act][i] )
                if (flag)
                   {
                   FileName[0]=34;
                   strcpy( FileName+1, VL_Name[Act] );
                   AddPart( FileName+1, EAD->ed_Name, 129 );
                   if (EAD->ed_Type>=0)
                       strcat( FileName, "/#?");
                   strcat( FileName, "\"\n" );
                   FPuts((BPTR)FH, FileName);
                   }
                else
                   {
                   FileName[0]=34;
                   strcpy( FileName+1, EAD->ed_Name );
                   if (EAD->ed_Type>=0)
                       strcat( FileName, "/#?");
                   strcat( FileName, "\"\n" );
                   FPuts((BPTR)FH, FileName);
                   };
            EAD = EAD->ed_Next;
            };
        Close((BPTR)FH);
        return( 1l );
        }
    else return( 0l );
    }


CallExtPrg( char Act, char Num )
    {
    struct ExAllData *EAD;
    char Buffer[3][130];
    char Command[256];
    char *Hint;
    char i, Multicall, Request;
    char ChgActive, ChgOther;
    ULONG filenum;
    UWORD OldPSM;

    Hint = Ana_Command[MENU_OFFSET+Num]+strlen(Ana_Command[MENU_OFFSET+Num])+1;

    Multicall = 0;
    Request = 0;
    ChgActive = 0;
    ChgOther = 0;
    Buffer[0][0]='\0';
    Buffer[1][0]='\0';
    Buffer[2][0]='\0';
    do
       {
       for (i=0; i<strlen(Hint); i++)
          {
          switch (Hint[i])
             {
             case 'D' : strcpy( Buffer[i], VL_Name[Act] );
                        ChgActive = 1;
                        break;
             case 'd' : strcpy( Buffer[i], VL_Name[1-Act] );
                        ChgOther = 1;
                        break;
             case 'L' : MakeFileList( Act, i, 1 );
                        ChgActive = 1;
                        sprintf( Buffer[i], "T:MToolFL%d", i );
                        break;
             case 'l' : MakeFileList( 1-Act, i, 1 );
                        ChgOther = 1;
                        sprintf( Buffer[i], "T:MToolFL%d", i );
                        break;
             case 'N' : MakeFileList( Act, i, 0 );
                        ChgActive = 1;
                        sprintf( Buffer[i], "T:MToolFL%d", i );
                        break;
             case 'n' : MakeFileList( 1-Act, i, 0 );
                        ChgOther = 1;
                        sprintf( Buffer[i], "T:MToolFL%d", i );
                        break;
             case 'F' : if (Multicall==0) 
                           {
                           ChgActive = 1;
                           Multicall=1;
                           EAD = VL_Data[Act];
                           filenum = 0;
                           };
                        while( (VL_Select[Act][filenum]==0) && (filenum<VL_NumEntry[Act]) )
                           {
                           EAD = EAD->ed_Next;
                           filenum++;
                           };
                        if (filenum<VL_NumEntry[Act])
                           {
                           strcpy( Buffer[i], VL_Name[Act] );
                           AddPart( Buffer[i], EAD->ed_Name, 130 );
                           EAD = EAD->ed_Next;
                           filenum++;
                           }
                        else
                           Multicall=2;
                        break;
             case 'f' : if (Multicall==0) 
                           {
                           Multicall=1;
                           ChgOther = 1;
                           EAD = VL_Data[1-Act];
                           filenum = 0;
                           };
                        while ( (VL_Select[1-Act][filenum]=0) & (filenum<VL_NumEntry[1-Act]) )
                           {
                           EAD = EAD->ed_Next;
                           filenum++;
                           };
                        if (filenum<VL_NumEntry[1-Act])
                           {
                           strcpy( Buffer[i], VL_Name[1-Act] );
                           AddPart( Buffer[i], EAD->ed_Name, 130 );
                           EAD = EAD->ed_Next;
                           filenum++;
                           }
                        else
                           Multicall=2;
                        break;
             case 'S' :
             case 's' : if (NOT Request)
                           {
                           Buffer[i][0]='\0';
                           Request = 1;
                           if (NOT StringRequest(NewMenu[16+Num].nm_Label,LS[MSG_7_T_Parms], Buffer[i]))
                              Buffer[i][0]='\0';
                           };
                        break;
             default  : Buffer[i][0]='\0';
             };
          }
       if (Multicall<2)
          {
          sprintf( Command, Ana_Command[MENU_OFFSET+Num], Buffer[0], Buffer[1], Buffer[2] );
          SetDefaultPubScreen( "MTOOLSCREEN" );
          OldPSM = SetPubScreenModes( SHANGHAI );
          if (SystemTags( Command, TAG_DONE))
              ErrorMsg( LS[MSG_7_T_MenuFail] );
          SetPubScreenModes( OldPSM );
          SetDefaultPubScreen( NULL );
          };
       DeleteFile( "T:MToolFL0" );
       DeleteFile( "T:MToolFL1" );
       DeleteFile( "T:MToolFL2" );
       }
    while (Multicall==1);
    if (ChgActive) GetDir( Act, VL_Name[Act] );
    if (ChgOther) GetDir( 1-Act, VL_Name[1-Act] );
    }
