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

  1. /* flagdlg.c (emx+gcc) */
  2.  
  3. /* This is part of the Flag Workplace Shell sample program. */
  4.  
  5. #define USE_OS2_TOOLKIT_HEADERS
  6.  
  7. #include "flag.ih"
  8. #include "flag.ph"
  9.  
  10. #undef SOM_CurrentClass
  11.  
  12. #define GET_RED(X)      ((UCHAR)((X) >> 16))
  13. #define GET_GREEN(X)    ((UCHAR)((X) >> 8))
  14. #define GET_BLUE(X)     ((UCHAR)((X) >> 0))
  15. #define MAKE_RGB(R,G,B) (((ULONG)(R) << 16) | ((ULONG)(G) << 8) | (B))
  16.  
  17. static ULONG get_color (HWND hwnd, ULONG idc)
  18. {
  19.   ULONG r, g, b;
  20.  
  21.   WinSendDlgItemMsg (hwnd, idc + 0, SPBM_QUERYVALUE,
  22.                      (MPARAM)&r, MPFROM2SHORT (0, SPBQ_UPDATEIFVALID));
  23.   WinSendDlgItemMsg (hwnd, idc + 1, SPBM_QUERYVALUE,
  24.                      (MPARAM)&g, MPFROM2SHORT (0, SPBQ_UPDATEIFVALID));
  25.   WinSendDlgItemMsg (hwnd, idc + 2, SPBM_QUERYVALUE,
  26.                      (MPARAM)&b, MPFROM2SHORT (0, SPBQ_UPDATEIFVALID));
  27.   return (MAKE_RGB (r, g, b));
  28. }
  29.  
  30.  
  31. static void set_color (HWND hwnd, ULONG idc, ULONG color)
  32. {
  33.   WinSendDlgItemMsg (hwnd, idc + 0, SPBM_SETCURRENTVALUE,
  34.                      MPFROMLONG (GET_RED (color)), MPFROMLONG (0));
  35.   WinSendDlgItemMsg (hwnd, idc + 1, SPBM_SETCURRENTVALUE,
  36.                      MPFROMLONG (GET_GREEN (color)), MPFROMLONG (0));
  37.   WinSendDlgItemMsg (hwnd, idc + 2, SPBM_SETCURRENTVALUE,
  38.                      MPFROMLONG (GET_BLUE (color)), MPFROMLONG (0));
  39. }
  40.  
  41.  
  42. static void init_color (HWND hwnd, ULONG idc)
  43. {
  44.   WinSendDlgItemMsg (hwnd, idc + 0, SPBM_SETLIMITS,
  45.                      MPFROMLONG (255), MPFROMLONG (0));
  46.   WinSendDlgItemMsg (hwnd, idc + 1, SPBM_SETLIMITS,
  47.                      MPFROMLONG (255), MPFROMLONG (0));
  48.   WinSendDlgItemMsg (hwnd, idc + 2, SPBM_SETLIMITS,
  49.                      MPFROMLONG (255), MPFROMLONG (0));
  50. }
  51.  
  52.  
  53. static void enable_color (HWND hwnd, ULONG idc, ULONG enable)
  54. {
  55.   WinEnableWindow (WinWindowFromID (hwnd, idc + 0), enable);
  56.   WinEnableWindow (WinWindowFromID (hwnd, idc + 1), enable);
  57.   WinEnableWindow (WinWindowFromID (hwnd, idc + 2), enable);
  58. }
  59.  
  60.  
  61. static void enable_colors (HWND hwnd, ULONG stripes)
  62. {
  63.   enable_color (hwnd, IDC_COLOR2, stripes >= 2);
  64.   enable_color (hwnd, IDC_COLOR3, stripes >= 3);
  65. }
  66.  
  67.  
  68. static ULONG get_stripes (HWND hwnd)
  69. {
  70.   ULONG stripes;
  71.  
  72.   WinSendDlgItemMsg (hwnd, IDC_STRIPES, SPBM_QUERYVALUE,
  73.                      (MPARAM)&stripes, MPFROM2SHORT (0, SPBQ_UPDATEIFVALID));
  74.   return (stripes);
  75. }
  76.  
  77.  
  78. static void set_stripes (HWND hwnd, ULONG stripes)
  79. {
  80.   WinSendDlgItemMsg (hwnd, IDC_STRIPES, SPBM_SETCURRENTVALUE,
  81.                      MPFROMLONG (stripes), MPFROMLONG (0));
  82. }
  83.  
  84.  
  85. static ULONG get_orientation (HWND hwnd)
  86. {
  87.   MRESULT mr;
  88.  
  89.   mr = WinSendDlgItemMsg (hwnd, IDC_HORIZONTAL, BM_QUERYCHECK, NULL, NULL);
  90.   return (SHORT1FROMMR (mr) ? HORIZONTAL : VERTICAL);
  91. }
  92.  
  93.  
  94. static void set_orientation (HWND hwnd, ULONG orientation)
  95. {
  96.   WinSendDlgItemMsg (hwnd, (orientation == VERTICAL
  97.                             ? IDC_VERTICAL : IDC_HORIZONTAL), BM_SETCHECK,
  98.                      MPFROMSHORT (TRUE), NULL);
  99. }
  100.  
  101.  
  102. typedef struct
  103. {
  104.   Flag   *somSelf;              /* Changing the settings of this object */
  105.   ULONG  UndoColor[3];          /* Saved colors */
  106.   ULONG  UndoStripes;           /* Saved number of stripes */
  107.   ULONG  UndoOrientation;       /* Saved orientation */
  108.   char   ignore;                /* Ignore SPBN_CHANGE while TRUE */
  109. } FlagDlgDATA;
  110.  
  111.  
  112. /* The dialog procedure. */
  113.  
  114. MRESULT EXPENTRY FlagDlgProc (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  115. {
  116.   FlagDlgDATA *pFlagDlgData;
  117.   CHAR acBuffer[10];
  118.  
  119.   switch (msg)
  120.     {
  121.     case WM_INITDLG:
  122.       {
  123.         Flag *somSelf = ((WINDOWDATA *)mp2)->somSelf;
  124.         ULONG i;
  125.  
  126.         pFlagDlgData = (FlagDlgDATA *)_wpAllocMem (somSelf,
  127.                                             sizeof (*pFlagDlgData), NULL);
  128.         if (pFlagDlgData == NULL)
  129.           {
  130.             WinSetWindowPtr (hwnd, QWL_USER, NULL);
  131.             return ((MRESULT)FALSE);
  132.           }
  133.         memset (pFlagDlgData, 0, sizeof (*pFlagDlgData));
  134.         pFlagDlgData->somSelf         = somSelf;
  135.         pFlagDlgData->ignore          = TRUE;
  136.         pFlagDlgData->UndoStripes     = _QueryStripes (somSelf);
  137.         pFlagDlgData->UndoOrientation = _QueryOrientation (somSelf);
  138.         for (i = 0; i < 3; ++i)
  139.           pFlagDlgData->UndoColor[i] = _QueryColor (somSelf, i);
  140.  
  141.         WinSetWindowPtr (hwnd, QWL_USER, pFlagDlgData);
  142.         init_color (hwnd, IDC_COLOR1);
  143.         init_color (hwnd, IDC_COLOR2);
  144.         init_color (hwnd, IDC_COLOR3);
  145.         WinSendDlgItemMsg (hwnd, IDC_STRIPES, SPBM_SETLIMITS,
  146.                            MPFROMLONG (3), MPFROMLONG (1));
  147.         set_color (hwnd, IDC_COLOR1, _QueryColor (somSelf, 0));
  148.         set_color (hwnd, IDC_COLOR2, _QueryColor (somSelf, 1));
  149.         set_color (hwnd, IDC_COLOR3, _QueryColor (somSelf, 2));
  150.         set_stripes (hwnd, _QueryStripes (somSelf));
  151.         set_orientation (hwnd, _QueryOrientation (somSelf));
  152.         enable_colors (hwnd, _QueryStripes (somSelf));
  153.         pFlagDlgData->ignore = FALSE;
  154.         return ((MRESULT)FALSE);
  155.       }
  156.  
  157.     case WM_DESTROY:
  158.       pFlagDlgData = WinQueryWindowPtr (hwnd, QWL_USER);
  159.       if (pFlagDlgData != NULL)
  160.         _wpFreeMem (pFlagDlgData->somSelf, (PBYTE)pFlagDlgData);
  161.       break;
  162.  
  163.     case WM_COMMAND:
  164.       pFlagDlgData = WinQueryWindowPtr (hwnd, QWL_USER);
  165.       if (pFlagDlgData == NULL)
  166.         break;
  167.       switch (SHORT1FROMMP (mp1))
  168.         {
  169.         case IDC_UNDO:
  170.           /* Note: If this changes the values, the window gets
  171.              repainted by the control messages. */
  172.           set_color (hwnd, IDC_COLOR1, pFlagDlgData->UndoColor[0]);
  173.           set_color (hwnd, IDC_COLOR2, pFlagDlgData->UndoColor[1]);
  174.           set_color (hwnd, IDC_COLOR3, pFlagDlgData->UndoColor[2]);
  175.           set_stripes (hwnd, pFlagDlgData->UndoStripes);
  176.           set_orientation (hwnd, pFlagDlgData->UndoOrientation);
  177.           enable_colors (hwnd, _QueryStripes (pFlagDlgData->somSelf));
  178.           break;
  179.  
  180.         case IDC_DEFAULT:
  181.           /* Note: If this changes the values, the window gets
  182.              repainted by the control messages. */
  183.           set_color (hwnd, IDC_COLOR1, DEFAULT_COLOR1);
  184.           set_color (hwnd, IDC_COLOR2, DEFAULT_COLOR2);
  185.           set_color (hwnd, IDC_COLOR3, DEFAULT_COLOR3);
  186.           set_stripes (hwnd, DEFAULT_STRIPES);
  187.           set_orientation (hwnd, DEFAULT_ORIENTATION);
  188.           enable_colors (hwnd, _QueryStripes (pFlagDlgData->somSelf));
  189.           break;
  190.  
  191.         case IDC_HELP:
  192.           break;
  193.         }
  194.       return ((MRESULT)TRUE);
  195.  
  196.     case WM_CONTROL:
  197.       pFlagDlgData = WinQueryWindowPtr (hwnd, QWL_USER);
  198.       if (pFlagDlgData == NULL)
  199.         break;
  200.       if (!pFlagDlgData->ignore)
  201.         {
  202.           switch (SHORT1FROMMP (mp1))
  203.             {
  204.             case IDC_HORIZONTAL:
  205.             case IDC_VERTICAL:
  206.               _SetOrientation (pFlagDlgData->somSelf, get_orientation (hwnd));
  207.               _Repaint (pFlagDlgData->somSelf);
  208.               break;
  209.  
  210.             case IDC_STRIPES:
  211.               if (SHORT2FROMMP (mp1) == SPBN_CHANGE)
  212.                 {
  213.                   _SetStripes (pFlagDlgData->somSelf, get_stripes (hwnd));
  214.                   enable_colors (hwnd, _QueryStripes (pFlagDlgData->somSelf));
  215.                   _Repaint (pFlagDlgData->somSelf);
  216.                 }
  217.               break;
  218.  
  219.             case IDC_COLOR1_RED:
  220.             case IDC_COLOR1_GREEN:
  221.             case IDC_COLOR1_BLUE:
  222.               if (SHORT2FROMMP (mp1) == SPBN_CHANGE)
  223.                 {
  224.                   _SetColor (pFlagDlgData->somSelf, 0,
  225.                              get_color (hwnd, IDC_COLOR1));
  226.                   _Repaint (pFlagDlgData->somSelf);
  227.                 }
  228.               break;
  229.  
  230.             case IDC_COLOR2_RED:
  231.             case IDC_COLOR2_GREEN:
  232.             case IDC_COLOR2_BLUE:
  233.               if (SHORT2FROMMP (mp1) == SPBN_CHANGE)
  234.                 {
  235.                   _SetColor (pFlagDlgData->somSelf, 1,
  236.                              get_color (hwnd, IDC_COLOR2));
  237.                   _Repaint (pFlagDlgData->somSelf);
  238.                 }
  239.               break;
  240.  
  241.             case IDC_COLOR3_RED:
  242.             case IDC_COLOR3_GREEN:
  243.             case IDC_COLOR3_BLUE:
  244.               if (SHORT2FROMMP (mp1) == SPBN_CHANGE)
  245.                 {
  246.                   _SetColor (pFlagDlgData->somSelf, 2,
  247.                              get_color (hwnd, IDC_COLOR3));
  248.                   _Repaint (pFlagDlgData->somSelf);
  249.                 }
  250.               break;
  251.             }
  252.         }
  253.       return ((MRESULT)TRUE);
  254.     }
  255.   return (WinDefDlgProc (hwnd, msg, mp1, mp2));
  256. }
  257.