home *** CD-ROM | disk | FTP | other *** search
/ The CDPD Public Domain Collection for CDTV 3 / CDPDIII.bin / pd / programming / utils / dialoglib / dialog.doc < prev    next >
Text File  |  1993-03-08  |  32KB  |  919 lines

  1. dialog.lib release 1.0 alpha - preliminary documentation
  2.  
  3. =========
  4. Copyright
  5. =========
  6. The material published in this distribution is Freeware.
  7. Copyright © 1993 remains at the author, Stefan Reisner.
  8.  
  9. It may only be re-distributed unmodified and in its present
  10. composition. In particular, this copyright notice must be
  11. included and must be intact.
  12.  
  13. The library "dialog.lib" may be used freely in any application.
  14. When using it in a commercial project, please include a statement
  15. of this copyright in the electronic or printed documentation.
  16.  
  17. =======
  18. Contact
  19. =======
  20. Please report any bugs you find to:
  21.     Stefan Reisner
  22. >>>    sr@ph-cip.uni-koeln.de
  23.     Aachener Str. 399
  24.     5000 Cologne 41
  25.     Germany
  26.  
  27. ==========
  28. Disclaimer
  29. ==========
  30.    THERE IS   NO  WARRANTY  FOR  THE  SOFTWARE,  TO  THE  EXTENT
  31. PERMITTED  BY  APPLICABLE  LAW.  EXCEPT WHEN OTHERWISE STATED IN
  32. WRITING  THE  COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE
  33. SOFTWARE  "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
  34. OR   IMPLIED,   INCLUDING,  BUT  NOT  LIMITED  TO,  THE  IMPLIED
  35. WARRANTIES  OF  MERCHANTABILITY  AND  FITNESS  FOR  A PARTICULAR
  36. PURPOSE.   THE  ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF
  37. THE  SOFTWARE IS WITH YOU.  SHOULD THE SOFTWARE PROVE DEFECTIVE,
  38. YOU  ASSUME  THE  COST  OF  ALL  NECESSARY  SERVICING, REPAIR OR
  39. CORRECTION.  
  40.  
  41.    IN NO  EVENT  UNLESS  REQUIRED BY APPLICABLE LAW OR AGREED TO
  42. IN  WRITING  WILL  ANY  COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO
  43. MAY  REDISTRIBUTE  THE SOFTWARE AS PERMITTED ABOVE, BE LIABLE TO
  44. YOU  FOR  DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
  45. CONSEQUENTIAL  DAMAGES  ARISING  OUT  OF THE USE OR INABILITY TO
  46. USE  THE  SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR
  47. DATA  BEING  RENDERED  INACCURATE  OR LOSSES SUSTAINED BY YOU OR
  48. THIRD  PARTIES  OR A FAILURE OF THE SOFTWARE TO OPERATE WITH ANY
  49. OTHER  SOFTWARE),  EVEN  IF  SUCH HOLDER OR OTHER PARTY HAS BEEN
  50. ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.  
  51.  
  52. ================
  53. General Concepts
  54. ================
  55. The dialog library may be considered as an automatic builder for special
  56. graphical user interfaces, namely what is commonly known as dialog boxes.
  57.  
  58. It deserves the attribute `automatic' because the client (the application
  59. that wants to put up a dialog box) only defines the hierarchical relationships
  60. (presently only in terms of geometry) between the so-called `elements' of the
  61. dialog.
  62.  
  63. The gadget classes provided by GadTools form a subset of the set of available
  64. dialog elements (although at present not all kinds of GadTools gadgets are
  65. supported).
  66.  
  67. The system is open-ended in the way that other dialog elements may be added
  68. without having to change any parts of the library. This means that there may
  69. be additional linker libraries containing special-purpose dialog elements
  70. that you simply link to your application and have instant access to them.
  71.  
  72. The creation and geometrical arrangement of these elements is left to a
  73. `layout engine'. It layouts the contents of the dialog window in a way
  74. similar to the way a word processor would layout a page of a document.
  75.  
  76. The library even provides support for handling the events that the dialog
  77. window sends to the application, although in its present state this support
  78. is only rudimentary. Further work has to be committed to defining not only
  79. geometrical but also functional relationships between the dialog elements.
  80.  
  81. ===========================================
  82. How to define the structure of a dialog box
  83. ===========================================
  84. Each dialog element needs to store certain private information during the
  85. time it is used. To that purpose, the header file <dialog/dialog.h> defines
  86. a data structure DialogElement.
  87.  
  88. The client application must define one instance of DialogElement
  89. for each element it is going to use in the dialog and must initialize it
  90. prior to the layout process.
  91.  
  92. The library provides a pair of functions initDialogElement() and
  93. initDialogElementA() for initializing DialogElement structures:
  94.  
  95.     VOID initDialogElementA(
  96.         DialogElement *de,
  97.         DialogElement *root,
  98.         DialogCallback dc,
  99.         ULONG *error,
  100.         struct TagItem *taglist );
  101.  
  102.     VOID initDialogElement(
  103.         DialogElement *de,
  104.         DialogElement *root,
  105.         DialogCallback dc,
  106.         ULONG *error,
  107.         ULONG first, ... );
  108.  
  109. The capital `A' at the end of the function name indicates that this function
  110. expects an actual TagItem vector being passed to it.
  111. You normally use the function without the capital `A' where you pass the tag list
  112. conveniently over the stack.
  113.  
  114. These are the arguments:
  115.     de        -    a pointer to the DialogElement structure to be initialized
  116.     root    -    a pointer to the DialogElement structure that serves as
  117.                 the root element of the dialog (see below).
  118.                 When initializing the root element, pass a NULL pointer here
  119.     dc        -    a pointer to a dispatch function. This function determines
  120.                 the type of the dialog element (there is one dispatch function
  121.                 for each `kind' of GadTools gadgets, for example).
  122.                 The dialog library provides dispatch functions for GadTools
  123.                 gadgets and for elements needed to describe the dialog structure.
  124.                 Clients may implement their own dispatchers (see below).
  125.                 For the root element, pass dispatchRoot here.
  126.     error    -    a pointer to a ULONG. Before calling initDialogElement() the
  127.                 first time, set *error to DIALOGERR_OK (defined in <dialog/dialog.h>).
  128.                 Then you may call initDialogElement() any number of times and
  129.                 make afterwards one final check if *error still contains
  130.                 DIALOGERR_OK. If not, initialization has failed and you should
  131.                 pass control to the cleanup section of your function.
  132.  
  133.                 Note that DIALOGERR_OK is explicitly defined as zero to make
  134.                 error checking more convenient.
  135.  
  136.     taglist    -    a tag list describing the properties of the dialog element.
  137.                 The set of recognized tag labels depends on the element type
  138.                 (as determined by the dispatcher you specified).
  139.  
  140. The following code fragment gives an example:
  141.  
  142.     DialogElement root, element;
  143.     ULONG error = DIALOGERR_OK;
  144.  
  145.     initDialogElement( &root, NULL, dispatchRoot, &error,
  146.         DA_Screen, myScreen,
  147.         DA_Member, &element,
  148.         TAG_DONE );
  149.     initDialogElement( &element, &root, dispatchButton, &error,
  150.         NGDA_TextAttr, myTextAttr,
  151.         NGDA_VisualInfo, myVisualInfo,
  152.         NGDA_GadgetText, "press here...",
  153.         DA_Termination, TRUE,
  154.         TAG_DONE );
  155.     if( error != DIALOGERR_OK )
  156.         goto cleanup;
  157.  
  158. The root element is essential to every dialog. It forms the top of the hierarchy.
  159. Specify the DA_Member attribute to specify the dialog element that continues the
  160. hierarchy.
  161.  
  162. In this example, the hierarchy is continued with a button (a GadTools BUTTON_KIND
  163. gadget). Since the button has no substructure (is a `leaf' in the hierarchical
  164. tree), the hierarchy ends here.
  165.  
  166. Note that all dialog elements that are based on GadTools need the NGDA_TextAttr
  167. and the NGDA_VisualInfo attributes. There are some other attributes defined in
  168. <dialog/dialog.h> that relate to fields of the NewGadget structure, too. These
  169. include NGDA_GadgetText and NGDA_Flags.
  170.  
  171. The DA_Termination attribute indicates that this element is a `terminal' one:
  172. activating a terminal element ends the dialog (the build-in function
  173. runSimpleDialog() respects this rule). There may be several terminal
  174. elements, for example an `ok' and a `cancel' button.
  175.  
  176. After this initialization phase, the (geometrical) structure of the dialog box
  177. is well-defined and the dialog box can be realized.
  178.  
  179. =============================
  180. How to realize the dialog box
  181. =============================
  182. The easiest way to conduct the dialog that hides away as much fuzz as possible
  183. is to invoke runSimpleDialog(). runSimpleDialog() will
  184. -    determine the geometrical space requirements of the dialog
  185. -    open an appropriately sized Intuition Window
  186. -    layout the dialog (which creates the gadgets on the run)
  187. -    attach the gadgets to the window
  188. -    process incoming IDCMP events until the activation of a terminal element
  189.     is detected
  190. -    return the address of the terminating DialogElement structure.
  191.  
  192. We, however, want to consider this process in detail, since there are many cases
  193. where runSimpleDialog() does not provide enough flexibility.
  194.  
  195. You should never find a reason to get involved with the geometrical and layout
  196. aspects directly. The library provides the functions openDialogWindow() and
  197. openDialogWindowA() which do this for you:
  198.  
  199.     ULONG openDialogWindow( DialogElement *root, ULONG first, ... );
  200.     ULONG openDialogWindowA( DialogElement *root, struct TagItem *taglist );
  201.  
  202.     error = openDialogWindow( &root, WA_Title, "Dialog", TAG_DONE );
  203.  
  204. The arguments are
  205.     root    -    the pointer to the dialog's root element (initialized)
  206.     taglist    -    a tag list that allows you to control some aspects of the
  207.                 dialog window. Recognized attributes are:
  208.                 WA_Title,        -    the window title
  209.                 WA_Left,
  210.                 WA_Top            -    the window position
  211.                                     (default: centered on screen)
  212.                 WA_InnerWidth,
  213.                 WA_InnerHeight    -    the *minimal* dimensions of the window's
  214.                                     interior (default: as small as possible)
  215.                 Do not specify other window attributes in this tag list!
  216.                 Note that you may specify other window attributes in the
  217.                 root element's tag list (see dispatchRoot documentation).
  218.  
  219. The return value is either DIALOGERR_OK (success) or some other error code as
  220. defined in <dialog/dialog.h>, indicating failure.
  221. Note that DIALOGERR_OK is explicitly defined as zero to make error checking more
  222. convenient.
  223.  
  224. When successful, openDialogWindow() has opened the window, created the gadgets
  225. and attached them to the window. Note that the window's IDCMP flags are
  226. automatically determined by ORing together the IDCMP requirements of all dialog
  227. elements. Never change any IDCMP flags of a dialog window!
  228.  
  229. The window is always opened on the screen specified by DA_Screen in the root
  230. element's tag list (as CUSTOMSCREEN). Therefore, you must make sure that the
  231. screen remains open as long as the window exists (shouldn't pose a problem).
  232. Note that this proceeding is sanctioned by the RKRM for transient windows.
  233.  
  234. For event processing we need the Window pointer. It must be obtained using the
  235. library function getDialogWindow():
  236.  
  237.     struct Window *getDialogWindow( DialogElement *root );
  238.  
  239.     window = getDialogWindow( &root );
  240.  
  241. Simply pass the root DialogElement pointer to it. Note that this function
  242. will return NULL except when called after openDialogWindow() and before
  243. closeDialogWindow() (see below).
  244.  
  245. Having obtained the Window pointer, we can start processing IntuiMessages.
  246. Note that GT_GetIMsg() and GT_ReplyIMsg() must be used as soon as GadTools
  247. gadgets have been created (which is probably the case unless you have
  248. implemented new dispatchers that are based on conventional gadgets or BOOPSI
  249. classes). The first thing to do with a received IntuiMessage is to pass it
  250. to mapDialogEvent():
  251.  
  252.     DialogElement *mapDialogEvent( DialogElement *root, struct IntuiMessage *imsg );
  253.  
  254.     match = mapDialogEvent( &root, imsg );
  255.  
  256. The return value is a pointer to a DialogElement structure or NULL. When non-NULL
  257. it points to the element that `originated' the event. This includes keyboard
  258. shortcuts and additional events (see below).
  259.  
  260. A dialog element will respond to additional IDCMP event classes as specified by
  261. DA_MatchEventClasses in its tag list. Typical example usages include
  262. IDCMP_CLOSEWINDOW and IDCMP_DISKINSERTED. Note that the attribute DA_MatchEventCode
  263. and DA_MatchEventQualifier are not supported yet.
  264.  
  265. You should test then whether the respective element is terminal or not. If it is
  266. terminal, you should exit the event loop as soon as possible. 
  267.  
  268. The rest of the event processing is up to you: If some dialog elements are supposed
  269. to trigger some specific action, this is the place to do it.
  270.  
  271. When you are done with the event, pass it back to GT_ReplyIMsg().
  272.  
  273. After leaving the event loop you must close the dialog window again. This is
  274. accomplished by passing the root element to closeDialogWindow().
  275.  
  276. You only have to call closeDialogWindow() if openDialogWindow() did succeed.
  277.  
  278. ===============================================
  279. How to cleanup after having finished the dialog
  280. ===============================================
  281. initDialogElement() allocates certain data structures dynamically.
  282. The bound system resources must be freed before the scope of the
  283. DialogElement instance ends.
  284. This is done by passing the pointer to the DialogElement to
  285. clearDialogElement():
  286.  
  287.     VOID clearDialogElement( DialogElement *de );
  288.  
  289. To continue the above example, one would write
  290.  
  291. cleanup:
  292.     clearDialogElement( &element );
  293.     clearDialogElement( &root );
  294.  
  295. =============
  296. Test examples
  297. =============
  298. There are seven small example programs included that demonstrate
  299. the usage of the library. Almost all currently supported GadTools
  300. kinds appear (integer and number have been omitted but string and
  301. text are included).
  302.  
  303. ==============================
  304. Dialog element class reference
  305. ==============================
  306.  
  307. The currently implemented dialog element classes are:
  308.     Root
  309.     HStack
  310.     VStack
  311.     HCons
  312.     VCons
  313.     HBumper
  314.     VBumper
  315.     HSpring
  316.     VSpring
  317.     Button        /* GadTools */
  318.     CheckBox    /* GadTools */
  319.     String        /* GadTools */
  320.     Integer        /* GadTools */
  321.     ListView    /* GadTools */
  322.     MX            /* GadTools */
  323.     Cycle        /* GadTools */
  324.     Text        /* GadTools */
  325.     Number        /* GadTools */
  326.  
  327. The class that a DialogElement instance belongs to is determined by
  328. the dispatcher callback pointer that is passed to initDialogElement().
  329. The dispatcher for the class XXX is a C language function with the
  330. following prototype:
  331.  
  332.     ULONG dispatchXXX( struct Hook *, DialogElement *, DialogMessage * );
  333.  
  334. This information is provided just for understanding; you never actually
  335. call a dispatcher hook directly.
  336. The subject of implementing new dispatchers is not covered by this document.
  337.  
  338. The dispatcher must examine the DialogMessage passed to it and take action
  339. depending on the MethodID that it contains.
  340. The methods that dispatchers must support include
  341. - inquiring the element's geometrical structure
  342. - setup & determination of the element's geometrical space requirements
  343. - layout
  344. - cleanup
  345. - event matching and internal processing (in particular keyboard equivalents)
  346.  
  347. We are going to discuss the properties of each class now is detail.
  348.  
  349. For this discussion there is one thing left to explain: a dialog element is
  350. said to have a `structure'. This structure consists in the existence of non-
  351. existence of a horizontal and/or a vertical `baseline'. People who have worked
  352. with the Text section of graphics.library should be familiar with the term
  353. `baseline'. A single line of text only and always has a horizontal baseline.
  354. We have extended this conception for dialog elements in that they may also have
  355. a vertical baseline.
  356.  
  357. It is in fact quite obvious which structure certain elements have: Consider for
  358. example a GadTools button. There is a line of text centered on the button.
  359. Therefore, we let the button inherit the horizontal baseline of the text
  360. (and no vertical baseline).
  361.  
  362. Now consider a GadTools string entry gadget with the label placed to the left
  363. as it is default: Both the label and the text the user enters in the gadget
  364. have (the same) horizontal baseline. But in addition to that, the gadget is
  365. obviously divided horizontally into two distinct parts: the label and the
  366. entry field. Therefore, we say that this element also has a vertical baseline
  367. (identical to the left edge of the entry field).
  368.  
  369. What is this good for?
  370. Note that just as the text baseline allows us to arrange separate words neatly
  371. on a line, our extended notion of structured dialog elements allows us to
  372. arrange several (similar) elements in either horizontal or vertical direction
  373. in a way that looks nice and tidy to the user.
  374. You can for instance arrange five string entry gadgets (with labels to their left)
  375. in a vertical `stack'. The layout engine build into the dialog library will then
  376. by default align the left edges of the entry fields, causing the labels to appear
  377. on the left and the entry fields on the right of one continuous vertical line in
  378. the dialog box!
  379.  
  380. ===============================================================================
  381.  
  382. Class:         Root
  383.  
  384. Dispatcher:    dispatchRoot
  385.  
  386. Purpose:    Anchor to the hierarchy of dialog elements;
  387.             serves as a handle for many library functions.
  388.             Parameters that are global to the dialog are
  389.             passed to this.
  390.  
  391. Structure:    no baselines
  392.  
  393. Attributes:
  394.  
  395. DA_Screen Screen *
  396.     specifies the screen on which to open the dialog window.
  397.     Must be specified!
  398.  
  399. DA_Member DialogElement *
  400.     specifies the element that goes below the root in the hierarchy.
  401.  
  402. DA_XSpacing LONG
  403.     specifies a horizontal spacing.
  404.     This value determines the width of HBumpers and of the padding
  405.     between window frame and the dialog imagery.
  406.     Default: INTERWIDTH (defined in <libraries/gadtools.h>)
  407.  
  408. DA_YSpacing LONG
  409.     specifies a vertical spacing.
  410.     This value determines the height of VBumpers and of the padding
  411.     between window frame and the dialog imagery.
  412.     Default: INTERHEIGHT (defined in <libraries/gadtools.h>)
  413.  
  414. Any window attributes except
  415. WA_Left,
  416. WA_Top,
  417. WA_InnerWidth,
  418. WA_Width,
  419. WA_InnerHeight,
  420. WA_Height,
  421. WA_IDCMP,
  422. WA_SimpleRefresh,
  423. WA_CustomScreen
  424.     to customize the dialog window's appearance and behaviour.
  425.  
  426. ===============================================================================
  427.  
  428. Class:         HStack
  429.  
  430. Dispatcher:    dispatchHStack
  431.  
  432. Purpose:    Stack an arbitrary number of elements horizontally (side by side).
  433.  
  434. Structure:    horizontal baseline if every member has one
  435.  
  436. Attributes:
  437.  
  438. DA_Member DialogElement * (multiple)
  439.     specifies the list of elements to be stacked horizontally. 
  440. DA_Alignment LONG (-1,0,+1)
  441.     controls the alignment of the stacked elements in the vertical direction:
  442.     -1, top alignment:        top edges are aligned
  443.     0, center alignment:    if all members have a horizontal baseline, these
  444.     (default)                will be aligned;
  445.                             else each member is centered vertically within the
  446.                             available space
  447.     +1, bottom alignment:    bottom edges are aligned
  448.  
  449. ===============================================================================
  450.  
  451. Class:         VStack
  452.  
  453. Dispatcher:    dispatchVStack
  454.  
  455. Purpose:    Stack an arbitrary number of elements vertically (side by side).
  456.  
  457. Structure:    vertical baseline if every member has one
  458.  
  459. Attributes:
  460.  
  461. DA_Member DialogElement * (multiple)
  462.     specifies the list of elements to be stacked vertically. 
  463. DA_Alignment LONG (-1,0,+1)
  464.     controls the alignment of the stacked elements in the horizontal direction:
  465.     -1, left alignment:        left edges are aligned
  466.     0, center alignment:    if all members have a vertical baseline, these
  467.     (default)                will be aligned;
  468.                             else each member is centered horizontally within the
  469.                             available space
  470.     +1, right alignment:    right edges are aligned
  471.  
  472. ===============================================================================
  473.  
  474. Class:         HCons
  475.  
  476. Dispatcher:    dispatchHCons
  477.  
  478. Purpose:    Create a pair of a left (car) and a right (cdr) element.
  479.  
  480. Structure:    vertical baseline; horizontal baseline if car and cdr have one
  481.  
  482. Attributes:
  483.  
  484. DA_CAR DialogElement *
  485.     specifies the left element. May be omitted.
  486. DA_CDR DialogElement *
  487.     specifies the right element. May be omitted.
  488.  
  489. ===============================================================================
  490.  
  491. Class:         VCons
  492.  
  493. Dispatcher:    dispatchVCons
  494.  
  495. Purpose:    Create a pair of a top (car) and a bottom (cdr) element.
  496.  
  497. Structure:    horizontal baseline; vertical baseline if car and cdr have one
  498.  
  499. Attributes:
  500.  
  501. DA_CAR DialogElement *
  502.     specifies the top element. May be omitted.
  503. DA_CDR DialogElement *
  504.     specifies bottom right element. May be omitted.
  505.  
  506. ===============================================================================
  507.  
  508. Class:         HBumper
  509.  
  510. Dispatcher:    dispatchHBumper
  511.  
  512. Purpose:    Insert a whitespace with fixed width (see Root, DA_XSpacing);
  513.             this element is typically used in HStacks.
  514.  
  515. Structure:    horizontal baseline
  516.  
  517. Attributes:    none
  518.  
  519. Note:        HBumpers may be re-used!
  520.             You only have to prepare one DialogElement and can use it any
  521.             number of times in your dialog.
  522.  
  523. ===============================================================================
  524.  
  525. Class:         VBumper
  526.  
  527. Dispatcher:    dispatchVBumper
  528.  
  529. Purpose:    Insert a whitespace with fixed height (see Root, DA_YSpacing);
  530.             this element is typically used in VStacks.
  531.  
  532. Structure:    vertical baseline
  533.  
  534. Attributes:    none
  535.  
  536. Note:        VBumpers may be re-used!
  537.             You only have to prepare one DialogElement and can use it any
  538.             number of times in your dialog.
  539.  
  540. ===============================================================================
  541.  
  542. Class:         HSpring
  543.  
  544. Dispatcher:    dispatchHSpring
  545.  
  546. Purpose:    Balance arbitrarily extensible elements in HStacks.
  547.  
  548. Structure:    horizontal baseline
  549.  
  550. Attributes:    none
  551.  
  552. Note:        HSprings may be re-used!
  553.             You only have to prepare one DialogElement and can use it any
  554.             number of times in your dialog.
  555.  
  556. ===============================================================================
  557.  
  558. Class:         VSpring
  559.  
  560. Dispatcher:    dispatchVSpring
  561.  
  562. Purpose:    Balance arbitrarily extensible elements in VStacks.
  563.  
  564. Structure:    vertical baseline
  565.  
  566. Attributes:    none
  567.  
  568. Note:        VSprings may be re-used!
  569.             You only have to prepare one DialogElement and can use it any
  570.             number of times in your dialog.
  571.  
  572. Springs are very versatile elements that give you great freedom in designing
  573. stacks. In particular, consider what happens when a spring is placed at one
  574. or both ends of a stack. If you find that the effect of one spring on a stack
  575. is insufficient, simply double the spring (doubles the effect).
  576.  
  577. ===============================================================================
  578.  
  579. Class:         Button (GadTools)
  580.  
  581. Dispatcher:    dispatchButton
  582.  
  583. Purpose:    Realize a GadTools button with label and
  584.             optional keyboard equivalent
  585.  
  586. Structure:    horizontal baseline
  587.  
  588. Attributes:
  589.  
  590. NGDA_TextAttr struct TextAttr *
  591.     pointer to a TextAttr structure.
  592.     This goes into the ng_TextAttr field of the NewGadget structure.
  593.  
  594. NGDA_VisualInfo APTR
  595.     APTR to the private VisualInfo structure.
  596.     This goes into the ng_VisualInfo field of the NewGadget structure.
  597.  
  598. NGDA_GadgetText STRPTR
  599.     Button label.
  600.     This goes into the ng_GadgetText field of the NewGadget structure.
  601.  
  602. NGDA_Flags ULONG
  603.     Flags. This goes into the ng_Flags field of the NewGadget structure.
  604.  
  605. DA_EquivalentKey UBYTE
  606.     specifies the keyboard shortcut (case-insensitive).
  607.  
  608. plus other GadTools or Intuition gadget
  609. attributes as they apply to a button.
  610.  
  611. ===============================================================================
  612.  
  613. Class:         CheckBox (GadTools)
  614.  
  615. Dispatcher:    dispatchCheckBox
  616.  
  617. Purpose:    Realize a GadTools checkbox with label and
  618.             optional keyboard equivalent
  619.  
  620. Structure:    horizontal baseline if PLACETEXT_ABOVE or PLACETEXT_BELOW,
  621.             vertical baseline if PLACETEXT_LEFT or PLACETEXT_RIGHT
  622.  
  623. Attributes:
  624.  
  625. NGDA_TextAttr struct TextAttr *
  626.     pointer to a TextAttr structure.
  627.     This goes into the ng_TextAttr field of the NewGadget structure.
  628.  
  629. NGDA_VisualInfo APTR
  630.     APTR to the private VisualInfo structure.
  631.     This goes into the ng_VisualInfo field of the NewGadget structure.
  632.  
  633. NGDA_GadgetText STRPTR
  634.     CheckBox label.
  635.     This goes into the ng_GadgetText field of the NewGadget structure.
  636.  
  637. NGDA_Flags ULONG
  638.     Flags. This goes into the ng_Flags field of the NewGadget structure.
  639.     The label placement flags determine the element's structure.
  640.  
  641. DA_EquivalentKey UBYTE
  642.     specifies the keyboard shortcut (case-insensitive).
  643.  
  644. plus other GadTools or Intuition gadget
  645. attributes as they apply to a checkbox.
  646.  
  647. ===============================================================================
  648.  
  649. Class:         String (GadTools)
  650.  
  651. Dispatcher:    dispatchString
  652.  
  653. Purpose:    Realize a GadTools string entry gadget with label and
  654.             optional keyboard equivalent
  655.  
  656. Structure:    horizontal baseline, vertical baseline if PLACETEXT_LEFT
  657.             or PLACETEXT_RIGHT
  658.  
  659. Attributes:
  660.  
  661. NGDA_TextAttr struct TextAttr *
  662.     pointer to a TextAttr structure.
  663.     This goes into the ng_TextAttr field of the NewGadget structure.
  664.  
  665. NGDA_VisualInfo APTR
  666.     APTR to the private VisualInfo structure.
  667.     This goes into the ng_VisualInfo field of the NewGadget structure.
  668.  
  669. NGDA_GadgetText STRPTR
  670.     String label.
  671.     This goes into the ng_GadgetText field of the NewGadget structure.
  672.  
  673. NGDA_Flags ULONG
  674.     Flags. This goes into the ng_Flags field of the NewGadget structure.
  675.     The label placement flags determine the element's structure.
  676.  
  677. DA_EquivalentKey UBYTE
  678.     specifies the keyboard shortcut (case-insensitive).
  679.  
  680. DA_Storage STRPTR
  681.     pointer to a buffer that must can take as much characters as is specified
  682.     by GTST_MaxChars. The text entered by the user is copied there each time
  683.     a IDCMP_GADGETUP is heard from the gadget.
  684.  
  685. plus other GadTools or Intuition gadget attributes
  686. as they apply to a string entry gadget.
  687.  
  688. ===============================================================================
  689.  
  690. Class:         Integer (GadTools)
  691.  
  692. Dispatcher:    dispatchInteger
  693.  
  694. Purpose:    Realize a GadTools integer entry gadget with label and
  695.             optional keyboard equivalent
  696.  
  697. Structure:    horizontal baseline, vertical baseline if PLACETEXT_LEFT
  698.             or PLACETEXT_RIGHT
  699.  
  700. Attributes:
  701.  
  702. NGDA_TextAttr struct TextAttr *
  703.     pointer to a TextAttr structure.
  704.     This goes into the ng_TextAttr field of the NewGadget structure.
  705.  
  706. NGDA_VisualInfo APTR
  707.     APTR to the private VisualInfo structure.
  708.     This goes into the ng_VisualInfo field of the NewGadget structure.
  709.  
  710. NGDA_GadgetText STRPTR
  711.     Integer label.
  712.     This goes into the ng_GadgetText field of the NewGadget structure.
  713.  
  714. NGDA_Flags ULONG
  715.     Flags. This goes into the ng_Flags field of the NewGadget structure.
  716.     The label placement flags determine the element's structure.
  717.  
  718. DA_EquivalentKey UBYTE
  719.     specifies the keyboard shortcut (case-insensitive).
  720.  
  721. DA_Storage LONG *
  722.     The integer that the user has entered is copied to this memory location
  723.     each time a IDCMP_GADGETUP comes in.
  724.  
  725. plus other GadTools or Intuition gadget attributes
  726. as they apply to a integer entry gadget.
  727.  
  728. ===============================================================================
  729.  
  730. Class:         ListView (GadTools)
  731.  
  732. Dispatcher:    dispatchListView
  733.  
  734. Purpose:    Realize a GadTools list view gadget with label and
  735.             optional keyboard equivalent
  736.  
  737. Structure:    horizontal baseline if PLACETEXT_ABOVE or PLACETEXT_BELOW,
  738.             vertical baseline if PLACETEXT_LEFT or PLACETEXT_RIGHT
  739.  
  740. Attributes:
  741.  
  742. NGDA_TextAttr struct TextAttr *
  743.     pointer to a TextAttr structure.
  744.     This goes into the ng_TextAttr field of the NewGadget structure.
  745.  
  746. NGDA_VisualInfo APTR
  747.     APTR to the private VisualInfo structure.
  748.     This goes into the ng_VisualInfo field of the NewGadget structure.
  749.  
  750. NGDA_GadgetText STRPTR
  751.     ListView label.
  752.     This goes into the ng_GadgetText field of the NewGadget structure.
  753.  
  754. NGDA_Flags ULONG
  755.     Flags. This goes into the ng_Flags field of the NewGadget structure.
  756.     The label placement flags determine the element's structure.
  757.  
  758. DA_EquivalentKey UBYTE
  759.     specifies the keyboard shortcut. This is only functional if an item
  760.     is already selected. The unshifted keystroke selects the next item,
  761.     the shifted keystroke selects the previous item.
  762.     Note that this is only functional if DA_Storage specifies a valid
  763.     memory location where to store the currently selected item.
  764.  
  765. DA_Storage LONG *
  766.     memory location where to store the currently selected item.
  767.     If this is omitted, the gadget will still work (except for keyboard
  768.     shortcut), but the client will never know which item the user
  769.     selected.
  770.  
  771. plus other GadTools or Intuition gadget attributes
  772. as they apply to a list view gadget.
  773.  
  774. ===============================================================================
  775.  
  776. Class:         MX (GadTools)
  777.  
  778. Dispatcher:    dispatchMX
  779.  
  780. Purpose:    Realize a GadTools mutually exclusive gadget with
  781.             optional keyboard equivalent
  782.  
  783. Structure:    vertical baseline
  784.  
  785. Attributes:
  786.  
  787. NGDA_TextAttr struct TextAttr *
  788.     pointer to a TextAttr structure.
  789.     This goes into the ng_TextAttr field of the NewGadget structure.
  790.  
  791. NGDA_VisualInfo APTR
  792.     APTR to the private VisualInfo structure.
  793.     This goes into the ng_VisualInfo field of the NewGadget structure.
  794.  
  795. NGDA_Flags ULONG
  796.     Flags. This goes into the ng_Flags field of the NewGadget structure.
  797.  
  798. DA_EquivalentKey UBYTE
  799.     specifies the keyboard shortcut.
  800.     The unshifted keystroke activates the next choice (with wrap-around),
  801.     the shifted keystroke activates the previous choice (with wrap-around).
  802.     Note that this is only functional if DA_Storage specifies a valid
  803.     memory location where to store the currently active choice.
  804.  
  805. DA_Storage LONG *
  806.     memory location where to store the currently active choice.
  807.     If this is omitted, the gadget will still work (except for keyboard
  808.     shortcut), but the client will never know which choice the user
  809.     activated.
  810.  
  811. plus other GadTools or Intuition gadget attributes
  812. as they apply to a mutually exclusive gadget.
  813.  
  814. ===============================================================================
  815.  
  816. Class:         Cycle (GadTools)
  817.  
  818. Dispatcher:    dispatchCycle
  819.  
  820. Purpose:    Realize a GadTools cycle gadget with optional keyboard equivalent
  821.  
  822. Structure:    horizontal baseline, vertical baseline if PLACETEXT_LEFT or
  823.             PLACETEXT_RIGHT
  824.  
  825. Attributes:
  826.  
  827. NGDA_TextAttr struct TextAttr *
  828.     pointer to a TextAttr structure.
  829.     This goes into the ng_TextAttr field of the NewGadget structure.
  830.  
  831. NGDA_VisualInfo APTR
  832.     APTR to the private VisualInfo structure.
  833.     This goes into the ng_VisualInfo field of the NewGadget structure.
  834.  
  835. NGDA_GadgetText STRPTR
  836.     Cycle label.
  837.     This goes into the ng_GadgetText field of the NewGadget structure.
  838.  
  839. NGDA_Flags ULONG
  840.     Flags. This goes into the ng_Flags field of the NewGadget structure.
  841.  
  842. DA_EquivalentKey UBYTE
  843.     specifies the keyboard shortcut.
  844.     The unshifted keystroke activates the next choice (with wrap-around),
  845.     the shifted keystroke activates the previous choice (with wrap-around).
  846.     Note that this is only functional if DA_Storage specifies a valid
  847.     memory location where to store the currently active choice.
  848.  
  849. DA_Storage LONG *
  850.     memory location where to store the currently active choice.
  851.     If this is omitted, the gadget will still work (except for keyboard
  852.     shortcut), but the client will never know which choice the user
  853.     activated.
  854.  
  855. plus other GadTools or Intuition gadget attributes
  856. as they apply to a cycle gadget.
  857.  
  858. ===============================================================================
  859.  
  860. Class:         Text (GadTools)
  861.  
  862. Dispatcher:    dispatchText
  863.  
  864. Purpose:    Realize a GadTools text display gadget
  865.  
  866. Structure:    horizontal baseline, vertical baseline if PLACETEXT_LEFT or
  867.             PLACETEXT_RIGHT
  868.  
  869. Attributes:
  870.  
  871. NGDA_TextAttr struct TextAttr *
  872.     pointer to a TextAttr structure.
  873.     This goes into the ng_TextAttr field of the NewGadget structure.
  874.  
  875. NGDA_VisualInfo APTR
  876.     APTR to the private VisualInfo structure.
  877.     This goes into the ng_VisualInfo field of the NewGadget structure.
  878.  
  879. NGDA_GadgetText STRPTR
  880.     Text label.
  881.     This goes into the ng_GadgetText field of the NewGadget structure.
  882.  
  883. NGDA_Flags ULONG
  884.     Flags. This goes into the ng_Flags field of the NewGadget structure.
  885.  
  886. plus other GadTools or Intuition gadget attributes
  887. as they apply to a text gadget.
  888.  
  889. ===============================================================================
  890.  
  891. Class:         Number (GadTools)
  892.  
  893. Dispatcher:    dispatchNumber
  894.  
  895. Purpose:    Realize a GadTools number display gadget
  896.  
  897. Structure:    horizontal baseline, vertical baseline if PLACETEXT_LEFT or
  898.             PLACETEXT_RIGHT
  899.  
  900. Attributes:
  901.  
  902. NGDA_TextAttr struct TextAttr *
  903.     pointer to a TextAttr structure.
  904.     This goes into the ng_TextAttr field of the NewGadget structure.
  905.  
  906. NGDA_VisualInfo APTR
  907.     APTR to the private VisualInfo structure.
  908.     This goes into the ng_VisualInfo field of the NewGadget structure.
  909.  
  910. NGDA_GadgetText STRPTR
  911.     Number label.
  912.     This goes into the ng_GadgetText field of the NewGadget structure.
  913.  
  914. NGDA_Flags ULONG
  915.     Flags. This goes into the ng_Flags field of the NewGadget structure.
  916.  
  917. plus other GadTools or Intuition gadget attributes
  918. as they apply to a number gadget.
  919.