4ae2d5de4755e84416706dd7bbb2526dc7ba03e5
1 /* --------------- edit.c ----------- */
5 extern DBOX PrintSetup
;
7 char DFlatApplication
[] = "Edit";
9 static char Untitled
[] = "Untitled";
13 static int MemoPadProc(DFWINDOW
, DFMESSAGE
, PARAM
, 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
, PARAM
, PARAM
);
23 static char *NameComponent(char *);
24 static int PrintSetupProc(DFWINDOW
, DFMESSAGE
, PARAM
, PARAM
);
25 static void FixTabMenu(void);
27 void Calendar(DFWINDOW
);
29 //void BarChart(DFWINDOW);
35 int main (int argc
, char *argv
[])
44 // cfg.ScreenLines = SCREENHEIGHT;
45 wnd
= DfCreateWindow (APPLICATION
,
46 "FreeDos Edit " VERSION
,
58 DfSendMessage (wnd
, SETFOCUS
, TRUE
, 0);
60 // Load the files from args - if the file does not exist, open a new window....
63 // check if the file exists....
64 if (( fp
= fopen(argv
[1],"r")) == NULL
)
66 // file does not exist - create new window
70 PadWindow(wnd
, argv
[1]);
75 while (DfDispatchMessage ())
81 /* ------ open text files and put them into editboxes ----- */
82 static void PadWindow(DFWINDOW wnd
, char *FileName
)
85 struct _finddata_t ff
;
89 CreatePath(path
, FileName
, FALSE
, FALSE
);
90 cp
= path
+strlen(path
);
91 CreatePath(path
, FileName
, TRUE
, FALSE
);
92 ax
= _findfirst(path
, &ff
);
98 OpenPadWindow(wnd
, path
,NULL
);
100 while (_findnext(ax
, &ff
) == 0);
104 /* ------- window processing module for the
105 Edit application window ----- */
106 static int MemoPadProc(DFWINDOW wnd
,DFMESSAGE msg
,PARAM p1
,PARAM p2
)
112 rtn
= DefaultWndProc(wnd
, msg
, p1
, p2
);
114 SetCommandToggle(&MainMenu
, ID_INSERT
);
116 SetCommandToggle(&MainMenu
, ID_WRAP
);
131 SaveFile(inFocus
, FALSE
);
135 SaveFile(inFocus
, TRUE
);
139 EditDeleteFile(inFocus
);
143 DfDialogBox(wnd
, &PrintSetup
, TRUE
, PrintSetupProc
);
151 if (!DfYesNoBox("Exit FreeDos Edit?"))
156 cfg
.WordWrap
= GetCommandToggle(&MainMenu
, ID_WRAP
);
160 cfg
.InsertMode
= GetCommandToggle(&MainMenu
, ID_INSERT
);
193 "About D-Flat and FreeDos Edit",
194 " ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n"
200 " RÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄU\n"
201 "D-Flat implements the SAA/CUA\n"
202 "interface in a public domain\n"
203 "C language library originally\n"
204 "published in Dr. Dobb's Journal\n"
205 " ------------------------ \n"
206 "FreeDos Edit is a clone of MSDOS\n"
207 "editor for the FREEDOS Project");
219 return DefaultWndProc(wnd
, msg
, p1
, p2
);
222 /* --- The New command. Open an empty editor window --- */
223 static void NewFile(DFWINDOW wnd
, char *FileName
)
225 OpenPadWindow(wnd
, Untitled
,FileName
);
228 /* --- The Open... command. Select a file --- */
229 static void SelectFile(DFWINDOW wnd
)
231 char FileName
[MAX_PATH
];
233 if (OpenFileDialogBox("*.*", FileName
))
235 /* see if the document is already in a window */
236 DFWINDOW wnd1
= FirstWindow(wnd
);
239 if (wnd1
->extension
&&
240 stricmp(FileName
, wnd1
->extension
) == 0)
242 DfSendMessage(wnd1
, SETFOCUS
, TRUE
, 0);
243 DfSendMessage(wnd1
, RESTORE
, 0, 0);
246 wnd1
= NextWindow(wnd1
);
248 OpenPadWindow(wnd
, FileName
, NULL
);
252 /* --- open a document window and load a file --- */
253 static void OpenPadWindow(DFWINDOW wnd
, char *FileName
,char *NewFileName
)
255 static DFWINDOW wnd1
= NULL
;
258 char *Fname
= FileName
;
259 char *Fnewname
= NewFileName
;
262 if (strcmp(FileName
, Untitled
))
264 if (stat(FileName
, &sb
))
266 ermsg
= DFmalloc(strlen(FileName
)+20);
267 strcpy(ermsg
, "No such file as\n");
268 strcat(ermsg
, FileName
);
269 DfErrorMessage(ermsg
);
274 Fname
= NameComponent(FileName
);
277 if (sb
.st_size
> 64000)
279 ermsg
= DFmalloc(strlen(FileName
)+20);
280 strcpy(ermsg
, "File too large for this version of Edit\n");
281 DfErrorMessage(ermsg
);
290 if (NewFileName
!= NULL
)
291 Fname
= NameComponent(NewFileName
);
296 wnd1
= DfCreateWindow(EDITBOX
,
298 (wndpos
-1)*2, wndpos
, 10, 40,
299 NULL
, wnd
, EditorProc
,
310 if (strcmp(FileName
, Untitled
))
312 wnd1
->extension
= DFmalloc(strlen(FileName
)+1);
313 strcpy(wnd1
->extension
, FileName
);
316 DfSendMessage(wwnd
, CLOSE_WINDOW
, 0, 0);
317 DfSendMessage(wnd1
, SETFOCUS
, TRUE
, 0);
318 DfSendMessage(wnd1
, MAXIMIZE
, 0, 0);
321 /* --- Load the notepad file into the editor text buffer --- */
322 static void LoadFile(DFWINDOW wnd
)
328 if ((fp
= fopen(wnd
->extension
, "rt")) != NULL
)
333 Buf
= DFrealloc(Buf
, recptr
+150);
334 memset(Buf
+recptr
, 0, 150);
335 fgets(Buf
+recptr
, 150, fp
);
336 recptr
+= strlen(Buf
+recptr
);
341 DfSendMessage(wnd
, SETTEXT
, (PARAM
) Buf
, 0);
350 /* ------- print a character -------- */
351 static void PrintChar(FILE *prn
, int c
)
355 if (c
== '\n' || CharCtr
== cfg
.RightMargin
)
359 if (LineCtr
== cfg
.BottomMargin
)
362 for (i
= 0; i
< cfg
.TopMargin
; i
++)
364 LineCtr
= cfg
.TopMargin
;
372 for (i
= 0; i
< cfg
.LeftMargin
; i
++)
382 /* --- print the current notepad --- */
383 static void PrintPad(DFWINDOW wnd
)
385 if (*cfg
.PrinterPort
)
388 if ((prn
= fopen(cfg
.PrinterPort
, "wt")) != NULL
)
391 BOOL KeepPrinting
= TRUE
;
392 unsigned char *text
= GetText(wnd
);
393 unsigned oldpct
= 100, cct
= 0, len
= strlen(text
);
394 DFWINDOW swnd
= SliderBox(20, GetTitle(wnd
), "Printing");
395 /* ------- print the notepad text --------- */
396 LineCtr
= CharCtr
= 0;
397 while (KeepPrinting
&& *text
)
399 PrintChar(prn
, *text
++);
400 percent
= ((long) ++cct
* 100) / len
;
401 if ((int)percent
!= (int)oldpct
)
403 oldpct
= (int) percent
;
404 KeepPrinting
= DfSendMessage(swnd
, PAINT
, 0, oldpct
);
408 /* ---- user did not cancel ---- */
410 DfSendMessage(swnd
, PAINT
, 0, 100);
411 /* ------- follow with a form feed? --------- */
412 if (DfYesNoBox("Form Feed?"))
417 DfErrorMessage("Cannot open printer file");
420 DfErrorMessage("No printer selected");
423 /* ---------- save a file to disk ------------ */
424 static void SaveFile(DFWINDOW wnd
, int Saveas
)
427 if (wnd
->extension
== NULL
|| Saveas
) {
428 char FileName
[MAX_PATH
];
429 if (SaveAsDialogBox(FileName
)) {
430 if (wnd
->extension
!= NULL
)
431 free(wnd
->extension
);
432 wnd
->extension
= DFmalloc(strlen(FileName
)+1);
433 strcpy(wnd
->extension
, FileName
);
434 AddTitle(wnd
, NameComponent(FileName
));
435 DfSendMessage(wnd
, BORDER
, 0, 0);
440 if (wnd
->extension
!= NULL
)
442 DFWINDOW mwnd
= MomentaryMessage("Saving the file");
443 if ((fp
= fopen(wnd
->extension
, "wt")) != NULL
)
445 fwrite(GetText(wnd
), strlen(GetText(wnd
)), 1, fp
);
447 wnd
->TextChanged
= FALSE
;
449 DfSendMessage(mwnd
, CLOSE_WINDOW
, 0, 0);
452 /* -------- delete a file ------------ */
453 static void EditDeleteFile(DFWINDOW wnd
)
455 if (wnd
->extension
!= NULL
) {
456 if (strcmp(wnd
->extension
, Untitled
)) {
457 char *fn
= NameComponent(wnd
->extension
);
460 sprintf(msg
, "Delete %s?", fn
);
461 if (DfYesNoBox(msg
)) {
462 unlink(wnd
->extension
);
463 DfSendMessage(wnd
, CLOSE_WINDOW
, 0, 0);
469 /* ------ display the row and column in the statusbar ------ */
470 static void ShowPosition(DFWINDOW wnd
)
473 sprintf(status
, "Line:%4d Column: %2d",
474 wnd
->CurrLine
, wnd
->CurrCol
);
475 DfSendMessage(GetParent(wnd
), ADDSTATUS
, (PARAM
) status
, 0);
478 /* window processing module for the editboxes */
479 static int EditorProc(DFWINDOW wnd
,DFMESSAGE msg
,PARAM p1
,PARAM p2
)
488 wnd
->InsertMode
= GetCommandToggle(&MainMenu
, ID_INSERT
);
489 wnd
->WordWrapMode
= GetCommandToggle(&MainMenu
, ID_WRAP
);
491 rtn
= DefaultWndProc(wnd
, msg
, p1
, p2
);
492 if ((int)p1
== FALSE
)
493 DfSendMessage(GetParent(wnd
), ADDSTATUS
, 0, 0);
498 case KEYBOARD_CURSOR
:
499 rtn
= DefaultWndProc(wnd
, msg
, p1
, p2
);
516 CopyToClipboard(wnd
);
517 DfSendMessage(wnd
, DFM_COMMAND
, ID_DELETETEXT
, 0);
518 DfSendMessage(wnd
, PAINT
, 0, 0);
521 CopyToClipboard(wnd
);
523 DfSendMessage(wnd
, PAINT
, 0, 0);
526 PasteFromClipboard(wnd
);
527 DfSendMessage(wnd
, PAINT
, 0, 0);
531 rtn
= DefaultWndProc(wnd
, msg
, p1
, p2
);
532 DfSendMessage(wnd
, PAINT
, 0, 0);
535 DisplayHelp(wnd
, "MEMOPADDOC");
538 DfSendMessage(GetParent(wnd
), DFM_COMMAND
, ID_WRAP
, 0);
539 wnd
->WordWrapMode
= cfg
.WordWrap
;
542 DfSendMessage(GetParent(wnd
), DFM_COMMAND
, ID_INSERT
, 0);
543 wnd
->InsertMode
= cfg
.InsertMode
;
544 DfSendMessage(NULL
, SHOW_CURSOR
, wnd
->InsertMode
, 0);
552 if (wnd
->TextChanged
)
554 char *cp
= DFmalloc(25+strlen(GetTitle(wnd
)));
555 DfSendMessage(wnd
, SETFOCUS
, TRUE
, 0);
556 strcpy(cp
, GetTitle(wnd
));
557 strcat(cp
, "\nText changed. Save it?");
559 DfSendMessage(GetParent(wnd
), DFM_COMMAND
, ID_SAVE
, 0);
563 if (wnd
->extension
!= NULL
)
565 free(wnd
->extension
);
566 wnd
->extension
= NULL
;
574 return DefaultWndProc(wnd
, msg
, p1
, p2
);
577 /* -- point to the name component of a file specification -- */
578 static char *NameComponent(char *FileName
)
581 if ((Fname
= strrchr(FileName
, '\\')) == NULL
)
582 if ((Fname
= strrchr(FileName
, ':')) == NULL
)
587 static char *ports
[] = {
588 "Lpt1", "Lpt2", "Lpt3",
589 "Com1", "Com2", "Com3", "Com4",
593 static int PrintSetupProc(DFWINDOW wnd
, DFMESSAGE msg
, PARAM p1
, PARAM p2
)
602 rtn
= DefaultWndProc(wnd
, msg
, p1
, p2
);
603 PutItemText(wnd
, ID_PRINTERPORT
, cfg
.PrinterPort
);
604 while (ports
[i
] != NULL
)
605 PutComboListText(wnd
, ID_PRINTERPORT
, ports
[i
++]);
606 for (mar
= CHARSLINE
; mar
>= 0; --mar
)
608 sprintf(marg
, "%3d", mar
);
609 PutItemText(wnd
, ID_LEFTMARGIN
, marg
);
610 PutItemText(wnd
, ID_RIGHTMARGIN
, marg
);
612 for (mar
= LINESPAGE
; mar
>= 0; --mar
)
614 sprintf(marg
, "%3d", mar
);
615 PutItemText(wnd
, ID_TOPMARGIN
, marg
);
616 PutItemText(wnd
, ID_BOTTOMMARGIN
, marg
);
618 cwnd
= ControlWindow(&PrintSetup
, ID_LEFTMARGIN
);
619 DfSendMessage(cwnd
, LB_SETSELECTION
,
620 CHARSLINE
-cfg
.LeftMargin
, 0);
621 cwnd
= ControlWindow(&PrintSetup
, ID_RIGHTMARGIN
);
622 DfSendMessage(cwnd
, LB_SETSELECTION
,
623 CHARSLINE
-cfg
.RightMargin
, 0);
624 cwnd
= ControlWindow(&PrintSetup
, ID_TOPMARGIN
);
625 DfSendMessage(cwnd
, LB_SETSELECTION
,
626 LINESPAGE
-cfg
.TopMargin
, 0);
627 cwnd
= ControlWindow(&PrintSetup
, ID_BOTTOMMARGIN
);
628 DfSendMessage(cwnd
, LB_SETSELECTION
,
629 LINESPAGE
-cfg
.BottomMargin
, 0);
632 if ((int) p1
== ID_OK
&& (int) p2
== 0)
634 GetItemText(wnd
, ID_PRINTERPORT
, cfg
.PrinterPort
, 4);
635 cwnd
= ControlWindow(&PrintSetup
, ID_LEFTMARGIN
);
636 cfg
.LeftMargin
= CHARSLINE
-
637 DfSendMessage(cwnd
, LB_CURRENTSELECTION
, 0, 0);
638 cwnd
= ControlWindow(&PrintSetup
, ID_RIGHTMARGIN
);
639 cfg
.RightMargin
= CHARSLINE
-
640 DfSendMessage(cwnd
, LB_CURRENTSELECTION
, 0, 0);
641 cwnd
= ControlWindow(&PrintSetup
, ID_TOPMARGIN
);
642 cfg
.TopMargin
= LINESPAGE
-
643 DfSendMessage(cwnd
, LB_CURRENTSELECTION
, 0, 0);
644 cwnd
= ControlWindow(&PrintSetup
, ID_BOTTOMMARGIN
);
645 cfg
.BottomMargin
= LINESPAGE
-
646 DfSendMessage(cwnd
, LB_CURRENTSELECTION
, 0, 0);
652 return DefaultWndProc(wnd
, msg
, p1
, p2
);
655 static void FixTabMenu(void)
657 char *cp
= GetCommandText(&MainMenu
, ID_TABS
);
665 // *(p+1) = (char)(cfg.Tabs + '0');
666 // if (GetClass(inFocus) == POPDOWNMENU)
667 // DfSendMessage(inFocus, PAINT, 0, 0);
672 void PrepFileMenu(void *w
, struct Menu
*mnu
)
675 DeactivateCommand(&MainMenu
, ID_SAVE
);
676 DeactivateCommand(&MainMenu
, ID_SAVEAS
);
677 DeactivateCommand(&MainMenu
, ID_DELETEFILE
);
678 DeactivateCommand(&MainMenu
, ID_PRINT
);
679 if (wnd
!= NULL
&& GetClass(wnd
) == EDITBOX
)
681 if (isMultiLine(wnd
))
683 ActivateCommand(&MainMenu
, ID_SAVE
);
684 ActivateCommand(&MainMenu
, ID_SAVEAS
);
685 ActivateCommand(&MainMenu
, ID_DELETEFILE
);
686 ActivateCommand(&MainMenu
, ID_PRINT
);
691 void PrepSearchMenu(void *w
, struct Menu
*mnu
)
694 DeactivateCommand(&MainMenu
, ID_SEARCH
);
695 DeactivateCommand(&MainMenu
, ID_REPLACE
);
696 DeactivateCommand(&MainMenu
, ID_SEARCHNEXT
);
697 if (wnd
!= NULL
&& GetClass(wnd
) == EDITBOX
)
699 if (isMultiLine(wnd
))
701 ActivateCommand(&MainMenu
, ID_SEARCH
);
702 ActivateCommand(&MainMenu
, ID_REPLACE
);
703 ActivateCommand(&MainMenu
, ID_SEARCHNEXT
);
708 void PrepEditMenu(void *w
, struct Menu
*mnu
)
711 DeactivateCommand(&MainMenu
, ID_CUT
);
712 DeactivateCommand(&MainMenu
, ID_COPY
);
713 DeactivateCommand(&MainMenu
, ID_CLEAR
);
714 DeactivateCommand(&MainMenu
, ID_DELETETEXT
);
715 DeactivateCommand(&MainMenu
, ID_PARAGRAPH
);
716 DeactivateCommand(&MainMenu
, ID_PASTE
);
717 DeactivateCommand(&MainMenu
, ID_UNDO
);
718 if (wnd
!= NULL
&& GetClass(wnd
) == EDITBOX
)
720 if (isMultiLine(wnd
))
722 if (TextBlockMarked(wnd
))
724 ActivateCommand(&MainMenu
, ID_CUT
);
725 ActivateCommand(&MainMenu
, ID_COPY
);
726 ActivateCommand(&MainMenu
, ID_CLEAR
);
727 ActivateCommand(&MainMenu
, ID_DELETETEXT
);
729 ActivateCommand(&MainMenu
, ID_PARAGRAPH
);
730 if (!TestAttribute(wnd
, READONLY
) && Clipboard
!= NULL
)
731 ActivateCommand(&MainMenu
, ID_PASTE
);
732 if (wnd
->DeletedText
!= NULL
)
733 ActivateCommand(&MainMenu
, ID_UNDO
);