home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / drdobbs / 1991 / 08 / dflat5 / memopad.c < prev    next >
Text File  |  1991-06-28  |  9KB  |  352 lines

  1. /* --------------- memopad.c ----------- */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <sys\types.h>
  7. #include <sys\stat.h>
  8. #include <dos.h>
  9. #ifndef MSC
  10. #include <dir.h>
  11. #endif
  12. #include "dflat.h"
  13.  
  14. static char Untitled[] = "Untitled";
  15. static int wndpos = 0;
  16.  
  17. static int MemoPadProc(WINDOW, MESSAGE, PARAM, PARAM);
  18. static void NewFile(WINDOW);
  19. static void SelectFile(WINDOW);
  20. static void PadWindow(WINDOW, char *);
  21. static void OpenPadWindow(WINDOW, char *);
  22. static void LoadFile(WINDOW, int);
  23. static void PrintPad(WINDOW);
  24. static void SaveFile(WINDOW, int);
  25. static int EditorProc(WINDOW, MESSAGE, PARAM, PARAM);
  26. static char *NameComponent(char *);
  27.  
  28. char **Argv;
  29.  
  30. void main(int argc, char *argv[])
  31. {
  32.     WINDOW wnd;
  33.     init_messages();
  34.     Argv = argv;
  35.     wnd = CreateWindow(APPLICATION,
  36.                         "D-Flat MemoPad " VERSION,
  37.                         0, 0, -1, -1,
  38.                         MainMenu,
  39.                         NULL,
  40.                         MemoPadProc,
  41.                         MOVEABLE  |
  42.                         SIZEABLE  |
  43.                         HASBORDER |
  44.                         HASSTATUSBAR
  45.                         );
  46.  
  47.     SendMessage(wnd, SETFOCUS, TRUE, 0);
  48.     while (argc > 1)    {
  49.         PadWindow(wnd, argv[1]);
  50.         --argc;
  51.         argv++;
  52.     }
  53.     while (dispatch_message())
  54.         ;
  55. }
  56.  
  57. static void PadWindow(WINDOW wnd, char *FileName)
  58. {
  59.     int ax, criterr = 1;
  60.     struct ffblk ff;
  61.     char path[64];
  62.     char *cp;
  63.  
  64.     CreatePath(path, FileName, FALSE, FALSE);
  65.     cp = path+strlen(path);
  66.     CreatePath(path, FileName, TRUE, FALSE);
  67.     while (criterr == 1)    {
  68.         ax = findfirst(path, &ff, 0);
  69.         criterr = TestCriticalError();
  70.     }
  71.     while (ax == 0 && !criterr)    {
  72.         strcpy(cp, ff.ff_name);
  73.         OpenPadWindow(wnd, path);
  74.         ax = findnext(&ff);
  75.     }
  76. }
  77.  
  78. static int MemoPadProc(WINDOW wnd, MESSAGE msg, PARAM p1, PARAM p2)
  79. {
  80.     switch (msg)    {
  81.         case COMMAND:
  82.             switch ((int)p1)    {
  83.                 case ID_NEW:
  84.                     NewFile(wnd);
  85.                     return TRUE;
  86.                 case ID_OPEN:
  87.                     SelectFile(wnd);
  88.                     return TRUE;
  89.                 case ID_SAVE:
  90.                     SaveFile(inFocus, FALSE);
  91.                     return TRUE;
  92.                 case ID_SAVEAS:
  93.                     SaveFile(inFocus, TRUE);
  94.                     return TRUE;
  95.                 case ID_PRINT:
  96.                     PrintPad(inFocus);
  97.                     return TRUE;
  98.                 case ID_ABOUT:
  99.                     MessageBox(
  100.                          "About D-Flat and the MemoPad",
  101.                         "   ┌───────────────────────┐\n"
  102.                         "   │    ▄▄▄   ▄▄▄     ▄    │\n"
  103.                         "   │    █  █  █  █    █    │\n"
  104.                         "   │    █  █  █  █    █    │\n"
  105.                         "   │    █  █  █  █ █  █    │\n"
  106.                         "   │    ▀▀▀   ▀▀▀   ▀▀     │\n"
  107.                         "   └───────────────────────┘\n"
  108.                         "D-Flat implements the SAA/CUA\n"
  109.                         "interface in a public domain\n"
  110.                         "C language library originally\n"
  111.                         "published in Dr. Dobb's Journal\n"
  112.                         "    ------------------------ \n"
  113.                         "MemoPad is a multiple document\n"
  114.                         "editor that demonstrates D-Flat");
  115.                     MessageBox(
  116.                         "D-Flat Testers and Friends",
  117.                         "Jeff Ratcliff, David Peoples, Kevin Slater,\n"
  118.                         "Naor Toledo Pinto, Jeff Hahn, Jim Drash,\n"
  119.                         "Art Stricek, John Ebert, George Dinwiddie,\n"
  120.                         "Damaian Thorne, Wes Peterson, Thomas Ewald,\n"
  121.                         "Mitch Miller, Ray Waters, Jim Drash, Eric\n"
  122.                         "Silver, Russ Nelson, Elliott Jackson, Warren\n"
  123.                         "Master, H.J. Davey, Jim Kyle, Jim Morris,\n"
  124.                         "Andrew Terry, Michel Berube, Bruce Edmondson,\n"
  125.                         "Peter Baenziger, Phil Roberge, Willie Hutton,\n"
  126.                         "Randy Bradley, Tim Gentry, Lee Humphrey,\n"
  127.                         "Larry Troxler, Robert DiFalco, Carl Huff,\n"
  128.                         "Vince Rice, Michael Kaufman");
  129.                     return TRUE;
  130.                 default:
  131.                     break;
  132.             }
  133.             break;
  134.         default:
  135.             break;
  136.     }
  137.     return DefaultWndProc(wnd, msg, p1, p2);
  138. }
  139.  
  140. /*
  141.  *  The New command. Open an empty editor window
  142.  */
  143. static void NewFile(WINDOW wnd)
  144. {
  145.     OpenPadWindow(wnd, Untitled);
  146. }
  147.  
  148. /*
  149.  *  The Open... command. Select a file 
  150.  */
  151. static void SelectFile(WINDOW wnd)
  152. {
  153.     char FileName[64];
  154.     if (DlgOpenFile("*.PAD", FileName))    {
  155.         /* --- see if the document is already in a window --- */
  156.         WINDOW wnd1 = GetFirstChild(wnd);
  157.         while (wnd1 != NULLWND)    {
  158.             if (stricmp(FileName, wnd1->extension) == 0)    {
  159.                 SendMessage(wnd1, SETFOCUS, TRUE, 0);
  160.                 SendMessage(wnd1, RESTORE, 0, 0);
  161.                 return;
  162.             }
  163.             wnd1 = GetNextChild(wnd, wnd1);
  164.         }
  165.         OpenPadWindow(wnd, FileName);
  166.     }
  167. }
  168.  
  169. /*
  170.  *  open a document window and load a file
  171.  */
  172. static void OpenPadWindow(WINDOW wnd, char *FileName)
  173. {
  174.     static WINDOW wnd1 = NULLWND;
  175.     struct stat sb;
  176.     char *Fname = FileName;
  177.     char *ermsg;
  178.     if (strcmp(FileName, Untitled))    {
  179.         if (stat(FileName, &sb))    {
  180.             if ((ermsg = malloc(strlen(FileName)+20)) != NULL)    {
  181.                 strcpy(ermsg, "No such file as\n");
  182.                 strcat(ermsg, FileName);
  183.                 ErrorMessage(ermsg);
  184.                 free(ermsg);
  185.             }
  186.             return;
  187.         }
  188.         Fname = NameComponent(FileName);
  189.     }
  190.     wndpos += 2;
  191.     if (wndpos == 20)
  192.         wndpos = 2;
  193.     wnd1 = CreateWindow(EDITBOX,
  194.                 Fname,
  195.                 (wndpos-1)*2, wndpos, 10, 40,
  196.                 NULL, wnd, EditorProc,
  197.                 SHADOW     |
  198.                 MINMAXBOX  |
  199.                 CONTROLBOX |
  200.                 VSCROLLBAR |
  201.                 HSCROLLBAR |
  202.                 MOVEABLE   |
  203.                 HASBORDER  |
  204.                 SIZEABLE   |
  205.                 MULTILINE
  206.     );
  207.     if (strcmp(FileName, Untitled))    {
  208.         if ((wnd1->extension = malloc(strlen(FileName)+1)) != NULL)    {
  209.             strcpy(wnd1->extension, FileName);
  210.             LoadFile(wnd1, (int) sb.st_size);
  211.         }
  212.     }
  213.     SendMessage(wnd1, SETFOCUS, TRUE, 0);
  214. }
  215.  
  216. /*
  217.  *  Load the notepad file into the editor text buffer
  218.  */
  219. static void LoadFile(WINDOW wnd, int tLen)
  220. {
  221.     char *Buf;
  222.     FILE *fp;
  223.  
  224.     if ((Buf = malloc(tLen+1)) != NULL)    {
  225.         if ((fp = fopen(wnd->extension, "rt")) != NULL)    {
  226.             memset (Buf, 0, tLen+1);
  227.             fread(Buf, tLen, 1, fp);
  228.             SendMessage(wnd, SETTEXT, (PARAM) Buf, 0);
  229.             fclose(fp);
  230.         }
  231.         free(Buf);
  232.     }
  233. }
  234.  
  235. /*
  236.  *  print the current notepad
  237.  */
  238. static void PrintPad(WINDOW wnd)
  239. {
  240.     unsigned char *text;
  241.  
  242.     /* ---------- print the file name ---------- */
  243.     fputs("\r\n", stdprn);
  244.     fputs(GetTitle(wnd), stdprn);
  245.     fputs(":\r\n\n", stdprn);
  246.  
  247.     /* ---- get the address of the editor text ----- */
  248.     text = GetText(wnd);
  249.  
  250.     /* ------- print the notepad text --------- */
  251.     while (*text)    {
  252.         if (*text == '\n')
  253.             fputc('\r', stdprn);
  254.         fputc(*text++, stdprn);
  255.     }
  256.  
  257.     /* ------- follow with a form feed? --------- */
  258.     if (YesNoBox("Form Feed?"))
  259.         fputc('\f', stdprn);
  260. }
  261.  
  262. static void SaveFile(WINDOW wnd, int Saveas)
  263. {
  264.     FILE *fp;
  265.     if (wnd->extension == NULL || Saveas)    {
  266.         char FileName[64];
  267.         if (DlgSaveAs(FileName))    {
  268.             if (wnd->extension != NULL)
  269.                 free(wnd->extension);
  270.             if ((wnd->extension = malloc(strlen(FileName)+1)) != NULL)    {
  271.                 strcpy(wnd->extension, FileName);
  272.                 AddTitle(wnd, NameComponent(FileName));
  273.                 SendMessage(wnd, BORDER, 0, 0);
  274.             }
  275.         }
  276.         else
  277.             return;
  278.     }
  279.     if (wnd->extension != NULL)    {
  280.         WINDOW mwnd = MomentaryMessage("Saving the file");
  281.         if ((fp = fopen(wnd->extension, "wt")) != NULL)    {
  282.             fwrite(GetText(wnd), strlen(GetText(wnd)), 1, fp);
  283.             fclose(fp);
  284.             wnd->TextChanged = FALSE;
  285.         }
  286.         SendMessage(mwnd, CLOSE_WINDOW, 0, 0);
  287.     }
  288. }
  289.  
  290. static void ShowPosition(WINDOW wnd)
  291. {
  292.     char status[30];
  293.     sprintf(status, "Line:%4d  Column: %2d",
  294.         wnd->CurrLine, wnd->CurrCol);
  295.     SendMessage(GetParent(wnd), ADDSTATUS, (PARAM) status, 0);
  296. }
  297.  
  298. static int EditorProc(WINDOW wnd, MESSAGE msg, PARAM p1, PARAM p2)
  299. {
  300.     int rtn;
  301.     switch (msg)    {
  302.         case SETFOCUS:
  303.             rtn = DefaultWndProc(wnd, msg, p1, p2);
  304.             if ((int)p1 == FALSE)
  305.                 SendMessage(GetParent(wnd), ADDSTATUS, 0, 0);
  306.             else 
  307.                 ShowPosition(wnd);
  308.             return rtn;
  309.         case KEYBOARD_CURSOR:
  310.             rtn = DefaultWndProc(wnd, msg, p1, p2);
  311.             ShowPosition(wnd);
  312.             return rtn;
  313.         case COMMAND:
  314.             if ((int) p1 == ID_HELP)    {
  315.                 DisplayHelp(wnd, "MEMOPADDOC");
  316.                 return TRUE;
  317.             }
  318.             break;
  319.         case CLOSE_WINDOW:
  320.             if (wnd->TextChanged)    {
  321.                 char *cp = malloc(25+strlen(GetTitle(wnd)));
  322.                 SendMessage(wnd, SETFOCUS, TRUE, 0);
  323.                 if (cp != NULL)    {
  324.                     strcpy(cp, GetTitle(wnd));
  325.                     strcat(cp, "\nText changed. Save it?");
  326.                     if (YesNoBox(cp))
  327.                         SendMessage(GetParent(wnd), COMMAND, ID_SAVE, 0);
  328.                     free(cp);
  329.                 }
  330.             }
  331.             wndpos = 0;
  332.             if (wnd->extension != NULL)    {
  333.                 free(wnd->extension);
  334.                 wnd->extension = NULL;
  335.             }
  336.             break;
  337.         default:
  338.             break;
  339.     }
  340.     return DefaultWndProc(wnd, msg, p1, p2);
  341. }
  342.  
  343. static char *NameComponent(char *FileName)
  344. {
  345.     char *Fname;
  346.     if ((Fname = strrchr(FileName, '\\')) == NULL)
  347.         if ((Fname = strrchr(FileName, ':')) == NULL)
  348.             Fname = FileName-1;
  349.     return Fname + 1;
  350. }
  351.  
  352.