home *** CD-ROM | disk | FTP | other *** search
/ The Best of Mecomp Multimedia 2 / MECOMP-CD-II.iso / amiga / programmieren / gui / ieditor / expanders / bevelfill / funcs.c next >
Encoding:
C/C++ Source or Header  |  1997-06-17  |  9.8 KB  |  398 lines

  1. /// Includes
  2. #define INTUI_V36_NAMES_ONLY
  3.  
  4. #include <exec/nodes.h>                 // exec
  5. #include <exec/lists.h>
  6. #include <exec/memory.h>
  7. #include <exec/types.h>
  8. #include <dos/dos.h>                    // dos
  9. #include <intuition/intuition.h>        // intuition
  10. #include <clib/exec_protos.h>           // protos
  11. #include <clib/dos_protos.h>
  12. #include <clib/gadtools_protos.h>
  13. #include <pragmas/exec_pragmas.h>       // pragmas
  14. #include <pragmas/dos_pragmas.h>
  15. #include <pragmas/graphics_pragmas.h>
  16. #include <pragmas/gadtools_pragmas.h>
  17.  
  18. #include <stdarg.h>
  19. #include <string.h>
  20. #include <stdio.h>
  21. #include <stdlib.h>
  22. #include <ctype.h>
  23.  
  24. #include "DEV_IE:Expanders/defs.h"
  25. ///
  26. /// Prototypes
  27. /* we use a cut-down version of the ObjectInfo */
  28. struct BevelInfo {
  29.     struct  Node    Node;
  30.     UWORD           Kind;
  31.     UBYTE           Flags;
  32.     UBYTE           Pad;
  33.     APTR            Reserved;
  34.     UBYTE           Reserved2[80];
  35.     UBYTE           Reserved3[40];
  36.     WORD            User1;
  37.     WORD            User2;
  38.     WORD            Left;
  39.     WORD            Top;
  40.     UWORD           Width;
  41.     UWORD           Height;
  42. };
  43. ///
  44.  
  45.  
  46.  
  47. /*  Starting function           */
  48. /// IEX_Mount
  49. __geta4 ULONG IEX_Mount( __A0 struct IE_Data *IE )
  50. {
  51.     BPTR                    DescFile;
  52.     struct FileInfoBlock   *fib;
  53.     ULONG                   ret = IEX_ERROR_NO_DESC_FILE;
  54.     static UBYTE            FileName[] = "PROGDIR:Expanders/BevelFill.desc";
  55.  
  56.     Forbid();   /* we're going to write to a GLOBAL variable */
  57.  
  58.     if( Desc ) {            /* already mounted? */
  59.     Permit();
  60.     return( IEX_OK );
  61.     }
  62.  
  63.     LibBase->Kind      = IEX_OBJECT_KIND;
  64.  
  65.     LibBase->Resizable = TRUE;
  66.     LibBase->Movable   = TRUE;
  67.     LibBase->HasItems  = FALSE;
  68.     LibBase->UseFonts  = FALSE;
  69.  
  70.     LibBase->Node.ln_Name = "BEVEL FILL";
  71.  
  72.     Permit();
  73.  
  74.     if( fib = AllocDosObject( DOS_FIB, NULL )) {
  75.     if( DescFile = Lock( FileName, ACCESS_READ )) {
  76.  
  77.         Examine( DescFile, fib );
  78.         UnLock( DescFile );
  79.  
  80.         if( Desc = AllocVec( fib->fib_Size, 0L )) {
  81.         if( DescFile = Open( FileName, MODE_OLDFILE )) {
  82.             STRPTR pri;
  83.  
  84.             Read( DescFile, Desc, fib->fib_Size );
  85.             Close( DescFile );
  86.  
  87.             ( *IE->IEXFun->SplitLines )( Desc ); // VERY important!
  88.  
  89.             pri = ( *IE->IEXFun->GetFirstLine )( Desc, "RENDPRI" );
  90.  
  91.             if( pri )
  92.             LibBase->Node.ln_Pri = atoi( pri );
  93.             else
  94.             LibBase->Node.ln_Pri = 0;
  95.  
  96.             ret = IEX_OK;
  97.  
  98.         } else {
  99.             FreeVec( Desc );
  100.             Desc = NULL;
  101.         }
  102.         }
  103.  
  104.     }
  105.  
  106.     FreeDosObject( DOS_FIB, fib );
  107.     }
  108.  
  109.     return( ret );
  110. }
  111. ///
  112.  
  113.  
  114. /*  Edit functions              */
  115. /// IEX_Add
  116. __geta4 BOOL IEX_Add( __D0 UWORD ID, __A0 struct IE_Data *IE, __D1 WORD x, __D2 WORD y, __D3 UWORD width, __D4 UWORD height )
  117. {
  118.     struct BevelInfo   *bevel;
  119.     BOOL                ret = FALSE;
  120.  
  121.     if( bevel = AllocMem( sizeof( struct BevelInfo ), MEMF_CLEAR )) {
  122.  
  123.     bevel->Kind   = ID;       /* DON'T FORGET!!! */
  124.     bevel->Left   = x;
  125.     bevel->Top    = y;
  126.     bevel->Width  = width;
  127.     bevel->Height = height;
  128.     bevel->Flags  = G_ATTIVO; /* make it active  */
  129.  
  130.     /* add our object to the list */
  131.     AddTail((struct List *)&IE->win_info->wi_Gadgets, (struct Node *)bevel );
  132.  
  133.     IE->win_info->wi_NumObjects += 1;
  134.  
  135.     ret = TRUE;
  136.     }
  137.  
  138.     return( ret );
  139. }
  140. ///
  141. /// IEX_Remove
  142. __geta4 void IEX_Remove( __D0 UWORD ID, __A0 struct IE_Data *IE )
  143. {
  144.     struct BevelInfo   *bevel, *next;
  145.  
  146.     for( bevel = IE->win_info->wi_Gadgets.mlh_Head; bevel->Node.ln_Succ; bevel = bevel->Node.ln_Succ ) {
  147.     /* remove only the objects of our kind and that are selected  */
  148.     if(( bevel->Kind == ID ) && ( bevel->Flags & G_ATTIVO )) {
  149.         next = bevel->Node.ln_Pred;
  150.  
  151.         Remove(( struct Node * )bevel );
  152.  
  153.         IE->win_info->wi_NumObjects -= 1;
  154.  
  155.         FreeMem( bevel, sizeof( struct BevelInfo ));
  156.         bevel = next;
  157.     }
  158.     }
  159. }
  160. ///
  161. /// IEX_Edit
  162. __geta4 BOOL IEX_Edit( __D0 UWORD ID, __A0 struct IE_Data *IE )
  163. {
  164.     return( FALSE );
  165. }
  166. ///
  167. /// IEX_Copy
  168. __geta4 BOOL IEX_Copy( __D0 UWORD ID, __A0 struct IE_Data *IE, __D1 WORD offx, __D2 WORD offy )
  169. {
  170.     struct BevelInfo   *bevel, *copy;
  171.  
  172.     for( bevel = IE->win_info->wi_Gadgets.mlh_Head; bevel->Node.ln_Succ; bevel = bevel->Node.ln_Succ ) {
  173.     if(( bevel->Kind == ID ) && ( bevel->Flags & G_ATTIVO )) {
  174.  
  175.         if( copy = AllocMem( sizeof( struct BevelInfo ), 0L )) {
  176.  
  177.         CopyMem((char *)bevel, (char *)copy, (long)sizeof( struct BevelInfo ));
  178.  
  179.         AddTail((struct List *)&IE->win_info->wi_Gadgets, (struct Node *)copy );
  180.  
  181.         IE->win_info->wi_NumObjects += 1; /* Don't forget! */
  182.  
  183.         copy->Left += offx;  /* update its position */
  184.         copy->Top  += offy;
  185.  
  186.         /* I don't want a neverending loop... ;-) */
  187.         copy->Flags &= ~G_ATTIVO;
  188.  
  189.         } else
  190.         return( FALSE );
  191.     }
  192.     }
  193.  
  194.     return( TRUE );
  195. }
  196. ///
  197. /// IEX_Make
  198. __geta4 struct Gadget *IEX_Make( __D0 UWORD ID, __A0 struct IE_Data *IE, __A1 struct Gadget *glist )
  199. {
  200.     /*  We don't need to make anything  */
  201.     return( glist );
  202. }
  203. ///
  204. /// IEX_Free
  205. __geta4 void IEX_Free( __D0 UWORD ID, __A0 struct IE_Data *IE )
  206. {
  207.     /*  We've got nothing to free when the window is closed  */
  208. }
  209. ///
  210. /// IEX_Refresh
  211. __geta4 void IEX_Refresh( __D0 UWORD ID, __A0 struct IE_Data *IE )
  212. {
  213.     struct BevelInfo *bevel;
  214.  
  215.     for( bevel = IE->win_info->wi_Gadgets.mlh_Head; bevel->Node.ln_Succ; bevel = bevel->Node.ln_Succ ) {
  216.     /*  always check the Kind  */
  217.     if( bevel->Kind == ID ) {
  218.         WORD    x1, y1, x2, y2;
  219.  
  220.         DrawBevelBox( IE->win_active->RPort,
  221.               bevel->Left, bevel->Top,
  222.               bevel->Width, bevel->Height,
  223.               GTBB_Recessed, TRUE,
  224.               GT_VisualInfo, IE->ScreenData->Visual, TAG_DONE );
  225.  
  226.         SetAPen( IE->win_active->RPort, 0 );
  227.  
  228.         x1 = bevel->Left + 2;
  229.         y1 = bevel->Top  + 1;
  230.         x2 = bevel->Left + bevel->Width  - 3;
  231.         y2 = bevel->Top  + bevel->Height - 2;
  232.  
  233.         if(( x2 >= x1 ) && ( y2 >= y1 ))
  234.         RectFill( IE->win_active->RPort, x1, y1, x2, y2 );
  235.     }
  236.     }
  237. }
  238. ///
  239.  
  240.  
  241. /*  I/O Functions               */
  242. /// IEX_Save
  243. __geta4 void IEX_Save( __D0 UWORD ID, __A0 struct IE_Data *IE, __D1 BPTR File )
  244. {
  245.     struct BevelInfo   *bevel;
  246.  
  247.     for( bevel = IE->win_info->wi_Gadgets.mlh_Head; bevel->Node.ln_Succ; bevel = bevel->Node.ln_Succ )
  248.     if(( bevel->Kind == ID ) && ( bevel->Flags & G_ATTIVO ))
  249.         FWrite( File, &bevel->Left, 8, 1 );
  250. }
  251. ///
  252. /// IEX_Load
  253. __geta4 BOOL IEX_Load( __D0 UWORD ID, __A0 struct IE_Data *IE, __D1 BPTR File, __D2 UWORD Num )
  254. {
  255.     struct BevelInfo   *bevel;
  256.     UWORD               cnt;
  257.  
  258.     for( cnt = 0; cnt < Num; cnt++ ) {
  259.     if( bevel = AllocMem( sizeof( struct BevelInfo ), MEMF_CLEAR )) {
  260.  
  261.         bevel->Kind = ID;  /* VERY important!!! */
  262.  
  263.         AddTail(( struct List * )&IE->win_info->wi_Gadgets, ( struct Node * )bevel );
  264.  
  265.         FRead( File, &bevel->Left, 8, 1 );
  266.  
  267.     } else
  268.         return( FALSE );
  269.     }
  270.  
  271.     return( TRUE );
  272. }
  273. ///
  274.  
  275.  
  276. /*  Source related functions    */
  277. /// IEX_StartSrcGen
  278. __geta4 STRPTR IEX_StartSrcGen( __D0 UWORD ID, __A0 struct IE_Data *IE )
  279. {
  280.     struct WindowInfo  *wnd;
  281.     struct BevelInfo   *bevel;
  282.     STRPTR              func;
  283.  
  284.     for( wnd = IE->win_list.mlh_Head; wnd->wi_succ; wnd = wnd->wi_succ ) {
  285.     if( wnd->wi_NumObjects ) {
  286.         for( bevel = wnd->wi_Gadgets.mlh_Head; bevel->Node.ln_Succ; bevel = bevel->Node.ln_Succ ) {
  287.         if( bevel->Kind == ID )
  288.             wnd->wi_NeedRender = TRUE;
  289.         }
  290.     }
  291.     }
  292.  
  293.     func = ( IE->SrcFlags & FONTSENSITIVE ) ? "SUPPORT-FA" : "SUPPORT";
  294.  
  295.     return(( *IE->IEXFun->GetFirstLine )( Desc, func ));
  296. }
  297. ///
  298. /// IEX_WriteGlobals
  299. __geta4 void IEX_WriteGlobals( __D0 UWORD ID, __A0 struct GenFiles *Files, __A1 struct IE_Data *IE )
  300. {
  301. }
  302. ///
  303. /// IEX_WriteSetup
  304. __geta4 void IEX_WriteSetup( __D0 UWORD ID, __A0 struct GenFiles *Files, __A1 struct IE_Data *IE )
  305. {
  306. }
  307. ///
  308. /// IEX_WriteCloseDown
  309. __geta4 void IEX_WriteCloseDown( __D0 UWORD ID, __A0 struct GenFiles *Files, __A1 struct IE_Data *IE )
  310. {
  311. }
  312. ///
  313. /// IEX_WriteHeaders
  314. __geta4 void IEX_WriteHeaders( __D0 UWORD ID, __A0 struct GenFiles *Files, __A1 struct IE_Data *IE )
  315. {
  316.     STRPTR string;
  317.  
  318.     if( string = ( *IE->IEXFun->GetFirstLine )( Desc, "HEADER" ))
  319.     FPuts( Files->XDef, string );
  320. }
  321. ///
  322. /// IEX_WriteRender
  323. __geta4 void IEX_WriteRender( __D0 UWORD ID, __A0 struct GenFiles *Files, __A1 struct IE_Data *IE )
  324. {
  325.     UBYTE               X[6], Y[6], Width[6], Height[6];
  326.     struct Descriptor   Dsc[] = {
  327.     { 'x', X },
  328.     { 'y', Y },
  329.     { 'W', Width },
  330.     { 'h', Height },
  331.     { 'w', IE->win_info->wi_Label },
  332.     { 'g', NULL },
  333.     { 0, NULL }
  334.     };
  335.     struct BevelInfo   *bevel;
  336.     STRPTR              String;
  337.     static UBYTE        ld[] = "%ld";
  338.  
  339.     if( IE->win_info->wi_NumObjects ) {
  340.     if( String = ( *IE->IEXFun->GetFirstLine )( Desc, IE->win_info->wi_NumBools ? "RENDER-BOOL" : "RENDER" )) {
  341.  
  342.         if( IE->win_info->wi_NumBools ) {
  343.         struct BooleanInfo *bool;
  344.  
  345.         bool = IE->win_info->wi_Gadgets.mlh_Head;
  346.  
  347.         while( bool->b_Kind != BOOLEAN )
  348.             bool = bool->b_Node.ln_Succ;
  349.  
  350.         Dsc[5].Meaning = bool->b_Label;
  351.         }
  352.  
  353.         for( bevel = IE->win_info->wi_Gadgets.mlh_Head; bevel->Node.ln_Succ; bevel = bevel->Node.ln_Succ ) {
  354.         if( bevel->Kind == ID ) {
  355.  
  356.             sprintf( X, ld, bevel->Left - IE->ScreenData->XOffset );
  357.             sprintf( Y, ld, bevel->Top  - IE->ScreenData->YOffset );
  358.             sprintf( Width, ld, bevel->Width );
  359.             sprintf( Height, ld, bevel->Height );
  360.  
  361.             ( *IE->IEXFun->WriteFormatted )( Files->Std, String, &Dsc[0] );
  362.         }
  363.         }
  364.  
  365.         if( IE->win_info->wi_NumGads )
  366.         if( String = ( *IE->IEXFun->GetFirstLine )( Desc, "RENDER-GADGETS" ))
  367.             ( *IE->IEXFun->WriteFormatted )( Files->Std, String, &Dsc[0] );
  368.     }
  369.     }
  370. }
  371. ///
  372. /// IEX_GetIDCMP
  373. __geta4 ULONG IEX_GetIDCMP( __D0 UWORD ID, __D1 ULONG idcmp, __A0 struct IE_Data *IE )
  374. {
  375.     return( idcmp );
  376. }
  377. ///
  378. /// IEX_WriteData
  379. __geta4 void IEX_WriteData( __D0 UWORD ID, __A0 struct GenFiles *Files, __A1 struct IE_Data *IE )
  380. {
  381. }
  382. ///
  383. /// IEX_WriteChipData
  384. __geta4 void IEX_WriteChipData( __D0 UWORD ID, __A0 struct GenFiles *Files, __A1 struct IE_Data *IE )
  385. {
  386. }
  387. ///
  388. /// IEX_WriteOpenWnd
  389. __geta4 void IEX_WriteOpenWnd( __D0 UWORD ID, __A0 struct GenFiles *Files, __A1 struct IE_Data *IE )
  390. {
  391. }
  392. ///
  393. /// IEX_WriteCloseWnd
  394. __geta4 void IEX_WriteCloseWnd( __D0 UWORD ID, __A0 struct GenFiles *Files, __A1 struct IE_Data *IE )
  395. {
  396. }
  397. ///
  398.