home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Professional / OS2PRO194.ISO / os2 / wps / editor / epmtools / etksim / esimple.c next >
Encoding:
C/C++ Source or Header  |  1992-03-06  |  13.7 KB  |  308 lines

  1. //+------------------------------------------------------------------------------+
  2. //|  What's it called: ESIMPLE.C
  3. //|
  4. //|  What does it do : Creates a simple E-MultiLine Edit Control Window.
  5. //|                    The edit window uses SIMPLE.EX as its E-MLE profile (See ESIMPLE.E
  6. //|
  7. //|  .DLL functions  : EtkRegister
  8. //|                    EtkCreate
  9. //|                    EtkWndProc
  10. //|                    EtkDestroy
  11. //|
  12. //|  Who and When    : Gennaro (Jerry) Cuomo                          9 -88
  13. //|
  14. //+------------------------------------------------------------------------------+
  15.  
  16. /*
  17. ╔════════════════════════════════════════════════════════════════════════════╗
  18. ║ Included Header Files:                                             GC 9-88 ║
  19. ╚════════════════════════════════════════════════════════════════════════════╝
  20. */
  21. #define INCL_WIN         // winthorn definitions (WIN function and WM_ msgs)
  22. #define INCL_DOS        // Dosxxx functions
  23. #define INCL_GPI        // graphic functions
  24. #include <os2.h>         // start of the winthorn include chain
  25. #include <stdio.h>       // C library functions...
  26. #include <stdlib.h>      // C library functions...
  27. #include <string.h>      // C library functions...
  28. #include <malloc.h>      // C library functions...
  29. #include <edll.h>        // includes bindings to ETKExxx.DLL ETKRxxx.DLL
  30.  
  31. //+------------------------------------------------------------------------------+
  32. //|                                                                              |
  33. //|  What's it called: CreateEditWindow                                          |
  34. //|                                                                              |
  35. //|  What does it do : Create an E-MLE window using the ETKExxx.DLL function     |
  36. //|                    EtkCreate.               Note that key events are defined |
  37. //|                    by the ESIMPLE.EX  macro file. (See ESIMPLE.EX for deta   |
  38. //|                                                                              |
  39. //|  Who and when    : Gennaro (Jerry) Cuomo   9-88                              |
  40. //|                                                                              |
  41. //+------------------------------------------------------------------------------+
  42. HWND CreateEditWindow( HAB hAB, HWND hwnd, PSZ Fname )
  43. {
  44.    #define MY_E_MLE  100         // Application ID - Used by ETK to distinguish E-MLE window
  45.    EDITORINFO epm;               // Editor Application Information Struct
  46.    SWP   swp;                    // E-MLE position
  47.    HWND  hwndEdit;               // E-MLE (client) handle
  48.  
  49.    // allow for Line/Column at the bottom of application window
  50.    WinQueryWindowPos(hwnd, &swp);
  51.    swp.cy -=30; swp.y +=20;
  52.  
  53.    // fill in the editor information structure
  54.    epm.hab         = hAB;                   // application anchor block
  55.    epm.hwndparent  =                        // handle to parent of edit window
  56.    epm.hwndowner   = hwnd;                  // handle to owner of edit window
  57.    epm.pswp        = &swp;                  // positioning of edit window
  58.    epm.filename    = (PSZ)Fname;            // file to be edited (with wildcard)
  59.    epm.hEditorIcon = NULL;                  // E-MLE minimize ICON.
  60.    epm.hEditPtr    =                        // handle to editor pointer icon.
  61.    epm.hMarkPtr    =                        // handle to mark pointer icon.
  62.                      WinQuerySysPointer( HWND_DESKTOP, SPTR_TEXT, FALSE);
  63.    // internal editor options
  64.    epm.editorstyle = EDIT_STYLE_ACTIVATEFOCUS | EDIT_STYLE_DISABLEOWNERAFFECTS |
  65.                      EDIT_STYLE_CURSORON;
  66.    // PM standard window styles (FCF_xxxx)
  67.    epm.pmstyle     = FCF_TITLEBAR | FCF_SIZEBORDER | FCF_VERTSCROLL;
  68.  
  69.    epm.exfile      = (PSZ)"ESIMPLE.EX";     // Pre-compiled macro code file.
  70.    epm.topmkr      =                        // top and bottom file indicator
  71.    epm.botmkr      = (PSZ)" ≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈";
  72.    epm.editid      = MY_E_MLE;
  73.    epm.exe_path     =                       // Origin directory
  74.    epm.exsearchpath = "";                   // Environment variable name whose path contains .ex files
  75.  
  76.    /*----------  Create E-MLE Window -----------*/
  77.    EtkCreate( (EDITORINFO far *)&epm, (PHWND)&hwndEdit );
  78.  
  79.    return( (HWND)hwndEdit );
  80. }
  81.  
  82. /*
  83. ┌────────────────────────────────────────────────────────────────────────────┐
  84. │                                                                            │
  85. │ What's it called: TestWndProc()                                            │
  86. │                                                                            │
  87. │ What does it do : Handles messages sent to test application window.        │
  88. │                   If a EPM_EDIT_CURSORMOVE message is received, display    │
  89. │                   The current Line and column of the cursor.               │
  90. │                                                                            │
  91. │ Who and when    : Gennaro (Jerry) Cuomo   9-88                             │
  92. │                                                                            │
  93. └────────────────────────────────────────────────────────────────────────────┘
  94. */
  95. MRESULT FAR PASCAL TestWndProc( HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2 )
  96. {
  97.    switch (msg)   {
  98.    /*
  99.    ┌──────────────────────────────────────────────────────────────────────┐
  100.    │  This message is received when CLOSE is selected on the system       │
  101.    │  menu of the Test Edit Application window.                           │
  102.    └──────────────────────────────────────────────────────────────────────┘
  103.    */
  104.    case WM_CLOSE:
  105.       WinPostMsg(hwnd,WM_QUIT,0L,0L);
  106.       break;
  107.  
  108.    /*
  109.    ┌──────────────────────────────────────────────────────────────────────┐
  110.    │  Application window has become invalid...                            │
  111.    │  or window has changed size...                                       │
  112.    └──────────────────────────────────────────────────────────────────────┘
  113.     */
  114.     case WM_PAINT:
  115.     case WM_SIZE:
  116.        {
  117.          HPS    hPS;                    /* local handle to a cashed micro PS */
  118.          hPS = WinBeginPaint( hwnd, (HPS)NULL, (PWRECT)NULL );
  119.              GpiErase( hPS );
  120.          WinEndPaint( hPS );
  121.        }
  122.        break;
  123.  
  124.  
  125.   /*
  126.   ┌──────────────────────────────────────────────────────────┐
  127.   │ This message notifies your app that an edit window has   │
  128.   │ been closed.                                             │
  129.   └──────────────────────────────────────────────────────────┘
  130.   */
  131.    case EPM_EDIT_DESTROYNOTIFY:
  132.       WinAlarm( HWND_DESKTOP, WA_NOTE);
  133.       break;
  134.  
  135.   /*
  136.   ┌──────────────────────────────────────────────────────────┐
  137.   │ Am E-MLE has become active.  Record the important        │
  138.   │ window information.   All command will be sent to this   │
  139.   │ edit window.                                             │
  140.   │     mp1 = Edit Window Handle   (HWND)                    │
  141.   │     mp2 = Active File Name     (PSZ)                     │
  142.   └──────────────────────────────────────────────────────────┘
  143.   */
  144.   case EPM_EDIT_ACTIVEHWND:
  145.      WinSetActiveWindow(HWND_DESKTOP,(HWND)mp1 );
  146.      break;
  147.  
  148.   /*
  149.   ┌────────────────────────────────────────────────────────────────────────┐
  150.   │ The edit window has send a return code.                                │
  151.   │ This message is in response to the last EPM_EDIT_COMMAND               │
  152.   │ message issued by the active edit window.                              │
  153.   │     mp1 = message string   (PSZ)                                       │
  154.   │     mp2 = message number   (USHORT)                                    │
  155.   └────────────────────────────────────────────────────────────────────────┘
  156.   */
  157.   case EPM_EDIT_RETCODE:
  158.      WinMessageBox ((HWND)HWND_DESKTOP,   /* Display editor return code   */
  159.                     (HWND)hwnd,
  160.                     (PSZ)mp1,
  161.                     (PSZ)"E-MLE: Command Return Code",
  162.                     NULL,
  163.                     MB_ICONEXCLAMATION
  164.                    );
  165.      break;
  166.  
  167.     /*
  168.     ┌────────────────────────────────────────────────────────────────────────┐
  169.     │ This message is sent by the edit window to the owner.                  │
  170.     │ We process this message by displaying the current editor cursor pos.   │
  171.     │     mp1 = line number      (ULONG)                                     │
  172.     │     mp2 = column  number   (ULONG)                                     │
  173.     └────────────────────────────────────────────────────────────────────────┘
  174.     */
  175.     case EPM_EDIT_CURSORMOVE:
  176.       {
  177.         POINTL pt;
  178.         HPS    hps;
  179.         CHAR   text[80];
  180.         USHORT l;
  181.         RECTL  rc;
  182.  
  183.         hps = WinGetPS(hwnd);
  184.  
  185.         WinQueryWindowRect ( hwnd, (PRECTL)&rc );
  186.         rc.yTop =  rc.yBottom + 20;
  187.         WinFillRect(hps, &rc, CLR_RED );
  188.  
  189.         pt.x = 5L; pt.y = 3L;             /* Set the text coordinates,    */
  190.         GpiSetColor( hps, CLR_WHITE );    /* Set color of the text        */
  191.  
  192.         l = sprintf(text,"Line = %lu ",(ULONG)mp1);
  193.         GpiCharStringAt( hps, &pt, (ULONG)l, (PSZ)text); /* Draw Text       */
  194.  
  195.         pt.x = 82L;
  196.         l = sprintf(text,"Column = %lu ",(ULONG)mp2);
  197.         GpiCharStringAt( hps, &pt, (ULONG)l, (PSZ)text );
  198.  
  199.         WinReleasePS(hps);
  200.       }
  201.       break;
  202.     default:
  203.         return( WinDefWindowProc( hwnd, msg, mp1, mp2 ) );
  204.         break;
  205.     }
  206.     return(0L);
  207. }
  208.  
  209. /*
  210. ┌────────────────────────────────────────────────────────────────────────────┐
  211. │                                                                            │
  212. │ What's it called: main()                                                   │
  213. │                                                                            │
  214. │ What does it do : creates a application window and creates a child edit    │
  215. │                   window that contains file(s) specified on the system     │
  216. │                   command line.                                            │
  217. │                                                                            │
  218. │ Who and when    : Gennaro (Jerry) Cuomo   9-88                             │
  219. │                                                                            │
  220. └────────────────────────────────────────────────────────────────────────────┘
  221. */
  222. void main(int argc, char **argv)
  223. {
  224.     QMSG    qmsg;                           // queue message structure
  225.     ULONG   pmstyle;                        // application window style
  226.     HMQ     hmq;                            // Queue Handle
  227.     HAB     hab;                            // Anchor Block
  228.     RECTL   rect;                           // rectangle structure for pos.
  229.     CHAR    Fname[128];                     // Input file came
  230.     HWND    hwndAppClient,hwndAppFrame;     // main application window hdn
  231.     PSZ     class;                          // edit window class name
  232.     UCHAR   EMLE_ClassName[128];            // edit window class name
  233.     HWND    hwndEdit;                       // handle to E-MLE
  234.  
  235.     hab = WinInitialize(NULL);              // Initialize app as a PM app
  236.  
  237.     hmq = WinCreateMsgQueue(hab, 0x100);    // Create Queue
  238.  
  239.     WinRegisterClass( hab,                  // Register Application window
  240.                       (PSZ)"TEST",          //...class name
  241.                       (PFNWP)TestWndProc,   //...application window proc
  242.                       CS_SIZEREDRAW,        //...window class style
  243.                       4                     //...make room for instance data
  244.                     );
  245.                                             // window style of application
  246.     pmstyle = FCF_SIZEBORDER |              //...size border
  247.              FCF_TITLEBAR   |              //...title bar, minimize-
  248.               FCF_MINMAX     | FCF_SYSMENU; //...maximize, system menu.
  249.  
  250.     hwndAppFrame =WinCreateStdWindow(       // Create application window
  251.                      HWND_DESKTOP,          //...parent is the desk top wnd
  252.                      WS_VISIBLE,            //...
  253.                      &pmstyle,              //...window style flags
  254.                      (PSZ)"TEST",           //...window class name
  255.                      (PSZ)"Simple E-MLE Example",   //...title bar text.
  256.                      0L,                    //...
  257.                      (HMODULE)NULL,         //...
  258.                      0,                     //...
  259.                      (PHWND)&hwndAppClient  //...(return) client wnd handle
  260.                      );
  261.  
  262.                                             // set instance data
  263.     // WinSetWindowULong( hwndAppClient, 0, (ULONG)&instance);
  264.  
  265.     rect.xLeft   =  75;                     // Position Application Window
  266.     rect.yBottom =  100;
  267.     rect.xRight  =  500;
  268.     rect.yTop    =  300;
  269.  
  270.     WinSetWindowPos ((HWND)hwndAppFrame,    // Set position of app window
  271.                      (HWND)HWND_TOP,
  272.                      (SHORT)rect.xLeft,
  273.                      (SHORT)rect.yBottom,
  274.                      (SHORT)rect.xRight,
  275.                      (SHORT)rect.yTop,
  276.                      SWP_MOVE | SWP_SIZE );
  277.  
  278.  
  279.    //----------  Register Edit Window -------------
  280.    class=EtkRegister( hab, CS_SIZEREDRAW );
  281.  
  282.    // register function returns window class name.
  283.    strcpy( EMLE_ClassName, class);
  284.  
  285.    // are you loading a file from the command line
  286.    if (argc > 1) {
  287.       strcpy (Fname,argv[1]);
  288.    } else
  289.       strcpy (Fname,"sample.doc");
  290.  
  291.    // Create initial edit window.
  292.    hwndEdit=CreateEditWindow( hab, hwndAppClient, Fname );
  293.  
  294.    WinShowWindow( hwndAppFrame, TRUE );
  295.  
  296.  
  297.    // dispatch messages to Test Application
  298.    while( WinGetMsg( hab, (PQMSG)&qmsg, (HWND)NULL, 0, 0 ) ) {
  299.        WinDispatchMsg( hab, (PQMSG)&qmsg );
  300.    }
  301.  
  302.    // Close up shop
  303.  
  304.    WinDestroyWindow( hwndAppFrame );
  305.    WinDestroyMsgQueue( hmq );
  306.    WinTerminate( hab );
  307. }
  308.