home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 5 / FreshFish_July-August1994.bin / bbs / os20 / forceicon-1.2.lha / ForceIcon / Source / Support.c < prev   
C/C++ Source or Header  |  1993-12-31  |  29KB  |  1,275 lines

  1. /*
  2. Auto:        smake ForceIcon
  3. */
  4.  
  5. /* $Revision Header built automatically *************** (do not edit) ************
  6. **
  7. ** © Copyright by GuntherSoft
  8. **
  9. ** File             : SnakeSYS:CPrgs/Utils/ForceIcon/Support.c
  10. ** Created on       : Friday, 22.10.93 16:38:41
  11. ** Created by       : Kai Iske
  12. ** Current revision : V1.0
  13. **
  14. **
  15. ** Purpose
  16. ** -------
  17. **   - Support-Routines for ForceIcon
  18. **
  19. ** Revision V1.0
  20. ** --------------
  21. ** created on Friday, 22.10.93 16:38:41  by  Kai Iske.   LogMessage :
  22. **     --- Initial release ---
  23. **
  24. *********************************************************************************/
  25.  
  26.  
  27.  
  28. /**********************************************************************/
  29. /*                         External variables                         */
  30. /**********************************************************************/
  31. extern struct    ExecBase    *SysBase;
  32. extern struct    SignalSemaphore    MySemaphore;
  33. extern struct    List        VolumeList;
  34. extern struct    IClass        *GetFileClass;
  35.  
  36.  
  37. /**********************************************************************/
  38. /*                          Global variables                          */
  39. /**********************************************************************/
  40. static struct    RastPort    ComputeRPort;
  41.  
  42.  
  43.  
  44. /**********************************************************************/
  45. /*                       Vars for Busy-Pointer                        */
  46. /**********************************************************************/
  47. static UWORD __chip BusyPtr[] =
  48. {
  49.     0x0000,0x0000,0x0400,0x07C0,0x0000,0x07C0,
  50.     0x0100,0x0380,0x0000,0x07E0,0x07C0,0x1FF8,
  51.     0x1FF0,0x3FEC,0x3FF8,0x7FDE,0x3FF8,0x7FBE,
  52.     0x7FFC,0xFF7F,0x7EFC,0xFFFF,0x7FFC,0xFFFF,
  53.     0x3FF8,0x7FFE,0x3FF8,0x7FFE,0x1FF0,0x3FFC,
  54.     0x07C0,0x1FF8,0x0000,0x07E0,0x0000,0x0000
  55. };
  56.  
  57.  
  58.  
  59. /**********************************************************************/
  60. /*                          Calc X-Position                           */
  61. /**********************************************************************/
  62. UWORD ComputeX(UWORD value, UWORD FontX)
  63. {
  64.     return((UWORD)(((FontX * value) + 2) / 8));
  65. }
  66.  
  67.  
  68.  
  69.  
  70.  
  71. /**********************************************************************/
  72. /*                          Calc Y-Position                           */
  73. /**********************************************************************/
  74. UWORD ComputeY(UWORD value, UWORD FontY)
  75. {
  76.     return(( UWORD )((( FontY * value ) + 2 ) / 8 ));
  77. }
  78.  
  79.  
  80.  
  81.  
  82. /**********************************************************************/
  83. /*                  Calc resolution and correct font                  */
  84. /**********************************************************************/
  85. void __stdargs ComputeFont(struct Screen *WorkScreen, UWORD width, UWORD height, struct TextAttr *Font, char *FontName, UWORD *OffX, UWORD *OffY, UWORD *FontX, UWORD *FontY)
  86. {
  87.         // Get Font-Structure
  88.  
  89.     strcpy(FontName, WorkScreen->RastPort.Font->tf_Message.mn_Node.ln_Name);
  90.  
  91.     Font->ta_Name    = FontName;
  92.     Font->ta_YSize    = *FontY = WorkScreen->RastPort.Font->tf_YSize;
  93.     Font->ta_Style    = FS_NORMAL;
  94.     Font->ta_Flags    = 0;
  95.  
  96.     *FontX        = WorkScreen->RastPort.Font->tf_XSize;
  97.  
  98.  
  99.         // Calc offsets
  100.  
  101.     *OffX = WorkScreen->WBorLeft;
  102.     *OffY = WorkScreen->RastPort.TxHeight + WorkScreen->WBorTop + 1;
  103.  
  104.  
  105.         // A Ok ???
  106.  
  107.     if(width && height)
  108.     {
  109.         if((ComputeX(width, *FontX) + *OffX + WorkScreen->WBorRight) > WorkScreen->Width)
  110.             goto UseTopaz;
  111.         if((ComputeY(height, *FontY) + *OffY + WorkScreen->WBorBottom) > WorkScreen->Height)
  112.             goto UseTopaz;
  113.     }
  114.     return;
  115.  
  116.         // FallBack to Topaz8
  117. UseTopaz:
  118.     strcpy(FontName, "topaz.font");
  119.     *FontX = *FontY = Font->ta_YSize = 8;
  120. }
  121.  
  122.  
  123.  
  124.  
  125. /**********************************************************************/
  126. /*              Open a window with a background pattern               */
  127. /**********************************************************************/
  128. BOOL OpenWin(
  129.             UWORD    Left,
  130.             UWORD    Top,
  131.             UWORD    Width,
  132.             UWORD    Height,
  133.             struct    Gadget        **BaseGadget,
  134.             UWORD    NumGads,
  135.             struct    _Object        **GetFile,
  136.             struct    NewGadget    *NewGads,
  137.             UWORD    *GTypes,
  138.             ULONG    *GTags,
  139.             struct    Gadget        **MyGads,
  140.             struct    Window        **Handle,
  141.             char    *Title,
  142.             ULONG    IDCMP,
  143.             ULONG    FLAGS,
  144.             UWORD    MLeft,
  145.             UWORD    MTop,
  146.             UWORD    MWidth,
  147.             UWORD    MHeight,
  148.             struct    TextAttr    *WinTxtAttr,
  149.             char            *WinTxtFontName,
  150.             struct    VisualInfo    **VisInfo)
  151. {
  152.     UWORD Raster[4] =
  153.     {
  154.         0xAAAA,
  155.         0x5555,
  156.     };
  157.     struct    Screen        *MyScreen;
  158.     struct    Rectangle    ScrRec;
  159.     struct    NewGadget    ng;
  160.     struct    Gadget        *g;
  161.     struct    TextFont    *MyFont = NULL;
  162.     UWORD    lc, tc;
  163.     UWORD    wleft, wtop, ww, wh, OffX, OffY, FontX, FontY,
  164.         swidth, sheight;
  165.  
  166.  
  167.     if(!(MyScreen = LockPubScreen("Workbench")))
  168.         return(FALSE);
  169.  
  170.     if(!(*VisInfo = GetVisualInfo(MyScreen, TAG_DONE)))
  171.         goto error;
  172.  
  173.         // Get Font and dimensions
  174.  
  175.     ComputeFont(MyScreen, Width, Height, WinTxtAttr, WinTxtFontName, &OffX, &OffY, &FontX, &FontY);
  176.  
  177.  
  178.         // Set RastPort Font
  179.  
  180.     InitRastPort(&ComputeRPort);
  181.     if(!(MyFont = OpenFont(WinTxtAttr)))
  182.     {
  183.         if(!(MyFont = OpenDiskFont(WinTxtAttr)))
  184.             goto error;
  185.     }
  186.     SetFont(&ComputeRPort, MyFont);
  187.  
  188.  
  189.         // Get size of window
  190.  
  191.     ww = ComputeX(Width, FontX);
  192.     wh = ComputeY(Height, FontY);
  193.  
  194.  
  195.         // Get info about Screenmode
  196.  
  197.     if(!QueryOverscan(GetVPModeID(&MyScreen->ViewPort), &ScrRec, OSCAN_TEXT))
  198.         goto error;
  199.  
  200.         // Center window
  201.  
  202.     swidth    = min((ScrRec.MaxX + 1), MyScreen->Width);
  203.     sheight    = min((ScrRec.MaxY + 1), MyScreen->Height);
  204.  
  205.     wleft    = ((swidth - ww - 1) >> 1) - ((MyScreen->LeftEdge < 0) ? MyScreen->LeftEdge : 0);
  206.     wtop    = ((sheight - wh - 1) >> 1) - ((MyScreen->TopEdge < 0) ? MyScreen->TopEdge : 0);
  207.  
  208.  
  209.         // Build GetFile image
  210.  
  211.     if(GetFile)
  212.     {
  213.         if(!(*GetFile = NewObject(GetFileClass, NULL, GT_VisualInfo, *VisInfo, IA_Width, ComputeX(20, FontX), IA_Height, ComputeY(14, FontY), TAG_DONE)))
  214.             goto error;
  215.     }
  216.  
  217.         // Create gadgets
  218.  
  219.     if(!(g = CreateContext(BaseGadget)))
  220.         goto error;
  221.  
  222.     for(lc = 0, tc = 0; lc < NumGads; lc++)
  223.     {
  224.         CopyMem((char *)&NewGads[lc], (char *)&ng, (long)sizeof(struct NewGadget));
  225.  
  226.         ng.ng_VisualInfo    = *VisInfo;
  227.         ng.ng_TextAttr        = WinTxtAttr;
  228.         ng.ng_LeftEdge        = OffX + ComputeX(ng.ng_LeftEdge, FontX);
  229.         ng.ng_TopEdge        = OffY + ComputeY(ng.ng_TopEdge, FontY);
  230.         ng.ng_Width        = ComputeX(ng.ng_Width, FontX);
  231.         ng.ng_Height        = ComputeY(ng.ng_Height, FontY);
  232.  
  233.             // Set gadget`s shortcut
  234.  
  235.         SetGadShortCut(GTypes[lc], &ng);
  236.  
  237.             // Check for ListView
  238.  
  239.         if(GTypes[lc] == LISTVIEW_KIND)
  240.         {
  241.             struct TagItem    *tmp;
  242.  
  243.             if(tmp = FindTagItem(GTLV_ShowSelected, (struct TagItem *)>ags[tc]))
  244.             {
  245.                 if(tmp->ti_Data)
  246.                     tmp->ti_Data = (ULONG)g;
  247.                 else
  248.                 {
  249.                         // With a normal ShowSelected,
  250.                         // adjust width according to version of OS
  251.  
  252.                     if(((struct Library *)SysBase)->lib_Version < 39)
  253.                         ng.ng_Height    -= 8;
  254.                 }
  255.             }
  256.         }
  257.  
  258.             // Create gadget
  259.  
  260.         MyGads[lc] = g = CreateGadgetA(GTypes[lc], g, &ng, (struct TagItem *)>ags[tc]);
  261.  
  262.             // Error ???
  263.  
  264.         if(!g)
  265.             goto error;
  266.  
  267.             // Set GetFile image
  268.  
  269.         if(GTypes[lc] == GENERIC_KIND && GetFile)
  270.         {
  271.             struct    TagItem    *tmp;
  272.             BOOL    Disabled = FALSE;
  273.  
  274.             if((tmp = FindTagItem(GA_Disabled, (struct TagItem *)>ags[tc])))
  275.                 Disabled = (BOOL)tmp->ti_Data;
  276.  
  277.             g->Flags        |= GFLG_GADGIMAGE | GFLG_GADGHIMAGE | ((Disabled) ? GFLG_DISABLED : 0);
  278.             g->Activation        |= GACT_RELVERIFY;
  279.             g->GadgetType        |= GTYP_BOOLGADGET;
  280.             g->GadgetRender        = (APTR)*GetFile;
  281.             g->SelectRender        = (APTR)*GetFile;
  282.         }
  283.  
  284.             // Patch String/Integer Gadgets
  285.  
  286.         if(GTypes[lc] == STRING_KIND || GTypes[lc] == INTEGER_KIND)
  287.         {
  288.             ((struct StringInfo *)g->SpecialInfo)->Extension->ActivePens[0] = 1;
  289.             ((struct StringInfo *)g->SpecialInfo)->Extension->ActivePens[1] = 2;
  290.         }
  291.  
  292.         while(GTags[tc])
  293.             tc += 2;
  294.         tc++;
  295.     }
  296.  
  297.         // Close Font
  298.  
  299.     CloseFont(MyFont);
  300.  
  301.         // Open window
  302.  
  303.     if(!(*Handle = OpenWindowTags(NULL,
  304.         WA_Left,        wleft,
  305.         WA_Top,            wtop,
  306.         WA_Width,        ww + OffX + MyScreen->WBorRight,
  307.         WA_Height,        wh + OffY + MyScreen->WBorBottom,
  308.         WA_IDCMP,        IDCMP,
  309.         WA_Flags,        FLAGS,
  310.         WA_Title,        Title,
  311.         WA_CustomScreen,    MyScreen,
  312.     TAG_DONE)))
  313.         goto error;
  314.  
  315.         // Clear userdata-field
  316.  
  317.     (*Handle)->UserData    = NULL;
  318.  
  319.         // Unlock Pub screen
  320.  
  321.     UnlockPubScreen(NULL, MyScreen);
  322.  
  323.     if(MLeft && MTop && MWidth && MHeight)
  324.     {
  325.             // Draw Raster
  326.  
  327.         SetAPen((*Handle)->RPort, 2);
  328.         SetAfPt((*Handle)->RPort, Raster, 1);
  329.         RectFill((*Handle)->