home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1997 May / Pcwk0597.iso / delphi / jwrite.lzh / EXAMPLE / CHILDWIN.PAS < prev    next >
Pascal/Delphi Source File  |  1996-04-30  |  16KB  |  540 lines

  1. (*-------------------------------------------------------------------------------------*)
  2. (*                                                                                     *)
  3. (*               Unit: Childwin                                                        *)
  4. (*                                                                                     *)
  5. (*               Copyright McCallum Whyman Associates Ltd 1996                         *)
  6. (*                                                                                     *)
  7. (*               Version 1.0                                                           *)
  8. (*                                                                                     *)
  9. (*               Author: Tony Whyman                                                   *)
  10. (*                                                                                     *)
  11. (*               Description: This module is part of the J-Write example application   *)
  12. (*                            and defines the TMDIChild class.                         *)
  13. (*-------------------------------------------------------------------------------------*)
  14.  
  15. unit Childwin;
  16.  
  17. interface
  18.  
  19. uses WinTypes, WinProcs, Classes, Graphics, Forms, Controls, Menus,
  20.   FileView, Dialogs;
  21.  
  22. type
  23.   TMDIChild = class(TForm)
  24.     MainMenu1: TMainMenu;
  25.     FileEditor1: TFileEditor;
  26.     Search1: TMenuItem;
  27.     Find1: TMenuItem;
  28.     FindNext1: TMenuItem;
  29.     Replace1: TMenuItem;
  30.     Edit1: TMenuItem;
  31.     Copy1: TMenuItem;
  32.     Cut1: TMenuItem;
  33.     Paste1: TMenuItem;
  34.     GotoLine1: TMenuItem;
  35.     Options1: TMenuItem;
  36.     Font1: TMenuItem;
  37.     File1: TMenuItem;
  38.     N1: TMenuItem;
  39.     Save1: TMenuItem;
  40.     SaveAs1: TMenuItem;
  41.     Close1: TMenuItem;
  42.     N2: TMenuItem;
  43.     Print1: TMenuItem;
  44.     New1: TMenuItem;
  45.     Open1: TMenuItem;
  46.     N3: TMenuItem;
  47.     Exit1: TMenuItem;
  48.     Undo1: TMenuItem;
  49.     N4: TMenuItem;
  50.     FindDialog1: TFindDialog;
  51.     FontDialog1: TFontDialog;
  52.     Redo1: TMenuItem;
  53.     SaveDialog1: TSaveDialog;
  54.     PrintDialog1: TPrintDialog;
  55.     N5: TMenuItem;
  56.     FlowText1: TMenuItem;
  57.     Capitalise1: TMenuItem;
  58.     N6: TMenuItem;
  59.     InsertPageBreak1: TMenuItem;
  60.     InsertDateTime1: TMenuItem;
  61.     ReplaceDialog1: TReplaceDialog;
  62.     Colour1: TMenuItem;
  63.     ColorDialog1: TColorDialog;
  64.     N7: TMenuItem;
  65.     SelectAll1: TMenuItem;
  66.     PopupMenu1: TPopupMenu;
  67.     Find2: TMenuItem;
  68.     N8: TMenuItem;
  69.     Cut2: TMenuItem;
  70.     Copy2: TMenuItem;
  71.     Paste2: TMenuItem;
  72.     N9: TMenuItem;
  73.     FlowText2: TMenuItem;
  74.     MaxLineLength1: TMenuItem;
  75.     PrintSetup1: TMenuItem;
  76.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  77.     procedure Undo1Click(Sender: TObject);
  78.     procedure Cut1Click(Sender: TObject);
  79.     procedure Copy1Click(Sender: TObject);
  80.     procedure Paste1Click(Sender: TObject);
  81.     procedure Find1Click(Sender: TObject);
  82.     procedure FindDialog1Find(Sender: TObject);
  83.     procedure Font1Click(Sender: TObject);
  84.     procedure Redo1Click(Sender: TObject);
  85.     procedure FindNext1Click(Sender: TObject);
  86.     procedure Close1Click(Sender: TObject);
  87.     procedure New1Click(Sender: TObject);
  88.     procedure Open1Click(Sender: TObject);
  89.     procedure FileEditor1NewFileName(Sender: TObject);
  90.     procedure Save1Click(Sender: TObject);
  91.     procedure SaveAs1Click(Sender: TObject);
  92.     procedure FileEditor1SaveModified(Sender: TObject;
  93.       var SaveRequest: TModalResult);
  94.     procedure FileEditor1SaveModePrompt(Sender: TObject;
  95.       var Mode: TSaveMode);
  96.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  97.     procedure Print1Click(Sender: TObject);
  98.     procedure Exit1Click(Sender: TObject);
  99.     procedure FlowText1Click(Sender: TObject);
  100.     procedure Capitalise1Click(Sender: TObject);
  101.     procedure InsertPageBreak1Click(Sender: TObject);
  102.     procedure InsertDateTime1Click(Sender: TObject);
  103.     procedure Replace1Click(Sender: TObject);
  104.     procedure ReplaceDialog1Find(Sender: TObject);
  105.     procedure Colour1Click(Sender: TObject);
  106.     procedure GotoLine1Click(Sender: TObject);
  107.     procedure FileEditor1StateChange(Sender: TObject);
  108.     procedure SelectAll1Click(Sender: TObject);
  109.     procedure FileEditor1ProgressEvent(Sender: TLinesViewer; Done,
  110.       Total: Longint; var Cancel: Boolean);
  111.     procedure FileEditor1Enter(Sender: TObject);
  112.     procedure FileEditor1Exit(Sender: TObject);
  113.     procedure FileEditor1CaretMoved(Sender: TObject);
  114.     procedure FileEditor1WrapModeChange(Sender: TObject);
  115.     procedure MaxLineLength1Click(Sender: TObject);
  116.     procedure FileEditor1ReplaceAll(Sender: TObject; Count: Integer);
  117.     procedure FileEditor1AbortRequest(Sender: TLinesViewer;
  118.       var Response: Word);
  119.     procedure PrintSetup1Click(Sender: TObject);
  120.   private
  121.     { Private declarations }
  122.     LastState: TViewerStates;
  123.   public
  124.     { Public declarations }
  125.   end;
  126.  
  127. implementation
  128.  
  129. Uses main, Printers, SysUtils;
  130.  
  131. {$R *.DFM}
  132.  
  133.  
  134. procedure TMDIChild.FormClose(Sender: TObject; var Action: TCloseAction);
  135. begin
  136.   Action := caFree;
  137. end;
  138.  
  139. procedure TMDIChild.Undo1Click(Sender: TObject);
  140. begin
  141.      FileEditor1.Undo
  142. end;
  143.  
  144. procedure TMDIChild.Cut1Click(Sender: TObject);
  145. begin
  146.      FileEditor1.CutToClipBoard
  147. end;
  148.  
  149. procedure TMDIChild.Copy1Click(Sender: TObject);
  150. begin
  151.      FileEditor1.CopyToClipboard
  152. end;
  153.  
  154. procedure TMDIChild.Paste1Click(Sender: TObject);
  155. begin
  156.      FileEditor1.PasteFromClipBoard
  157. end;
  158.  
  159. procedure TMDIChild.Find1Click(Sender: TObject);
  160. begin
  161.      FindDialog1.FindText := FileEditor1.GetInitialFindStr;
  162.      FindDialog1.Execute
  163. end;
  164.  
  165. procedure TMDIChild.FindDialog1Find(Sender: TObject);
  166. begin
  167.      With Sender As TFindDialog Do
  168.         If not FileEditor1.Find(TFindDialog(Sender),FindText,Options) Then
  169.            MessageDlg('Text not Found',mtError,[mbOK],0)
  170.  
  171. end;
  172.  
  173. procedure TMDIChild.Font1Click(Sender: TObject);
  174. begin
  175.      With FontDialog1 Do
  176.      Begin
  177.           Font := FileEditor1.Font;
  178.           If Execute Then
  179.              FileEditor1.Font := Font
  180.      End
  181. end;
  182.  
  183. procedure TMDIChild.Redo1Click(Sender: TObject);
  184. begin
  185.      FileEditor1.Redo
  186. end;
  187.  
  188. procedure TMDIChild.FindNext1Click(Sender: TObject);
  189. begin
  190.      FileEditor1.FindNext(nil)
  191. end;
  192.  
  193. procedure TMDIChild.Close1Click(Sender: TObject);
  194. begin
  195.      Close
  196. end;
  197.  
  198. procedure TMDIChild.New1Click(Sender: TObject);
  199. begin
  200.      mainform.FileNewItemClick(Sender)
  201. end;
  202.  
  203. procedure TMDIChild.Open1Click(Sender: TObject);
  204. begin
  205.      MainForm.FileOpenItemClick(Sender)
  206. end;
  207.  
  208. procedure TMDIChild.FileEditor1NewFileName(Sender: TObject);
  209. begin
  210.      Caption := FileEditor1.FileName
  211. end;
  212.  
  213. procedure TMDIChild.Save1Click(Sender: TObject);
  214. begin
  215.      FileEditor1.Save
  216. end;
  217.  
  218. procedure TMDIChild.SaveAs1Click(Sender: TObject);
  219. begin
  220.      With SaveDialog1 Do
  221.      If Execute Then
  222.         FileEditor1.SaveAs(FileName)
  223. end;
  224.  
  225. procedure TMDIChild.FileEditor1SaveModified(Sender: TObject;
  226.   var SaveRequest: TModalResult);
  227. begin
  228.      SaveRequest := MessageDlg(Caption + ' has been Modified, Save File?',
  229.                          mtConfirmation,mbYesNoCancel,0)
  230. end;
  231.  
  232. procedure TMDIChild.FileEditor1SaveModePrompt(Sender: TObject;
  233.   var Mode: TSaveMode);
  234. begin
  235.      If FileEditor1.WrapMode = opNone Then
  236.         Mode := smParagraph
  237.      Else
  238.      If Mode = smPrompt Then
  239.      Case MessageDlg('Convert soft Line Breaks to hard Line Breaks?',mtConfirmation,[mbYes,MBNo],0) Of
  240.      mrYes:     Mode := smLineBreaks;
  241.      mrNo:      Mode := smParagraph;
  242.      End
  243.  
  244. end;
  245.  
  246. procedure TMDIChild.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  247. begin
  248.      FileEditor1.Clear;
  249.      CanClose := not (vsModified in FileEditor1.State)
  250. end;
  251.  
  252. procedure TMDIChild.Print1Click(Sender: TObject);
  253.  
  254. var Wrap: boolean;
  255.     I: integer;
  256.  
  257. begin
  258.    With PrintDialog1 Do
  259.    If Execute Then
  260.    Begin
  261.      If Printer.Handle = 0 Then
  262.      Begin
  263.           MessageDlg('Printer not setup',mtError,[mbOK],0);
  264.           Exit
  265.      End;
  266.  
  267.      {Determine Wrap Mode}
  268.      If FileEditor1.WrapMode <> opPrinter Then
  269.         Case MessageDlg('Wrap text to printer width?',mtConfirmation,mbYesNoCancel,0) Of
  270.         mrCancel: Exit;
  271.         mrYes:    Wrap := true;
  272.         mrNo:     Wrap := false;
  273.         End
  274.      Else
  275.          Wrap := true;
  276.  
  277.      {Print required number of copies}
  278.  
  279.      For I := 1 To Copies Do
  280.             FileEditor1.Print(Caption,Caption,true,Wrap,PrintRange,FromPage,ToPage)
  281.      End
  282. end;
  283.  
  284. procedure TMDIChild.Exit1Click(Sender: TObject);
  285. begin
  286.      MainForm.Close
  287. end;
  288.  
  289. procedure TMDIChild.FlowText1Click(Sender: TObject);
  290. begin
  291.      FileEditor1.FlowText
  292. end;
  293.  
  294. procedure TMDIChild.Capitalise1Click(Sender: TObject);
  295. begin
  296.      FileEditor1.Capitalise
  297. end;
  298.  
  299. procedure TMDIChild.InsertPageBreak1Click(Sender: TObject);
  300. begin
  301.      FileEditor1.InsertChar(#12)
  302. end;
  303.  
  304. procedure TMDIChild.InsertDateTime1Click(Sender: TObject);
  305. begin
  306.      FileEditor1.InsertDateTime(Now)
  307. end;
  308.  
  309. procedure TMDIChild.Replace1Click(Sender: TObject);
  310. begin
  311.      ReplaceDialog1.FindText := FileEditor1.GetInitialFindStr;
  312.      ReplaceDialog1.Execute
  313.  
  314. end;
  315.  
  316. procedure TMDIChild.ReplaceDialog1Find(Sender: TObject);
  317. begin
  318.      With Sender As TReplaceDialog Do
  319.           If not FileEditor1.Replace(TFindDialog(Sender),FindText,ReplaceText,Options) Then
  320.              MessageDlg('Text not found',mtError,[mbOK],0)
  321.  
  322. end;
  323.  
  324. procedure TMDIChild.Colour1Click(Sender: TObject);
  325. begin
  326.      With ColorDialog1 Do
  327.      Begin
  328.           Color := FileEditor1.Color;
  329.           If Execute Then
  330.              FileEditor1.Color := Color
  331.      End
  332. end;
  333.  
  334. procedure TMDIChild.GotoLine1Click(Sender: TObject);
  335.  
  336. var S: String;
  337.     N: longint;
  338.     Code: integer;
  339. begin
  340.    Str(FileEditor1.LineNumber,S);
  341.    Repeat
  342.      If InputQuery('Goto Line Number','Enter Line Number',S) Then
  343.      Begin
  344.         Val(S,N,Code);
  345.         If Code <> 0 Then
  346.            MessageDlg('A number must be entered here',mtError,[mbYes],0)
  347.         Else
  348.             FileEditor1.LineNumber := N
  349.      End
  350.      Else
  351.          Break
  352.    Until Code = 0
  353.  
  354. end;
  355.  
  356. procedure TMDIChild.FileEditor1StateChange(Sender: TObject);
  357.  
  358. var NotEmpty: boolean;
  359.     TextSelected: boolean;
  360.     PasteAvailable: boolean;
  361.     State: TViewerStates;
  362.  
  363. begin
  364.      If (Sender is TTextViewer) And TTextViewer(Sender).Focused Then
  365.         State := TTextViewer(Sender).State
  366.      Else
  367.         State := [];
  368.  
  369.      If LastState <> State Then
  370.      With MainForm Do
  371.      Begin
  372.           If (vsBusy in State) And not (vsBusy in LastState) Then
  373.           Begin
  374.                If not (ProgressMeter1.Visible) Then
  375.                Begin
  376.                     ProgressMeter1.Visible := true;
  377.                     ProgressMeter1.PercentDone := 0;
  378.                     StatusPanel.Caption := 'Press Esc to Cancel'
  379.                End
  380.           End
  381.           Else
  382.           Begin
  383.           If not (vsBusy in State) And (vsBusy in LastState) Then
  384.           Begin
  385.                If ProgressMeter1.Visible Then
  386.                Begin
  387.                     ProgressMeter1.Visible := false;
  388.                     StatusPanel.Caption := Application.Hint;
  389.                End;
  390.           End;
  391.           TextSelected := vsSelection in State;
  392.           NotEmpty := not (vsEmpty in State);
  393.           PasteAvailable := vsPasteAvailable in State;
  394.  
  395.           PrintBtn.Enabled := NotEmpty;
  396.           CutBtn.Enabled := TextSelected;
  397.           CopyBtn.Enabled := TextSelected;
  398.           PasteBtn.Enabled := PasteAvailable;
  399.           Print1.Enabled := NotEmpty;
  400.           Save1.Enabled := NotEmpty;
  401.           SelectAll1.Enabled := NotEmpty;
  402.           FlowText1.Enabled := NotEmpty;
  403.           FlowText2.Enabled := NotEmpty;
  404.           Find1.Enabled := NotEmpty;
  405.           Find2.Enabled := NotEmpty;
  406.           FindNext1.Enabled := NotEmpty And (vsSearchString in State);
  407.           Replace1.Enabled := NotEmpty;
  408.           GotoLine1.Enabled := NotEmpty;
  409.           Undo1.Enabled := vsUndoAvailable in State;
  410.           Redo1.Enabled := vsRedoAvailable in State;
  411.           Cut1.Enabled := TextSelected;
  412.           Cut2.Enabled := TextSelected;
  413.           Copy1.Enabled := TextSelected;
  414.           Copy2.Enabled := TextSelected;
  415.           Paste1.Enabled := PasteAvailable;
  416.           Paste2.Enabled := PasteAvailable;
  417.           If vsModified in State Then
  418.           Begin
  419.                Save1.Enabled := true;
  420.                ModifiedPanel.Caption := 'Modified'
  421.           End
  422.           Else
  423.           Begin
  424.                Save1.Enabled := false;
  425.                ModifiedPanel.Caption := ''
  426.           End;
  427.           If vsInsertOn in State Then
  428.              InsertPanel.Caption := 'Insert'
  429.           Else
  430.               InsertPanel.Caption := 'Overwrite';
  431.               SaveBtn.Enabled := Save1.Enabled;
  432.           End;
  433.           LastState := State;
  434.      End;
  435. end;
  436.  
  437. procedure TMDIChild.SelectAll1Click(Sender: TObject);
  438. begin
  439.      FileEditor1.SelectAll
  440. end;
  441.  
  442. procedure TMDIChild.FileEditor1ProgressEvent(Sender: TLinesViewer; Done,
  443.   Total: Longint; var Cancel: Boolean);
  444. begin
  445.      MainForm.ProgressMeter1.PercentDone := trunc(100 * (Done / Total))
  446. end;
  447.  
  448. procedure TMDIChild.FileEditor1Enter(Sender: TObject);
  449. begin
  450.      Application.OnIdle := FileEditor1.HandleOnIdle;
  451.      MainForm.WrapNoneBtn.Enabled := true;
  452.      MainForm.WrapScreenBtn.Enabled := true;
  453.      MainForm.WrapPrinterBtn.Enabled := true;
  454.      MainForm.WrapAbsBtn.Enabled := true;
  455.      MainForm.WrapNoneBtn.Down := true;
  456.      MainForm.WrapScreenBtn.Down := true;
  457.      FileEditor1WrapModeChange(Sender);
  458. end;
  459.  
  460. procedure TMDIChild.FileEditor1Exit(Sender: TObject);
  461. begin
  462.      Application.OnIdle := nil;
  463.      MainForm.WrapNoneBtn.Enabled := false;
  464.      MainForm.WrapScreenBtn.Enabled := false;
  465.      MainForm.WrapPrinterBtn.Enabled := false;
  466.      MainForm.WrapAbsBtn.Enabled := false;
  467.      MainForm.LineCounter.Caption := '';
  468.      MainForm.InsertPanel.Caption := ''
  469. end;
  470.  
  471. procedure TMDIChild.FileEditor1CaretMoved(Sender: TObject);
  472. begin
  473.      With FileEditor1, MainForm Do
  474.      If Not (vsEmpty in State) Then
  475.      Begin
  476.           If EstimatedLineNumber Then
  477.              LineCounter.Caption := Format('Line ??? Char %d',[CharNumber])
  478.           Else
  479.               LineCounter.Caption := Format('Line %d Char %d',[LineNumber+1,CharNumber])
  480.      End
  481.      Else
  482.          LineCounter.Caption := ''
  483.  
  484. end;
  485.  
  486. procedure TMDIChild.FileEditor1WrapModeChange(Sender: TObject);
  487. begin
  488.      With MainFOrm Do
  489.           Case FileEditor1.WrapMode Of
  490.           opNone:
  491.             WrapNoneBtn.Down := true;
  492.           opAbsoluteWrap:
  493.             WrapAbsBtn.Down := true;
  494.           opPrinter:
  495.             WrapPrinterBtn.Down := true;
  496.           opWrapScreenWidth:
  497.             WrapScreenBtn.Down := true;
  498.           End
  499. end;
  500.  
  501. procedure TMDIChild.MaxLineLength1Click(Sender: TObject);
  502.  
  503. var S: String;
  504.     N: longint;
  505.     Code: integer;
  506. begin
  507.    Str(FileEditor1.MaxLineLength,S);
  508.    Repeat
  509.      If InputQuery('Set Maximum Line Length','Enter Max. Line Length',S) Then
  510.      Begin
  511.         Val(S,N,Code);
  512.         If Code <> 0 Then
  513.            MessageDlg('A number must be entered here',mtError,[mbYes],0)
  514.         Else
  515.             FileEditor1.MaxLineLength := N
  516.      End
  517.      Else
  518.          Break
  519.    Until Code = 0
  520. end;
  521.  
  522. procedure TMDIChild.FileEditor1ReplaceAll(Sender: TObject; Count: Integer);
  523. begin
  524.      MessageBeep(MB_OK);
  525.      MessageDlg(Format('%d items replaced',[Count]),mtInformation,[mbOK],0)
  526. end;
  527.  
  528. procedure TMDIChild.FileEditor1AbortRequest(Sender: TLinesViewer;
  529.   var Response: Word);
  530. begin
  531.      Response := MessageDlg('Abort Action?',mtConfirmation,[mbYes,mbNo],0)
  532. end;
  533.  
  534. procedure TMDIChild.PrintSetup1Click(Sender: TObject);
  535. begin
  536.      MainForm.PrintSetup1Click(Sender)
  537. end;
  538.  
  539. end.
  540.