home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1994 #1 / monster.zip / monster / OS2 / EMXFIX04.ZIP / FLAG.C < prev    next >
C/C++ Source or Header  |  1994-01-24  |  13KB  |  512 lines

  1. /* flag.c (emx+gcc) */
  2.  
  3. /* This is a Workplace Shell sample program. */
  4.  
  5. /* There are several things which are not implemented:
  6.  
  7.    - Drag and drop (colors)
  8.    - Icon in the Templates folder
  9.    - Window title
  10.    - Symmetry of the widths of the stripes
  11.    - Help
  12.  
  13.    etc. */
  14.  
  15. #define USE_OS2_TOOLKIT_HEADERS
  16.  
  17. #define Flag_Class_Source
  18. #define M_Flag_Class_Source
  19.  
  20. #include "flag.ih"
  21. #include "flag.ph"
  22.  
  23. #include <stdlib.h>
  24. #include <string.h>
  25.  
  26.  
  27. /* Prototypes. */
  28.  
  29. static HWND FlagInit (Flag *somSelf);
  30. MRESULT EXPENTRY FlagDlgProc (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
  31. MRESULT EXPENTRY FlagWndProc (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
  32.  
  33.  
  34. /* Global data. */
  35.  
  36. static CHAR szFlagWindowClass[] = "FLAGSAMPLE";
  37. static UCHAR szFlagClassTitle[CCHMAXPATH] = "Flag";
  38. static HMODULE hmod = NULLHANDLE;
  39.  
  40.  
  41. /* Instance methods. */
  42.  
  43. #undef SOM_CurrentClass
  44. #define SOM_CurrentClass SOMInstance
  45.  
  46.  
  47. /* Set pWindowData. */
  48.  
  49. SOM_Scope VOID SOMLINK
  50. flag_InitWindowData (Flag *somSelf, WINDOWDATA *pWindowData)
  51. {
  52.   FlagData *somThis = FlagGetData (somSelf);
  53.   _pWindowData = pWindowData;
  54. }
  55.  
  56.  
  57. /* Return the color of strip ULINDEX (0 through 2). */
  58.  
  59. SOM_Scope ULONG SOMLINK
  60. flag_QueryColor (Flag *somSelf, ULONG ulIndex)
  61. {
  62.   FlagData *somThis = FlagGetData (somSelf);
  63.   return (_color[ulIndex]);
  64. }
  65.  
  66.  
  67. /* Set the color of strip ULINDEX (0 through 2). */
  68.  
  69. SOM_Scope VOID SOMLINK
  70. flag_SetColor (Flag *somSelf, ULONG ulIndex, ULONG ulColor)
  71. {
  72.   FlagData *somThis = FlagGetData (somSelf);
  73.   _color[ulIndex] = ulColor;
  74. }
  75.  
  76.  
  77. /* Return the number of stripes. */
  78.  
  79. SOM_Scope ULONG SOMLINK
  80. flag_QueryStripes (Flag *somSelf)
  81. {
  82.   FlagData *somThis = FlagGetData (somSelf);
  83.   return (_stripes);
  84. }
  85.  
  86.  
  87. /* Set the number of stripes. */
  88.  
  89. SOM_Scope VOID SOMLINK
  90. flag_SetStripes (Flag *somSelf, ULONG ulStripes)
  91. {
  92.   FlagData *somThis = FlagGetData (somSelf);
  93.   _stripes = ulStripes;
  94. }
  95.  
  96.  
  97. /* Return the orientation of the stripes. */
  98.  
  99. SOM_Scope ULONG SOMLINK
  100. flag_QueryOrientation (Flag *somSelf)
  101. {
  102.   FlagData *somThis = FlagGetData (somSelf);
  103.   return (_orientation);
  104. }
  105.  
  106.  
  107. /* Set the orientation of the stripes. */
  108.  
  109. SOM_Scope VOID SOMLINK
  110. flag_SetOrientation (Flag *somSelf, ULONG ulOrientation)
  111. {
  112.   FlagData *somThis = FlagGetData (somSelf);
  113.   _orientation = ulOrientation;
  114. }
  115.  
  116.  
  117. /* Add the "Flag" page to the settings notebook. */
  118.  
  119. SOM_Scope ULONG SOMLINK
  120. flag_AddFlagPage (Flag *somSelf, HWND hwndNotebook)
  121. {
  122.   PAGEINFO pageinfo;
  123.   static WINDOWDATA wd;
  124.   WINDOWDATA *pwd;
  125.   FlagData *somThis = FlagGetData (somSelf);
  126.  
  127.   pwd = _pWindowData;
  128.   if (pwd == NULL)
  129.     {
  130.       /* Pass a dummy WINDOWDATA structure if the Flag view is not
  131.          open.  FlagDlgProc takes somSelf from this structure. */
  132.  
  133.       memset (&wd, 0, sizeof (wd));
  134.       wd.cb = sizeof (wd);
  135.       wd.somSelf = somSelf;
  136.       pwd = &wd;
  137.       if (hmod == NULLHANDLE)
  138.         return (TRUE);
  139.     }
  140.   memset (&pageinfo, 0, sizeof (pageinfo));
  141.   pageinfo.cb                 = sizeof (pageinfo);
  142.   pageinfo.hwndPage           = NULLHANDLE;
  143.   pageinfo.usPageStyleFlags   = BKA_MAJOR;
  144.   pageinfo.usPageInsertFlags  = BKA_FIRST;
  145.   pageinfo.pfnwp              = FlagDlgProc;
  146.   pageinfo.resid              = hmod;
  147.   pageinfo.dlgid              = IDD_FLAG;
  148.   pageinfo.pszName            = "Flag";
  149.   pageinfo.pCreateParams      = pwd;
  150.   pageinfo.idDefaultHelpPanel = 0;
  151.   pageinfo.pszHelpLibraryName = NULL;
  152.   return (_wpInsertSettingsPage (somSelf, hwndNotebook, &pageinfo));
  153. }
  154.  
  155.  
  156. /* Repaint the window. */
  157.  
  158. SOM_Scope VOID SOMLINK
  159. flag_Repaint (Flag *somSelf)
  160. {
  161.   FlagData *somThis = FlagGetData (somSelf);
  162.  
  163.   if (_pWindowData != NULL && _pWindowData->hwndClient != NULLHANDLE)
  164.     WinInvalidateRect (_pWindowData->hwndClient, NULL, FALSE);
  165. }
  166.  
  167.  
  168. /* Initialize instance data. */
  169.  
  170. SOM_Scope void SOMLINK
  171. flag_wpInitData (Flag *somSelf)
  172. {
  173.   FlagData *somThis = FlagGetData (somSelf);
  174.  
  175.   memset (somThis, 0, sizeof (*somThis));
  176.   _color[0]    = DEFAULT_COLOR1;
  177.   _color[1]    = DEFAULT_COLOR2;
  178.   _color[2]    = DEFAULT_COLOR3;
  179.   _stripes     = DEFAULT_STRIPES;
  180.   _orientation = DEFAULT_ORIENTATION;
  181.   parent_wpInitData (somSelf);
  182. }
  183.  
  184.  
  185. /* Free instance data. */
  186.  
  187. SOM_Scope void SOMLINK
  188. flag_wpUnInitData (Flag *somSelf)
  189. {
  190.   FlagData *somThis = FlagGetData (somSelf);
  191.  
  192.   parent_wpUnInitData (somSelf);
  193. }
  194.  
  195.  
  196. /* Save the state of the object. */
  197.  
  198. SOM_Scope BOOL SOMLINK
  199. flag_wpSaveState (Flag *somSelf)
  200. {
  201.   FlagData *somThis = FlagGetData (somSelf);
  202.  
  203.   _wpSaveLong (somSelf, szFlagClassTitle, IDKEY_COLOR1, _color[0]);
  204.   _wpSaveLong (somSelf, szFlagClassTitle, IDKEY_COLOR2, _color[1]);
  205.   _wpSaveLong (somSelf, szFlagClassTitle, IDKEY_COLOR3, _color[2]);
  206.   _wpSaveLong (somSelf, szFlagClassTitle, IDKEY_STRIPES, _stripes);
  207.   _wpSaveLong (somSelf, szFlagClassTitle, IDKEY_ORIENTATION, _orientation);
  208.   return (parent_wpSaveState (somSelf));
  209. }
  210.  
  211.  
  212. /* Restore the state of the object. */
  213.  
  214. SOM_Scope BOOL SOMLINK
  215. flag_wpRestoreState (Flag *somSelf, ULONG ulReserved)
  216. {
  217.   FlagData *somThis = FlagGetData (somSelf);
  218.  
  219.   _wpRestoreLong (somSelf, szFlagClassTitle, IDKEY_COLOR1, &_color[0]);
  220.   _wpRestoreLong (somSelf, szFlagClassTitle, IDKEY_COLOR2, &_color[1]);
  221.   _wpRestoreLong (somSelf, szFlagClassTitle, IDKEY_COLOR3, &_color[2]);
  222.   _wpRestoreLong (somSelf, szFlagClassTitle, IDKEY_STRIPES, &_stripes);
  223.   _wpRestoreLong (somSelf, szFlagClassTitle, IDKEY_ORIENTATION, &_orientation);
  224.   return (parent_wpRestoreState (somSelf, ulReserved));
  225. }
  226.  
  227.  
  228. /* Add pages to the settings notebook. */
  229.  
  230. SOM_Scope BOOL SOMLINK
  231. flag_wpAddSettingsPages (Flag *somSelf, HWND hwndNotebook)
  232. {
  233.   FlagData *somThis = FlagGetData (somSelf);
  234.  
  235.   return (parent_wpAddSettingsPages (somSelf, hwndNotebook)
  236.           && _AddFlagPage (somSelf, hwndNotebook));
  237. }
  238.  
  239.  
  240. /* Open a view to the object. */
  241.  
  242. SOM_Scope HWND SOMLINK
  243. flag_wpOpen (Flag *somSelf, HWND hwndCnr, ULONG ulView, ULONG param)
  244. {
  245.  FlagData *somThis = FlagGetData (somSelf);
  246.  
  247.  switch (ulView)
  248.    {
  249.    case OPEN_FLAG:
  250.      if (!_wpSwitchTo (somSelf, ulView))
  251.        return (FlagInit (somSelf));
  252.  
  253.    default:
  254.      return (parent_wpOpen (somSelf, hwndCnr, ulView, param));
  255.    }
  256. }
  257.  
  258.  
  259. /* Add menu item. */
  260.  
  261. SOM_Scope BOOL SOMLINK
  262. flag_wpModifyPopupMenu (Flag *somSelf, HWND hwndMenu, HWND hwndCnr,
  263.                         ULONG iPosition)
  264. {
  265.   FlagData *somThis = FlagGetData (somSelf);
  266.  
  267.   _wpInsertPopupMenuItems (somSelf, hwndMenu, 0, hmod, IDM_OPENFLAG,
  268.                            WPMENUID_OPEN);
  269.   return (parent_wpModifyPopupMenu (somSelf, hwndMenu, hwndCnr, iPosition));
  270. }
  271.  
  272.  
  273. /* Menu item selected. */
  274.  
  275. SOM_Scope BOOL SOMLINK
  276. flag_wpMenuItemSelected (Flag *somSelf, HWND hwndFrame, ULONG MenuId)
  277. {
  278.   FlagData *somThis = FlagGetData (somSelf);
  279.  
  280.   switch (MenuId)
  281.     {
  282.     case IDM_OPENFLAG:
  283.       _wpViewObject (somSelf, NULLHANDLE, OPEN_FLAG, 0);
  284.       break;
  285.  
  286.     default:
  287.       return (parent_wpMenuItemSelected (somSelf, hwndFrame, MenuId));
  288.       break;
  289.     }
  290.   return (TRUE);
  291. }
  292.  
  293.  
  294. /* Class methods. */
  295.  
  296. #undef SOM_CurrentClass
  297. #define SOM_CurrentClass SOMMeta
  298.  
  299.  
  300. /* Return the module handle. */
  301.  
  302. SOM_Scope HMODULE SOMLINK
  303. flagM_clsQueryModuleHandle (M_Flag *somSelf)
  304. {
  305.  if (hmod == NULLHANDLE)
  306.    {
  307.      zString szPathName;
  308.  
  309.      szPathName = _somLocateClassFile (SOMClassMgrObject,
  310.                                        SOM_IdFromString ("Flag"),
  311.                                        Flag_MajorVersion, Flag_MinorVersion);
  312.      DosQueryModuleHandle (szPathName, &hmod);
  313.    }
  314.  return (hmod);
  315. }
  316.  
  317.  
  318. /* Return the class style: Inhibit creation of a shadow. */
  319.  
  320. SOM_Scope ULONG SOMLINK
  321. flagM_wpclsQueryStyle (M_Flag *somSelf)
  322. {
  323.   return (parent_wpclsQueryStyle (somSelf) | CLSSTYLE_NEVERLINK);
  324. }
  325.  
  326.  
  327. /* Return the default title for the instances. */
  328.  
  329. SOM_Scope PSZ SOMLINK
  330. flagM_wpclsQueryTitle (M_Flag *somSelf)
  331. {
  332.   return (szFlagClassTitle);
  333. }
  334.  
  335.  
  336. /* Build the class default icon. */
  337.  
  338. SOM_Scope ULONG SOMLINK
  339. flagM_wpclsQueryIconData (M_Flag *somSelf, PICONINFO pIconInfo)
  340. {
  341.   if (pIconInfo != NULL)
  342.     {
  343.       pIconInfo->fFormat = ICON_RESOURCE;
  344.       pIconInfo->hmod    = _clsQueryModuleHandle (somSelf);
  345.       pIconInfo->resid   = ID_ICON;
  346.     }
  347.   return (sizeof (ICONINFO));
  348. }
  349.  
  350.  
  351. /* Return the default view of this class. */
  352.  
  353. SOM_Scope ULONG SOMLINK
  354. flagM_wpclsQueryDefaultView (M_Flag *somSelf)
  355. {
  356.   return (OPEN_FLAG);
  357. }
  358.  
  359.  
  360. /* Ordinary code. */
  361.  
  362. #undef SOM_CurrentClass
  363.  
  364.  
  365. /* Initialize a view. */
  366.  
  367. HWND FlagInit (Flag *somSelf)
  368. {
  369.   HAB hab;
  370.   HWND hwndFrame;
  371.   HWND hwndClient;
  372.   WINDOWDATA *pWindowData;
  373.   FRAMECDATA flFrameCtlData;
  374.  
  375.   hab = WinQueryAnchorBlock (HWND_DESKTOP);
  376.   WinRegisterClass (hab, szFlagWindowClass, (PFNWP)FlagWndProc ,
  377.                     CS_SIZEREDRAW | CS_SYNCPAINT, sizeof (pWindowData));
  378.  
  379.   pWindowData = (WINDOWDATA *)_wpAllocMem (somSelf, sizeof (*pWindowData),
  380.                                            NULL);
  381.   if (pWindowData == NULL)
  382.     return (NULLHANDLE);
  383.  
  384.   memset (pWindowData, 0, sizeof (*pWindowData));
  385.   pWindowData->cb = sizeof (*pWindowData);
  386.   pWindowData->somSelf = somSelf;
  387.  
  388.   _InitWindowData (somSelf, pWindowData);
  389.  
  390.   flFrameCtlData.cb            = sizeof (flFrameCtlData);
  391.   flFrameCtlData.flCreateFlags = (FCF_SIZEBORDER | FCF_TITLEBAR
  392.                                   | FCF_SYSMENU  | FCF_MINMAX);
  393.   flFrameCtlData.hmodResources = hmod;
  394.   flFrameCtlData.idResources   = ID_ICON;
  395.  
  396.   hwndFrame = WinCreateWindow (HWND_DESKTOP, WC_FRAME,
  397.                                _wpQueryTitle (somSelf), 0,
  398.                                0, 0, 0, 0,
  399.                                NULLHANDLE, HWND_TOP, ID_FRAME,
  400.                                (PVOID)&flFrameCtlData, NULL);
  401.   if (hwndFrame == NULLHANDLE)
  402.     return (NULLHANDLE);
  403.  
  404.   hwndClient = WinCreateWindow (hwndFrame, szFlagWindowClass,
  405.                                 NULL, 0,
  406.                                 0, 0, 0, 0,
  407.                                 hwndFrame, HWND_TOP, FID_CLIENT,
  408.                                 pWindowData, NULL);
  409.   if (hwndClient == NULLHANDLE)
  410.     {
  411.       WinDestroyWindow (hwndFrame);
  412.       return (NULLHANDLE);
  413.     }
  414.   pWindowData->hwndClient = hwndClient;
  415.  
  416.   WinSendMsg (hwndFrame, WM_SETICON, MPFROMP (_wpQueryIcon (somSelf)), NULL);
  417.  
  418.   if (!WinRestoreWindowPos (szFlagClassTitle, _wpQueryTitle (somSelf),
  419.                             hwndFrame))
  420.     {
  421.       SWP swp;
  422.  
  423.       WinQueryTaskSizePos (hab, 0, &swp);
  424.       swp.fl = SWP_SIZE|SWP_MOVE|SWP_RESTORE|SWP_ZORDER;
  425.       WinSetWindowPos (hwndFrame, HWND_TOP, swp.x, swp.y, swp.cx,
  426.                        swp.cy, swp.fl);
  427.     }
  428.   WinShowWindow (hwndFrame, TRUE);
  429.   return (hwndFrame);
  430. }
  431.  
  432.  
  433. /* The window procedure. */
  434.  
  435. MRESULT EXPENTRY FlagWndProc (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  436. {
  437.   ULONG MenuId;
  438.   WINDOWDATA *pWindowData;
  439.   HWND hwndFrame;
  440.   CHAR acBuffer[10];
  441.  
  442.   hwndFrame = WinQueryWindow (hwnd, QW_PARENT);
  443.  
  444.   switch (msg)
  445.     {
  446.     case WM_CREATE:
  447.       pWindowData = (WINDOWDATA *)mp1;
  448.       pWindowData->UseItem.type    = USAGE_OPENVIEW;
  449.       pWindowData->ViewItem.view   = OPEN_FLAG;
  450.       pWindowData->ViewItem.handle = hwndFrame;
  451.  
  452.       WinSetWindowPtr (hwnd, QWL_USER, pWindowData);
  453.       _wpAddToObjUseList (pWindowData->somSelf, &pWindowData->UseItem);
  454.       _wpRegisterView (pWindowData->somSelf, hwndFrame,
  455.                        _wpQueryTitle (pWindowData->somSelf));
  456.       WinSetFocus (HWND_DESKTOP, hwndFrame);
  457.       break;
  458.  
  459.     case WM_PAINT:
  460.       {
  461.         HPS hps;
  462.         RECTL rectl;
  463.         ULONG i, stripes, dx, dy;
  464.  
  465.         pWindowData = WinQueryWindowPtr (hwnd, QWL_USER);
  466.         if (pWindowData == NULL)
  467.           break;
  468.         stripes = _QueryStripes (pWindowData->somSelf);
  469.         WinQueryWindowRect (hwnd, &rectl);
  470.         if (_QueryOrientation (pWindowData->somSelf) == VERTICAL)
  471.           {
  472.             dx = (rectl.xRight + stripes - 1) / stripes; dy = 0;
  473.             rectl.xRight = dx;
  474.           }
  475.         else
  476.           {
  477.             dy = (rectl.yTop + stripes - 1) / stripes; dx = 0;
  478.             rectl.yBottom = rectl.yTop - dy;
  479.           }
  480.         hps = WinBeginPaint (hwnd, NULLHANDLE, NULL);
  481.         GpiCreateLogColorTable (hps, LCOL_PURECOLOR, LCOLF_RGB, 0, 0, NULL);
  482.         for (i = 0; i < stripes; ++i)
  483.           {
  484.             WinFillRect (hps, &rectl, _QueryColor (pWindowData->somSelf, i));
  485.             rectl.xLeft += dx; rectl.xRight += dx;
  486.             rectl.yBottom -= dy; rectl.yTop -= dy;
  487.           }
  488.         WinEndPaint (hps);
  489.       }
  490.       break;
  491.  
  492.     case WM_CLOSE:
  493.       {
  494.         HAB hab;
  495.  
  496.         pWindowData = (WINDOWDATA *)WinQueryWindowPtr (hwnd, QWL_USER);
  497.         if (pWindowData == NULL)
  498.           break;
  499.         hab = WinQueryAnchorBlock (HWND_DESKTOP);
  500.         WinStoreWindowPos (szFlagClassTitle,
  501.                            _wpQueryTitle (pWindowData->somSelf), hwndFrame);
  502.         _wpDeleteFromObjUseList (pWindowData->somSelf, &pWindowData->UseItem);
  503.         _InitWindowData (pWindowData->somSelf, NULL);
  504.         _wpFreeMem (pWindowData->somSelf, (PBYTE)pWindowData);
  505.         WinPostMsg (hwnd, WM_QUIT, 0, 0);
  506.         WinDestroyWindow (hwndFrame);
  507.       }
  508.       break;
  509.     }
  510.   return (WinDefWindowProc (hwnd, msg, mp1, mp2));
  511. }
  512.