home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / NOTEPAD2.ZIP / NOTEPAD.C < prev    next >
C/C++ Source or Header  |  1989-02-08  |  11KB  |  357 lines

  1. /***************************************************************************\
  2. * np.c - PM Notepad application
  3. *
  4. * Created by Microsoft Corporation, 1989
  5. \***************************************************************************/
  6.  
  7. #define INCL_WIN
  8. #include <os2.h>
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include "notepad.h"
  12. #include "npcmd.h"
  13. #include "npkmp.h"
  14.  
  15. /************* GLOBAL VARIABLES         */
  16.  
  17. char szNPClass[] = "notepad class";
  18. char szTitle[NP_TITLESIZE];
  19.  
  20. HAB  hab;
  21. HMQ  hmqNP;
  22. HWND hwndNP;
  23. HWND hwndNPFrame;
  24. HWND hwndNPMenu;
  25. HWND hwndNPEdit;
  26. HWND hwndNPHScroll;
  27. HWND hwndNPVScroll;
  28.  
  29. char *szClientMsg = "Hello, World";
  30.  
  31. BOOL fWordWrapOn = FALSE;
  32. char szFileName[MAXFILENAMESZ];
  33. char szLoadFileName[MAXFILENAMESZ];
  34. BOOL fInitLoad = FALSE;
  35. BOOL fInitError = FALSE;
  36. BOOL fNamed = FALSE;
  37. BOOL fChanged = FALSE;
  38. BOOL fUnsized = TRUE;
  39.  
  40. COMPILEDKEY ckSearchKey;
  41. PCOMPILEDKEY pckSearchKey = &ckSearchKey;
  42. BOOL fKeySet = FALSE;
  43.  
  44. char szMsgs[MS_COUNT+1][MS_MAXMSGSIZE];
  45.  
  46. HHEAP hhAppHeap;
  47.  
  48. /************* PROCEDURE DECLARATIONS   */
  49.  
  50. MRESULT CALLBACK NPWndProc(HWND, USHORT, MPARAM, MPARAM);
  51. VOID DoCommand(int);
  52. BOOL NPInit(VOID);
  53. int cdecl main(int, char **);
  54.  
  55. /************* COMMAND DISPATCH TABLE   */
  56.  
  57. int (*rgpfnCmds[CCMDS])() = {
  58.     CmdNew,         /* 0 - new */
  59.     CmdOpen,        /* 1 - open */
  60.     CmdSave,        /* 2 - save */
  61.     CmdSaveAs,      /* 3 - saveas */
  62.     CmdUndo,        /* 4 - undo */
  63.     CmdCut,         /* 5 - cut */
  64.     CmdCopy,        /* 6 - copy */
  65.     CmdPaste,       /* 7 - paste */
  66.     CmdClear,       /* 8 - clear */
  67.     CmdPrint,       /* 9 - print */
  68.     CmdAbout,       /* A - about */
  69.     CmdSelectAll,   /* B - select all */
  70.     CmdFind,        /* C - find */
  71.     CmdReplace,     /* D - replace */
  72.     CmdNextSearch,  /* E - find next */
  73.     CmdWordWrap,    /* F - toggle wrap */
  74.     CmdExit,        /* 10 - exit */
  75.     CmdDateTime,    /* 11 - date/time insertion */
  76.     NULL,           /* 12 - Unused */
  77.     CmdSetTab,      /* 13 - set tab size */
  78.     CmdQueryFont    /* 14 - Query font */
  79. };
  80.  
  81. /**************************************/
  82.  
  83. VOID DoCommand(cmd)
  84. int cmd;
  85. {
  86.     int (*pfn)(void);
  87.  
  88. /*
  89.     Lo byte of cmd value is index into dispatch table
  90.     Hi byte of cmd is menu index, or whatever.  Hi byte
  91.     can be used in a switch here to do common processing for
  92.     related commands.
  93. */
  94.  
  95.     if (HIBYTE(cmd) == HIBYTE(SUB_FONTS))
  96.             SelectFont(LOBYTE(cmd));
  97.     else if (HIBYTE(cmd) == HIBYTE(SUB_SIZES))
  98.             SelectSizeIndex(LOBYTE(cmd));
  99.     else if ((pfn = rgpfnCmds[LOBYTE(cmd)]) != NULL)
  100.         (*pfn)();
  101. }
  102.  
  103.  
  104. MRESULT DoControl(MPARAM mp1, MPARAM mp2)
  105. {
  106.         switch(SHORT2FROMMP(mp1)) {
  107.                 case EN_HSCROLL:
  108.                         return(WinSendMsg(hwndNPHScroll, SBM_SETPOS,
  109.                 MPFROMSHORT(SHORT1FROMMP(mp2)), NULL));
  110.                         break;
  111.                 case EN_VSCROLL:
  112.                         return(WinSendMsg(hwndNPVScroll, SBM_SETPOS,
  113.                 MPFROMSHORT(SHORT1FROMMP(mp2)), NULL));
  114.                         break;
  115.                 default:
  116.                         return(0L);
  117.                         break;
  118.         }
  119. }
  120.  
  121. MRESULT DoInitMenu(SHORT sId)
  122. {
  123.         USHORT us;
  124.  
  125.         switch (sId) {
  126.                 case SUB_SEARCH:
  127.                         WinSendMsg(hwndNPMenu,
  128.                                 MM_SETITEMATTR,
  129.                                 MPFROM2SHORT(CMD_NEXTSRCH, TRUE),
  130.                                 MPFROM2SHORT(MIA_DISABLED, fKeySet?0:MIA_DISABLED));
  131.                         return(FALSE);
  132.  
  133.                 case SUB_EDIT:
  134.                         WinSendMsg(hwndNPMenu, MM_SETITEMATTR,
  135.                                 MPFROM2SHORT(CMD_UNDO,TRUE),
  136.                                 MPFROM2SHORT(MIA_DISABLED, MIA_DISABLED));
  137.                         if (WinSendMsg(hwndNPEdit, EM_QUERYSEL, MPFROMLONG(2), NULL) ==
  138.                             WinSendMsg(hwndNPEdit, EM_QUERYSEL, MPFROMLONG(1), NULL)) {
  139.                             WinSendMsg(hwndNPMenu,
  140.                                     MM_SETITEMATTR,
  141.                                     MPFROM2SHORT(CMD_CUT,TRUE),
  142.                                     MPFROM2SHORT(MIA_DISABLED,MIA_DISABLED));
  143.                             WinSendMsg(hwndNPMenu,
  144.                                     MM_SETITEMATTR,
  145.                                     MPFROM2SHORT(CMD_COPY,TRUE),
  146.                                     MPFROM2SHORT(MIA_DISABLED,MIA_DISABLED));
  147.                             WinSendMsg(hwndNPMenu,
  148.                                     MM_SETITEMATTR,
  149.                                     MPFROM2SHORT(CMD_CLEAR,TRUE),
  150.                                     MPFROM2SHORT(MIA_DISABLED,MIA_DISABLED));
  151.                         } else {
  152.                             WinSendMsg(hwndNPMenu,
  153.                     MM_SETITEMATTR,
  154.                     MPFROM2SHORT(CMD_CUT,TRUE),
  155.                                     MPFROM2SHORT(MIA_DISABLED,0));
  156.                             WinSendMsg(hwndNPMenu,
  157.                                     MM_SETITEMATTR,
  158.                                     MPFROM2SHORT(CMD_COPY,TRUE),
  159.                                     MPFROM2SHORT(MIA_DISABLED,0));
  160.                             WinSendMsg(hwndNPMenu,
  161.                                     MM_SETITEMATTR,
  162.                                     MPFROM2SHORT(CMD_CLEAR,TRUE),
  163.                                     MPFROM2SHORT(MIA_DISABLED,0));
  164.                         }
  165.                         WinOpenClipbrd(hab);
  166.                         if (!WinQueryClipbrdFmtInfo(hab, CF_TEXT, &us)) {
  167.                             WinSendMsg(hwndNPMenu,
  168.                                     MM_SETITEMATTR,
  169.                                     MPFROM2SHORT(CMD_PASTE,TRUE),
  170.                                     MPFROM2SHORT(MIA_DISABLED,MIA_DISABLED));
  171.                         } else {
  172.                             WinSendMsg(hwndNPMenu,
  173.                                     MM_SETITEMATTR,
  174.                                     MPFROM2SHORT(CMD_PASTE,TRUE),
  175.                                     MPFROM2SHORT(MIA_DISABLED,0));
  176.                         }
  177.                         WinCloseClipbrd(hab);
  178.                         return(FALSE);
  179.  
  180.                 default:
  181.                         return(FALSE);
  182.         }
  183. }
  184.  
  185. BOOL NPInit(VOID)
  186. {
  187.     int i;
  188.  
  189.     hmqNP = WinCreateMsgQueue(hab, 0);
  190.  
  191.     MleInit(hab);
  192.  
  193.     hhAppHeap = WinCreateHeap(0,0,0,0,0,0);
  194.  
  195.     if (!InitSrch())
  196.         return(FALSE);
  197.  
  198.     if (!WinRegisterClass(hab, szNPClass, (PFNWP)NPWndProc,
  199.             CS_SIZEREDRAW, 0))
  200.         return(FALSE);
  201.  
  202.     szTitle[0] = '\0';
  203.  
  204.     for (i=1; i<=MS_COUNT; i++) {
  205.         WinLoadString(hab, NULL, i, MS_MAXMSGSIZE, szMsgs[i]);
  206.     }
  207.  
  208.     return(TRUE);
  209. }
  210.  
  211. int cdecl main(argc, argv)
  212. int argc;
  213. char **argv;
  214. {
  215.     QMSG qmsg;
  216.     ULONG lCtlData;
  217.  
  218.     hab = WinInitialize(0);
  219.  
  220.     CmdParseLine(argc, argv);
  221.  
  222.     if (!NPInit()) {
  223.         WinAlarm(HWND_DESKTOP, WA_ERROR);
  224.         return(0);
  225.     }
  226.  
  227.     lCtlData = FCF_STANDARD | FCF_VERTSCROLL | FCF_HORZSCROLL |
  228.             FCF_ACCELTABLE | FCF_ICON | FCF_TASKLIST | FCF_SHELLPOSITION;
  229.     hwndNPFrame = WinCreateStdWindow(HWND_DESKTOP,
  230.             WS_VISIBLE,
  231.             &lCtlData,
  232.             szNPClass, " - [(untitled)]",
  233.             WS_VISIBLE,
  234.             (HMODULE)NULL, IDR_NP,
  235.             (HWND FAR *)&hwndNP);
  236.  
  237.     WinSetFocus(HWND_DESKTOP, hwndNPEdit);
  238.     ClearChanged();
  239.  
  240.     CmdCmdLine();
  241.  
  242.     while (WinGetMsg(hab, (PQMSG)&qmsg, NULL, 0, 0)) {
  243.         WinDispatchMsg(hab, (PQMSG)&qmsg);
  244.     }
  245.  
  246.     WinDestroyWindow(hwndNPFrame);
  247.  
  248.     WinDestroyMsgQueue(hmqNP);
  249.     WinTerminate(hab);
  250.  
  251.     DosExit(EXIT_PROCESS, 0);
  252. }
  253.  
  254. /********** NP Window Procedure **************/
  255.  
  256. MRESULT CALLBACK NPWndProc(hwnd, msg, mp1, mp2)
  257. HWND hwnd;
  258. USHORT msg;
  259. MPARAM mp1;
  260. MPARAM mp2;
  261. {
  262.     switch (msg) {
  263.     case WM_CREATE:
  264.         /* Set up this global first thing in case we need it elsewhere */
  265.         hwndNP = hwnd;
  266.         hwndNPEdit = WinCreateWindow(hwndNP,
  267.                         (PSZ) WC_MLE,
  268.                         NULL,
  269.                         WS_VISIBLE,
  270.                         0, 0,
  271.                         0, 0,
  272.                         hwndNP,
  273.                         HWND_TOP,
  274.                         NP_EDITWINDOWID,
  275.                         NULL,
  276.                         NULL);
  277.         ClearChanged();
  278.         WinPostMsg(hwnd, EDM_INIT, NULL, NULL);
  279.         return(0L);
  280.         break;
  281.  
  282.     case EDM_INIT:
  283.         hwndNPMenu = WinWindowFromID(hwndNPFrame,FID_MENU);
  284.         hwndNPHScroll = WinWindowFromID(hwndNPFrame, FID_HORZSCROLL);
  285.         hwndNPVScroll = WinWindowFromID(hwndNPFrame, FID_VERTSCROLL);
  286.         WinSendMsg(hwndNPHScroll,               /* fix this */
  287.                 SBM_SETSCROLLBAR,
  288.                 MPFROMSHORT(0),
  289.                 MPFROM2SHORT(SLIDER_MIN,SLIDER_MAX));
  290.         WinSendMsg(hwndNPVScroll,
  291.                 SBM_SETSCROLLBAR,
  292.                 MPFROMSHORT(0),
  293.                 MPFROM2SHORT(SLIDER_MIN,SLIDER_MAX));
  294.         WinSendMsg(hwndNPEdit, EM_SETTEXTLIMIT, MPFROMLONG(-1), NULL);
  295.         InitFonts();
  296.         return(0L);
  297.         break;
  298.  
  299.     case WM_CLOSE:
  300.         switch (NPCheckSave()) {
  301.         case MBID_CANCEL:
  302.                 return(0L);
  303.                 break;
  304.         default:
  305.                 ClearChanged();
  306.                 return(WinDefWindowProc(hwnd, msg, mp1, mp2));
  307.                 break;
  308.         }
  309.         break;
  310.  
  311.  
  312.     case WM_SIZE:
  313.         WinSetWindowPos(hwndNPEdit,
  314.                 HWND_TOP,
  315.                 0, 0,
  316.                 SHORT1FROMMP(mp2), SHORT2FROMMP(mp2),
  317.                 SWP_SIZE);
  318.  
  319.         if (fUnsized) {
  320.             WinSendMsg(hwndNPEdit, EM_SETTEXTLIMIT, MPFROMLONG(2000), 0L);
  321.             SetWordWrap(FALSE);
  322.             fUnsized = FALSE;
  323.             }
  324.  
  325.         return(WinDefWindowProc(hwnd, msg, mp1, mp2));
  326.         break;
  327.  
  328.  
  329.     case WM_HSCROLL:
  330.     case WM_VSCROLL:
  331.     case WM_MINMAXFRAME:
  332.             return(WinSendMsg(hwndNPEdit,msg,mp1,mp2));
  333.             break;
  334.  
  335.     case WM_COMMAND:
  336.         DoCommand(LOUSHORT(mp1));
  337.         return(0L);
  338.         break;
  339.  
  340.     case WM_CONTROL:
  341.         return(DoControl(mp1, mp2));
  342.         break;
  343.  
  344.     case WM_HELP:
  345.         return(0L);
  346.         break;
  347.  
  348.     case WM_INITMENU:
  349.         return(DoInitMenu(SHORT1FROMMP(mp1)));
  350.         break;
  351.  
  352.     default:
  353.         return(WinDefWindowProc(hwnd, msg, mp1, mp2));
  354.         break;
  355.     }
  356. }
  357.