home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1995 January / macformat-020.iso / Shareware City / Developers / apps.to.go / Kibitz / Config.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-05-06  |  11.6 KB  |  465 lines  |  [TEXT/MPS ]

  1. /*
  2. ** Apple Macintosh Developer Technical Support
  3. **
  4. ** File:        config.c
  5. ** Written by:  Eric Soldan
  6. **
  7. ** Copyright © 1990-1992 Apple Computer, Inc.
  8. ** All rights reserved. */
  9.  
  10.  
  11.  
  12. /*****************************************************************************/
  13.  
  14.  
  15.  
  16. #include "Kibitz.h"                /* Get the Kibitz includes/typedefs, etc.    */
  17. #include "KibitzCommon.h"        /* Get the stuff in common with rez.        */
  18. #include "Kibitz.protos"        /* Get the prototypes for Kibitz.            */
  19.  
  20. #ifndef __PACKAGES__
  21. #include <Packages.h>
  22. #endif
  23.  
  24. #ifndef __RESOURCES__
  25. #include <Resources.h>
  26. #endif
  27.  
  28. #ifndef __TOOLUTILS__
  29. #include <ToolUtils.h>
  30. #endif
  31.  
  32. #ifndef __UTILITIES__
  33. #include <Utilities.h>
  34. #endif
  35.  
  36.  
  37.  
  38. /*****************************************************************************/
  39.  
  40.  
  41.  
  42. #define kConfigOK        1
  43. #define kConfigEquivs    2
  44. #define kConfigCancel    3
  45. #define kPlayWhite        4
  46. #define kPlayBlack        5
  47. #define kCompWhite        6
  48. #define kCompBlack        7
  49. #define kTimerToggle    8
  50. #define kDivider1        9
  51. #define kDivider2        10
  52. #define kDivider3        11
  53. #define kWhiteClock        12
  54. #define kBlackClock        13
  55. #define kStatText1        14
  56. #define kStatText2        15
  57. #define kStatText3        16
  58. #define kStatText4        17
  59. #define kStatText5        18
  60. #define kSpeech            20
  61.  
  62. static short    gOption;
  63.  
  64. static pascal Boolean    configFilter(DialogPtr dlg, EventRecord *event, short *item);
  65.  
  66.  
  67.  
  68. /*****************************************************************************/
  69.  
  70.  
  71.  
  72. static TheDoc    newConfig;
  73. static short    iconNum[3] = {rConfigBase, rConfigBase + 1, rConfigBase + 2};
  74.  
  75. pascal void        DoConfigureGameProc(DialogPtr dialog, short userItem);
  76.  
  77.  
  78.  
  79. /*****************************************************************************/
  80. /*****************************************************************************/
  81.  
  82.  
  83.  
  84. #pragma segment Config
  85. void    DoConfigureGame(FileRecHndl frHndl)
  86. {
  87.     WindowPtr        oldPort, window;
  88.     DialogPtr        dialog;
  89.     short            item, userItemType, i, val, part, option;
  90.     Handle            itemHndl;
  91.     Rect            userItemRect;
  92.     Str255            zone, machine, userName, timeStamp;
  93.     Point                    mouseLoc;
  94.     unsigned long            tick, timeInSecs;
  95.     long                    defaultTime, defaultMinutes;
  96.     Boolean                    colorChange, timeChange;
  97.     TheDocPtr                docPtr;
  98.     static    UserItemUPP        configureGameUPP = nil;
  99.     static    ModalFilterUPP    configFilterUPP = nil;
  100.  
  101.     oldPort = SetFilePort(frHndl);
  102.  
  103.     newConfig = (*frHndl)->doc;
  104.         /* So DoConfigureGameProc can know, too.  This also allows us to cancel,
  105.         ** without changes. */
  106.  
  107.     zone[0] = machine[0] = userName[0] = timeStamp[0] = 0;
  108.     colorChange = timeChange = 0;
  109.  
  110.     window = (*frHndl)->fileState.window;
  111.     dialog = GetCenteredDialog(rConfigureGame, nil, window, (WindowPtr)-1L);
  112.     if (dialog) {
  113.  
  114.         if (!SpeechAvailable())
  115.             HideDialogItem(dialog, kSpeech);
  116.  
  117.         for (item = kPlayWhite; item <= kSpeech; ++item) {
  118.             GetDialogItem(dialog, item, &userItemType, &itemHndl, &userItemRect);
  119.             val = 0;
  120.             switch (item) {
  121.                 case kPlayWhite:
  122.                 case kPlayBlack:
  123.                     if ((newConfig.myColor) == item - kPlayWhite) ++val;
  124.                     break;
  125.                 case kCompWhite:
  126.                     if (newConfig.compMovesWhite) ++val;
  127.                     break;
  128.                 case kCompBlack:
  129.                     if (newConfig.compMovesBlack) ++val;
  130.                     break;
  131.                 case kTimerToggle:
  132.                     if (newConfig.timeLeft[0] != -1) ++val;
  133.                     break;
  134.                 case kDivider1:
  135.                 case kDivider2:
  136.                 case kDivider3:
  137.                 case kWhiteClock:
  138.                 case kBlackClock:
  139.                     if (!configureGameUPP)
  140.                         configureGameUPP = NewUserItemProc (DoConfigureGameProc);
  141.                     itemHndl = (Handle)configureGameUPP;
  142.                     SetDialogItem(dialog, item, userItemType, itemHndl, &userItemRect);
  143.                     break;
  144.                 case kStatText3:
  145.                     pcpy(userName, &newConfig.opponentName[0]);
  146.                     pcpy(zone, &newConfig.opponentZone[0]);
  147.                     pcpy(machine, &newConfig.opponentMachine[0]);
  148.                     timeInSecs = newConfig.timeLastReceive;
  149.                     if (timeInSecs)
  150.                         IUTimeString(timeInSecs, false, timeStamp);
  151.                     break;
  152.                 case kSpeech:
  153.                     val = newConfig.doSpeech;
  154.                     break;
  155.             }
  156.  
  157.             if (val) SetControlValue((ControlHandle)itemHndl, val);
  158.         }
  159.  
  160.         ParamText(zone, machine, userName, timeStamp);
  161.         OutlineDialogItem(dialog, kConfigOK);
  162.  
  163.         for (option = 0;;) {
  164.  
  165.             SetPort(dialog);
  166.             if (!configFilterUPP)
  167.                 configFilterUPP = NewModalFilterProc (configFilter);
  168.             ModalDialog(configFilterUPP, &item);
  169.  
  170.             if (item == kConfigOK) {
  171.  
  172.                 docPtr = &((*frHndl)->doc);
  173.                 docPtr->compMovesWhite = newConfig.compMovesWhite;
  174.                 docPtr->compMovesBlack = newConfig.compMovesBlack;
  175.                     /* This is between us and us. */
  176.  
  177.                 docPtr->doSpeech = newConfig.doSpeech;
  178.  
  179.                 if (timeChange) {
  180.                     for (i = 0; i < 2; ++i) {
  181.                         if (option) {
  182.                             if (newConfig.timeLeft[i] == -1)
  183.                                 docPtr->freezeTime[i] = docPtr->timeLeft[i];
  184.                             else
  185.                                 newConfig.timeLeft[i] = docPtr->freezeTime[i];
  186.                         }
  187.                         else docPtr->freezeTime[i] = -1;
  188.                         docPtr->displayTime[i] = newConfig.defaultTime[i];
  189.                         docPtr->defaultTime[i] = newConfig.defaultTime[i];
  190.                         docPtr->timeLeft[i]    = newConfig.timeLeft[i];
  191.                     }
  192.                     (*frHndl)->doc.timerRefTick = TickCount();
  193.                     UpdateGameStatus(frHndl);
  194.                     SendMssg(frHndl, kTimeMssg);
  195.                     DrawTime(frHndl);
  196.                 }
  197.  
  198.                 if (colorChange)
  199.                     SendMssg(frHndl, newConfig.myColor);
  200.  
  201.                 break;
  202.             }
  203.  
  204.             if (item == kConfigCancel) break;
  205.  
  206.             GetDialogItem(dialog, item, &userItemType, &itemHndl, &userItemRect);
  207.             switch (item) {
  208.                 case kPlayWhite:
  209.                 case kPlayBlack:
  210.                     if (!GetControlValue((ControlHandle)itemHndl)) {
  211.                         colorChange = true;
  212.                         SetControlValue((ControlHandle)itemHndl, true);
  213.                         GetDialogItem(dialog, (kPlayWhite + kPlayBlack) - item,
  214.                                  &userItemType, &itemHndl, &userItemRect);
  215.                         SetControlValue((ControlHandle)itemHndl, false);
  216.                         newConfig.myColor ^= 1;
  217.                     }
  218.                     break;
  219.                 case kCompWhite:
  220.                 case kCompBlack:
  221.                     val = (GetControlValue((ControlHandle)itemHndl) ^ 1);
  222.                     SetControlValue((ControlHandle)itemHndl, val);
  223.                     if (item == kCompWhite)
  224.                         newConfig.compMovesWhite = val;
  225.                     else
  226.                         newConfig.compMovesBlack = val;
  227.                     break;
  228.                 case kTimerToggle:
  229.                     option = gOption;
  230.                     timeChange = true;
  231.                     val = (GetControlValue((ControlHandle)itemHndl) ^ 1);
  232.                     SetControlValue((ControlHandle)itemHndl, val);
  233.                     if (val) {
  234.                         for (i = 0; i < 2; ++i)
  235.                             newConfig.timeLeft[i] = newConfig.displayTime[i] =
  236.                                 newConfig.defaultTime[i];
  237.                     }
  238.                     else {
  239.                         for (i = 0; i < 2; ++i)
  240.                             newConfig.timeLeft[i] = -1;
  241.                     }                        
  242.                     for (item = kWhiteClock; item <= kBlackClock; ++item)
  243.                         DoConfigureGameProc(dialog, item);
  244.                     break;
  245.                 case kWhiteClock:
  246.                 case kBlackClock:
  247.                     if (newConfig.timeLeft[0] == -1) break;
  248.  
  249.                     userItemRect.right  -= 2;
  250.                     userItemRect.bottom -= 2;
  251.                         /* Don't include the drop shadow in hit area. */
  252.  
  253.                     part = 0;
  254.                     tick = TickCount();
  255.  
  256.                     GetMouse(&mouseLoc);
  257.                     if (PtInRect(mouseLoc, &userItemRect)) {
  258.                         if (mouseLoc.h < userItemRect.left + 16) {
  259.                             userItemRect.right = userItemRect.left + 16;
  260.                             part = 1;
  261.                         }
  262.                         else {
  263.                             if (mouseLoc.h > userItemRect.right - 16) {
  264.                                 userItemRect.left = userItemRect.right - 16;
  265.                                 part = 3;
  266.                             }
  267.                         }
  268.                         if (part) {
  269.                             if (mouseLoc.v > userItemRect.top + 12) {
  270.                                 ++part;
  271.                                 userItemRect.top += 12;
  272.                             }
  273.                             else
  274.                                 userItemRect.bottom = userItemRect.top + 12;
  275.                         }
  276.                     }
  277.                     if (!PtInRect(mouseLoc, &userItemRect)) part = 0;
  278.                         /* After calculating which rect we are supposed to be in,
  279.                         ** make sure we are actually in it.  (We might not be.) */
  280.  
  281.                     do {
  282.                         GetMouse(&mouseLoc);
  283.                         if (PtInRect(mouseLoc, &userItemRect)) {
  284.                             if (part) {
  285.                                 timeChange = true;
  286.                                 defaultTime = newConfig.defaultTime[item - kWhiteClock];
  287.                                 if (part >= 3) {
  288.                                     defaultMinutes = defaultTime;
  289.                                     defaultTime /= 216000L;
  290.                                     defaultTime *= 216000L;
  291.                                     defaultMinutes -= defaultTime;
  292.                                 }
  293.                             }
  294.                             switch (part) {
  295.                                 case 1:
  296.                                     iconNum[0] = rConfigBase + 3;
  297.                                     defaultTime += 216000L;
  298.                                     if (defaultTime >= (216000L * 4))
  299.                                         defaultTime -= (216000L * 4);
  300.                                     if (!defaultTime)
  301.                                         defaultTime = 216000L;
  302.                                     break;
  303.                                 case 2:
  304.                                     iconNum[0] = rConfigBase + 4;
  305.                                     defaultTime -= 216000L;
  306.                                     if (defaultTime < 0)
  307.                                         defaultTime += (216000L * 4);
  308.                                     if (!defaultTime)
  309.                                         defaultTime = (216000L * 3);
  310.                                     break;
  311.                                 case 3:
  312.                                     iconNum[2] = rConfigBase + 5;
  313.                                     defaultMinutes += 3600;
  314.                                     if (defaultMinutes >= 216000L)
  315.                                         defaultMinutes -= 216000L;
  316.                                     defaultTime += defaultMinutes;
  317.                                     if (!defaultTime)
  318.                                         defaultTime = 3600;
  319.                                     break;
  320.                                 case 4:
  321.                                     iconNum[2] = rConfigBase + 6;
  322.                                     defaultMinutes -= 3600;
  323.                                     if (defaultMinutes < 0)
  324.                                         defaultMinutes += 216000L;
  325.                                     defaultTime += defaultMinutes;
  326.                                     if (!defaultTime)
  327.                                         defaultTime = (216000L - 3600);
  328.                                     break;
  329.                             }
  330.                         }
  331.                         if (part) {
  332.                             newConfig.defaultTime[item - kWhiteClock] = defaultTime;
  333.                             for (i = 0; i < 2; ++i)
  334.                                 newConfig.timeLeft[i] = newConfig.displayTime[i] =
  335.                                     newConfig.defaultTime[i];
  336.                             DoConfigureGameProc(dialog, item);
  337.                             iconNum[0] = rConfigBase;
  338.                             iconNum[2] = rConfigBase + 2;
  339.                         }
  340.  
  341.                         while ((StillDown()) && (tick + 30 > TickCount())) {};
  342.                         tick += 3;
  343.  
  344.                     } while (StillDown());
  345.  
  346.                     DoConfigureGameProc(dialog, item);
  347.                     break;
  348.  
  349.                 case kSpeech:
  350.                     val = (GetControlValue((ControlHandle)itemHndl) ^ 1);
  351.                     SetControlValue((ControlHandle)itemHndl, val);
  352.                     newConfig.doSpeech = val;
  353.                     break;
  354.             }
  355.         }
  356.         DisposeDialog(dialog);
  357.     }
  358.  
  359.     SetPort(oldPort);
  360. }
  361.  
  362.  
  363.  
  364. /*****************************************************************************/
  365.  
  366.  
  367.  
  368. #pragma segment Config
  369. pascal void    DoConfigureGameProc(DialogPtr dialog, short userItem)
  370. {
  371.     short            userItemType;
  372.     Handle            userProc;
  373.     Rect            userItemRect;
  374.     Rect            clockRect;
  375.     short            i, time[3];
  376.     unsigned long    defaultTime;
  377.     Handle            clockPart;
  378.     RgnHandle        oldClip, newClip, textClip;
  379.     Str32            pstr;
  380.     Boolean            timed;
  381.  
  382.     GetDialogItem(dialog, userItem, &userItemType, &userProc, &userItemRect);
  383.     if (userItem < kWhiteClock) {
  384.         PenPat((ConstPatternParam)&qd.gray);
  385.         FrameRect(&userItemRect);
  386.         PenNormal();
  387.     }
  388.     else {
  389.         timed = (newConfig.timeLeft[0] != -1);
  390.  
  391.         oldClip = NewRgn();
  392.         GetClip(oldClip);
  393.         newClip = NewRgn();
  394.         RectRgn(newClip, &userItemRect);
  395.         SetRectRgn(textClip = NewRgn(),
  396.             userItemRect.left   + 16,
  397.             userItemRect.top    + 2,
  398.             userItemRect.right  - 19,
  399.             userItemRect.bottom - 4);
  400.         if (timed) DiffRgn(newClip, textClip, newClip);
  401.         SetClip(newClip);
  402.  
  403.         clockRect = userItemRect;
  404.         clockRect.right  = clockRect.left + 32;
  405.         clockRect.bottom = clockRect.top  + 32;
  406.         for (i = 0; i < 3; ++i) {
  407.             clockPart = GetResource('ICN#', iconNum[i]);
  408.             if (clockPart)
  409.                 PlotIcon(&clockRect, clockPart);
  410.             OffsetRect(&clockRect, 24, 0);
  411.         }
  412.  
  413.         if (timed) {
  414.             SetClip(textClip);
  415.             TextMode(srcCopy);
  416.             defaultTime = newConfig.defaultTime[userItem - kWhiteClock];
  417.             for (i = 3; i;) {
  418.                 defaultTime /= 60;
  419.                 time[--i] = defaultTime % 60;
  420.             }
  421.             for (i = 0; i < 2; ++i) {
  422.                 MoveTo(userItemRect.left + 21 + 20 * i, userItemRect.top + 15);
  423.                 pcpydec(pstr, time[i]);
  424.                 if (pstr[0] == 1) DrawChar('0');
  425.                 DrawString(pstr);
  426.                 DrawChar(": "[i]);
  427.             }
  428.             TextMode(srcOr);
  429.         }
  430.  
  431.         SetClip(oldClip);
  432.         DisposeRgn(oldClip);
  433.         DisposeRgn(newClip);
  434.         DisposeRgn(textClip);
  435.     }
  436. }
  437.  
  438.  
  439.  
  440. /*****************************************************************************/
  441.  
  442.  
  443.  
  444. #pragma segment Config
  445. pascal Boolean    configFilter(DialogPtr dlg, EventRecord *event, short *item)
  446. {
  447.     static unsigned long    lastIdle;
  448.  
  449.     gOption = (event->modifiers) & optionKey;
  450.  
  451.     if (KeyEquivFilter(dlg, event, item))
  452.         return(true);
  453.  
  454.     if (lastIdle + 30 < TickCount()) {
  455.         lastIdle = TickCount();
  456.         DoIdleTasks(false);
  457.         SetPort(dlg);
  458.     }
  459.  
  460.     return(false);
  461. }
  462.  
  463.  
  464.  
  465.