Home Tutorial Win32 API Reference Projects

Stony Brook Modula-2Stony Brook Modula-2 archive


(***************************************************************************)
(*                                                                         *)
(*                     Copyright (C) 1992-2003                             *)
(*                        by Stony Brook Software                          *)
(*                                                                         *)
(*                          All rights reserved.                           *)
(*                                                                         *)
(***************************************************************************)
DEFINITION MODULE DlgShell;
(* This module provides an encapsulation of the interface to
   underlying operating system dialog boxes.
   This module interface is operating system independent.
*)

(* supported implementations
   Win32
   GTK+ 1.2
   Macintosh Carbon on OSX
*)

(* about threads
   Win32 - you may use the GUI features in a fully multi threaded manner.

   GTK - Only one thread, the main thread, may use the GUI features.

   Mac - Currently only one thread, the main thread, may use the GUI features.
*)

(* about resources
   Win32 - normal Win32 dialog box resources are used
   GTK+ - Glade XML files.
   Mac - Classic DLOG resources. Will change to only Interface builder in the future.
             We suggest you use the Resorcerer program for creating and editing
             your Mac resources. www.mathemaesthetics.com
             You should have a dlgx resource matching your DLOG resource.
             You should specify the theme controls, theme background and
             embeding hierarchy options in the dlgx resource.
             The items in the dialog MUST be control (CNTL) type resources. Classic
             dialogs can have dialog items which are not controls.
             The control id number is placed in the control reference value (RefCon).
             The id number of the dialog CNTL item does not matter and is not used
             by this module so just let the resoruce editor choose a unique value.
         Interface builder nib.
             Not yet supported.

*)

<*IF StonyBrook THEN*>
    <*/NOPACK*>

    (* a hack so we can do editing and compiling for syntax of Mac code
       using our compiler. *)
    <*/VALIDVERSION:MAC*>
    %IF p1 %THEN(*how we signal compiling Mac code*)
        <*/NOVERSION:WIN32*>
        <*/VERSION:MAC*>
    %END
<*ELSIF p1 THEN*>
    <*ASSIGN (AlignModelPPC, TRUE)*>
    <*DEFINE (MAC, TRUE)*>
<*ELSE*>
    fix me
<*END*>

FROM SYSTEM IMPORT
    ADDRESS, CAST, WORD32;

FROM WinShell IMPORT
    Window, COORDINATE, StringData, BitmapHandle;
IMPORT WinShell;

CONST
    CurrentAsParent     = CAST(Window, 1);
    (* Use this to specify the current dialog
      as the parent of the new dialog
      this is only used when one dialog creates another dialog. *)

VAR
<*IF StonyBrook THEN*>
    DlgError            : CARDINAL; (* operating system specific value *)
<*ELSIF p1 THEN*>
    DlgError            : INTEGER; (* operating system specific value *)
<*ELSE*>
    fix me
<*END*>

TYPE
    (* various types of dialog controls supported by this module *)
    ControlType = (
                   StaticText,
                   StaticTextAttrib,
                   CheckBox,
                   RadioGroup,
                   LineEdit,
                   NumberEdit,
                   SpinButton,
                   MultiLineEdit,
                   EditTextFile,
                   ListBox,
                   ColumnListBox,
                   DropDownList,
                   ComboBox,
                   ColorDropDownList,
                   DisplayBitmap,
                   PushButton,

                   DefaultButton,
                   Timer,
                   DialogTitle,
                   UserData
                  );
(*

    ======= ControlType =======

    Most fields set the initial value of the control as well as holding
    the return value.

    PushButton
        Win32 - push button
        Gtk - GtkButton
        Mac classic - standard push button. not "old" push button.
                      to specify the default button in the resource file
                      use a negative id number in the RefCon field.


        b_type = the type of button
            CloseButton    - the dialog is closed and data validation occurs.
            CancelButton   - the dialog is closed and data validation does not occur.
                             this button is the button selected when the user
                             presses the Escape (Esc) key in the dialog.
                             Win32 - on Windows only the control with the id
                                     value of 2 can be the cancel control.
                                     therefore for portability always use the id of
                                     2 for your cancel button.
            HelpButton     - the Pressed notification is sent and data
                             validation does not occur.
            NotifyButton   - the Pressed notification is sent and data
                             validation occurs.
            CancelNotifyButton - the Pressed notification is sent and data
                                 does not validation occur.
                                 this button is the button selected when the user
                                 presses the Escape (Esc) key in the dialog.
                                 you use this when your cancel need to take some
                                 action before the dialog is closed.
                                 Win32 - on Windows only the control with the id
                                         value of 2 can be the cancel control.
                                         therefore for portability always use the id of
                                         2 for your cancel button.
            NotifyButtonNV - the Pressed notification is sent and data
                             validation does not occur.

        b_return = for CloseButton and CancelButton the value to be
                   returned by the dialog.

    DefaultButton
        default_button = the DlgShell control identifier of the default button

        designates which button is the default.
        this is not necessary if the operating system resource defines
        which button is the default.

    CheckBox
        Win32 - check box
        Gtk - GtkCheckButton
        Mac classic - Check Box

        chk_on      = The state of the checkbox (checked is TRUE).
                      On entry sets box state and upon return contains the box state.

    RadioGroup
        Win32 - radio button
        Gtk - GtkRadioButton
        Mac classic - radio button

        r_first = The id of the first radio button in the button group.
        r_last  = The id of the last radio button in the button group.

        All items in the group must have consecutive id numbers from first to last.

        On entry id contains the initial item to check in the radio group.
        On return id contains the item in the group that is currently checked.
        This value is zero based from the first item in the group

    StaticText  = The text to display in the field. Can be NIL on init.
        Win32 - static text
        Gtk - GtkLabel
        Mac classic - Static text control.
                      If you will not be altering the text you can use a static text
                      dialog item in the resource. You do not need to list such an
                      item in the control list.
                      Otherwise...
                      The text you place "in" the control in the resrouce editor is not
                      displayed in the control. That text is the control title and the
                      static text control does not display a title.
                      To have the text listed in the control resource be displayed you
                      must list the static text control in the control list given to
                      DlgShell. This module reads the control title and sets the text of
                      the control to the title text.

        sta_text        = text to display in the control instead of the text that is
                          listed in the control resource.

    StaticTextAttrib    = The text to display in the field. Can be NIL.
        Win32 - static text
        Gtk - GtkLabel inside a GtkEventBox.
              You should place a label inside and event box for this
              control. A GtkLabel does not control its background color
              so you need the EventBox to be able to set the background
              color. If an event box is not the "parent" of this label,
              then the background color will not be set but the foreground
              and font attributes will still work.
        Mac classic - Static text control.

        sta_fore = the foreground color to display the text in.
        sta_back = the background color to display the text in.
        sta_font = the font to used to display the text in. (Can be NIL)

    LineEdit
        Win32 - edit
        Gtk - GtkEntry
        Mac classic - EditText

        le_text = Pointer to a null terminated string which holds the
                  edit field contents. Can be NIL. In this case
                  you will need to use the GetText procedure to fetch the
                  text from the control.
                  On entry the edit field is initialized with the text in
                  this string, and upon return the user entered text is
                  contained within this string.
        le_max  = The maximum number of characters allowed in the edit field.
                  The le_text buffer, if present, should be one character bigger
                  than the maximum allowable character count. This allows for
                  a null terminator.

    MultiLineEdit
        Win32 - edit with multi line option
        Gtk - GtkText
        Mac classic - EditText

        mle_text = Pointer to a null terminated string which holds the
                   edit field contents. Can be NIL. To enter/retrieve text
                   you can use the supplied line read/write APIs.
                   If not NIL, on entry the edit field is initialized with the
                   text from this string.
        mle_max = The maximum number of characters allowed in the edit field.
                  mle_max can be zero which means that the edit file has not limit
                  other than that implied by the system.
                  The mle_text buffer, if present, should be one character bigger
                  than the maximum allowable character count. This allows for
                  a null terminator.

                  IF (mle_max <> 0) AND (mle_text <> NIL) THEN
                  mle_text will contain the value of the edit field upon return.
                  The buffer should be one character bigger than the maximum to
                  allow for a null terminator character.

    EditTextFile
        etf_name = Pointer to a NULL terminated string which holds the
                   file name of the file to be edited.
                   the file will be saved when the dialog is closed if the user alters
                   the file in any way. if the dialog is "canceled" then
                   the file will not be saved.
                   This control is compatible with the MultiLineEdit control.

    NumberEdit
        Win32 - edit
        Gtk - GtkEntry
        Mac classic - EditText

        number_Val =  the initial and return value
        number_Min = the minimum value of the valid number range.
        number_Max = the maximum value of the valid number range.
        number_Hex = the number will be displayed in hexadecimal format
                     the user will be allowed to enter a number in hex
                     or decimal format
        number_msg = the string id number of the message displayed when
                     an invalid or out of range number is entered.
                     if 0, then a default message is displayed.

    SpinButton
        Win32 - a composite of two resource controls.
          1) UpDown control
          2) edit control. the auto buddy of the UpDown control must be
                           this edit control.
        Gtk - GtkSpinButton
        Mac classic - a composite of two resource controls.
          1) little arrows control.
          2) edit text control. the RefCon field should have the
                                negative value of the control.

        spin_Val = the numeric value.
        spin_Min = the minimum value of the valid number range.
        spin_Max = the maximum value of the valid number range.

    ListBox
        Win32 - list box, single or multiple selection
        Gtk - GtkCList (1 column), browse/single or multiple selection
        Mac classic - ListBox with 1 column.
                      the classic resource does not allow specifying if
                      a list box is single or multiple selection.
                      if the RefCon field is positive the list is single
                      selection.
                      if the RefCon field is negative the list is
                      multiple selection.

        lb_text
                = Pointer to an array of null terminated strings terminated
                  by a null, meaning the end of the string has a double null.
                  See the ConvertToNulls and ConvertFromNulls procedures in
                  this module for a simple method maintaining such strings.
        lb_selStr
                = Pointer to a string to hold the result as well as the
                  initial selection. This value can be NIL if you want to
                  set and receive the selection by index. The strings are
                  not case sensitive.
                  On termination this string has the users selection if it
                  does not have NIL.
                  selStr MUST be big enough to hold any string in the
                  list box.
                  For multiple selection, this is the last item selected by the
                  user.
        lb_selIndex
                = if selStr is NIL on entry, this has the initial selection
                  index. On termination this always has the users selection
                  by index regardless of if selStr <> NIL.
                  For sorted, this is the index of the order data was
                  added to the list box, not how it was displayed.
                  The index is zero based, and MAX(CARDINAL) signifies no
                  selection.
                  For multiple selection, this is the last item selected by the
                  user.

    ColumnListBox
        The list box has 2 or more columns.

        Win32 - ListView in report mode, single or multiple selection
        Gtk - GtkCList, browse/single or multiple selection
        Mac classic - this is a Data browser control. Unforntunately a
                      classic resource cannot specify a data browser control.
                      therefore in the dialog resource simply define a ListBox
                      control and this module will replace that with a
                      data browser control.

        clb_columns = The number of columns, 2 or more

        clb_columnInfo =
                = Pointer to and array of CARDINAL values with the column
                  widths in screen pixels. Must have clb_columns number of
                  elements.
                  The first element is for column zero, and so on...

                  width = the column width in pixels. Can be zero if you are
                          going to set the column size via APIs
                  align = The alignment of the text in the column.
                  header = the header text. Can be NIL, which means the
                           header, if shown, with not have a title.
        clb_selStr
                = Pointer to a string to hold the result.
                  This value can be NIL if you want to receive the selection
                  by index.
                  On termination this string has the users selection if it
                  does not contain NIL.
                  selStr MUST be big enough to hold any string in the
                  list box.
                  selStr contains the text of all columns separated by null characters.
                  For multiple selection, this is the last item selected by the
                  user.
        clb_selIndex
                = On termination this always has the users selection.
                  The index is zero based, and MAX(CARDINAL) signifies no
                  selection.
                  For multiple selection, this is the last item selected by the
                  user.

    DropDownList
        Win32 - combo box with drop down list attribute
        Gtk - GtkOptionMenu, or GtkCombo(not editable)
            OptionMenu is the ideal widget but if you have a large
            number of items in the list then OptionMenu does not work
            well, if at all. In these cases use a GtkCombo with the
            edit field marked as not editable.
        Mac classic - popup menu button.
                    the menu id of the control should be -12345,
                    since this module will be replacing the menu
                    with the items you specify.

        ddl_text = Pointer to an array of null terminated strings terminated
                  by a null, meaning the end of the string has a double null.
        ddl_selIndex
                = this has the initial selection index.
                  On termination this always has the users selection.
                  The index is zero based, and MAX(CARDINAL) signifies no
                  selection.

    ColorDropDownList
        this control displays a selection of colors for the user to choose from.

        Win32 - combo box with drop down list attribute
        Gtk - GtkOptionMenu
        Mac classic. not yet supported.

        cddl_colorData = pointer to an array of color values
        cddl_colorCount = number of items in the color array
        cddl_selIndex
                = this has the initial selection index.
                  On termination this always has the users selection.
                  The index is zero based, and MAX(CARDINAL) signifies no
                  selection.

    ComboBox
        Win32 - ComboBox (simple or drop down)
        Gtk - GtkCombo
        Mac classic - The Mac does not have a control of this type.
                    this module synthesizes it via a composite of
                    multiple controls.
                    you need to define two controls in your dialog
                    resource.
                    1) disclousure button.
                    2) EditText. the RefCon field should have the
                       negative value of the control.

        cb_text = Pointer to an array of null terminated strings terminated
                  by a null, meaning the end of the string has a double null.
        cb_max  = Maximum number of characters that edit portion will accept.
                  The cb_text buffer, if present, should be one character bigger
                  than the maximum allowable character count. This allows for
                  a null terminator.
        cb_selStr
                = Pointer to a string to hold the result as well as the
                  initial selection. The strings are not case sensitive.
                  On termination this string has the users selection.

    UserData
        allows you to have some data attached to a dialog box for access by
        the notify procedure

    Timer
        the notify procedure will be called when the timerInterval for this time
        has elapsed.

        id = A unique number to identify the timer.
        timerInterval = the timer interval in milliseconds. A value of
                        zero means the timer is not activated.
*)

    NotifyType   = (
                    InitDialog, (* only dialogs *)
                    DestroyDialog, (* only dialogs *)
                    ValueChanged, (* all that accept user input *)
                    LoseFocus, (* all *)
                    GainFocus, (* all *)
                    Validate, (* all that accept user input *)
                    SelectionChanged, (* all ListBoxes, DropDownLists, ComboBox *)
                    DoubleClicked, (* all ListBoxes *)
                    Pressed,  (* NotifyButton,
                                 CheckBox,
                                 RadioGroup *)
                    TimerElapsed, (* Timer *)
                    DialogModified, (* only dialogs *)
                    PageActivate,    (* only tabbed dialogs *)
                    PageDeactivate,  (* only tabbed dialogs *)
                    PageCancel,       (* only tabbed dialogs *)
                    ContextHelp(* all *)
                   );

(*
    ======= NotifyType =======

    InitDialog
        The dialog is Initing and about to be displayed.

    DestroyDialog
        The dialog is terminated. Do not access anything. Use this to
        free any memory or resources you may have allocated for the dialog.

    ValueChanged
        The text in a control has been changed.

    LoseFocus
        Input focus has been lost.
        On the Mac very few controls can actually accept input focus. Typically
        only controls that accept user data input and list boxes.

    GainFocus
        Input focus is now on the specified control.
        On the Mac very few controls can actually accept input focus. Typically
        only controls that accept user data input and list boxes.

    Validate
        The user is/has moved the input focus from one control to another.
        You can use this notification of validate the input of the current control.
        You can fail the validation and the input focus will be remain on
        the current control.

    SelectionChanged
        The selected item in a control has been changed.

    DoubleClicked
        An item in a control was double clicked.

    Pressed
        The button was pressed.

    TimerElapsed
        Self explanatory

    DialogModified
        Lets you know that the current dialog has been modified in some way.
        Very useful with tabbed dialogs. For tabbed dialogs each page will
        receive this message if something on that page has been altered.
        The dialog as a whole is considered altered if any single page has
        been altered.

    PageActivate
        For tabbed dialogs. Notifies you that the page is being activated.

    PageDeactivate
        For tabbed dialogs. Notifies you that the page is being deactivated.
        If you return ContinueDialog from this message the page will be
        allowed to deactivate. If you return DisallowPageDeactivate the
        page will remain the active page. For example you may want to
        validate some entry fields and disable switching/closing the current
        page until proper data has been entered.

    PageCancel
        For tabbed dialogs. The user has pressed the "cancel" button.
        All pages will receive this message when a tabbed dialog is being
        canceled. This will allow you to perform any necessary processing
        to satisfy "cancelling" the users modifications.

    ContextHelp
        Sent when context help was selected for the control but the control
        helpId value was 0.
*)

    PushButtonType = (
                      CloseButton,
                      CancelButton,
                      HelpButton,
                      NotifyButton,
                      CancelNotifyButton,
                      NotifyButtonNV
                     );

    NotifyResult = (
                    ContinueDialog, (* means continue normally *)
                    TerminateDialog,(* the dialog is closed *)
                                    (* data fields will be validated *)
                                    (* this is considered a successfull *)
                                    (* dialog exit return *)
                    CancelDialog,(* the dialog is closed *)
                                 (* data fields will NOT be validated.
                                    this is considered a failed return.
                                 *)
                    DisallowPageDeactivate, (* use with tabbed dialogs *)
                    FailedValidation(*used with the Validate notify message*)
                   );

    NotifyProc  = PROCEDURE(
                            NotifyType, (* what happened *)
                            VAR INOUT CARDINAL
                                            (* on entry identifies the control
                                               associated with this notification.
                                               MAX(CARDINAL) signifies the
                                               entire dialog as the "control".

                                               See SetControlIdMode for a full
                                               description of how controls are
                                               identified.

                                               If you return TerminateDialog or
                                               CancelDialog,
                                               then assign the value you want the
                                               dialog call to return to this
                                               parameter. This only has
                                               meaning for modal dialogs.
                                            *)
                           ) : NotifyResult;

    DialogPositions     = (
                           NormalPosition, (* dialog resource position *)
                           CenterOnParent, (* center on parent window *)
                           CenterOnScreen  (* center on physical screen *)
                          );

    ColorValue  = WinShell.ColorValue;
    FontInfo    = WinShell.FontInfo;
    ControlColumnInfo = WinShell.ControlColumnInfo;
    TextAlignment = WinShell.TextAlignment;

    FontInfoPointer = POINTER TO FontInfo;

    CONTROL     =
        RECORD
        id              : CARDINAL; (* the control identifier number *)
                                    (* For RadioGroup and Timer
                                       See the description of the control *)
                                    (* For DialogTitle and UserData this field
                                       has no meaning so just set it to zero *)
        helpId          : CARDINAL; (* context help id.
                                       this is the id number of a string resource entry.
                                       Use 0 for no help. In this case the Contexthelp
                                       notification is sent.

                                       A user gets help by clicking the "help" button
                                       and then clicking the control in which they
                                       want help for. A popup help window is shown with
                                       the help string. The help string can have multiple
                                       lines.

                                       As a convenience on the following controls

                                       RadioGroup,
                                       LineEdit, MultiLineEdit, NumberEdit,
                                       ListBox, ColumnListBox
                                       ComboBox, DropDownList, ColorDropDownList

                                       the id number 1 less than the control(s) id
                                       is assumed to be a label/frame for the control,
                                       *unless* a specific control exists with that
                                       id number in the control array.
                                       This "label" will also get the help text
                                       of the control if the user asks for context
                                       help on this item.

                                       Win32
                                           the standard dialog box context help
                                           mechanism is used. Your resource should have
                                           this dialog style.

                                       Gtk and Mac
                                           no such mechanism exists so this module
                                           simulates it.

                                           For normal dialogs you should define a button
                                           with an id of 911 in the dialog. this module
                                           will treat that button as the initiator of the
                                           context help sequence. This button should NOT
                                           be listed in the control array.

                                           Tabbed dialogs simply look at the various
                                           controls in the dialog tabs and if any one of
                                           them has a non zero help id number then a
                                           context help button is added to the dialog.
                                           You do not need, and should not have,
                                           a 911 button defined in the dialog resource(s).
                                       *)

        CASE ct : ControlType OF
        PushButton:
            b_type              : PushButtonType;
            b_return            : CARDINAL;
        |
        DefaultButton:
            default_button      : CARDINAL;
        |
        RadioGroup:
            r_first             : CARDINAL;
            r_last              : CARDINAL;
        |
        CheckBox:
            chk_on              : BOOLEAN;
        |
        LineEdit:
            le_text             : StringData;
            le_max              : CARDINAL;
        |
        MultiLineEdit:
            mle_text            : StringData;
            mle_max             : CARDINAL;
        |
        EditTextFile:
            etf_name            : StringData;
            etf_altered         : BOOLEAN;
        |
        StaticText:
            st_text             : StringData;
        |
        StaticTextAttrib:
            sta_text            : StringData;
            sta_fore            : ColorValue;
            sta_back            : ColorValue;
            sta_font            : FontInfoPointer;
        |
        ListBox:
            lb_text             : StringData;
            lb_selStr           : StringData;
            lb_selIndex         : CARDINAL;
        |
        ColumnListBox:
            clb_columns         : CARDINAL;
            <*IF StonyBrook THEN*>
            clb_columnInfo      : POINTER TO ARRAY [0..0] OF ControlColumnInfo;
            <*ELSIF p1 THEN*>
            clb_columnInfo      : POINTER TO ARRAY [0..31] OF ControlColumnInfo;
            <*ELSE*>
                fix me
            <*END*>
            clb_selStr          : StringData;
            clb_selIndex        : CARDINAL;
        |
        DropDownList:
            ddl_text            : StringData;
            ddl_selIndex        : CARDINAL;
        |
        ColorDropDownList:
            <*IF StonyBrook THEN*>
            cddl_colorData      : POINTER TO ARRAY [0..0] OF ColorValue;
            <*ELSIF p1 THEN*>
            cddl_colorData      : POINTER TO ARRAY [0..127] OF ColorValue;
            <*ELSE*>
                fix me
            <*END*>
            cddl_colorCount     : CARDINAL;
            cddl_selIndex       : CARDINAL;
        |
        ComboBox:
            cb_text             : StringData;
            cb_selStr           : StringData;
            cb_max              : CARDINAL;
        |
        SpinButton:
            spin_Val            : INTEGER;
            spin_Min            : INTEGER;
            spin_Max            : INTEGER;
        |
        NumberEdit:
            number_Val          : INTEGER;
            number_Min          : INTEGER;
            number_Max          : INTEGER;
            number_Msg          : CARDINAL;
            number_Hex          : BOOLEAN;
        |
        Timer:
            timerInterval       : CARDINAL;
        |
        DisplayBitmap:
            db_bitmap           : BitmapHandle;
        |
        DialogTitle:
            dlgTitle            : StringData;
        |
        UserData:
            userData            : ADDRESS;
        ELSE
        END;
    END;

    <*IF StonyBrook THEN*>
    ControlsPointer     = POINTER TO ARRAY [0..0] OF CONTROL;
    <*ELSIF p1 THEN*>
    ControlsPointer     = POINTER TO ARRAY [0..127] OF CONTROL;
    <*ELSE*>
        fix me
    <*END*>
    PAGE =
        RECORD
        controls        : ControlsPointer;
        numControls     : CARDINAL;
        notify          : NotifyProc;
        name            : StringData;(*dialog resource*)
        title           : StringData;(*tab text, NIL to use the dialog resource
                                       title.
                                     *)
        END;

    DialogSizes = (NormalDialog, LargeDialog, ExtraLargeDialog);
    (* Win32
       this changes the size of the font used in a dialog. on Win32 this effectively
       makes the controls and thus the dialog larger. rememeber that dialog sizes are
       based on dialog units, which are based on the font used for a dialog.
       Large = +2 points, ExtraLarge = +4 points
       if the dialog resource used an 8pt font then, Large=10, ExtraLarge=12.

       GTK
       currently ignored.
    *)

    ControlIdModes = (ControlSubscript, ControlId);

VAR
    DialogSize  : DialogSizes;

<*IF StonyBrook THEN*>
    %IF DLL %THEN
    <*/EXPORTALL/PROPAGATEEXCEPTIONALL/COPYATTRIBUTES*>
    %END
<*END*>

PROCEDURE GetDialogParent() : Window;
(* a utility function to return the current foreground window, or
   the current modal dialog for use as a parent for a dialog.
   If the current foreground window is NIL then the value
   of WinShell.MainWindow is used.
*)

PROCEDURE SetControlIdMode(mode : ControlIdModes);
PROCEDURE GetControlIdMode() : ControlIdModes;
(*
  set how this module identifies individual controls.
  ControlIdSubscript
      Controls are identiifed by their control array subscript position, zero based.
      This is the original DlgShell mode and is the default mode at startup.
  ControlId
      Controls are identified by their id value.
      RadioGroups are identified by the id number, r_first.
      If you are using symbolic constants for your control ids then this
      mode is probably preferable.
*)

PROCEDURE CallDialog(parent : Window;
                     name : ARRAY OF CHAR;
                     VAR INOUT ctrls : ARRAY OF CONTROL;
                     notify : NotifyProc;
                     position : DialogPositions) : CARDINAL;
(*
   opens a modal dialog.
   The dialog is a named resource and the name is specified in the name parameter.

       Gtk - The dialog window should not have the visible attribute. This
             module will show the dialog once the controls and dialog are
             fully initialized.

   parent = the parent window of the dialog.
   ctrls = the controls in the dialog. This need not be all of the controls
           in the dialog resource but those controls that you need to
           perform some processing action with. For example a dialog may
           have many static text controls and if you have no need to change
           the text of these controls you need NOT specify them in the
           controls array.
           How controls are identified in the Notify procedure and in the API calls
           of this module depends on the control id mode.
           See SetControlIdMode.
   notify = the call back procedure. Pass NIL_NOTIFY if you have no
            need for a call back procedure. This is quite common.
            You generally only need a notification procedure if you need to
            validate data or perform other processing. You do not need
            a notification procedure to initialize the controls with
            information or to retrieve the information the user has entered.
            Mechanisms are in place to handle this without a call back
            notification procedure. However many times it is easier to fill
            a list box without generating the data structure to automatically
            fill the list and in this case you would "initialize" the
            list with NIL and then use API calls to add items to the list.
            Multi line edit controls are also probably easier to deal with
            using API calls rather than the control data structures. These
            are two examples of choices you will need to make in developing
            your dialog boxes.
   position = Allows you to specify where on the screen the dialog is displayed.
*)

PROCEDURE ModelessDialog(parent : Window;
                         name : ARRAY OF CHAR;
                         VAR INOUT ctrls : ARRAY OF CONTROL;
                         notify : NotifyProc;
                         position : DialogPositions) : CARDINAL;
(*
   opens a modeless dialog. The dialog is a named resource and the name
   is specified in the name parameter.
   The return value identifies the dialog for use in the various
   API calls provided in this module. Many times you may not need to save
   this value since while processing a notify message you are the current
   dialog, and if the modeless dialog terminates itself then you do not need
   the value to close the dialog.
   See CallDialog
*)

PROCEDURE CallTabbedDialog(parent : Window;
                           title : ARRAY OF CHAR;
                           VAR INOUT pages : ARRAY OF PAGE;
                           position : DialogPositions) : CARDINAL;
(*
   opens a modal "tabbed" dialog.
   Win32 - A property sheet is created.
   Gtk - a Window with a notebook widget is created.

   title = the dialog title. Null terminated
   pages = the list of "sub dialogs"/pages/tabs.

    controls = this is the same as the ARRAY OF CONTROL parameter
               in CallDialogByName.
    numControls = the number of controls in the controls array.
    notify = Same as the notify parameter in CallDialogByName
    name  = specifies the name of the dialog resource for this
            page of the tabbed dialog.
    title = the text of the tab. NIL if you want ot use the dialog resource
            title (the caption text of the source).

    Win32.
        Dialog resources should be marked with the PropertySheet and Child
        attributes.
    Gtk
        Dialog resources should be windows without the visible attribute.
        The container in the dialog must be named "mainbox". It does not
        matter what type of container it is. This module extracts the
        container from the dialog window and places it into the notebook
        page(s).

    You can use the same notify procedure for all pages in the dialog.
    If this is the case you may need to inquire about the current page.

   See CallDialog
*)

(*  --------------------------------------------------------------------*)
(*  --------------------------------------------------------------------*)
(*  --------------------------------------------------------------------*)

(*
   most of the following API procedures have two versions of the same
   procedure. One procedure explicitly takes the dialog number and the
   other assumes the current dialog.

   When you receive a notify message your dialog is the current dialog and you
   can use those API procedures assuming the current dialog.
   This is true for modal and modeless dialogs.

   To access a modeless dialog, outside of a notification you will need to use
   the dialog number APIs.

   For modal dialogs you NEVER know what the dialog number is unless you
   call GetDialogNumber() while you are the current dialog, and why bother
   doing such a thing.
*)

PROCEDURE ShowDialog(dlgNum : CARDINAL; yes : BOOLEAN);
(*
   If yes = TRUE then the dialog will be visible, otherwise the dialog
   will be invisible. This makes no sense for modal dialogs.
*)

PROCEDURE CloseDialog(dlgNum : CARDINAL; cancel : BOOLEAN);
(*
   close the dialog specified by dlgNum. Only use this with modeless dialogs
   remember that a dialog can terminate itself by simply returning
   TerminateDialog or CancelDialog from its notify procedure
*)

PROCEDURE GetDialogNumber() : CARDINAL;
(*   get the dialog number for the current dialog
*)

PROCEDURE GetActivePage() : CARDINAL;
(*
   For tabbed dialogs only
   get the currently active page number for the currently active dialog
   page numbers are zero based.
*)

PROCEDURE SetActivePage(page : CARDINAL);
(*
   For tabbed dialogs only
   set the active page of the current dialog
*)

PROCEDURE GetUserDataDlg(dlgNum : CARDINAL) : ADDRESS;
PROCEDURE GetUserData() : ADDRESS;
(*
   dlgNum specifies the dialog
   get the user data attached to the dialog.
   for tabbed dialogs operates on the current page only
*)

PROCEDURE PositionDialogDlg(dlgNum : CARDINAL; pos : DialogPositions);
PROCEDURE PositionDialog(pos : DialogPositions);
(*
   dlgNum specifies the dialog
   reposition the dialog on the screen using the pos parameter
*)

PROCEDURE GetDialogSizeDlg(dlgNum : CARDINAL; VAR OUT x, y : COORDINATE);
PROCEDURE GetDialogSize(VAR OUT x, y : COORDINATE);
(*
   dlgNum specifies the dialog
   get the size of the dialog in screen pixels
   x = width, y = height
*)

PROCEDURE GetDefaultButtonDlg(dlgNum : CARDINAL) : CARDINAL;
PROCEDURE GetDefaultButton() : CARDINAL;
(*
   dlgNum specifies the dialog
   get the button control that is the current default button
*)

PROCEDURE SetDefaultButtonDlg(dlgNum : CARDINAL; control : CARDINAL);
PROCEDURE SetDefaultButton(control : CARDINAL);
(*
   dlgNum specifies the dialog
   set the default button to the control.
*)

PROCEDURE SetPaintDlg(dlgNum : CARDINAL; control : CARDINAL; on : BOOLEAN);
PROCEDURE SetPaint(control : CARDINAL; on : BOOLEAN);
(*
   dlgNum specifies the dialog
   If on = TRUE then the control will repaint itself
   when necessary, otherwise it will not repaint itself until paint is
   turned on for this control. An example of using this would be loading
   a listbox control. It is senseless to have a list box repaint itself
   after each item you add until you have added all items to the list box.
*)

PROCEDURE SetEnableDlg(dlgNum : CARDINAL;
                       control : CARDINAL;
                       enabled : BOOLEAN);
PROCEDURE SetEnable(control : CARDINAL; enabled : BOOLEAN);
(*
   dlgNum specifies the dialog
   If enabled = TRUE the control will be enabled thus
   allowing the user to interact with the control, otherwise the control
   will be disabled or "grayed out"
   If this is used on a RadioGroup all radio buttons in the group will be
   disabled.
*)

PROCEDURE SetEnableRangeDlg(dlgNum : CARDINAL;
                            first, last : CARDINAL;
                            enabled : BOOLEAN);
PROCEDURE SetEnableRange(first, last : CARDINAL; enabled : BOOLEAN);
(*
  as SetEnable, except all controls from first..last are acted upon
*)

PROCEDURE SetEnableRadioDlg(dlgNum : CARDINAL;
                            control, item : CARDINAL;
                            enabled : BOOLEAN);
PROCEDURE SetEnableRadio(control, item : CARDINAL; enabled : BOOLEAN);
(*
   dlgNum specifies the dialog
   If enabled = TRUE the radio group i'th item identified
   by item will be enabled thus allowing the user to interact with the control,
   otherwise the item will be disabled or "grayed out"
*)

PROCEDURE SetVisibleDlg(dlgNum : CARDINAL;
                        control : CARDINAL;
                        visible : BOOLEAN);
PROCEDURE SetVisible(control : CARDINAL; visible : BOOLEAN);
(*
   dlgNum specifies the dialog
   If visible = TRUE the control will be visible thus
   allowing the user to interact with the control, otherwise the control
   will not be visible and thus not available to the user
   If this is used on a RadioGroup all radio buttons in the group will be
   invisible.
*)

PROCEDURE SetVisibleRadioDlg(dlgNum : CARDINAL;
                             control, item : CARDINAL;
                             visible : BOOLEAN);
PROCEDURE SetVisibleRadio(control, item : CARDINAL; visible : BOOLEAN);
(*
   dlgNum specifies the dialog
   If visible = TRUE the radio group i'th item identified by item will be visible thus
   allowing the user to interact with the control,
   otherwise the item will be invisible.
*)

PROCEDURE SetColorAndFontDlg(dlgNum : CARDINAL;
                      control : CARDINAL;
                      fore, back : ColorValue;
                      font : FontInfoPointer);
PROCEDURE SetColorAndFont(control : CARDINAL;
                          fore, back : ColorValue;
                          font : FontInfoPointer);
(*
   dlgNum specifies the dialog
   set the color and font of the control.
   font can be NIL if you do not want to set the font.

   currently can only be used with StaticTextAttrib controls
*)

PROCEDURE SetInputFocusToDlg(dlgNum : CARDINAL; control : CARDINAL);
PROCEDURE SetInputFocusTo(control : CARDINAL);
(*
   dlgNum specifies the dialog
   set the keyboard input focus to the specified control.
*)

PROCEDURE GetInputFocusControlDlg(dlgNum : CARDINAL) : CARDINAL;
PROCEDURE GetInputFocusControl() : CARDINAL;
(*
  return the control that currently has the input focus.
*)

PROCEDURE SetupStringMatchDlg(dlgNum : CARDINAL;
                              control : CARDINAL;
                              startPos : CARDINAL;
                              column : CARDINAL);
PROCEDURE SetupStringMatch(control : CARDINAL;
                           startPos : CARDINAL;
                           column : CARDINAL);
(*
   For ListBox, ColumnListBox.
   this sets up the ability of the list box to perform a full text
   search. The list box will automatically select the first item in the
   list that matches the text entered. The match string is cleared when a certain
   time has elapsed in between successive keystrokes.

   startPos = the string character position to start the comparison.
   column = if ColumnListBox, the column to compare.
*)

PROCEDURE ClearMatchBufferDlg(dlgNum : CARDINAL; control : CARDINAL);
PROCEDURE ClearMatchBuffer(control : CARDINAL);
(*
   clear the match buffer. This is the keystrokes that the user may have
   entered during ASCII matching. You could use this after reloading a list box
   with new data, so the match is not in the middle of some previous match search.
*)

PROCEDURE SetCheckBoxDlg(dlgNum : CARDINAL; control : CARDINAL; on : BOOLEAN);
PROCEDURE SetCheckBox(control : CARDINAL; on : BOOLEAN);
(*
   dlgNum specifies the dialog
   set the check box state of the check box control.
   on = TRUE = the check box will be "checked"
*)

PROCEDURE GetCheckBoxDlg(dlgNum : CARDINAL; control : CARDINAL) : BOOLEAN;
PROCEDURE GetCheckBox(control : CARDINAL) : BOOLEAN;
(*
   dlgNum specifies the dialog
   get the check box state of the check box control.
   returns TRUE when the check box is "checked"
*)

PROCEDURE SetRadioGroupDlg(dlgNum : CARDINAL;
                           control, item : CARDINAL);
PROCEDURE SetRadioGroup(control, item : CARDINAL);
(*
   dlgNum specifies the dialog
   set the selected/checked radio group item identified by item in the
   radio group control.
   The item will become the checked radio group item. If another item in the
   group is currently checked, it will be unchecked in favor of the new item
*)

PROCEDURE GetRadioGroupDlg(dlgNum : CARDINAL; control : CARDINAL) : CARDINAL;
PROCEDURE GetRadioGroup(control : CARDINAL) : CARDINAL;
(*
   dlgNum specifies the dialog
   get the checked item in the radio group.
*)

PROCEDURE SetRadioTextDlg(dlgNum : CARDINAL;
                          control, item : CARDINAL;
                          text : ARRAY OF CHAR);
PROCEDURE SetRadioText(control, item : CARDINAL; text : ARRAY OF CHAR);
(*
   dlgNum specifies the dialog
   set the text of a radio group item identified by item with the
   new text in the parameter text (null terminated).
*)

PROCEDURE GetRadioTextDlg(dlgNum : CARDINAL;
                          control, item : CARDINAL;
                          VAR OUT text : ARRAY OF CHAR);
PROCEDURE GetRadioText(control, item : CARDINAL; VAR OUT text : ARRAY OF CHAR);
(*
   dlgNum specifies the dialog
   get the text of a radio group item identified by item
   return the text in the text parameter
*)

PROCEDURE SetTimerIntervalDlg(dlgNum : CARDINAL;
                              control : CARDINAL;
                              time : CARDINAL);
PROCEDURE SetTimerInterval(control : CARDINAL; time : CARDINAL);
(*
   dlgNum specifies the dialog
   set the interval of the timer notifications in time. time is specified
   in milliseconds. The interval notifications are only approximate.
   If a value of zero is passed for the interval, the timer is disabled and
   you will receive no further timer notifications until the timer is again
   activated
*)

PROCEDURE SetTextDlg(dlgNum : CARDINAL;
                     control : CARDINAL;
                     text : ARRAY OF CHAR) : BOOLEAN;
PROCEDURE SetText(control : CARDINAL; text : ARRAY OF CHAR) : BOOLEAN;
(*
   dlgNum specifies the dialog
   set the text of the control.
   the text parameter must be null terminated.
   the following controls have a special meaning for SetText
   RadioGroup use SetRadioText
   ListBox the effect is to select the list box item that matches the text parameter.
   ColumnListBox, the same effect as ListBox, the match is done to column 0.

   for TermButton, NotifyButton, CheckBox you can apply an accelerator
   in the label text. the underscore character '_' signifies that the
   following chracter should be an accelerator key for the button.

   returns TRUE is successful
*)

PROCEDURE GetTextDlg(dlgNum : CARDINAL;
                     control : CARDINAL;
                     VAR OUT text : ARRAY OF CHAR) : BOOLEAN;
PROCEDURE GetText(control : CARDINAL; VAR OUT text : ARRAY OF CHAR) : BOOLEAN;
(*
   dlgNum specifies the dialog
   get the text of the control.
   RadioGroup use GetRadioText
   ListBox the effect is to fetch the text of the selected item in the list box.
   ColumnListBox as ListBox. Column 0 is used.
   returns TRUE is successful
*)

PROCEDURE SetNumericValueDlg(dlgNum : CARDINAL;
                             control : CARDINAL;
                             value : INTEGER) : BOOLEAN;
PROCEDURE SetNumericValue(control : CARDINAL; value : INTEGER) : BOOLEAN;
(* see the text of the control to the string representation of
   the passed numeric value.
   Any control that displays text can use this call.
   Also sets SpinButton controls.
*)

PROCEDURE GetSpinButtonValueDlg(dlgNum : CARDINAL;
                               control : CARDINAL) : INTEGER;
PROCEDURE GetSpinButtonValue(control : CARDINAL) : INTEGER;
(*
   dlgNum specifies the dialog
   get the numeric value of the SpinButton control.
   if the control is not an SpinButton control MIN(INTEGER) is returned.
*)

PROCEDURE SetSpinButtonRangeDlg(dlgNum : CARDINAL;
                                control : CARDINAL;
                                min, max : INTEGER);
PROCEDURE SetSpinButtonRange(control : CARDINAL; min, max : INTEGER);
(*
   dlgNum specifies the dialog
   set the numeric range of the SpinButton control.
*)

PROCEDURE SetItemTextDlg(dlgNum : CARDINAL;
                         control, item, column : CARDINAL;
                         text : ARRAY OF CHAR) : BOOLEAN;
PROCEDURE SetItemText(control, item, column : CARDINAL; text : ARRAY OF CHAR) : BOOLEAN;
(*
  set the text of the specific item in the list of items.
   column is the column number to set the text
  for ListBox(s) and ComboBox and DropDownList.
  column is ignored for all controls except ColumnListBox
*)

PROCEDURE GetItemTextDlg(dlgNum : CARDINAL;
                         control, item, column : CARDINAL;
                         VAR OUT text : ARRAY OF CHAR) : BOOLEAN;
PROCEDURE GetItemText(control, item, column : CARDINAL;
                      VAR OUT text : ARRAY OF CHAR) : BOOLEAN;
(*
  get the text of the specific item in the list of items.
   column is the column number to set the text
  for ListBox(s) and ComboBox and DropDownList.
  column is ignored for all controls except ColumnListBox
*)

PROCEDURE SetTextSelectionDlg(dlgNum : CARDINAL;
                              control : CARDINAL;
                              startPos, endPos : CARDINAL) : BOOLEAN;
PROCEDURE SetTextSelection(control : CARDINAL;
                           startPos, endPos : CARDINAL) : BOOLEAN;
(*
   dlgNum specifies the dialog
   set the text selection in a LineEdit, MultiLineEdit or ComboBox control.
   startPos and endPos are zero based and specify the starting and
   ending character position to the selection.
   use MAX(CARDINAL) for endPos to select all text from startPos
   to the end of the buffer.
*)

PROCEDURE ClearTextSelectionDlg(dlgNum : CARDINAL; control : CARDINAL);
PROCEDURE ClearTextSelection(control : CARDINAL);
(*
   dlgNum specifies the dialog
   clear any text section in a LineEdit, MultiLineEdit or ComboBox control.
*)

PROCEDURE GetItemCountDlg(dlgNum : CARDINAL; control : CARDINAL) : CARDINAL;
PROCEDURE GetItemCount(control : CARDINAL) : CARDINAL;
(*
   dlgNum specifies the dialog
   For all ListBox(s) and DropDownList(s) and ComboBox(s)
   returns the number of items in the list
   this result can be zero
*)

PROCEDURE GetSelectedDlg(dlgNum : CARDINAL; control : CARDINAL) : CARDINAL;
PROCEDURE GetSelected(control : CARDINAL) : CARDINAL;
(*
   dlgNum specifies the dialog
   For all ListBox(s), DropDownList(s) and ComboBox(s)
   returns the number of the selected item in the list.
   MAX(CARDINAL) signifies no selection.
*)

PROCEDURE SetSelectedDlg(dlgNum : CARDINAL;
                         control : CARDINAL;
                         sel : CARDINAL) : BOOLEAN;
PROCEDURE SetSelected(control : CARDINAL; sel : CARDINAL) : BOOLEAN;
(*
   dlgNum specifies the dialog
   For all ListBox(s), DropDownList(s), ComboBox(s)
   set the selected item in the control.
   MAX(CARDINAL) signifies no selection.
   returns TRUE if successful
*)


PROCEDURE GetSelectedItemsCountDlg(dlgNum : CARDINAL; control : CARDINAL) : CARDINAL;
PROCEDURE GetSelectedItemsCount(control : CARDINAL) : CARDINAL;
(*
   dlgNum specifies the dialog
   For multiple selection ListBox(s).
   returns the number of selected items in the list.
*)

PROCEDURE GetSelectedItemsDlg(dlgNum : CARDINAL;
                              control : CARDINAL;
                              VAR OUT items : ARRAY OF CARDINAL) : CARDINAL;
PROCEDURE GetSelectedItems(control : CARDINAL;
                           VAR OUT items : ARRAY OF CARDINAL) : CARDINAL;
(*
   dlgNum specifies the dialog
   For multiple selection ListBox(s).
   returns the number of selected items in the list.
   the items array contains the index of each selected item.
*)

PROCEDURE AppendItemDlg(dlgNum : CARDINAL;
                        control : CARDINAL;
                        str : ARRAY OF CHAR) : INTEGER;
PROCEDURE AppendItem(control : CARDINAL; str : ARRAY OF CHAR) : INTEGER;
(*
   dlgNum specifies the dialog
   For ListBox, DropDownList and ComboBox
   add a new item at the end of the list of items in the control.
   returns the item number if successful, otherwise -1
   NOTE: If the control is an operating system sorted control then
   you do not know where in the list (ordinal position) the item exists
   after you add or delete another item. See SetItemData
*)

PROCEDURE RemoveItemDlg(dlgNum : CARDINAL; control : CARDINAL; item : CARDINAL);
PROCEDURE RemoveItem(control : CARDINAL; item : CARDINAL);
(*
   dlgNum specifies the dialog
   For ListBox, DropDownList, and ComboBox
   remove a specific item in the list identified by item
   items after this one in the list will of course be identified differently
   after this call
*)

PROCEDURE RemoveAllItemsDlg(dlgNum : CARDINAL; control : CARDINAL);
PROCEDURE RemoveAllItems(control : CARDINAL);
(*
   dlgNum specifies the dialog
   For all ListBox(s), DropDownList(s) and ComboBox(s)
   remove all items in the list leaving an empty list
*)

PROCEDURE SetItemDataDlg(dlgNum : CARDINAL;
                         control : CARDINAL;
                         item : CARDINAL;
                         data : WORD32);
PROCEDURE SetItemData(control : CARDINAL; item : CARDINAL; data : WORD32);
(*
   dlgNum specifies the dialog
   item identifies an already existing list item
   For all ListBox, ColumnListBox.
   You can attach a specific piece of data to each list item
   you might use this to identify a list item which you will need
   if the control is sorted
*)

PROCEDURE GetItemDataDlg(dlgNum : CARDINAL;
                         control : CARDINAL;
                         item : CARDINAL;
                         VAR OUT data : WORD32);
PROCEDURE GetItemData(control : CARDINAL; item : CARDINAL; VAR OUT data : WORD32);
(*
   dlgNum specifies the dialog
   item identifies an already existing list item
   For all ListBox, ColumnListBox
   get the user data associated with the list item
*)

PROCEDURE AppendItemColumnsDlg(dlgNum : CARDINAL;
                               control : CARDINAL;
                               strs : ARRAY OF StringData) : INTEGER;
PROCEDURE AppendItemColumns(control : CARDINAL;
                            strs : ARRAY OF StringData) : INTEGER;
(*
   dlgNum specifies the dialog
   For ColumnListBox
   add a new list item at the end of the list
   strs must have the same number of elements are there are columns in
   the control.

   returns the item number if successful, otherwise -1
*)

PROCEDURE GetColumnWidthDlg(dlgNum : CARDINAL;
                            control : CARDINAL;
                            column : CARDINAL) : CARDINAL;
PROCEDURE GetColumnWidth(control : CARDINAL; column : CARDINAL) : CARDINAL;
(*
  For ColumnListBox
  return the current width, in pixels, of the specified column
*)

PROCEDURE GetOptimalColumnWidthDlg(dlgNum : CARDINAL;
                                   control : CARDINAL;
                                   column : CARDINAL) : CARDINAL;
PROCEDURE GetOptimalColumnWidth(control : CARDINAL;
                                column : CARDINAL) : CARDINAL;
(*
  For ColumnListBox
  return the optimal width, in pixels, of the specified column.
  the optimial width is usch that the column width is enough to display
  the longest string in the column. The column header, if any, is also
  considered in the computation.
*)

PROCEDURE SetColumnWidthDlg(dlgNum : CARDINAL;
                            control : CARDINAL;
                            column : INTEGER;
                            width : CARDINAL);
PROCEDURE SetColumnWidth(control : CARDINAL;
                         column : INTEGER;
                         width : CARDINAL);
(*
  For ColumnListBox
  set the width, in pixels, for the specified column
  if column is < 0, the all columns get the specified width.
  if width < 0, the the column width is optimally set for the column based upon
  the existing text in the column and header.
*)

PROCEDURE MleGetCharCountDlg(dlgNum : CARDINAL; control : CARDINAL) : CARDINAL;
PROCEDURE MleGetCharCount(control : CARDINAL) : CARDINAL;
(*
   dlgNum specifies the dialog
   For MultiLineEdit controls
   get the number of characters contained in the edit control. This includes
   any carriage returns, line feed pairs
   the lines in the edit control text are delimited by these characters
*)

PROCEDURE MleAppendDlg(dlgNum : CARDINAL;
                       control : CARDINAL;
                       text : ARRAY OF CHAR) : BOOLEAN;
PROCEDURE MleAppend(control : CARDINAL; text : ARRAY OF CHAR) : BOOLEAN;
(*
   dlgNum specifies the dialog
   For MultiLineEdit controls
   append text to the end of the text in the edit control
   text must be null terminated
   RETURNs TRUE is successful
*)

PROCEDURE MleAppendLineDlg(dlgNum : CARDINAL;
                           control : CARDINAL;
                           text : ARRAY OF CHAR) : BOOLEAN;
PROCEDURE MleAppendLine(control : CARDINAL; text : ARRAY OF CHAR) : BOOLEAN;
(*
   dlgNum specifies the dialog
   For MultiLineEdit controls
   like MlAppendDlg but also appends a line terminator in addition
   to the text
   text must be null terminated
   RETURNs TRUE is successful
*)

PROCEDURE MleGetLineCountDlg(dlgNum : CARDINAL; control : CARDINAL) : CARDINAL;
PROCEDURE MleGetLineCount(control : CARDINAL) : CARDINAL;
(*
   dlgNum specifies the dialog
   For MultiLineEdit controls
   get the count of the number of lines of text in the edit control
*)

PROCEDURE MleGetLineLengthDlg(dlgNum : CARDINAL;
                              control : CARDINAL;
                              line : CARDINAL) : CARDINAL;
PROCEDURE MleGetLineLength(control : CARDINAL; line : CARDINAL) : CARDINAL;
(*
   dlgNum specifies the dialog
   For MultiLineEdit controls
   get the length of the line identified by line.
   line is 1 based.
   a line can have a zero length
*)

PROCEDURE MleGetLineDlg(dlgNum : CARDINAL;
                        control : CARDINAL;
                        line : CARDINAL;
                        VAR OUT text : ARRAY OF CHAR) : BOOLEAN;
PROCEDURE MleGetLine(control : CARDINAL;
                     line : CARDINAL;
                     VAR OUT text : ARRAY OF CHAR) : BOOLEAN;
(*
   dlgNum specifies the dialog
   For MultiLineEdit controls
   fetch the text of the line identified by line into text
   line is 1 based.
   returns TRUE if successful
*)

PROCEDURE MleRemoveLineDlg(dlgNum : CARDINAL;
                           control : CARDINAL;
                           line : CARDINAL);
PROCEDURE MleRemoveLine(control : CARDINAL; line : CARDINAL);
(*
   dlgNum specifies the dialog
   For MultiLineEdit controls
   delete all of the text and line terminator of the line
   identified by line.
   line is 1 based.
*)

PROCEDURE MleAppendToLineDlg(dlgNum : CARDINAL;
                             control : CARDINAL;
                             line : CARDINAL;
                             text : ARRAY OF CHAR);
PROCEDURE MleAppendToLine(control : CARDINAL;
                          line : CARDINAL;
                          text : ARRAY OF CHAR);
(*
   dlgNum specifies the dialog
   For MultiLineEdit controls
   append the text in text to the end of the line identified by line.
   line is 1 based.
*)

PROCEDURE MlePositionCaretDlg(dlgNum : CARDINAL;
                              control : CARDINAL;
                              line, column : CARDINAL);
PROCEDURE MlePositionCaret(control : CARDINAL; line, column : CARDINAL);
(*
   dlgNum specifies the dialog
   For MultiLineEdit controls
   position the text caret location to be visible at the given line and column.
   line is 1 based.
   if line = MAX(CARDINAL) then the position is the end of the text in the control.
*)

PROCEDURE SaveTextFileDlg(dlgNum : CARDINAL; control : CARDINAL);
PROCEDURE SaveTextFile(control : CARDINAL);
(*
  For ExitTextFile
  Save the text file to disk
*)

PROCEDURE NIL_NOTIFY(n : NotifyType; VAR INOUT item : CARDINAL) : NotifyResult;
(*   dummy notify procedure *)

(*
   The following two procedures are useful for maintaining lists of items
   for DropDownLists, combo boxes and list boxes.
   You use a special character to separate
   the list items from each other and before assigning the string to
   the dialog control call ConvertToNulls to change the special character
   to a null character. As long as the string parameter passed is already
   null terminated you then have a proper "list" to assigning to list boxes
   a combo boxes for automatic initialization by DlgShell
   ConvertFromNulls can revert your string back its previous state if
   this is necessary.
*)

PROCEDURE ConvertToNulls(ch : CHAR; VAR INOUT str : ARRAY OF CHAR);

PROCEDURE ConvertFromNulls(ch : CHAR; VAR INOUT str : ARRAY OF CHAR);

PROCEDURE GetNthString(list : ARRAY OF CHAR;
                       listSep : CHAR;
                       VAR OUT str : ARRAY OF CHAR;
                       n : CARDINAL);
(*
   use this procedure to fetch the i'th string from the list
   list = the list of items
   sep = the character that separates the list items
   str = the returned string. Will be "" if not i'th item does not exist
   n = the item to fetch
   items are numbered starting at zero
*)

PROCEDURE GetNthFromList(list : ARRAY OF CHAR;
                         listSep : CHAR;
                         str : ARRAY OF CHAR;
                         VAR OUT n : CARDINAL);
(*
   use this procedure to find the number position of the item in the list
   items are numbered starting at zero
   list = the list of items
   sep = the character that separates the list items
   str = the string to match in list. The match is not case sensitive
   n = the returned item number. MAX(CARDINAL) = not found
*)

PROCEDURE GetDlgWindowDlg(dlgNum : CARDINAL) : ADDRESS;
PROCEDURE GetDlgWindow() : ADDRESS;
(*
   dlgNum specifies the dialog
   returns the dialog box operating system specific window handle.
   Win32 - a window handle. HWND
   GTK - a Widget handle. pGtkWidget (specifically pGtkWindow)
   Mac - a window handle. WindowRef.
*)

PROCEDURE GetControlHandleDlg(dlgNum : CARDINAL; control : CARDINAL) : ADDRESS;
PROCEDURE GetControlHandle(control : CARDINAL) : ADDRESS;
(*
   dlgNum specifies the dialog
   returns the operating system specific window handle for the control.
   Win32 - a window handle. HWND
   GTK - a Widget handle. pGtkWidget
   Mac - a control handle. ControlRef.
*)

END DlgShell.


© Norman Black, Stony Brook Software. Reproduced with permission.