home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1994 #1 / monster.zip / monster / PROG_C / COOLWORX.ZIP / DEMO / COOLEDIT / COOLEDIT.C < prev    next >
C/C++ Source or Header  |  1994-02-11  |  10KB  |  276 lines

  1. /*****************************************
  2.  * CoolEdit -- The CoolWorx Editor       *
  3.  *                                       *
  4.  * Copyright 1994 by Al Williams Comp.   *
  5.  * You may use portions of CoolEdit in   *
  6.  * your own code, but you may not        *
  7.  * distribute CoolEdit by itself.        *
  8.  *                                       *
  9.  *****************************************/
  10. #include <windows.h>
  11. #include "cooledit.h"
  12. #include "cw.h"
  13.  
  14. /* Forward reference */
  15. long WINAPI _export win_proc(HWND hWnd, UINT message,
  16.          UINT wParam, LONG lParam);
  17. int init(HANDLE,HANDLE,int);
  18.  
  19.  
  20. #define WINDOWMENU 4
  21. HANDLE hInst;
  22. HWND mainw;
  23. char ini[]="cooledit.ini";
  24.  
  25. /* Main entry point */
  26. int PASCAL WinMain(HANDLE hInstance, HANDLE prev,
  27.                                          LPSTR cmdline, int show)
  28.   {
  29.   HANDLE acc=NULL; /* use MDI accel */
  30.   hInst=hInstance;
  31.   cw_BeginIcons(hInst,LoadIcon(hInst,MAKEINTRESOURCE(APPICON)),
  32.       LoadIcon(hInst,MAKEINTRESOURCE(EDITICON)));
  33.   if (!init(hInst,prev,show)) return FALSE;
  34.   /* Vanilla event loop */
  35.   cw_Run(mainw,cw_MDIGetClientWindow(mainw),1,&acc,TRUE,TRUE);
  36.   cw_End(hInst);
  37.   return FALSE;
  38.   }
  39.  
  40. /* Create window here */
  41. int init(HANDLE hInstance, HANDLE prev,int nCmdShow)
  42.          {
  43.          HWND            hWnd;
  44.          /* Create a main window */
  45.          mainw=hWnd=cw_MDICreateFrame("CoolEdit","MMENU",0,
  46.            hInstance,(FARPROC)win_proc,FALSE,2000,
  47.            MAKEINTRESOURCE(MENUBAR),NULL,
  48.            NULL,MAKEINTRESOURCE(STATUS_BAR),
  49.            LoadAccelerators(hInst,"MMENU"),
  50.            CWRIBBON_TOP,0);
  51.          if (!hWnd)
  52.            return FALSE;
  53.  
  54. /* Make the window visible, update its client area,
  55.           and return "success"
  56.    if we should show normal, use stored window position */
  57.          if (nCmdShow==SW_SHOWNORMAL)
  58.            cw_IniPosSet(ini,"Main",hWnd);
  59.          else
  60.            ShowWindow(hWnd,nCmdShow);
  61.          UpdateWindow(hWnd);
  62.          return TRUE;
  63.          }
  64.  
  65. /* Create new (empty) child window */
  66. void new_child(HWND hWnd)
  67.   {
  68.   static int untitled=0; // keep track of #
  69.   char title[66];
  70.   wsprintf(title,"Untitled - %d",++untitled);
  71.   cw_MDICreateChild("CWEDITCLASS",title,
  72.     CW_MDIWIN|CE_HSCROLL|CE_VSCROLL|CW_USEHELP|CW_USEPROG,
  73.     CW_USEDEFAULT,0,CW_USEDEFAULT,0,
  74.     "EMENU",hWnd,hInst,WINDOWMENU,
  75.     LoadAccelerators(hInst,"EMENU"),
  76.     MAKEINTRESOURCE(EMENUBAR),CWRIBBON_TOP,NULL);
  77.   }
  78.  
  79.  
  80. /* Window procedure */
  81. long WINAPI _export win_proc(HWND hWnd, UINT message,
  82.          UINT wParam, LONG lParam)
  83.          {
  84.          switch (message)
  85.                   {
  86.                   case WM_INITMENU:
  87. /* Set up most recently opened menu
  88.    -- if child active, put at location 6 of menu 0 (file)
  89.    -- if no child windows, put at location 2 of menu 0 */
  90.                     cw_IniOpenMenu(ini,
  91.                       GetMenu(hWnd),0,
  92.                       cw_MDIGetActive(hWnd)?6:2,4000);
  93.  
  94. /* Send WM_INITMENU to child window (if any) */
  95.                     cw_MDISendActive(hWnd,WM_INITMENU,wParam,
  96.                       lParam);
  97.  
  98. /* Update toolbar/statusbar visibility */
  99.                     CheckMenuItem (GetMenu (hWnd), VIEW_TB,
  100.                       MF_BYCOMMAND|
  101.                       (cw_GetRibbon(hWnd,CWRIBBON_TOP)
  102.                       ? MF_CHECKED : MF_UNCHECKED));
  103.                     CheckMenuItem (GetMenu (hWnd),
  104.                       VIEW_SB, MF_BYCOMMAND
  105.                       | (cw_GetRibbon(hWnd,CWRIBBON_BOTTOM)
  106.                       ? MF_CHECKED : MF_UNCHECKED));
  107.                     break;
  108.  
  109. #if 0 // enable to have an inital window
  110.                   case CW_MDICREATE:
  111.                     new_child(hWnd);
  112.                     break;
  113. #endif
  114.  
  115. /* Handle help window messages */
  116.                   case CW_HELPID:
  117.                     {
  118.                     static HWND sb;
  119.                     static int oldid;
  120. /* If first time, find status bar and quit */
  121.                     if (!sb)
  122.                       {
  123.                       sb=cw_GetRibbon(hWnd,CWRIBBON_BOTTOM);
  124. /* Skip the first one so (c) message appears */
  125.                       return 0;
  126.                       }
  127. /* Filter out redundant help messages */
  128.                     if (oldid==wParam) return 0;
  129.                     oldid=wParam;
  130. /* Load help from resource file or defaults */
  131.                     cw_StatusHelp(hInst,sb,STATUS_PANE,oldid);
  132.                     break;
  133.                     }
  134.  
  135. /* Update status bar/toolbar, etc */
  136.                   case CW_IDLE:
  137.                     {
  138.                     static unsigned divide=0;
  139.                     HWND w=cw_MDIGetActive(hWnd);
  140. /* Only update time every 600 ticks */
  141.                     if (divide++%600==0)
  142.                       cw_StatusTime(hWnd,CWRIBBON_BOTTOM,
  143.                         TIME_PANE);
  144. /* Update status keys */
  145.                     cw_StatusKeys(hWnd,CWRIBBON_BOTTOM,
  146.                       CAP_STATIC,NUM_STATIC,NULL,NULL);
  147. /* Give child a chance to init toolbar and show status */
  148.                     if (w)
  149.                       {
  150.                       SendMessage(w,CW_INITTOOL,0,(DWORD)hWnd);
  151.                       cw_EditStatus(hWnd,CWRIBBON_BOTTOM,w,
  152.                         EDSTAT_PANE,FALSE);
  153.                       }
  154.                     else
  155.                       {
  156. /* No child so clear edit status pane */
  157.                       SendMessage(
  158.                         GetDlgItem(
  159.                           cw_GetRibbon(hWnd,CWRIBBON_BOTTOM),
  160.                           EDSTAT_PANE),WM_SETTEXT,0,(DWORD)"");
  161.                       }
  162.                     break;
  163.                     }
  164.  
  165. /* Menu commands */
  166.                   case WM_COMMAND:
  167. /* Check for most recently used files */
  168.                     if (wParam>=4000&&wParam<=4010)
  169.                       {
  170.                       char fn[66];
  171.                       cw_IniOpenGet(ini,4000,
  172.                       wParam,fn,sizeof(fn));
  173.                       if (*fn)
  174.                         {
  175.                         if (cw_EditOpenFileName(hWnd,
  176.                             CW_USEPROG|CW_USEHELP|CE_HSCROLL|CE_VSCROLL,
  177.                             "EMENU",WINDOWMENU,
  178.                             fn,FALSE,LoadAccelerators(hInst,
  179.                             "EMENU"),MAKEINTRESOURCE(EMENUBAR),
  180.                             CWRIBBON_TOP))
  181.                           cw_IniOpenSet(ini,fn);
  182.                         }
  183.                       break;
  184.                       }
  185. /* Ask child if it can handle this message */
  186.                     if (!cw_MDISendActive(
  187.                       hWnd,CW_STDMENU,wParam,0))
  188. /* If not, we must do it.... */
  189.                     switch (wParam)
  190.                       {
  191.                       case VIEW_FONT:
  192.                         {
  193. /* change font */
  194.                         HWND w=cw_MDIGetActive(hWnd);
  195.                         if (w) cw_EditSetFont(w,NULL);
  196.                         break;
  197.                         }
  198.  
  199.                       case VIEW_TB:
  200.                         {
  201. /* Hide/show toolbar */
  202.                         cw_MDIShowToolBar (hWnd, CWRIBBON_TOP,
  203.                           !cw_GetRibbon(hWnd,CWRIBBON_TOP));
  204.                           break;
  205.                         }
  206.  
  207.                       case VIEW_SB:
  208.                         {
  209. /* Hide/show status bar */
  210.                         static HWND sb;
  211.                         if (!sb)
  212.                           sb = cw_GetRibbon (hWnd, CWRIBBON_BOTTOM);
  213.                         cw_MDIShowRibbon (sb,
  214.                           !cw_GetRibbon(hWnd,CWRIBBON_BOTTOM));
  215.                         break;
  216.                         }
  217.  
  218. /* Create new child */
  219.                       case CM_FILENEW:
  220.                         new_child(hWnd);
  221.                         break;
  222.  
  223. /* Open new child */
  224.                       case CM_FILEOPEN:
  225.                         {
  226.                         char fn[66];
  227.                         if (cw_EditOpenFile(hWnd,
  228.                             CW_USEPROG|CW_USEHELP|CE_HSCROLL|CE_VSCROLL,
  229.                             "EMENU",WINDOWMENU,
  230.                             fn,sizeof(fn),
  231.                             LoadAccelerators(hInst,
  232.                             "EMENU"),
  233.                             MAKEINTRESOURCE(EMENUBAR),
  234.                             CWRIBBON_TOP))
  235. /* Register file name with most recently opened */
  236.                           cw_IniOpenSet(ini,fn);
  237.                          }
  238.                         break;
  239.  
  240. /* Toggle NUMLOCK */
  241.                        case NUM_BUTTON:
  242.                         cw_ToggleKeyState(VK_NUMLOCK);
  243.                         break;
  244.  
  245. /* Toggle CAPS LOCK */
  246.                        case CAP_BUTTON:
  247.                         cw_ToggleKeyState(VK_CAPITAL);
  248.                         break;
  249.  
  250.                        case CM_HELPABOUT:
  251. /* Use CoolDialog for about box -- no callback is needed
  252.    and there isn't any data to transfer */
  253.                        cw_DialogBox(hInst,"ABTBOX",
  254.                          mainw,NULL,cw_NullCDlgTemp());
  255.                         break;
  256.  
  257.                        }
  258.                       break;
  259.  
  260.  
  261. /* On exit, save window position */
  262.                   case WM_DESTROY:
  263.                     cw_IniPosSave(ini,"Main",hWnd);
  264.                     PostQuitMessage(0);
  265.                     break;
  266.  
  267.  
  268.                   }
  269. /* Use CoolWorx default -- not windows! */
  270.               return (cw_DefFrameProc(hWnd, message,
  271.                          wParam, lParam));
  272.          }
  273.  
  274.  
  275.  
  276.