home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / mod201j.zip / modula2.exe / os2demo / wpcar / car.mod < prev    next >
Text File  |  1996-02-27  |  111KB  |  3,855 lines

  1. IMPLEMENTATION MODULE CAR;
  2.  
  3. (************************************************************************
  4.   OS/2 2.x/3.0 implementation of Workplace Shell sample class 'Car'.
  5.  
  6.   This Modula-2 version is based upon a similar C-program
  7.   sample class taken from IBM Developer's Toolkit 2.1.
  8.  
  9.   Copyright (c) 1995 by Juergen Neuhoff
  10.  
  11.   Entry Points:
  12.  
  13.      Class Methods:
  14.  
  15.         M_Car.QueryModuleHandle
  16.  
  17.      Overridden Class Methods:
  18.  
  19.         M_Car.wpclsInitData
  20.         M_Car.wpclsQueryDefaultHelp
  21.         M_Car.wpclsQueryDefaultView
  22.         M_Car.wpclsQueryDetailsInfo
  23.         M_Car.wpclsQueryIconData
  24.         M_Car.wpclsQueryStyle
  25.         M_Car.wpclsQueryTitle
  26.         M_Car.wpclsUnInitData
  27.  
  28.      Instance Methods:
  29.  
  30.         Car.QueryBrakes
  31.         Car.SetBrakes
  32.         Car.QueryDuration
  33.         Car.SetDuration
  34.         Car.QueryHighTone
  35.         Car.SetHighTone
  36.         Car.QueryLowTone
  37.         Car.SetLowTone
  38.         Car.QuerySpeed
  39.         Car.SetSpeed
  40.         Car.BeepHorn
  41.         Car.AddDashboardPage
  42.         Car.AddHornBeepPage
  43.  
  44.      Overridden Instance Methods:
  45.  
  46.         Car.wpAddSettingsPages
  47.         Car.wpFilterPopupMenu
  48.         Car.wpInitData
  49.         Car.wpMenuItemHelpSelected
  50.         Car.wpMenuItemSelected
  51.         Car.wpModifyPopupMenu
  52.         Car.wpViewObject
  53.         Car.wpQueryDetailsData
  54.         Car.wpRestoreState
  55.         Car.wpSaveState
  56.         Car.wpUnInitData
  57.  
  58.      Non-Method Functions:
  59.  
  60.         CarInit
  61.         CarWndProc
  62.         DashBoardDlgProc
  63.         HornBeepDlgProc
  64.  
  65.   How to compile:
  66.  
  67.      To create a class dynamic link library run the following commands:
  68.  
  69.        MOD CAR -o -m      <-- This Modula-2 compiler
  70.        LINK386 @CAR.RSP   <-- 32-bit OS/2 linker
  71.        RC CAR.RC CAR.DLL  <-- Resource compiler from OS/2 Developer's Toolkit
  72.  
  73.   Notes:
  74.      This module is still being developed. It is not yet fully tested.
  75.      It may contain bugs.
  76. *************************************************************************)
  77.  
  78. (*$XL+       Modula-2 extensions: '_' in symbol names, OOP facilities   *)
  79. (*$XF+       Relaxed function designators                               *)
  80. (*$CDECL+    C-style procedures                                         *)
  81. (*$A         default alignment for record fields                        *)
  82.  
  83. (*$LINK
  84.   LIBRARY Car INITINSTANCE
  85.   PROTMODE
  86.   DATA MULTIPLE NONSHARED LOADONCALL
  87. *)
  88.  
  89.  
  90.  
  91. (*************************************************************************
  92.    Common IMPORTs for a SOM-class implementation.
  93. **************************************************************************)
  94.  
  95. IMPORT SOM;             (* basic SOM module, always needed *)
  96. IMPORT WPDATAF;         (* module with parent class, always needed *)
  97. IMPORT Conversions;     (* data conversion support *)
  98. FROM   SOMMISC IMPORT somDebug;        (* debugging aid *)
  99. FROM   SOMMISC IMPORT somWriteString;  (* debugging aid *)
  100. FROM   SOMMISC IMPORT somWriteLn;      (* debugging aid *)
  101. FROM   SYSTEM  IMPORT currentFile;     (* debugging aid *)
  102. FROM   SYSTEM  IMPORT currentLine;     (* debugging aid *)
  103. FROM   SYSTEM  IMPORT ADR;
  104.  
  105.  
  106. (*************************************************************************
  107.    This is Modula's equivalent for the language-neutral SOM-emitter's
  108.    'passthru lines before/after'.
  109.  
  110.    It consists of further individual IMPORTs, to be followed by private
  111.    types, constants, variables and/or procedures for the implementation,
  112. **************************************************************************)
  113.  
  114. (********
  115. IMPORT DOSEXCEPTIONS;
  116. *********)
  117.  
  118. IMPORT DOSFILEMGR;
  119. IMPORT DOSMODULEMGR;
  120. IMPORT DOSPROCESS;
  121. IMPORT OS2DEF;
  122. IMPORT WIN;                 (* complete Win-API *)
  123. IMPORT WINWORKPLACE;
  124. IMPORT WPOBJECT;
  125. IMPORT Strings;
  126.  
  127.  
  128.  
  129.  
  130. CONST
  131.   ID_TITLE            = 100;
  132.   ID_ICON             = 101;
  133.  
  134. CONST
  135.   IDD_DASHBOARD       = 200;                  (* settings page (dialog) *)
  136.   IDD_HORNBEEP        = 202;
  137.  
  138. (*
  139.  *   The following user-defined Popup menu items (ID_xxx) should be higher
  140.  *   than WPMENUID_USER.
  141.  *
  142.  *   The ID_OPENMENU will become a submenu of the system's popup open menu
  143.  *   id, WPMENUID_OPEN.
  144.  *)
  145. CONST
  146.   WPMENUID_USER       = WPOBJECT.WPMENUID_USER;
  147.   ID_BEEPMENU         = (WPMENUID_USER+1);  (* menus added to popup menu *)
  148.   ID_OPENMENU         = (WPMENUID_USER+2);
  149.   ID_TRAPMENU         = (WPMENUID_USER+3);
  150.  
  151. CONST
  152.   IDM_OPENCAR         = (WPMENUID_USER+4);  (* submenus of added menus *)
  153.   IDM_BEEPHORN        = (WPMENUID_USER+5);
  154.   IDM_TRAPCAR         = (WPMENUID_USER+6);
  155.  
  156. CONST
  157.   IDMSG_ACCESS_VIOLATION   = 100;
  158.   IDM_MSGBOX               = 999;
  159.  
  160. CONST
  161.   ID_FRAME                 = 3000;          (* frame  window id *)
  162.   ID_CLIENT                = 3001;          (* client window id *)
  163.  
  164. (*
  165.  *   Set unique view ids.
  166.  *)
  167. CONST
  168.   OPEN_CAR             = ID_OPENMENU;
  169.  
  170. CONST
  171.   CAR_TIMER            = 1001;              (* timer id *)
  172.  
  173. (*
  174.  *   IDs of dialog items in CAR.RC
  175.  *)
  176. CONST
  177.   ID_UNDO              = 801;
  178.   ID_DEFAULT           = 802;
  179.   ID_HELP              = 803;
  180.   ID_HITONE            = 804;
  181.   ID_LOTONE            = 805;
  182.   ID_SPEEDSLIDER       = 806;
  183.   ID_STOP              = 807;
  184.   ID_SPEEDDATA         = 808;
  185.   ID_GO                = 809;
  186.  
  187. (*
  188.  *  Keys for save-restore methods
  189.  *)
  190. CONST
  191.   IDKEY_HITONE         = 1;
  192.   IDKEY_LOTONE         = 2;
  193.   IDKEY_DURATION       = 3;
  194.   IDKEY_SPEED          = 4;
  195.   IDKEY_BRAKEFLAG      = 5;
  196.  
  197. (*
  198.  *   Default values of instance data items
  199.  *)
  200. CONST
  201.   DEFAULT_DURATION     = 300;
  202.   DEFAULT_HITONE       = 400;
  203.   DEFAULT_LOTONE       = 400;
  204.   DEFAULT_SPEED        = 50;
  205.   DEFAULT_BRAKEFLAG    = FALSE;
  206.  
  207. (*
  208.  *   Help IDs
  209.  *
  210.  *   NOTE:  At this time, no source file is provided to build help for this
  211.  *   sample.  A pre-built help file, CAR.HLP, is provided containing the
  212.  *   following help ids.
  213.  *)
  214. CONST
  215.   ID_HELP_DEFAULT       = 256;
  216.   ID_HELP_DASHBOARD     = 257;
  217.   ID_HELP_OPENCAR       = 258;
  218.   ID_HELP_HORNBEEP      = 259;
  219.   ID_HELP_BEEPHORN      = 260;
  220.  
  221. (*
  222.  *   Indexes into CARDETAILS information. (arrays)
  223.  *)
  224. CONST
  225.   INDEX_MAKE            = 0;
  226.   INDEX_MODEL           = 1;
  227.   INDEX_COLOR           = 2;
  228.   INDEX_SALE_DATE       = 3;
  229.   INDEX_PRICE           = 4;
  230.  
  231. (*
  232.  *   These defines are used as directional multipliers against x,y position.
  233.  *)
  234. CONST
  235.   CAR_LEFT      = -1;
  236.   CAR_RIGHT     =  1;
  237.   CAR_DOWN      = -1;
  238.   CAR_UP        =  1;
  239.  
  240. CONST
  241.   ICON_WIDTH    = 32;      (* pels *)
  242.   ICON_HEIGHT   = 32;      (* pels *)
  243.  
  244.  
  245. (*
  246.  *   CARDETAILS:  Structure used for details view
  247.  *)
  248. TYPE
  249.   CARDETAILS    = RECORD
  250.     pszMake       : OS2DEF.PSZ;      (* Manufacturer      *)
  251.     pszModel      : OS2DEF.PSZ;      (* Model             *)
  252.     pszColor      : OS2DEF.PSZ;      (* Color of car      *)
  253.     cdateSale     : WIN.CDATE;       (* Date of sale      *)
  254.     ulPrice       : LONGCARD;        (* Price in dollars  *)
  255.                   END;
  256.   PCARDETAILS   = POINTER TO CARDETAILS;
  257.  
  258. (*
  259.  *   The following structures will be used to store window specific data
  260.  *   and a pointer to the object that created the window/dialog.
  261.  *
  262.  *   They're allocated when the Client window is created.  This
  263.  *   allows us to pass the *somSelf pointer and use it in our
  264.  *   window and dialog procedures (the system only passes this
  265.  *   pointer to methods).
  266.  *)
  267. TYPE
  268.   WINDOWDATA    = RECORD
  269.     cb            : CARDINAL;          (* size of this structure *)
  270.     somSelf       : PCar;              (* pointer to this instance *)
  271.     UseItem       : WPOBJECT.USEITEM;  (* global class usage information *)
  272.     ViewItem      : WPOBJECT.VIEWITEM; (* global class view information *)
  273.     x             : LONGINT;           (* x position of car in open view *)
  274.     y             : LONGINT;           (* y position of car in open view *)
  275.     xDir          : LONGINT;           (* x direction (CAR_LEFT or CAR_RIGHT) *)
  276.     yDir          : LONGINT;           (* y direction (CAR_UP or CAR_DOWN) *)
  277.                   END;
  278.   PWINDOWDATA   = POINTER TO WINDOWDATA;
  279.  
  280. (*
  281.  *   Window data for the Dashboard dialog (settings page)
  282.  *)
  283. TYPE
  284.   DASHDLGDATA   = RECORD
  285.     cb            : CARDINAL;   (* size of this structure           *)
  286.     somSelf       : PCar;       (* pointer to this instance         *)
  287.     PrevBrakes    : BOOLEAN;    (* indicates if car is stopped      *)
  288.     PrevSpeed     : LONGCARD;   (* Speed car moves across screen    *)
  289.                   END;
  290.   PDASHDLGDATA  = POINTER TO DASHDLGDATA;
  291.  
  292. (*
  293.  *   Window data for the Horn dialog (settings page)
  294.  *)
  295. TYPE
  296.   HORNDLGDATA   = RECORD
  297.     cb            : CARDINAL;   (* size of this structure *)
  298.     somSelf       : PCar;       (* pointer to this instance         *)
  299.     PrevDuration  : LONGCARD;   (* Duration of the car's horn beep  *)
  300.     PrevHighTone  : LONGCARD;   (* The high note of the car beep    *)
  301.     PrevLowTone   : LONGCARD;   (* The low note of the car beep     *)
  302.                   END;
  303.   PHORNDLGDATA  = POINTER TO HORNDLGDATA;
  304.  
  305. (*
  306.  *   Private Debug helpers go here.  They can be enabled/disabled by
  307.  *   defining DEBUG e.g. as a boolean identifier.
  308.  *)
  309. CONST DEBUG = TRUE;
  310. PROCEDURE DebugBox
  311. (
  312.   title        : ARRAY OF CHAR;
  313.   text         : ARRAY OF CHAR
  314. );
  315. BEGIN
  316.   (*$IFDEF DEBUG*)
  317.     WIN.WinMessageBox
  318.     (
  319.       WIN.HWND_DESKTOP,
  320.       WIN.HWND_DESKTOP,
  321.       text,
  322.       title,
  323.       20,
  324.       WIN.MB_OK OR WIN.MB_INFORMATION OR WIN.MB_MOVEABLE
  325.     );
  326.   (*$ELSE*)
  327.     (* do nothing if not debugging *)
  328.   (*$ENDIF*)
  329. END DebugBox;
  330.  
  331. VAR
  332.   (*.....*)
  333.  
  334.  
  335. (*************************************************************************
  336.    Implementation header for the new SOM class 'Car'
  337.    (constants, types and variables)
  338. **************************************************************************)
  339.  
  340. CONST
  341.   Car_MaxNoMethods = 14;        (* number of new methods *)
  342.   CarDebug         = TRUE;      (* enable/disable method debugging *)
  343.  
  344. (*
  345.  * Temporary class data structure used only in class creation
  346.  *)
  347. VAR
  348.   CartempClassData        : SOM.somClassDataStructure;
  349.  
  350. (*
  351.  * Internal instance data fields
  352.  *)
  353. TYPE
  354.   CarData          = RECORD
  355.     BrakeFlag        : BOOLEAN;
  356.     duration         : LONGCARD;
  357.     HighTone         : LONGCARD;
  358.     LowTone          : LONGCARD;
  359.     speed            : LONGCARD;
  360.                      END;
  361.   PCarData         = POINTER TO CarData;
  362.  
  363.  
  364. (*
  365.  *   CarGetData function, gives access to the instance data, if any
  366.  *)
  367. PROCEDURE CarGetData( Self : PCar ) : PCarData;
  368. BEGIN
  369.   RETURN SOM.somDataResolve( Self, CarCClassData.instanceDataToken );
  370. END CarGetData;
  371.  
  372. (*
  373.  *  SOM specific identifiers for all
  374.  *  the new and also the overridden methods
  375.  *)
  376. VAR
  377.   somId_QueryBrakes              : SOM.somId;
  378.   somId_SetBrakes                : SOM.somId;
  379.   somId_QueryDuration            : SOM.somId;
  380.   somId_SetDuration              : SOM.somId;
  381.   somId_QueryHighTone            : SOM.somId;
  382.   somId_SetHighTone              : SOM.somId;
  383.   somId_QueryLowTone             : SOM.somId;
  384.   somId_SetLowTone               : SOM.somId;
  385.   somId_QuerySpeed               : SOM.somId;
  386.   somId_SetSpeed                 : SOM.somId;
  387.   somId_BeepHorn                 : SOM.somId;
  388.   somId_AddDashboardPage         : SOM.somId;
  389.   somId_AddHornBeepPage          : SOM.somId;
  390.   somId_TrapTest                 : SOM.somId;
  391.   somId_wpInitData               : SOM.somId;
  392.   somId_wpUnInitData             : SOM.somId;
  393.   somId_wpSaveState              : SOM.somId;
  394.   somId_wpRestoreState           : SOM.somId;
  395.   somId_wpAddSettingsPages       : SOM.somId;
  396.   somId_wpFilterPopupMenu        : SOM.somId;
  397.   somId_wpModifyPopupMenu        : SOM.somId;
  398.   somId_wpMenuItemSelected       : SOM.somId;
  399.   somId_wpMenuItemHelpSelected   : SOM.somId;
  400.   somId_wpQueryDetailsData       : SOM.somId;
  401.   somId_wpOpen                   : SOM.somId;
  402.   somId_wpSetup                  : SOM.somId;
  403.  
  404.  
  405.  
  406. (*************************************************************************
  407.   apply- and redispatch- stubs for new methods introduced by class 'Car'
  408. *************************************************************************)
  409.  
  410.  
  411. PROCEDURE somAP_QueryBrakes
  412. (
  413.   somSelf   : PCar;
  414.   id        : SOM.somId;
  415.   desc      : SOM.somId;
  416.   VAR args  : ARRAY OF SOM.DWORD
  417. )           : BOOLEAN;
  418. BEGIN
  419.   RETURN somSelf^.QueryBrakes( );
  420. END somAP_QueryBrakes;
  421.  
  422. PROCEDURE somRD_QueryBrakes
  423. (
  424.   somSelf      : PCar
  425. )              : BOOLEAN;
  426. VAR
  427.   retBuffer    : BOOLEAN;
  428.   retValue     : SOM.somToken;
  429.   args         : SOM.ADDRESS;
  430.   dispatched   : BOOLEAN;
  431. BEGIN
  432.   retValue := ADR( retBuffer );
  433.   args := ADR( somSelf ) + SIZE( somSelf );
  434.   dispatched := somSelf^.somDispatch( retValue, somId_QueryBrakes, args^ );
  435.   RETURN retBuffer;
  436. END somRD_QueryBrakes;
  437.  
  438.  
  439.  
  440. PROCEDURE somAP_SetBrakes
  441. (
  442.   somSelf   : PCar;
  443.   id        : SOM.somId;
  444.   desc      : SOM.somId;
  445.   VAR args  : ARRAY OF SOM.DWORD
  446. );
  447. VAR
  448.   fBrake    : BOOLEAN;
  449. BEGIN
  450.   fBrake    := SHORT( SHORT( args[0] ) );
  451.   somSelf^.SetBrakes( fBrake );
  452. END somAP_SetBrakes;
  453.  
  454. (*
  455.  *  redispatch stub for a new proper procedure method
  456.  *)
  457. PROCEDURE somRD_SetBrakes
  458. (
  459.   somSelf      : PCar;
  460.   fBrake       : BOOLEAN
  461. );
  462. VAR
  463.   retBuffer    : SOM.somToken;
  464.   retValue     : SOM.somToken;
  465.   args         : SOM.ADDRESS;
  466.   dispatched   : BOOLEAN;
  467. BEGIN
  468.   retValue := ADR( retBuffer );
  469.   args := ADR( somSelf ) + SIZE( somSelf );
  470.   dispatched := somSelf^.somDispatch( retValue, somId_SetBrakes, args^ );
  471. END somRD_SetBrakes;
  472.  
  473.  
  474.  
  475. PROCEDURE somAP_QueryDuration
  476. (
  477.   somSelf   : PCar;
  478.   id        : SOM.somId;
  479.   desc      : SOM.somId;
  480.   VAR args  : ARRAY OF SOM.DWORD
  481. )           : LONGCARD;
  482. BEGIN
  483.   RETURN somSelf^.QueryDuration( );
  484. END somAP_QueryDuration;
  485.  
  486. PROCEDURE somRD_QueryDuration
  487. (
  488.   somSelf      : PCar
  489. )              : LONGCARD;
  490. VAR
  491.   retBuffer    : LONGCARD;
  492.   retValue     : SOM.somToken;
  493.   args         : SOM.ADDRESS;
  494.   dispatched   : BOOLEAN;
  495. BEGIN
  496.   retValue := ADR( retBuffer );
  497.   args := ADR( somSelf ) + SIZE( somSelf );
  498.   dispatched := somSelf^.somDispatch( retValue, somId_QueryDuration, args^ );
  499.   RETURN retBuffer;
  500. END somRD_QueryDuration;
  501.  
  502.  
  503.  
  504. PROCEDURE somAP_SetDuration
  505. (
  506.   somSelf   : PCar;
  507.   id        : SOM.somId;
  508.   desc      : SOM.somId;
  509.   VAR args  : ARRAY OF SOM.DWORD
  510. );
  511. VAR
  512.   ulDuration : LONGCARD;
  513. BEGIN
  514.   ulDuration := args[0];
  515.   somSelf^.SetDuration( ulDuration );
  516. END somAP_SetDuration;
  517.  
  518. (*
  519.  *  redispatch stub for a new proper procedure method
  520.  *)
  521. PROCEDURE somRD_SetDuration
  522. (
  523.   somSelf      : PCar;
  524.   ulDuration   : LONGCARD
  525. );
  526. VAR
  527.   retBuffer    : SOM.somToken;
  528.   retValue     : SOM.somToken;
  529.   args         : SOM.ADDRESS;
  530.   dispatched   : BOOLEAN;
  531. BEGIN
  532.   retValue := ADR( retBuffer );
  533.   args := ADR( somSelf ) + SIZE( somSelf );
  534.   dispatched := somSelf^.somDispatch( retValue, somId_SetDuration, args^ );
  535. END somRD_SetDuration;
  536.  
  537.  
  538.  
  539. PROCEDURE somAP_QueryHighTone
  540. (
  541.   somSelf   : PCar;
  542.   id        : SOM.somId;
  543.   desc      : SOM.somId;
  544.   VAR args  : ARRAY OF SOM.DWORD
  545. )           : LONGCARD;
  546. BEGIN
  547.   RETURN somSelf^.QueryHighTone( );
  548. END somAP_QueryHighTone;
  549.  
  550. PROCEDURE somRD_QueryHighTone
  551. (
  552.   somSelf      : PCar
  553. )              : LONGCARD;
  554. VAR
  555.   retBuffer    : LONGCARD;
  556.   retValue     : SOM.somToken;
  557.   args         : SOM.ADDRESS;
  558.   dispatched   : BOOLEAN;
  559. BEGIN
  560.   retValue := ADR( retBuffer );
  561.   args := ADR( somSelf ) + SIZE( somSelf );
  562.   dispatched := somSelf^.somDispatch( retValue, somId_QueryHighTone, args^ );
  563.   RETURN retBuffer;
  564. END somRD_QueryHighTone;
  565.  
  566.  
  567.  
  568. PROCEDURE somAP_SetHighTone
  569. (
  570.   somSelf   : PCar;
  571.   id        : SOM.somId;
  572.   desc      : SOM.somId;
  573.   VAR args  : ARRAY OF SOM.DWORD
  574. );
  575. VAR
  576.   ulTone    : LONGCARD;
  577. BEGIN
  578.   ulTone    := args[0];
  579.   somSelf^.SetHighTone( ulTone );
  580. END somAP_SetHighTone;
  581.  
  582. (*
  583.  *  redispatch stub for a new proper procedure method
  584.  *)
  585. PROCEDURE somRD_SetHighTone
  586. (
  587.   somSelf      : PCar;
  588.   ulTone       : LONGCARD
  589. );
  590. VAR
  591.   retBuffer    : SOM.somToken;
  592.   retValue     : SOM.somToken;
  593.   args         : SOM.ADDRESS;
  594.   dispatched   : BOOLEAN;
  595. BEGIN
  596.   retValue := ADR( retBuffer );
  597.   args := ADR( somSelf ) + SIZE( somSelf );
  598.   dispatched := somSelf^.somDispatch( retValue, somId_SetHighTone, args^ );
  599. END somRD_SetHighTone;
  600.  
  601.  
  602.  
  603. PROCEDURE somAP_QueryLowTone
  604. (
  605.   somSelf   : PCar;
  606.   id        : SOM.somId;
  607.   desc      : SOM.somId;
  608.   VAR args  : ARRAY OF SOM.DWORD
  609. )           : LONGCARD;
  610. BEGIN
  611.   RETURN somSelf^.QueryLowTone( );
  612. END somAP_QueryLowTone;
  613.  
  614. PROCEDURE somRD_QueryLowTone
  615. (
  616.   somSelf      : PCar
  617. )              : LONGCARD;
  618. VAR
  619.   retBuffer    : LONGCARD;
  620.   retValue     : SOM.somToken;
  621.   args         : SOM.ADDRESS;
  622.   dispatched   : BOOLEAN;
  623. BEGIN
  624.   retValue := ADR( retBuffer );
  625.   args := ADR( somSelf ) + SIZE( somSelf );
  626.   dispatched := somSelf^.somDispatch( retValue, somId_QueryLowTone, args^ );
  627.   RETURN retBuffer;
  628. END somRD_QueryLowTone;
  629.  
  630.  
  631.  
  632. PROCEDURE somAP_SetLowTone
  633. (
  634.   somSelf   : PCar;
  635.   id        : SOM.somId;
  636.   desc      : SOM.somId;
  637.   VAR args  : ARRAY OF SOM.DWORD
  638. );
  639. VAR
  640.   ulTone    : LONGCARD;
  641. BEGIN
  642.   ulTone    := args[0];
  643.   somSelf^.SetLowTone( ulTone );
  644. END somAP_SetLowTone;
  645.  
  646. (*
  647.  *  redispatch stub for a new proper procedure method
  648.  *)
  649. PROCEDURE somRD_SetLowTone
  650. (
  651.   somSelf      : PCar;
  652.   ulTone       : LONGCARD
  653. );
  654. VAR
  655.   retBuffer    : SOM.somToken;
  656.   retValue     : SOM.somToken;
  657.   args         : SOM.ADDRESS;
  658.   dispatched   : BOOLEAN;
  659. BEGIN
  660.   retValue := ADR( retBuffer );
  661.   args := ADR( somSelf ) + SIZE( somSelf );
  662.   dispatched := somSelf^.somDispatch( retValue, somId_SetLowTone, args^ );
  663. END somRD_SetLowTone;
  664.  
  665.  
  666.  
  667. PROCEDURE somAP_QuerySpeed
  668. (
  669.   somSelf   : PCar;
  670.   id        : SOM.somId;
  671.   desc      : SOM.somId;
  672.   VAR args  : ARRAY OF SOM.DWORD
  673. )           : LONGCARD;
  674. BEGIN
  675.   RETURN somSelf^.QuerySpeed( );
  676. END somAP_QuerySpeed;
  677.  
  678. PROCEDURE somRD_QuerySpeed
  679. (
  680.   somSelf      : PCar
  681. )              : LONGCARD;
  682. VAR
  683.   retBuffer    : LONGCARD;
  684.   retValue     : SOM.somToken;
  685.   args         : SOM.ADDRESS;
  686.   dispatched   : BOOLEAN;
  687. BEGIN
  688.   retValue := ADR( retBuffer );
  689.   args := ADR( somSelf ) + SIZE( somSelf );
  690.   dispatched := somSelf^.somDispatch( retValue, somId_QuerySpeed, args^ );
  691.   RETURN retBuffer;
  692. END somRD_QuerySpeed;
  693.  
  694.  
  695.  
  696. PROCEDURE somAP_SetSpeed
  697. (
  698.   somSelf   : PCar;
  699.   id        : SOM.somId;
  700.   desc      : SOM.somId;
  701.   VAR args  : ARRAY OF SOM.DWORD
  702. );
  703. VAR
  704.   ulSpeed    : LONGCARD;
  705. BEGIN
  706.   ulSpeed    := args[0];
  707.   somSelf^.SetSpeed( ulSpeed );
  708. END somAP_SetSpeed;
  709.  
  710. (*
  711.  *  redispatch stub for a new proper procedure method
  712.  *)
  713. PROCEDURE somRD_SetSpeed
  714. (
  715.   somSelf      : PCar;
  716.   ulSpeed      : LONGCARD
  717. );
  718. VAR
  719.   retBuffer    : SOM.somToken;
  720.   retValue     : SOM.somToken;
  721.   args         : SOM.ADDRESS;
  722.   dispatched   : BOOLEAN;
  723. BEGIN
  724.   retValue := ADR( retBuffer );
  725.   args := ADR( somSelf ) + SIZE( somSelf );
  726.   dispatched := somSelf^.somDispatch( retValue, somId_SetSpeed, args^ );
  727. END somRD_SetSpeed;
  728.  
  729.  
  730.  
  731. PROCEDURE somAP_BeepHorn
  732. (
  733.   somSelf   : PCar;
  734.   id        : SOM.somId;
  735.   desc      : SOM.somId;
  736.   VAR args  : ARRAY OF SOM.DWORD
  737. )           : BOOLEAN;
  738. BEGIN
  739.   RETURN somSelf^.BeepHorn( );
  740. END somAP_BeepHorn;
  741.  
  742. PROCEDURE somRD_BeepHorn
  743. (
  744.   somSelf      : PCar
  745. )              : BOOLEAN;
  746. VAR
  747.   retBuffer    : BOOLEAN;
  748.   retValue     : SOM.somToken;
  749.   args         : SOM.ADDRESS;
  750.   dispatched   : BOOLEAN;
  751. BEGIN
  752.   retValue := ADR( retBuffer );
  753.   args := ADR( somSelf ) + SIZE( somSelf );
  754.   dispatched := somSelf^.somDispatch( retValue, somId_BeepHorn, args^ );
  755.   RETURN retBuffer;
  756. END somRD_BeepHorn;
  757.  
  758.  
  759.  
  760. PROCEDURE somAP_AddDashboardPage
  761. (
  762.   somSelf      : PCar;
  763.   id           : SOM.somId;
  764.   desc         : SOM.somId;
  765.   VAR args     : ARRAY OF SOM.DWORD
  766. )              : LONGCARD;
  767. VAR
  768.   hwndNotebook : OS2DEF.HWND;
  769. BEGIN
  770.   hwndNotebook := args[0];
  771.   RETURN somSelf^.AddDashboardPage( hwndNotebook );
  772. END somAP_AddDashboardPage;
  773.  
  774. PROCEDURE somRD_AddDashboardPage
  775. (
  776.   somSelf      : PCar;
  777.   hwndNotebook : OS2DEF.HWND
  778. )              : LONGCARD;
  779. VAR
  780.   retBuffer    : LONGCARD;
  781.   retValue     : SOM.somToken;
  782.   args         : SOM.ADDRESS;
  783.   dispatched   : BOOLEAN;
  784. BEGIN
  785.   retValue := ADR( retBuffer );
  786.   args := ADR( somSelf ) + SIZE( somSelf );
  787.   dispatched := somSelf^.somDispatch( retValue, somId_AddDashboardPage, args^ );
  788.   RETURN retBuffer;
  789. END somRD_AddDashboardPage;
  790.  
  791.  
  792.  
  793. PROCEDURE somAP_AddHornBeepPage
  794. (
  795.   somSelf      : PCar;
  796.   id           : SOM.somId;
  797.   desc         : SOM.somId;
  798.   VAR args     : ARRAY OF SOM.DWORD
  799. )              : LONGCARD;
  800. VAR
  801.   hwndNotebook : OS2DEF.HWND;
  802. BEGIN
  803.   hwndNotebook := args[0];
  804.   RETURN somSelf^.AddHornBeepPage( hwndNotebook );
  805. END somAP_AddHornBeepPage;
  806.  
  807. PROCEDURE somRD_AddHornBeepPage
  808. (
  809.   somSelf      : PCar;
  810.   hwndNotebook : OS2DEF.HWND
  811. )              : LONGCARD;
  812. VAR
  813.   retBuffer    : LONGCARD;
  814.   retValue     : SOM.somToken;
  815.   args         : SOM.ADDRESS;
  816.   dispatched   : BOOLEAN;
  817. BEGIN
  818.   retValue := ADR( retBuffer );
  819.   args := ADR( somSelf ) + SIZE( somSelf );
  820.   dispatched := somSelf^.somDispatch( retValue, somId_AddHornBeepPage, args^ );
  821.   RETURN retBuffer;
  822. END somRD_AddHornBeepPage;
  823.  
  824.  
  825.  
  826. PROCEDURE somAP_TrapTest
  827. (
  828.   somSelf   : PCar;
  829.   id        : SOM.somId;
  830.   desc      : SOM.somId;
  831.   VAR args  : ARRAY OF SOM.DWORD
  832. );
  833. BEGIN
  834.   somSelf^.TrapTest();
  835. END somAP_TrapTest;
  836.  
  837. PROCEDURE somRD_TrapTest
  838. (
  839.   somSelf      : PCar
  840. );
  841. VAR
  842.   retBuffer    : SOM.somToken;
  843.   retValue     : SOM.somToken;
  844.   args         : SOM.ADDRESS;
  845.   dispatched   : BOOLEAN;
  846. BEGIN
  847.   retValue := ADR( retBuffer );
  848.   args := ADR( somSelf ) + SIZE( somSelf );
  849.   dispatched := somSelf^.somDispatch( retValue, somId_TrapTest, args^ );
  850. END somRD_TrapTest;
  851.  
  852.  
  853.  
  854. (*************************************************************************
  855.   Forward declared procedures for all newly introduced private methods
  856.   and for privately overridden methods.
  857. *************************************************************************)
  858.  
  859. PROCEDURE( Self : PCar ) wpInitData( );
  860. FORWARD;
  861.  
  862. PROCEDURE( Self : PCar ) wpUnInitData( );
  863. FORWARD;
  864.  
  865. PROCEDURE( Self : PCar ) wpSaveState( ) : BOOLEAN;
  866. FORWARD;
  867.  
  868. PROCEDURE( Self : PCar ) wpRestoreState
  869. (
  870.   ulReserved    : LONGCARD
  871. )               : BOOLEAN;
  872. FORWARD;
  873.  
  874. PROCEDURE( Self : PCar ) wpAddSettingsPages
  875. (
  876.   hwndNotebook  : OS2DEF.HWND
  877. )               : BOOLEAN;
  878. FORWARD;
  879.  
  880. PROCEDURE( Self : PCar ) wpFilterPopupMenu
  881. (
  882.   ulFlags       : LONGCARD;
  883.   hwndCnr       : OS2DEF.HWND;
  884.   fMultiSelect  : BOOLEAN
  885. )               : LONGCARD;
  886. FORWARD;
  887.  
  888. PROCEDURE( Self : PCar ) wpModifyPopupMenu
  889. (
  890.   hwndMenu      : OS2DEF.HWND;
  891.   hwndCnr       : OS2DEF.HWND;
  892.   iPosition     : LONGCARD
  893. )               : BOOLEAN;
  894. FORWARD;
  895.  
  896. PROCEDURE( Self : PCar ) wpMenuItemSelected
  897. (
  898.   hwndFrame     : OS2DEF.HWND;
  899.   ulMenuId      : LONGCARD
  900. )               : BOOLEAN;
  901. FORWARD;
  902.  
  903. PROCEDURE( Self : PCar ) wpMenuItemHelpSelected
  904. (
  905.   MenuId        : LONGCARD
  906. )               : BOOLEAN;
  907. FORWARD;
  908.  
  909. PROCEDURE( Self : PCar ) wpQueryDetailsData
  910. (
  911.   ppDetailsData : OS2DEF.PPVOID;
  912.   VAR cp        : LONGCARD
  913. )               : BOOLEAN;
  914. FORWARD;
  915.  
  916. PROCEDURE( Self : PCar ) wpOpen
  917. (
  918.   hwndCnr       : OS2DEF.HWND;
  919.   ulView        : LONGCARD;
  920.   param         : LONGCARD
  921. )               : OS2DEF.HWND;
  922. FORWARD;
  923.  
  924. PROCEDURE( Self : PCar ) wpSetup
  925. (
  926.   szSetupString : ARRAY OF CHAR
  927. )               : BOOLEAN;
  928. FORWARD;
  929.  
  930.  
  931.  
  932. (*************************************************************************
  933.     SOM-class creation procedures.
  934.     Only the CarNewClass() procedure is publicly
  935.     available for client programs.
  936. **************************************************************************)
  937.  
  938. (*
  939.  * class initialization
  940.  *)
  941. PROCEDURE CarsomInitializeClass;
  942. VAR
  943.   m  : Car;     (* needed for static method references *)
  944.   c  : SOM.PSOMClass;
  945.   md : SOM.somId;
  946. BEGIN
  947.  
  948.   c := CartempClassData.classObject;
  949.   md := SOM.somIdFromString( "----" );
  950.  
  951.   (* Add the new methods, including apply and redispatch stubs,
  952.      to the new SOM class
  953.   *)
  954.   CarClassData.QueryBrakes := c^.somAddStaticMethod
  955.   ( somId_QueryBrakes, md, m.QueryBrakes, somRD_QueryBrakes, somAP_QueryBrakes );
  956.   CarClassData.SetBrakes := c^.somAddStaticMethod
  957.   ( somId_SetBrakes, md, m.SetBrakes, somRD_SetBrakes, somAP_SetBrakes );
  958.   CarClassData.QueryDuration := c^.somAddStaticMethod
  959.   ( somId_QueryDuration, md, m.QueryDuration, somRD_QueryDuration, somAP_QueryDuration );
  960.   CarClassData.SetDuration := c^.somAddStaticMethod
  961.   ( somId_SetDuration, md, m.SetDuration, somRD_SetDuration, somAP_SetDuration );
  962.   CarClassData.QueryHighTone := c^.somAddStaticMethod
  963.   ( somId_QueryHighTone, md, m.QueryHighTone, somRD_QueryHighTone, somAP_QueryHighTone );
  964.   CarClassData.SetHighTone := c^.somAddStaticMethod
  965.   ( somId_SetHighTone, md, m.SetHighTone, somRD_SetHighTone, somAP_SetHighTone );
  966.   CarClassData.QueryLowTone := c^.somAddStaticMethod
  967.   ( somId_QueryLowTone, md, m.QueryLowTone, somRD_QueryLowTone, somAP_QueryLowTone );
  968.   CarClassData.SetLowTone := c^.somAddStaticMethod
  969.   ( somId_SetLowTone, md, m.SetLowTone, somRD_SetLowTone, somAP_SetLowTone );
  970.   CarClassData.QuerySpeed := c^.somAddStaticMethod
  971.   ( somId_QuerySpeed, md, m.QuerySpeed, somRD_QuerySpeed, somAP_QuerySpeed );
  972.   CarClassData.SetSpeed := c^.somAddStaticMethod
  973.   ( somId_SetSpeed, md, m.SetSpeed, somRD_SetSpeed, somAP_SetSpeed );
  974.   CarClassData.BeepHorn := c^.somAddStaticMethod
  975.   ( somId_BeepHorn, md, m.BeepHorn, somRD_BeepHorn, somAP_BeepHorn );
  976.   CarClassData.AddDashboardPage := c^.somAddStaticMethod
  977.   ( somId_AddDashboardPage, md, m.AddDashboardPage, somRD_AddDashboardPage, somAP_AddDashboardPage );
  978.   CarClassData.AddHornBeepPage := c^.somAddStaticMethod
  979.   ( somId_AddHornBeepPage, md, m.AddHornBeepPage, somRD_AddHornBeepPage, somAP_AddHornBeepPage );
  980.   CarClassData.TrapTest := c^.somAddStaticMethod
  981.   ( somId_TrapTest, md, m.TrapTest, somRD_TrapTest, somAP_TrapTest );
  982.  
  983.   (* Override inherited methods, if any *)
  984.   c^.somOverrideSMethod( somId_wpInitData, m.wpInitData );
  985.   c^.somOverrideSMethod( somId_wpUnInitData, m.wpUnInitData );
  986.   c^.somOverrideSMethod( somId_wpSaveState, m.wpSaveState );
  987.   c^.somOverrideSMethod( somId_wpRestoreState, m.wpRestoreState );
  988.   c^.somOverrideSMethod( somId_wpAddSettingsPages, m.wpAddSettingsPages );
  989.   c^.somOverrideSMethod( somId_wpFilterPopupMenu, m.wpFilterPopupMenu );
  990.   c^.somOverrideSMethod( somId_wpModifyPopupMenu, m.wpModifyPopupMenu );
  991.   c^.somOverrideSMethod( somId_wpMenuItemSelected, m.wpMenuItemSelected );
  992.   c^.somOverrideSMethod( somId_wpQueryDetailsData, m.wpQueryDetailsData );
  993.   c^.somOverrideSMethod( somId_wpOpen, m.wpOpen );
  994.   c^.somOverrideSMethod( somId_wpSetup, m.wpSetup );
  995.  
  996. END CarsomInitializeClass;
  997.  
  998. (*
  999.  *  class creation procedure
  1000.  *)
  1001. PROCEDURE CarsomCreateClass
  1002. (
  1003.   pClsObj    : SOM.PSOMClass;
  1004.   mClsObj    : SOM.PSOMClass
  1005. );
  1006. VAR
  1007.   classObject : SOM.PSOMClass;
  1008. BEGIN
  1009.   classObject := mClsObj^.somNew();
  1010.   CartempClassData.classObject := classObject;
  1011.   classObject^.somInitClass
  1012.   (
  1013.     "Car",
  1014.     pClsObj,
  1015.     SIZE( CarData ),
  1016.     Car_MaxNoMethods,
  1017.     Car_MajorVersion,
  1018.     Car_MinorVersion
  1019.   );
  1020.   CarCClassData.instanceDataToken := classObject^.somGetInstanceToken();
  1021.   CarsomInitializeClass();
  1022.   CarCClassData.parentMtab := classObject^.somGetPClsMtab();
  1023.   classObject^.somSetClassData( SYSTEM.ADR( CarClassData ) );
  1024.   classObject^.somClassReady();
  1025.   (* make newly created class object visible *)
  1026.   CarClassData.classObject := classObject;
  1027. END CarsomCreateClass;
  1028.  
  1029. (*
  1030.  *   public NewClass-procedure
  1031.  *)
  1032. PROCEDURE CarNewClass
  1033. (
  1034.   majorVersion  : SOM.INTEGER4;
  1035.   minorVersion  : SOM.INTEGER4
  1036. )               : SOM.PSOMClass;
  1037. VAR
  1038.   pClsObj       : SOM.PSOMClass;
  1039.   mClsObj       : SOM.PSOMClass;
  1040.   line          : LONGCARD;
  1041.   b             : BOOLEAN;
  1042. BEGIN
  1043.   (*
  1044.   SYSTEM.INLINE
  1045.   (
  1046.     MOV EAX, 55555555H
  1047.     INT 3                 ; hard break for debugging
  1048.   );
  1049.   *)
  1050.  
  1051.   (* Check the version numbers *)
  1052.   IF ((majorVersion <> 0) AND (majorVersion <> Car_MajorVersion)) OR
  1053.      ((minorVersion <> 0) AND (minorVersion > Car_MinorVersion)) THEN
  1054.     somWriteString( "CarNewClass: Error, bad version numbers." );
  1055.     somWriteLn();
  1056.     b := Conversions.StrToLongCard( currentLine(), line );
  1057.     SOM.SOMError( SOM.SOMERROR_BadVersion, currentFile(), line );
  1058.   END;
  1059.  
  1060.   (* Don't do anything if class object is already created. *)
  1061.   IF CarClassData.classObject <> NIL THEN
  1062.     RETURN CarClassData.classObject;
  1063.   END;
  1064.  
  1065.   (* Make sure the environment is initialized. *)
  1066.   IF SOM.SOMClassMgrObject = NIL THEN
  1067.     SOM.SOMClassMgrObject := SOM.somEnvironmentNew();
  1068.     IF SOM.SOMClassMgrObject = NIL THEN
  1069.       b := Conversions.StrToLongCard( currentLine(), line );
  1070.       SOM.SOMError( SOM.SOMERROR_CouldNotStartup, currentFile(), line );
  1071.     END;
  1072.     (* SOMClassMgrObject initialized... *)
  1073.   END;
  1074.  
  1075.   (* Get the parent class object. *)
  1076.   pClsObj := WPDATAF.WPDataFileNewClass( 0, 0 ); (* static *)
  1077.   pClsObj := SOM.SOMClassMgrObject^.somFindClass
  1078.   ( SOM.somIdFromString( "WPDataFile" ), 0, 0 );
  1079.   IF pClsObj = NIL THEN
  1080.     b := Conversions.StrToLongCard( currentLine(), line );
  1081.     SOM.SOMError( SOM.SOMERROR_NoParentClass, currentFile(), line );
  1082.   END;
  1083.  
  1084.   (* Get the metaclass object. *)
  1085.   (* If explicit metaclass, get it from there *)
  1086.     mClsObj := M_CarNewClass( 0, 0 );       (* static*)
  1087.     mClsObj := SOM.SOMClassMgrObject^.somFindClass
  1088.     ( SOM.somIdFromString( "M_Car" ), 0, 0 );
  1089.   (* else use parent's metaclass:
  1090.     mClsObj := pClsObj^.mtab^.classObject;
  1091.   *)
  1092.   IF mClsObj = NIL THEN
  1093.     b := Conversions.StrToLongCard( currentLine(), line );
  1094.     SOM.SOMError( SOM.SOMERROR_NoMetaClass, currentFile(), line );
  1095.   END;
  1096.  
  1097.   SOM.somConstructClass
  1098.   ( CarsomCreateClass, pClsObj, mClsObj, SYSTEM.ADR( CartempClassData ) );
  1099.  
  1100.   RETURN CarClassData.classObject;
  1101. END CarNewClass;
  1102.  
  1103.  
  1104.  
  1105.  
  1106. (*************************************************************************
  1107.    Implementation header for the new SOM metaclass 'M_Car'
  1108.    (constants, types and variables)
  1109. **************************************************************************)
  1110.  
  1111. CONST
  1112.   M_Car_MaxNoMethods = 1;         (* number of new methods *)
  1113.   M_CarDebug         = TRUE;      (* enable/disable method debugging *)
  1114.  
  1115. (*
  1116.  * Temporary class data structure used only in class creation
  1117.  *)
  1118. VAR
  1119.   M_CartempClassData        : SOM.somClassDataStructure;
  1120.  
  1121. (*
  1122.  * Internal instance data fields
  1123.  *)
  1124. TYPE
  1125.   M_CarData          = RECORD
  1126.                        END;
  1127.   PM_CarData         = POINTER TO M_CarData;
  1128.  
  1129. (*
  1130.  *   M_CarGetData function, gives access to the instance data, if any
  1131.  *)
  1132. PROCEDURE M_CarGetData( Self : PM_Car ) : PM_CarData;
  1133. BEGIN
  1134.   RETURN NIL; (* no instance data fields to be dealt with *)
  1135. END M_CarGetData;
  1136.  
  1137. (*
  1138.  *  SOM specific identifiers for all
  1139.  *  the new and also the overridden methods
  1140.  *)
  1141. VAR
  1142.   somId_clsQueryModuleHandle     : SOM.somId;
  1143.   somId_wpclsInitData            : SOM.somId;
  1144.   somId_wpclsUnInitData          : SOM.somId;
  1145.   somId_wpclsQueryTitle          : SOM.somId;
  1146.   somId_wpclsQueryIconData       : SOM.somId;
  1147.   somId_wpclsQueryDefaultHelp    : SOM.somId;
  1148.   somId_wpclsQueryDefaultView    : SOM.somId;
  1149.   somId_wpclsQueryDetailsInfo    : SOM.somId;
  1150.   somId_wpclsQueryDetails        : SOM.somId;
  1151.   somId_wpclsQueryInstanceFilter : SOM.somId;
  1152.   somId_wpclsQueryStyle          : SOM.somId;
  1153.  
  1154.  
  1155. (*************************************************************************
  1156.   apply- and redispatch- stubs for new methods introduced
  1157.   by metaclass 'M_Car'
  1158. *************************************************************************)
  1159.  
  1160.  
  1161. PROCEDURE somAP_clsQueryModuleHandle
  1162. (
  1163.   somSelf      : PM_Car;
  1164.   id           : SOM.somId;
  1165.   desc         : SOM.somId;
  1166.   VAR args     : ARRAY OF SOM.DWORD
  1167. )              : OS2DEF.HMODULE;
  1168. BEGIN
  1169.   RETURN somSelf^.clsQueryModuleHandle( );
  1170. END somAP_clsQueryModuleHandle;
  1171.  
  1172. PROCEDURE somRD_clsQueryModuleHandle
  1173. (
  1174.   somSelf      : PM_Car
  1175. )              : OS2DEF.HMODULE;
  1176. VAR
  1177.   retBuffer    : LONGCARD;
  1178.   retValue     : SOM.somToken;
  1179.   args         : SOM.ADDRESS;
  1180.   dispatched   : BOOLEAN;
  1181. BEGIN
  1182.   retValue := ADR( retBuffer );
  1183.   args := ADR( somSelf ) + SIZE( somSelf );
  1184.   dispatched := somSelf^.somDispatch( retValue, somId_clsQueryModuleHandle, args^ );
  1185.   RETURN retBuffer;
  1186. END somRD_clsQueryModuleHandle;
  1187.  
  1188.  
  1189.  
  1190. (*************************************************************************
  1191.   Forward declared procedures for all newly introduced private methods
  1192.   and for privately overridden methods.
  1193. *************************************************************************)
  1194.  
  1195.  
  1196. PROCEDURE( Self : PM_Car ) wpclsInitData( );
  1197. FORWARD;
  1198.  
  1199. PROCEDURE( Self : PM_Car ) wpclsUnInitData( );
  1200. FORWARD;
  1201.  
  1202. PROCEDURE( Self : PM_Car ) wpclsQueryTitle( ) : OS2DEF.PSZ;
  1203. FORWARD;
  1204.  
  1205. PROCEDURE( Self : PM_Car ) wpclsQueryIconData
  1206. (
  1207.   pIconInfo     : OS2DEF.PICONINFO
  1208. )               : LONGCARD;
  1209. FORWARD;
  1210.  
  1211. PROCEDURE( Self : PM_Car ) wpclsQueryDefaultHelp
  1212. (
  1213.   VAR HelpPanelId   : LONGCARD;
  1214.   VAR szHelpLibrary : ARRAY OF CHAR
  1215. )                   : BOOLEAN;
  1216. FORWARD;
  1217.  
  1218. PROCEDURE( Self : PM_Car ) wpclsQueryDefaultView( ) : LONGCARD;
  1219. FORWARD;
  1220.  
  1221. PROCEDURE( Self : PM_Car ) wpclsQueryDetailsInfo
  1222. (
  1223.   ppClassFieldInfo : WPOBJECT.PPCLASSFIELDINFO;
  1224.   pSize            : WPOBJECT.PLONGCARD
  1225. )                  : LONGCARD;
  1226. FORWARD;
  1227.  
  1228. PROCEDURE( Self : PM_Car ) wpclsQueryDetails( ) : WPOBJECT.PCLASSDETAILS;
  1229. FORWARD;
  1230.  
  1231. PROCEDURE( Self : PM_Car ) wpclsQueryInstanceFilter( ) : OS2DEF.PSZ;
  1232. FORWARD;
  1233.  
  1234. PROCEDURE( Self : PM_Car ) wpclsQueryStyle( ) : LONGCARD;
  1235. FORWARD;
  1236.  
  1237.  
  1238.  
  1239. (*************************************************************************
  1240.     SOM-class creation procedures.
  1241.     Only the M_CarNewClass() procedure is publicly
  1242.     available for client programs.
  1243. **************************************************************************)
  1244.  
  1245.  
  1246. (*
  1247.  * class initialization
  1248.  *)
  1249. PROCEDURE M_CarsomInitializeClass;
  1250. VAR
  1251.   m  : M_Car;     (* needed for static method references *)
  1252.   c  : SOM.PSOMClass;
  1253.   md : SOM.somId;
  1254. BEGIN
  1255.  
  1256.   c := M_CartempClassData.classObject;
  1257.   md := SOM.somIdFromString( "----" );
  1258.  
  1259.   (* Add the new methods, including apply and redispatch stubs,
  1260.      to the new SOM class
  1261.   *)
  1262.   M_CarClassData.clsQueryModuleHandle := c^.somAddStaticMethod
  1263.   ( somId_clsQueryModuleHandle, md, m.clsQueryModuleHandle, somRD_clsQueryModuleHandle, somAP_clsQueryModuleHandle );
  1264.  
  1265.   (* Override inherited methods, if any *)
  1266.   c^.somOverrideSMethod( somId_wpclsInitData, m.wpclsInitData );
  1267.   c^.somOverrideSMethod( somId_wpclsUnInitData, m.wpclsUnInitData );
  1268.   c^.somOverrideSMethod( somId_wpclsQueryTitle, m.wpclsQueryTitle );
  1269.   c^.somOverrideSMethod( somId_wpclsQueryIconData, m.wpclsQueryIconData );
  1270.   c^.somOverrideSMethod( somId_wpclsQueryDefaultHelp, m.wpclsQueryDefaultHelp );
  1271.   c^.somOverrideSMethod( somId_wpclsQueryDefaultView, m.wpclsQueryDefaultView );
  1272.   c^.somOverrideSMethod( somId_wpclsQueryDetailsInfo, m.wpclsQueryDetailsInfo );
  1273.   c^.somOverrideSMethod( somId_wpclsQueryDetails, m.wpclsQueryDetails );
  1274.   c^.somOverrideSMethod( somId_wpclsQueryInstanceFilter, m.wpclsQueryInstanceFilter );
  1275.   c^.somOverrideSMethod( somId_wpclsQueryStyle, m.wpclsQueryStyle );
  1276.  
  1277. END M_CarsomInitializeClass;
  1278.  
  1279.  
  1280. (*
  1281.  *  class creation procedure
  1282.  *)
  1283. PROCEDURE M_CarsomCreateClass
  1284. (
  1285.   pClsObj    : SOM.PSOMClass;
  1286.   mClsObj    : SOM.PSOMClass
  1287. );
  1288. VAR
  1289.   classObject : SOM.PSOMClass;
  1290. BEGIN
  1291.   classObject := mClsObj^.somNew();
  1292.   M_CartempClassData.classObject := classObject;
  1293.   classObject^.somInitClass
  1294.   (
  1295.     "M_Car",
  1296.     pClsObj,
  1297.     SIZE( M_CarData ),
  1298.     M_Car_MaxNoMethods,
  1299.     M_Car_MajorVersion,
  1300.     M_Car_MinorVersion
  1301.   );
  1302.   M_CarCClassData.instanceDataToken := classObject^.somGetInstanceToken();
  1303.   M_CarsomInitializeClass();
  1304.   M_CarCClassData.parentMtab := classObject^.somGetPClsMtab();
  1305.   classObject^.somSetClassData( SYSTEM.ADR( M_CarClassData ) );
  1306.   classObject^.somClassReady();
  1307.   (* make newly created class object visible *)
  1308.   M_CarClassData.classObject := classObject;
  1309. END M_CarsomCreateClass;
  1310.  
  1311.  
  1312. (*
  1313.  *   public NewClass-procedure
  1314.  *)
  1315. PROCEDURE M_CarNewClass
  1316. (
  1317.   majorVersion  : SOM.INTEGER4;
  1318.   minorVersion  : SOM.INTEGER4
  1319. )               : SOM.PSOMClass;
  1320. VAR
  1321.   pClsObj       : SOM.PSOMClass;
  1322.   mClsObj       : SOM.PSOMClass;
  1323.   line          : LONGCARD;
  1324.   b             : BOOLEAN;
  1325. BEGIN
  1326.   (*
  1327.   SYSTEM.INLINE
  1328.   (
  1329.     MOV EAX, 66666666H
  1330.     INT 3                   ; hard break for debugging
  1331.   );
  1332.   *)
  1333.   (* Check the version numbers *)
  1334.   IF ((majorVersion <> 0) AND (majorVersion <> M_Car_MajorVersion)) OR
  1335.      ((minorVersion <> 0) AND (minorVersion > M_Car_MinorVersion)) THEN
  1336.     somWriteString( "M_CarNewClass: Error, bad version numbers." );
  1337.     somWriteLn();
  1338.     b := Conversions.StrToLongCard( currentLine(), line );
  1339.     SOM.SOMError( SOM.SOMERROR_BadVersion, currentFile(), line );
  1340.   END;
  1341.  
  1342.   (* Don't do anything if class object is already created. *)
  1343.   IF M_CarClassData.classObject <> NIL THEN
  1344.     RETURN M_CarClassData.classObject;
  1345.   END;
  1346.  
  1347.   (* Make sure the environment is initialized. *)
  1348.   IF SOM.SOMClassMgrObject = NIL THEN
  1349.     SOM.SOMClassMgrObject := SOM.somEnvironmentNew();
  1350.     IF SOM.SOMClassMgrObject = NIL THEN
  1351.       b := Conversions.StrToLongCard( currentLine(), line );
  1352.       SOM.SOMError( SOM.SOMERROR_CouldNotStartup, currentFile(), line );
  1353.     END;
  1354.     (* SOMClassMgrObject initialized... *)
  1355.   END;
  1356.  
  1357.   (* Get the parent class object. *)
  1358.   pClsObj := WPDATAF.M_WPDataFileNewClass( 0, 0 ); (* static *)
  1359.   pClsObj := SOM.SOMClassMgrObject^.somFindClass
  1360.   ( SOM.somIdFromString( "M_WPDataFile" ), 0, 0 );
  1361.   IF pClsObj = NIL THEN
  1362.     b := Conversions.StrToLongCard( currentLine(), line );
  1363.     SOM.SOMError( SOM.SOMERROR_NoParentClass, currentFile(), line );
  1364.   END;
  1365.  
  1366.   (* Get the metaclass object. *)
  1367.   (* Use parent's metaclass: *)
  1368.   mClsObj := pClsObj^.mtab^.classObject;
  1369.   IF mClsObj = NIL THEN
  1370.     b := Conversions.StrToLongCard( currentLine(), line );
  1371.     SOM.SOMError( SOM.SOMERROR_NoMetaClass, currentFile(), line );
  1372.   END;
  1373.  
  1374.   SOM.somConstructClass
  1375.   ( M_CarsomCreateClass, pClsObj, mClsObj, SYSTEM.ADR( M_CartempClassData ) );
  1376.  
  1377.   RETURN M_CarClassData.classObject;
  1378. END M_CarNewClass;
  1379.  
  1380.  
  1381.  
  1382.  
  1383. (**************************************************************************
  1384.     Non-Method forward procedures.
  1385.  
  1386.     They are fully specified later, after the method declarations,
  1387.     but are already introduced here, so that they can be referenced
  1388.     by the methods.
  1389.  
  1390.     Remember, this is a quick one-pass Modula-2 compiler!
  1391. ***************************************************************************)
  1392.  
  1393.  
  1394. PROCEDURE CarInit( somSelf : PCar ) : OS2DEF.HWND;
  1395. FORWARD;
  1396.  
  1397. PROCEDURE DashBoardDlgProc
  1398. (
  1399.   hwndDlg   : OS2DEF.HWND;
  1400.   msg       : LONGCARD;
  1401.   mp1       : WIN.MPARAM;
  1402.   mp2       : WIN.MPARAM
  1403. )           : WIN.MRESULT;
  1404. FORWARD;
  1405.  
  1406. PROCEDURE HornBeepDlgProc
  1407. (
  1408.   hwndDlg   : OS2DEF.HWND;
  1409.   msg       : LONGCARD;
  1410.   mp1       : WIN.MPARAM;
  1411.   mp2       : WIN.MPARAM
  1412. )           : WIN.MRESULT;
  1413. FORWARD;
  1414.  
  1415. PROCEDURE CarWndProc
  1416. (
  1417.   hwnd      : OS2DEF.HWND;
  1418.   msg       : LONGCARD;
  1419.   mp1       : WIN.MPARAM;
  1420.   mp2       : WIN.MPARAM
  1421. )           : WIN.MRESULT;
  1422. FORWARD;
  1423.  
  1424.  
  1425. (*
  1426. PROCEDURE _Exception
  1427. (
  1428.   VAR arg           : DOSEXCEPTIONS.EXCEPTIONREPORTRECORD;
  1429.   VAR RegisRecord   : DOSEXCEPTIONS.EXCEPTIONREGISTRATIONRECORD;
  1430.   VAR ContextRecord : DOSEXCEPTIONS.CONTEXTRECORD;
  1431.   pvSpare           : OS2DEF.PVOID
  1432. )                   : LONGCARD;
  1433. FORWARD;
  1434. *)
  1435.  
  1436.  
  1437. (*************************************************************************
  1438.  
  1439.               GLOBAL/STATIC (NON-INSTANCE) DATA SECTION
  1440.  
  1441.     This data shouldn't be changed by instance methods or it will
  1442.     effect all instances!  Any variables that are specific (unique
  1443.     values) for each instance of this object should be declared as
  1444.   instance data or dynamically allocated and stored as window data.
  1445.  
  1446.       This global data should be declared as class instance data
  1447.     if it will change after initialization.  In this case, it will
  1448.                   be accessed through class methods.
  1449.  
  1450. *************************************************************************)
  1451.  
  1452.  
  1453. TYPE
  1454.   CARCLASSTITLE       = ARRAY [0..OS2DEF.CCHMAXPATH-1] OF CHAR;
  1455.  
  1456. CONST
  1457.   LF                  = CHR( 10 );
  1458.   szCarWindowClass    : ARRAY OF CHAR = (*"CARSAMPPP";*) "CARSAMP";
  1459.   szCarInstanceFilter : ARRAY OF CHAR = "*.CAR";
  1460.   szHelpLib           : ARRAY OF CHAR = "car.hlp";
  1461.   szCarClassTitle     : CARCLASSTITLE = "";
  1462.   hmod                : OS2DEF.HMODULE = OS2DEF.NULLHANDLE;
  1463.   szDefaultText       : ARRAY OF CHAR =
  1464.   [
  1465.                                        LF,
  1466.     "                               ", LF,
  1467.     "     Bill of Sale              ", LF,
  1468.     "   =========================   ", LF,
  1469.     "                               ", LF,
  1470.     "   Make........ Toyota         ", LF,
  1471.     "                               ", LF,
  1472.     "   Model....... Camry          ", LF,
  1473.     "                               ", LF,
  1474.     "   Color....... Blue           ", LF,
  1475.     "                               ", LF,
  1476.     "   Sale Date... 3/31/92        ", LF,
  1477.     "                               ", LF,
  1478.     "   Price....... 14,995         ", LF,
  1479.     0C
  1480.   ];
  1481.  
  1482.  
  1483.  
  1484. (*
  1485.  *   Globals required for Exception handling
  1486.  *
  1487.  *)
  1488. CONST
  1489.   szTrapMessage : ARRAY OF CHAR =
  1490.   [
  1491.     "A Memory Access Violation occurred.  The Car ",
  1492.     "sample's exception handler has transferred ",
  1493.     "control back to the cleanup code in the method ",
  1494.     "where the exception occurred.",
  1495.     LF
  1496.   ];
  1497.  
  1498.  
  1499.  
  1500. (*
  1501.  *   Statics required for FIELDINFO structures needed for DETAILS view are
  1502.  *   handled in the three functions:
  1503.  *     M_Car.wpclsInitData,
  1504.  *     Car.wpQueryDetailsData,
  1505.  *     M_Car.wpclsQueryDetailsInfo
  1506.  *
  1507.  *)
  1508. CONST
  1509.   NUM_CAR_FIELDS = 5;
  1510. VAR
  1511.   fieldinfo      : ARRAY [0..NUM_CAR_FIELDS-1] OF WPOBJECT.CLASSFIELDINFO;
  1512.  
  1513.  
  1514. TYPE
  1515.   CARCOLTITLES    = ARRAY [0..NUM_CAR_FIELDS-1] OF ARRAY [0..9] OF CHAR;
  1516. CONST
  1517.   aszCarColTitles : CARCOLTITLES =
  1518.   [
  1519.     [ "Make"      ],   (* details column 1 *)
  1520.     [ "Model"     ],   (* details column 2 *)
  1521.     [ "Color"     ],   (* details column 3 *)
  1522.     [ "Sale date" ],   (* details column 4 *)
  1523.     [ "Price ($)" ]    (* details column 5 *)
  1524.   ];
  1525.  
  1526.  
  1527.  
  1528.  
  1529.  
  1530. (*************************************************************************
  1531.  
  1532.                        INSTANCE METHODS SECTION
  1533.  
  1534.               Do not put any code in this section unless
  1535.                    it is an object INSTANCE method
  1536.  
  1537. *************************************************************************)
  1538.  
  1539.  
  1540.  
  1541. (*
  1542.  *
  1543.  *  METHOD: QueryBrakes                                    ( ) PRIVATE
  1544.  *                                                         (X) PUBLIC
  1545.  *  DESCRIPTION:
  1546.  *
  1547.  *    Query state of car's brakes
  1548.  *
  1549.  *  RETURN:
  1550.  *
  1551.  *    TRUE         Brake is on
  1552.  *    FALSE         Brake is off
  1553.  *
  1554.  *)
  1555.  
  1556. PROCEDURE( Self : PCar ) QueryBrakes( ) : BOOLEAN;
  1557. VAR
  1558.   somThis       : PCarData;
  1559. BEGIN
  1560.   somThis := CarGetData( Self );
  1561.   IF CarDebug THEN
  1562.     somDebug( "Car", "QueryBrakes", currentFile(), currentLine() );
  1563.   END;
  1564.   RETURN somThis^.BrakeFlag;
  1565. END QueryBrakes;
  1566.  
  1567.  
  1568.  
  1569. (*
  1570.  *
  1571.  *  METHOD: SetBrakes                                      ( ) PRIVATE
  1572.  *                                                         (X) PUBLIC
  1573.  *  DESCRIPTION:
  1574.  *
  1575.  *    Put on the brakes
  1576.  *
  1577.  *  RETURN:
  1578.  *
  1579.  *    None
  1580.  *)
  1581.  
  1582. PROCEDURE( Self : PCar ) SetBrakes
  1583. (
  1584.   fBrake        : BOOLEAN
  1585. );
  1586. VAR
  1587.   somThis       : PCarData;
  1588. BEGIN
  1589.   somThis := CarGetData( Self );
  1590.   IF CarDebug THEN
  1591.     somDebug( "Car", "SetBrakes", currentFile(), currentLine() );
  1592.   END;
  1593.   somThis^.BrakeFlag := fBrake;
  1594. END SetBrakes;
  1595.  
  1596.  
  1597.  
  1598. (*
  1599.  *
  1600.  *  METHOD: QueryDuration                                  ( ) PRIVATE
  1601.  *                                                         (X) PUBLIC
  1602.  *  DESCRIPTION:
  1603.  *
  1604.  *    Query Duration of horn beep
  1605.  *
  1606.  *  RETURN:
  1607.  *
  1608.  *    LONGCARD    Duration of beep
  1609.  *
  1610.  *)
  1611.  
  1612. PROCEDURE( Self : PCar ) QueryDuration( ) : LONGCARD;
  1613. VAR
  1614.   somThis       : PCarData;
  1615. BEGIN
  1616.   somThis := CarGetData( Self );
  1617.   IF CarDebug THEN
  1618.     somDebug( "Car", "QueryDuration", currentFile(), currentLine() );
  1619.   END;
  1620.   RETURN somThis^.duration;
  1621. END QueryDuration;
  1622.  
  1623.  
  1624.  
  1625.  
  1626. (*
  1627.  *
  1628.  *  METHOD: SetDuration                                    ( ) PRIVATE
  1629.  *                                                         (X) PUBLIC
  1630.  *  DESCRIPTION:
  1631.  *
  1632.  *    Set Duration of horn beep
  1633.  *
  1634.  *  RETURN:
  1635.  *
  1636.  *    None
  1637.  *)
  1638.  
  1639. PROCEDURE( Self : PCar ) SetDuration
  1640. (
  1641.   ulDuration    : LONGCARD
  1642. );
  1643. VAR
  1644.   somThis       : PCarData;
  1645. BEGIN
  1646.   somThis := CarGetData( Self );
  1647.   IF CarDebug THEN
  1648.     somDebug( "Car", "SetDuration", currentFile(), currentLine() );
  1649.   END;
  1650.   somThis^.duration := ulDuration;
  1651. END SetDuration;
  1652.  
  1653.  
  1654.  
  1655.  
  1656. (*
  1657.  *
  1658.  *  METHOD: QueryHighTone                                  ( ) PRIVATE
  1659.  *                                                         (X) PUBLIC
  1660.  *  DESCRIPTION:
  1661.  *
  1662.  *    Query HighTone of horn
  1663.  *
  1664.  *  RETURN:
  1665.  *
  1666.  *    LONGCARD  High frequency of horn
  1667.  *
  1668.  *)
  1669.  
  1670. PROCEDURE( Self : PCar ) QueryHighTone( ) : LONGCARD;
  1671. VAR
  1672.   somThis       : PCarData;
  1673. BEGIN
  1674.   somThis := CarGetData( Self );
  1675.   IF CarDebug THEN
  1676.     somDebug( "Car", "QueryHighTone", currentFile(), currentLine() );
  1677.   END;
  1678.   RETURN somThis^.HighTone;
  1679. END QueryHighTone;
  1680.  
  1681.  
  1682.  
  1683.  
  1684. (*
  1685.  *
  1686.  *  METHOD: SetHighTone                                    ( ) PRIVATE
  1687.  *                                                         (X) PUBLIC
  1688.  *  DESCRIPTION:
  1689.  *
  1690.  *    Set HighTone of horn
  1691.  *
  1692.  *  RETURN:
  1693.  *
  1694.  *    None
  1695.  *)
  1696.  
  1697. PROCEDURE( Self : PCar ) SetHighTone
  1698. (
  1699.   ulTone        : LONGCARD
  1700. );
  1701. VAR
  1702.   somThis       : PCarData;
  1703. BEGIN
  1704.   somThis := CarGetData( Self );
  1705.   IF CarDebug THEN
  1706.     somDebug( "Car", "SetHighTone", currentFile(), currentLine() );
  1707.   END;
  1708.   somThis^.HighTone := ulTone;
  1709. END SetHighTone;
  1710.  
  1711.  
  1712.  
  1713.  
  1714. (*
  1715.  *
  1716.  *  METHOD: QueryLowTone                                   ( ) PRIVATE
  1717.  *                                                         (X) PUBLIC
  1718.  *  DESCRIPTION:
  1719.  *
  1720.  *    Query LowTone of horn
  1721.  *
  1722.  *  RETURN:
  1723.  *
  1724.  *    LONGCARD   Low frequency of horn
  1725.  *
  1726.  *)
  1727.  
  1728. PROCEDURE( Self : PCar ) QueryLowTone( ) : LONGCARD;
  1729. VAR
  1730.   somThis       : PCarData;
  1731. BEGIN
  1732.   somThis := CarGetData( Self );
  1733.   IF CarDebug THEN
  1734.     somDebug( "Car", "QueryLowTone", currentFile(), currentLine() );
  1735.   END;
  1736.   RETURN somThis^.LowTone;
  1737. END QueryLowTone;
  1738.  
  1739.  
  1740.  
  1741.  
  1742. (*
  1743.  *
  1744.  *  METHOD: SetLowTone                                     ( ) PRIVATE
  1745.  *                                                         (X) PUBLIC
  1746.  *  DESCRIPTION:
  1747.  *
  1748.  *    Set LowTone of horn
  1749.  *
  1750.  *  RETURN:
  1751.  *
  1752.  *    None
  1753.  *)
  1754.  
  1755. PROCEDURE( Self : PCar ) SetLowTone
  1756. (
  1757.   ulTone : LONGCARD
  1758. );
  1759. VAR
  1760.   somThis       : PCarData;
  1761. BEGIN
  1762.   somThis := CarGetData( Self );
  1763.   IF CarDebug THEN
  1764.     somDebug( "Car", "SetLowTone", currentFile(), currentLine() );
  1765.   END;
  1766.   somThis^.LowTone := ulTone;
  1767. END SetLowTone;
  1768.  
  1769.  
  1770.  
  1771.  
  1772. (*
  1773.  *
  1774.  *  METHOD: QuerySpeed                                     ( ) PRIVATE
  1775.  *                                                         (X) PUBLIC
  1776.  *  DESCRIPTION:
  1777.  *
  1778.  *    Query Speed of car
  1779.  *
  1780.  *  RETURN:
  1781.  *
  1782.  *    LONGCARD  car speed
  1783.  *
  1784.  *)
  1785.  
  1786. PROCEDURE( Self : PCar ) QuerySpeed( ) : LONGCARD;
  1787. VAR
  1788.   somThis       : PCarData;
  1789. BEGIN
  1790.   somThis := CarGetData( Self );
  1791.   IF CarDebug THEN
  1792.     somDebug( "Car", "QuerySpeed", currentFile(), currentLine() );
  1793.   END;
  1794.   RETURN somThis^.speed;
  1795. END QuerySpeed;
  1796.  
  1797.  
  1798.  
  1799.  
  1800. (*
  1801.  *
  1802.  *  METHOD: SetSpeed                                       ( ) PRIVATE
  1803.  *                                                         (X) PUBLIC
  1804.  *  DESCRIPTION:
  1805.  *
  1806.  *    Set Speed of car
  1807.  *
  1808.  *  RETURN:
  1809.  *
  1810.  *    None
  1811.  *)
  1812.  
  1813. PROCEDURE( Self : PCar ) SetSpeed
  1814. (
  1815.   ulSpeed       : LONGCARD
  1816. );
  1817. VAR
  1818.   somThis       : PCarData;
  1819. BEGIN
  1820.   somThis := CarGetData( Self );
  1821.   IF CarDebug THEN
  1822.     somDebug( "Car", "SetSpeed", currentFile(), currentLine() );
  1823.   END;
  1824.   somThis^.speed := ulSpeed;
  1825. END SetSpeed;
  1826.  
  1827.  
  1828.  
  1829.  
  1830.  
  1831. (*
  1832.  *
  1833.  *  METHOD: BeepHorn                                       ( ) PRIVATE
  1834.  *                                                         (X) PUBLIC
  1835.  *  DESCRIPTION:
  1836.  *
  1837.  *    Beep the car's horn.
  1838.  *
  1839.  *  RETURN:
  1840.  *
  1841.  *    TRUE         Successful
  1842.  *    FALSE         Unsuccessful
  1843.  *
  1844.  *)
  1845.  
  1846. PROCEDURE( Self : PCar ) BeepHorn( ) : BOOLEAN;
  1847. VAR
  1848.   somThis       : PCarData;
  1849. BEGIN
  1850.   somThis := CarGetData( Self );
  1851.   IF CarDebug THEN
  1852.     somDebug( "Car", "BeepHorn", currentFile(), currentLine() );
  1853.   END;
  1854.   DOSPROCESS.DosBeep( Self^.QueryHighTone(), Self^.QueryDuration() );
  1855.   DOSPROCESS.DosSleep( 100 );
  1856.   DOSPROCESS.DosBeep( Self^.QueryLowTone(), Self^.QueryDuration() );
  1857.   RETURN TRUE;
  1858. END BeepHorn;
  1859.  
  1860.  
  1861.  
  1862.  
  1863. (*
  1864.  *
  1865.  *  METHOD: AddDashboardPage                               ( ) PRIVATE
  1866.  *                                                         (X) PUBLIC
  1867.  *  DESCRIPTION:
  1868.  *
  1869.  *    This method adds the dashboard page to the settings notebook.
  1870.  *
  1871.  *  RETURN:
  1872.  *
  1873.  *    0              Unsuccessful
  1874.  *    ulPageId       Identifier for the inserted page
  1875.  *
  1876.  *  HOW TO OVERRIDE:
  1877.  *
  1878.  *    Method should always be overridden in order to replace or remove
  1879.  *    the dashboard page from an object which is a descendent of Car.
  1880.  *    In most cases, an override of this method will not call the parent.
  1881.  *
  1882.  *)
  1883.  
  1884. PROCEDURE( Self : PCar ) AddDashboardPage
  1885. (
  1886.   hwndNotebook  : OS2DEF.HWND
  1887. )               : LONGCARD;
  1888. VAR
  1889.   pageinfo      : WINWORKPLACE.PAGEINFO;
  1890. (*somThis       : PCarData;*)
  1891. BEGIN
  1892. (*somThis := CarGetData( Self );*)
  1893.   IF CarDebug THEN
  1894.     somDebug( "Car", "AddDashboardPage", currentFile(), currentLine() );
  1895.   END;
  1896.  
  1897.   SYSTEM.MemSet( ADR( pageinfo ), 0, SIZE( pageinfo ) );
  1898.   pageinfo.cb                 := SIZE( WINWORKPLACE.PAGEINFO );
  1899.   pageinfo.hwndPage           := OS2DEF.NULLHANDLE;
  1900.   pageinfo.usPageStyleFlags   := WIN.BKA_MAJOR;
  1901.   pageinfo.usPageInsertFlags  := WIN.BKA_FIRST;
  1902.   pageinfo.pfnwp              := DashBoardDlgProc;
  1903.   pageinfo.resid              := hmod;
  1904.   pageinfo.dlgid              := IDD_DASHBOARD;
  1905.   pageinfo.pszName            := SOMMISC.somString( "Dashboard" );
  1906.   pageinfo.pCreateParams      := Self;
  1907.   pageinfo.idDefaultHelpPanel := ID_HELP_DASHBOARD;
  1908.   pageinfo.pszHelpLibraryName := ADR( szHelpLib );
  1909.  
  1910.   RETURN Self^.wpInsertSettingsPage( hwndNotebook, pageinfo );
  1911.  
  1912. END AddDashboardPage;
  1913.  
  1914.  
  1915.  
  1916. (*
  1917.  *
  1918.  *  METHOD: AddHornBeepPage                                ( ) PRIVATE
  1919.  *                                                         (X) PUBLIC
  1920.  *  DESCRIPTION:
  1921.  *
  1922.  *    This method adds the horn beep page to the settings
  1923.  *    notebook.
  1924.  *
  1925.  *  RETURN:
  1926.  *
  1927.  *    0              Unsuccessful
  1928.  *    ulPageId       Identifier for the inserted page
  1929.  *
  1930.  *  HOW TO OVERRIDE:
  1931.  *
  1932.  *    Method should always be overridden in order to replace or remove
  1933.  *    the horn beep page from an object which is a descendent of Car.
  1934.  *    In most cases, an override of this method will not call the parent.
  1935.  *
  1936.  *
  1937.  *    Methods from the WPObject class
  1938.  *
  1939.  *)
  1940.  
  1941. PROCEDURE( Self : PCar ) AddHornBeepPage
  1942. (
  1943.   hwndNotebook  : OS2DEF.HWND
  1944. )               : LONGCARD;
  1945. VAR
  1946.   pageinfo      : WINWORKPLACE.PAGEINFO;
  1947. (*somThis       : PCarData;*)
  1948. BEGIN
  1949. (*somThis := CarGetData( Self );*)
  1950.   IF CarDebug THEN
  1951.     somDebug( "Car", "AddHornBeepPage", currentFile(), currentLine() );
  1952.   END;
  1953.  
  1954.   (* Insert the settings pages for a car *)
  1955.   SYSTEM.MemSet( ADR( pageinfo ), 0, SIZE( pageinfo ) );
  1956.   pageinfo.cb                 := SIZE( WINWORKPLACE.PAGEINFO );
  1957.   pageinfo.hwndPage           := OS2DEF.NULLHANDLE;
  1958.   pageinfo.usPageStyleFlags   := WIN.BKA_MAJOR;
  1959.   pageinfo.usPageInsertFlags  := WIN.BKA_FIRST;
  1960.   pageinfo.pfnwp              := HornBeepDlgProc;
  1961.   pageinfo.resid              := hmod;
  1962.   pageinfo.dlgid              := IDD_HORNBEEP;
  1963.   pageinfo.pszName            := SOMMISC.somString( "Horn Beep" );
  1964.   pageinfo.pCreateParams      := Self;
  1965.   pageinfo.idDefaultHelpPanel := ID_HELP_HORNBEEP;
  1966.   pageinfo.pszHelpLibraryName := ADR( szHelpLib );
  1967.  
  1968.   RETURN Self^.wpInsertSettingsPage( hwndNotebook, pageinfo );
  1969.  
  1970. END AddHornBeepPage;
  1971.  
  1972.  
  1973.  
  1974. (*
  1975.  *
  1976.  *  OVERRIDE: wpInitData                                   ( ) PRIVATE
  1977.  *                                                         (X) PUBLIC
  1978.  *  DESCRIPTION:
  1979.  *
  1980.  *    Initialize our state variables. Allocate any extra memory that
  1981.  *    we might need.
  1982.  *
  1983.  *)
  1984.  
  1985. PROCEDURE( Self : PCar ) wpInitData( );
  1986. VAR
  1987.   somThis       : PCarData;
  1988. BEGIN
  1989.   somThis := CarGetData( Self );
  1990.   IF CarDebug THEN
  1991.     somDebug( "Car", "wpInitData", currentFile(), currentLine() );
  1992.   END;
  1993.  
  1994.   (*
  1995.    *   We can initialize our instance data to 0's by using the somThis
  1996.    *   pointer and the size of the CarData structure created by SOM.
  1997.    *
  1998.    *   SOM stores instance data in a data structure named by prefixing
  1999.    *   the name "Data" with the class name, in this case, "Car".
  2000.    *)
  2001.    SYSTEM.MemSet( somThis, 0, SIZE( CarData ) );
  2002.  
  2003.    (*
  2004.     *  And/or we can explicitly initialize our instance variables.
  2005.     *)
  2006.    somThis^.HighTone  := DEFAULT_HITONE;
  2007.    somThis^.LowTone   := DEFAULT_LOTONE;
  2008.    somThis^.duration  := DEFAULT_DURATION;
  2009.    somThis^.speed     := DEFAULT_SPEED;
  2010.    somThis^.BrakeFlag := DEFAULT_BRAKEFLAG;
  2011.  
  2012.    Self^.wpInitData^(); (* parent wpInitData *)
  2013.  
  2014. END wpInitData;
  2015.  
  2016.  
  2017.  
  2018. (*
  2019.  *
  2020.  *  OVERRIDE: wpUnInitData                                 ( ) PRIVATE
  2021.  *                                                         (X) PUBLIC
  2022.  *  DESCRIPTION:
  2023.  *
  2024.  *    Clear up memory that was allocated on wpInitData.
  2025.  *
  2026.  *)
  2027.  
  2028. PROCEDURE( Self : PCar ) wpUnInitData( );
  2029. VAR
  2030. (*somThis       : PCarData;*)
  2031. BEGIN
  2032. (*somThis := CarGetData( Self );*)
  2033.   IF CarDebug THEN
  2034.     somDebug( "Car", "wpUnInitData", currentFile(), currentLine() );
  2035.   END;
  2036.   Self^.wpUnInitData^(); (* parent wpUnInitData *)
  2037. END wpUnInitData;
  2038.  
  2039.  
  2040.  
  2041.  
  2042. (*
  2043.  *
  2044.  *  METHOD: wpSaveState                                    ( ) PRIVATE
  2045.  *                                                         (X) PUBLIC
  2046.  *  DESCRIPTION:
  2047.  *
  2048.  *    Save our state variables (pitch and duration).
  2049.  *
  2050.  *)
  2051.  
  2052. PROCEDURE( Self : PCar ) wpSaveState( ) : BOOLEAN;
  2053. VAR
  2054.   somThis       : PCarData;
  2055.   ulBrakeFlag   : LONGCARD;
  2056. BEGIN
  2057.   somThis := CarGetData( Self );
  2058.   IF CarDebug THEN
  2059.     somDebug( "Car", "wpSaveState", currentFile(), currentLine() );
  2060.   END;
  2061.   ulBrakeFlag := LONG( LONG( SOM.BYTE( somThis^.BrakeFlag ) ) );
  2062.   Self^.wpSaveLong( szCarClassTitle, IDKEY_HITONE,    somThis^.HighTone  );
  2063.   Self^.wpSaveLong( szCarClassTitle, IDKEY_LOTONE,    somThis^.LowTone   );
  2064.   Self^.wpSaveLong( szCarClassTitle, IDKEY_DURATION,  somThis^.duration  );
  2065.   Self^.wpSaveLong( szCarClassTitle, IDKEY_SPEED,     somThis^.speed     );
  2066.   Self^.wpSaveLong( szCarClassTitle, IDKEY_BRAKEFLAG, ulBrakeFlag );
  2067.   RETURN Self^.wpSaveState^(); (* parent wpSaveState *)
  2068. END wpSaveState;
  2069.  
  2070.  
  2071.  
  2072.  
  2073. (*
  2074.  *
  2075.  *  METHOD: wpRestoreState                                 ( ) PRIVATE
  2076.  *                                                         (X) PUBLIC
  2077.  *  DESCRIPTION:
  2078.  *
  2079.  *    Retrieve our saved state variables (pitch and duration).
  2080.  *
  2081.  *)
  2082.  
  2083. PROCEDURE( Self : PCar ) wpRestoreState( ulReserved : LONGCARD ) : BOOLEAN;
  2084. VAR
  2085.   somThis       : PCarData;
  2086.   ulBrakeFlag   : LONGCARD;
  2087. BEGIN
  2088.   somThis := CarGetData( Self );
  2089.   IF CarDebug THEN
  2090.     somDebug( "Car", "wpRestoreState", currentFile(), currentLine() );
  2091.   END;
  2092.  
  2093.   Self^.wpRestoreLong( szCarClassTitle, IDKEY_HITONE,    somThis^.HighTone  );
  2094.   Self^.wpRestoreLong( szCarClassTitle, IDKEY_LOTONE,    somThis^.LowTone   );
  2095.   Self^.wpRestoreLong( szCarClassTitle, IDKEY_DURATION,  somThis^.duration  );
  2096.   Self^.wpRestoreLong( szCarClassTitle, IDKEY_SPEED,     somThis^.speed     );
  2097.   Self^.wpRestoreLong( szCarClassTitle, IDKEY_BRAKEFLAG, ulBrakeFlag );
  2098.   somThis^.BrakeFlag := SHORT( SHORT( SOM.LONGWORD( ulBrakeFlag ) ) );
  2099.   RETURN Self^.wpRestoreState^( ulReserved ); (* parent wpRestoreState *)
  2100. END wpRestoreState;
  2101.  
  2102.  
  2103.  
  2104. (*
  2105.  *
  2106.  *  METHOD: wpAddSettingsPages                             ( ) PRIVATE
  2107.  *                                                         (X) PUBLIC
  2108.  *  DESCRIPTION:
  2109.  *
  2110.  *    Add our own settings page to let the user alter the pitch
  2111.  *    and duration of the car's beep.
  2112.  *
  2113.  *)
  2114.  
  2115. PROCEDURE( Self : PCar ) wpAddSettingsPages
  2116. (
  2117.   hwndNotebook  : OS2DEF.HWND
  2118. )               : BOOLEAN;
  2119. VAR
  2120. (*somThis       : PCarData;*)
  2121. BEGIN
  2122. (*somThis := CarGetData( Self );*)
  2123.   IF CarDebug THEN
  2124.     somDebug( "Car", "wpAddSettingsPages", currentFile(), currentLine() );
  2125.   END;
  2126.   IF (Self^.wpAddSettingsPages^( hwndNotebook ))  AND
  2127.      (Self^.AddHornBeepPage( hwndNotebook ) <> 0)  AND
  2128.      (Self^.AddDashboardPage( hwndNotebook ) <> 0)
  2129.   THEN
  2130.     RETURN TRUE;
  2131.   ELSE
  2132.     DebugBox( "Car.wpAddSettingsPages", " Failed to add a settings page.");
  2133.     RETURN FALSE;
  2134.   END;
  2135. END wpAddSettingsPages;
  2136.  
  2137.  
  2138.  
  2139. (*
  2140.  *
  2141.  *  METHOD: wpFilterPopupMenu                              ( ) PRIVATE
  2142.  *                                                         (X) PUBLIC
  2143.  *  DESCRIPTION:
  2144.  *
  2145.  *    Filter out any options from the context that don't apply.
  2146.  *
  2147.  *  HOW TO OVERRIDE:
  2148.  *
  2149.  *    No restrictions.
  2150.  *
  2151.  *)
  2152.  
  2153. PROCEDURE( Self : PCar ) wpFilterPopupMenu
  2154. (
  2155.   ulFlags       : LONGCARD;
  2156.   hwndCnr       : OS2DEF.HWND;
  2157.   fMultiSelect  : BOOLEAN
  2158. )               : LONGCARD;
  2159. VAR
  2160. (*somThis       : PCarData;*)
  2161. BEGIN
  2162. (*somThis := CarGetData( Self );*)
  2163.   IF CarDebug THEN
  2164.     somDebug( "Car", "wpFilterPopupMenu", currentFile(), currentLine() );
  2165.   END;
  2166.   (*
  2167.    *   This method allows you to filter which menus to include in the
  2168.    *   popup menu.  Note: wpclsQueryStyle is overridden to disallow
  2169.    *   linking (creating shadow) as well.
  2170.    *)
  2171.    RETURN Self^.wpFilterPopupMenu^( ulFlags, hwndCnr, fMultiSelect )
  2172.           AND NOT WPOBJECT.CTXT_LINK;
  2173. END wpFilterPopupMenu;
  2174.  
  2175.  
  2176.  
  2177.  
  2178.  
  2179. (*
  2180.  *
  2181.  *  METHOD: wpModifyPopupMenu                              ( ) PRIVATE
  2182.  *                                                         (X) PUBLIC
  2183.  *  DESCRIPTION:
  2184.  *
  2185.  *    Add our extra option to the context menu to beep the horn
  2186.  *
  2187.  *)
  2188.  
  2189. PROCEDURE( Self : PCar ) wpModifyPopupMenu
  2190. (
  2191.   hwndMenu      : OS2DEF.HWND;
  2192.   hwndCnr       : OS2DEF.HWND;
  2193.   iPosition     : LONGCARD
  2194. )               : BOOLEAN;
  2195. VAR
  2196. (*somThis       : PCarData;*)
  2197. BEGIN
  2198. (*somThis := CarGetData( Self );*)
  2199.   IF CarDebug THEN
  2200.     somDebug( "Car", "wpModifyPopupMenu", currentFile(), currentLine() );
  2201.   END;
  2202.  
  2203.   (*
  2204.    *   Put in our special "open car" submenu item under the "open" menu
  2205.    *)
  2206.   Self^.wpInsertPopupMenuItems
  2207.   ( hwndMenu, 0, hmod, ID_OPENMENU, WPOBJECT.WPMENUID_OPEN );
  2208.  
  2209.   (*
  2210.    *   insert a "beep horn" menu item at the end of the list.
  2211.    *)
  2212.   Self^.wpInsertPopupMenuItems
  2213.   ( hwndMenu, iPosition, hmod, ID_BEEPMENU, 0 );
  2214.  
  2215.   (*
  2216.    *   insert a "TRAP-D" menu item at the end of the list.
  2217.    *)
  2218.   Self^.wpInsertPopupMenuItems
  2219.   ( hwndMenu, 0, hmod, ID_TRAPMENU, 0 );
  2220.  
  2221.   (* call parent *)
  2222.   RETURN Self^.wpModifyPopupMenu^( hwndMenu, hwndCnr, iPosition );
  2223.  
  2224. END wpModifyPopupMenu;
  2225.  
  2226.  
  2227.  
  2228. (*
  2229.  *
  2230.  *  METHOD: wpMenuItemSelected                             ( ) PRIVATE
  2231.  *                                                         (X) PUBLIC
  2232.  *  DESCRIPTION:
  2233.  *
  2234.  *    Process input from the extra menu option that we added.
  2235.  *
  2236.  *)
  2237.  
  2238. PROCEDURE( Self : PCar ) wpMenuItemSelected
  2239. (
  2240.   hwndFrame     : OS2DEF.HWND;
  2241.   ulMenuId      : LONGCARD
  2242. )               : BOOLEAN;
  2243. VAR
  2244. (*somThis       : PCarData;*)
  2245. BEGIN
  2246. (*somThis := CarGetData( Self );*)
  2247.   IF CarDebug THEN
  2248.     somDebug( "Car", "wpMenuItemSelected", currentFile(), currentLine() );
  2249.   END;
  2250.   CASE ulMenuId OF (* Which of our menu items was selected ? *)
  2251.   | IDM_OPENCAR:
  2252.     (*
  2253.      *   We could call wpOpen here, but, if the object is already opened,
  2254.      *   the following API determines whether the object should be
  2255.      *   resurfaced, or if multiple views are desired.
  2256.      *)
  2257.     Self^.wpViewObject( OS2DEF.NULLHANDLE, OPEN_CAR, 0 );
  2258.   | IDM_BEEPHORN:
  2259.     Self^.BeepHorn();
  2260.   | IDM_TRAPCAR:
  2261.     Self^.TrapTest();
  2262.   ELSE
  2263.     RETURN Self^.wpMenuItemSelected^( hwndFrame, ulMenuId ); (* parent call *)
  2264.   END;
  2265.   RETURN TRUE; (* we processed it *)
  2266. END wpMenuItemSelected;
  2267.  
  2268.  
  2269.  
  2270.  
  2271. (*
  2272.  *
  2273.  *  METHOD: wpMenuItemHelpSelected                         ( ) PRIVATE
  2274.  *                                                         (X) PUBLIC
  2275.  *  DESCRIPTION:
  2276.  *
  2277.  *    Process input from the extra menu option that we added.
  2278.  *
  2279.  *)
  2280.  
  2281. PROCEDURE( Self : PCar ) wpMenuItemHelpSelected
  2282. (
  2283.   MenuId        : LONGCARD
  2284. )               : BOOLEAN;
  2285. VAR
  2286.   somThis       : PCarData;
  2287. BEGIN
  2288.   somThis := CarGetData( Self );
  2289.   IF CarDebug THEN
  2290.     somDebug( "Car", "wpMenuItemHelpSelected", currentFile(), currentLine() );
  2291.   END;
  2292.   CASE MenuId OF (* Which of our menu items was selected ? *)
  2293.   | IDM_BEEPHORN:
  2294.     RETURN Self^.wpDisplayHelp( ID_HELP_BEEPHORN, szHelpLib );
  2295.   | IDM_OPENCAR:
  2296.     (* no help written at this time *)
  2297.     (* RETURN Self^.wpDisplayHelp( ID_HELP_OPENCAR, szHelpLib ); *)
  2298.   END;
  2299.   RETURN FALSE;
  2300. END wpMenuItemHelpSelected;
  2301.  
  2302.  
  2303.  
  2304.  
  2305. (*
  2306.  *
  2307.  *  METHOD: wpQueryDetailsData                             ( ) PRIVATE
  2308.  *                                                         (X) PUBLIC
  2309.  *  DESCRIPTION:
  2310.  *
  2311.  *    Returns the car specific data for the details view of this object.
  2312.  *    Sets the pointer ppDetailsData^ to the beginning of the buffer
  2313.  *    into which the data is written.
  2314.  *
  2315.  *)
  2316.  
  2317. PROCEDURE( Self : PCar ) wpQueryDetailsData
  2318. (
  2319.   ppDetailsData : OS2DEF.PPVOID;
  2320.   VAR cp        : LONGCARD
  2321. )               : BOOLEAN;
  2322. VAR
  2323. (*somThis       : PCarData;*)
  2324.   pCarDetails   : PCARDETAILS;
  2325. BEGIN
  2326. (*somThis := CarGetData( Self );*)
  2327.   IF CarDebug THEN
  2328.     somDebug( "Car", "wpQueryDetailsData", currentFile(), currentLine() );
  2329.   END;
  2330.   Self^.wpQueryDetailsData^( ppDetailsData, cp ); (* parent call *)
  2331.   IF ppDetailsData <> NIL THEN (* query data *)
  2332.     pCarDetails                  := ppDetailsData^;
  2333.     pCarDetails^.pszMake         := SOMMISC.somString( "Toyota" );
  2334.     pCarDetails^.pszModel        := SOMMISC.somString( "Camry" );
  2335.     pCarDetails^.pszColor        := SOMMISC.somString( "BLUE" );
  2336.     pCarDetails^.cdateSale.day   := 24;
  2337.     pCarDetails^.cdateSale.month := 12;
  2338.     pCarDetails^.cdateSale.year  := 91;
  2339.     pCarDetails^.ulPrice         := 14000;
  2340.     (* point to buffer location after our details data *)
  2341.     ppDetailsData^ := ppDetailsData^ + SIZE( pCarDetails^ );
  2342.   ELSE (* query size of data *)
  2343.     (* caller is querying size of buffer *)
  2344.     cp := cp + SIZE( pCarDetails^ );
  2345.   END;
  2346.   RETURN TRUE;
  2347. END wpQueryDetailsData;
  2348.  
  2349.  
  2350.  
  2351.  
  2352. (*
  2353.  *
  2354.  *   METHOD: wpOpen                                         ( ) PRIVATE
  2355.  *                                                          (X) PUBLIC
  2356.  *   DESCRIPTION:
  2357.  *
  2358.  *     Opens the car window.
  2359.  *
  2360.  *)
  2361.  
  2362. PROCEDURE( Self : PCar ) wpOpen
  2363. (
  2364.   hwndCnr       : OS2DEF.HWND;
  2365.   ulView        : LONGCARD;
  2366.   param         : LONGCARD
  2367. )               : OS2DEF.HWND;
  2368. VAR
  2369. (*somThis       : PCarData;*)
  2370. BEGIN
  2371. (*somThis := CarGetData( Self );*)
  2372.   IF CarDebug THEN
  2373.     somDebug( "Car", "wpOpen", currentFile(), currentLine() );
  2374.   END;
  2375.   CASE ulView OF
  2376.   | OPEN_CAR:
  2377.     IF NOT Self^.wpSwitchTo( ulView ) THEN
  2378.       (*
  2379.        *   Create a basic Frame and Client window for this instance.
  2380.        *)
  2381.       RETURN CarInit( Self );
  2382.     END;
  2383.     RETURN OS2DEF.NULLHANDLE; (* not specified in C-version of 'Car' ... *)
  2384.   ELSE
  2385.     RETURN Self^.wpOpen^( hwndCnr, ulView, param ); (* parent call *)
  2386.   END;
  2387. END wpOpen;
  2388.  
  2389.  
  2390.  
  2391. (*
  2392.  *
  2393.  *  METHOD: wpSetup                                        ( ) PRIVATE
  2394.  *                                                         (X) PUBLIC
  2395.  *  DESCRIPTION:
  2396.  *
  2397.  *    Specify Setup strings and do some initialization.  This method is
  2398.  *    invoked once an object is completely created.
  2399.  *
  2400.  *  Note:  We're overriding this method to write some default data to the
  2401.  *         object's real filename.  This will give us something to look at
  2402.  *         if the user drag/drops us on an editor or selects the open/editor
  2403.  *         view.
  2404.  *)
  2405.  
  2406. PROCEDURE( Self : PCar ) wpSetup
  2407. (
  2408.   szSetupString : ARRAY OF CHAR
  2409. )               : BOOLEAN;
  2410. TYPE
  2411.   FILESTRING       = ARRAY [0..OS2DEF.CCHMAXPATH-1] OF CHAR;
  2412. VAR
  2413. (*somThis          : PCarData;*)
  2414.   cbBytesWritten   : LONGCARD;      (* pointer to receiving byte count *)
  2415.   rc               : OS2DEF.APIRET;
  2416.   fSuccess         : BOOLEAN;
  2417.   hf               : OS2DEF.HFILE;  (* variable for file handle *)
  2418.   ulAction         : LONGCARD;      (* variable for action taken *)
  2419.   szObjectFilename : FILESTRING;    (* buffer for wpQueryRealName() *)
  2420.   cb               : LONGCARD;
  2421.   ach              : ARRAY [0..9] OF CHAR;
  2422. BEGIN
  2423. (*somThis := CarGetData( Self );*)
  2424.   IF CarDebug THEN
  2425.     somDebug( "Car", "wpSetup", currentFile(), currentLine() );
  2426.   END;
  2427.  
  2428.   cb := SIZE( szObjectFilename );
  2429.  
  2430.   (*
  2431.    *   Write an initial bill-of-sale to the object data file
  2432.    *)
  2433.  
  2434.   fSuccess := Self^.wpQueryRealName (* query full-pathname of object's file *)
  2435.   (
  2436.     szObjectFilename,               (* return buffer *)
  2437.     cb,                             (* size of buffer *)
  2438.     TRUE                            (* request fully qualified pathname *)
  2439.   );
  2440.  
  2441.   IF fSuccess THEN
  2442.     rc := DOSFILEMGR.DosOpen
  2443.     (
  2444.       szObjectFilename,
  2445.       hf,
  2446.       ulAction,
  2447.       0,                                  (* file size if created or truncated *)
  2448.       DOSFILEMGR.FILE_NORMAL,             (* file attribute *)
  2449.       DOSFILEMGR.FILE_OPEN OR             (* action taken upon exist/not exist *)
  2450.       DOSFILEMGR.FILE_CREATE,
  2451.       DOSFILEMGR.OPEN_ACCESS_READWRITE OR (* open mode of file *)
  2452.       DOSFILEMGR.OPEN_SHARE_DENYNONE,
  2453.       NIL                                 (* no extended attributes *)
  2454.     );
  2455.     IF rc <> 0 THEN
  2456.       Conversions.LongCardToStr( rc, ach );
  2457.       DebugBox( "Car.wpSetup: DosOpen failed rc =", ach );
  2458.     ELSE
  2459.       DOSFILEMGR.DosWrite
  2460.       ( hf, szDefaultText, SIZE( szDefaultText ), cbBytesWritten );
  2461.       DOSFILEMGR.DosClose
  2462.       ( hf );
  2463.     END;
  2464.   END;
  2465.  
  2466.   RETURN Self^.wpSetup^( szSetupString );  (* parent call *)
  2467. END wpSetup;
  2468.  
  2469.  
  2470.  
  2471. (*
  2472.  *
  2473.  *  METHOD: TrapTest                                       ( ) PRIVATE
  2474.  *                                                         (X) PUBLIC
  2475.  *  DESCRIPTION:
  2476.  *
  2477.  *    Specify Setup strings and do some initialization.  This method is
  2478.  *    invoked once an object is completely created.
  2479.  *
  2480.  *  Note:  Not yet implemented in Modula-2
  2481.  *)
  2482.  
  2483. PROCEDURE( Self : PCar ) TrapTest( );
  2484. VAR
  2485. (*somThis       : PCarData;*)
  2486. BEGIN
  2487. (*somThis := CarGetData( Self );*)
  2488.   IF CarDebug THEN
  2489.     somDebug( "Car", "TrapTest", currentFile(), currentLine() );
  2490.   END;
  2491.   DebugBox( "Car.TrapTest", "This method is not yet implemented" );
  2492. END TrapTest;
  2493.  
  2494.  
  2495.  
  2496. (*************************************************************************
  2497.  
  2498.                         CLASS METHODS SECTION
  2499.  
  2500.               Do not put any code in this section unless
  2501.                      it is an object CLASS method
  2502.  
  2503. **************************************************************************)
  2504.  
  2505.  
  2506.  
  2507. (*
  2508.  *
  2509.  *  METHOD: clsQueryModuleHandle                           ( ) PRIVATE
  2510.  *                                                         (X) PUBLIC
  2511.  *  DESCRIPTION:
  2512.  *
  2513.  *    This method returns the module handle of this class.  If this is the
  2514.  *    first invocation, DosQueryModuleHandle is called to save the handle
  2515.  *    for future invocations.
  2516.  *
  2517.  *  RETURN:
  2518.  *
  2519.  *    0              Unsuccessful
  2520.  *    non-zero       module handle
  2521.  *
  2522.  *)
  2523.  
  2524. PROCEDURE( Self : PM_Car ) clsQueryModuleHandle( ) : OS2DEF.HMODULE;
  2525. VAR
  2526. (*somThis       : M_CarData;*)
  2527.   rc            : OS2DEF.APIRET;
  2528.   szPathName    : SOM.zString;
  2529. BEGIN
  2530. (*somThis := M_CarGetData( Self );*)
  2531.   IF M_CarDebug THEN
  2532.     somDebug( "M_Car", "clsQueryModuleHandle", currentFile(), currentLine() );
  2533.   END;
  2534.  
  2535.   (*
  2536.    *   Make sure we already have module handle
  2537.    *)
  2538.  
  2539.   IF hmod = OS2DEF.NULLHANDLE THEN
  2540.     (*
  2541.      *   Retrieve registered pathname of our module (DLL) and query the
  2542.      *   module handle.
  2543.      *)
  2544.     szPathName := SOM.SOMClassMgrObject^.somLocateClassFile
  2545.     (
  2546.       SOM.somIdFromString( "CAR" ),
  2547.       Car_MajorVersion,
  2548.       Car_MinorVersion
  2549.     );
  2550.     rc := DOSMODULEMGR.DosQueryModuleHandle( szPathName^, hmod );
  2551.     IF rc <> 0 THEN
  2552.       DebugBox( "M_Car.clsQueryModuleHandle", "Failed to query module handle" );
  2553.       RETURN 0;
  2554.     END;
  2555.   END;
  2556.  
  2557.   RETURN hmod;
  2558.  
  2559. END clsQueryModuleHandle;
  2560.  
  2561.  
  2562.  
  2563.  
  2564. (*
  2565.  *
  2566.  *  METHOD: wpclsQueryStyle                                ( ) PRIVATE
  2567.  *                                                         (X) PUBLIC
  2568.  *  DESCRIPTION:
  2569.  *
  2570.  *     The wpclsQueryStyle method is called to allow the class object
  2571.  *     to specify the default object class style for its instances.
  2572.  *
  2573.  *  REMARKS:
  2574.  *
  2575.  *     This method can be called at any time in order to determine the
  2576.  *     default style for instances of this class.
  2577.  *
  2578.  *     This method should be overridden in order to modify the default
  2579.  *     object style for instances of this class.
  2580.  *
  2581.  *)
  2582.  
  2583. PROCEDURE( Self : PM_Car ) wpclsQueryStyle( ) : LONGCARD;
  2584. VAR
  2585. (*somThis       : M_CarData;*)
  2586. BEGIN
  2587. (*somThis := M_CarGetData( Self );*)
  2588.   IF M_CarDebug THEN
  2589.     somDebug( "M_Car", "wpclsQueryStyle", currentFile(), currentLine() );
  2590.   END;
  2591.   (*
  2592.    *   Modify style bits as described in programming reference.  This
  2593.    *   particular style (link) is also disabled in wpFilterPopupMenu()
  2594.    *)
  2595.   RETURN Self^.wpclsQueryStyle^() OR WPOBJECT.CLSSTYLE_NEVERLINK;
  2596. END wpclsQueryStyle;
  2597.  
  2598.  
  2599.  
  2600.  
  2601. (*
  2602.  *
  2603.  *  METHOD: wpclsInitData                                  ( ) PRIVATE
  2604.  *                                                         (X) PUBLIC
  2605.  *  DESCRIPTION:
  2606.  *
  2607.  *    Initalize the class data
  2608.  *
  2609.  *)
  2610.  
  2611. PROCEDURE( Self : PM_Car ) wpclsInitData( );
  2612. VAR
  2613. (*somThis       : M_CarData;*)
  2614.   i             : LONGCARD;
  2615.   pCFI          : WPOBJECT.PCLASSFIELDINFO;
  2616.   pClassTitle   : OS2DEF.PSZ;
  2617.   pCarDetails   : PCARDETAILS;
  2618. BEGIN
  2619. (*somThis := M_CarGetData( Self );*)
  2620.   IF M_CarDebug THEN
  2621.     somDebug( "M_Car", "wpclsInitData", currentFile(), currentLine() );
  2622.   END;
  2623.  
  2624.   (*
  2625.    *   Call the parent class method first
  2626.    *)
  2627.   Self^.wpclsInitData^();
  2628.  
  2629.   (*
  2630.    *   Get class title
  2631.    *)
  2632.   IF WIN.WinLoadString
  2633.      (
  2634.        WIN.WinQueryAnchorBlock( WIN.HWND_DESKTOP ),
  2635.        Self^.clsQueryModuleHandle(),
  2636.        ID_TITLE,
  2637.        SIZE( szCarClassTitle ),
  2638.        szCarClassTitle
  2639.      ) = 0
  2640.   THEN (* Load string failed: use the parent's string *)
  2641.     pClassTitle := Self^.wpclsQueryTitle^();
  2642.     Strings.Assign( pClassTitle^, szCarClassTitle );
  2643.   END;
  2644.  
  2645.  
  2646.   (*
  2647.    *   Initialize everything needed for the CLASSFIELDINFO structures
  2648.    *   for the Car object class
  2649.    *)
  2650.   FOR i := 0 TO NUM_CAR_FIELDS-1 DO
  2651.     pCFI := ADR( fieldinfo[i] );
  2652.     SYSTEM.MemSet( pCFI, 0, SIZE( WPOBJECT.CLASSFIELDINFO ) );    (* zero's *)
  2653.     pCFI^.cb := SIZE( WPOBJECT.CLASSFIELDINFO );
  2654.     pCFI^.flData  := WIN.CFA_RIGHT OR
  2655.                      WIN.CFA_SEPARATOR OR
  2656.                      WIN.CFA_FIREADONLY;
  2657.     pCFI^.flTitle := WIN.CFA_CENTER OR
  2658.                      WIN.CFA_SEPARATOR OR
  2659.                      WIN.CFA_HORZSEPARATOR OR
  2660.                      WIN.CFA_STRING OR
  2661.                      WIN.CFA_FITITLEREADONLY;
  2662.     pCFI^.pNextFieldInfo := ADR( fieldinfo[i+1] ); (* next CLASSFIELDINFO *)
  2663.     pCFI^.pTitleData := ADR( aszCarColTitles[i] );
  2664.     pCFI^.flCompare  := WPOBJECT.COMPARE_SUPPORTED OR WPOBJECT.SORTBY_SUPPORTED;
  2665.     pCarDetails := NIL; (* only needed for computing field offsets *)
  2666.     CASE i OF
  2667.     | INDEX_MAKE:
  2668.         pCFI^.flData := pCFI^.flData OR WIN.CFA_STRING;
  2669.         pCFI^.offFieldData := ADR( pCarDetails^.pszMake );   (* field offset *)
  2670.         pCFI^.ulLenFieldData := SIZE( pCarDetails^.pszMake );
  2671.         pCFI^.DefaultComparison := WPOBJECT.CMP_EQUAL;
  2672.     | INDEX_MODEL:
  2673.         pCFI^.flData := pCFI^.flData OR WIN.CFA_STRING;
  2674.         pCFI^.offFieldData := ADR( pCarDetails^.pszModel );  (* field offset *)
  2675.         pCFI^.ulLenFieldData := SIZE( pCarDetails^.pszModel );
  2676.         pCFI^.DefaultComparison := WPOBJECT.CMP_EQUAL;
  2677.     | INDEX_COLOR:
  2678.         pCFI^.flData := pCFI^.flData OR WIN.CFA_STRING;
  2679.         pCFI^.offFieldData := ADR( pCarDetails^.pszColor );  (* field offset *)
  2680.         pCFI^.ulLenFieldData := SIZE( pCarDetails^.pszColor );
  2681.         pCFI^.DefaultComparison := WPOBJECT.CMP_EQUAL;
  2682.     | INDEX_SALE_DATE:
  2683.         pCFI^.flData := pCFI^.flData OR WIN.CFA_DATE;
  2684.         pCFI^.offFieldData := ADR( pCarDetails^.cdateSale ); (* field offset *)
  2685.         pCFI^.ulLenFieldData := SIZE( WIN.CDATE );
  2686.         pCFI^.ulLenCompareValue := SIZE( WIN.CDATE );
  2687.         pCFI^.DefaultComparison := WPOBJECT.CMP_GREATER;
  2688.     | INDEX_PRICE:
  2689.         pCFI^.flData := pCFI^.flData OR WIN.CFA_ULONG;
  2690.         pCFI^.offFieldData := ADR( pCarDetails^.ulPrice );   (* field offset *)
  2691.         pCFI^.ulLenFieldData := SIZE( LONGCARD );
  2692.         pCFI^.ulLenCompareValue := SIZE( LONGCARD );
  2693.         pCFI^.DefaultComparison := WPOBJECT.CMP_GREATER;
  2694.     END;
  2695.   END;
  2696.  
  2697.   (* terminate linked list *)
  2698.   fieldinfo[ NUM_CAR_FIELDS-1 ].pNextFieldInfo := NIL;
  2699.  
  2700. END wpclsInitData;
  2701.  
  2702.  
  2703.  
  2704.  
  2705. (*
  2706.  *
  2707.  *  METHOD: wpclsUnInitData                                ( ) PRIVATE
  2708.  *                                                         (X) PUBLIC
  2709.  *  DESCRIPTION:
  2710.  *
  2711.  *    Free any class data
  2712.  *
  2713.  *)
  2714.  
  2715. PROCEDURE( Self : PM_Car ) wpclsUnInitData( );
  2716. VAR
  2717. (*somThis       : M_CarData;*)
  2718. BEGIN
  2719. (*somThis := M_CarGetData( Self );*)
  2720.   IF M_CarDebug THEN
  2721.     somDebug( "M_Car", "wpclsUnInitData", currentFile(), currentLine() );
  2722.   END;
  2723.   Self^.wpclsUnInitData^(); (* parent call *)
  2724. END wpclsUnInitData;
  2725.  
  2726.  
  2727.  
  2728. (*
  2729.  *
  2730.  *  METHOD: wpclsQueryTitle                                ( ) PRIVATE
  2731.  *                                                         (X) PUBLIC
  2732.  *  DESCRIPTION:
  2733.  *
  2734.  *    Return the string "New car".
  2735.  *
  2736.  *)
  2737.  
  2738. PROCEDURE( Self : PM_Car ) wpclsQueryTitle( ) : OS2DEF.PSZ;
  2739. VAR
  2740. (*somThis       : M_CarData;*)
  2741. BEGIN
  2742. (*somThis := M_CarGetData( Self );*)
  2743.   IF M_CarDebug THEN
  2744.     somDebug( "M_Car", "wpclsQueryTitle", currentFile(), currentLine() );
  2745.   END;
  2746.  
  2747.   (*
  2748.    *   Return the class title for a car
  2749.    *)
  2750.   IF szCarClassTitle[0] <> 0C THEN
  2751.     RETURN ADR( szCarClassTitle );
  2752.   ELSE
  2753.     RETURN Self^.wpclsQueryTitle^();  (* parent call *)
  2754.   END;
  2755. END wpclsQueryTitle;
  2756.  
  2757.  
  2758.  
  2759.  
  2760.  
  2761. (*
  2762.  *
  2763.  *  METHOD: wpclsQueryIconData                             ( ) PRIVATE
  2764.  *                                                         (X) PUBLIC
  2765.  *  DESCRIPTION:
  2766.  *
  2767.  *    Return the class icon
  2768.  *
  2769.  *)
  2770.  
  2771. PROCEDURE( Self : PM_Car ) wpclsQueryIconData
  2772. (
  2773.   pIconInfo     : OS2DEF.PICONINFO
  2774. )               : LONGCARD;
  2775. VAR
  2776. (*somThis       : M_CarData;*)
  2777. BEGIN
  2778. (*somThis := M_CarGetData( Self );*)
  2779.   IF M_CarDebug THEN
  2780.     somDebug( "M_Car", "wpclsQueryIconData", currentFile(), currentLine() );
  2781.   END;
  2782.   IF pIconInfo <> NIL THEN
  2783.     (*
  2784.      *   fill in icon information
  2785.      *)
  2786.     pIconInfo^.fFormat := OS2DEF.ICON_RESOURCE;
  2787.     pIconInfo^.hmod := Self^.clsQueryModuleHandle();
  2788.     pIconInfo^.resid := ID_ICON;
  2789.   END;
  2790.   RETURN SIZE( OS2DEF.ICONINFO );
  2791. END wpclsQueryIconData;
  2792.  
  2793.  
  2794.  
  2795.  
  2796. (*
  2797.  *
  2798.  *  METHOD: wpclsQueryDefaultHelp                          ( ) PRIVATE
  2799.  *                                                         (X) PUBLIC
  2800.  *  DESCRIPTION:
  2801.  *
  2802.  *    Process input from the extra menu option that we added.
  2803.  *
  2804.  *)
  2805.  
  2806. PROCEDURE( Self : PM_Car ) wpclsQueryDefaultHelp
  2807. (
  2808.   VAR HelpPanelId   : LONGCARD;
  2809.   VAR szHelpLibrary : ARRAY OF CHAR
  2810. )                   : BOOLEAN;
  2811. VAR
  2812. (*somThis       : M_CarData;*)
  2813. BEGIN
  2814. (*somThis := M_CarGetData( Self );*)
  2815.   IF M_CarDebug THEN
  2816.     somDebug( "M_Car", "wpclsQueryDefaultHelp", currentFile(), currentLine() );
  2817.   END;
  2818.   IF ADR( HelpPanelId ) <> NIL THEN
  2819.     HelpPanelId := ID_HELP_DEFAULT;
  2820.   END;
  2821.   IF ADR( szHelpLibrary ) <> NIL THEN  (* copy help filename *)
  2822.     SYSTEM.MemCpy( ADR( szHelpLibrary ), ADR( szHelpLib ), SIZE( szHelpLib ) );
  2823.   END;
  2824.   RETURN TRUE;
  2825. END wpclsQueryDefaultHelp;
  2826.  
  2827.  
  2828.  
  2829.  
  2830. (*
  2831.  *
  2832.  *  METHOD: wpclsQueryDefaultView                          ( ) PRIVATE
  2833.  *                                                         (X) PUBLIC
  2834.  *  DESCRIPTION:
  2835.  *
  2836.  *    Returns the default view for a new instance of this object.
  2837.  *
  2838.  *  REMARKS:
  2839.  *
  2840.  *    Tell the system what our default open view is...
  2841.  *
  2842.  *)
  2843.  
  2844. PROCEDURE( Self : PM_Car ) wpclsQueryDefaultView( ) : LONGCARD;
  2845. VAR
  2846. (*somThis       : M_CarData;*)
  2847. BEGIN
  2848. (*somThis := M_CarGetData( Self );*)
  2849.   IF M_CarDebug THEN
  2850.     somDebug( "M_Car", "wpclsQueryDefaultHelp", currentFile(), currentLine() );
  2851.   END;
  2852.   RETURN OPEN_CAR;
  2853. END wpclsQueryDefaultView;
  2854.  
  2855.  
  2856.  
  2857. (*
  2858.  *
  2859.  *  METHOD: wpclsQueryDetailsInfo                          ( ) PRIVATE
  2860.  *                                                         (X) PUBLIC
  2861.  *  DESCRIPTION:
  2862.  *
  2863.  *    Appends the car specific chain of FIELDINFO structures describing the
  2864.  *    details data of this object to ClassFieldInfo (if pClassFieldInfo
  2865.  *    is NON-NIL).  In this case it also sets ClassFieldInfo to the
  2866.  *    head of the linked list.
  2867.  *
  2868.  *    Adds the number of bytes required by the details data for car to Size
  2869.  *    (if pSize is NON-NIL).
  2870.  *
  2871.  *  REMARKS:
  2872.  *
  2873.  *    Add details data for this object.
  2874.  *
  2875.  *)
  2876.  
  2877. PROCEDURE( Self : PM_Car ) wpclsQueryDetailsInfo
  2878. (
  2879.   ppClassFieldInfo : WPOBJECT.PPCLASSFIELDINFO;
  2880.   pSize            : WPOBJECT.PLONGCARD
  2881. )                  : LONGCARD;
  2882. VAR
  2883. (*somThis          : M_CarData;*)
  2884.   cParentColumns   : LONGCARD;
  2885.   pCFI             : WPOBJECT.PCLASSFIELDINFO;
  2886.   i                : LONGCARD;
  2887. BEGIN
  2888. (*somThis := M_CarGetData( Self );*)
  2889.   IF M_CarDebug THEN
  2890.     somDebug( "M_Car", "wpclsQueryDetailsInfo", currentFile(), currentLine() );
  2891.   END;
  2892.  
  2893.   (*
  2894.    *   Always call the parent method first to retrieve number of details
  2895.    *   columns and parent's data already defined in details buffer.
  2896.    *)
  2897.   cParentColumns := Self^.wpclsQueryDetailsInfo^( ppClassFieldInfo, pSize );
  2898.  
  2899.   (*
  2900.    *   If pSize is non-NIL, we must add the size of our deatils column
  2901.    *   data structure.
  2902.    *)
  2903.   IF pSize <> NIL THEN
  2904.     pSize^ := pSize^ + SIZE( CARDETAILS );  (* adjust size *)
  2905.   END;
  2906.  
  2907.   (*
  2908.    *   If the request was for the chained fieldinfo structures
  2909.    *   (ppClassFieldInfo is non-NIL), link them in
  2910.    *
  2911.    *   eventually the chain will look like
  2912.    *
  2913.    *   Grandad - Dad - Me - Kid - Grandkid
  2914.    *
  2915.    *   I will be getting the pointer to the beginning of the chain
  2916.    *
  2917.    *   If the beginning of the chain is 0, I will assign the address
  2918.    *   of my first CLASSFIELDINFO structure to ppClassFieldInfo^.
  2919.    *   Otherwise pp^ points to the first column description in the
  2920.    *   chain.  We need to walk the chain and link our CLASSFIELDINFO
  2921.    *   structures at the end.
  2922.    *)
  2923.  
  2924.   IF ppClassFieldInfo <> NIL THEN
  2925.     (*
  2926.      *   Find the last link in the chain;  Then link our CLASSFIELDINFO
  2927.      *   structures to the chain.
  2928.      *)
  2929.     IF ppClassFieldInfo^ <> NIL THEN
  2930.       pCFI := ppClassFieldInfo^;
  2931.       FOR i:=0 TO cParentColumns-1 DO
  2932.         IF pCFI^.pNextFieldInfo <> NIL THEN
  2933.           pCFI := pCFI^.pNextFieldInfo;
  2934.         END;
  2935.       END;
  2936.       pCFI^.pNextFieldInfo := ADR( fieldinfo );
  2937.     ELSE
  2938.       ppClassFieldInfo^ := ADR( fieldinfo );
  2939.     END;
  2940.   END;
  2941.   RETURN cParentColumns + NUM_CAR_FIELDS;
  2942. END wpclsQueryDetailsInfo;
  2943.  
  2944.  
  2945.  
  2946.  
  2947. (*
  2948.  *
  2949.  *  METHOD: wpclsQueryInstanceFilter                       ( ) PRIVATE
  2950.  *                                                         (X) PUBLIC
  2951.  *  DESCRIPTION:
  2952.  *
  2953.  *     The wpclsQueryInstanceFilter method is called to allow the class
  2954.  *     object to specify the file title filters for instances of its
  2955.  *     class.
  2956.  *
  2957.  *  REMARKS:
  2958.  *
  2959.  *     A pointer to a string containing file title filter(s).  This
  2960.  *     string can contain several file title filters separated by a
  2961.  *     comma.  Example: "*.TXT, *.DOC"
  2962.  *
  2963.  *  Note:  Overriding this method will cause any data file with the extension
  2964.  *         ".CAR" to become a data object of the class "Car."
  2965.  *
  2966.  *)
  2967.  
  2968. PROCEDURE( Self : PM_Car ) wpclsQueryInstanceFilter( ) : OS2DEF.PSZ;
  2969. VAR
  2970. (*somThis       : M_CarData;*)
  2971. BEGIN
  2972. (*somThis := M_CarGetData( Self );*)
  2973.   IF M_CarDebug THEN
  2974.     somDebug( "M_Car", "wpclsQueryInstanceFilter", currentFile(), currentLine() );
  2975.   END;
  2976.   RETURN ADR( szCarInstanceFilter );
  2977. END wpclsQueryInstanceFilter;
  2978.  
  2979.  
  2980.  
  2981. (*
  2982.  *
  2983.  *  METHOD: wpclsQueryDetails                              ( ) PRIVATE
  2984.  *                                                         (X) PUBLIC
  2985.  *  DESCRIPTION:
  2986.  *
  2987.  *     Specify default details to display in details view
  2988.  *
  2989.  *  REMARKS:
  2990.  *
  2991.  *     A pointer details structure is modified and returned.
  2992.  *     Note: this is purely virtual at the moment (parent class doesn't
  2993.  *     do anything).
  2994.  *)
  2995.  
  2996. PROCEDURE( Self : PM_Car ) wpclsQueryDetails( ) : WPOBJECT.PCLASSDETAILS;
  2997. VAR
  2998. (*somThis       : M_CarData;*)
  2999. BEGIN
  3000. (*somThis := M_CarGetData( Self );*)
  3001.   IF M_CarDebug THEN
  3002.     somDebug( "M_Car", "wpclsQueryDetails", currentFile(), currentLine() );
  3003.   END;
  3004.   RETURN Self^.wpclsQueryDetails^();  (* parent call *)
  3005. END wpclsQueryDetails;
  3006.  
  3007.  
  3008.  
  3009.  
  3010.  
  3011. (*************************************************************************
  3012.  
  3013.                         ORDINARY CODE SECTION
  3014.  
  3015.                   Any non-method code should go here.
  3016.  
  3017. **************************************************************************)
  3018.  
  3019.  
  3020.  
  3021.  
  3022. (*
  3023.  *
  3024.  *       ROUTINE:    CarInit ( )
  3025.  *
  3026.  *       DESCRIPTION:    Car Initialization
  3027.  *
  3028.  *       RETURNS:    Handle of car frame window, NIL if error
  3029.  *
  3030.  *)
  3031.  
  3032. PROCEDURE CarInit( somSelf : PCar ) : OS2DEF.HWND;
  3033. VAR
  3034.   hab                   : OS2DEF.HAB;             (* PM anchor block handle *)
  3035.   hwndFrame             : OS2DEF.HWND;            (* Frame window handle *)
  3036.   hwndClient            : OS2DEF.HWND;
  3037.   pWindowData           : PWINDOWDATA;
  3038.   fSuccess              : BOOLEAN;
  3039.   flFrameCtlData        : WIN.FRAMECDATA;         (* Frame Ctl Data *)
  3040.   pszTitle              : OS2DEF.PSZ;             (* Frame window title *)
  3041.   pPresData             : OS2DEF.PVOID;           (* Frame window presentation *)
  3042.   swp                   : WIN.SWP;
  3043. BEGIN
  3044.   hwndFrame := OS2DEF.NULLHANDLE;
  3045.   hwndClient := OS2DEF.NULLHANDLE;
  3046.  
  3047.   hab := WIN.WinQueryAnchorBlock( WIN.HWND_DESKTOP );
  3048.   IF NOT WIN.WinRegisterClass
  3049.          (
  3050.            hab,
  3051.            szCarWindowClass,
  3052.            CarWndProc,
  3053.            WIN.CS_SIZEREDRAW OR WIN.CS_SYNCPAINT,
  3054.            SIZE( pWindowData )
  3055.           )
  3056.   THEN
  3057.     DebugBox( "CarInit", "Failure in WinRegisterClass" );
  3058.     RETURN OS2DEF.NULLHANDLE;
  3059.   END;
  3060.  
  3061.   (*
  3062.    *   Allocate some instance specific data in Window words of Frame window.
  3063.    *   This will ensure our window procedure can use this object's methods
  3064.    *   (our window proc isn't passed a somSelf pointer).
  3065.    *)
  3066.   pWindowData := somSelf^.wpAllocMem( SIZE( pWindowData^ ), NIL );
  3067.   IF pWindowData = NIL THEN
  3068.     DebugBox( "CarInit", "wpAllocMem failed to allocate pWindowData" );
  3069.     RETURN OS2DEF.NULLHANDLE;
  3070.   END;
  3071.  
  3072.   SYSTEM.MemSet( pWindowData, 0, SIZE( pWindowData^ ) );
  3073.   pWindowData^.cb := SIZE( pWindowData^ ); (* first field := size *)
  3074.   pWindowData^.somSelf := somSelf;
  3075.  
  3076.   (*
  3077.    *  Create a frame window
  3078.    *)
  3079.   flFrameCtlData.cb := SIZE( flFrameCtlData );
  3080.   flFrameCtlData.flCreateFlags :=
  3081.     WIN.FCF_SIZEBORDER OR WIN.FCF_TITLEBAR OR WIN.FCF_SYSMENU OR WIN.FCF_MINMAX;
  3082.   flFrameCtlData.hmodResources := SHORT( hmod );
  3083.   flFrameCtlData.idResources := ID_ICON;
  3084.   pszTitle := somSelf^.wpQueryTitle();
  3085.   pPresData := NIL;
  3086.   hwndFrame := WIN.WinCreateWindow (* create frame window *)
  3087.   (
  3088.     WIN.HWND_DESKTOP,           (* parent-window handle      *)
  3089.     WIN.WC_FRAME,               (* registered class name     *)
  3090.     pszTitle^,                  (* window text               *)
  3091.     0,                          (* window style              *)
  3092.     0, 0, 0, 0,                 (* position of window        *)
  3093.     OS2DEF.NULLHANDLE,          (* owner-window handle       *)
  3094.     WIN.HWND_TOP,               (* handle to sibling window  *)
  3095.     ID_FRAME,                   (* window identifier         *)
  3096.     flFrameCtlData,             (* control data              *)
  3097.     pPresData^                  (* presentation data         *)
  3098.   );
  3099.   IF hwndFrame = OS2DEF.NULLHANDLE THEN
  3100.     DebugBox( "CarInit", "Failure in WinCreateWindow" );
  3101.     RETURN OS2DEF.NULLHANDLE;
  3102.   END;
  3103.  
  3104.   (*
  3105.    *  Create a client area inside parent frame window using
  3106.    *  WinCreateWindow so we can pass presentation parameters
  3107.    *
  3108.    *)
  3109.   pszTitle := NIL;
  3110.   pPresData := NIL;
  3111.   hwndClient := WIN.WinCreateWindow
  3112.   (
  3113.     hwndFrame,                 (* parent-window handle       *)
  3114.     szCarWindowClass,          (* registered class name      *)
  3115.     pszTitle^,                 (* window text                *)
  3116.     0,                         (* window style               *)
  3117.     0, 0, 0, 0,                (* position of window         *)
  3118.     hwndFrame,                 (* owner-window handle        *)
  3119.     WIN.HWND_TOP,              (* handle to sibling window   *)
  3120.     WIN.FID_CLIENT,            (* window identifier          *)
  3121.     pWindowData^,              (* buffer                     *)
  3122.     pPresData^                 (* presentation data          *)
  3123.   );
  3124.   IF hwndClient = OS2DEF.NULLHANDLE THEN
  3125.     WIN.WinDestroyWindow( hwndFrame );
  3126.     RETURN OS2DEF.NULLHANDLE;
  3127.   END;
  3128.  
  3129.   WIN.WinSendMsg
  3130.   ( hwndFrame, WIN.WM_SETICON, WIN.MPFROMP( somSelf^.wpQueryIcon() ), NIL );
  3131.   pszTitle := somSelf^.wpQueryTitle();
  3132.   WIN.WinSetWindowText
  3133.   ( WIN.WinWindowFromID( hwndFrame, WIN.FID_TITLEBAR ), pszTitle^ );
  3134.  
  3135.   (*
  3136.    * Restore the Window Position
  3137.    *)
  3138.   pszTitle := somSelf^.wpQueryTitle();
  3139.   fSuccess := WINWORKPLACE.WinRestoreWindowPos
  3140.   (
  3141.     szCarClassTitle,       (* class title *)
  3142.     pszTitle^,             (* object title *)
  3143.     hwndFrame
  3144.   );
  3145.   IF NOT fSuccess THEN
  3146.     (* Get the dimensions and the shell's suggested
  3147.      * location for the window
  3148.      *)
  3149.     WIN.WinQueryTaskSizePos( hab, 0, swp );
  3150.     (* Set the frame window position
  3151.      *)
  3152.     swp.fl := WIN.SWP_SIZE OR WIN.SWP_MOVE OR WIN.SWP_RESTORE OR WIN.SWP_ZORDER;
  3153.     WIN.WinSetWindowPos
  3154.     ( hwndFrame, WIN.HWND_TOP, swp.x, swp.y, swp.cx, swp.cy, swp.fl );
  3155.   END;
  3156.  
  3157.   WIN.WinShowWindow( hwndFrame, TRUE );
  3158.   WIN.WinStartTimer( hab, hwndClient, CAR_TIMER, 100 );
  3159.  
  3160.   RETURN hwndFrame;      (* success *)
  3161.  
  3162. END CarInit;
  3163.  
  3164.  
  3165.  
  3166.  
  3167. (*
  3168.  *
  3169.  *   CarWndProc()
  3170.  *
  3171.  *   DESCRIPTION: Car Window Procedure
  3172.  *
  3173.  *)
  3174.  
  3175. PROCEDURE CarWndProc
  3176. (
  3177.   hwnd          : OS2DEF.HWND;
  3178.   msg           : LONGCARD;
  3179.   mp1           : WIN.MPARAM;
  3180.   mp2           : WIN.MPARAM
  3181. )               : WIN.MRESULT;
  3182. VAR
  3183.   pWindowData   : PWINDOWDATA;
  3184.   hwndFrame     : OS2DEF.HWND;
  3185.   fSuccess      : BOOLEAN;
  3186.   pszTitle      : OS2DEF.PSZ;
  3187.   rectl         : OS2DEF.RECTL;
  3188.   hps           : OS2DEF.HPS;
  3189.   hab           : OS2DEF.HAB;
  3190. BEGIN
  3191.    hwndFrame := WIN.WinQueryWindow( hwnd, WIN.QW_PARENT );
  3192.  
  3193.    CASE msg OF
  3194.  
  3195.    | WIN.WM_CREATE:
  3196.  
  3197.      pWindowData := PWINDOWDATA( mp1 );
  3198.  
  3199.      IF pWindowData = NIL THEN
  3200.        DebugBox( "CarWndProc:WM_CREATE", "couldn't get window words" );
  3201.        RETURN WIN.MRESULT( FALSE );
  3202.      END;
  3203.      (*
  3204.       *   Fill in the class view/usage details and window specific data
  3205.       *   for this instance.
  3206.       *)
  3207.      pWindowData^.UseItem.type    := WPOBJECT.USAGE_OPENVIEW;
  3208.      pWindowData^.ViewItem.view   := OPEN_CAR;
  3209.      pWindowData^.ViewItem.handle := hwndFrame;
  3210.      pWindowData^.x               := 10;
  3211.      pWindowData^.y               := 10;
  3212.      pWindowData^.xDir            := CAR_RIGHT;
  3213.      pWindowData^.yDir            := CAR_UP;
  3214.  
  3215.      (*
  3216.       *   Set window pointer with object pointer and instance view info.
  3217.       *   Then add view to the in-use list so wpSwitchTo works.
  3218.       *)
  3219.      WIN.WinSetWindowPtr( hwnd, WIN.QWL_USER, pWindowData );
  3220.      pWindowData^.somSelf^.wpAddToObjUseList( pWindowData^.UseItem );
  3221.      pszTitle := pWindowData^.somSelf^.wpQueryTitle();
  3222.      pWindowData^.somSelf^.wpRegisterView( hwndFrame, pszTitle^ );
  3223.      WIN.WinSetFocus( WIN.HWND_DESKTOP, hwndFrame );
  3224.  
  3225.    | WIN.WM_COMMAND:
  3226.  
  3227.      (* nothing *)
  3228.  
  3229.    | WIN.WM_TIMER:
  3230.  
  3231.      pWindowData := PWINDOWDATA( WIN.WinQueryWindowPtr( hwnd, WIN.QWL_USER ) );
  3232.  
  3233.      IF pWindowData = NIL THEN
  3234.        DebugBox( "CarWndProc:WM_TIMER", "couldn't get window words" );
  3235.        RETURN WIN.MRESULT( FALSE );
  3236.      ELSE
  3237.        (*
  3238.         *   If the car's brakes are off, we move the car by modifying it's
  3239.         *   x,y position.  Direction (xDir, yDir) changes when the car's
  3240.         *   position reaches a border of the window.  The distance it
  3241.         *   moves is based on the speed contained in an instance variable.
  3242.         *)
  3243.  
  3244.        IF NOT pWindowData^.somSelf^.QueryBrakes() THEN
  3245.          WIN.WinQueryWindowRect( hwnd,rectl );
  3246.  
  3247.          IF pWindowData^.x <= 0 THEN              (* at left border? *)
  3248.            pWindowData^.xDir := CAR_RIGHT;        (* mult. by  1 *)
  3249.          ELSIF pWindowData^.x >= (rectl.xRight - ICON_WIDTH)  THEN
  3250.            pWindowData^.xDir := CAR_LEFT;         (* mult. by -1 *)
  3251.          END;
  3252.  
  3253.          IF pWindowData^.y <= 0 THEN              (* at bottom border? *)
  3254.            pWindowData^.yDir := CAR_UP;           (* mult. by  1 *)
  3255.          ELSIF pWindowData^.y >= (rectl.yTop - ICON_HEIGHT) THEN
  3256.            pWindowData^.yDir := CAR_DOWN;         (* mult. by -1 *)
  3257.          END;
  3258.  
  3259.          pWindowData^.x := pWindowData^.x +
  3260.            pWindowData^.xDir * VAL( LONGINT, pWindowData^.somSelf^.QuerySpeed() );
  3261.  
  3262.          pWindowData^.y := pWindowData^.y +
  3263.            pWindowData^.yDir * VAL( LONGINT, pWindowData^.somSelf^.QuerySpeed() );
  3264.  
  3265.          WIN.WinInvalidateRect( hwnd, ADR(rectl), TRUE );  (* invalidate car region *)
  3266.        END;
  3267.      END;
  3268.  
  3269.    | WIN.WM_PAINT:
  3270.  
  3271.      pWindowData := PWINDOWDATA( WIN.WinQueryWindowPtr( hwnd, WIN.QWL_USER ) );
  3272.  
  3273.      IF pWindowData = NIL THEN
  3274.        DebugBox( "CarWndProc:WM_PAINT", "couldn't get window words" );
  3275.        RETURN WIN.MRESULT( FALSE );
  3276.      ELSE
  3277.        hps := WIN.WinBeginPaint( hwnd, OS2DEF.HPS( OS2DEF.NULLHANDLE ), ADR(rectl) );
  3278.        WIN.WinFillRect( hps, rectl, WIN.SYSCLR_WINDOW );
  3279.        WIN.WinDrawPointer
  3280.        ( hps,
  3281.          pWindowData^.x,
  3282.          pWindowData^.y,
  3283.          pWindowData^.somSelf^.wpQueryIcon(),
  3284.          WIN.DP_NORMAL
  3285.        );
  3286.        WIN.WinEndPaint( hps );
  3287.      END;
  3288.  
  3289.    | WIN.WM_CLOSE:
  3290.  
  3291.      hab := WIN.WinQueryAnchorBlock( WIN.HWND_DESKTOP );
  3292.      WIN.WinStopTimer( hab, hwnd, CAR_TIMER );
  3293.  
  3294.      pWindowData := PWINDOWDATA( WIN.WinQueryWindowPtr( hwnd, WIN.QWL_USER ) );
  3295.  
  3296.      IF pWindowData = NIL THEN
  3297.        DebugBox( "CarWndProc:WM_CLOSE", "couldn't get window words" );
  3298.        RETURN WIN.MRESULT( FALSE );
  3299.      END;
  3300.      pszTitle := pWindowData^.somSelf^.wpQueryTitle();
  3301.      fSuccess := WINWORKPLACE.WinStoreWindowPos
  3302.      ( szCarClassTitle, pszTitle^, hwndFrame );
  3303.      pWindowData^.somSelf^.wpDeleteFromObjUseList( pWindowData^.UseItem );
  3304.      pWindowData^.somSelf^.wpFreeMem( pWindowData );
  3305.  
  3306.      WIN.WinPostMsg( hwnd, WIN.WM_QUIT, 0, 0 );
  3307.      WIN.WinDestroyWindow ( hwndFrame ) ;
  3308.  
  3309.    ELSE
  3310.      RETURN WIN.WinDefWindowProc( hwnd, msg, mp1, mp2 );
  3311.    END;
  3312.  
  3313.    RETURN WIN.MRESULT( FALSE );
  3314.  
  3315. END CarWndProc;
  3316.  
  3317.  
  3318.  
  3319.  
  3320.  
  3321. (*
  3322.  *
  3323.  *   DashBoardDlgProc()
  3324.  *
  3325.  *   DESCRIPTION: Dialog Procedure for Dashboaard settings page
  3326.  *
  3327.  *)
  3328.  
  3329. PROCEDURE DashBoardDlgProc
  3330. (
  3331.   hwndDlg       : OS2DEF.HWND;
  3332.   msg           : LONGCARD;
  3333.   mp1           : WIN.MPARAM;
  3334.   mp2           : WIN.MPARAM
  3335. )               : WIN.MRESULT;
  3336. VAR
  3337.   pDashDlgData  : PDASHDLGDATA;
  3338.   somThis       : PCarData;
  3339.   acBuffer      : ARRAY [0..9] OF CHAR;
  3340.   usCount       : CARDINAL;
  3341.   SliderData    : WIN.SLDCDATA;
  3342.   wprm          : WIN.WNDPARAMS;
  3343.   somSelf       : PCar;
  3344.   temp          : LONGCARD;
  3345. BEGIN
  3346.  
  3347.   CASE msg OF
  3348.  
  3349.   | WIN.WM_INITDLG:
  3350.  
  3351.     (*
  3352.      *   Store some instance specific data in Window words of this dialog.
  3353.      *   This will ensure our dialog procedure can access this objects
  3354.      *   data (our dialog proc isn't always passed a somSelf^ pointer).
  3355.      *)
  3356.     somSelf := mp2;
  3357.     pDashDlgData :=  somSelf^.wpAllocMem( SIZE( pDashDlgData^ ), NIL );
  3358.     IF pDashDlgData = NIL THEN
  3359.       DebugBox( "DashboardDlgProc:WM_INITDLG", "Couldn't allocate window words" );
  3360.     ELSE
  3361.       SYSTEM.MemSet( pDashDlgData, 0, SIZE( pDashDlgData^ ) );
  3362.       pDashDlgData^.cb := SIZE( pDashDlgData^ );
  3363.       pDashDlgData^.somSelf := mp2; (* pointer to this object *)
  3364.       pDashDlgData^.PrevBrakes := pDashDlgData^.somSelf^.QueryBrakes();
  3365.       pDashDlgData^.PrevSpeed  := pDashDlgData^.somSelf^.QuerySpeed();
  3366.       WIN.WinSetWindowPtr( hwndDlg, WIN.QWL_USER, pDashDlgData );
  3367.       SliderData.cbSize := SIZE( WIN.SLDCDATA );
  3368.       SliderData.usScale1Increments := 10;
  3369.       SliderData.usScale1Spacing := 20;
  3370.       SliderData.usScale2Increments := 10;
  3371.       SliderData.usScale2Spacing := 20;
  3372.       wprm.fsStatus := WIN.WPM_CTLDATA;
  3373.       wprm.cchText := 0;
  3374.       wprm.cbPresParams := 0;
  3375.       wprm.cbCtlData := 0;
  3376.       wprm.pCtlData := ADR( SliderData );
  3377.       WIN.WinSendDlgItemMsg
  3378.       ( hwndDlg,
  3379.         ID_SPEEDSLIDER,
  3380.         WIN.WM_SETWINDOWPARAMS,
  3381.         WIN.MPARAM( ADR( wprm ) ),
  3382.         WIN.MPARAM( 0 )
  3383.       );
  3384.       FOR usCount := 0 TO 9 DO
  3385.         WIN.WinSendDlgItemMsg
  3386.         ( hwndDlg,
  3387.           ID_SPEEDSLIDER,
  3388.           WIN.SLM_SETTICKSIZE,
  3389.           WIN.MPFROM2SHORT( usCount, 5 ),
  3390.           WIN.MPARAM( 0 )
  3391.         );
  3392.         Conversions.CardToStr( usCount*10, acBuffer );
  3393.         WIN.WinSendDlgItemMsg
  3394.         ( hwndDlg,
  3395.           ID_SPEEDSLIDER,
  3396.           WIN.SLM_SETSCALETEXT,
  3397.           WIN.MPFROMSHORT( usCount ),
  3398.           WIN.MPFROMP( ADR( acBuffer ) )
  3399.         );
  3400.       END;
  3401.       WIN.WinSendDlgItemMsg
  3402.       ( hwndDlg,
  3403.         ID_SPEEDSLIDER,
  3404.         WIN.SLM_SETSLIDERINFO,
  3405.         WIN.MPFROM2SHORT( WIN.SMA_SLIDERARMDIMENSIONS, 0 ),
  3406.         WIN.MPFROM2SHORT( 20, 40 )
  3407.       );
  3408.       WIN.WinSendDlgItemMsg
  3409.       ( hwndDlg,
  3410.         ID_SPEEDSLIDER,
  3411.         WIN.SLM_SETSLIDERINFO,
  3412.         WIN.MPFROM2SHORT( WIN.SMA_SLIDERARMPOSITION, WIN.SMA_INCREMENTVALUE ),
  3413.         WIN.MPFROMSHORT( SHORT( pDashDlgData^.somSelf^.QuerySpeed() ) DIV 10 )
  3414.       );
  3415.       Conversions.LongIntToStr( pDashDlgData^.somSelf^.QuerySpeed(), acBuffer );
  3416.       WIN.WinSetDlgItemText( hwndDlg, ID_SPEEDDATA, acBuffer );
  3417.       IF NOT pDashDlgData^.somSelf^.QueryBrakes() THEN
  3418.         WIN.WinSendDlgItemMsg
  3419.         ( hwndDlg, ID_GO, WIN.BM_SETCHECK, WIN.MPARAM( 1 ), WIN.MPVOID );
  3420.       ELSE
  3421.         WIN.WinSendDlgItemMsg
  3422.         ( hwndDlg, ID_STOP, WIN.BM_SETCHECK, WIN.MPARAM( 1 ), WIN.MPVOID );
  3423.       END;
  3424.       RETURN WIN.MRESULT( TRUE );
  3425.     END;
  3426.  
  3427.   | WIN.WM_CLOSE:
  3428.  
  3429.     pDashDlgData := WIN.WinQueryWindowPtr( hwndDlg, WIN.QWL_USER );
  3430.     IF pDashDlgData = NIL THEN
  3431.       DebugBox( "DashboardDlgProc:WM_DESTROY", "couldn't get window words" );
  3432.     ELSE
  3433.       pDashDlgData^.somSelf^.wpFreeMem( pDashDlgData );
  3434.       RETURN WIN.WinDefDlgProc( hwndDlg, msg, mp1, mp2 );
  3435.     END;
  3436.  
  3437.   | WIN.WM_COMMAND:
  3438.  
  3439.     pDashDlgData := WIN.WinQueryWindowPtr( hwndDlg, WIN.QWL_USER );
  3440.     somThis := CarGetData( pDashDlgData^.somSelf );
  3441.     IF pDashDlgData = NIL THEN
  3442.       DebugBox( "DashboardDlgProc:WM_COMMAND", "couldn't get window words" );
  3443.     ELSE
  3444.       CASE WIN.SHORT1FROMMP( mp1 ) OF
  3445.       | ID_UNDO:
  3446.         pDashDlgData^.somSelf^.SetBrakes( pDashDlgData^.PrevBrakes );
  3447.         pDashDlgData^.somSelf^.SetSpeed( pDashDlgData^.PrevSpeed );
  3448.         WIN.WinSendDlgItemMsg
  3449.         ( hwndDlg,
  3450.           ID_SPEEDSLIDER,
  3451.           WIN.SLM_SETSLIDERINFO,
  3452.           WIN.MPFROM2SHORT( WIN.SMA_SLIDERARMPOSITION, WIN.SMA_INCREMENTVALUE ),
  3453.           WIN.MPFROMSHORT( SHORT( pDashDlgData^.somSelf^.QuerySpeed() ) DIV 10 )
  3454.         );
  3455.         Conversions.LongCardToStr( pDashDlgData^.somSelf^.QuerySpeed(), acBuffer );
  3456.         WIN.WinSetDlgItemText( hwndDlg, ID_SPEEDDATA, acBuffer );
  3457.         IF NOT pDashDlgData^.somSelf^.QueryBrakes() THEN
  3458.           WIN.WinSendDlgItemMsg
  3459.           ( hwndDlg, ID_GO, WIN.BM_SETCHECK, WIN.MPARAM( 1 ), WIN.MPVOID );
  3460.         ELSE
  3461.           WIN.WinSendDlgItemMsg
  3462.           ( hwndDlg, ID_STOP, WIN.BM_SETCHECK, WIN.MPARAM( 1 ), WIN.MPVOID );
  3463.         END;
  3464.       | ID_DEFAULT:
  3465.         (*
  3466.          *   preserve previous values
  3467.          *)
  3468.         pDashDlgData^.PrevBrakes := pDashDlgData^.somSelf^.QueryBrakes();
  3469.         pDashDlgData^.PrevSpeed  := pDashDlgData^.somSelf^.QuerySpeed();
  3470.         pDashDlgData^.somSelf^.SetBrakes( DEFAULT_BRAKEFLAG );
  3471.         pDashDlgData^.somSelf^.SetSpeed( DEFAULT_SPEED );
  3472.         WIN.WinSendDlgItemMsg
  3473.         ( hwndDlg,
  3474.           ID_SPEEDSLIDER,
  3475.           WIN.SLM_SETSLIDERINFO,
  3476.           WIN.MPFROM2SHORT( WIN.SMA_SLIDERARMPOSITION, WIN.SMA_INCREMENTVALUE ),
  3477.           WIN.MPFROMSHORT( SHORT( pDashDlgData^.somSelf^.QuerySpeed() ) DIV  10 )
  3478.         );
  3479.         Conversions.LongCardToStr( pDashDlgData^.somSelf^.QuerySpeed(), acBuffer );
  3480.         WIN.WinSetDlgItemText
  3481.         ( hwndDlg, ID_SPEEDDATA, acBuffer );
  3482.         WIN.WinSendDlgItemMsg
  3483.         ( hwndDlg, ID_GO, WIN.BM_SETCHECK, WIN.MPARAM( 1 ), WIN.MPVOID );
  3484.       | ID_HELP:
  3485.         (* nothing *)
  3486.       END;
  3487.       RETURN WIN.MRESULT( TRUE );
  3488.     END;
  3489.  
  3490.   | WIN.WM_CONTROL:
  3491.  
  3492.     pDashDlgData := WIN.WinQueryWindowPtr( hwndDlg, WIN.QWL_USER );
  3493.     somThis := CarGetData( pDashDlgData^.somSelf );
  3494.     IF pDashDlgData = NIL THEN
  3495.       DebugBox( "DashboardDlgProc:WM_CONTROL", "couldn't get window words" );
  3496.     ELSE
  3497.       CASE WIN.SHORT1FROMMP( mp1 ) OF
  3498.       | ID_GO:
  3499.         IF WIN.SHORT2FROMMP( mp1 ) = WIN.BN_CLICKED THEN
  3500.           pDashDlgData^.PrevBrakes := pDashDlgData^.somSelf^.QueryBrakes();
  3501.           pDashDlgData^.somSelf^.SetBrakes( FALSE );
  3502.         END;
  3503.       | ID_STOP:
  3504.         IF WIN.SHORT2FROMMP( mp1 ) = WIN.BN_CLICKED THEN
  3505.           pDashDlgData^.PrevBrakes := pDashDlgData^.somSelf^.QueryBrakes();
  3506.           pDashDlgData^.somSelf^.SetBrakes( TRUE );
  3507.         END;
  3508.       | ID_SPEEDSLIDER:
  3509.         IF WIN.SHORT2FROMMP( mp1 ) = WIN.SLN_CHANGE THEN
  3510.           pDashDlgData^.PrevSpeed  := pDashDlgData^.somSelf^.QuerySpeed();
  3511.           temp := WIN.WinSendDlgItemMsg
  3512.           ( hwndDlg,
  3513.             ID_SPEEDSLIDER,
  3514.             WIN.SLM_QUERYSLIDERINFO,
  3515.             WIN.MPFROM2SHORT( WIN.SMA_SLIDERARMPOSITION, WIN.SMA_INCREMENTVALUE ),
  3516.             WIN.MPARAM( 0 )
  3517.           );
  3518.           temp := temp * 10;
  3519.           Conversions.LongCardToStr( temp, acBuffer );
  3520.           WIN.WinSetDlgItemText( hwndDlg, ID_SPEEDDATA, acBuffer );
  3521.           pDashDlgData^.somSelf^.SetSpeed( temp );
  3522.         END;
  3523.       END;
  3524.       RETURN WIN.MRESULT( TRUE );
  3525.     END;
  3526.  
  3527.   END; (* CASE msg OF *)
  3528.  
  3529.   RETURN WIN.WinDefDlgProc( hwndDlg, msg, mp1, mp2 );
  3530.  
  3531. END DashBoardDlgProc;
  3532.  
  3533.  
  3534.  
  3535.  
  3536.  
  3537.  
  3538. (*
  3539.  *
  3540.  *   HornBeepDlgProc()
  3541.  *
  3542.  *   DESCRIPTION:  Dialog Procedure for Horn Beep settings page
  3543.  *
  3544.  *)
  3545.  
  3546. PROCEDURE HornBeepDlgProc
  3547. (
  3548.   hwndDlg       : OS2DEF.HWND;
  3549.   msg           : LONGCARD;
  3550.   mp1           : WIN.MPARAM;
  3551.   mp2           : WIN.MPARAM
  3552. )               : WIN.MRESULT;
  3553. VAR
  3554.   pHornDlgData  : PHORNDLGDATA;
  3555.   somSelf       : PCar;
  3556.   temp          : LONGCARD;
  3557. BEGIN
  3558.   CASE msg OF
  3559.  
  3560.   | WIN.WM_INITDLG:
  3561.  
  3562.     (*
  3563.      *   Store some instance specific data in Window words of this dialog.
  3564.      *   This will ensure our dialog procedure can access this objects
  3565.      *   data (our dialog proc isn't always passed a somSelf^ pointer).
  3566.      *)
  3567.     somSelf := mp2;
  3568.     pHornDlgData := somSelf^.wpAllocMem( SIZE( pHornDlgData^ ), NIL );
  3569.     IF pHornDlgData = NIL THEN
  3570.        DebugBox( "HornBeepDlgProc", "Couldn't allocate window words" );
  3571.     ELSE
  3572.       SYSTEM.MemSet( pHornDlgData, 0, SIZE( pHornDlgData^ ) );
  3573.       pHornDlgData^.cb := SIZE( pHornDlgData^ );
  3574.       pHornDlgData^.somSelf := mp2;  (* pointer to this object *)
  3575.       pHornDlgData^.PrevDuration := pHornDlgData^.somSelf^.QueryDuration();
  3576.       pHornDlgData^.PrevHighTone := pHornDlgData^.somSelf^.QueryHighTone();
  3577.       pHornDlgData^.PrevLowTone  := pHornDlgData^.somSelf^.QueryLowTone();
  3578.       WIN.WinSetWindowPtr( hwndDlg, WIN.QWL_USER, pHornDlgData );
  3579.       WIN.WinSendDlgItemMsg
  3580.       ( hwndDlg,
  3581.         ID_HITONE,
  3582.         WIN.SPBM_SETLIMITS,
  3583.         WIN.MPFROMLONG( 1000 ),
  3584.         WIN.MPFROMLONG( 0 )
  3585.       );
  3586.       WIN.WinSendDlgItemMsg
  3587.       ( hwndDlg,
  3588.         ID_HITONE,
  3589.         WIN.SPBM_SETCURRENTVALUE,
  3590.         WIN.MPFROMLONG( pHornDlgData^.somSelf^.QueryHighTone() ),
  3591.         WIN.MPFROMLONG( 0 )
  3592.       );
  3593.       WIN.WinSendDlgItemMsg
  3594.       ( hwndDlg,
  3595.         ID_LOTONE,
  3596.         WIN.SPBM_SETLIMITS,
  3597.         WIN.MPFROMLONG( 1000 ),
  3598.         WIN.MPFROMLONG( 0 )
  3599.       );
  3600.       WIN.WinSendDlgItemMsg
  3601.       ( hwndDlg,
  3602.         ID_LOTONE,
  3603.         WIN.SPBM_SETCURRENTVALUE,
  3604.         WIN.MPFROMLONG( pHornDlgData^.somSelf^.QueryLowTone() ),
  3605.         WIN.MPFROMLONG( 0 )
  3606.       );
  3607.       RETURN WIN.MRESULT( TRUE );
  3608.     END;
  3609.  
  3610.   | WIN.WM_CLOSE:
  3611.  
  3612.     pHornDlgData := WIN.WinQueryWindowPtr( hwndDlg, WIN.QWL_USER );
  3613.     IF pHornDlgData = NIL THEN
  3614.       DebugBox( "HornBeepDlgProc", "Couldn't get window words" );
  3615.     ELSE
  3616.       pHornDlgData^.somSelf^.wpFreeMem( pHornDlgData );
  3617.       RETURN WIN.WinDefDlgProc( hwndDlg, msg, mp1, mp2 );
  3618.     END;
  3619.  
  3620.   | WIN.WM_COMMAND:
  3621.  
  3622.     pHornDlgData := WIN.WinQueryWindowPtr( hwndDlg, WIN.QWL_USER );
  3623.     IF pHornDlgData = NIL THEN
  3624.       DebugBox( "HornBeepDlgProc", "Couldn't get window words" );
  3625.     ELSE
  3626.       CASE WIN.SHORT1FROMMP( mp1 ) OF
  3627.       | ID_UNDO:
  3628.         WIN.WinSendDlgItemMsg
  3629.         ( hwndDlg,
  3630.           ID_HITONE,
  3631.           WIN.SPBM_SETCURRENTVALUE,
  3632.           WIN.MPFROMLONG( pHornDlgData^.PrevHighTone ),
  3633.           WIN.MPFROMLONG( 0 )
  3634.         );
  3635.         WIN.WinSendDlgItemMsg
  3636.         ( hwndDlg,
  3637.           ID_LOTONE,
  3638.           WIN.SPBM_SETCURRENTVALUE,
  3639.           WIN.MPFROMLONG( pHornDlgData^.PrevLowTone ),
  3640.           WIN.MPFROMLONG( 0 )
  3641.         );
  3642.       | ID_DEFAULT:
  3643.         (*
  3644.          *   preserve previous values
  3645.          *)
  3646.         pHornDlgData^.PrevHighTone := pHornDlgData^.somSelf^.QueryHighTone();
  3647.         pHornDlgData^.PrevLowTone := pHornDlgData^.somSelf^.QueryLowTone();
  3648.         pHornDlgData^.somSelf^.SetHighTone( DEFAULT_HITONE );
  3649.         pHornDlgData^.somSelf^.SetLowTone( DEFAULT_LOTONE );
  3650.         WIN.WinSendDlgItemMsg
  3651.         ( hwndDlg,
  3652.           ID_HITONE,
  3653.           WIN.SPBM_SETCURRENTVALUE,
  3654.           WIN.MPFROMLONG( DEFAULT_HITONE ),
  3655.           WIN.MPFROMLONG( 0 )
  3656.         );
  3657.         WIN.WinSendDlgItemMsg
  3658.         ( hwndDlg,
  3659.           ID_LOTONE,
  3660.           WIN.SPBM_SETCURRENTVALUE,
  3661.           WIN.MPFROMLONG( DEFAULT_LOTONE ),
  3662.           WIN.MPFROMLONG( 0 )
  3663.         );
  3664.       | ID_HELP:
  3665.         (* nothing *)
  3666.       END;
  3667.       RETURN WIN.MRESULT( TRUE );
  3668.     END;
  3669.  
  3670.   | WIN.WM_CONTROL:
  3671.     pHornDlgData := WIN.WinQueryWindowPtr( hwndDlg, WIN.QWL_USER );
  3672.     IF pHornDlgData = NIL THEN
  3673.       DebugBox( "HornBeepDlgProc", "Couldn't get window words" );
  3674.     ELSE
  3675.       (*
  3676.        * When the value of either of the tones change, set the new values
  3677.        * in the car object after saving the current settings for
  3678.        * "undo" purposes
  3679.        *)
  3680.       CASE WIN.SHORT2FROMMP( mp1 ) OF
  3681.       | WIN.SPBN_ENDSPIN:
  3682.         (*
  3683.          *   preserve previous values
  3684.          *)
  3685.         pHornDlgData^.PrevHighTone := pHornDlgData^.somSelf^.QueryHighTone();
  3686.         pHornDlgData^.PrevLowTone := pHornDlgData^.somSelf^.QueryLowTone();
  3687.         WIN.WinSendDlgItemMsg
  3688.         ( hwndDlg,
  3689.           ID_HITONE,
  3690.           WIN.SPBM_QUERYVALUE,
  3691.           WIN.MPARAM( ADR( temp ) ),
  3692.           WIN.MPFROM2SHORT( 0, WIN.SPBQ_UPDATEIFVALID )
  3693.         );
  3694.         pHornDlgData^.somSelf^.SetHighTone( temp );
  3695.         WIN.WinSendDlgItemMsg
  3696.         ( hwndDlg,
  3697.           ID_LOTONE,
  3698.           WIN.SPBM_QUERYVALUE,
  3699.           WIN.MPARAM( ADR( temp ) ),
  3700.           WIN.MPFROM2SHORT( 0, WIN.SPBQ_UPDATEIFVALID )
  3701.         );
  3702.         pHornDlgData^.somSelf^.SetLowTone( temp );
  3703.       END;
  3704.       RETURN WIN.MRESULT( TRUE );
  3705.     END;
  3706.  
  3707.   END; (* CASE msg OF *)
  3708.  
  3709.   RETURN WIN.WinDefDlgProc( hwndDlg, msg, mp1, mp2 );
  3710.  
  3711. END HornBeepDlgProc;
  3712.  
  3713.  
  3714.  
  3715.  
  3716.  
  3717.  
  3718.  
  3719. (*
  3720.  *
  3721.  *   _Exception()
  3722.  *
  3723.  *   DESCRIPTION:  Exception handler routine for this object.
  3724.  *
  3725.  *   PURPOSE: To notify user when an illegal memory access is made
  3726.  *
  3727.  *   METHOD:  Whenever a memory protection exception occurs, a message
  3728.  *            box is put on the screen to inform the user.
  3729.  *
  3730.  *   RETURNS: Returns HANDLED if memory exception,
  3731.  *            otherwise, returns NOT_HANDLED
  3732.  *
  3733.  *)
  3734.  
  3735.  
  3736. (*
  3737.  
  3738. PROCEDURE _Exception
  3739. (
  3740.   VAR arg           : DOSEXCEPTIONS.EXCEPTIONREPORTRECORD;
  3741.   VAR RegisRecord   : DOSEXCEPTIONS.EXCEPTIONREGISTRATIONRECORD;
  3742.   VAR ContextRecord : DOSEXCEPTIONS.CONTEXTRECORD;
  3743.   pvSpare           : OS2DEF.PVOID
  3744. )                   : LONGCARD;
  3745. VAR
  3746.   rc                : LONGCARD;
  3747. BEGIN
  3748.  
  3749.   CASE arg.ExceptionNum OF
  3750.  
  3751.   | DOSEXCEPTIONS.XCPT_ACCESS_VIOLATION:
  3752.     WIN.WinAlarm( WIN.HWND_DESKTOP, WIN.WA_ERROR );
  3753.     rc := WIN.WinMessageBox
  3754.     (
  3755.       WIN.HWND_DESKTOP,
  3756.       WIN.HWND_DESKTOP,
  3757.       "Memory Access Violation, abort program",
  3758.       "Car Error",
  3759.       0,
  3760.       WIN.MB_YESNO OR WIN.MB_QUERY OR WIN.MB_MOVEABLE
  3761.     );
  3762.     IF rc = WIN.MBID_NO THEN
  3763.       RETURN DOSEXCEPTIONS.XCPT_CONTINUE_EXECUTION;
  3764.     ELSE
  3765.       RETURN DOSEXCEPTIONS.XCPT_CONTINUE_SEARCH;
  3766.     END;
  3767.  
  3768.   | DOSEXCEPTIONS.XCPT_PROCESS_TERMINATE:
  3769.     RETURN DOSEXCEPTIONS.XCPT_CONTINUE_SEARCH;
  3770.  
  3771.   | DOSEXCEPTIONS.XCPT_ASYNC_PROCESS_TERMINATE:
  3772.     RETURN DOSEXCEPTIONS.XCPT_CONTINUE_SEARCH;
  3773.  
  3774.   | DOSEXCEPTIONS.XCPT_SIGNAL:
  3775.     RETURN DOSEXCEPTIONS.XCPT_CONTINUE_SEARCH;
  3776.  
  3777.   ELSE
  3778.     (*
  3779.      *   For more exceptions, see the header files or the programming
  3780.      *   reference(s).
  3781.      *)
  3782.     RETURN DOSEXCEPTIONS.XCPT_CONTINUE_SEARCH;
  3783.   END;
  3784.  
  3785. END _Exception;
  3786.  
  3787. *)
  3788.  
  3789.  
  3790.  
  3791.  
  3792.  
  3793. (*************************************************************************
  3794.    Per-process initialization of module.
  3795. **************************************************************************)
  3796.  
  3797.  
  3798.  
  3799. BEGIN (* of class module *)
  3800.   (* intialize SOM's environment, if not yet active *)
  3801.   IF SOM.SOMClassMgrObject = NIL THEN
  3802.     SOM.SOMClassMgrObject := SOM.somEnvironmentNew();
  3803.   END;
  3804.   (* initialize some record fields for class-supporting structures *)
  3805.   CarCClassData.parentMtab := NIL;
  3806.   CarClassData.classObject := NIL;
  3807.  
  3808.   (* find the identifier tokens for all the new or overridden methods *)
  3809.   somId_QueryBrakes            := SOM.somIdFromString( "QueryBrakes"            );
  3810.   somId_SetBrakes              := SOM.somIdFromString( "SetBrakes"              );
  3811.   somId_QueryDuration          := SOM.somIdFromString( "QueryDuration"          );
  3812.   somId_SetDuration            := SOM.somIdFromString( "SetDuration"            );
  3813.   somId_QueryHighTone          := SOM.somIdFromString( "QueryHighTone"          );
  3814.   somId_SetHighTone            := SOM.somIdFromString( "SetHighTone"            );
  3815.   somId_QueryLowTone           := SOM.somIdFromString( "QueryLowTone"           );
  3816.   somId_SetLowTone             := SOM.somIdFromString( "SetLowTone"             );
  3817.   somId_QuerySpeed             := SOM.somIdFromString( "QuerySpeed"             );
  3818.   somId_SetSpeed               := SOM.somIdFromString( "SetSpeed"               );
  3819.   somId_BeepHorn               := SOM.somIdFromString( "BeepHorn"               );
  3820.   somId_AddDashboardPage       := SOM.somIdFromString( "AddDashboardPage"       );
  3821.   somId_AddHornBeepPage        := SOM.somIdFromString( "AddHornBeepPage"        );
  3822.   somId_TrapTest               := SOM.somIdFromString( "TrapTest"               );
  3823.   somId_wpInitData             := SOM.somIdFromString( "wpInitData"             );
  3824.   somId_wpUnInitData           := SOM.somIdFromString( "wpUnInitData"           );
  3825.   somId_wpSaveState            := SOM.somIdFromString( "wpSaveState"            );
  3826.   somId_wpRestoreState         := SOM.somIdFromString( "wpRestoreState"         );
  3827.   somId_wpAddSettingsPages     := SOM.somIdFromString( "wpAddSettingsPages"     );
  3828.   somId_wpFilterPopupMenu      := SOM.somIdFromString( "wpFilterPopupMenu"      );
  3829.   somId_wpModifyPopupMenu      := SOM.somIdFromString( "wpModifyPopupMenu"      );
  3830.   somId_wpMenuItemSelected     := SOM.somIdFromString( "wpMenuItemSelected"     );
  3831.   somId_wpMenuItemHelpSelected := SOM.somIdFromString( "wpMenuItemHelpSelected" );
  3832.   somId_wpQueryDetailsData     := SOM.somIdFromString( "wpQueryDetailsData"     );
  3833.   somId_wpOpen                 := SOM.somIdFromString( "wpOpen"                 );
  3834.   somId_wpSetup                := SOM.somIdFromString( "wpSetup"                );
  3835.  
  3836.  
  3837.   (* initialize some record fields for metaclass-supporting structures *)
  3838.   M_CarCClassData.parentMtab := NIL;
  3839.   M_CarClassData.classObject := NIL;
  3840.  
  3841.   (* get identifier tokens for all the new or overridden metaclass methods *)
  3842.   somId_clsQueryModuleHandle     := SOM.somIdFromString( "clsQueryModuleHandle"     );
  3843.   somId_wpclsInitData            := SOM.somIdFromString( "wpclsInitData"            );
  3844.   somId_wpclsUnInitData          := SOM.somIdFromString( "wpclsUnInitData"          );
  3845.   somId_wpclsQueryTitle          := SOM.somIdFromString( "wpclsQueryTitle"          );
  3846.   somId_wpclsQueryIconData       := SOM.somIdFromString( "wpclsQueryIconData"       );
  3847.   somId_wpclsQueryDefaultHelp    := SOM.somIdFromString( "wpclsQueryDefaultHelp"    );
  3848.   somId_wpclsQueryDefaultView    := SOM.somIdFromString( "wpclsQueryDefaultView"    );
  3849.   somId_wpclsQueryDetailsInfo    := SOM.somIdFromString( "wpclsQueryDetailsInfo"    );
  3850.   somId_wpclsQueryDetails        := SOM.somIdFromString( "wpclsQueryDetails"        );
  3851.   somId_wpclsQueryInstanceFilter := SOM.somIdFromString( "wpclsQueryInstanceFilter" );
  3852.   somId_wpclsQueryStyle          := SOM.somIdFromString( "wpclsQueryStyle"          );
  3853.  
  3854. END CAR.
  3855.