1 /* --------------- edit.c ----------- */
5 extern DF_DBOX PrintSetup
;
7 char DFlatApplication
[] = "Edit";
9 static char Untitled
[] = "Untitled";
13 static int MemoPadProc(DFWINDOW
, DFMESSAGE
, DF_PARAM
, DF_PARAM
);
14 static void NewFile(DFWINDOW
,char *);
15 static void SelectFile(DFWINDOW
);
16 static void PadWindow(DFWINDOW
, char *);
17 static void OpenPadWindow(DFWINDOW
, char *,char *);
18 static void LoadFile(DFWINDOW
);
19 static void PrintPad(DFWINDOW
);
20 static void SaveFile(DFWINDOW
, int);
21 static void EditDeleteFile(DFWINDOW
);
22 static int EditorProc(DFWINDOW
, DFMESSAGE
, DF_PARAM
, DF_PARAM
);
23 static char *NameComponent(char *);
24 static int PrintSetupProc(DFWINDOW
, DFMESSAGE
, DF_PARAM
, DF_PARAM
);
25 static void FixTabMenu(void);
27 void Calendar(DFWINDOW
);
29 //void BarChart(DFWINDOW);
35 int main (int argc
, char *argv
[])
40 if (DfInitialize () == FALSE
)
45 // if (!DfLoadConfig())
46 // DfCfg.ScreenLines = DF_SCREENHEIGHT;
47 wnd
= DfDfCreateWindow (DF_APPLICATION
,
48 "FreeDos Edit " DF_VERSION
,
60 DfSendMessage (wnd
, DFM_SETFOCUS
, TRUE
, 0);
62 // Load the files from args - if the file does not exist, open a new window....
65 // check if the file exists....
66 if (( fp
= fopen(argv
[1],"r")) == NULL
)
68 // file does not exist - create new window
72 PadWindow(wnd
, argv
[1]);
77 while (DfDispatchMessage ())
85 /* ------ open text files and put them into editboxes ----- */
86 static void PadWindow(DFWINDOW wnd
, char *FileName
)
89 struct _finddata_t ff
;
93 DfCreatePath(path
, FileName
, FALSE
, FALSE
);
94 cp
= path
+strlen(path
);
95 DfCreatePath(path
, FileName
, TRUE
, FALSE
);
96 ax
= _findfirst(path
, &ff
);
102 OpenPadWindow(wnd
, path
,NULL
);
104 while (_findnext(ax
, &ff
) == 0);
108 /* ------- window processing module for the
109 Edit application window ----- */
110 static int MemoPadProc(DFWINDOW wnd
,DFMESSAGE msg
,DF_PARAM p1
,DF_PARAM p2
)
115 case DFM_CREATE_WINDOW
:
116 rtn
= DfDefaultWndProc(wnd
, msg
, p1
, p2
);
117 if (DfCfg
.InsertMode
)
118 DfSetCommandToggle(&DfMainMenu
, DF_ID_INSERT
);
120 DfSetCommandToggle(&DfMainMenu
, DF_ID_WRAP
);
135 SaveFile(DfInFocus
, FALSE
);
139 SaveFile(DfInFocus
, TRUE
);
142 case DF_ID_DELETEFILE
:
143 EditDeleteFile(DfInFocus
);
146 case DF_ID_PRINTSETUP
:
147 DfDialogBox(wnd
, &PrintSetup
, TRUE
, PrintSetupProc
);
155 if (!DfYesNoBox("Exit FreeDos Edit?"))
160 DfCfg
.WordWrap
= DfGetCommandToggle(&DfMainMenu
, DF_ID_WRAP
);
164 DfCfg
.InsertMode
= DfGetCommandToggle(&DfMainMenu
, DF_ID_INSERT
);
191 // case DF_ID_BARCHART:
197 "About D-Flat and FreeDos Edit",
198 " ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n"
204 " RÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄU\n"
205 "D-Flat implements the SAA/CUA\n"
206 "interface in a public domain\n"
207 "C language library originally\n"
208 "published in Dr. Dobb's Journal\n"
209 " ------------------------ \n"
210 "FreeDos Edit is a clone of MSDOS\n"
211 "editor for the FREEDOS Project");
223 return DfDefaultWndProc(wnd
, msg
, p1
, p2
);
226 /* --- The New command. Open an empty editor window --- */
227 static void NewFile(DFWINDOW wnd
, char *FileName
)
229 OpenPadWindow(wnd
, Untitled
,FileName
);
232 /* --- The Open... command. Select a file --- */
233 static void SelectFile(DFWINDOW wnd
)
235 char FileName
[MAX_PATH
];
237 if (DfOpenFileDialogBox("*.*", FileName
))
239 /* see if the document is already in a window */
240 DFWINDOW wnd1
= DfFirstWindow(wnd
);
243 if (wnd1
->extension
&&
244 stricmp(FileName
, wnd1
->extension
) == 0)
246 DfSendMessage(wnd1
, DFM_SETFOCUS
, TRUE
, 0);
247 DfSendMessage(wnd1
, DFM_RESTORE
, 0, 0);
250 wnd1
= DfNextWindow(wnd1
);
252 OpenPadWindow(wnd
, FileName
, NULL
);
256 /* --- open a document window and load a file --- */
257 static void OpenPadWindow(DFWINDOW wnd
, char *FileName
,char *NewFileName
)
259 static DFWINDOW wnd1
= NULL
;
262 char *Fname
= FileName
;
265 if (strcmp(FileName
, Untitled
))
267 if (stat(FileName
, &sb
))
269 ermsg
= DfMalloc(strlen(FileName
)+20);
270 strcpy(ermsg
, "No such file as\n");
271 strcat(ermsg
, FileName
);
272 DfErrorMessage(ermsg
);
277 Fname
= NameComponent(FileName
);
280 if (sb
.st_size
> 64000)
282 ermsg
= DfMalloc(strlen(FileName
)+20);
283 strcpy(ermsg
, "File too large for this version of Edit\n");
284 DfErrorMessage(ermsg
);
290 wwnd
= DfWatchIcon();
293 if (NewFileName
!= NULL
)
294 Fname
= NameComponent(NewFileName
);
299 wnd1
= DfDfCreateWindow(DF_EDITBOX
,
301 (wndpos
-1)*2, wndpos
, 10, 40,
302 NULL
, wnd
, EditorProc
,
313 if (strcmp(FileName
, Untitled
))
315 wnd1
->extension
= DfMalloc(strlen(FileName
)+1);
316 strcpy(wnd1
->extension
, FileName
);
319 DfSendMessage(wwnd
, DFM_CLOSE_WINDOW
, 0, 0);
320 DfSendMessage(wnd1
, DFM_SETFOCUS
, TRUE
, 0);
321 DfSendMessage(wnd1
, DFM_MAXIMIZE
, 0, 0);
324 /* --- Load the notepad file into the editor text buffer --- */
325 static void LoadFile(DFWINDOW wnd
)
331 if ((fp
= fopen(wnd
->extension
, "rt")) != NULL
)
336 Buf
= DfRealloc(Buf
, recptr
+150);
337 memset(Buf
+recptr
, 0, 150);
338 fgets(Buf
+recptr
, 150, fp
);
339 recptr
+= strlen(Buf
+recptr
);
344 DfSendMessage(wnd
, DFM_SETTEXT
, (DF_PARAM
) Buf
, 0);
353 /* ------- print a character -------- */
354 static void PrintChar(FILE *prn
, int c
)
358 if (c
== '\n' || CharCtr
== DfCfg
.RightMargin
)
362 if (LineCtr
== DfCfg
.BottomMargin
)
365 for (i
= 0; i
< DfCfg
.TopMargin
; i
++)
367 LineCtr
= DfCfg
.TopMargin
;
375 for (i
= 0; i
< DfCfg
.LeftMargin
; i
++)
385 /* --- print the current notepad --- */
386 static void PrintPad(DFWINDOW wnd
)
388 if (*DfCfg
.PrinterPort
)
391 if ((prn
= fopen(DfCfg
.PrinterPort
, "wt")) != NULL
)
394 BOOL KeepPrinting
= TRUE
;
395 char *text
= DfGetText(wnd
);
396 unsigned oldpct
= 100, cct
= 0, len
= strlen(text
);
397 DFWINDOW swnd
= DfSliderBox(20, DfGetTitle(wnd
), "Printing");
398 /* ------- print the notepad text --------- */
399 LineCtr
= CharCtr
= 0;
400 while (KeepPrinting
&& *text
)
402 PrintChar(prn
, *text
++);
403 percent
= ((long) ++cct
* 100) / len
;
404 if ((int)percent
!= (int)oldpct
)
406 oldpct
= (int) percent
;
407 KeepPrinting
= DfSendMessage(swnd
, DFM_PAINT
, 0, oldpct
);
411 /* ---- user did not cancel ---- */
413 DfSendMessage(swnd
, DFM_PAINT
, 0, 100);
414 /* ------- follow with a form feed? --------- */
415 if (DfYesNoBox("Form Feed?"))
420 DfErrorMessage("Cannot open printer file");
423 DfErrorMessage("No printer selected");
426 /* ---------- save a file to disk ------------ */
427 static void SaveFile(DFWINDOW wnd
, int Saveas
)
430 if (wnd
->extension
== NULL
|| Saveas
) {
431 char FileName
[MAX_PATH
];
432 if (DfSaveAsDialogBox(FileName
)) {
433 if (wnd
->extension
!= NULL
)
434 free(wnd
->extension
);
435 wnd
->extension
= DfMalloc(strlen(FileName
)+1);
436 strcpy(wnd
->extension
, FileName
);
437 DfAddTitle(wnd
, NameComponent(FileName
));
438 DfSendMessage(wnd
, DFM_BORDER
, 0, 0);
443 if (wnd
->extension
!= NULL
)
445 DFWINDOW mwnd
= DfMomentaryMessage("Saving the file");
446 if ((fp
= fopen(wnd
->extension
, "wt")) != NULL
)
448 fwrite(DfGetText(wnd
), strlen(DfGetText(wnd
)), 1, fp
);
450 wnd
->TextChanged
= FALSE
;
452 DfSendMessage(mwnd
, DFM_CLOSE_WINDOW
, 0, 0);
455 /* -------- delete a file ------------ */
456 static void EditDeleteFile(DFWINDOW wnd
)
458 if (wnd
->extension
!= NULL
) {
459 if (strcmp(wnd
->extension
, Untitled
)) {
460 char *fn
= NameComponent(wnd
->extension
);
463 sprintf(msg
, "Delete %s?", fn
);
464 if (DfYesNoBox(msg
)) {
465 unlink(wnd
->extension
);
466 DfSendMessage(wnd
, DFM_CLOSE_WINDOW
, 0, 0);
472 /* ------ display the row and column in the statusbar ------ */
473 static void ShowPosition(DFWINDOW wnd
)
476 sprintf(status
, "Line:%4d Column: %2d",
477 wnd
->CurrLine
, wnd
->CurrCol
);
478 DfSendMessage(DfGetParent(wnd
), DFM_ADDSTATUS
, (DF_PARAM
) status
, 0);
481 /* window processing module for the editboxes */
482 static int EditorProc(DFWINDOW wnd
,DFMESSAGE msg
,DF_PARAM p1
,DF_PARAM p2
)
491 wnd
->InsertMode
= DfGetCommandToggle(&DfMainMenu
, DF_ID_INSERT
);
492 wnd
->WordWrapMode
= DfGetCommandToggle(&DfMainMenu
, DF_ID_WRAP
);
494 rtn
= DfDefaultWndProc(wnd
, msg
, p1
, p2
);
495 if ((int)p1
== FALSE
)
496 DfSendMessage(DfGetParent(wnd
), DFM_ADDSTATUS
, 0, 0);
501 case DFM_KEYBOARD_CURSOR
:
502 rtn
= DfDefaultWndProc(wnd
, msg
, p1
, p2
);
515 case DF_ID_SEARCHNEXT
:
519 DfCopyToClipboard(wnd
);
520 DfSendMessage(wnd
, DFM_COMMAND
, DF_ID_DELETETEXT
, 0);
521 DfSendMessage(wnd
, DFM_PAINT
, 0, 0);
524 DfCopyToClipboard(wnd
);
525 DfClearTextBlock(wnd
);
526 DfSendMessage(wnd
, DFM_PAINT
, 0, 0);
529 DfPasteFromClipboard(wnd
);
530 DfSendMessage(wnd
, DFM_PAINT
, 0, 0);
532 case DF_ID_DELETETEXT
:
534 rtn
= DfDefaultWndProc(wnd
, msg
, p1
, p2
);
535 DfSendMessage(wnd
, DFM_PAINT
, 0, 0);
538 DfDisplayHelp(wnd
, "MEMOPADDOC");
541 DfSendMessage(DfGetParent(wnd
), DFM_COMMAND
, DF_ID_WRAP
, 0);
542 wnd
->WordWrapMode
= DfCfg
.WordWrap
;
545 DfSendMessage(DfGetParent(wnd
), DFM_COMMAND
, DF_ID_INSERT
, 0);
546 wnd
->InsertMode
= DfCfg
.InsertMode
;
547 DfSendMessage(NULL
, DFM_SHOW_CURSOR
, wnd
->InsertMode
, 0);
554 case DFM_CLOSE_WINDOW
:
555 if (wnd
->TextChanged
)
557 char *cp
= DfMalloc(25+strlen(DfGetTitle(wnd
)));
558 DfSendMessage(wnd
, DFM_SETFOCUS
, TRUE
, 0);
559 strcpy(cp
, DfGetTitle(wnd
));
560 strcat(cp
, "\nText changed. Save it?");
562 DfSendMessage(DfGetParent(wnd
), DFM_COMMAND
, DF_ID_SAVE
, 0);
566 if (wnd
->extension
!= NULL
)
568 free(wnd
->extension
);
569 wnd
->extension
= NULL
;
577 return DfDefaultWndProc(wnd
, msg
, p1
, p2
);
580 /* -- point to the name component of a file specification -- */
581 static char *NameComponent(char *FileName
)
584 if ((Fname
= strrchr(FileName
, '\\')) == NULL
)
585 if ((Fname
= strrchr(FileName
, ':')) == NULL
)
590 static char *ports
[] = {
591 "Lpt1", "Lpt2", "Lpt3",
592 "Com1", "Com2", "Com3", "Com4",
596 static int PrintSetupProc(DFWINDOW wnd
, DFMESSAGE msg
, DF_PARAM p1
, DF_PARAM p2
)
604 case DFM_CREATE_WINDOW
:
605 rtn
= DfDefaultWndProc(wnd
, msg
, p1
, p2
);
606 DfPutItemText(wnd
, DF_ID_PRINTERPORT
, DfCfg
.PrinterPort
);
607 while (ports
[i
] != NULL
)
608 DfPutComboListText(wnd
, DF_ID_PRINTERPORT
, ports
[i
++]);
609 for (mar
= CHARSLINE
; mar
>= 0; --mar
)
611 sprintf(marg
, "%3d", mar
);
612 DfPutItemText(wnd
, DF_ID_LEFTMARGIN
, marg
);
613 DfPutItemText(wnd
, DF_ID_RIGHTMARGIN
, marg
);
615 for (mar
= LINESPAGE
; mar
>= 0; --mar
)
617 sprintf(marg
, "%3d", mar
);
618 DfPutItemText(wnd
, DF_ID_TOPMARGIN
, marg
);
619 DfPutItemText(wnd
, DF_ID_BOTTOMMARGIN
, marg
);
621 cwnd
= DfControlWindow(&PrintSetup
, DF_ID_LEFTMARGIN
);
622 DfSendMessage(cwnd
, DFM_LB_SETSELECTION
,
623 CHARSLINE
-DfCfg
.LeftMargin
, 0);
624 cwnd
= DfControlWindow(&PrintSetup
, DF_ID_RIGHTMARGIN
);
625 DfSendMessage(cwnd
, DFM_LB_SETSELECTION
,
626 CHARSLINE
-DfCfg
.RightMargin
, 0);
627 cwnd
= DfControlWindow(&PrintSetup
, DF_ID_TOPMARGIN
);
628 DfSendMessage(cwnd
, DFM_LB_SETSELECTION
,
629 LINESPAGE
-DfCfg
.TopMargin
, 0);
630 cwnd
= DfControlWindow(&PrintSetup
, DF_ID_BOTTOMMARGIN
);
631 DfSendMessage(cwnd
, DFM_LB_SETSELECTION
,
632 LINESPAGE
-DfCfg
.BottomMargin
, 0);
635 if ((int) p1
== DF_ID_OK
&& (int) p2
== 0)
637 DfGetItemText(wnd
, DF_ID_PRINTERPORT
, DfCfg
.PrinterPort
, 4);
638 cwnd
= DfControlWindow(&PrintSetup
, DF_ID_LEFTMARGIN
);
639 DfCfg
.LeftMargin
= CHARSLINE
-
640 DfSendMessage(cwnd
, DFM_LB_CURRENTSELECTION
, 0, 0);
641 cwnd
= DfControlWindow(&PrintSetup
, DF_ID_RIGHTMARGIN
);
642 DfCfg
.RightMargin
= CHARSLINE
-
643 DfSendMessage(cwnd
, DFM_LB_CURRENTSELECTION
, 0, 0);
644 cwnd
= DfControlWindow(&PrintSetup
, DF_ID_TOPMARGIN
);
645 DfCfg
.TopMargin
= LINESPAGE
-
646 DfSendMessage(cwnd
, DFM_LB_CURRENTSELECTION
, 0, 0);
647 cwnd
= DfControlWindow(&PrintSetup
, DF_ID_BOTTOMMARGIN
);
648 DfCfg
.BottomMargin
= LINESPAGE
-
649 DfSendMessage(cwnd
, DFM_LB_CURRENTSELECTION
, 0, 0);
655 return DfDefaultWndProc(wnd
, msg
, p1
, p2
);
658 static void FixTabMenu(void)
660 char *cp
= DfGetCommandText(&DfMainMenu
, DF_ID_TABS
);
668 // *(p+1) = (char)(DfCfg.Tabs + '0');
669 // if (DfGetClass(DfInFocus) == DF_POPDOWNMENU)
670 // DfSendMessage(DfInFocus, DFM_PAINT, 0, 0);
675 void DfPrepFileMenu(void *w
, struct DfMenu
*mnu
)
678 DfDeactivateCommand(&DfMainMenu
, DF_ID_SAVE
);
679 DfDeactivateCommand(&DfMainMenu
, DF_ID_SAVEAS
);
680 DfDeactivateCommand(&DfMainMenu
, DF_ID_DELETEFILE
);
681 DfDeactivateCommand(&DfMainMenu
, DF_ID_PRINT
);
682 if (wnd
!= NULL
&& DfGetClass(wnd
) == DF_EDITBOX
)
684 if (DfIsMultiLine(wnd
))
686 DfActivateCommand(&DfMainMenu
, DF_ID_SAVE
);
687 DfActivateCommand(&DfMainMenu
, DF_ID_SAVEAS
);
688 DfActivateCommand(&DfMainMenu
, DF_ID_DELETEFILE
);
689 DfActivateCommand(&DfMainMenu
, DF_ID_PRINT
);
694 void DfPrepSearchMenu(void *w
, struct DfMenu
*mnu
)
697 DfDeactivateCommand(&DfMainMenu
, DF_ID_SEARCH
);
698 DfDeactivateCommand(&DfMainMenu
, DF_ID_REPLACE
);
699 DfDeactivateCommand(&DfMainMenu
, DF_ID_SEARCHNEXT
);
700 if (wnd
!= NULL
&& DfGetClass(wnd
) == DF_EDITBOX
)
702 if (DfIsMultiLine(wnd
))
704 DfActivateCommand(&DfMainMenu
, DF_ID_SEARCH
);
705 DfActivateCommand(&DfMainMenu
, DF_ID_REPLACE
);
706 DfActivateCommand(&DfMainMenu
, DF_ID_SEARCHNEXT
);
711 void DfPrepEditMenu(void *w
, struct DfMenu
*mnu
)
714 DfDeactivateCommand(&DfMainMenu
, DF_ID_CUT
);
715 DfDeactivateCommand(&DfMainMenu
, DF_ID_COPY
);
716 DfDeactivateCommand(&DfMainMenu
, DF_ID_CLEAR
);
717 DfDeactivateCommand(&DfMainMenu
, DF_ID_DELETETEXT
);
718 DfDeactivateCommand(&DfMainMenu
, DF_ID_PARAGRAPH
);
719 DfDeactivateCommand(&DfMainMenu
, DF_ID_PASTE
);
720 DfDeactivateCommand(&DfMainMenu
, DF_ID_UNDO
);
721 if (wnd
!= NULL
&& DfGetClass(wnd
) == DF_EDITBOX
)
723 if (DfIsMultiLine(wnd
))
725 if (DfTextBlockMarked(wnd
))
727 DfActivateCommand(&DfMainMenu
, DF_ID_CUT
);
728 DfActivateCommand(&DfMainMenu
, DF_ID_COPY
);
729 DfActivateCommand(&DfMainMenu
, DF_ID_CLEAR
);
730 DfActivateCommand(&DfMainMenu
, DF_ID_DELETETEXT
);
732 DfActivateCommand(&DfMainMenu
, DF_ID_PARAGRAPH
);
733 if (!DfTestAttribute(wnd
, DF_READONLY
) && DfClipboard
!= NULL
)
734 DfActivateCommand(&DfMainMenu
, DF_ID_PASTE
);
735 if (wnd
->DeletedText
!= NULL
)
736 DfActivateCommand(&DfMainMenu
, DF_ID_UNDO
);