TmpltForm.pas 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. unit TmpltForm;
  2. interface
  3. uses
  4. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5. Dialogs, StdCtrls, MemoComponentUnit;
  6. type
  7. TTemplate = class(TObject)
  8. public
  9. Text: string;
  10. procedure Apply(Dest: TMemoComponent);
  11. end;
  12. TTemplateForm = class(TForm)
  13. TmpltList: TListBox;
  14. procedure FormDeactivate(Sender: TObject);
  15. procedure TmpltListData(Control: TWinControl; Index: Integer;
  16. var Data: string);
  17. procedure FormCreate(Sender: TObject);
  18. procedure FormDestroy(Sender: TObject);
  19. procedure TmpltListDblClick(Sender: TObject);
  20. procedure TmpltListKeyDown(Sender: TObject; var Key: Word;
  21. Shift: TShiftState);
  22. procedure FormActivate(Sender: TObject);
  23. public
  24. { Déclarations publiques }
  25. Templates: TStringList;
  26. procedure Select;
  27. end;
  28. var
  29. TemplateForm: TTemplateForm;
  30. implementation
  31. {$R *.dfm}
  32. uses MasterUnit, UtilsDos, CodeCompletion, CompletionForm;
  33. { TTemplate }
  34. procedure TTemplate.Apply(Dest: TMemoComponent);
  35. var
  36. St: Integer;
  37. i, p: Integer;
  38. S, Before: string;
  39. Lst: TStringList;
  40. T: TTextCell;
  41. begin
  42. // Indent template
  43. T := Dest.Selection.StartRowCol;
  44. Before := Copy(Dest.Lines[T.Row - 1], 1, T.Col - 1);
  45. Lst := TStringList.Create;
  46. Lst.Text := Text;
  47. for i := 1 to Lst.Count - 1 do
  48. Lst[i] := Before + Lst[i];
  49. S := Lst.Text;
  50. if (Copy(S, Length(S) - 1, 2) = #13#10) and (Copy(Text, Length(Text) - 1, 2) <> #13#10) then
  51. Delete(S, Length(S) - 1, 2);
  52. Lst.Free;
  53. p := Pos('|', S);
  54. st := Dest.Selection.RStart;
  55. if p = 0 then
  56. Dest.Selection.Text := S
  57. else
  58. begin
  59. Delete(S, p, 1);
  60. Dest.Selection.Text := S;
  61. Inc(St, p - 1);
  62. end;
  63. Dest.Selection.RStart := st;
  64. Dest.Selection.RLength := 0;
  65. end;
  66. { TTemplateForm }
  67. procedure TTemplateForm.FormDeactivate(Sender: TObject);
  68. begin
  69. Hide;
  70. end;
  71. procedure TTemplateForm.TmpltListData(Control: TWinControl; Index: Integer;
  72. var Data: string);
  73. begin
  74. if (Index >= 0) and (Index < Templates.Count) then
  75. Data := Templates[Index];
  76. end;
  77. procedure TTemplateForm.FormCreate(Sender: TObject);
  78. var
  79. T: TTemplate;
  80. F: TStream;
  81. S: string;
  82. begin
  83. Templates := TStringList.Create;
  84. Templates.Sorted := True;
  85. S := WithBackslash(TIGCCFolder) + TemplatesLocation + 'templates.dat';
  86. if FileExists(S) then
  87. try
  88. F := TFileStream.Create(S, fmOpenRead);
  89. try
  90. while ReadString(F, S) do
  91. begin
  92. T := TTemplate.Create;
  93. ReadString(F, T.Text);
  94. Templates.AddObject(S, T);
  95. end;
  96. finally
  97. F.Free;
  98. end;
  99. except
  100. end;
  101. end;
  102. procedure TTemplateForm.FormDestroy(Sender: TObject);
  103. var
  104. i: Integer;
  105. F: TStream;
  106. T: TTemplate;
  107. begin
  108. try
  109. F := TFileStream.Create(WithBackslash(TIGCCFolder) + TemplatesLocation + 'templates.dat', fmCreate);
  110. try
  111. for i := 0 to Templates.Count - 1 do
  112. begin
  113. T := TTemplate(Templates.Objects[i]);
  114. if Assigned(T) then
  115. begin
  116. WriteString(F, Templates[i]);
  117. WriteString(F, T.Text);
  118. end;
  119. end;
  120. finally
  121. F.Free;
  122. end;
  123. except
  124. end;
  125. for i := 0 to Templates.Count - 1 do
  126. Templates.Objects[i].Free;
  127. Templates.Free;
  128. end;
  129. procedure TTemplateForm.TmpltListDblClick(Sender: TObject);
  130. begin
  131. Select;
  132. end;
  133. procedure TTemplateForm.TmpltListKeyDown(Sender: TObject; var Key: Word;
  134. Shift: TShiftState);
  135. begin
  136. case Key of
  137. VK_RETURN:
  138. Select;
  139. VK_ESCAPE, VK_CLEAR, VK_BACK, VK_DELETE:
  140. Hide;
  141. end;
  142. end;
  143. procedure TTemplateForm.Select;
  144. var
  145. Idx: Integer;
  146. M: TMemoComponent;
  147. T: TTemplate;
  148. begin
  149. M := CompForm.Editor;
  150. if Assigned(M) then
  151. begin
  152. Idx := TmpltList.ItemIndex;
  153. if (Idx >= 0) and (Idx < Templates.Count) then
  154. begin
  155. T := TTemplate(Templates.Objects[Idx]);
  156. if Assigned(T) then
  157. T.Apply(M);
  158. end;
  159. end;
  160. Hide;
  161. end;
  162. procedure TTemplateForm.FormActivate(Sender: TObject);
  163. var
  164. M: TMemoComponent;
  165. P: TPoint;
  166. begin
  167. TmpltList.Count := Templates.Count;
  168. M := CompForm.Editor;
  169. if Assigned(M) then
  170. begin
  171. TmpltList.ItemIndex := 0;
  172. P := M.ClientToScreen(M.Selection.StartPoint);
  173. Left := P.X + 4;
  174. Top := P.Y + 20;
  175. end;
  176. end;
  177. end.