home *** CD-ROM | disk | FTP | other *** search
/ Carousel / CAROUSEL.cdr / mactosh / code / p_dilogm.sit < prev    next >
Text File  |  1988-06-20  |  28KB  |  1,150 lines

  1. 18-Jun-88 14:27:27-MDT,29426;000000000000
  2. Return-Path: <u-lchoqu%sunset@cs.utah.edu>
  3. Received: from cs.utah.edu by SIMTEL20.ARPA with TCP; Sat, 18 Jun 88 14:26:49 MDT
  4. Received: by cs.utah.edu (5.54/utah-2.0-cs)
  5.     id AA22114; Sat, 18 Jun 88 14:26:49 MDT
  6. Received: by sunset.utah.edu (5.54/utah-2.0-leaf)
  7.     id AA24544; Sat, 18 Jun 88 14:26:44 MDT
  8. Date: Sat, 18 Jun 88 14:26:44 MDT
  9. From: u-lchoqu%sunset@cs.utah.edu (Lee Choquette)
  10. Message-Id: <8806182026.AA24544@sunset.utah.edu>
  11. To: rthum@simtel20.arpa
  12. Subject: DialogMgrDA.p.shar
  13.  
  14. #! /bin/sh
  15. #
  16. # This is a shell archive.  Save this into a file, edit it
  17. # and delete all lines above this comment.  Then give this
  18. # file to sh by executing the command "sh file".  The files
  19. # will be extracted into the current directory owned by
  20. # you with default permissions.
  21. #
  22. # The files contained herein are:
  23. #
  24. #    9 DialogMgrDA.doc
  25. #   15 DialogMgrDA.p
  26. #    1 DialogMgrDA.r
  27. #    1 Example
  28. #
  29. echo 'Extracting DialogMgrDA.doc'
  30. if test -f DialogMgrDA.doc; then echo 'shar: will not overwrite DialogMgrDA.doc'; else
  31. sed 's/^X//' << '________This_Is_The_END________' > DialogMgrDA.doc
  32. X
  33. X
  34. XDialogManager DA                                      
  35. X     DialogManager DA
  36. X
  37. X
  38. X
  39. X
  40. X
  41. XWhy Dialog Manager?
  42. X
  43. X
  44. X
  45. XThis document is the result of a couple of weeks work preparing a
  46. Xpresentation on desk accessories for the November '86 meeting of the
  47. XMACincinnati Hacker Group. It is a DA shell in TML Pascal the fields typical
  48. Xevents that occur for a DA and executes most of its functions using the dialog
  49. Xmanager. It has a 'draggable' window, radio buttons, text boxes, a menu, and
  50. Xbuttons, buttons, buttons. It shows how to put up ModalDialogs without
  51. Xreentrancy problems, use global data, and handle activate/deactivate calls.
  52. XAnd it shows you three ways to close a DA.
  53. X
  54. X
  55. X
  56. XIts only 'features' are to multiply two integers and adjust your Mac clock to
  57. XDaylight Savings Time...
  58. X
  59. X
  60. X
  61. X
  62. X
  63. XContained in this .pit file should be:
  64. X
  65. X    DialogManager.Doc            this MacWrite file.
  66. X
  67. X    DialogManager.acc            the executable desk accessory file.
  68. X
  69. X    DialogManagerDA.Pas            the Pascal source code.
  70. X
  71. X    DialogManagerDA.R            the RMaker source code.
  72. X
  73. X    DialogManagerDA.resed        the resource file, created with ResEdit.
  74. X
  75. X
  76. X
  77. XThese files were created and compiled in an HFS folder named 'Development'
  78. Xon a volume (disk) named '20Meg'. In order to compile them you'll need version
  79. X2.0 of TML Pascal, RMaker, and the TML Linker. You will also need a USES file
  80. Xnamed 'MacIntf' in the 'Development' folder. You may use a different folder
  81. Xarrangement than I have used, but you'll have to insert your own paths in the
  82. Xproper places in the .Pas and .R files.
  83. X
  84. X
  85. X
  86. XI would welcome all questions and comments.
  87. X
  88. X
  89. X
  90. X
  91. X
  92. X
  93. X
  94. XBill Johnson
  95. X
  96. XMacCincinnati Hacker Group
  97. X
  98. XCompuserve: 72257,2064
  99. X
  100. XGEnie: W Johnson
  101. X
  102. XMacCincinnatus BBS: (606) 572-5375
  103. X
  104. X
  105. X
  106. X
  107. X
  108. XMain Data Structures                                 
  109. X      DialogManager DA
  110. X
  111. X
  112. X
  113. XTYPE
  114. X
  115. X    DAGlobals = record            { Global data. Store a handle to it in Device.dctlStorage }
  116. X        Finished :    boolean;
  117. X
  118. X         ButtonNo :    longint;
  119. X
  120. X         Number:        longint;
  121. X
  122. X         NoText :        longint;
  123. X
  124. X         menuHand :    menuHandle;
  125. X
  126. X         StringArray :    array[1..NoStrings] of str25;
  127. X    end; 
  128. X
  129. X
  130. X
  131. X    DeviceControlRec = record        {replace predefined DCtlEntry record in interface files }
  132. X        dCtlDriver     : Handle;
  133. X
  134. X         dCtlFlags     : Integer;
  135. X
  136. X         dCtlQueue     : Integer; 
  137. X
  138. X        dCtlQhead     : Lptr; 
  139. X
  140. X        dCtlQtail     : Lptr;
  141. X
  142. X         dCtlPosition     : longint;
  143. X
  144. X         dCtlStorage     : DAGlobalsH;    {define as handle to global data}
  145. X        dCtlRefNum     : integer;
  146. X
  147. X         dCtlCurTicks : longint; 
  148. X
  149. X        dCtlWindow     : GrafPtr;
  150. X
  151. X         dCtlDelay    : integer;
  152. X
  153. X         dCtlEmask    : integer;
  154. X
  155. X         dCtlMenu    : integer;
  156. X
  157. X     end; 
  158. X
  159. X
  160. X
  161. X
  162. X
  163. XProcedures and Functions                           
  164. X     
  165. X
  166. XDescription/Dependencies
  167. X
  168. X
  169. X
  170. X
  171. X
  172. XLow-Level Dialog Procedures
  173. X
  174. XPROCEDURE ItemActivate (theDialog : DialogPtr; ItemNo, HiliteMode : integer);
  175. X
  176. X    ==Used to activate, deactivate, and hilite buttons==
  177. X
  178. X
  179. X
  180. XPROCEDURE SetRadioButton (theDialog: DialogPtr; ItemNo, ChkMark : integer);
  181. X
  182. X    ==Used to, well, set radio buttons==
  183. X
  184. X
  185. X
  186. XFUNCTION GetTxtValue (theDialog : DialogPtr; ItemNo : Integer): longint;
  187. X
  188. X    ==returns the numeric value of a textbox. Textbox must only contain integers==
  189. X
  190. X
  191. X
  192. X
  193. X
  194. XDrawing Procedures
  195. X
  196. XPROCEDURE HiliteDefButton (theDialog: DialogPtr);
  197. X
  198. X    ==Draw the hiliting around the default button==
  199. X
  200. X
  201. X
  202. XPROCEDURE DrawEText (VAR DataRec: DAGlobals);
  203. X
  204. X    ==Draws user-entered text in the dialog window==
  205. X
  206. X
  207. X
  208. XPROCEDURE DitlText(VAR DataRec: DAGlobals);
  209. X
  210. X    ==Draws text for the DA after the Dialog Mgr is done==
  211. X
  212. X    ==Calls: DrawEText();==
  213. X
  214. X
  215. X
  216. XPROCEDURE DitlLines;    
  217. X
  218. X    ==draw dotted lines in main window==
  219. X
  220. X
  221. X
  222. X
  223. X
  224. XSetup Procedure
  225. X
  226. XPROCEDURE InitDlogStatus(VAR device: DeviceControlRec);
  227. X
  228. X    ==set buttons, cursor location, and initialize variables==
  229. X
  230. X
  231. X
  232. X
  233. X
  234. XModalDialog Procedures
  235. X
  236. XPROCEDURE DoAbout (DlogID    : longint);
  237. X
  238. X    ==put up the About Box, or the Command key dialog==
  239. X
  240. X
  241. X
  242. XPROCEDURE EnterText ( VAR Device: DeviceControlRec);
  243. X
  244. X    ==put up modaldialog to accept text input in response to selection of the ICON==
  245. X
  246. X
  247. X
  248. X
  249. X
  250. XActivate, Deactivate, Update Procedures
  251. X
  252. XPROCEDURE UpdateDA(VAR device: DeviceControlRec);
  253. X
  254. X    ==field Update calls, draw the window contents==
  255. X
  256. X    ==Calls: DitlLines(); DitlText(); HiliteDefButton(); ==
  257. X
  258. X
  259. X
  260. XPROCEDURE DAactivate(VAR device: DeviceControlRec);
  261. X
  262. X    ==activate call, put menu on the menu bar==
  263. X
  264. X
  265. X
  266. XPROCEDURE DAdeactivate(VAR device: DeviceControlRec);
  267. X
  268. X    ==deactivate call, remove menu from the menu bar==
  269. X
  270. X
  271. X
  272. X
  273. X
  274. XButton Procedures
  275. X
  276. XPROCEDURE CtlRadioButtons (VAR Device : DeviceControlRec; WhichButton : integer);
  277. X
  278. X    ==Manage the three radio buttons in the main dialog window==
  279. X
  280. X    ==Call: SetRadioButton ();==
  281. X
  282. X
  283. X
  284. XPROCEDURE DoDefButton(VAR Device: DeviceControlRec);
  285. X
  286. X    ==Enable the Reset button & multiply the contents of the text boxes==
  287. X
  288. X    ==Call: GetTxtValue ();==
  289. X
  290. X
  291. X
  292. XPROCEDURE DoResetButton(VAR Device: DeviceControlRec);
  293. X
  294. X    ==Clear and redraw the window==
  295. X
  296. X
  297. X
  298. XPROCEDURE DoTimeButton(VAR Device: DeviceControlRec);
  299. X
  300. X    ==Put up Alert and set the clock chip ahead or back an hour==
  301. X
  302. X
  303. X
  304. X
  305. X
  306. XEvent Procedures
  307. X
  308. XPROCEDURE doKeyEvent (VAR Device: DeviceControlRec; EventPtr : EventPointer);
  309. X
  310. X    ==Handle all keyboard events from here==
  311. X
  312. X    ==Call: CtlRadioButtons (); DoResetButton(); DoTimeButton(); DoDefButton();==
  313. X
  314. X
  315. X
  316. XPROCEDURE Event(VAR Device : DeviceControlRec; VAR Block : ParamBlockRec);
  317. X
  318. X    ==Handle _all_ events passed to the desk accessory==
  319. X
  320. X    ==Call: DoDefButton(); DoAbout(); DoResetButton(); DoTimeButton(); CtlRadioButtons ();==
  321. X
  322. X    ==Call: doKeyEvent(); UpdateDA(); DAactivate(); DAdeactivate();==
  323. X
  324. X
  325. X
  326. X
  327. X
  328. XOPEN Procedure
  329. X
  330. XPROCEDURE Open(VAR Device    : DeviceControlRec; VAR Block : ParamBlockRec); 
  331. X
  332. X    ==Create  main window, allocate globals, set WindowKind field, initialize variables, get Menu handle==
  333. X
  334. X    ==Call: InitDlogStatus();==
  335. X
  336. X
  337. X
  338. X
  339. X
  340. XCONTROL Procedure
  341. X
  342. XPROCEDURE Ctl(VAR Device : DeviceControlRec; VAR Block   : ParamBlockRec); 
  343. X
  344. X    ==Handle all calls made to the desk accessory - accEvent, accRun, accMenu==
  345. X
  346. X    ==Call: Event(); DoAbout();==
  347. X
  348. X
  349. X
  350. X
  351. X
  352. XCLOSE Procedure
  353. X
  354. XPROCEDURE Close(VAR Device: DeviceControlRec; VAR Block  : ParamBlockRec); 
  355. X
  356. X    ==Remove menu, dispose of window, dispose of globals, release Menu handle, set driver purgeable==
  357. X
  358. X    ==Call: DAdeactivate();==
  359. X
  360. X
  361. X
  362. X
  363. X
  364. XNo Main Procedure Allowed
  365. X
  366. X
  367. X
  368. X
  369. X
  370. X
  371. X
  372. XOwned Resources                                       
  373. X      
  374. X
  375. X
  376. X
  377. XA desk accessory can have its own resources. But in order for those resources to be moved by the
  378. XFont/DA Mover, and avoid conflicts with other resources in the System file (the final destination of
  379. Xall desk accessories) they must have resource ID numbers within a designated range; 32 resource ID
  380. Xper DA starting at $C000.
  381. X
  382. X
  383. X
  384. XOwned resources can be calculated as follows:
  385. X
  386. X    $C000 + (32 * DRVR ID#)
  387. X
  388. X
  389. X
  390. XSince the DialogManagerDA is assigned the ID number 16,  the owned resources will be in the range
  391. Xof  ($C200 -> $C20F), or  -15872   through   -15857.
  392. X
  393. X
  394. X
  395. X
  396. X
  397. X
  398. X
  399. XResource File                                                          
  400. X
  401. XDialogManagerDA.resed
  402. X
  403. X
  404. X
  405. XThe resources in this file were created with ResEdit. They could all be generated while compiling
  406. Xresources with RMaker  (the same way that the menu resource is), but it's easier to create them
  407. Xwith ResEdit.
  408. X
  409. X
  410. X
  411. X
  412. X
  413. XAlert Templates
  414. X
  415. X
  416. X
  417. XALRT, -15872 (sub ID #0)    Do-nothing alert in response to the Bullseye.
  418. X
  419. XALRT, -15871 (sub ID #1)    Alert for time change, w/ Cancel, Spring, and Fall buttons.
  420. X
  421. X
  422. X
  423. X
  424. X
  425. XDialog Item List
  426. X
  427. X
  428. X
  429. XDITL, -15872 (sub ID #0)    Dialog item list for main window.
  430. X
  431. XDITL, -15871 (sub ID #1)    Dialog item list for the 'About' dialog.
  432. X
  433. XDITL, -15870 (sub ID #2)    Dialog item list for the text entry dialog.
  434. X
  435. XDITL, -15869 (sub ID #3)    Dialog item list for the 'Command Keys' dialog.
  436. X
  437. XDITL, -15868 (sub ID #4)    Dialog item list for the time change alert.
  438. X
  439. XDITL, -15867 (sub ID #5)    Dialog item list for the bullseye alert.
  440. X
  441. X
  442. X
  443. X
  444. X
  445. XDialog Template
  446. X
  447. X
  448. X
  449. XDLOG, -15872 (sub ID #0)    Dialog template for main window.
  450. X
  451. XDLOG, -15871 (sub ID #1)    Dialog template for the text entry dialog.
  452. X
  453. X
  454. X
  455. X
  456. X
  457. XICON
  458. X
  459. X
  460. X
  461. XICON, -15872 (sub ID #0)    Bullseye ICON. Called by the main dialog item list.
  462. X
  463. XICON, -15871 (sub ID #1)    Text entry ICON. Called by the main dialog item list.
  464. X
  465. X
  466. X
  467. XResources                                                                
  468. X
  469. XRMaker
  470. X
  471. X
  472. X
  473. XThe following is the RMaker file for DialogManager DA.
  474. X
  475. XIt's functions are to:
  476. X
  477. X    a) Create an output file DialogManager.acc  with correct TYPE & CREATOR
  478. X
  479. X    b) Convert the .Rel file to DRVR resource & assign it an ID# of 16
  480. X
  481. X    c) Create a MENU resource that is owned by DRVR #16
  482. X
  483. X    d) Copy the resources from the DialogManagerDA.resed file into this file
  484. X
  485. X
  486. X
  487. X
  488. X
  489. X
  490. X
  491. XRMaker File                                                              
  492. X
  493. XDialogManagerDA.R
  494. X
  495. X
  496. X
  497. XNote the pathnames that precede the filenames. All input and output files are in an HFS folder named
  498. X'Development' on a volume named '20Meg'.
  499. X
  500. X
  501. X
  502. X
  503. X
  504. X* DialogManagerDA.R
  505. X
  506. X* Resource File for DialogManagerDA.Pas
  507. X
  508. X
  509. X
  510. X*Output file name and the Type and Creator flags
  511. X
  512. X20Meg:Development:DialogManager.acc
  513. X
  514. XDFILDMOV 
  515. X
  516. X
  517. X
  518. XTYPE DRVR = PROC
  519. X
  520. X  DialogManager DA,16
  521. X
  522. X20Meg:Development:DialogManagerDA
  523. X
  524. X
  525. X
  526. Xtype MENU
  527. X
  528. XDManMENU,-15872
  529. X
  530. XDialogManager;;    menu title
  531. X
  532. XCommand Keys;;\CA    menu1
  533. X
  534. X(-;;        dotted line
  535. X
  536. XAbout...;;    menu3
  537. X
  538. XQuit;;    menu4
  539. X
  540. X
  541. X
  542. XINCLUDE 20Meg:Development:DialogManagerDA.resed
  543. X
  544. X
  545. X
  546. X
  547. X
  548. X
  549. X
  550. ________This_Is_The_END________
  551. if test `wc -l < DialogMgrDA.doc` -ne 520; then
  552.     echo 'shar: DialogMgrDA.doc was damaged during transit'
  553.   echo '      (should have been 520 bytes)'
  554. fi
  555. fi        ; : end of overwriting check
  556. echo 'Extracting DialogMgrDA.p'
  557. if test -f DialogMgrDA.p; then echo 'shar: will not overwrite DialogMgrDA.p'; else
  558. sed 's/^X//' << '________This_Is_The_END________' > DialogMgrDA.p
  559. XPROGRAM   DialogManagerDA;
  560. X
  561. X(* Desk accessory to show the structure of DAs    Beta version 0.9 __ 11/22/86
  562. X    by William S. Johnson, with help from the MACincinnati Hacker Group.
  563. X    Written in TML Pascal, version 2.0
  564. X
  565. XThis desk accessory is a shell you can use to understand the structure of DAs and how to use the Dialog
  566. XManager from a desk accessory. It makes use of buttons, ICONs, radio buttons, text boxes, and does
  567. Xsome drawing of its own. Its most useful feature will adjust your MAC to Daylight Savings Time......*)
  568. X
  569. XUSES MacIntf;
  570. X
  571. XCONST    {dialog item list}
  572. X        DefButton    = 1;        Chk_On        = 1;    {check on/off radio buttons}
  573. X        QuitButton    = 2;        Chk_Off        = 0;
  574. X        AboutButton    = 3;
  575. X        Tbox        = 4;        CNTL_enable    = 0;    {enable controls}
  576. X        TboxII        = 5;        CNTL_disable    = 255;
  577. X        RadioBut1    = 6;
  578. X        RadioBut2    = 7;        NoStrings    = 3;    { # of global strings }
  579. X        RadioBut3    = 8;
  580. X        BullsICON    = 9;
  581. X        TEnterICON    = 10;
  582. X        TimeButton    = 11;
  583. X        ResetButton    = 12;
  584. X
  585. XTYPE
  586. X    EventPointer = ^EventRecord;
  587. X    Lptr = ^longint;
  588. X    str25 = string[25];            { define a short string to consume less global space }
  589. X
  590. X    DAGlobals = record            { Global data. Store a handle to it in Device.dctlStorage }
  591. X        Finished :    boolean;
  592. X        ButtonNo :    longint;
  593. X        Number:        longint;
  594. X        NoText :        longint;
  595. X        menuHand :    menuHandle;
  596. X        StringArray :    array[1..NoStrings] of str25;
  597. X    end;
  598. X
  599. X    DAGlobalsP = ^DAGlobals;        { define handle to DAGlobals record }
  600. X    DAGlobalsH = ^DAGlobalsP;
  601. X
  602. X    DeviceControlRec = record        {replace predefined DCtlEntry record in interface files }
  603. X        dCtlDriver :    Handle;
  604. X        dCtlFlags :    Integer;
  605. X        dCtlQueue :    Integer;
  606. X        dCtlQhead :    Lptr;
  607. X        dCtlQtail :    Lptr;
  608. X        dCtlPosition :    longint;
  609. X        dCtlStorage :    DAGlobalsH;    {define as handle to global data}
  610. X        dCtlRefNum :    integer;
  611. X        dCtlCurTicks :    longint;
  612. X        dCtlWindow :    GrafPtr;
  613. X        dCtlDelay :    integer;
  614. X        dCtlEmask :    integer;
  615. X        dCtlMenu :    integer;
  616. X    end;
  617. X
  618. XPROCEDURE ItemActivate (theDialog : DialogPtr;ItemNo, HiliteMode : integer);    { Activate & hilite buttons }
  619. XVar
  620. X    ItemType: Integer;
  621. X    ItemBox:  Rect;
  622. X    ItemHdl :  Handle;
  623. XBegin
  624. X    GetDItem(theDialog,ItemNo,ItemType,ItemHdl,ItemBox);
  625. X    HiliteControl(ControlHandle(ItemHdl),HiliteMode);
  626. XEnd;
  627. X
  628. XPROCEDURE SetRadioButton (theDialog : DialogPtr; ItemNo, ChkMark : integer); { set on/off radio buttons }
  629. XVar
  630. X    ItemType: Integer;
  631. X    ItemBox:  Rect;
  632. X    ItemHdl:  Handle;
  633. XBegin
  634. X    GetDItem(theDialog,ItemNo,ItemType,ItemHdl,ItemBox);
  635. X    SetCtlValue(ControlHandle(ItemHdl), ChkMark);
  636. XEnd;
  637. X
  638. XFUNCTION GetTxtValue (theDialog : DialogPtr; ItemNo : Integer): longint;    { get integer from text box }
  639. XVar
  640. X    ItemType    : Integer;
  641. X    ItemBox    : Rect;
  642. X    ItemHdl    : Handle;
  643. X    theString    : Str255;
  644. X    Value    : longint;
  645. Xbegin
  646. X    GetDItem(theDialog, ItemNo, ItemType, ItemHdl, ItemBox);
  647. X    GetIText(ItemHdl, theString);
  648. X    StringToNum (theString, Value);
  649. X    GetTxtValue := Value;
  650. Xend;
  651. X
  652. XPROCEDURE HiliteDefButton (theDialog: DialogPtr);
  653. Xvar
  654. X    ItemType:    Integer;
  655. X    ButtRect:    rect;
  656. X    ItemHdl :        Handle;
  657. Xbegin
  658. X    PenSize(3,3);                                {set pen size}
  659. X    GetDItem(theDialog,1,ItemType,ItemHdl,ButtRect);
  660. X    InsetRect(ButtRect,-4,-4);
  661. X    FrameRoundRect(ButtRect,28,28);
  662. X    PenSize(1,1);                                {reset pen size}
  663. Xend;
  664. X
  665. XPROCEDURE DrawEText (VAR DataRec: DAGlobals);        { put text from Globals in dialog }
  666. XVar
  667. X    VLoc, counter:    integer;
  668. XBegin
  669. X    with DataRec do begin
  670. X        TextFont(3);    { make Geneva 9 pt. the current font }
  671. X        TextSize(9);
  672. X        for counter := 1 to NoText do begin
  673. X            VLoc := 80 + (counter*14);
  674. X            MoveTo(12,VLoc);
  675. X            DrawString ( StringArray[counter] );
  676. X        end;    {with DataRec do - for counter}
  677. X        TextFont(0);    { make Chicago 12 pt. the current font }
  678. X        TextSize(12);
  679. X    end;
  680. XEnd;
  681. X
  682. XPROCEDURE DitlText(VAR DataRec: DAGlobals);    { Draw text and output data in main window }
  683. Xvar
  684. X    aString    : str255;
  685. Xbegin
  686. X    with DataRec do begin
  687. X        if (NoText > 0) then DrawEText (DataRec);
  688. X        if (Number>0) then begin        { draw result of multiplication }
  689. X            MoveTo(300,76);
  690. X            NumToString (Number, aString);
  691. X            DrawString (aString);
  692. X        end;
  693. X    end;
  694. Xend;
  695. X
  696. XPROCEDURE DitlLines;        { draw dotted lines in main window }
  697. Xvar
  698. X    Pattrn :        Pattern;
  699. Xbegin
  700. X    GetIndPattern(Pattrn,0,4);    {set pen pattern to gray}
  701. X    PenPat(Pattrn);
  702. X    MoveTo(182,40);            { vertical line }
  703. X    Line(0,194);
  704. X    MoveTo(300,80);            { horizontal line }
  705. X    Line(50,0);
  706. X    GetIndPattern(Pattrn,0,1);    {reset pen pattern to black}
  707. X    PenPat(Pattrn);
  708. Xend;
  709. X
  710. XPROCEDURE InitDlogStatus(VAR device: DeviceControlRec);    { set buttons, globals, and cursor location }
  711. XBegin
  712. X    with device do begin
  713. X        SetRadioButton(DctlWindow, RadioBut1, Chk_On);
  714. X        SetRadioButton(DctlWindow, RadioBut2, chk_off);
  715. X        SetRadioButton(DctlWindow, RadioBut3, chk_off);
  716. X        ItemActivate (DCtlWindow, ResetButton, CNTL_disable);
  717. X        dCtlStorage^^.ButtonNo := 1;
  718. X        dCtlStorage^^.NoText := 0;
  719. X        dCtlStorage^^.Number := 0;
  720. X        SelIText (DCtlWindow, Tbox, 0, 0);        {jumpstart cursor in 1st textbox}
  721. X    end;
  722. XEnd;
  723. X
  724. XPROCEDURE DoAbout (DlogID    : longint);
  725. XVar
  726. X    item        : integer;
  727. X    ViewRect        : rect;    {size of dialog window}
  728. X    DITL_Hdl        : handle;
  729. X    AboutDptr    : GrafPtr;
  730. XBegin
  731. X    SetRect(ViewRect,68,50,444,220);    {dialog box size- lf,tp,rt,bot}
  732. X    DITL_Hdl := GetResource('DITL', DlogID);
  733. X    if DITL_Hdl <> nil then begin            
  734. X        AboutDptr:= NewDialog(Nil,        {Use _NewDialog_ to put up one of 2 different DITLs }
  735. X                        ViewRect,     {size of this dialog box}
  736. X                        'About Dialog',    {title of this dialog - unused}
  737. X                        True,        {dialog visible upon creation}
  738. X                        dBoxProc,    {modal type}
  739. X                        POINTER(-1),    {make it the frontmost window}
  740. X                        False,        {no goAway box in the dialog}
  741. X                        0,            {RefCon variable in dialog record}
  742. X                        DITL_Hdl);    {handle to the dialog itemlist}
  743. X        ModalDialog(nil,item);
  744. X        DisposDialog(AboutDptr);
  745. X        DetachResource(DITL_Hdl);
  746. X    end;
  747. XEnd;
  748. X
  749. XPROCEDURE EnterText ( VAR Device: DeviceControlRec);
  750. XVar
  751. X    LoadDptr            : DialogPtr;
  752. X    itemno, ItemType    : integer;
  753. X    ItemBox            : Rect;
  754. X    ItemHdl            : Handle;
  755. X    theString            : Str255;
  756. XBegin
  757. X    LoadDptr:= GetNewDialog (device.dCtlMenu + 1, Nil, pointer(-1));
  758. X    ModalDialog(nil, ItemNo);
  759. X    With Device.Dctlstorage^^ do begin
  760. X        NoText := NoText + 1;
  761. X        GetDItem(LoadDptr, 2, ItemType, ItemHdl, ItemBox);
  762. X        GetIText(ItemHdl, theString);
  763. X        if (theString = '')
  764. X            then NoText := NoText - 1
  765. X            else StringArray[NoText] := copy (theString, 1, 25);
  766. X        end;
  767. X    DisposDialog(LoadDptr);
  768. XEnd;
  769. X
  770. XPROCEDURE UpdateDA(VAR device: DeviceControlRec);    { update call - draw window contents }
  771. Xbegin
  772. X    with device do begin
  773. X        BeginUpdate(DialogPtr(dctlWindow));
  774. X        DrawDialog(DialogPtr(dctlWindow));
  775. X        DitlLines;
  776. X        DitlText(dCtlStorage^^);
  777. X        HiliteDefButton (DialogPtr(dctlWindow));
  778. X        EndUpdate(DialogPtr(dctlWindow));
  779. X    end;
  780. Xend;
  781. X
  782. XPROCEDURE DAactivate(VAR device: DeviceControlRec);        { activate call - put menu on menu bar }
  783. Xbegin
  784. X    with device do
  785. X        with dCtlStorage^^ do begin
  786. X            menuHand^^.menuID := DCtlMenu;
  787. X            InsertMenu (menuHand,0);
  788. X            DrawMenuBar;
  789. X        end;
  790. Xend;
  791. X
  792. XPROCEDURE DAdeactivate(VAR device: DeviceControlRec);   { deactivate - remove menu from menu bar }
  793. Xbegin
  794. X    DeleteMenu(Device.DCtlMenu);
  795. X    DrawMenuBar;
  796. Xend;    { of DAdeactivate }
  797. X
  798. XPROCEDURE CtlRadioButtons (VAR Device : DeviceControlRec; WhichButton : integer);
  799. XBegin
  800. X    with device.dctlstorage^^ do begin
  801. X        SetRadioButton (Device.DCtlWindow, ButtonNo + 5, chk_off);
  802. X        SetRadioButton (Device.DCtlWindow, WhichButton + 5, Chk_On);
  803. X        ButtonNo := WhichButton;
  804. X    end;
  805. XEnd;
  806. X
  807. XPROCEDURE DoDefButton(VAR Device: DeviceControlRec);
  808. XVar
  809. X    NumOne, NumTwo    : longint;
  810. X    BigRec        : rect;
  811. XBegin
  812. X    with device do begin
  813. X        SetRect(BigRec,-999,-999,999,999);
  814. X        ItemActivate (DCtlWindow, ResetButton, CNTL_enable);
  815. X        NumOne := GetTxtValue(dctlWindow, Tbox);
  816. X        NumTwo := GetTxtValue(dctlWindow, TboxII);
  817. X        dctlstorage^^.Number := NumOne  * NumTwo;
  818. X        EraseRect(BigRec);
  819. X        InvalRect(BigRec);    {force update}
  820. X    end;
  821. XEnd;
  822. X
  823. XPROCEDURE DoResetButton(VAR Device: DeviceControlRec);
  824. XVar
  825. X    BigRec        : rect;
  826. XBegin
  827. X    SetRect(BigRec,-999,-999,999,999);
  828. X    InitDlogStatus(device);
  829. X    EraseRect(BigRec);
  830. X    InvalRect(BigRec);    {force update}
  831. XEnd;
  832. X
  833. XPROCEDURE DoTimeButton(VAR Device: DeviceControlRec);
  834. XVar
  835. X    OSErr                : integer;
  836. X    DismissItem            : longint;
  837. X    TimeAdjust, TimeInSec    : longint;
  838. XBegin
  839. X    DismissItem := Alert(device.dCtlMenu + 1, nil);
  840. X    TimeAdjust := 0;
  841. X    case DismissItem of
  842. X        2:    TimeAdjust := 3600;
  843. X        3:    TimeAdjust := -3600;
  844. X        end;
  845. X    GetDateTime (TimeInSec);
  846. X    OSErr := SetDateTime (TimeInSec + TimeAdjust);
  847. XEnd;
  848. X
  849. XPROCEDURE doKeyEvent (VAR Device : DeviceControlRec; EventPtr : EventPointer);
  850. XConst        {key codes}
  851. X    CmdT    = $74;        Return    = $03;        Zero    = $30;
  852. X    CmdR    = $72;        Enter    = $0D;        Nine    = $39;
  853. X    CmdQ    = $71;        Tab        = $09;
  854. X    CmdB    = $62;        Backspace = $08;
  855. XVar
  856. X    item, charCode : integer;
  857. X    tmpDPtr        : DialogPtr;
  858. X    aFlag        : boolean;    { used as dummy variable in calling DialogSelect }
  859. X    ButNum        : longint;        { used to set button in CtlRadioButton, & in Delay call }
  860. XBegin
  861. X    with EventPtr^ do
  862. X        with device.dctlstorage^^ do begin
  863. X            charCode := BitAnd(message, charCodeMask);
  864. X            if BitAnd (modifiers, cmdKey) <> 0
  865. X                then case charCode of        { ====== field allowable command keys ====== }
  866. X                    CmdB:    { rotate radio buttons }
  867. X                        begin
  868. X                            if (ButtonNo = 3)
  869. X                                then ButNum := 1
  870. X                                else ButNum := ButtonNo + 1;
  871. X                            CtlRadioButtons (Device, ButNum);
  872. X                        end;
  873. X                    CmdR:
  874. X                        DoResetButton(device);
  875. X                    CmdT:
  876. X                        DoTimeButton(device);
  877. X                    CmdQ: { Quit }
  878. X                        Finished := True;
  879. X                    otherwise
  880. X                        Sysbeep(1);    { ignore all other command keys }
  881. X                    end        {of case}
  882. X                else begin                    { ======== handle all other keys ======== }
  883. X                    if (charCode >= Zero) and (charCode <= Nine)    { ===allow numeric keys=== }
  884. X                        then aFlag := DialogSelect (EventPtr^, tmpDptr, item)
  885. X                        else case charcode of    { ===== allow some non-numeric keys===== }
  886. X                            Return, Enter:
  887. X                                begin
  888. X                                    ItemActivate (Device.DCtlWindow, Defbutton, inButton);
  889. X                                    Delay(15, ButNum);
  890. X                                    ItemActivate (Device.DCtlWindow, Defbutton, CNTL_enable);
  891. X                                    DoDefButton(device);
  892. X                                end;
  893. X                            Tab, Backspace:
  894. X                                aFlag := DialogSelect (EventPtr^, tmpDptr, item);
  895. X                            otherwise
  896. X                                Sysbeep(1);    { ignore all other keys }
  897. X                        end;  { of case charcode - non-numeric keys }
  898. X                    end;  { of non-command keys }
  899. X        end;  { with device.dctlstorage^^ }
  900. XEnd;
  901. X
  902. XPROCEDURE Event(VAR Device    : DeviceControlRec;
  903. X                VAR Block    : ParamBlockRec);
  904. XVar
  905. X    item, DismissItem    : integer;
  906. X    tmpDPtr            : DialogPtr;
  907. X    EventPtr            : EventPointer;
  908. X    aFlag            : boolean;    { used as dummy variable in calling DialogSelect }
  909. X    lastVal            : longint;        { used as dummy variable in DELAY proc }
  910. XBegin
  911. X    blockMove(@block.csParam[0],@EventPtr,4);
  912. X    with device.dctlstorage^^ do begin
  913. X        case EventPtr^.what of
  914. X            MouseDown:
  915. X                begin
  916. X                if DialogSelect (EventPtr^, tmpDptr, item) then    { process if item is enabled }
  917. X                    case Item of
  918. X                        Defbutton:
  919. X                            DoDefButton(device);
  920. X                        Aboutbutton:
  921. X                            DoAbout(device.dctlMenu + 1);
  922. X                        QuitButton:
  923. X                            Finished := True;
  924. X                        ResetButton:
  925. X                            DoResetButton(device);
  926. X                        TimeButton:
  927. X                            DoTimeButton(device);
  928. X                        BullsICON:
  929. X                            DismissItem := Alert(device.dCtlMenu, nil);
  930. X                        TEnterICON:
  931. X                            If (NoText < NoStrings) then begin
  932. X                                EnterText (device);
  933. X                                DitlText(device.dctlStorage^^);
  934. X                            end;
  935. X                        RadioBut1:
  936. X                            CtlRadioButtons (Device, 1);
  937. X                        RadioBut2:
  938. X                            CtlRadioButtons (Device, 2);
  939. X                        RadioBut3:
  940. X                            CtlRadioButtons (Device, 3);
  941. X                        otherwise;    { ignore all other mousedowns }
  942. X                    end;   { if DialogSelect/case of item hit }
  943. X                end;   { MouseDown case }
  944. X            KeyDown:
  945. X                doKeyEvent (device, EventPtr);
  946. X            UpdateEvt:
  947. X                UpdateDA(device);
  948. X            ActivateEvt:
  949. X                if odd(EventPtr^.modifiers)
  950. X                    then DAactivate(device)
  951. X                    else DAdeactivate(device);
  952. X            otherwise;    { ignore all other events }
  953. X        end; { case of what }
  954. X    end;   { with EventRecord }
  955. Xend; { Event Procedure }
  956. X
  957. XPROCEDURE Open(VAR Device : DeviceControlRec; VAR Block : ParamBlockRec);
  958. XVAR
  959. X    TmpPtr:        Ptr;
  960. X    WPeek:        WindowPeek;
  961. X    ResourceID:    Integer;    {ID to the dialog item list & main reference ID for resources}
  962. XBEGIN    {  Open Procedure  }
  963. X    ResourceID := $BFE0 + 32 * (-Device.DCtlRefNum);            { Compute main resource ID }
  964. X    Device.dCtlMenu := ResourceID;
  965. X    if Device.DctlWindow = nil then begin
  966. X        Device.DctlStorage :=  DAGlobalsH(NewHandle(132));
  967. X        TmpPtr := NewPtr($1000);                { Create hole in the heap under Window record }
  968. X        Device.DCtlWindow:= GetNewDialog (ResourceID, Nil, pointer(-1));
  969. X        WPeek := pointer(ord(Device.DCtlWindow));
  970. X        WPeek^.WindowKind := Device.DCtlRefNum;    {set the WindowKind field to the DA RefNum }
  971. X        SetPort(Device.DCtlWindow);
  972. X        DisposPtr(TmpPtr);
  973. X
  974. X        HLock (Handle (Device.dCtlstorage));
  975. X        With Device.dCtlstorage^^ do begin
  976. X            InitDlogStatus(device);
  977. X            Finished := False;                 { set program terminator to false }
  978. X            menuHand := GetMenu (ResourceID);
  979. X        end;
  980. X        HUnlock(Handle(Device.Dctlstorage));
  981. X    end;
  982. XEND;  { of Open }
  983. X
  984. XPROCEDURE Ctl (VAR Device : DeviceControlRec; VAR Block : ParamBlockRec);
  985. XCONST
  986. X    accEvent        = 64;    accUndo        = 68;    accClear        = 73;
  987. X    accRun        = 65;    accCut        = 70;    CmdMenuNo    = 1;
  988. X    accCursor    = 66;    accCopy        = 71;    AboutMenuNo    = 3;
  989. X    accMenu        = 67;    accPaste        = 72;    QuitMenuNo    = 4;
  990. XVAR
  991. X    Done    : boolean;     { local pgm terminator - for calling CloseDeskAcc after globals unlocked }
  992. X    DPeek    : DialogPeek;
  993. XBEGIN { Main body of CTL Procedure }
  994. X    BitClr(@Device.dCtlFlags, 5);            { prevent CTL calls until done, since we use modaldialogs }
  995. X    SetPort(Device.DCtlWindow);            { Set the current grafport }
  996. X    HLock(Handle(Device.DCtlStorage));        { lock DAGlobals down }
  997. X    Done := False;                        { set local boolean program terminator }
  998. X    with device.dctlStorage^^ do
  999. X        with block do begin
  1000. X            case csCode of
  1001. X                accEvent:
  1002. X                    Event(Device, Block);
  1003. X                accRun:
  1004. X                        begin
  1005. X                        DPeek := DialogPeek(Device.DCtlWindow);
  1006. X                        TEIdle (DPeek^.textH);        { blink caret in text box }
  1007. X                         end;
  1008. X                accCursor: ;
  1009. X                accMenu:
  1010. X                        begin
  1011. X                        case csParam[1] of
  1012. X                            CmdMenuNo:
  1013. X                                DoAbout(device.dctlMenu + 3);
  1014. X                            AboutMenuNo:
  1015. X                                DoAbout(device.dctlMenu + 1);
  1016. X                            QuitMenuNo:
  1017. X                                    Finished := True;
  1018. X                        end;  { case of menu }
  1019. X                        HiliteMenu(0);
  1020. X                        end;    { menu case}
  1021. X                accUndo:   ;
  1022. X                accCut:    ;
  1023. X                accCopy:   ;
  1024. X                accPaste:  ;
  1025. X                accClear:  ;
  1026. X            end;    { case of csCode }
  1027. X            Done := Finished;
  1028. X        end;    { of Block/device.dctlStorage^^ }
  1029. X    HUnLock(Handle(Device.DCtlStorage));
  1030. X    BitSet(@Device.dCtlFlags, 5);                {Allow _Control calls again.}
  1031. X    if Done then CloseDeskAcc(Device.DCtlRefNum);
  1032. XEND;  { of Ctl }
  1033. X
  1034. XPROCEDURE Close(VAR Device: DeviceControlRec;  VAR Block : ParamBlockRec);
  1035. XBEGIN
  1036. X    DAdeactivate(device);
  1037. X    with Device do
  1038. X        begin
  1039. X            disposDialog(DialogPtr(dCtlWindow));    { dispose of window }
  1040. X            ReleaseResource (Handle (DCtlStorage^^.menuHand));
  1041. X            HPurge(Handle(dCtlDriver));
  1042. X            dctlWindow := nil;
  1043. X            disposHandle(Handle(dCtlStorage));        { Release private storage area }
  1044. X            dctlStorage := nil;
  1045. X        end;
  1046. XEND;  { of Close }
  1047. X
  1048. XBEGIN     { No main program }
  1049. XEND.
  1050. ________This_Is_The_END________
  1051. if test `wc -l < DialogMgrDA.p` -ne 491; then
  1052.     echo 'shar: DialogMgrDA.p was damaged during transit'
  1053.   echo '      (should have been 491 bytes)'
  1054. fi
  1055. fi        ; : end of overwriting check
  1056. echo 'Extracting DialogMgrDA.r'
  1057. if test -f DialogMgrDA.r; then echo 'shar: will not overwrite DialogMgrDA.r'; else
  1058. sed 's/^X//' << '________This_Is_The_END________' > DialogMgrDA.r
  1059. X* DialogManagerDA.R
  1060. X* Resource file for DialogManagerDA.Pas
  1061. X*
  1062. X*Output file name and the Type and Creator flags
  1063. X20Meg:Development:DialogManager.acc
  1064. XDFILDMOV
  1065. X
  1066. XTYPE DRVR = PROC
  1067. X  DialogManager DA,16
  1068. X20Meg:Development:DialogManagerDA
  1069. X
  1070. Xtype MENU
  1071. XDManMENU,-15872
  1072. XDialogManager;;\CA\CA\CA\CA\CAmenu title
  1073. XCommand Keys;;\CA\CA\CA menu1
  1074. X(-;;\CA\CA\CA\CA\CA\CA\CA\CA\CA\CA\CA\CA\CA dotted line
  1075. XAbout...;;\CA\CA\CA     menu3
  1076. XQuit;;            menu4
  1077. X
  1078. XINCLUDE 20Meg:Development:DialogManagerDA.resed
  1079. X
  1080. X
  1081. ________This_Is_The_END________
  1082. if test `wc -l < DialogMgrDA.r` -ne 22; then
  1083.     echo 'shar: DialogMgrDA.r was damaged during transit'
  1084.   echo '      (should have been 22 bytes)'
  1085. fi
  1086. fi        ; : end of overwriting check
  1087. echo 'Extracting Example'
  1088. if test -f Example; then echo 'shar: will not overwrite Example'; else
  1089. sed 's/^X//' << '________This_Is_The_END________' > Example
  1090. Xtype DLOG
  1091. X,128
  1092. X77 63 260 434 
  1093. XVisible 1 NoGoAway 0
  1094. X128
  1095. X(No Title)
  1096. X
  1097. Xtype DITL
  1098. X,128
  1099. X10
  1100. XIconItem Enabled
  1101. X11 17 52 80 
  1102. X128
  1103. X
  1104. XStatText Enabled
  1105. X20 90 37 265 
  1106. XDIALOG CREATION EXAMPLE
  1107. X
  1108. XStatText Enabled
  1109. X68 44 109 326 
  1110. XThis example demonstrates the use of  a multitude of different item types.
  1111. X
  1112. XBtnItem Enabled
  1113. X141 132 179 241 
  1114. XOK
  1115. X
  1116. XBtnItem Enabled
  1117. X141 254 179 366 
  1118. XCANCEL
  1119. X
  1120. XChkItem Enabled
  1121. X114 8 132 133 
  1122. XI Like Examples
  1123. X
  1124. XRadioItem Enabled
  1125. X114 143 131 228 
  1126. XThis is fun
  1127. X
  1128. XRadioItem Enabled
  1129. X114 240 132 361 
  1130. XThis is very fun
  1131. X
  1132. XResCItem Enabled
  1133. X141 10 178 116 
  1134. X130
  1135. X
  1136. XPicItem Disabled
  1137. X4 277 62 366 
  1138. X129
  1139. X
  1140. X
  1141. ________This_Is_The_END________
  1142. if test `wc -l < Example` -ne 51; then
  1143.     echo 'shar: Example was damaged during transit'
  1144.   echo '      (should have been 51 bytes)'
  1145. fi
  1146. fi        ; : end of overwriting check
  1147. exit 0
  1148.