home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 April: Mac OS SDK / Dev.CD Apr 96 SDK / Dev.CD Apr 96 SDK1.toast / Development Kits (Disc 1) / OpenDoc Development Framework / ODFDev / ODF / OS / FWOSMisc / Sources / FWAlert.cpp next >
Encoding:
Text File  |  1995-11-08  |  9.1 KB  |  399 lines  |  [TEXT/MPS ]

  1. //========================================================================================
  2. //
  3. //    File:                FWAlert.cpp
  4. //    Release Version:    $ 1.0d11 $
  5. //
  6. //    Copyright:    © 1993, 1995 by Apple Computer, Inc., all rights reserved.
  7. //
  8. //========================================================================================
  9.  
  10. #include "FWOS.hpp"
  11.  
  12. #ifndef FWALERT_H
  13. #include "FWAlert.h"
  14. #endif
  15.  
  16. #ifndef FWRESOUR_H
  17. #include "FWResour.h"
  18. #endif
  19.  
  20. // ----- Macintosh Includes -----
  21.  
  22. #if defined(FW_BUILD_MAC) && !defined(__OSUTILS__)
  23. #include <OSUtils.h>
  24. #endif
  25.  
  26. #if defined(FW_BUILD_MAC) && !defined(__TEXTUTILS__)
  27. #include <TextUtils.h>
  28. #endif
  29.  
  30. #if defined(FW_BUILD_MAC) && !defined(__ICONS__)
  31. #include <Icons.h>
  32. #endif
  33.  
  34. #if defined(FW_BUILD_MAC) && !defined(__DIALOGS__)
  35. #include <Dialogs.h>
  36. #endif
  37.  
  38. //========================================================================================
  39. //    Runtime Informations
  40. //========================================================================================
  41.  
  42. #if FW_LIB_EXPORT_PRAGMAS
  43. #pragma lib_export on
  44. #endif
  45.  
  46. #ifdef FW_BUILD_MAC    
  47. #pragma segment fwosmisc
  48. #endif
  49.  
  50. //========================================================================================
  51. //    Globales
  52. //========================================================================================
  53.  
  54. #ifdef FW_BUILD_MAC    
  55. short FW_CAlert::gOkItemId = 0;
  56. short FW_CAlert::gCancelItemId = 0;
  57. #endif
  58.  
  59. #ifdef FW_BUILD_MAC    
  60. //========================================================================================
  61. //    MacAlertDialogFilter
  62. //========================================================================================
  63.  
  64. pascal Boolean FW_CAlert::MacAlertDialogFilter(DialogPtr theDialog, 
  65.                                             EventRecord * theEvent, 
  66.                                             short *itemHit)
  67. {
  68.     Boolean result = FALSE;
  69.  
  70.     switch (theEvent->what)
  71.     {
  72.         case keyDown:
  73.         case autoKey:
  74.             {
  75.                 switch (theEvent->message & charCodeMask)
  76.                 {
  77.                     case '.':
  78.                         if (theEvent->modifiers & cmdKey && gCancelItemId != 0)
  79.                         {
  80.                             result = TRUE;
  81.                             *itemHit = gCancelItemId;
  82.                         }
  83.                         break;
  84.                     
  85.                     case 0x0D:
  86.                     case 0x03:
  87.                         result = TRUE;
  88.                         *itemHit = gOkItemId;
  89.                         break;
  90.                     
  91.                     case 0x1B:
  92.                         if (gCancelItemId != 0)
  93.                         {
  94.                             result = TRUE;
  95.                             *itemHit = gCancelItemId;
  96.                         }
  97.                         break;                
  98.                 }
  99.                 
  100.                 if (result)        // flash the button
  101.                 {
  102.                     long     theTick;
  103.                     short     itemType;
  104.                     Handle     hItem;
  105.                     Rect    box;
  106.                     
  107.                     ::GetDialogItem(theDialog, *itemHit, &itemType, &hItem, &box);
  108.                     ::HiliteControl((ControlHandle)hItem, 1);
  109.                     ::Delay(6,&theTick);
  110.                     ::HiliteControl((ControlHandle)hItem, 0);            
  111.                 }
  112.             }
  113.             break;
  114.         
  115.         case updateEvt:
  116.             if (theDialog == (DialogPtr)theEvent->message)
  117.             {
  118.                 PenState     ps;
  119.                 Rect        box;
  120.                 Handle        handle;
  121.                 short        type;
  122.                 
  123.                 ::SetPort(theDialog);
  124.                 ::GetPenState(&ps);
  125.                 ::PenSize(3, 3);
  126.                 ::GetDialogItem(theDialog, gOkItemId, &type, &handle, &box);
  127.                 ::InsetRect(&box, -4, -4);
  128.                 ::FrameRoundRect(&box, 16, 16);
  129.                 ::SetPenState(&ps);
  130.             }
  131.             break;
  132.     }
  133.  
  134.     return result;
  135. }
  136. #endif
  137.  
  138. #ifdef FW_BUILD_MAC
  139. //----------------------------------------------------------------------------------------
  140. //    MacSetButtonText
  141. //----------------------------------------------------------------------------------------
  142.  
  143. static void MacSetButtonText(DialogPtr dialog, short buttonId, Str32 text, FW_Boolean moveButton)
  144. {
  145.     Rect             rect;
  146.     short             type;
  147.     Handle             handle;
  148.  
  149.     ::GetDialogItem(dialog, buttonId, &type, &handle, &rect);
  150.     if (text[0] != 0)
  151.     {
  152.         ::SetControlTitle(ControlHandle(handle), text);
  153.         if (moveButton)
  154.         {
  155.             ::OffsetRect(&rect, 10, 0);
  156.             ::SetDialogItem(dialog, buttonId, type, handle, &rect);
  157.             ::MoveControl(ControlHandle(handle), rect.left, rect.top);
  158.         }
  159.  
  160.     }
  161.     else
  162.     {
  163.         ::HideControl(ControlHandle(handle));
  164.     }
  165. }
  166. #endif
  167.  
  168. //----------------------------------------------------------------------------------------
  169. //    FW_CAlert::DoAlert
  170. //----------------------------------------------------------------------------------------
  171. FW_AlertResult FW_CAlert::DoAlert(const FW_CString& documentName,
  172.                                 const FW_CString& message,
  173.                                 FW_ButtonType buttonType,
  174.                                 FW_IconType iconType,
  175.                                 FW_DefaultButton defaultButton,
  176.                                 FW_Boolean beep)
  177. {        
  178. #ifdef FW_BUILD_WIN
  179.     UINT dialogFlags = buttonType | iconType | defaultButton | MB_TASKMODAL;
  180.     dialogFlags ^= dialogFlags & MB_SYSTEMMODAL;
  181.     
  182.     // ::MessageBox() doesn't work if mouse capturing is active,
  183.     //  so we release the capture (if any) and then restore it
  184.  
  185.     const HWND hwndCapture = ::GetCapture();
  186.  
  187.     if (hwndCapture != NULL)
  188.         ::ReleaseCapture();
  189.     
  190.     if (beep)
  191.         ::MessageBeep(-1);
  192.     
  193.     short result = ::MessageBox(NULL, message, documentName, dialogFlags);
  194.  
  195.     // Set mouse capture to the window that had it
  196.     if (hwndCapture != 0)
  197.         ::SetCapture(hwndCapture);
  198.  
  199.     return result;
  200. #endif
  201.  
  202. #ifdef FW_BUILD_MAC
  203. #define kDialogID 500
  204. // ----- dialog item ids
  205. #define kButton1Id     1
  206. #define kButton2Id    2
  207. #define kButton3Id     3
  208. #define    kMessageId    4
  209. #define    kIconId        5
  210.  
  211.     // ----- Open create the dialog (can't do exception here because used to display exception messages)
  212.     DialogPtr         dlg;
  213.     {
  214.         FW_CAcquireCFMResourceAccess a;
  215.         dlg = ::GetNewDialog(kDialogID, NULL, WindowPtr(-1));
  216.     }
  217.     Rect             rect;
  218.     short             type;
  219.     Handle             handle;
  220.     
  221.     ::GetDialogItem(dlg, kMessageId, &type, &handle, &rect);
  222.     Str255 str;
  223.     message.ExportPascal(str);
  224.     ::SetDialogItemText(handle, str);
  225.  
  226.     Str32 but1, but2, but3;
  227.     but1[0] = 0;
  228.     but2[0] = 0;
  229.     but3[0] = 0;
  230.     short items[3];
  231.  
  232.     FW_Boolean moveButton = FALSE;
  233.     
  234.     switch (buttonType)
  235.     {
  236.         case FW_kOK:
  237.             {
  238.                 FW_CAcquireCFMResourceAccess a;
  239.                 ::GetIndString(but1, kDialogID, 1);        // OK
  240.                 gOkItemId = 1;
  241.                 gCancelItemId = 0;
  242.                 items[0] = FW_kOKButtonPressed;
  243.                 break;
  244.             }
  245.         case FW_kOKCancel:
  246.             {
  247.                 FW_CAcquireCFMResourceAccess a;
  248.                 ::GetIndString(but1, kDialogID, 1);        // OK
  249.                 ::GetIndString(but2, kDialogID, 2);        // Cancel
  250.                 if (defaultButton == FW_kDefaultButton2)
  251.                 {
  252.                     gCancelItemId = 0;
  253.                     gOkItemId = 2;
  254.                 }
  255.                 else
  256.                 {
  257.                     gOkItemId = 1;
  258.                     gCancelItemId = 2;
  259.                 }
  260.                 items[0] = FW_kOKButtonPressed;
  261.                 items[1] = FW_kCancelButtonPressed;
  262.                 break;
  263.             }
  264.         case FW_kAbortRetryIgnore:
  265.             {
  266.                 FW_CAcquireCFMResourceAccess a;
  267.                 ::GetIndString(but1, kDialogID, 3);        // Abort
  268.                 ::GetIndString(but2, kDialogID, 4);        // Retry
  269.                 ::GetIndString(but3, kDialogID, 5);        // Ignore
  270.                 gOkItemId = defaultButton + 1;
  271.                 gCancelItemId = 0;
  272.                 items[0] = FW_kAbortButtonPressed;
  273.                 items[1] = FW_kRetryButtonPressed;
  274.                 items[2] = FW_kIgnoreButtonPressed;
  275.                 break;
  276.             }
  277.         case FW_kYesNoCancel:
  278.             {
  279.                 FW_CAcquireCFMResourceAccess a;
  280.                 ::GetIndString(but1, kDialogID, 6);        // Yes
  281.                 ::GetIndString(but2, kDialogID, 7);        // No
  282.                 ::GetIndString(but3, kDialogID, 2);        // Cancel
  283.                 if (defaultButton == FW_kDefaultButton1)
  284.                 {
  285.                     gOkItemId = 1;
  286.                     gCancelItemId = 3;
  287.                 }
  288.                 else if (defaultButton == FW_kDefaultButton2)
  289.                 {
  290.                     gOkItemId = 2;
  291.                     gCancelItemId = 3;
  292.                 }
  293.                 else
  294.                 {
  295.                     // I can't decide if Esc means Yes or No
  296.                     gOkItemId = 3;
  297.                     gCancelItemId = 0;
  298.                 }
  299.                 items[0] = FW_kYesButtonPressed;
  300.                 items[1] = FW_kNoButtonPressed;
  301.                 items[2] = FW_kCancelButtonPressed;
  302.                 moveButton = TRUE;
  303.                 break;
  304.             }
  305.         case FW_kYesNo:
  306.             {
  307.                 FW_CAcquireCFMResourceAccess a;
  308.                 ::GetIndString(but1, kDialogID, 6);        // Yes
  309.                 ::GetIndString(but2, kDialogID, 7);        // No
  310.                 gCancelItemId = 0;
  311.                 if (defaultButton == FW_kDefaultButton2)
  312.                     gOkItemId = 2;
  313.                 else
  314.                     gOkItemId = 1;
  315.                 items[0] = FW_kYesButtonPressed;
  316.                 items[1] = FW_kNoButtonPressed;
  317.                 break;
  318.             }
  319.         case FW_kRetryCancel:
  320.             {
  321.                 FW_CAcquireCFMResourceAccess a;
  322.                 ::GetIndString(but1, kDialogID, 4);        // Retry
  323.                 ::GetIndString(but2, kDialogID, 2);        // Cancel
  324.                 if (defaultButton == FW_kDefaultButton2)
  325.                 {
  326.                     gCancelItemId = 0;
  327.                     gOkItemId = 2;
  328.                 }
  329.                 else
  330.                 {
  331.                     gOkItemId = 1;
  332.                     gCancelItemId = 2;
  333.                 }
  334.                 items[0] = FW_kRetryButtonPressed;
  335.                 items[1] = FW_kCancelButtonPressed;
  336.                 break;
  337.             }
  338.         default:
  339.             FW_ASSERT(0);                            // unknown dialogFlags
  340.             break;
  341.     }
  342.  
  343.     MacSetButtonText(dlg, kButton1Id, but1, FALSE);
  344.     MacSetButtonText(dlg, kButton2Id, but2, moveButton);
  345.     MacSetButtonText(dlg, kButton3Id, but3, FALSE);
  346.         
  347.     // ----- Icons
  348.     Handle hIcon = NULL;
  349.     switch (iconType)
  350.     {
  351.         case FW_kStopAlert:
  352.             hIcon = ::GetIcon(stopIcon);
  353.             break;
  354.         
  355.         case FW_kCautionAlert:
  356.             hIcon = ::GetIcon(cautionIcon);
  357.             break;
  358.         
  359.         case FW_kNoteAlert:
  360.             hIcon = ::GetIcon(noteIcon);
  361.             break;
  362.     };
  363.     
  364.     ::GetDialogItem(dlg, kIconId, &type, &handle, &rect);
  365.     if (hIcon)
  366.     {
  367.         ::SetDialogItem(dlg, kIconId, type, hIcon, &rect);
  368.     }
  369.     else
  370.     {
  371.         ::GetDialogItem(dlg, kIconId, &type, &handle, &rect);
  372.         short left = rect.left;
  373.         ::OffsetRect(&rect, 1000, 0);
  374.         ::SetDialogItem(dlg, kIconId, type, hIcon, &rect);
  375.         
  376.         ::GetDialogItem(dlg, kMessageId, &type, &handle, &rect);
  377.         rect.left = left;
  378.         ::SetDialogItem(dlg, kMessageId, type, handle, &rect);        
  379.     }
  380.         
  381.     if (beep)
  382.         ::SysBeep(16);
  383.  
  384.     ::ShowWindow(dlg);
  385.     
  386.     short item;
  387.     ModalFilterUPP filterProc = NewModalFilterProc(&MacAlertDialogFilter);
  388.     do
  389.     {
  390.         ::ModalDialog(filterProc, &item);
  391.     } while (item <kButton1Id || item > kButton3Id);
  392.     DisposeRoutineDescriptor(filterProc);
  393.     
  394.     ::DisposeDialog(dlg);
  395.  
  396.     return (items[item - 1]);
  397. #endif
  398. }
  399.