home *** CD-ROM | disk | FTP | other *** search
/ Mega Top 1 / os2_top1.zip / os2_top1 / APPS / PROG / PASCAL / SPEED2 / SRC / LIB / PMOBJECT.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1994-10-11  |  80.1 KB  |  2,490 lines

  1. UNIT PMObject;
  2.  
  3. {***************************************************************************
  4. *                                                                          *
  5. *                                                                          *
  6. *                Speed-386 PASCAL for OS/2 Version 1.0                     *
  7. *           (C) 1993,94 R. Nürnberger All rights reserved !                *
  8. *                                                                          *
  9. *                                                                          *
  10. * This file    : Basic fuctionality of ObjectPM library V1.0               *
  11. * Last updated : 13.9.1994                                                 *
  12. *                                                                          *
  13. ****************************************************************************}
  14.  
  15. INTERFACE
  16.  
  17. USES PmTypes;
  18.  
  19. {General objects}
  20.  
  21. TYPE
  22.     TYPE TMessage=RECORD
  23.                        Win:HWND;
  24.                        Message:LONGWORD;
  25.                        Para1,Para2:LONGWORD;
  26.                        Handled:BOOLEAN;
  27.                        Result:LONGWORD;
  28.                   END;
  29.  
  30.     TWindow=OBJECT
  31.          Title:STRING;                 {Title of window}
  32.          FontName:STRING;              {Name of default output font}
  33.          FontWidth:BYTE;               {Width of default output font}
  34.          FontHeight:BYTE;              {Height of default output font}
  35.          ForeColor:LONGINT;            {Default output color}
  36.          BackColor:LONGINT;            {Default window background color}
  37.          WindowID:LONGWORD;            {ID of window for external resources}
  38.          ClientHandle:HWND;            {Client (output area) handle of window}
  39.          FrameHandle:HWND;             {Frame handle of window}
  40.          DesktopClientHandle:HWND;     {Desktop (output area) handle}
  41.          DesktopFrameHandle:HWND;      {Desktop frame handle}
  42.          {*****************************************************}
  43.          {Do not change this location because its hard coded}
  44.          FUNCTION HandleEvent(Win:HWND;Msg:LONGWORD;
  45.                               para1,para2:POINTER;
  46.                               VAR Handled:BOOLEAN):LONGWORD;VIRTUAL;
  47.          {**************************************************}
  48.          {Do not change this location because its hard coded}
  49.          FUNCTION MDIHandleEvent(Win:HWND;Msg:LONGWORD;
  50.                                  para1,para2:POINTER;
  51.                                  VAR Handled:BOOLEAN;Data:POINTER):LONGWORD;VIRTUAL;
  52.          {**************************************************}
  53.          {Do not change this location because its hard coded}
  54.          FUNCTION DesktopHandleEvent(Win:HWND;Msg:LONGWORD;
  55.                                      para1,para2:POINTER;
  56.                                      VAR Handled:BOOLEAN):LONGWORD;VIRTUAL;
  57.          {**************************************************}
  58.          CONSTRUCTOR Init;
  59.          DESTRUCTOR Done;
  60.          PROCEDURE DeleteData;VIRTUAL;
  61.          PROCEDURE CreateWindow(Parent:HWND;Style,CreateFlags:LONGWORD;
  62.                                 Class,Title:String;StyleClient:LONGWORD;
  63.                                 Res,id:LONGWORD);VIRTUAL;
  64.          PROCEDURE Redraw(rc:RECTL;_hps:HPS;Win:HWND);VIRTUAL;
  65.          PROCEDURE WMClose(VAR Msg:TMessage);VIRTUAL WM_CLOSE;
  66.          PROCEDURE WMCreate(VAR Msg:TMessage);VIRTUAL WM_CREATE;
  67.          PROCEDURE WMActivate(VAR Msg:TMessage);VIRTUAL WM_ACTIVATE;
  68.          PROCEDURE WMMouseMove(Win:HWND;x,y:INTEGER);VIRTUAL;
  69.          PROCEDURE WMButton1Click(Win:HWND;x,y:INTEGER);VIRTUAL;
  70.          PROCEDURE WMButton1DoubleClick(Win:HWND;x,y:INTEGER);VIRTUAL;
  71.          PROCEDURE WMButton1Up(Win:HWND;x,y:INTEGER);VIRTUAL;
  72.          PROCEDURE WMButton1Down(Win:HWND;x,y:INTEGER);VIRTUAL;
  73.          PROCEDURE WMButton2Click(Win:HWND;x,y:INTEGER);VIRTUAL;
  74.          PROCEDURE WMButton2Up(Win:HWND;x,y:INTEGER);VIRTUAL;
  75.          PROCEDURE WMButton2Down(Win:HWND;x,y:INTEGER);VIRTUAL;
  76.          PROCEDURE WMEraseBackGround(Win:HWND;rc:RECTL;_hps:HPS);VIRTUAL;
  77.          PROCEDURE WMDestroy(VAR Msg:TMessage);VIRTUAL WM_DESTROY;
  78.          PROCEDURE WMSize(VAR Msg:TMessage);VIRTUAL WM_SIZE;
  79.  
  80.          PROCEDURE SetColors(Col,BackCol:LONGINT);VIRTUAL;
  81.          PROCEDURE HandleScanEvent(Win:HWND;scan:WORD);VIRTUAL;
  82.          PROCEDURE HandleCharEvent(Win:HWND;Ch:CHAR);VIRTUAL;
  83.          PROCEDURE HandleCommand(Win:HWND;command:WORD);VIRTUAL;
  84.          PROCEDURE InvalidateAppWindow;VIRTUAL;
  85.          PROCEDURE GetMaxDesktopWindow(VAR _swp:SWP);VIRTUAL;
  86.          PROCEDURE GetPS(VAR ps:HPS);VIRTUAL;
  87.          PROCEDURE ReleasePS(ps:HPS);VIRTUAL;
  88.          PROCEDURE PrintString(ps:HPS;s:STRING;x,y:LONGINT);VIRTUAL;
  89.          PROCEDURE SetWindowTitle(s:STRING);VIRTUAL;
  90.     END;
  91.  
  92.     TApplication=OBJECT(TWindow)
  93.          ToolBarSize:WORD;
  94.          StatusBarSize:WORD;
  95.          LeftToolBarSize:WORD;
  96.          RightToolBarSize:WORD;
  97.          ToolBarInterior:PToolBarInterior;
  98.          StatusBarInterior:PStatusBarInterior;
  99.          MenuHelpItems:PMenuHelpItems;
  100.          HasIcon:BOOLEAN;              {TRUE if window has icon}
  101.          HasMenu:BOOLEAN;              {TRUE if window has menu}
  102.          HasAccel:BOOLEAN;             {TRUE if window has accel table}
  103.          HasHelp:BOOLEAN;              {TRUE if window has help window}
  104.          HelpFileName:String;          {Name of associated help file}
  105.          HelpTitle:STRING;             {Title of associated help file}
  106.          HelpWindow:HWND;              {Window id of help window}
  107.          WinCX,WinCY:LONGWORD;         {Window size on create}
  108.          WinX,WinY:LONGWORD;           {Window position on create}
  109.          FUNCTION HandleEvent(Win:HWND;Msg:LONGWORD;
  110.                               para1,para2:POINTER;
  111.                               VAR Handled:BOOLEAN):LONGWORD:VIRTUAL;
  112.          FUNCTION DesktopHandleEvent(Win:HWND;Msg:LONGWORD;
  113.                                      para1,para2:POINTER;
  114.                                      VAR Handled:BOOLEAN):LONGWORD:VIRTUAL;
  115.          CONSTRUCTOR Init;
  116.          DESTRUCTOR Done;
  117.          PROCEDURE Redraw(rc:RECTL;_hps:HPS;Win:HWND):VIRTUAL;
  118.          PROCEDURE Run(Id:LONGWORD;Title:String;Col,bcol:LONGINT);VIRTUAL;
  119.          PROCEDURE StatusBarSetText(id:WORD;item:STRING;
  120.                                     Col:LONGWORD);VIRTUAL;
  121.          PROCEDURE DesktopRedraw(rc:RECTL;_hps:HPS;Win:HWND);VIRTUAL;
  122.          PROCEDURE GetMaxAppWindow(VAR _swp:SWP);VIRTUAL;
  123.          PROCEDURE InsertHelp(Filename,WindowTitle:String);VIRTUAL;
  124.          PROCEDURE RedrawToolBar(rc:RECTL;_hps:HPS);VIRTUAL;
  125.          PROCEDURE RedrawLeftToolBar(rc:RECTL;_hps:HPS);VIRTUAL;
  126.          PROCEDURE RedrawRightToolBar(rc:RECTL;_hps:HPS);VIRTUAL;
  127.          PROCEDURE RedrawStatusBar(rc:RECTL;_hps:HPS);VIRTUAL;
  128.          PROCEDURE InsertResources(Menu,Accel,Icon:BOOLEAN);VIRTUAL;
  129.          PROCEDURE CreateToolBar(Size:WORD);VIRTUAL;
  130.          PROCEDURE CreateLeftToolBar(Size:WORD);VIRTUAL;
  131.          PROCEDURE CreateRightToolBar(Size:WORD);VIRTUAL;
  132.          PROCEDURE CreateStatusBar(Size:WORD);VIRTUAL;
  133.          PROCEDURE StatusBarInsertItem(id:WORD;x,y,cx,cy:LONGWORD);VIRTUAL;
  134.          PROCEDURE SetMenuState(id:WORD;State:BOOLEAN);VIRTUAL;
  135.          PROCEDURE ToolBarInsertButton(id,res,x,y,cx,cy:LONGWORD);VIRTUAL;
  136.          PROCEDURE ToolBarInsertControl(id,x,y,cx,cy,flag,class:LONGWORD;
  137.                                         title:STRING);VIRTUAL;
  138.          PROCEDURE InsertMenuHelp(StatusID,MenuID:WORD;
  139.                                   HelpText:String;Col:LONGWORD);VIRTUAL;
  140.          PROCEDURE AppCreateNotify(AppFrWin,AppWin:HWND);VIRTUAL;
  141.          PROCEDURE SetupMenu(Frame,Client:HWND);VIRTUAL;
  142.          PROCEDURE AppRunNotify(AppFrWin:HWND);VIRTUAL;
  143.          PROCEDURE HandleCommand(Win:HWND;command:WORD):VIRTUAL;
  144.          PROCEDURE DisplayHelp(PanelID:WORD);VIRTUAL;
  145.          PROCEDURE PopupMenu(VAR Menu:HWND;id:LONGWORD;
  146.                              x,y:LONGWORD;Parent:HWND);VIRTUAL;
  147.          PROCEDURE WMMenuSelect(Win:HWND;para1:POINTER);VIRTUAL;
  148.          PROCEDURE DesktopEraseBackGround(Win:HWND;rc:RECTL;_hps:HPS);VIRTUAL;
  149.          PROCEDURE WMSize(VAR Msg:TMessage):VIRTUAL WM_SIZE;
  150.          PROCEDURE WMClose(VAR Msg:TMessage):VIRTUAL WM_CLOSE;
  151.     END;
  152.  
  153.     TMDIApplication=OBJECT(TApplication)
  154.          ChildCount:BYTE;
  155.          ActiveChild:HWND;
  156.          MinimizedCount:BYTE;
  157.          CONSTRUCTOR Init;
  158.          DESTRUCTOR Done;
  159.          PROCEDURE WMClose(VAR Msg:TMessage):VIRTUAL WM_CLOSE;
  160.          PROCEDURE TileWindows;VIRTUAL;
  161.          PROCEDURE CascadeWindows;VIRTUAL;
  162.          PROCEDURE NextWindow;VIRTUAL;
  163.          PROCEDURE CloseAllWindows;VIRTUAL;
  164.          PROCEDURE HandleCommand(Win:HWND;command:WORD):VIRTUAL;
  165.          PROCEDURE AppRunNotify(AppFrWin:HWND):VIRTUAL;
  166.          PROCEDURE MDINoMoreChilds;VIRTUAL;
  167.          PROCEDURE MDIWMSize(Win:HWND;Data:POINTER);VIRTUAL;
  168.          FUNCTION HandleEvent(Win:HWND;Msg:LONGWORD;
  169.                               para1,para2:POINTER;
  170.                               VAR Handled:BOOLEAN):LONGWORD:VIRTUAL;
  171.          FUNCTION CreateMDIChild(resid:LONGWORD;Title:string;
  172.                                  Extra:POINTER;fcfFlags:LONGWORD;
  173.                                  Col,BCol:LONGINT):HWND;VIRTUAL;
  174.          FUNCTION MDIHandleEvent(Win:HWND;Msg:LONGWORD;
  175.                                  para1,para2:POINTER;
  176.                                  VAR Handled:BOOLEAN;
  177.                                  Data:POINTER):LONGWORD:VIRTUAL;
  178.          PROCEDURE MDIRedraw(rc:RECTL;_hps:HPS;Win:HWND;Data:POINTER);VIRTUAL;
  179.          FUNCTION GetMDIColor(Win:HWND):LONGINT;VIRTUAL;
  180.          FUNCTION GetMDIBackColor(Win:HWND):LONGINT;VIRTUAL;
  181.          PROCEDURE SetMDIColor(Win:HWND;col:LONGINT);VIRTUAL;
  182.          PROCEDURE SetMDIBackColor(Win:HWND;bcol:LONGINT);VIRTUAL;
  183.          PROCEDURE MDICreateNotify(MDIFrWin,MDIWin:HWND;Data:POINTER);VIRTUAL;
  184.          PROCEDURE WMMDIClose(Win:HWND;Data:POINTER);VIRTUAL;
  185.          PROCEDURE MDIHandleCommand(Win:HWND;command:WORD;Data:POINTER);VIRTUAL;
  186.          PROCEDURE MDIHandleScanEvent(Win:HWND;scan:WORD;Data:POINTER);VIRTUAL;
  187.          PROCEDURE MDIHandleCharEvent(Win:HWND;Ch:CHAR;Data:POINTER);VIRTUAL;
  188.          FUNCTION MDIGetDataPointer(Win:HWND):POINTER;VIRTUAL;
  189.          FUNCTION MDIGetTopWindow(VAR Extra:POINTER):HWND;VIRTUAL;
  190.          PROCEDURE MDIBringToTop(Win:HWND);VIRTUAL;
  191.          PROCEDURE MDIWMMouseMove(Win:HWND;x,y:INTEGER;Data:POINTER);VIRTUAL;
  192.          PROCEDURE MDIWMButton1Click(Win:HWND;x,y:INTEGER;Data:POINTER);VIRTUAL;
  193.          PROCEDURE MDIWMButton1DoubleClick(Win:HWND;x,y:INTEGER;Data:POINTER);VIRTUAL;
  194.          PROCEDURE MDIWMButton1Down(Win:HWND;x,y:INTEGER;Data:POINTER);VIRTUAL;
  195.          PROCEDURE MDIWMEraseBackGround(Win:HWND;rc:RECTL;_hps:HPS);VIRTUAL;
  196.          PROCEDURE MDIWMButton1Up(Win:HWND;x,y:INTEGER;Data:POINTER);VIRTUAL;
  197.          PROCEDURE InvalidateMDIWindow(Win:HWND);VIRTUAL;
  198.          PROCEDURE WMSize(VAR Msg:TMessage):VIRTUAL WM_SIZE;
  199.     END;
  200.  
  201. FUNCTION PointerToWord(p:POINTER):WORD;
  202. PROCEDURE MessageBox(msg:String);
  203. PROCEDURE ErrorBox(Options:LONGWORD;err:String);
  204. FUNCTION ConfirmBox(Options:LONGWORD;msg:String):BOOLEAN;
  205. PROCEDURE MaximizeWindow(Win:HWND);
  206. PROCEDURE MinimizeWindow(Win:HWND);
  207. PROCEDURE HideWindow(Win:HWND);
  208. PROCEDURE ShowWindow(Win:HWND);
  209. PROCEDURE DisableWindow(Win:HWND);
  210. PROCEDURE EnableWindow(Win:HWND);
  211. PROCEDURE RestoreWindow(Win:HWND);
  212. FUNCTION IsWindowMaximized(Win:HWND):BOOLEAN;
  213. FUNCTION IsWindowMinimized(Win:HWND):BOOLEAN;
  214. PROCEDURE DrawStringXY(_hps:HPS;VAR pt:POINTL;VAR s:string;start,Len:LONGWORD;
  215.                        Color,BackColor:LONGWORD);
  216. PROCEDURE InvalidateWindow(Win:HWND);
  217. PROCEDURE WindowToTop(FrameWin:HWND);
  218. PROCEDURE SetWindowPos(Win:HWND;x,y,cx,cy:LONGINT);
  219. PROCEDURE GetWindowPos(Win:HWND;VAR x,y,cx,cy:LONGINT);
  220.  
  221.  
  222. VAR
  223.    AppWinHandle,AppWinFrameHandle:HWND;
  224.    ChildIconRes:LONGWORD;
  225.    DragWindow:HWND;
  226.    LastDragPos:POINTER;
  227.    MouseButton1Down:BOOLEAN;
  228.    Drag_Mode:BOOLEAN;
  229.  
  230. IMPLEMENTATION
  231.  
  232. VAR {Private}
  233.    InCtrlK:BOOLEAN;
  234.    TWindowClass:String[40];          {Standard class for TWindow}
  235.    TDesktopWindowClass:STRING[40];   {Desktop window class}
  236.    TMDIWindowClass:STRING[40];       {MDI window}
  237.  
  238. CONST {private}
  239.  
  240.       CLR_FALSE                =-5;
  241.       CLR_TRUE                 =-4;
  242.       CLR_ERROR                =-255;
  243.       CLR_DEFAULT              =-3;
  244.       CLR_WHITE                =-2;
  245.       CLR_BLACK                =-1;
  246.       CLR_BACKGROUND           = 0;
  247.       CLR_BLUE                 = 1;
  248.       CLR_RED                  = 2;
  249.       CLR_PINK                 = 3;
  250.       CLR_GREEN                = 4;
  251.       CLR_CYAN                 = 5;
  252.       CLR_YELLOW               = 6;
  253.       CLR_NEUTRAL              = 7;
  254.       CLR_DARKGRAY             = 8;
  255.       CLR_DARKBLUE             = 9;
  256.       CLR_DARKRED              = 10;
  257.       CLR_DARKPINK             = 11;
  258.       CLR_DARKGREEN            = 12;
  259.       CLR_DARKCYAN             = 13;
  260.       CLR_BROWN                = 14;
  261.       CLR_PALEGRAY             = 15;
  262.  
  263. IMPORTS
  264.  
  265.        FUNCTION WinCreateStdWindow(hwndParent:HWND;flStyle:LONGWORD;
  266.                                    VAR pflCreateFlags:LONGWORD;
  267.                                    pszClientClass:PSZ;
  268.                                    pszTitle:PSZ;
  269.                                    styleClient:LONGWORD;
  270.                                    hmod:HMODULE;
  271.                                    idResources:LONGWORD;
  272.                                    VAR Client:HWND):LONGWORD;
  273.                     APIENTRY;             PMWIN index 908;
  274.        FUNCTION WinRegisterClass(ahab:LONGWORD;pszClassName:PSZ;
  275.                                  pfnWndProc:POINTER;flStyle:LONGWORD;
  276.                                  cbWindowData:LONGWORD):LONGWORD;
  277.                     APIENTRY;             PMWIN index 926;
  278.         FUNCTION WinSetWindowULong(ul:LONGWORD;
  279.                                    _index:LONGWORD;
  280.                                    _hwnd:HWND):LONGWORD:         PMWIN index 878;
  281.         FUNCTION WinSetWindowPos(fl:LONGWORD;
  282.                                  cy,cx,y,x:LONGWORD;
  283.                                  hwndInsertBehind:HWND;
  284.                                  _hwnd:HWND):LONGWORD:           PMWIN index 875;
  285.         FUNCTION WinBeginPaint(VAR prclPaint:RECTL;
  286.                                _hps:HPS;_hwnd:HWND):
  287.                                LONGWORD:                         PMWIN index 703;
  288.         FUNCTION WinEndPaint(_hps:HPS):LONGWORD:                 PMWIN index 738;
  289.         FUNCTION WinQueryWindowRect(VAR prclDest:RECTL;
  290.                                     _hwnd:HWND ):
  291.                                     LONGWORD:                    PMWIN index 840;
  292.         FUNCTION WinFillRect(lColor:LONGWORD;
  293.                              VAR prcl:RECTL;
  294.                              _hps:HPS):LONGWORD:                 PMWIN index 743;
  295.         PROCEDURE WinSubClassWindow(Proc:POINTER;Win:HWND):      PMWIN index 929;
  296.         PROCEDURE WinInvalidateRect(c:LONGWORD;r:POINTER;
  297.                                     Win:HWND):                   PMWIN index 765;
  298.         FUNCTION WinDestroyWindow(_hwnd:HWND):
  299.                                   LONGWORD:                      PMWIN index 728;
  300.         FUNCTION WinQueryWindow(cmd:LONGWORD;
  301.                                 _hwnd:HWND):LONGWORD:            PMWIN index 834;
  302.         FUNCTION WinPostMsg(mp2,mp1:POINTER;
  303.                             msg:LONGWORD;
  304.                             _hwnd:HWND):LONGWORD:                PMWIN index 919;
  305.         FUNCTION WinSendMsg(MPARAM2,MPARAM1:POINTER;
  306.                             msg:LONGWORD;
  307.                             _hwnd:HWND):POINTER:                 PMWIN index 920;
  308.         FUNCTION GpiSetColor(lColor:LONGWORD;
  309.                              _hps:HPS):LONGINT:                  PMGPI index 517;
  310.         FUNCTION GpiSetBackColor(lColor:LONGINT;
  311.                                  _hps:HPS):LONGWORD:             PMGPI index 504;
  312.         FUNCTION GpiSetBackMix(lMixMode:LONGINT;
  313.                                _hps:HPS):LONGWORD:               PMGPI index 505;
  314.         FUNCTION GpiCharStringAt(VAR pchString;
  315.                                  lCount:LONGWORD;
  316.                                  VAR pptlPoint:POINTL;
  317.                                  _hps:HPS):LONGWORD:             PMGPI index 359;
  318.         FUNCTION GpiMove(VAR Point:POINTL;hp:HPS):LONGWORD:
  319.                                                                  PMGPI index 404;
  320.         FUNCTION GpiBox(VRound,HRound:LONGWORD;VAR Point:POINTL;
  321.                        Control:LONGWORD;hp:HPS):LONGWORD:        PMGPI index 356;
  322.         FUNCTION WinQueryWindowUShort(_index:LONGWORD;
  323.                                         _hwnd:HWND):WORD:        PMWIN index 844;
  324.         FUNCTION WinQueryWindowULong(_index:LONGWORD;
  325.                                      _hwnd:HWND):
  326.                                      LONGWORD:                   PMWIN index 843;
  327.         FUNCTION WinEnableWindow(fEnable:LONGWORD;
  328.                                  _hwnd:HWND):LONGWORD:           PMWIN index 735;
  329.         FUNCTION WinMessageBox(flStyle:LONGWORD;
  330.                                idWindow:LONGWORD;
  331.                                pszCaption:PSZ;
  332.                                pszText:PSZ;
  333.                                hwndOwner:HWND;
  334.                                hwndParent:HWND):LONGWORD:        PMWIN index 789;
  335.         FUNCTION WinSetWindowText(psztext:PSZ;
  336.                                   _hwnd:HWND):LONGWORD:          PMWIN index 877;
  337.         FUNCTION WinCreateHelpInstance(VAR HInit:THelpInit;
  338.                                        hab:LONGWORD):
  339.                                        LONGWORD:                 HELPMGR index 51;
  340.         FUNCTION WinDestroyHelpInstance(hwndHelp:HWND):
  341.                                         LONGWORD:                HELPMGR index 52;
  342.         FUNCTION WinAssociateHelpInstance(Frame,Help:HWND):
  343.                                           LONGWORD:              HELPMGR index 54;
  344.         FUNCTION WinQuerySysValue(iSysValue:LONGWORD;
  345.                                   hwndDesktop:HWND):
  346.                                   LONGWORD:                      PMWIN index 829;
  347.         FUNCTION WinDrawBorder(flCmd,clrBack,ClrFore,cy,cx:LONGWORD;
  348.                                VAR rec:RECTL;hp:HPS):LONGWORD:   PMWIN index 731;
  349.         PROCEDURE WinReleasePS(_hps:HPS):                        PMWIN index 848;
  350.         FUNCTION  WinGetPS(Win:HWND):HPS:                        PMWIN index 757;
  351.         FUNCTION WinWindowFromID(id:LONGWORD;
  352.                                  hwndParent:HWND):HWND:          PMWIN index 899;
  353.         FUNCTION WinCreateWindow(pPresParams:POINTER;
  354.                                  pCtlData:POINTER;
  355.                                  id:LONGWORD;
  356.                                  hwndInsertBehind:HWND;
  357.                                  hwndOwner:HWND;
  358.                                  cy,cx,y,x:LONGWORD;
  359.                                  flStyle:LONGWORD;
  360.                                  pszName:PSZ;
  361.                                  Class:LONGWORD;
  362.                                  hwndParent:HWND):HWND:          PMWIN index 909;
  363.         FUNCTION WinQueryWindowPos(_swp:SWP;
  364.                                    _hwnd:HWND):LONGWORD:         PMWIN index 837;
  365.         FUNCTION WinSetMultWindowPos(cswp:LONGWORD;
  366.                                      VAR pswp:SWP;
  367.                                      _hab:LONGWORD):
  368.                                      LONGWORD:                   PMWIN index 863;
  369.         FUNCTION WinBeginEnumWindows(_hwnd:HWND):
  370.                                      LONGWORD:                   PMWIN index 702;
  371.         FUNCTION WinGetNextWindow(_henum:LONGWORD):HWND:         PMWIN index 756;
  372.         FUNCTION WinEndEnumWindows(_henum:LONGWORD):
  373.                                    LONGWORD:                     PMWIN index 737;
  374.         FUNCTION WinSetWindowUShort(us:LONGINT;
  375.                                     _index:LONGWORD;
  376.                                     _hwnd:HWND):LONGWORD:        PMWIN index 879;
  377.         FUNCTION WinSetOwner(hwndNewOwner,_hwnd:HWND):
  378.                              LONGWORD:                           PMWIN index 864;
  379.         FUNCTION WinLoadMenu(id,res:LONGWORD;
  380.                              Owner:HWND):HWND:                   PMWIN index 778;
  381.         FUNCTION WinPopupMenu(fsOptions,idItem,ly,lx:LONGWORD;
  382.                               Menu,Owner,Parent:HWND):LONGWORD:  PMWIN index 937;
  383. END;
  384.  
  385. {*************************************************************************
  386. *                                                                        *
  387. *   Common Procedures and functions                                      *
  388. *                                                                        *
  389. **************************************************************************}
  390.  
  391.  
  392.  
  393. PROCEDURE StartHandler(para2,para1:POINTER;Msg,Win:LONGWORD);ASM;
  394. {This is the default window procedure for all objects called by PM.
  395.  It is only called when the window is created and then redefined.
  396.  As it has to be fast and low level programmed it is written in assembler...
  397.  It will only call WinDefWnfProc and is redefined by WinSubClassWindow}
  398. BEGIN
  399.      ASM
  400.         PUSH EBP
  401.         MOV EBP,ESP
  402.         PUSHL $para2
  403.         PUSHL $para1
  404.         PUSHL $msg
  405.         PUSHL $win
  406.         MOV AL,4
  407.         CALLDLL PMWin,911   ;WinDefWindowProc
  408.         ADD ESP,16
  409.         LEAVE
  410.         RETN32
  411.      END;
  412. END;
  413.  
  414. PROCEDURE InvalidateWindow(Win:HWND);
  415. BEGIN
  416.      WinInvalidateRect(1,NIL,Win);
  417. END;
  418.  
  419.  
  420. PROCEDURE DrawStringXY(_hps:HPS;VAR pt:POINTL;VAR s:string;start,Len:LONGWORD;
  421.                        Color,BackColor:LONGWORD);
  422. BEGIN
  423.      GpiSetColor(Color,_hps);
  424.      GpiSetBackColor(BackColor,_hps);
  425.      GpiCharStringAt(s[Start],Len,pt,_hps);
  426. END;
  427.  
  428.  
  429. PROCEDURE MaximizeWindow(Win:HWND);
  430. BEGIN
  431.      WinSetWindowPos(SWP_MAXIMIZE OR SWP_ACTIVATE OR SWP_SHOW,0,0,0,0,
  432.                      HWND_TOP,Win);
  433. END;
  434.  
  435. PROCEDURE MinimizeWindow(Win:HWND);
  436. BEGIN
  437.      WinSetWindowPos(SWP_MINIMIZE OR SWP_ACTIVATE OR SWP_SHOW,0,0,0,0,
  438.                      HWND_TOP,Win);
  439. END;
  440.  
  441.  
  442. PROCEDURE GetWindowPos(Win:HWND;VAR x,y,cx,cy:LONGINT);
  443. VAR _swp:SWP;
  444. BEGIN
  445.      WinQueryWindowPos(_swp,Win);
  446.      x:=_swp.x;
  447.      y:=_swp.y;
  448.      cx:=_swp.cx;
  449.      cy:=_swp.cy;
  450. END;
  451.  
  452. PROCEDURE SetWindowPos(Win:HWND;x,y,cx,cy:LONGINT);
  453. BEGIN
  454.      WinSetWindowPos(SWP_SPEED,cy,cx,y,x,HWND_TOP,Win);
  455. END;
  456.  
  457. FUNCTION IsWindowMaximized(Win:HWND):BOOLEAN;
  458. VAR r:LONGWORD;
  459. BEGIN
  460.      IF Win=0 THEN
  461.      BEGIN
  462.           IsWindowMaximized:=FALSE;
  463.           exit;
  464.      END;
  465.      IF WinQueryWindowUShort(QWS_ID,Win)=FID_CLIENT THEN
  466.       Win:=WinQueryWindow(QW_PARENT,Win);
  467.      r:=WinQueryWindowULong(QWL_STYLE,Win) and WS_MAXIMIZED;
  468.      IF r<>0 THEN IsWindowMaximized:=TRUE
  469.      ELSE IsWindowMaximized:=FALSE;
  470. END;
  471.  
  472. FUNCTION IsWindowMinimized(Win:HWND):BOOLEAN;
  473. VAR r:LONGWORD;
  474. BEGIN
  475.      IF Win=0 THEN
  476.      BEGIN
  477.           IsWindowMinimized:=FALSE;
  478.           exit;
  479.      END;
  480.      IF WinQueryWindowUShort(QWS_ID,Win)=FID_CLIENT THEN
  481.       Win:=WinQueryWindow(QW_PARENT,Win);
  482.      r:=WinQueryWindowULong(QWL_STYLE,Win) and WS_MINIMIZED;
  483.      IF r<>0 THEN IsWindowMinimized:=TRUE
  484.      ELSE IsWindowMinimized:=FALSE;
  485. END;
  486.  
  487. PROCEDURE HideWindow(Win:HWND);
  488. BEGIN
  489.      WinSetWindowPos(SWP_HIDE,0,0,0,0,0,Win);
  490. END;
  491.  
  492. PROCEDURE ShowWindow(Win:HWND);
  493. BEGIN
  494.      WinSetWindowPos(SWP_SHOW,0,0,0,0,0,Win);
  495. END;
  496.  
  497. PROCEDURE DisableWindow(Win:HWND);
  498. BEGIN
  499.      WinEnableWindow(0,Win);
  500. END;
  501.  
  502.  
  503. PROCEDURE WindowToTop(FrameWin:HWND);
  504. BEGIN
  505.      WinSetWindowPos(SWP_ZORDER,0,0,0,0,HWND_TOP,FrameWin);
  506. END;
  507.  
  508.  
  509. PROCEDURE EnableWindow(Win:HWND);
  510. BEGIN
  511.      WinEnableWindow(1,Win);
  512. END;
  513.  
  514. PROCEDURE RestoreWindow(Win:HWND);
  515. BEGIN
  516.      WinSetWindowPos(SWP_RESTORE,0,0,0,0,0,Win);
  517. END;
  518.  
  519. FUNCTION ConfirmBox(Options:LONGWORD;msg:String):BOOLEAN;
  520. VAR s:PString;
  521.     result:LONGWORD;
  522. BEGIN
  523.      s:='Confirm action';
  524.      result:=WinMessageBox(MB_YESNO or MB_MOVEABLE or MB_Query
  525.                            or Options,0,s,msg,
  526.                            HWND_DESKTOP{Frame},HWND_DESKTOP);
  527.      ConfirmBox:=result=MBID_YES;
  528. END;
  529.  
  530.  
  531. PROCEDURE MessageBox(msg:String);
  532. VAR s:PString;
  533. BEGIN
  534.      s:='Message';
  535.      WinMessageBox(MB_OK or MB_MOVEABLE or MB_Query,0,s,msg,
  536.                    HWND_DESKTOP{AppWinFrameHandle},HWND_Desktop);
  537. END;
  538.  
  539. PROCEDURE ErrorBox(Options:LONGWORD;err:String);
  540. VAR s:PString;
  541. BEGIN
  542.      s:='Error';
  543.      WinMessageBox(MB_OK or MB_MOVEABLE or options,0,s,err,
  544.                    HWND_DESKTOP{AppWinFrameHandle},HWND_Desktop);
  545. END;
  546.  
  547.  
  548. FUNCTION PointerToWord(p:POINTER):WORD;ASM;
  549. BEGIN
  550.      ASM
  551.         MOV EBX,ESP
  552.         MOV EAX,[EBX+4]
  553.         RETN32 4
  554.      END;
  555. END;
  556.  
  557.  
  558. {*************************************************************************
  559. *                                                                        *
  560. *                       Methods for object TWindow                       *
  561. *                                                                        *
  562. **************************************************************************}
  563.  
  564. PROCEDURE MessageHandler(para2,para1:POINTER;Msg,Win:LONGWORD);ASM;
  565. {This is the window procedure called by PM.
  566.  As it has to be fast and low level programmed it is written in assembler...
  567.  It will call HandleEvent as a virtual method in the VMT}
  568. BEGIN
  569.      ASM
  570.         PUSH EBP
  571.         MOV EBP,ESP
  572.         SUB ESP,2
  573.         ;Save parameters as it is SYSTEM Calling Convention
  574.         PUSH EDI
  575.         PUSH ESI
  576.         PUSH EBX
  577.  
  578.         MOVW [EBP-2],0   ;Not Handled
  579.  
  580.         PUSHL $Win
  581.         PUSHL $Msg
  582.         PUSHL $para1
  583.         PUSHL $para2
  584.         LEA EAX,[EBP-2]
  585.         PUSH EAX
  586.  
  587.         PUSHL 0             ;Get VMT pointer
  588.         PUSHL $Win
  589.         MOV AL,2
  590.         CALLDLL PMWIN,843   ;QueryWindowUlong
  591.         ADD ESP,8
  592.         MOV EDI,EAX
  593.         PUSH EDI         ;VMT Pointer
  594.         MOV EDI,[EDI+0]  ;get VMT pointer for HandleEvent
  595.         db ffh,17h       ;CALL NEAR32 [EDI+0] --> in Methode springen
  596.         MOV BL,[EBP-2]
  597.         CMP BL,0
  598.         JNE !hh
  599.         ;not handled
  600.         ;Default Window handler
  601.         PUSHL $para2
  602.         PUSHL $para1
  603.         PUSHL $msg
  604.         PUSHL $win
  605.         MOV AL,4
  606.         CALLDLL PMWin,911   ;WinDefWindowProc
  607.         ADD ESP,16
  608. !hh:
  609.         ;Get registers as it is SYSTEM calling convention
  610.         POP EBX
  611.         POP ESI
  612.         POP EDI
  613.         LEAVE
  614.         RETN32
  615.      END;
  616. END;
  617.  
  618.  
  619. CONSTRUCTOR TWindow.Init;
  620. {Global initialization of Object TWindow}
  621. BEGIN
  622.      Title:='';            {Window title}
  623.      FontName:='Helv';     {Default font name}
  624.      FontWidth:=8;         {Default font width}
  625.      FontHeight:=8;        {Default font height}
  626.      ForeColor:=CLR_BLACK; {Default output color}
  627.      BackColor:=CLR_WHITE; {Default window background color}
  628. END;
  629.  
  630. PROCEDURE TWindow.CreateWindow(Parent:HWND;Style,CreateFlags:LONGWORD;
  631.                                Class,Title:String;StyleClient:LONGWORD;
  632.                                Res,id:LONGWORD);
  633. {Creates the window with the given parameters and subclasses
  634.  Window procedure}
  635. BEGIN
  636.      FrameHandle:=WinCreateStdWindow(Parent,Style,CreateFLags,Class,Title,
  637.                                      StyleClient,Res,id,ClientHandle);
  638.      WinSetWindowULong(LONGWORD(SELF),0,ClientHandle); {VMT pointer}
  639.      WinSubClassWindow(@MessageHandler,ClientHandle);
  640.      DesktopClientHandle:=ClientHandle;
  641.      DesktopFrameHandle:=FrameHandle;
  642. END;
  643.  
  644. PROCEDURE TWindow.PrintString(ps:HPS;s:STRING;x,y:LONGINT);
  645. VAR pt:POINTL;
  646. BEGIN
  647.      CreateLogFont(ps,FontName,FontWidth,FontHeight,0);
  648.      GpiSetBackMix(2,ps);  {BM_OverPaint}
  649.      pt.x:=x;
  650.      pt.y:=y;
  651.      DrawStringXY(ps,pt,s,1,Length(s),ForeColor,BackColor);
  652. END;
  653.  
  654. PROCEDURE TWindow.GetMaxDesktopWindow(VAR _swp:SWP);
  655. VAR rec:RECTL;
  656. BEGIN
  657.      WinQueryWindowRect(rec,DesktopClientHandle);
  658.      _swp.cx:=rec.XRight-rec.XLeft;
  659.      _swp.cy:=rec.yTop-rec.yBottom;
  660.      _swp.x:=rec.xRight-_swp.cx;
  661.      _swp.y:=rec.yTop-_swp.cy;
  662. END;
  663.  
  664. PROCEDURE TWindow.SetColors(Col,BackCol:LONGINT);
  665. {Set default colors}
  666. BEGIN
  667.      ForeColor:=Col;
  668.      BackColor:=BackCol;
  669.      InvalidateAppWindow;  {Forces a redraw}
  670. END;
  671.  
  672. PROCEDURE TWindow.InvalidateAppWindow;
  673. {Forces a redraw of the whole window client area}
  674. BEGIN
  675.      WinInvalidateRect(1,NIL,ClientHandle);
  676. END;
  677.  
  678.  
  679. PROCEDURE TWindow.DeleteData;
  680. {Destroys all user defined data. This is a dummy}
  681. BEGIN
  682. END;
  683.  
  684. DESTRUCTOR TWindow.Done;
  685. BEGIN
  686.      DeleteData;
  687. END;
  688.  
  689. PROCEDURE TWindow.Redraw(rc:RECTL;_hps:HPS;Win:HWND);
  690. {Redraws the client area}
  691. BEGIN
  692. END;
  693.  
  694. PROCEDURE TWindow.WMEraseBackGround(Win:HWND;rc:RECTL;_hps:HPS);
  695. {Fill the background with the default background color}
  696. BEGIN
  697.      WinFillRect(BackColor,rc,_hps);
  698. END;
  699.  
  700. PROCEDURE TWindow.WMClose(VAR Msg:TMessage);
  701. BEGIN
  702.      WinDestroyWindow(WinQueryWindow(QW_PARENT,Msg.Win));
  703. END;
  704.  
  705. PROCEDURE TWindow.WMCreate(VAR Msg:TMessage);
  706. {Is called when the window is created}
  707. BEGIN
  708. END;
  709.  
  710. PROCEDURE TWindow.WMDestroy(VAR Msg:TMessage);
  711. {Is called when the window is destroyed}
  712. BEGIN
  713. END;
  714.  
  715. PROCEDURE TWindow.WMActivate(VAR Msg:TMessage);
  716. {Is called when the window is activated by the user}
  717. BEGIN
  718. END;
  719.  
  720. FUNCTION TWindow.MDIHandleEvent(Win:HWND;Msg:LONGWORD;
  721.                                 para1,para2:POINTER;
  722.                                 VAR Handled:BOOLEAN;Data:POINTER):LONGWORD;
  723. {Window procedure for MDI child windows. This is a dummy}
  724. BEGIN
  725.      Handled:=FALSE;
  726.      MDIHandleEvent:=0;
  727. END;
  728.  
  729. PROCEDURE TWindow.WMButton1Down(Win:HWND;x,y:INTEGER);
  730. {Is clicked when the left mouse button is pressed in the desktop area}
  731. BEGIN
  732. END;
  733.  
  734. PROCEDURE TWindow.WMButton1Up(Win:HWND;x,y:INTEGER);
  735. {Is called when the left mouse button is released in the desktop area}
  736. BEGIN
  737. END;
  738.  
  739. PROCEDURE TWindow.WMButton1Click(Win:HWND;x,y:INTEGER);
  740. {Is called when the left mouse button is clicked in the desktop area}
  741. BEGIN
  742. END;
  743.  
  744. PROCEDURE TWindow.WMButton1DoubleClick(Win:HWND;x,y:INTEGER);
  745. {Is called when the left mouse button is clicked in the desktop area}
  746. BEGIN
  747. END;
  748.  
  749. PROCEDURE TWindow.WMButton2Down(Win:HWND;x,y:INTEGER);
  750. {Is clicked when the right mouse button is pressed in the desktop area}
  751. BEGIN
  752. END;
  753.  
  754. PROCEDURE TWindow.WMButton2Up(Win:HWND;x,y:INTEGER);
  755. {Is called when the right mouse button is released in the desktop area}
  756. BEGIN
  757. END;
  758.  
  759. PROCEDURE TWindow.WMButton2Click(Win:HWND;x,y:INTEGER);
  760. {Is called when the right mouse button is clicked in the desktop area}
  761. BEGIN
  762. END;
  763.  
  764. PROCEDURE TWindow.WMMouseMove(Win:HWND;x,y:INTEGER);
  765. {Is called when the mouse is moved in the desktop area}
  766. BEGIN
  767. END;
  768.  
  769. PROCEDURE TWindow.WMSize(VAR Msg:TMessage);
  770. {Called when the window is sized. This is a dummy}
  771. BEGIN
  772.      Msg.Handled:=FALSE;
  773. END;
  774.  
  775. PROCEDURE TWindow.SetWindowTitle(s:STRING);
  776. BEGIN
  777.      Title:=s;
  778.      WinSetWindowText(s,DesktopFrameHandle);
  779. END;
  780.  
  781. FUNCTION TWindow.DesktopHandleEvent(Win:HWND;Msg:LONGWORD;
  782.                                     para1,para2:POINTER;
  783.                                     VAR Handled:BOOLEAN):LONGWORD;
  784. {Message handler for the desktop of the window}
  785. VAR H:BOOLEAN;
  786.     r:LONGWORD;
  787.     po:POINTS;
  788. BEGIN
  789.      CASE Msg OF
  790.         WM_BUTTON1DOWN,WM_BUTTON1CLICK,
  791.         WM_BUTTON1DBLCLK,WM_BUTTON1UP,
  792.         WM_BUTTON2DOWN,WM_BUTTON2CLICK,
  793.         WM_BUTTON2UP,WM_MOUSEMOVE:WinSendMsg(para2,para1,Msg,AppWinHandle);
  794.      END;
  795.      Handled:=FALSE;
  796.      DesktopHandleEvent:=0;
  797. END;
  798.  
  799. PROCEDURE TWindow.HandleScanEvent(Win:HWND;scan:WORD);
  800. {Handles scan events from the keyboard}
  801. BEGIN
  802. END;
  803.  
  804. PROCEDURE TWindow.HandleCharEvent(Win:HWND;Ch:CHAR);
  805. {Handles char events from the keyboard}
  806. BEGIN
  807. END;
  808.  
  809. PROCEDURE TWindow.HandleCommand(Win:HWND;Command:WORD);
  810. {Handles WM_COMMAND messages}
  811. BEGIN
  812. END;
  813.  
  814. PROCEDURE TWindow.GetPS(VAR ps:HPS);
  815. BEGIN
  816.      ps:=WinGetPS(DesktopClientHandle);
  817. END;
  818.  
  819. PROCEDURE TWindow.ReleasePS(ps:HPS);
  820. BEGIN
  821.      WinReleasePS(ps);
  822. END;
  823.  
  824. FUNCTION TWindow.HandleEvent(Win:HWND;Msg:LONGWORD;
  825.                              para1,para2:POINTER;
  826.                              VAR Handled:BOOLEAN):LONGWORD;
  827. {Handles messages for the main window}
  828. VAR
  829.     H:Boolean;
  830.     _hps:HPS;
  831.     r:LONGWORD;
  832.     w,w1:WORD;
  833.     b:WORD;
  834.     ch:CHAR;
  835.     rc,rc1:RECTL;
  836.     command:WORD;
  837.     po:POINTS;
  838.     _swp:SWP;
  839.     _Msg:TMessage;
  840.     DMTFound:BOOLEAN;
  841. label l,l1,l3;
  842. BEGIN
  843.       _Msg.Win:=Win;
  844.       _Msg.Para1:=LONGWORD(Para1);
  845.       _Msg.Para2:=LONGWORD(Para2);
  846.       _Msg.Message:=Msg;
  847.       _Msg.Handled:=TRUE;
  848.       _msg.Result:=0;
  849.       DMTFound:=FALSE;
  850.       {Check for dynamic methods}
  851.       ASM
  852.          MOV EDI,$!SELF
  853.          MOV EDI,[EDI+4]   ;DMT table address
  854.          MOV ECX,[EDI+0]   ;DMT table size
  855.          SHR ECX,3         ;Divide by 8
  856.          CMP ECX,0
  857.          JE !NoDMT         ;no dynamic methods
  858.          ADD EDI,4         ;onto first DMT entry
  859.          MOV EAX,$Msg
  860. !DMTLoop:
  861.          CMP EAX,[EDI+0]
  862.          JE !DMTHere       ;Message found
  863.          ADD EDI,8         ;next DMT entry
  864.          LOOP !DMTLoop
  865.          JMP !NoDMT
  866. !DMTHere:
  867.          MOVB $DMTFound,1
  868.          LEA EAX,$_Msg
  869.          PUSH EAX          ;Parameter for dynamic method call
  870.          MOV EAX,[EDI+4]   ;Method index in VMT
  871.          DEC EAX
  872.          SHL EAX,2         ;multiply with 4
  873.          MOV EDI,$!SELF
  874.          PUSH EDI          ;VMT for dynamic method
  875.          MOV EDI,[EDI+0]   ;Get VMT address
  876.          ADD EDI,EAX       ;Calculate method
  877.          db ffh,17h       ;CALL NEAR32 [EDI+0] --> in Methode springen
  878. !NoDMT:
  879.       END;
  880.       IF DMTFound THEN
  881.       BEGIN
  882.            H:=_Msg.Handled;
  883.            r:=_Msg.Result;
  884.            goto l1;
  885.       END;
  886.       r:=0;
  887.       H:=TRUE;
  888.       CASE Msg OF
  889.           WM_ERASEBACKGROUND:
  890.           BEGIN
  891.                _hps:=WinBeginPaint(rc,0,Win);
  892.                GetMaxDesktopWindow(_swp);
  893.                rc1.yBottom:=_swp.y;
  894.                rc1.xLeft:=_swp.x;
  895.                rc1.yTop:=_swp.y+_swp.cy;
  896.                rc1.xRight:=_swp.x+_swp.cx;
  897.                WMEraseBackGround(Win,rc1,_hps);
  898.                Redraw(rc,_hps,Win);
  899.                WinEndPaint(_hps);
  900.                H:=FALSE;
  901.           END;
  902.           WM_PAINT:
  903.           BEGIN
  904.                _hps:=WinBeginPaint(rc,0,Win);
  905.                Redraw(rc,_hps,Win);
  906.                WinEndPaint(_hps);
  907.           END;
  908.           WM_COMMAND:
  909.           BEGIN
  910.                command:=PointerToWord(para1);
  911.                HandleCommand(Win,command);
  912.           END;
  913.           WM_CHAR:
  914.           BEGIN
  915.                H:=FALSE; {Not handled}
  916.                r:=LONGINT(para1);
  917.                w:=lo(r);
  918.                IF w AND $41=1 THEN {KC_CHAR valid and KC_KEYUP}
  919.                BEGIN
  920.                     r:=LONGINT(para2);
  921.                     w1:=lo(r);
  922.                     b:=lo(w1);
  923.                     if b<32 THEN goto l;
  924.                     IF w and $10=$10 THEN goto l; {KC_CTRL valid}
  925.                     IF w and $20=$20 THEN goto l; {KC_ALT valid}
  926.                     ch:=chr(b);
  927.                     InCtrlK:=FALSE;
  928.                     HandleCharEvent(Win,ch);
  929.                     H:=FALSE; {not handled}
  930.                     r:=0;
  931.                     goto l1;
  932.                END
  933.                ELSE
  934.                BEGIN
  935.                     IF w AND $44=4 THEN {KC_CHAR valid and KC_KEYUP}
  936.                     BEGIN
  937.                          w1:=hi(r);
  938.                          b:=hi(w1);
  939. l:
  940.                          IF w and $10=$10 THEN {Ctrl-Taste}
  941.                          BEGIN
  942.                               inc(b,256); {KC_CTRL valid}
  943.                               CASE b OF
  944.                                  kbCtrlK:
  945.                                  BEGIN
  946.                                      IF InCtrlK THEN goto l3;
  947.                                      InCtrlK:=TRUE;
  948.                                  END
  949.                                  ELSE
  950.                                  BEGIN
  951.                                      IF InCtrlK THEN
  952.                                      BEGIN
  953. l3:
  954.                                           inc(b,1000);
  955.                                      END;
  956.                                      InCtrlK:=FALSE;
  957.                                  END;
  958.                               END; {Case}
  959.                          END
  960.                          ELSE
  961.                          BEGIN
  962.                               InCtrlK:=FALSE;
  963.                               IF w AND 8=8 THEN inc(b,512) {KC_SHIFT valid}
  964.                               ELSE IF w AND $20=$20 THEN inc(b,768); {KC_ALT valid}
  965.                          END;
  966.                          HandleScanEvent(Win,b);
  967.                          H:=FALSE; {not handled}
  968.                          r:=0;
  969.                          goto l1;
  970.                     END;
  971.                END;
  972.           END;
  973.           WM_BUTTON1DOWN:
  974.           BEGIN
  975.                Drag_Mode:=FALSE;
  976.                MouseButton1Down:=TRUE;
  977.                po:=POINTS(para1);
  978.                WMButton1Down(Win,po.x,po.y);
  979.                IF not Handled THEN H:=FALSE;
  980.           END;
  981.           WM_BUTTON1CLICK:
  982.           BEGIN
  983.                MouseButton1Down:=FALSE;
  984.                Drag_Mode:=FALSE;
  985.                po:=POINTS(para1);
  986.                WMButton1Click(Win,po.x,po.y);
  987.                IF not Handled THEN H:=FALSE;
  988.           END;
  989.           WM_BUTTON1DBLCLK:
  990.           BEGIN
  991.                MouseButton1Down:=FALSE;
  992.                Drag_Mode:=FALSE;
  993.                po:=POINTS(para1);
  994.                WMButton1DoubleClick(Win,po.x,po.y);
  995.                IF not Handled THEN H:=FALSE;
  996.           END;
  997.           WM_BUTTON1UP:
  998.           BEGIN
  999.                MouseButton1Down:=FALSE;
  1000.                Drag_Mode:=FALSE;
  1001.                po:=POINTS(para1);
  1002.                WMButton1Up(Win,po.x,po.y);
  1003.                IF not Handled THEN H:=FALSE;
  1004.           END;
  1005.           WM_BUTTON2DOWN:
  1006.           BEGIN
  1007.                po:=POINTS(para1);
  1008.                WMButton2Down(Win,po.x,po.y);
  1009.                IF not Handled THEN H:=FALSE;
  1010.           END;
  1011.           WM_BUTTON2CLICK:
  1012.           BEGIN
  1013.                po:=POINTS(para1);
  1014.                WMButton2Click(Win,po.x,po.y);
  1015.                IF not Handled THEN H:=FALSE;
  1016.           END;
  1017.           WM_BUTTON2UP:
  1018.           BEGIN
  1019.                po:=POINTS(para1);
  1020.                WMButton2Up(Win,po.x,po.y);
  1021.                IF not Handled THEN H:=FALSE;
  1022.           END;
  1023.           WM_MOUSEMOVE:
  1024.           BEGIN
  1025.                IF MouseButton1Down THEN WinSendMsg(NIL,para1,WM_MOUSEDRAG1,Win);
  1026.                po:=POINTS(Para1);
  1027.                WMMouseMove(Win,po.x,po.y);
  1028.                IF not Handled THEN H:=FALSE;
  1029.           END;
  1030.           ELSE H:=FALSE;
  1031.       END;
  1032. l1:
  1033.       Handled:=H;
  1034.       HandleEvent:=r;
  1035. END;
  1036.  
  1037.  
  1038.  
  1039.  
  1040.  
  1041.  
  1042.  
  1043.  
  1044. {*************************************************************************
  1045. *                                                                        *
  1046. *                       Methods for object TApplication                  *
  1047. *                                                                        *
  1048. **************************************************************************}
  1049.  
  1050.  
  1051. PROCEDURE TApplication.GetMaxAppWindow(VAR _swp:SWP);
  1052. VAR rec:RECTL;
  1053.     XDiv,YDiv,UWin:LONGWORD;
  1054. BEGIN
  1055.      XDiv:=WinQuerySysValue(SV_CXSIZEBORDER,HWND_DESKTOP);
  1056.      XDiv:=XDiv+WinQuerySysValue(SV_CXMINMAXBUTTON,HWND_DESKTOP) DIV 2;
  1057.  
  1058.      YDiv:=WinQuerySysValue(SV_CYSIZEBORDER,HWND_DESKTOP);
  1059.      YDiv:=YDiv+WinQuerySysValue(SV_CYMINMAXBUTTON,HWND_DESKTOP);
  1060.      WinQueryWindowRect(rec,ClientHandle);
  1061.      _swp.cx:=rec.XRight-rec.XLeft;
  1062.      _swp.cy:=rec.yTop-rec.yBottom;
  1063.      _swp.x:=rec.xRight-_swp.cx;
  1064.      _swp.y:=rec.yTop-_swp.cy;
  1065.  
  1066.      dec(_swp.cy,ToolBarSize);
  1067.      dec(_swp.cy,StatusBarSize);
  1068.  
  1069.      dec(_swp.cx,RightToolBarSize);
  1070.      dec(_swp.cx,LeftToolBarSize);
  1071.  
  1072.      inc(_swp.x,LeftToolBarSize);
  1073.      inc(_swp.y,StatusBarSize);
  1074. END;
  1075.  
  1076. PROCEDURE TApplication.PopupMenu(VAR Menu:HWND;id:LONGWORD;
  1077.                                        x,y:LONGWORD;Parent:HWND);
  1078. BEGIN
  1079.      IF Menu=0 THEN Menu:=WinLoadMenu(id,0,HWND_OBJECT);
  1080.      WinPopupMenu(PU_HCONSTRAIN OR PU_VCONSTRAIN OR PU_KEYBOARD OR
  1081.                   PU_MOUSEBUTTON2 OR PU_MOUSEBUTTON1,0,y,x,Menu,Parent,
  1082.                   Parent);
  1083. END;
  1084.  
  1085. PROCEDURE TApplication.DisplayHelp(PanelID:WORD);
  1086. VAR
  1087.    p2:LONGWORD;
  1088. BEGIN
  1089.      IF HelpWindow=0 THEN exit;
  1090.      p2:=0;  {HM_RESOURCEID}
  1091.      WinSendMsg(POINTER(p2),POINTER(PanelID),HM_DISPLAY_HELP,HelpWindow);
  1092. END;
  1093.  
  1094. PROCEDURE TApplication.WMMenuSelect(Win:HWND;para1:POINTER);
  1095. BEGIN
  1096. END;
  1097.  
  1098. FUNCTION TApplication.HandleEvent(Win:HWND;Msg:LONGWORD;
  1099.                               para1,para2:POINTER;
  1100.                               VAR Handled:BOOLEAN):LONGWORD;
  1101. VAR
  1102.     H:Boolean;
  1103.     _hps:HPS;
  1104.     r:LONGWORD;
  1105.     command:WORD;
  1106.     rc:RECTL;
  1107.     w,w1:Word;
  1108.     b:WORD;
  1109.     ch:char;
  1110.     _swp:swp;
  1111.     xdiv,ydiv,err:LONGWORD;
  1112.     dummy:PMenuHelpItems;
  1113.     status:PStatusBarInterior;
  1114. label l,l1,l2;
  1115. BEGIN
  1116.      r:=Inherited.HandleEvent(Win,Msg,para1,para2,handled);
  1117.      r:=0;
  1118.      H:=TRUE;
  1119.      CASE Msg OF
  1120.           HM_QUERY_KEYS_HELP:r:=CM_KEYSHELP;
  1121.           HM_ERROR:
  1122.           BEGIN
  1123.                err:=LONGWORD(Para1);
  1124.                ErrorBox(MB_ICONHAND,'Help manager error '+tostr(err));
  1125.           END;
  1126.           HM_HELPSUBITEM_NOT_FOUND:ErrorBox(MB_ICONHAND,'Helpsubitem not found!');
  1127.           HM_EXT_HELP_UNDEFINED:ErrorBox(MB_ICONHAND,'Extended help undefined!');
  1128.           HM_GENERAL_HELP_UNDEFINED:ErrorBox(MB_ICONHAND,'General help undefined!');
  1129.           WM_MENUSELECT:
  1130.           BEGIN
  1131.                WMMenuSelect(Win,para1);
  1132.                IF StatusBarSize=0 THEN goto l2;
  1133.                w:=WORD(para1);
  1134.                w1:=0;
  1135.                dummy:=MenuHelpItems;
  1136.                WHILE dummy<>NIL DO
  1137.                BEGIN
  1138.                     IF dummy^.MenuID=65535 THEN w1:=dummy^.StatusID;
  1139.                     IF dummy^.MenuID=w THEN
  1140.                     BEGIN
  1141.                          w1:=dummy^.StatusID;
  1142.                          Status:=StatusBarInterior;
  1143.                          WHILE Status<>NIL DO
  1144.                          BEGIN
  1145.                               IF Status^.ID=w1 THEN
  1146.                               BEGIN
  1147.                                    StatusBarSetText(w1,dummy^.HelpText,
  1148.                                                     dummy^.Col);
  1149.                                    goto l2;
  1150.                               END;
  1151.                               Status:=Status^.Next;
  1152.                          END;
  1153.                          goto l2;
  1154.                     END;
  1155.                     dummy:=dummy^.Next;
  1156.                END;
  1157.                IF w1<>0 THEN StatusBarSetText(w1,'',-1);
  1158. l2:
  1159.                IF not Handled THEN H:=FALSE;
  1160.           END;
  1161.           WM_MENUEND:
  1162.           BEGIN
  1163.                dummy:=MenuHelpItems;
  1164.                WHILE dummy<>NIL DO
  1165.                BEGIN
  1166.                     IF dummy^.MenuID=65535 THEN
  1167.                     BEGIN
  1168.                          StatusBarSetText(dummy^.StatusID,dummy^.HelpText,
  1169.                                           dummy^.Col);
  1170.                          goto l2;
  1171.                     END;
  1172.                END;
  1173.                IF not Handled THEN H:=FALSE;
  1174.           END;
  1175.           ELSE IF not Handled THEN H:=FALSE;
  1176.      END;
  1177. l1:
  1178.      Handled:=H;
  1179.      HandleEvent:=r;
  1180. END;
  1181.  
  1182. PROCEDURE TApplication.WMSize(VAR Msg:TMessage);
  1183. VAR _swp:SWP;
  1184. BEGIN
  1185.      Inherited.WMSize(Msg);
  1186.      GetMaxAppWindow(_swp);
  1187.      WinSetWindowPos(SWP_SPEED,_swp.cy,_swp.cx,_swp.y,_swp.x,
  1188.                      HWND_TOP,DesktopFrameHandle);
  1189. END;
  1190.  
  1191. PROCEDURE TApplication.WMClose(VAR Msg:TMessage);
  1192. BEGIN
  1193.      WinPostMsg(NIL,NIL,WM_QUIT,Msg.Win);
  1194. END;
  1195.  
  1196.  
  1197. CONSTRUCTOR TApplication.Init;
  1198. BEGIN
  1199.      Inherited.Init;
  1200.      AlternateExit:=TRUE; {Set alternate WM_QUIT Handler}
  1201.      ToolBarSize:=0;
  1202.      LeftToolBarSize:=0;
  1203.      RightToolBarSize:=0;
  1204.      StatusBarSize:=0;
  1205.      ToolBarInterior:=NIL;
  1206.      StatusBarInterior:=NIL;
  1207.      MenuHelpItems:=NIL;
  1208.      WindowID:=0;
  1209.      HasMenu:=FALSE;  {TRUE for Menu resource}
  1210.      HasIcon:=FALSE;  {TRUE for Icon resource}
  1211.      HasAccel:=FALSE; {TRUE for Accel resource}
  1212.      HasHelp:=FALSE;  {TRUE for online help}
  1213.      Wincx:=450;
  1214.      Wincy:=350;
  1215.      Winx:=50;
  1216.      Winy:=100;
  1217. END;
  1218.  
  1219. DESTRUCTOR TApplication.Done;
  1220. BEGIN
  1221.      Inherited.Done;
  1222. END;
  1223.  
  1224. PROCEDURE MainMessageLoop;
  1225. VAR _qmsg:QMSG;
  1226. BEGIN
  1227.      ASM
  1228. !ndis:
  1229.         PUSHL 0    ;PM_NOREMOVE
  1230.         PUSHL 0
  1231.         PUSHL 0
  1232.         PUSHL 0
  1233.         LEA EAX,$_qmsg
  1234.         PUSH EAX
  1235.         PUSHL _AppHandle
  1236.         MOV AL,6
  1237.         CALLDLL PMWIN,918  ;WinPeekMsg
  1238.         ADD ESP,24
  1239.         CMP EAX,0         ;Message in the queue ??
  1240.         JNE !mes_here
  1241.  
  1242.         ;There was no message in the queue
  1243.         CMPB _Drag_Mode,0
  1244.         JE !mes_here       ;Wait for next message
  1245.  
  1246.         ;Create a WM_MouseDRAG Message at last Message Position
  1247.         PUSHL 0
  1248.         PUSHL _LastDragPos
  1249.         PUSHL 1000h   ;WM_MOUSEDRAG1
  1250.         PUSHL _DragWindow
  1251.         MOV AL,4
  1252.         CALLDLL PMWIN,920       ;WinSendMsg
  1253.         ADD ESP,16
  1254.  
  1255.         JMP !ndis
  1256. !mes_here:
  1257.         PUSHL 0
  1258.         PUSHL 0
  1259.         PUSHL 0
  1260.         LEA EAX,$_qmsg
  1261.         PUSH EAX
  1262.         PUSHL _AppHandle
  1263.         MOV AL,5
  1264.         CALLDLL PMWIN,915  ;WinGetMsg
  1265.         ADD ESP,20
  1266.         CMP EAX,0
  1267.         JE !exdis
  1268.  
  1269.         LEA ESI,$_qmsg
  1270.         MOV EAX,[ESI+4]     ;qmsg.msg
  1271.         CMP EAX,72h         ;WM_Button1Up
  1272.         JE !naus
  1273.         CMP EAX,0412h       ;WM_Button1MotionEnd
  1274.         JNE !naus_1
  1275. !naus:
  1276.         MOVB _MouseButton1Down,0
  1277.         MOVB _Drag_Mode,0
  1278. !naus_1:
  1279.         LEA EAX,$_qmsg
  1280.         PUSH EAX
  1281.         PUSHL _AppHandle
  1282.         MOV AL,2
  1283.         CALLDLL PMWIN,912  ;WinDispatchMsg
  1284.         ADD ESP,8
  1285.         JMP !ndis
  1286. !exdis:
  1287.      END;
  1288. END;
  1289.  
  1290. PROCEDURE TApplication.InsertResources(Menu,Accel,Icon:BOOLEAN);
  1291. BEGIN
  1292.      HasMenu:=Menu;
  1293.      HasAccel:=Accel;
  1294.      HasIcon:=Icon;
  1295. END;
  1296.  
  1297. PROCEDURE TApplication.StatusBarInsertItem(id:WORD;x,y,cx,cy:LONGWORD);
  1298. VAR
  1299.    dummy:PStatusBarInterior;
  1300. BEGIN
  1301.      IF StatusBarInterior=NIL THEN
  1302.      BEGIN
  1303.           New(StatusBarInterior);
  1304.           dummy:=StatusBarInterior;
  1305.      END
  1306.      ELSE
  1307.      BEGIN
  1308.           dummy:=StatusBarInterior;
  1309.           WHILE dummy^.Next<>NIL do dummy:=dummy^.next;
  1310.           new(dummy^.next);
  1311.           dummy:=dummy^.next;
  1312.      END;
  1313.      dummy^.id:=id;
  1314.      dummy^.x:=x;
  1315.      dummy^.y:=y;
  1316.      dummy^.cx:=cx;
  1317.      dummy^.cy:=cy;
  1318.      dummy^.item:='';
  1319.      dummy^.Next:=NIL;
  1320.      dummy^.Col:=-1;  {Black}
  1321. END;
  1322.  
  1323. PROCEDURE TApplication.SetMenuState(id:WORD;State:BOOLEAN);
  1324. VAR
  1325.    HwndMenu:HWND;
  1326.    w,w1:WORD;
  1327.    p,p1:POINTER;
  1328. BEGIN
  1329.      HwndMenu:=WinWindowFromID($8005{FID_MENU},FrameHandle);
  1330.      p:=MPFROM2SHORT(id,1);
  1331.      w:=$4000;  {Bitmaske MIA_Disabled}
  1332.      IF State=FALSE THEN w1:=$4000 {Disabled}
  1333.      ELSE w1:=0;  {Enabled}
  1334.      p1:=MPFROM2SHORT(w,w1);
  1335.      WinSendMsg(p1,p,$0192{MM_SETITEMATTR},HwndMenu);
  1336. END;
  1337.  
  1338. PROCEDURE TApplication.ToolBarInsertControl(id,x,y,cx,cy,flag,class:LONGWORD;
  1339.                                             title:STRING);
  1340. VAR
  1341.     Win:HWND;
  1342.     dummy:PToolBarInterior;
  1343. BEGIN
  1344.      Win:=WinCreateWindow(NIL,NIL,id,HWND_TOP,ClientHandle,cy,cx,y,x,Flag,
  1345.                      title,class,ClientHandle);
  1346.      IF ToolBarInterior=NIL THEN
  1347.      BEGIN
  1348.           New(ToolBarInterior);
  1349.           dummy:=ToolBarInterior;
  1350.      END
  1351.      ELSE
  1352.      BEGIN
  1353.           dummy:=ToolBarInterior;
  1354.           WHILE dummy^.Next<>NIL do dummy:=dummy^.next;
  1355.           new(dummy^.next);
  1356.           dummy:=dummy^.next;
  1357.      END;
  1358.      dummy^.Win:=Win;
  1359.      dummy^.id:=id;
  1360.      dummy^.x:=x;
  1361.      dummy^.y:=y;
  1362.      dummy^.cx:=cx;
  1363.      dummy^.cy:=cy;
  1364.      dummy^.Next:=NIL;
  1365. END;
  1366.  
  1367.  
  1368. PROCEDURE TApplication.ToolBarInsertButton(id,res,x,y,cx,cy:LONGWORD);
  1369. VAR title:string;
  1370.     fr,class:LONGWORD;
  1371.     flag:LONGWORD;
  1372. BEGIN
  1373.      IF res<>0 THEN title:='#'+tostr(res)
  1374.      ELSE title:='';
  1375.      fr:=0;
  1376.      Class:=$ffff0003;
  1377.      IF res=0 THEN Flag:=0  {No icon}
  1378.      ELSE Flag:=$0840;
  1379.      ToolBarInsertControl(id,x,y,cx,cy,Flag,Class,title);
  1380. END;
  1381.  
  1382. PROCEDURE TApplication.CreateToolBar(Size:WORD);
  1383. BEGIN
  1384.      ToolBarSize:=Size;
  1385. END;
  1386.  
  1387. PROCEDURE TApplication.CreateLeftToolBar(Size:WORD);
  1388. BEGIN
  1389.      LeftToolBarSize:=Size;
  1390. END;
  1391.  
  1392. PROCEDURE TApplication.CreateRightToolBar(Size:WORD);
  1393. BEGIN
  1394.      RightToolBarSize:=Size;
  1395. END;
  1396.  
  1397. PROCEDURE TApplication.InsertMenuHelp(StatusID,MenuID:WORD;
  1398.                                     HelpText:String;Col:LONGWORD);
  1399. VAR
  1400.    dummy:PMenuHelpItems;
  1401. BEGIN
  1402.      IF MenuHelpItems=NIL THEN
  1403.      BEGIN
  1404.           New(MenuHelpItems);
  1405.           dummy:=MenuHelpItems;
  1406.      END
  1407.      ELSE
  1408.      BEGIN
  1409.           dummy:=MenuHelpItems;
  1410.           WHILE dummy^.Next<>NIL DO dummy:=dummy^.next;
  1411.           New(dummy^.Next);
  1412.           dummy:=dummy^.Next;
  1413.      END;
  1414.      dummy^.StatusID:=StatusID;
  1415.      dummy^.MenuID:=MenuID;
  1416.      dummy^.Col:=Col;
  1417.      dummy^.HelpText:=Helptext;
  1418.      dummy^.Next:=NIL;
  1419. END;
  1420.  
  1421. PROCEDURE TApplication.CreateStatusBar(Size:WORD);
  1422. VAR Title:STRING;
  1423.     fr:LONGWORD;
  1424.     _swp:SWP;
  1425. BEGIN
  1426.      StatusBarSize:=Size;
  1427. END;
  1428.  
  1429. PROCEDURE TApplication.AppCreateNotify(AppFrWin,AppWin:HWND);
  1430. BEGIN
  1431.      WinSetWindowPos(SWP_SPEED,WinCY,WinCX,WinY,WinX,HWND_TOP,AppFrWin);
  1432. END;
  1433.  
  1434. PROCEDURE TApplication.AppRunNotify(AppFrWin:HWND);
  1435. BEGIN
  1436. END;
  1437.  
  1438. PROCEDURE TApplication.HandleCommand(Win:HWND;command:WORD);
  1439. VAR Msg:TMessage;
  1440. BEGIN
  1441.      Inherited.HandleCommand(Win,command);
  1442.      CASE command OF
  1443.          CM_HELPONHELP:IF HelpWindow<>0 THEN
  1444.                 WinSendMsg(NIL,NIL,HM_DISPLAY_HELP,HelpWindow);
  1445.          CM_EXTENDEDHELP:IF HelpWindow<>0 THEN
  1446.                 WinSendMsg(NIL,NIL,HM_EXT_HELP,HelpWindow);
  1447.          CM_KEYSHELP:IF HelpWindow<>0 THEN
  1448.                 WinSendMsg(NIL,NIL,HM_KEYS_HELP,HelpWindow);
  1449.          CM_HELPINDEX:IF HelpWindow<>0 THEN
  1450.                 WinSendMsg(NIL,NIL,HM_HELP_INDEX,HelpWindow);
  1451.          CM_HELPCONTENTS:IF HelpWindow<>0 THEN
  1452.                 WinSendMsg(NIL,NIL,HM_HELP_CONTENTS,HelpWindow);
  1453.          CM_QUIT:
  1454.          BEGIN
  1455.               Msg.Win:=Win;
  1456.               Msg.Message:=WM_CLOSE;
  1457.               WMClose(Msg);
  1458.          END;
  1459.      END; {case}
  1460. END;
  1461.  
  1462. PROCEDURE DesktopHandler(para2,para1:POINTER;Msg,Win:LONGWORD);ASM;
  1463. BEGIN
  1464.      ASM
  1465.         PUSH EBP
  1466.         MOV EBP,ESP
  1467.         SUB ESP,2
  1468.         ;Save parameters as it is SYSTEM Calling Convention
  1469.         PUSH EDI
  1470.         PUSH ESI
  1471.         PUSH EBX
  1472.  
  1473.         MOVW [EBP-2],0   ;Not Handled
  1474.         PUSHL $Win
  1475.         PUSHL $Msg
  1476.         PUSHL $para1
  1477.         PUSHL $para2
  1478.         LEA EAX,[EBP-2]
  1479.         PUSH EAX
  1480.  
  1481.         PUSHL 0             ;Get VMT pointer
  1482.         PUSHL $Win
  1483.         MOV AL,2
  1484.         CALLDLL PMWIN,843   ;QueryWindowUlong
  1485.         ADD ESP,8
  1486.         MOV EDI,EAX
  1487.         PUSH EDI         ;VMT Pointer
  1488.         MOV EDI,[EDI+0]  ;get VMT pointer for DesktopHandleEvent
  1489.         ADD EDI,8
  1490.         db ffh,17h       ;CALL NEAR32 [EDI+0] --> in Methode springen
  1491.         MOV BL,[EBP-2]
  1492.         CMP BL,0
  1493.         JNE !hh1
  1494.         ;not handled
  1495.         ;Default Window handler
  1496.         PUSHL $para2
  1497.         PUSHL $para1
  1498.         PUSHL $msg
  1499.         PUSHL $win
  1500.         MOV AL,4
  1501.         CALLDLL PMWin,911   ;WinDefWindowProc
  1502.         ADD ESP,16
  1503. !hh1:
  1504.         ;Get registers as it is SYSTEM calling convention
  1505.         POP EBX
  1506.         POP ESI
  1507.         POP EDI
  1508.         LEAVE
  1509.         RETN32
  1510.      END;
  1511. END;
  1512.  
  1513.  
  1514. PROCEDURE TApplication.SetupMenu(Frame,Client:HWND);
  1515. BEGIN
  1516. END;
  1517.  
  1518.  
  1519. PROCEDURE TApplication.Run(id:LONGWORD;Title:String;Col,BCol:LONGINT);
  1520. VAR fr:LONGWORD;
  1521.     ti:string;
  1522.     p:POINTER;
  1523.     HelpInit:THelpInit;
  1524.     _swp:SWP;
  1525.     _hps:HPS;
  1526.     rc:RECTL;
  1527. BEGIN
  1528.      WindowID:=Id;
  1529.      ChildIconRes:=Id;
  1530.      fr:=FCF_SIMPLE;
  1531.      IF HasMenu THEN fr:=fr OR FCF_MENU;
  1532.      IF HasIcon THEN fr:=fr OR FCF_ICON;
  1533.      IF HasAccel THEN fr:=fr OR FCF_ACCELTABLE;
  1534.      CreateWindow(HWND_DESKTOP,0,fr,TWindowClass,Title,0,0,WindowID);
  1535.      ForeColor:=Col;
  1536.      BackColor:=BCol;
  1537.      AppWinHandle:=ClientHandle;
  1538.      AppWinFrameHandle:=FrameHandle;
  1539.  
  1540.      fr:=0;
  1541.      DesktopFrameHandle:=WinCreateStdWindow(ClientHandle,0,fr,
  1542.                                             TDesktopWindowClass,Title,
  1543.                                             0,0,0,DesktopClientHandle);
  1544.      WinSetWindowULong(LONGWORD(SELF),0,DesktopClientHandle); {VMT pointer}
  1545.      WinSubClassWindow(@DesktopHandler,DesktopClientHandle);
  1546.      HelpWindow:=0;
  1547.      IF HasHelp THEN
  1548.      BEGIN
  1549.           p:=@helptitle;
  1550.           inc(p);
  1551.           HelpInit.pszHelpWindowTitle:=p;
  1552.           p:=@HelpFileName;
  1553.           inc(p);
  1554.           HelpInit.pszHelpLibraryName:=p;
  1555.           HelpInit.cb:=sizeof(THelpInit);
  1556.           HelpInit.ulReturnCode:=0;
  1557.           HelpInit.pszTutorialname:=NIL;
  1558.           HelpInit.phtHelptable:=$FFFF0000 OR WindowID;
  1559.           HelpInit.hmodHelptableModule:=0;
  1560.           HelpInit.hmodAccelActionBarModule:=0;
  1561.           HelpInit.idAcceltable:=0;
  1562.           HelpInit.idActionBar:=0;
  1563.           HelpInit.fShowPanelID:=1;
  1564.           HelpWindow:=WinCreateHelpInstance(HelpInit,Apphandle);
  1565.  
  1566.           IF HelpWindow<>0 THEN
  1567.           BEGIN
  1568.                WinAssociateHelpInstance(FrameHandle,HelpWindow);
  1569.           END
  1570.           ELSE ErrorBox(MB_ICONHAND,'Application failed to initialize help');
  1571.      END;
  1572.  
  1573.      AppCreateNotify(FrameHandle,ClientHandle);
  1574.      SetupMenu(FrameHandle,ClientHandle);
  1575.      WindowToTop(FrameHandle);
  1576.      GetMaxAppWindow(_swp);
  1577.      WinSetWindowPos(SWP_SPEED,_swp.cy,_swp.cx,_swp.y,_swp.x,HWND_TOP,
  1578.                      DesktopFrameHandle);
  1579.      _hps:=WinGetPS(ClientHandle);
  1580.      WinQueryWindowRect(rc,ClientHandle);
  1581.      IF ToolBarSize>0 THEN RedrawToolBar(rc,_hps);
  1582.      IF StatusBarSize>0 THEN RedrawStatusBar(rc,_hps);
  1583.      IF LeftToolBarSize>0 THEN RedrawLeftToolBar(rc,_hps);
  1584.      IF RightToolBarSize>0 THEN RedrawRightToolBar(rc,_hps);
  1585.      WinReleasePS(_hps);
  1586.      AppRunNotify(ClientHandle);
  1587.      MainMessageLoop;
  1588.      WinDestroyWindow(FrameHandle);
  1589. END;
  1590.  
  1591. PROCEDURE TApplication.StatusBarSetText(id:WORD;item:STRING;
  1592.                                               Col:LONGINT);
  1593. VAR
  1594.    dummy:PStatusBarInterior;
  1595.    FaceName:String;
  1596.    _hps:HPS;
  1597.    rc:rectl;
  1598.    pt:POINTL;
  1599. BEGIN
  1600.      dummy:=StatusBarInterior;
  1601.      WHILE dummy<>NIL DO
  1602.      BEGIN
  1603.           IF dummy^.id=id THEN
  1604.           BEGIN
  1605.                dummy^.Col:=Col;
  1606.                IF dummy^.item=item THEN exit;
  1607.                dummy^.item:=item;
  1608.                _hps:=WinGetPS(ClientHandle);
  1609.                facename:='Helv';
  1610.                CreateLogFont(_hps,facename,13,5,0); {default font}
  1611.                GpiSetBackMix(2,_hps);  {BM_OverPaint}
  1612.                rc.xleft:=dummy^.x+2;
  1613.                rc.yBottom:=dummy^.y+2;
  1614.                rc.xright:=dummy^.x+dummy^.cx;
  1615.                dec(rc.xright,2);
  1616.                rc.yTop:=dummy^.y+dummy^.cy;
  1617.                dec(rc.ytop,2);
  1618.                WinFillRect(15,rc,_hps);
  1619.                pt.x:=dummy^.x+2;
  1620.                pt.y:=dummy^.y+4;
  1621.                IF dummy^.item<>'' THEN DrawStringXY(_hps,pt,dummy^.item,
  1622.                            1,length(dummy^.item),dummy^.Col,15);
  1623.                WinReleasePS(_hps);
  1624.                exit;
  1625.           END;
  1626.           dummy:=dummy^.next;
  1627.      END;
  1628. END;
  1629.  
  1630. PROCEDURE TApplication.DesktopRedraw(rc:RECTL;_hps:HPS;Win:HWND);
  1631. BEGIN
  1632.      WinFillRect(BackColor,rc,_hps);
  1633. END;
  1634.  
  1635. PROCEDURE TApplication.DesktopEraseBackGround(Win:HWND;rc:RECTL;_hps:HPS);
  1636. BEGIN
  1637.      WinFillRect(BackColor,rc,_hps);
  1638. END;
  1639.  
  1640. PROCEDURE TApplication.RedrawToolBar(rc:RECTL;_hps:HPS);
  1641. VAR
  1642.    _swp:swp;
  1643.    dummy:PToolBarInterior;
  1644.    ypos,xpos:LONGWORD;
  1645. BEGIN
  1646.      rc.yBottom:=rc.yTop-ToolBarSize;
  1647.      WinFillRect(15,rc,_hps);
  1648.      WinDrawBorder($800,-2,8,1,1,rc,_hps);
  1649.  
  1650.      GetMaxDesktopWindow(_swp);
  1651.      ypos:=_swp.y+_swp.cy+StatusBarSize;
  1652.      xpos:=_swp.x;
  1653.      dummy:=ToolBarInterior;
  1654.      WHILE dummy<>NIL DO
  1655.      BEGIN
  1656.          WinSetWindowPos(SWP_ACT,dummy^.CY,dummy^.CX,ypos+dummy^.Y,
  1657.                          xpos+dummy^.X,HWND_TOP,dummy^.Win);
  1658.          dummy:=dummy^.next;
  1659.      END;
  1660. END;
  1661.  
  1662. PROCEDURE TApplication.RedrawLeftToolBar(rc:RECTL;_hps:HPS);
  1663. VAR
  1664.    _swp:swp;
  1665.    dummy:PToolBarInterior;
  1666.    ypos,xpos:LONGWORD;
  1667. BEGIN
  1668.      dec(rc.yTop,ToolBarSize);
  1669.      inc(rc.yBottom,StatusBarSize);
  1670.      rc.xright:=rc.xleft+LeftToolBarSize;
  1671.      WinFillRect(15,rc,_hps);
  1672.      WinDrawBorder($800,-2,8,1,1,rc,_hps);
  1673.  
  1674.      {GetMaxDesktopWindow(_swp);
  1675.      ypos:=_swp.y+_swp.cy+StatusBarSize;
  1676.      xpos:=_swp.x;
  1677.      dummy:=ToolBarInterior;
  1678.      WHILE dummy<>NIL DO
  1679.      BEGIN
  1680.          WinSetWindowPos(SWP_ACT,dummy^.CY,dummy^.CX,ypos+dummy^.Y,
  1681.                          xpos+dummy^.X,HWND_TOP,dummy^.Win);
  1682.          dummy:=dummy^.next;
  1683.      END;}
  1684. END;
  1685.  
  1686. PROCEDURE TApplication.RedrawRightToolBar(rc:RECTL;_hps:HPS);
  1687. VAR
  1688.    _swp:swp;
  1689.    dummy:PToolBarInterior;
  1690.    ypos,xpos:LONGWORD;
  1691. BEGIN
  1692.      dec(rc.yTop,ToolBarSize);
  1693.      inc(rc.yBottom,StatusBarSize);
  1694.      rc.xleft:=rc.xright-RightToolBarSize;
  1695.      WinFillRect(15,rc,_hps);
  1696.      WinDrawBorder($800,-2,8,1,1,rc,_hps);
  1697.  
  1698.      {GetMaxDesktopWindow(_swp);
  1699.      ypos:=_swp.y+_swp.cy+StatusBarSize;
  1700.      xpos:=_swp.x;
  1701.      dummy:=ToolBarInterior;
  1702.      WHILE dummy<>NIL DO
  1703.      BEGIN
  1704.          WinSetWindowPos(SWP_ACT,dummy^.CY,dummy^.CX,ypos+dummy^.Y,
  1705.                          xpos+dummy^.X,HWND_TOP,dummy^.Win);
  1706.          dummy:=dummy^.next;
  1707.      END;}
  1708. END;
  1709.  
  1710. PROCEDURE TApplication.RedrawStatusBar(rc:RECTL;_hps:HPS);
  1711. VAR
  1712.    dummy:PStatusBarInterior;
  1713.    facename:STRING;
  1714.    pt:POINTL;
  1715. BEGIN
  1716.      rc.yTop:=rc.yBottom+StatusBarSize;
  1717.      WinFillRect(15,rc,_hps);
  1718.      WinDrawBorder($800,-2,8,1,1,rc,_hps);
  1719.      facename:='Helv';
  1720.      CreateLogFont(_hps,facename,13,5,0); {default font}
  1721.      GpiSetBackMix(2,_hps);  {BM_OverPaint}
  1722.      dummy:=StatusBarInterior;
  1723.      WHILE dummy<>NIL DO
  1724.      BEGIN
  1725.           rc.xleft:=dummy^.x;
  1726.           rc.yBottom:=dummy^.y;
  1727.           rc.xright:=dummy^.x+dummy^.cx;
  1728.           rc.yTop:=dummy^.y+dummy^.cy;
  1729.           WinDrawBorder($800,-2,8,1,1,rc,_hps);
  1730.           pt.x:=dummy^.x+2;
  1731.           pt.y:=dummy^.y+4;
  1732.           IF dummy^.item<>'' THEN DrawStringXY(_hps,pt,dummy^.item,
  1733.                              1,length(dummy^.item),dummy^.Col,15);
  1734.           dummy:=dummy^.next;
  1735.      END;
  1736. END;
  1737.  
  1738. PROCEDURE TApplication.Redraw(rc:RECTL;_hps:HPS;Win:HWND);
  1739. VAR
  1740.     maxy,miny:LONGINT;
  1741.     _swp:SWP;
  1742. BEGIN
  1743.      Inherited.Redraw(rc,_hps,Win);
  1744.      GetMaxAppWindow(_swp);
  1745.      rc.xLeft:=_swp.x;
  1746.      rc.xright:=_swp.x+_swp.cx+LeftToolBarSize;
  1747.      rc.yBottom:=_swp.y;
  1748.      rc.yTop:=_swp.y+_swp.cy;
  1749.      WinQueryWindowRect(rc,Win);
  1750.      WinFillRect(BackColor,rc,_hps);
  1751.  
  1752.      WinQueryWindowRect(rc,ClientHandle);
  1753.      IF ToolBarSize>0 THEN RedrawToolBar(rc,_hps);
  1754.      IF StatusBarSize>0 THEN RedrawStatusBar(rc,_hps);
  1755.      IF LeftToolBarSize>0 THEN RedrawLeftToolBar(rc,_hps);
  1756.      IF RightToolBarSize>0 THEN RedrawRightToolBar(rc,_hps);
  1757. END;
  1758.  
  1759. FUNCTION TApplication.DesktopHandleEvent(Win:HWND;Msg:LONGWORD;
  1760.                                      para1,para2:POINTER;
  1761.                                      VAR Handled:BOOLEAN):LONGWORD;
  1762. VAR
  1763.     H:Boolean;
  1764.     _hps:HPS;
  1765.     r:LONGWORD;
  1766.     command:WORD;
  1767.     rc:RECTL;
  1768.     w,w1:Word;
  1769.     b:WORD;
  1770.     ch:char;
  1771. label l,l1;
  1772. BEGIN
  1773.       r:=Inherited.DesktopHandleEvent(Win,Msg,para1,para2,handled);
  1774.       H:=TRUE;
  1775.       CASE Msg OF
  1776.           WM_ERASEBACKGROUND:
  1777.           BEGIN
  1778.                _hps:=WinBeginPaint(rc,0,Win);
  1779.                DesktopRedraw(rc,_hps,Win);
  1780.                WinEndPaint(_hps);
  1781.                H:=FALSE;
  1782.           END;
  1783.           WM_PAINT:
  1784.           BEGIN
  1785.                _hps:=WinBeginPaint(rc,0,Win);
  1786.                DesktopRedraw(rc,_hps,Win);
  1787.                WinEndPaint(_hps);
  1788.           END;
  1789.           ELSE IF not Handled THEN H:=FALSE;
  1790.       END;
  1791. l1:
  1792.       Handled:=H;
  1793.       DesktopHandleEvent:=r;
  1794. END;
  1795.  
  1796. PROCEDURE TApplication.InsertHelp(Filename,WindowTitle:String);
  1797. BEGIN
  1798.      HasHelp:=TRUE;
  1799.      HelpFileName:=FileName;
  1800.      HelpTitle:=Windowtitle;
  1801. END;
  1802.  
  1803.  
  1804.  
  1805.  
  1806.  
  1807.  
  1808.  
  1809. {*************************************************************************
  1810. *                                                                        *
  1811. *                      Methods for TMDIApplication                       *
  1812. *                                                                        *
  1813. **************************************************************************}
  1814.  
  1815. CONSTRUCTOR TMDIApplication.Init;
  1816. BEGIN
  1817.      Inherited.Init;
  1818.      ChildCount:=0;
  1819.      ActiveChild:=0;
  1820.      MinimizedCount:=0;
  1821. END;
  1822.  
  1823. DESTRUCTOR TMDIApplication.Done;
  1824. BEGIN
  1825. END;
  1826.  
  1827. PROCEDURE TMDIApplication.AppRunNotify(AppFrWin:HWND);
  1828. BEGIN
  1829.      Inherited.AppRunNotify(AppFrWin);
  1830.      SetMenuState(CM_TILE,FALSE);
  1831.      SetMenuState(CM_CASCADE,FALSE);
  1832.      SetMenuState(CM_CLOSE,FALSE);
  1833.      SetMenuState(CM_CLOSEALL,FALSE);
  1834.      SetMenuState(CM_NEXT,FALSE);
  1835.      SetMenuState(CM_LIST,FALSE);
  1836. END;
  1837.  
  1838.  
  1839. PROCEDURE TMDIApplication.TileWindows;
  1840. VAR
  1841.     Buf:PSWPBUF;
  1842.     Square,Rows,Columns,ExtraCols,Width,Height:LONGWORD;
  1843.     rec:RECTL;
  1844.     Child:HWND;
  1845.     _hEnum:LONGWORD;
  1846.     CurRow,CurCol:LONGWORD;
  1847.     ChildCnt:LONGWORD;
  1848.     t:LONGWORD;
  1849.     Win:HWND;
  1850.     TotalCount:BYTE;
  1851. LABEL l;
  1852. BEGIN
  1853.      TotalCount:=0;
  1854.      Win:=DesktopClientHandle;
  1855.      Square:=2;
  1856.      ChildCnt:=ChildCount-MinimizedCount;
  1857.      IF ChildCnt=0 THEN exit;
  1858.      WHILE Square*2<=ChildCnt DO inc(Square);
  1859.      IF ChildCnt=3 THEN Square:=3;
  1860.  
  1861.      Columns:=Square-1;
  1862.      Rows:=ChildCnt DIV Columns;
  1863.      ExtraCols:=ChildCnt MOD Columns;
  1864.  
  1865.      WinQueryWindowRect(rec,Win);
  1866.      IF rec.xRight>0 THEN IF rec.yBottom<rec.yTop THEN
  1867.      BEGIN
  1868.           _hEnum:=WinBeginEnumWindows(Win);
  1869.           Child:=WinGetNextWindow(_hEnum);
  1870.           IF Child<>0 THEN
  1871.           BEGIN
  1872.                GetMem(Buf,sizeof(TSWPBUF)*ChildCount);
  1873.                ChildCnt:=0;
  1874.                Height:=(rec.yTop-rec.yBottom) div Rows;
  1875.  
  1876.                FOR CurRow:=0 TO Rows-1 DO
  1877.                BEGIN
  1878.                     IF Rows-CurRow<=ExtraCols THEN inc(Columns);
  1879.                     FOR CurCol:=0 TO Columns-1 DO
  1880.                     BEGIN
  1881.                          Width:=rec.xRight div Columns;
  1882.  
  1883.                          {Skip minimized Windows}
  1884. l:
  1885.                          IF ((IsWindowMinimized(Child)))
  1886.                          {OR (WinQueryWindowUShort(QWS_ID,Child)=0))} THEN
  1887.                          BEGIN
  1888.                               Child:=WinGetNextWindow(_hEnum);
  1889.                               If Child<>0 THEN goto l;
  1890.                          END;
  1891.  
  1892.                          IF Child<>0 THEN
  1893.                          BEGIN
  1894.                               inc(TotalCount);
  1895.                               IF IsWindowMaximized(Child) THEN
  1896.                                Buf^[ChildCnt].fl:=SWP_SPEED OR SWP_RESTORE
  1897.                               ELSE Buf^[ChildCnt].fl:=SWP_SPEED;
  1898.                               buf^[ChildCnt].x:=Width*CurCol;
  1899.                               buf^[ChildCnt].y:=rec.yTop-(Height*(CurRow+1));
  1900.                               buf^[ChildCnt].cx:=Width;
  1901.                               buf^[ChildCnt].cy:=Height;
  1902.                               buf^[ChildCnt].ahwnd:=Child;
  1903.                               inc(ChildCnt);
  1904.  
  1905.                               Child:=WinGetNextWindow(_hEnum);
  1906.                          END;
  1907.                     END;
  1908.                     IF Rows-CurRow<=ExtraCols THEN
  1909.                     BEGIN
  1910.                          dec(Columns);
  1911.                          dec(ExtraCols);
  1912.                     END;
  1913.                END;
  1914.  
  1915.                WinEndEnumWindows(_HEnum);
  1916.                IF TotalCount>0 THEN WinSetMultWindowPos(TotalCount,
  1917.                                                         Buf^[0],AppHandle);
  1918.                FreeMem(Buf,sizeof(TSWPBUF)*ChildCount);
  1919.           END;
  1920.  
  1921.      END;
  1922. END;
  1923.  
  1924. PROCEDURE TMDIApplication.CascadeWindows;
  1925. VAR Next:HWND;
  1926.     Count:LONGWORD;
  1927.     Buf:PLONGBUF;
  1928.     t:LONGWORD;
  1929.     _swp:SWP;
  1930.     XDiv,YDiv:LONGWORD;
  1931.     Frame:HWND;
  1932.     Win:HWND;
  1933. BEGIN
  1934.      Win:=DesktopClientHandle;
  1935.      If ChildCount-MinimizedCount=0 THEN exit;
  1936.      XDiv:=WinQuerySysValue(SV_CXSIZEBORDER,HWND_DESKTOP);
  1937.      XDiv:=XDiv+WinQuerySysValue(SV_CXMINMAXBUTTON,HWND_DESKTOP) DIV 2;
  1938.  
  1939.      YDiv:=WinQuerySysValue(SV_CYSIZEBORDER,HWND_DESKTOP);
  1940.      YDiv:=YDiv+WinQuerySysValue(SV_CYMINMAXBUTTON,HWND_DESKTOP);
  1941.      Next:=WinQueryWindow(QW_TOP,Win);
  1942.      if Next=0 THEN exit;
  1943.      Count:=0;
  1944.      GetMem(Buf,4*ChildCount);
  1945.      WHILE ((Next<>0)AND(Count<ChildCount)) DO
  1946.      BEGIN
  1947.           IF ((not IsWindowMinimized(Next))){AND
  1948.              (WinQueryWindowUShort(QWS_ID,Next)<>0))}
  1949.           THEN
  1950.           BEGIN
  1951.                Buf^[Count]:=Next;
  1952.                Inc(Count);
  1953.           END;
  1954.           Next:=WinQueryWindow(QW_NEXT,Next);
  1955.      END;
  1956.      GetMaxDesktopWindow(_swp);
  1957.      FOR t:=0 TO Count-1 DO
  1958.      BEGIN
  1959.           WinSetWindowPos(SWP_SPEED,_swp.cy,_swp.cx,_swp.y,_swp.x,0,
  1960.                           Buf^[t]);
  1961.           inc(_swp.x,XDiv);
  1962.           dec(_swp.cx,XDiv);
  1963.           dec(_swp.cy,YDiv);
  1964.      END;
  1965.      FreeMem(Buf,4*ChildCount);
  1966. END;
  1967.  
  1968. PROCEDURE TMDIApplication.InvalidateMDIWindow(Win:HWND);
  1969. BEGIN
  1970.      WinInvalidateRect(1,NIL,Win);
  1971. END;
  1972.  
  1973. PROCEDURE TMDIApplication.NextWindow;
  1974. VAR Next:HWND;
  1975.     AcFrame:HWND;
  1976.     f:LONGWORD;
  1977. BEGIN
  1978.      Next:=WinQueryWindow(QW_PARENT,ActiveChild);
  1979.      AcFrame:=Next;
  1980.      Next:=WinQueryWindow(QW_NEXT,Next);
  1981.      WHILE ((Next<>0)AND(WinQueryWindowUShort(QWS_ID,Next)=0)) DO
  1982.        Next:=WinQueryWindow(QW_NEXT,Next);
  1983.      IF Next<>0 THEN
  1984.      BEGIN
  1985.            WinSetWindowPos(SWP_ZORDER or SWP_ACTIVATE,0,0,0,0,HWND_TOP,
  1986.                            Next);
  1987.            IF IsWindowMaximized(AcFrame) THEN f:=SWP_RESTORE OR SWP_ZORDER
  1988.            ELSE f:=SWP_ZORDER;
  1989.            WinSetWindowPos(f,0,0,0,0,HWND_BOTTOM,AcFrame);
  1990.      END;
  1991. END;
  1992.  
  1993. PROCEDURE TMDIApplication.CloseAllWindows;
  1994. VAR Child:HWND;
  1995.     _hEnum:LONGWORD;
  1996.     Win:HWND;
  1997. BEGIN
  1998.      Win:=DesktopClientHandle;
  1999.      _hEnum:=WinBeginEnumWindows(Win);
  2000.      Child:=WinGetNextWindow(_HEnum);
  2001.      WHILE Child<>0 DO
  2002.      BEGIN
  2003.            WinSendMsg(NIL,NIL,WM_CLOSE,Child);
  2004.            {WinDestroyWindow(Child);}
  2005.            Child:=WinGetNextWindow(_HEnum);
  2006.      END;
  2007.      WinEndEnumWindows(_HEnum);
  2008.      ChildCount:=0;
  2009.      ActiveChild:=0;
  2010. END;
  2011.  
  2012. PROCEDURE TMDIApplication.HandleCommand(Win:HWND;command:WORD);
  2013. BEGIN
  2014.      Inherited.HandleCommand(Win,command);
  2015.      IF ChildCount>0 THEN
  2016.      BEGIN
  2017.           CASE command OF
  2018.              CM_CLOSE:WinSendMsg(NIL,NIL,WM_CLOSE,ActiveChild);
  2019.              CM_CASCADE:CascadeWindows;
  2020.              CM_TILE:TileWindows;
  2021.              CM_CLOSEALL:CloseAllWindows;
  2022.              CM_Next:NextWindow;
  2023.          END; {case}
  2024.      END;
  2025. END;
  2026.  
  2027. PROCEDURE TMDIApplication.WMClose(VAR Msg:TMessage);
  2028. BEGIN
  2029.      CloseAllWindows;
  2030.      Inherited.WMClose(Msg);
  2031. END;
  2032.  
  2033. PROCEDURE TMDIApplication.WMSize(VAR Msg:TMessage);
  2034. BEGIN
  2035.      Inherited.WMSize(Msg);
  2036.      {IF ChildCount>0 THEN TileWindows;}
  2037. END;
  2038.  
  2039. FUNCTION TMDIApplication.HandleEvent(Win:HWND;Msg:LONGWORD;
  2040.                              para1,para2:POINTER;
  2041.                              VAR Handled:BOOLEAN):LONGWORD;
  2042. VAR
  2043.     H:Boolean;
  2044.     _hps:HPS;
  2045.     r:LONGWORD;
  2046.     w,w1:WORD;
  2047.     b:WORD;
  2048.     ch:CHAR;
  2049.     rc:RECTL;
  2050.     command:WORD;
  2051. BEGIN
  2052.       r:=Inherited.HandleEvent(Win,msg,para1,para2,Handled);
  2053.       r:=0;
  2054.       IF not Handled THEN H:=FALSE;
  2055.       Handled:=H;
  2056.       HandleEvent:=r;
  2057. END;
  2058.  
  2059. PROCEDURE MDIMessageHandler(para2,para1:POINTER;Msg,Win:LONGWORD);ASM;
  2060. BEGIN
  2061.      ASM
  2062.         PUSH EBP
  2063.         MOV EBP,ESP
  2064.         SUB ESP,2
  2065.         ;Save parameters as it is SYSTEM Calling Convention
  2066.         PUSH EDI
  2067.         PUSH ESI
  2068.         PUSH EBX
  2069.  
  2070.         MOVW [EBP-2],0   ;Not Handled
  2071.         PUSHL $Win
  2072.         PUSHL $Msg
  2073.         PUSHL $para1
  2074.         PUSHL $para2
  2075.         LEA EAX,[EBP-2]
  2076.         PUSH EAX
  2077.  
  2078.         PUSHL 4             ;Get Extra pointer
  2079.         PUSHL $Win
  2080.         MOV AL,2
  2081.         CALLDLL PMWIN,843   ;QueryWindowUlong
  2082.         ADD ESP,8
  2083.         PUSH EAX            ;Extra
  2084.  
  2085.         PUSHL 0             ;Get VMT pointer
  2086.         PUSHL $Win
  2087.         MOV AL,2
  2088.         CALLDLL PMWIN,843   ;QueryWindowUlong
  2089.         ADD ESP,8
  2090.         MOV EDI,EAX
  2091.         PUSH EDI         ;VMT Pointer
  2092.         MOV EDI,[EDI+0]  ;get VMT pointer for MDIHandleEvent
  2093.         ADD EDI,4
  2094.  
  2095.         db ffh,17h       ;CALL NEAR32 [EDI+0] --> in Methode springen
  2096.         MOV BL,[EBP-2]
  2097.         CMP BL,0
  2098.         JNE !hh_1
  2099.         ;not handled
  2100.         ;Default Window handler
  2101.         PUSHL $para2
  2102.         PUSHL $para1
  2103.         PUSHL $msg
  2104.         PUSHL $win
  2105.         MOV AL,4
  2106.         CALLDLL PMWin,911   ;WinDefWindowProc
  2107.         ADD ESP,16
  2108. !hh_1:
  2109.         ;Get registers as it is SYSTEM calling convention
  2110.         POP EBX
  2111.         POP ESI
  2112.         POP EDI
  2113.         LEAVE
  2114.         RETN32
  2115.      END;
  2116. END;
  2117.  
  2118. FUNCTION TMDIApplication.GetMDIColor(Win:HWND):LONGINT;
  2119. BEGIN
  2120.      GetMDIColor:=WinQueryWindowULong(8,Win);
  2121. END;
  2122.  
  2123. FUNCTION TMDIApplication.GetMDIBackColor(Win:HWND):LONGINT;
  2124. BEGIN
  2125.      GetMDIBackColor:=WinQueryWindowULong(12,Win);
  2126. END;
  2127.  
  2128. PROCEDURE TMDIApplication.SetMDIColor(Win:HWND;col:LONGINT);
  2129. BEGIN
  2130.      WinSetWindowULong(col,8,Win);
  2131. END;
  2132.  
  2133. PROCEDURE TMDIApplication.SetMDIBackColor(Win:HWND;bcol:LONGINT);
  2134. BEGIN
  2135.      WinSetWindowULong(bcol,12,Win);
  2136. END;
  2137.  
  2138. PROCEDURE TMDIApplication.MDIRedraw(rc:RECTL;_hps:HPS;Win:HWND;
  2139.                                            Data:POINTER);
  2140. BEGIN
  2141. END;
  2142.  
  2143. PROCEDURE TMDIApplication.MDIHandleCommand(Win:HWND;command:WORD;Data:POINTER);
  2144. BEGIN
  2145.      HandleCommand(ClientHandle,command);
  2146. END;
  2147.  
  2148.  
  2149. PROCEDURE TMDIApplication.MDIHandleScanEvent(Win:HWND;scan:WORD;Data:POINTER);
  2150. BEGIN
  2151. END;
  2152.  
  2153. PROCEDURE TMDIApplication.MDIHandleCharEvent(Win:HWND;Ch:CHAR;Data:POINTER);
  2154. BEGIN
  2155. END;
  2156.  
  2157.  
  2158. PROCEDURE TMDIApplication.MDINoMoreChilds;
  2159. BEGIN
  2160.      SetMenuState(CM_TILE,FALSE);
  2161.      SetMenuState(CM_CASCADE,FALSE);
  2162.      SetMenuState(CM_CLOSE,FALSE);
  2163.      SetMenuState(CM_CLOSEALL,FALSE);
  2164.      SetMenuState(CM_NEXT,FALSE);
  2165.      SetMenuState(CM_LIST,FALSE);
  2166. END;
  2167.  
  2168. PROCEDURE TMDIApplication.MDIWMMouseMove(Win:HWND;x,y:INTEGER;Data:POINTER);
  2169. BEGIN
  2170. END;
  2171.  
  2172. PROCEDURE TMDIApplication.MDIWMButton1Click(Win:HWND;x,y:INTEGER;Data:POINTER);
  2173. BEGIN
  2174. END;
  2175.  
  2176. PROCEDURE TMDIApplication.MDIWMButton1DoubleClick(Win:HWND;x,y:INTEGER;Data:POINTER);
  2177. BEGIN
  2178. END;
  2179.  
  2180. PROCEDURE TMDIApplication.MDIWMButton1Down(Win:HWND;x,y:INTEGER;Data:POINTER);
  2181. BEGIN
  2182. END;
  2183.  
  2184.  
  2185. PROCEDURE TMDIApplication.MDIWMEraseBackGround(Win:HWND;rc:RECTL;_hps:HPS);
  2186. VAR bcol:INTEGER;
  2187. BEGIN
  2188.      bcol:=GetMDIBackColor(Win);
  2189.      WinFillRect(bcol,rc,_hps);
  2190. END;
  2191.  
  2192.  
  2193. PROCEDURE TMDIApplication.MDIWMButton1Up(Win:HWND;x,y:INTEGER;Data:POINTER);
  2194. BEGIN
  2195. END;
  2196.  
  2197. PROCEDURE TMDIApplication.MDIWMSize(Win:HWND;Data:POINTER);
  2198. BEGIN
  2199. END;
  2200.  
  2201.  
  2202. FUNCTION TMDIApplication.MDIHandleEvent(Win:HWND;Msg:LONGWORD;para1,
  2203.                                               para2:POINTER;VAR Handled:BOOLEAN;
  2204.                                               Data:POINTER):LONGWORD;
  2205. VAR
  2206.     H:Boolean;
  2207.     _hps:HPS;
  2208.     r:LONGWORD;
  2209.     bcol:LONGINT;
  2210.     command:WORD;
  2211.     rc:RECTL;
  2212.     _pswp:PSWP;
  2213.     Frame:HWND;
  2214.     w,w1:Word;
  2215.     b:WORD;
  2216.     ch:char;
  2217.     _swp:swp;
  2218.     po:POINTS;
  2219. Label l,l1,l3;
  2220. BEGIN
  2221.       r:=0;
  2222.       H:=TRUE;
  2223.       CASE Msg OF
  2224.           WM_SIZE:
  2225.           BEGIN
  2226.                MDIWMSize(Win,Data);
  2227.                IF not handled THEN h:=FALSE;
  2228.           END;
  2229.           WM_CHAR:
  2230.           BEGIN
  2231.                r:=LONGINT(para1);
  2232.                w:=lo(r);
  2233.                IF w AND $41=1 THEN {KC_CHAR valid and KC_KEYUP}
  2234.                BEGIN
  2235.                     r:=LONGINT(para2);
  2236.                     w1:=lo(r);
  2237.                     b:=lo(w1);
  2238.                     if b<32 THEN goto l;
  2239.                     IF w and $10=$10 THEN goto l; {KC_CTRL valid}
  2240.                     ch:=chr(b);
  2241.                     InCtrlK:=FALSE;
  2242.                     MDIHandleCharEvent(Win,ch,Data);
  2243.                     goto l1;
  2244.                END
  2245.                ELSE
  2246.                BEGIN
  2247.                     IF w AND $44=4 THEN {KC_CHAR valid and KC_KEYUP}
  2248.                     BEGIN
  2249.                          w1:=hi(r);
  2250.                          b:=hi(w1);
  2251. l:
  2252.                          IF w and $10=$10 THEN {Ctrl-Taste}
  2253.                          BEGIN
  2254.                               inc(b,256); {KC_CTRL valid}
  2255.                               CASE b OF
  2256.                                  kbCtrlK:
  2257.                                  BEGIN
  2258.                                      IF InCtrlK THEN goto l3;
  2259.                                      InCtrlK:=TRUE;
  2260.                                  END
  2261.                                  ELSE
  2262.                                  BEGIN
  2263.                                      IF InCtrlK THEN
  2264.                                      BEGIN
  2265. l3:
  2266.                                           inc(b,1000);
  2267.                                      END;
  2268.                                      InCtrlK:=FALSE;
  2269.                                  END;
  2270.                               END; {Case}
  2271.                          END
  2272.                          ELSE
  2273.                          BEGIN
  2274.                               InCtrlK:=FALSE;
  2275.                               IF w AND 8=8 THEN inc(b,512) {KC_SHIFT valid}
  2276.                               ELSE IF w AND $20=$20 THEN inc(b,768); {KC_ALT valid}
  2277.                          END;
  2278.                          MDIHandleScanEvent(Win,b,Data);
  2279.                          goto l1;
  2280.                     END;
  2281.                END;
  2282.           END;
  2283.           WM_COMMAND:
  2284.           BEGIN
  2285.                command:=PointerToWord(para1);
  2286.                MDIHandleCommand(Win,command,Data);
  2287.           END;
  2288.           WM_MINMAXFRAME:
  2289.           BEGIN
  2290.                {Minimize the window ??}
  2291.                _pswp:=para1;
  2292.                IF _pswp^.fl AND SWP_MINIMIZE<>0 THEN INC(MinimizedCount)
  2293.                ELSE
  2294.                BEGIN
  2295.                     Frame:=WinQueryWindow(QW_PARENT,Win);
  2296.                     IF IsWindowMinimized(Win) THEN
  2297.                     BEGIN
  2298.                          DEC(MinimizedCount);
  2299.                          WinSetWindowUShort(-1,QWS_XMINIMIZE,Frame);
  2300.                          WinSetWindowUShort(-1,QWS_YMINIMIZE,Frame);
  2301.                     END;
  2302.                     IF _pswp^.fl AND SWP_MAXIMIZE<>0 THEN
  2303.                     BEGIN
  2304.                          IF ((ToolBarSize>0)OR(StatusBarSize>0)OR
  2305.                             (LeftToolBarSize>0)OR(RightToolBarSize>0)) THEN
  2306.                          BEGIN
  2307.                               GetMaxDesktopWindow(_swp);
  2308.                               _pswp^.cx:=_swp.cx;
  2309.                               _pswp^.cy:=_swp.cy;
  2310.                               _pswp^.x:=_swp.x;
  2311.                               _pswp^.y:=_swp.y;
  2312.                          END;
  2313.                     END;
  2314.                END;
  2315.                IF not handled THEN H:=FALSE;
  2316.           END;
  2317.           WM_ACTIVATE:
  2318.           BEGIN
  2319.                ActiveChild:=Win;
  2320.           END;
  2321.           WM_CLOSE:WMMDIClose(Win,Data);
  2322.           WM_DESTROY:
  2323.           BEGIN
  2324.                IF IsWindowMinimized(Win) THEN dec(MinimizedCount);
  2325.                dec(ChildCount);
  2326.                IF ChildCount=0 THEN
  2327.                BEGIN
  2328.                     ActiveChild:=0;
  2329.                     MDINoMoreChilds; {No more windows available}
  2330.                END;
  2331.           END;
  2332.           WM_BUTTON1CLICK:
  2333.           BEGIN
  2334.                po:=POINTS(Para1);
  2335.                MDIWMButton1Click(Win,po.x,po.y,Data);
  2336.                IF not Handled THEN H:=FALSE;
  2337.           END;
  2338.           WM_BUTTON1DBLCLK:
  2339.           BEGIN
  2340.                po:=POINTS(Para1);
  2341.                MDIWMButton1DoubleClick(Win,po.x,po.y,Data);
  2342.                IF not Handled THEN H:=FALSE;
  2343.           END;
  2344.           WM_BUTTON1DOWN:
  2345.           BEGIN
  2346.                Drag_Mode:=FALSE;
  2347.                MouseButton1Down:=TRUE;
  2348.                po:=POINTS(para1);
  2349.                MDIWMButton1Down(Win,po.x,po.y,Data);
  2350.                IF not Handled THEN H:=FALSE;
  2351.           END;
  2352.           WM_BUTTON1UP:
  2353.           BEGIN
  2354.                MouseButton1Down:=FALSE;
  2355.                Drag_Mode:=FALSE;
  2356.                po:=POINTS(para1);
  2357.                MDIWMButton1Up(Win,po.x,po.y,Data);
  2358.                IF not Handled THEN H:=FALSE;
  2359.           END;
  2360.           WM_MOUSEMOVE:
  2361.           BEGIN
  2362.                IF MouseButton1Down THEN WinSendMsg(NIL,para1,WM_MOUSEDRAG1,Win);
  2363.                po:=POINTS(para1);
  2364.                MDIWMMouseMove(Win,po.x,po.y,Data);
  2365.           END;
  2366.           WM_ERASEBACKGROUND:
  2367.           BEGIN
  2368.                _hps:=WinBeginPaint(rc,0,Win);
  2369.                MDIWMEraseBackGround(Win,rc,_hps);
  2370.                MDIRedraw(rc,_hps,Win,Data);
  2371.                WinEndPaint(_hps);
  2372.                H:=FALSE;
  2373.           END;
  2374.           WM_PAINT:
  2375.           BEGIN
  2376.                _hps:=WinBeginPaint(rc,0,Win);
  2377.                MDIRedraw(rc,_hps,Win,Data);
  2378.                WinEndPaint(_hps);
  2379.           END;
  2380.           ELSE IF not Handled THEN H:=FALSE;
  2381.       END;
  2382. l1:
  2383.       Handled:=H;
  2384.       MDIHandleEvent:=r;
  2385. END;
  2386.  
  2387.  
  2388. PROCEDURE TMDIApplication.MDICreateNotify(MDIFrWin,MDIWin:HWND;Data:POINTER);
  2389. VAR
  2390.    _swp:SWP;
  2391. BEGIN
  2392.      GetMaxDesktopWindow(_swp);
  2393.      WinSetWindowPos(SWP_SPEED,_swp.cy,_swp.cx,_swp.y,_swp.x,0,MDIFrWin);
  2394. END;
  2395.  
  2396.  
  2397. PROCEDURE TMDIApplication.WMMDIClose(Win:HWND;Data:POINTER);
  2398. BEGIN
  2399.      WinDestroyWindow(WinQueryWindow(QW_PARENT,Win));
  2400. END;
  2401.  
  2402. FUNCTION TMDIApplication.CreateMDIChild(resid:LONGWORD;Title:String;
  2403.                                               Extra:POINTER;fcfFlags:LONGWORD;
  2404.                                               Col,BCol:LONGINT):HWND;
  2405. VAR HWndChild,ChildFrame:HWND;
  2406.     fr:LONGWORD;
  2407.     LastWin:HWND;
  2408. BEGIN
  2409.      IF ChildCount>=20 THEN
  2410.      BEGIN
  2411.           ErrorBox(MB_ICONHAND,'Too much child windows');
  2412.           CreateMDIChild:=0;
  2413.           exit;
  2414.      END;
  2415.      fr:=FCF_SPEEDCHILD or FCFFlags;
  2416.      LastWin:=ActiveChild;
  2417.      inc(ChildCount);
  2418.      SetMenuState(CM_TILE,TRUE);
  2419.      SetMenuState(CM_CASCADE,TRUE);
  2420.      SetMenuState(CM_CLOSE,TRUE);
  2421.      SetMenuState(CM_CLOSEALL,TRUE);
  2422.      SetMenuState(CM_NEXT,TRUE);
  2423.      SetMenuState(CM_LIST,TRUE);
  2424.      ChildFrame:=WinCreateStdWindow(DesktopClientHandle,0,fr,
  2425.                                     TMDIWindowClass,Title,0,0,ResID,
  2426.                                     hwndChild);
  2427.      WinSetWindowULong(LONGWORD(SELF),0,hwndChild); {VMT pointer}
  2428.      WinSetWindowULong(LONGWORD(Extra),4,hwndChild);
  2429.      WinSetWindowULong(Col,8,hwndChild);
  2430.      WinSetWindowULong(BCol,12,hwndChild);
  2431.      WinSubClassWindow(@MDIMessageHandler,hwndChild);
  2432.  
  2433.      IF ActiveChild<>0 THEN IF IsWindowMaximized(ActiveChild) THEN
  2434.       RestoreWindow(WinQueryWindow(QW_PARENT,ActiveChild));
  2435.      WinSetOwner(ChildFrame,hwndChild);
  2436.  
  2437.      MDICreateNotify(ChildFrame,hwndChild,Extra);
  2438.      CreateMDIChild:=ChildFrame;
  2439. END;
  2440.  
  2441. FUNCTION TMDIApplication.MDIGetDataPointer(Win:HWND):POINTER;
  2442. VAr Result:POINTER;
  2443. BEGIN
  2444.     ASM
  2445.        PUSHL 4
  2446.        PUSHL $Win
  2447.        MOV AL,2
  2448.        CALLDLL PMWIN,843   ;WinQueryWindowUlong
  2449.        ADD ESP,8
  2450.        MOV $Result,EAX
  2451.     END;
  2452.     MDIGetDataPointer:=result;
  2453. END;
  2454.  
  2455. FUNCTION TMDIApplication.MDIGetTopWindow(VAR Extra:POINTER):HWND;
  2456. VAR Win:HWND;
  2457. BEGIN
  2458.      Win:=ActiveChild;
  2459.      IF Win<>0 THEN Extra:=MDIGetDataPointer(Win)
  2460.      ELSE Extra:=NIL;
  2461.      MDIGetTopWindow:=Win;
  2462. END;
  2463.  
  2464. PROCEDURE TMDIApplication.MDIBringToTop(Win:HWND);
  2465. BEGIN
  2466.      WinSetWindowPos(SWP_ZORDER or SWP_ACTIVATE,0,0,0,0,HWND_TOP,Win);
  2467. END;
  2468.  
  2469.  
  2470. {*************************************************************************
  2471. *                                                                        *
  2472. *                              MAIN                                      *
  2473. *                                                                        *
  2474. **************************************************************************}
  2475.  
  2476.  
  2477.  
  2478.  
  2479.  
  2480. BEGIN
  2481.      TWindowClass:='OPMWindowClass';
  2482.      WinRegisterClass(AppHandle,TWindowClass,@StartHandler,
  2483.                       CS_SIZEREDRAW,4);
  2484.      TDesktopWindowClass:='OPMDesktopWindowClass';
  2485.      WinRegisterClass(AppHandle,TDesktopWindowClass,@StartHandler,
  2486.                       CS_SIZEREDRAW,4);
  2487.      TMDIWindowClass:='OPMMDIWindowClass';
  2488.      WinRegisterClass(AppHandle,TMDIWindowClass,@StartHandler,
  2489.                       CS_SIZEREDRAW,16);
  2490. END.