home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Sound / Player / MCDPL121.LHA / MCDPlayer / Source / Proglist.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-05-16  |  13.3 KB  |  438 lines

  1. #include <intuition/intuition.h>
  2. #include <intuition/gadgetclass.h>
  3. #include <libraries/gadtools.h>
  4. #include <graphics/displayinfo.h>
  5. #include <graphics/gfxbase.h>
  6. #include <clib/gadtools_protos.h>
  7. #include <string.h>
  8. #include "mcdplayer.h"
  9.  
  10. #define GD_ProgTitelliste                      0
  11. #define GD_ProgSave                            1
  12. #define GD_ProgAbbruch                         2
  13. #define GD_ProgBenutzen                        3
  14. #define GD_ProgProgliste                       4
  15. #define GD_ProgNeu                             5
  16. #define GD_ProgEditMode                        6
  17. #define GD_ProgEditNum                         7
  18.  
  19. extern struct MsgPort     *TimerMP;
  20.  
  21. APTR                  VisualInfo = NULL;
  22. struct Screen        *Scr;
  23. struct Window        *ProgWnd = NULL;
  24. struct Gadget        *ProgGList = NULL;
  25. struct Gadget        *ProgGadgets[8];
  26. WORD                  ProgLeft;
  27. WORD                  ProgTop;
  28. UWORD                 ProgWidth = 469;
  29. UWORD                 ProgHeight = 174;
  30. UBYTE                *ProgWdt = (UBYTE *)"Title List";
  31.  
  32. struct List           SongList;
  33. struct Node           SongNode[100];
  34. struct List           PrgList;
  35. struct Node           PrgNode[100];
  36. char                 *SongTitles;
  37.  
  38. int                   ProgLen = 0;
  39. int                   ProgPos = 0;
  40. int                   ProgNr = 0;
  41. int                   ProgEditMode = 0;
  42.  
  43. BYTE                  Program[100][9];
  44. BYTE                  TempProg[100][9];
  45.  
  46. UBYTE         *ProgEditModeLabels[] = {
  47.     (UBYTE *)"Delete",
  48.     (UBYTE *)"Up",
  49.     (UBYTE *)"Down",
  50.     (UBYTE *)"Top",
  51.     (UBYTE *)"Bottom",
  52.     NULL };
  53.  
  54. UBYTE         *ProgEditNumLabels[] = {
  55.     (UBYTE *)"Start",
  56.     (UBYTE *)"Prog 1",
  57.     (UBYTE *)"Prog 2",
  58.     (UBYTE *)"Prog 3",
  59.     (UBYTE *)"Prog 4",
  60.     (UBYTE *)"Prog 5",
  61.     (UBYTE *)"Prog 6",
  62.     (UBYTE *)"Prog 7",
  63.     (UBYTE *)"Prog 8",
  64.     NULL };
  65.  
  66. struct TextAttr topaz8 = {
  67.     ( STRPTR )"topaz.font", 8, 0x00, 0x41 };
  68.  
  69. void MakePrgList( int Nr )
  70.     {
  71.     int i;
  72.  
  73.     NewList( &PrgList );
  74.     i = 0;
  75.     while( TempProg[i][Nr] )
  76.         {
  77.         PrgNode[i].ln_Name = SongNode[TempProg[i][Nr]-1].ln_Name;
  78.         PrgNode[i].ln_Pri  = TempProg[i][Nr];
  79.         AddTail( &PrgList, &PrgNode[i] );
  80.         i++;
  81.         };
  82.     ProgLen = i;
  83.     ProgNr = Nr;
  84.     };
  85.  
  86. void GetProgram( void )
  87.     {
  88.     char Buffer[256];
  89.     BPTR FH;
  90.     int i;
  91.  
  92.     sprintf( Buffer, SongPath );
  93.     AddPart( Buffer, TOC_CDID, 130 );
  94.     Buffer[strlen(Buffer)-16] = 'p';
  95.     Buffer[strlen(Buffer)-15] = 'r';
  96.  
  97.     if (FH = Open( Buffer, MODE_OLDFILE ))
  98.         {
  99.         Read( FH, Program, 900 );
  100.         Close( FH );
  101.         }
  102.     else
  103.         {
  104.         for( i=0; i<=8; i++ ) Program[0][i] = 0;
  105.         };
  106.     }
  107.  
  108. void InitLists( void )
  109.     {
  110.     int i;
  111.  
  112.     if (SongTitles = AllocMem( 10000, MEMF_ANY|MEMF_CLEAR ))
  113.         {
  114.         NewList( &SongList );
  115.         for( i=0; i<TOC_NumTracks; i++ )
  116.             {
  117.             SongNode[i].ln_Name = &(SongTitles[i*100]);
  118.             sprintf( &(SongTitles[i*100]), "%02d: ", i+1 );
  119.             strcpy( &(SongTitles[i*100+4]), TOC_Title[i] );
  120.             AddTail( &SongList, &SongNode[i] );
  121.             };
  122.         memcpy( TempProg, Program, 900 );
  123.         MakePrgList( 0 );
  124.         }
  125.     }
  126.  
  127. void ExitLists( int Action ) /* 0=Exit, 1=Use, 2=Save */
  128.     {
  129.     char Buffer[256];
  130.     BPTR FH;
  131.  
  132.     if (Action)
  133.         {
  134.         memcpy( Program, TempProg, 900 );
  135.         }
  136.         
  137.     if (Action==2)
  138.         {
  139.         sprintf( Buffer, SongPath );
  140.         AddPart( Buffer, TOC_CDID, 130 );
  141.         Buffer[strlen(Buffer)-16] = 'p';
  142.         Buffer[strlen(Buffer)-15] = 'r';
  143.  
  144.         if (FH = Open( Buffer, MODE_NEWFILE ))
  145.             {
  146.             Write( FH, Program, 900 );
  147.             Close( FH );
  148.             }
  149.         }
  150.  
  151.     if (SongTitles) FreeMem( SongTitles, 10000 );
  152.     }
  153.  
  154. int OpenProgWindow( void )
  155. {
  156.     struct NewGadget     ng;
  157.     struct Gadget       *g;
  158.     UWORD               offx, offy;
  159.  
  160.     if ( ! ( Scr = LockPubScreen( 0 )))
  161.         return( 1L );
  162.  
  163.     PlaceWnd( Scr, ProgWidth, ProgHeight + offy, &ProgLeft, &ProgTop, 0 );
  164.  
  165.     if ( ! ( VisualInfo = GetVisualInfo( Scr, TAG_DONE )))
  166.         return( 2L );
  167.  
  168.     offx = Scr->WBorLeft;
  169.     offy = Scr->WBorTop + Scr->RastPort.TxHeight + 1;
  170.  
  171.     if ( ! ( g = CreateContext( &ProgGList )))
  172.         return( 1L );
  173.  
  174.     ng.ng_LeftEdge        =    offx + 5;
  175.     ng.ng_TopEdge         =    offy + 19;
  176.     ng.ng_Width           =    181;
  177.     ng.ng_Height          =    128;
  178.     ng.ng_GadgetText      =    (UBYTE *)"Title List";
  179.     ng.ng_TextAttr        =    &topaz8;
  180.     ng.ng_GadgetID        =    GD_ProgTitelliste;
  181.     ng.ng_Flags           =    PLACETEXT_ABOVE;
  182.     ng.ng_VisualInfo      =    VisualInfo;
  183.  
  184.     g = CreateGadget( LISTVIEW_KIND, g, &ng, GTLV_Labels, &SongList, GTLV_ShowSelected, NULL, TAG_DONE );
  185.  
  186.     ProgGadgets[ 0 ] = g;
  187.  
  188.     ng.ng_TopEdge         =    offy + 153;
  189.     ng.ng_Width           =    80;
  190.     ng.ng_Height          =    14;
  191.     ng.ng_GadgetText      =    (UBYTE *)"Save";
  192.     ng.ng_GadgetID        =    GD_ProgSave;
  193.     ng.ng_Flags           =    PLACETEXT_IN;
  194.  
  195.     g = CreateGadget( BUTTON_KIND, g, &ng, TAG_DONE );
  196.  
  197.     ProgGadgets[ 1 ] = g;
  198.  
  199.     ng.ng_LeftEdge        =    offx + 375;
  200.     ng.ng_GadgetText      =    (UBYTE *)"Cancel";
  201.     ng.ng_GadgetID        =    GD_ProgAbbruch;
  202.  
  203.     g = CreateGadget( BUTTON_KIND, g, &ng, TAG_DONE );
  204.  
  205.     ProgGadgets[ 2 ] = g;
  206.  
  207.     ng.ng_LeftEdge        =    offx + 190;
  208.     ng.ng_GadgetText      =    (UBYTE *)"Use";
  209.     ng.ng_GadgetID        =    GD_ProgBenutzen;
  210.  
  211.     g = CreateGadget( BUTTON_KIND, g, &ng, TAG_DONE );
  212.  
  213.     ProgGadgets[ 3 ] = g;
  214.  
  215.     ng.ng_LeftEdge        =    offx + 274;
  216.     ng.ng_TopEdge         =    offy + 19;
  217.     ng.ng_Width           =    181;
  218.     ng.ng_Height          =    128;
  219.     ng.ng_GadgetText      =    (UBYTE *)"Program List";
  220.     ng.ng_GadgetID        =    GD_ProgProgliste;
  221.     ng.ng_Flags           =    PLACETEXT_ABOVE;
  222.  
  223.     g = CreateGadget( LISTVIEW_KIND, g, &ng, GTLV_Labels, &PrgList, GTLV_ShowSelected, NULL, TAG_DONE );
  224.  
  225.     ProgGadgets[ 4 ] = g;
  226.  
  227.     ng.ng_LeftEdge        =    offx + 190;
  228.     ng.ng_Width           =    80;
  229.     ng.ng_Height          =    14;
  230.     ng.ng_GadgetText      =    (UBYTE *)"New";
  231.     ng.ng_GadgetID        =    GD_ProgNeu;
  232.     ng.ng_Flags           =    PLACETEXT_IN;
  233.  
  234.     g = CreateGadget( BUTTON_KIND, g, &ng, TAG_DONE );
  235.  
  236.     ProgGadgets[ 5 ] = g;
  237.  
  238.     ng.ng_TopEdge         =    offy + 36;
  239.     ng.ng_GadgetText      =    NULL;
  240.     ng.ng_GadgetID        =    GD_ProgEditMode;
  241.     ng.ng_Flags           =    0;
  242.  
  243.     g = CreateGadget( CYCLE_KIND, g, &ng, GTCY_Labels, &ProgEditModeLabels[0], TAG_DONE );
  244.  
  245.     ProgGadgets[ 6 ] = g;
  246.  
  247.     ng.ng_LeftEdge        =    offx + 193;
  248.     ng.ng_TopEdge         =    offy + 57;
  249.     ng.ng_GadgetID        =    GD_ProgEditNum;
  250.     ng.ng_Flags           =    PLACETEXT_RIGHT;
  251.  
  252.     g = CreateGadget( MX_KIND, g, &ng, GTMX_Labels, &ProgEditNumLabels[0], TAG_DONE );
  253.  
  254.     ProgGadgets[ 7 ] = g;
  255.  
  256.     if ( ! g )
  257.         return( 2L );
  258.  
  259.     if ( ! ( ProgWnd = OpenWindowTags( NULL,
  260.                     WA_Left,          ProgLeft,
  261.                     WA_Top,           ProgTop,
  262.                     WA_Width,         ProgWidth,
  263.                     WA_Height,        ProgHeight + offy,
  264.                     WA_IDCMP,         LISTVIEWIDCMP|BUTTONIDCMP|CYCLEIDCMP|MXIDCMP|IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW,
  265.                     WA_Flags,         WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE,
  266.                     WA_Gadgets,       ProgGList,
  267.                     WA_Title,         ProgWdt,
  268.                     WA_PubScreen,     Scr,
  269.                     TAG_DONE )))
  270.         return( 4L );
  271.  
  272.     GT_RefreshWindow( ProgWnd, NULL );
  273.  
  274.     return( 0L );
  275. }
  276.  
  277. void CloseProgWindow( void )
  278. {
  279.     if ( ProgWnd        )
  280.         {
  281.         CloseWindow( ProgWnd );
  282.         ProgWnd = NULL;
  283.         }
  284.  
  285.     if ( ProgGList      )
  286.         {
  287.         FreeGadgets( ProgGList );
  288.         ProgGList = NULL;
  289.         }
  290.  
  291.     if ( VisualInfo )
  292.         {
  293.         FreeVisualInfo( VisualInfo );
  294.         VisualInfo = NULL;
  295.         }
  296.  
  297.     if ( Scr )
  298.         {
  299.         UnlockPubScreen( NULL, Scr );
  300.         }
  301. }
  302.  
  303. void ProgList( void )
  304.     {
  305. /*    ULONG  GClass;
  306.     USHORT GCode;
  307.     struct Gadget *GList = 0l;
  308.     struct IntuiMessage  *msg;
  309.     int Exit = 0;
  310.     int i;
  311.     BYTE a;
  312.     LONG Sig;
  313. */
  314.     InitLists();
  315.     if (OpenProgWindow()) {CloseProgWindow();ExitLists(0);}
  316. };
  317.  
  318. void Handle_ProgInput(void)
  319. {
  320.     struct IntuiMessage  *msg;
  321.     ULONG  GClass;
  322.     USHORT GCode;
  323.     struct Gadget* GList;
  324.     int i;
  325.     BYTE a;
  326.  
  327.     while (msg = (struct IntuiMessage *) GT_GetIMsg( ProgWnd->UserPort ) )
  328.     {
  329.        GClass  = msg->Class;
  330.        GCode   = msg->Code;
  331.        if (GClass & (GADGETDOWN | GADGETUP | MOUSEMOVE) )
  332.            GList   = (struct Gadget *) msg->IAddress;
  333.            GT_ReplyIMsg(msg);
  334.  
  335.            switch (GClass)
  336.               {
  337.               case IDCMP_CLOSEWINDOW:
  338.                  ExitLists(0);
  339.                  CloseProgWindow();
  340.                  return;
  341.               case IDCMP_GADGETUP:
  342.                  switch (GList->GadgetID)
  343.                     {
  344.                     case GD_ProgTitelliste:
  345.                        if (ProgLen<100)
  346.                        {
  347.                           GT_SetGadgetAttrs(ProgGadgets[GD_ProgProgliste], ProgWnd, 0, GTLV_Labels, ~0, TAG_DONE);
  348.                           TempProg[ProgLen][ProgNr] = GCode + 1;
  349.                           TempProg[ProgLen+1][ProgNr] = 0;
  350.                           MakePrgList( ProgNr );
  351.                           GT_SetGadgetAttrs(ProgGadgets[GD_ProgProgliste], ProgWnd, 0, GTLV_Labels, &PrgList, TAG_DONE);
  352.                        };
  353.                        break;
  354.                     case GD_ProgSave      :
  355.                        ExitLists(2);
  356.                        CloseProgWindow();
  357.                        return;
  358.                     case GD_ProgAbbruch   :
  359.                        ExitLists(0);
  360.                        CloseProgWindow();
  361.                        return;
  362.                     case GD_ProgBenutzen  :
  363.                        ExitLists(1);
  364.                        CloseProgWindow();
  365.                        return;
  366.                     case GD_ProgProgliste :
  367.                        GT_SetGadgetAttrs(ProgGadgets[GD_ProgProgliste], ProgWnd, 0, GTLV_Labels, ~0, TAG_DONE);
  368.                        switch (ProgEditMode)
  369.                           {
  370.                           case 0: i = GCode;
  371.                              while( TempProg[i][ProgNr] )
  372.                              {
  373.                                 TempProg[i][ProgNr] = TempProg[i+1][ProgNr];
  374.                                 i++;
  375.                              };
  376.                              break;
  377.                           case 1: if (GCode>0)
  378.                              {
  379.                                 a = TempProg[GCode][ProgNr];
  380.                                 TempProg[GCode][ProgNr] = TempProg[GCode-1][ProgNr];
  381.                                 TempProg[GCode-1][ProgNr] = a;
  382.                              }
  383.                              break;
  384.                           case 2: if (GCode<ProgLen-1)
  385.                              {
  386.                                 a = TempProg[GCode][ProgNr];
  387.                                 TempProg[GCode][ProgNr] = TempProg[GCode+1][ProgNr];
  388.                                 TempProg[GCode+1][ProgNr] = a;
  389.                              }
  390.                              break;
  391.                           case 3: a = TempProg[GCode][ProgNr];
  392.                              i = GCode;
  393.                              while (i>0)
  394.                                 {
  395.                                 TempProg[i][ProgNr] = TempProg[i-1][ProgNr];
  396.                                 i--;
  397.                                 }
  398.                                 TempProg[0][ProgNr] = a;
  399.                              break;
  400.                           case 4: a = TempProg[GCode][ProgNr];
  401.                              i = GCode;
  402.                              while( TempProg[i+1][ProgNr] )
  403.                                 {
  404.                                 TempProg[i][ProgNr] = TempProg[i+1][ProgNr];
  405.                                 i++;
  406.                                 };
  407.                              TempProg[i][ProgNr] = a;
  408.                              break;
  409.                           }
  410.                        MakePrgList( ProgNr );
  411.                        GT_SetGadgetAttrs(ProgGadgets[GD_ProgProgliste], ProgWnd, 0, GTLV_Labels, &PrgList, TAG_DONE);
  412.                        break;
  413.                     case GD_ProgNeu       :
  414.                        GT_SetGadgetAttrs(ProgGadgets[GD_ProgProgliste], ProgWnd, 0, GTLV_Labels, ~0, TAG_DONE);
  415.                        TempProg[0][ProgNr] = 0;
  416.                        MakePrgList( ProgNr );
  417.                        GT_SetGadgetAttrs(ProgGadgets[GD_ProgProgliste], ProgWnd, 0, GTLV_Labels, &PrgList, TAG_DONE);
  418.                        break;
  419.                     case GD_ProgEditMode  :
  420.                        ProgEditMode = GCode;
  421.                        break;
  422.                     };
  423.                     break;
  424.                  case IDCMP_GADGETDOWN:
  425.                     switch (GList->GadgetID)
  426.                     {
  427.                        case GD_ProgEditNum   :
  428.                           GT_SetGadgetAttrs(ProgGadgets[GD_ProgProgliste], ProgWnd, 0, GTLV_Labels, ~0, TAG_DONE);
  429.                           MakePrgList( GCode );
  430.                           GT_SetGadgetAttrs(ProgGadgets[GD_ProgProgliste], ProgWnd, 0, GTLV_Labels, &PrgList, TAG_DONE);
  431.                           break;
  432.                     };
  433.                  break;
  434.                  };
  435.               };
  436.            }
  437.  
  438.