home *** CD-ROM | disk | FTP | other *** search
/ Troubleshooting Netware Systems / CSTRIAL0196.BIN / attach / pcmag / v14n14 / wcomp.exe / WCOMPSRC.ZIP / CHILD.PAS < prev    next >
Pascal/Delphi Source File  |  1995-05-09  |  12KB  |  528 lines

  1. unit Child;
  2.  
  3. interface
  4.  
  5. uses
  6.   SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  7.   Forms, Dialogs, Menus, StdCtrls, Clipbrd, Printers, Options, IniFiles;
  8.  
  9. type
  10.   TEditForm = class(TForm)
  11.     MainMenu1: TMainMenu;
  12.     Edit1: TMenuItem;
  13.     Cut1: TMenuItem;
  14.     Copy1: TMenuItem;
  15.     Paste1: TMenuItem;
  16.     Delete1: TMenuItem;
  17.     N3: TMenuItem;
  18.     SelectAll1: TMenuItem;
  19.     Character1: TMenuItem;
  20.     Left1: TMenuItem;
  21.     Right1: TMenuItem;
  22.     Center1: TMenuItem;
  23.     N4: TMenuItem;
  24.     WordWrap1: TMenuItem;
  25.     N5: TMenuItem;
  26.     Font1: TMenuItem;
  27.     PopupMenu1: TPopupMenu;
  28.     Cut2: TMenuItem;
  29.     Copy2: TMenuItem;
  30.     Paste2: TMenuItem;
  31.     SaveFileDialog: TSaveDialog;
  32.     Memo1: TMemo;
  33.     FontDialog1: TFontDialog;
  34.     PrintDialog1: TPrintDialog;
  35.     PrinterSetupDialog1: TPrinterSetupDialog;
  36.     File1: TMenuItem;
  37.     Exit1: TMenuItem;
  38.     N6: TMenuItem;
  39.     PrintSetup1: TMenuItem;
  40.     Print1: TMenuItem;
  41.     N7: TMenuItem;
  42.     SaveAs1: TMenuItem;
  43.     Save1: TMenuItem;
  44.     N8: TMenuItem;
  45.     Close1: TMenuItem;
  46.     Open1: TMenuItem;
  47.     New1: TMenuItem;
  48.     Compare1: TMenuItem;
  49.     Window1: TMenuItem;
  50.     Cascade1: TMenuItem;
  51.     Tile1: TMenuItem;
  52.     Delete2: TMenuItem;
  53.     Compare2: TMenuItem;
  54.     SetOptions1: TMenuItem;
  55.     procedure New1Click(Sender: TObject);
  56.     procedure AlignClick(Sender: TObject);
  57.     procedure SetWordWrap(Sender: TObject);
  58.     procedure SelectAll(Sender: TObject);
  59.     procedure CutToClipboard(Sender: TObject);
  60.     procedure CopyToClipboard(Sender: TObject);
  61.     procedure PasteFromClipboard(Sender: TObject);
  62.     procedure Delete(Sender: TObject);
  63.     procedure SetEditItems(Sender: TObject);
  64.     procedure SetPopUpItems(Sender: TObject);
  65.     procedure Open1Click(Sender: TObject);
  66.     procedure Open(const AFilename: string);
  67.     procedure SaveAs1Click(Sender: TObject);
  68.     procedure Save1Click(Sender: TObject);
  69.     procedure SetFont(Sender: TObject);
  70.     procedure PrintSetup1Click(Sender: TObject);
  71.     procedure Print1Click(Sender: TObject);
  72.     procedure Close1Click(Sender: TObject);
  73.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  74.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  75.     procedure Exit1Click(Sender: TObject);
  76.     procedure Compare(Sender: TObject);
  77.     procedure Options(Sender: TObject);
  78.     procedure Cascade1Click(Sender: TObject);
  79.     procedure Tile1Click(Sender: TObject);
  80.     procedure SaveOptions1Click(Sender: TObject);
  81.   private
  82.     Filename: string;
  83.     procedure UpdateMenus;
  84.   public
  85.     destructor Destroy; override;
  86.     { Public declarations }
  87.   end;
  88.  
  89. var
  90.   EditForm: TEditForm;
  91.  
  92. implementation
  93.  
  94. uses
  95.   Main;
  96.  
  97. {$R *.DFM}
  98.  
  99. const
  100.   BackupExt = '.BAK';
  101.   SWarningText = 'Save Changes to "%s"?';
  102.  
  103. procedure TEditForm.New1Click(Sender: TObject);
  104. begin
  105.   FrameForm.NewChild(Sender);
  106. end;
  107.  
  108. procedure TEditForm.AlignClick(Sender: TObject);
  109. begin
  110.   Left1.Checked:= false;
  111.   Right1.Checked:= false;
  112.   Center1.Checked:=  false;
  113.   with Sender as TMenuItem do
  114.   begin
  115.     Checked:= true;
  116.     Memo1.Alignment:= TAlignment(Tag);
  117.   end;
  118. end;
  119.  
  120. procedure TEditForm.SetWordWrap(Sender: TObject);
  121. begin
  122.   with Memo1 do
  123.     begin
  124.       WordWrap:= not WordWrap;
  125.       if WordWrap then
  126.         ScrollBars:= ssVertical else
  127.         ScrollBars:= ssBoth;
  128.       WordWrap1.Checked:= WordWrap;
  129.     end;
  130. end;
  131.  
  132. procedure TEditForm.SelectAll(Sender: TObject);
  133. begin
  134.   Memo1.SelectAll;
  135. end;
  136.  
  137. procedure TEditForm.CutToClipboard(Sender: TObject);
  138. begin
  139.   Memo1.CutToClipboard;
  140. end;
  141.  
  142. procedure TEditForm.CopyToClipboard(Sender: TObject);
  143. begin
  144.   Memo1.CopyToClipboard;
  145. end;
  146.  
  147. procedure TEditForm.PasteFromClipboard(Sender: TObject);
  148. begin
  149.   Memo1.PasteFromClipboard;
  150. end;
  151.  
  152. procedure TEditForm.Delete(Sender: TObject);
  153. begin
  154.   Memo1.ClearSelection;
  155. end;
  156.  
  157. procedure TEditForm.UpdateMenus;
  158. var
  159.   HasSelection: boolean;
  160. begin
  161.   Paste1.Enabled:= Clipboard.HasFormat(CF_TEXT);
  162.   Paste2.Enabled:= Clipboard.HasFormat(CF_TEXT);
  163.   HasSelection:= Memo1.SelLength <> 0;
  164.   Cut1.Enabled:= HasSelection;
  165.   Cut2.Enabled:= HasSelection;
  166.   Copy1.Enabled:= HasSelection;
  167.   Copy2.Enabled:= HasSelection;
  168.   Delete1.Enabled:= HasSelection;
  169.   Delete2.Enabled:= HasSelection;
  170. end;
  171.  
  172. procedure TEditForm.SetEditItems(Sender: TObject);
  173. begin
  174.   UpdateMenus;
  175. end;
  176.  
  177. procedure TEditForm.SetPopUpItems(Sender: TObject);
  178. begin
  179.   UpdateMenus;
  180. end;
  181.  
  182. procedure TEditForm.Open1Click(Sender: TObject);
  183. begin
  184.   FrameForm.OpenChild(Sender);
  185. end;
  186.  
  187. procedure TEditForm.Open(const AFilename: string);
  188. begin
  189.   Filename:= AFilename;
  190.   Memo1.Text:= '';
  191.   Memo1.Lines.LoadFromFile(Filename);
  192.   Memo1.SelStart:= 0;
  193.   Caption:= Filename;
  194.   Memo1.Modified:= false;
  195. end;
  196.  
  197. procedure TEditForm.SaveAs1Click(Sender: TObject);
  198. begin
  199.   SaveFileDialog.Filename:= Filename;
  200.   if SaveFileDialog.Execute then
  201.   begin
  202.     Filename:= SaveFileDialog.Filename;
  203.     Caption:= Filename;
  204.     Save1Click(Sender);
  205.   end;
  206. end;
  207.  
  208. procedure TEditForm.Save1Click(Sender: TObject);
  209.   procedure CreateBackup(const Filename: string);
  210.   var
  211.     BackupFilename: string;
  212.   begin
  213.     BackupFilename:= ChangeFileExt(Filename, BackupExt);
  214.     DeleteFile(BackupFilename);
  215.     RenameFile(Filename, BackupFilename);
  216.   end;
  217. begin
  218.   if Filename = '' then
  219.     SaveAs1Click(Sender)
  220.   else
  221.   begin
  222.     CreateBackup(Filename);
  223.     Memo1.Lines.SaveToFile(Filename);
  224.     Memo1.Modified:= False;
  225.   end;
  226. end;
  227.  
  228. procedure TEditForm.SetFont(Sender: TObject);
  229. begin
  230.   FontDialog1.Font:= Memo1.Font;
  231.   if FontDialog1.Execute then
  232.   Memo1.Font:= FontDialog1.Font;
  233. end;
  234.  
  235. procedure TEditForm.PrintSetup1Click(Sender: TObject);
  236. begin
  237.   PrinterSetupDialog1.Execute;
  238. end;
  239.  
  240. procedure TEditForm.Print1Click(Sender: TObject);
  241. var
  242.   Line: integer;
  243.   PrintText: System.Text;
  244. begin
  245.   if PrintDialog1.Execute then
  246.   begin
  247.     AssignPrn(PrintText);
  248.     Rewrite(PrintText);
  249.     Printer.Canvas.Font:= Memo1.Font;
  250.     for Line:= 0 to Memo1.Lines.Count - 1 do
  251.       Writeln(PrintText, Memo1.Lines[Line]);
  252.     CloseFile(PrintText);
  253.   end;
  254. end;
  255.  
  256. procedure TEditForm.Close1Click(Sender: TObject);
  257. begin
  258.   Close;
  259. end;
  260.  
  261. procedure TEditForm.FormClose(Sender: TObject; var Action: TCloseAction);
  262. begin
  263.   Action:= caFree;
  264. end;
  265.  
  266. procedure TEditForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  267. var
  268.   DialogValue: integer;
  269.   FName: string;
  270. begin
  271.   if Memo1.Modified then
  272.   begin
  273.     Fname:= Caption;
  274.     if length(FName) = 0 then
  275.       FName:= 'Untitled';
  276.     DialogValue:= MessageDlg(Format(SWarningText, [FName]), mtconfirmation,
  277.       [mbYes, mbNo, mbCancel], 0);
  278.     case DialogValue of
  279.       id_Yes: Save1Click(Self);
  280.       id_Cancel: CanClose:= false;
  281.     end;
  282.   end;
  283. end;
  284.  
  285. procedure TEditForm.Exit1Click(Sender: TObject);
  286. begin
  287.   FrameForm.Exit1Click(Sender);
  288. end;
  289.  
  290. procedure TEditForm.Options(Sender: TObject);
  291. begin
  292.   OptionsDlg.ShowModal;
  293. end;
  294.  
  295. procedure TEditForm.Cascade1Click(Sender: TObject);
  296. begin
  297.   FrameForm.Cascade1Click(Sender);
  298. end;
  299.  
  300. procedure TEditForm.Tile1Click(Sender: TObject);
  301. begin
  302.   FrameForm.Tile1Click(Sender);
  303. end;
  304.  
  305. procedure TEditForm.Compare(Sender: TObject);
  306. var
  307.   EditForm1, EditForm2: TEditForm;
  308.   EditBuf1, EditBuf2: PChar;
  309.   Eof1, Eof2: integer;
  310.   Size1, Size2: integer;
  311.   TextStart1, TextStart2: integer;
  312.   TextLength1, TextLength2: integer;
  313.   LocalSyncReach, LocalMatchReach: word;
  314. begin
  315.   if FrameForm.MDICHildCount <> 2 then
  316.  
  317.   messagedlg('Two open files required for comparing.', mtinformation, [mbok], 0)
  318.  
  319.   else
  320.  
  321.   begin
  322.     EditForm1:= FrameForm.MDIChildren[0] As TEditForm;
  323.     with EditForm1.Memo1 do
  324.     begin
  325.       TextStart1:= SelStart + SelLength;
  326.       Eof1:= GetTextLen;
  327.       Size1:= GetTextLen;
  328.       GetMem(EditBuf1, Eof1 + 1);
  329.       GetTextBuf(EditBuf1, Eof1);
  330.     end;
  331.     EditForm2:=FrameForm.MDIChildren[1] As TEditForm;
  332.     with EditForm2.Memo1 do
  333.     begin
  334.       TextStart2:= SelStart + SelLength;
  335.       Eof2:= GetTextLen;
  336.       Size2:= GetTextLen;
  337.       GetMem(EditBuf2, Eof2 + 1);
  338.       GetTextBuf(EditBuf2, Eof2);
  339.     end;
  340.  
  341.     LocalSyncReach:= FrameForm.SyncReach;
  342.     LocalMatchReach:= FrameForm.MatchReach;
  343.  
  344.     asm
  345.       push  ds
  346.       cld
  347.       mov   ax,TextStart1
  348.       mov   cx,TextStart2
  349.       lds   si,EditBuf1
  350.       les   di,EditBuf2
  351.       add   Eof1,si
  352.       add   si,ax
  353.       add   Eof2,di
  354.       add   di,cx
  355.  
  356.     @next_compare:
  357.       cmp   si,Eof1
  358.       jz    @mismatch2
  359.       cmp   di,Eof2
  360.       jz    @mismatch2
  361.       mov   al,ds:[si]
  362.       mov   ah,es:[di]
  363.       cmpsb
  364.       jz    @next_compare
  365.       cmp   al,10   {linefeed}
  366.       jnz   @ck_cr1
  367.       dec   di
  368.       jmp   @next_compare
  369.     @ck_cr1:
  370.       cmp   al,13   {carriage return}
  371.       jnz   @second_file
  372.       cmp   ah,32   {space}
  373.       jz    @next_compare
  374.       jmp   @mismatch
  375.  
  376.     @second_file:
  377.       cmp   ah,10
  378.       jnz   @ck_cr2
  379.       dec   si
  380.       jmp   @next_compare
  381.     @ck_cr2:
  382.       cmp   ah,13
  383.       jnz   @mismatch
  384.       cmp   al,32
  385.       jz    @next_compare
  386.  
  387.     @mismatch:
  388.       dec   si
  389.       dec   di
  390.     @mismatch2:
  391.       mov   TextStart1,si
  392.       mov   TextStart2,di
  393.  
  394.     @synchronize:
  395.       mov   bx,TextStart1
  396.       mov   cx,LocalSyncReach
  397.  
  398.     @next_sync:
  399.       push  cx
  400.       mov   dx,TextStart2
  401.       mov   cx,LocalSyncReach
  402.  
  403.     @next_try:
  404.       push  cx
  405.       mov   cx,LocalMatchReach
  406.  
  407.       mov   si,bx
  408.       mov   di,dx
  409.     @next_char:
  410.       cmp   si,Eof1
  411.       jz    @next_try_end
  412.       cmp   di,Eof2
  413.       jz    @file2_end
  414.       mov   al,ds:[si]
  415.       mov   ah,es:[di]
  416.       cmpsb
  417.       jz    @possible_sync
  418.       cmp   al,10   {linefeed}
  419.       jz    @adjust_2b
  420.       cmp   al,13   {carriage return}
  421.       jz    @ck_adjust_2b
  422.       cmp   ah,10
  423.       jz    @adjust_1b
  424.       cmp   ah,13
  425.       jnz   @next_try_end
  426.  
  427.     @ck_adjust_1b:
  428.       cmp   al,32   {space}
  429.       jz    @next_char
  430.     @adjust_1b:
  431.       dec   si
  432.       inc   dx      {adjust}
  433.       jmp   @next_char
  434.  
  435.     @ck_adjust_2b:
  436.       cmp   ah,32
  437.       jz    @next_char
  438.     @adjust_2b:
  439.       dec   di
  440.       inc   bx      {adjust}
  441.       jmp   @next_char
  442.  
  443.     @possible_sync:
  444.       cmp   al,32
  445.       jz    @next_char
  446.       loop  @next_char
  447.       jmp   @evaluate
  448.  
  449.     @file2_end:
  450.       pop   cx
  451.       jmp   @next_sync_end
  452.  
  453.     @next_try_end:
  454.       pop   cx
  455.       cmp   dx,Eof2
  456.       jz    @next_sync_end
  457.       inc   dx
  458.       cmp   dx,Eof2
  459.       jz    @next_sync_end
  460.       loop  @next_try
  461.  
  462.     @next_sync_end:
  463.       pop   cx
  464.       cmp   bx,Eof1
  465.       jz    @evaluate_eof
  466.       inc   bx
  467.       cmp   bx,Eof1
  468.       jz    @evaluate_eof
  469.       loop  @next_sync
  470.       jmp   @evaluate_eof
  471.  
  472.     @evaluate:
  473.       pop   cx
  474.       pop   cx
  475.     @evaluate_eof:
  476.  
  477.       sub   bx,TextStart1
  478.       mov   TextLength1,bx
  479.       mov   ax,word ptr EditBuf1
  480.       sub   TextStart1,ax
  481.  
  482.       sub   dx,TextStart2
  483.       mov   TextLength2,dx
  484.       mov   ax,word ptr EditBuf2
  485.       sub   TextStart2,ax
  486.       pop   ds
  487.     end;
  488.  
  489.     with EditForm1.Memo1 do
  490.     begin
  491.       SelStart:= TextStart1;
  492.       SelLength:= TextLength1
  493.     end;
  494.     with EditForm2.Memo1 do
  495.     begin
  496.       SelStart:= TextStart2;
  497.       SelLength:= TextLength2;
  498.     end;
  499.  
  500.     FreeMem(EditBuf1, Size1 + 1);
  501.     FreeMem(EditBuf2, Size2 + 1);
  502.   end;
  503. end;
  504.  
  505. procedure TEditForm.SaveOptions1Click(Sender: TObject);
  506. var
  507.   WinIni: TIniFile;
  508.   TempString: string;
  509. begin
  510.   With TIniFile.Create('WCOMPARE.INI') Do
  511.     try
  512.      WriteInteger('WCOMPARE', 'SyncReach', FrameForm.SyncReach);
  513.      WriteInteger('WCOMPARE', 'MatchReach', FrameForm.MatchReach);
  514.      WriteInteger('WCOMPARE', 'WindowOption', FrameForm.WinOption);
  515.     finally
  516.       Free;
  517.       FrameForm.SetWindows;
  518.     end;
  519. end;
  520.  
  521. destructor TEditForm.Destroy;
  522. begin
  523.   inherited Destroy;
  524.   FrameForm.SetWindows;
  525. end;
  526.  
  527. end.
  528.