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
;
263 char *Fnewname
= NewFileName
;
266 if (strcmp(FileName
, Untitled
))
268 if (stat(FileName
, &sb
))
270 ermsg
= DfMalloc(strlen(FileName
)+20);
271 strcpy(ermsg
, "No such file as\n");
272 strcat(ermsg
, FileName
);
273 DfErrorMessage(ermsg
);
278 Fname
= NameComponent(FileName
);
281 if (sb
.st_size
> 64000)
283 ermsg
= DfMalloc(strlen(FileName
)+20);
284 strcpy(ermsg
, "File too large for this version of Edit\n");
285 DfErrorMessage(ermsg
);
291 wwnd
= DfWatchIcon();
294 if (NewFileName
!= NULL
)
295 Fname
= NameComponent(NewFileName
);
300 wnd1
= DfDfCreateWindow(DF_EDITBOX
,
302 (wndpos
-1)*2, wndpos
, 10, 40,
303 NULL
, wnd
, EditorProc
,
314 if (strcmp(FileName
, Untitled
))
316 wnd1
->extension
= DfMalloc(strlen(FileName
)+1);
317 strcpy(wnd1
->extension
, FileName
);
320 DfSendMessage(wwnd
, DFM_CLOSE_WINDOW
, 0, 0);
321 DfSendMessage(wnd1
, DFM_SETFOCUS
, TRUE
, 0);
322 DfSendMessage(wnd1
, DFM_MAXIMIZE
, 0, 0);
325 /* --- Load the notepad file into the editor text buffer --- */
326 static void LoadFile(DFWINDOW wnd
)
332 if ((fp
= fopen(wnd
->extension
, "rt")) != NULL
)
337 Buf
= DfRealloc(Buf
, recptr
+150);
338 memset(Buf
+recptr
, 0, 150);
339 fgets(Buf
+recptr
, 150, fp
);
340 recptr
+= strlen(Buf
+recptr
);
345 DfSendMessage(wnd
, DFM_SETTEXT
, (DF_PARAM
) Buf
, 0);
354 /* ------- print a character -------- */
355 static void PrintChar(FILE *prn
, int c
)
359 if (c
== '\n' || CharCtr
== DfCfg
.RightMargin
)
363 if (LineCtr
== DfCfg
.BottomMargin
)
366 for (i
= 0; i
< DfCfg
.TopMargin
; i
++)
368 LineCtr
= DfCfg
.TopMargin
;
376 for (i
= 0; i
< DfCfg
.LeftMargin
; i
++)
386 /* --- print the current notepad --- */
387 static void PrintPad(DFWINDOW wnd
)
389 if (*DfCfg
.PrinterPort
)
392 if ((prn
= fopen(DfCfg
.PrinterPort
, "wt")) != NULL
)
395 BOOL KeepPrinting
= TRUE
;
396 char *text
= DfGetText(wnd
);
397 unsigned oldpct
= 100, cct
= 0, len
= strlen(text
);
398 DFWINDOW swnd
= DfSliderBox(20, DfGetTitle(wnd
), "Printing");
399 /* ------- print the notepad text --------- */
400 LineCtr
= CharCtr
= 0;
401 while (KeepPrinting
&& *text
)
403 PrintChar(prn
, *text
++);
404 percent
= ((long) ++cct
* 100) / len
;
405 if ((int)percent
!= (int)oldpct
)
407 oldpct
= (int) percent
;
408 KeepPrinting
= DfSendMessage(swnd
, DFM_PAINT
, 0, oldpct
);
412 /* ---- user did not cancel ---- */
414 DfSendMessage(swnd
, DFM_PAINT
, 0, 100);
415 /* ------- follow with a form feed? --------- */
416 if (DfYesNoBox("Form Feed?"))
421 DfErrorMessage("Cannot open printer file");
424 DfErrorMessage("No printer selected");
427 /* ---------- save a file to disk ------------ */
428 static void SaveFile(DFWINDOW wnd
, int Saveas
)
431 if (wnd
->extension
== NULL
|| Saveas
) {
432 char FileName
[MAX_PATH
];
433 if (DfSaveAsDialogBox(FileName
)) {
434 if (wnd
->extension
!= NULL
)
435 free(wnd
->extension
);
436 wnd
->extension
= DfMalloc(strlen(FileName
)+1);
437 strcpy(wnd
->extension
, FileName
);
438 DfAddTitle(wnd
, NameComponent(FileName
));
439 DfSendMessage(wnd
, DFM_BORDER
, 0, 0);
444 if (wnd
->extension
!= NULL
)
446 DFWINDOW mwnd
= DfMomentaryMessage("Saving the file");
447 if ((fp
= fopen(wnd
->extension
, "wt")) != NULL
)
449 fwrite(DfGetText(wnd
), strlen(DfGetText(wnd
)), 1, fp
);
451 wnd
->TextChanged
= FALSE
;
453 DfSendMessage(mwnd
, DFM_CLOSE_WINDOW
, 0, 0);
456 /* -------- delete a file ------------ */
457 static void EditDeleteFile(DFWINDOW wnd
)
459 if (wnd
->extension
!= NULL
) {
460 if (strcmp(wnd
->extension
, Untitled
)) {
461 char *fn
= NameComponent(wnd
->extension
);
464 sprintf(msg
, "Delete %s?", fn
);
465 if (DfYesNoBox(msg
)) {
466 unlink(wnd
->extension
);
467 DfSendMessage(wnd
, DFM_CLOSE_WINDOW
, 0, 0);
473 /* ------ display the row and column in the statusbar ------ */
474 static void ShowPosition(DFWINDOW wnd
)
477 sprintf(status
, "Line:%4d Column: %2d",
478 wnd
->CurrLine
, wnd
->CurrCol
);
479 DfSendMessage(DfGetParent(wnd
), DFM_ADDSTATUS
, (DF_PARAM
) status
, 0);
482 /* window processing module for the editboxes */
483 static int EditorProc(DFWINDOW wnd
,DFMESSAGE msg
,DF_PARAM p1
,DF_PARAM p2
)
492 wnd
->InsertMode
= DfGetCommandToggle(&DfMainMenu
, DF_ID_INSERT
);
493 wnd
->WordWrapMode
= DfGetCommandToggle(&DfMainMenu
, DF_ID_WRAP
);
495 rtn
= DfDefaultWndProc(wnd
, msg
, p1
, p2
);
496 if ((int)p1
== FALSE
)
497 DfSendMessage(DfGetParent(wnd
), DFM_ADDSTATUS
, 0, 0);
502 case DFM_KEYBOARD_CURSOR
:
503 rtn
= DfDefaultWndProc(wnd
, msg
, p1
, p2
);
516 case DF_ID_SEARCHNEXT
:
520 DfCopyToClipboard(wnd
);
521 DfSendMessage(wnd
, DFM_COMMAND
, DF_ID_DELETETEXT
, 0);
522 DfSendMessage(wnd
, DFM_PAINT
, 0, 0);
525 DfCopyToClipboard(wnd
);
526 DfClearTextBlock(wnd
);
527 DfSendMessage(wnd
, DFM_PAINT
, 0, 0);
530 DfPasteFromClipboard(wnd
);
531 DfSendMessage(wnd
, DFM_PAINT
, 0, 0);
533 case DF_ID_DELETETEXT
:
535 rtn
= DfDefaultWndProc(wnd
, msg
, p1
, p2
);
536 DfSendMessage(wnd
, DFM_PAINT
, 0, 0);
539 DfDisplayHelp(wnd
, "MEMOPADDOC");
542 DfSendMessage(DfGetParent(wnd
), DFM_COMMAND
, DF_ID_WRAP
, 0);
543 wnd
->WordWrapMode
= DfCfg
.WordWrap
;
546 DfSendMessage(DfGetParent(wnd
), DFM_COMMAND
, DF_ID_INSERT
, 0);
547 wnd
->InsertMode
= DfCfg
.InsertMode
;
548 DfSendMessage(NULL
, DFM_SHOW_CURSOR
, wnd
->InsertMode
, 0);
555 case DFM_CLOSE_WINDOW
:
556 if (wnd
->TextChanged
)
558 char *cp
= DfMalloc(25+strlen(DfGetTitle(wnd
)));
559 DfSendMessage(wnd
, DFM_SETFOCUS
, TRUE
, 0);
560 strcpy(cp
, DfGetTitle(wnd
));
561 strcat(cp
, "\nText changed. Save it?");
563 DfSendMessage(DfGetParent(wnd
), DFM_COMMAND
, DF_ID_SAVE
, 0);
567 if (wnd
->extension
!= NULL
)
569 free(wnd
->extension
);
570 wnd
->extension
= NULL
;
578 return DfDefaultWndProc(wnd
, msg
, p1
, p2
);
581 /* -- point to the name component of a file specification -- */
582 static char *NameComponent(char *FileName
)
585 if ((Fname
= strrchr(FileName
, '\\')) == NULL
)
586 if ((Fname
= strrchr(FileName
, ':')) == NULL
)
591 static char *ports
[] = {
592 "Lpt1", "Lpt2", "Lpt3",
593 "Com1", "Com2", "Com3", "Com4",
597 static int PrintSetupProc(DFWINDOW wnd
, DFMESSAGE msg
, DF_PARAM p1
, DF_PARAM p2
)
605 case DFM_CREATE_WINDOW
:
606 rtn
= DfDefaultWndProc(wnd
, msg
, p1
, p2
);
607 DfPutItemText(wnd
, DF_ID_PRINTERPORT
, DfCfg
.PrinterPort
);
608 while (ports
[i
] != NULL
)
609 DfPutComboListText(wnd
, DF_ID_PRINTERPORT
, ports
[i
++]);
610 for (mar
= CHARSLINE
; mar
>= 0; --mar
)
612 sprintf(marg
, "%3d", mar
);
613 DfPutItemText(wnd
, DF_ID_LEFTMARGIN
, marg
);
614 DfPutItemText(wnd
, DF_ID_RIGHTMARGIN
, marg
);
616 for (mar
= LINESPAGE
; mar
>= 0; --mar
)
618 sprintf(marg
, "%3d", mar
);
619 DfPutItemText(wnd
, DF_ID_TOPMARGIN
, marg
);
620 DfPutItemText(wnd
, DF_ID_BOTTOMMARGIN
, marg
);
622 cwnd
= DfControlWindow(&PrintSetup
, DF_ID_LEFTMARGIN
);
623 DfSendMessage(cwnd
, DFM_LB_SETSELECTION
,
624 CHARSLINE
-DfCfg
.LeftMargin
, 0);
625 cwnd
= DfControlWindow(&PrintSetup
, DF_ID_RIGHTMARGIN
);
626 DfSendMessage(cwnd
, DFM_LB_SETSELECTION
,
627 CHARSLINE
-DfCfg
.RightMargin
, 0);
628 cwnd
= DfControlWindow(&PrintSetup
, DF_ID_TOPMARGIN
);
629 DfSendMessage(cwnd
, DFM_LB_SETSELECTION
,
630 LINESPAGE
-DfCfg
.TopMargin
, 0);
631 cwnd
= DfControlWindow(&PrintSetup
, DF_ID_BOTTOMMARGIN
);
632 DfSendMessage(cwnd
, DFM_LB_SETSELECTION
,
633 LINESPAGE
-DfCfg
.BottomMargin
, 0);
636 if ((int) p1
== DF_ID_OK
&& (int) p2
== 0)
638 DfGetItemText(wnd
, DF_ID_PRINTERPORT
, DfCfg
.PrinterPort
, 4);
639 cwnd
= DfControlWindow(&PrintSetup
, DF_ID_LEFTMARGIN
);
640 DfCfg
.LeftMargin
= CHARSLINE
-
641 DfSendMessage(cwnd
, DFM_LB_CURRENTSELECTION
, 0, 0);
642 cwnd
= DfControlWindow(&PrintSetup
, DF_ID_RIGHTMARGIN
);
643 DfCfg
.RightMargin
= CHARSLINE
-
644 DfSendMessage(cwnd
, DFM_LB_CURRENTSELECTION
, 0, 0);
645 cwnd
= DfControlWindow(&PrintSetup
, DF_ID_TOPMARGIN
);
646 DfCfg
.TopMargin
= LINESPAGE
-
647 DfSendMessage(cwnd
, DFM_LB_CURRENTSELECTION
, 0, 0);
648 cwnd
= DfControlWindow(&PrintSetup
, DF_ID_BOTTOMMARGIN
);
649 DfCfg
.BottomMargin
= LINESPAGE
-
650 DfSendMessage(cwnd
, DFM_LB_CURRENTSELECTION
, 0, 0);
656 return DfDefaultWndProc(wnd
, msg
, p1
, p2
);
659 static void FixTabMenu(void)
661 char *cp
= DfGetCommandText(&DfMainMenu
, DF_ID_TABS
);
669 // *(p+1) = (char)(DfCfg.Tabs + '0');
670 // if (DfGetClass(DfInFocus) == DF_POPDOWNMENU)
671 // DfSendMessage(DfInFocus, DFM_PAINT, 0, 0);
676 void DfPrepFileMenu(void *w
, struct DfMenu
*mnu
)
679 DfDeactivateCommand(&DfMainMenu
, DF_ID_SAVE
);
680 DfDeactivateCommand(&DfMainMenu
, DF_ID_SAVEAS
);
681 DfDeactivateCommand(&DfMainMenu
, DF_ID_DELETEFILE
);
682 DfDeactivateCommand(&DfMainMenu
, DF_ID_PRINT
);
683 if (wnd
!= NULL
&& DfGetClass(wnd
) == DF_EDITBOX
)
685 if (DfIsMultiLine(wnd
))
687 DfActivateCommand(&DfMainMenu
, DF_ID_SAVE
);
688 DfActivateCommand(&DfMainMenu
, DF_ID_SAVEAS
);
689 DfActivateCommand(&DfMainMenu
, DF_ID_DELETEFILE
);
690 DfActivateCommand(&DfMainMenu
, DF_ID_PRINT
);
695 void DfPrepSearchMenu(void *w
, struct DfMenu
*mnu
)
698 DfDeactivateCommand(&DfMainMenu
, DF_ID_SEARCH
);
699 DfDeactivateCommand(&DfMainMenu
, DF_ID_REPLACE
);
700 DfDeactivateCommand(&DfMainMenu
, DF_ID_SEARCHNEXT
);
701 if (wnd
!= NULL
&& DfGetClass(wnd
) == DF_EDITBOX
)
703 if (DfIsMultiLine(wnd
))
705 DfActivateCommand(&DfMainMenu
, DF_ID_SEARCH
);
706 DfActivateCommand(&DfMainMenu
, DF_ID_REPLACE
);
707 DfActivateCommand(&DfMainMenu
, DF_ID_SEARCHNEXT
);
712 void DfPrepEditMenu(void *w
, struct DfMenu
*mnu
)
715 DfDeactivateCommand(&DfMainMenu
, DF_ID_CUT
);
716 DfDeactivateCommand(&DfMainMenu
, DF_ID_COPY
);
717 DfDeactivateCommand(&DfMainMenu
, DF_ID_CLEAR
);
718 DfDeactivateCommand(&DfMainMenu
, DF_ID_DELETETEXT
);
719 DfDeactivateCommand(&DfMainMenu
, DF_ID_PARAGRAPH
);
720 DfDeactivateCommand(&DfMainMenu
, DF_ID_PASTE
);
721 DfDeactivateCommand(&DfMainMenu
, DF_ID_UNDO
);
722 if (wnd
!= NULL
&& DfGetClass(wnd
) == DF_EDITBOX
)
724 if (DfIsMultiLine(wnd
))
726 if (DfTextBlockMarked(wnd
))
728 DfActivateCommand(&DfMainMenu
, DF_ID_CUT
);
729 DfActivateCommand(&DfMainMenu
, DF_ID_COPY
);
730 DfActivateCommand(&DfMainMenu
, DF_ID_CLEAR
);
731 DfActivateCommand(&DfMainMenu
, DF_ID_DELETETEXT
);
733 DfActivateCommand(&DfMainMenu
, DF_ID_PARAGRAPH
);
734 if (!DfTestAttribute(wnd
, DF_READONLY
) && DfClipboard
!= NULL
)
735 DfActivateCommand(&DfMainMenu
, DF_ID_PASTE
);
736 if (wnd
->DeletedText
!= NULL
)
737 DfActivateCommand(&DfMainMenu
, DF_ID_UNDO
);