2
0

FormRemoteEditor.pas 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. {Programa ejemplo de uso de la librería para implementar editores "utilEditSyn".
  2. Por Tito Hinostroza 11/07/2014 }
  3. unit FormRemoteEditor;
  4. {$mode objfpc}{$H+}
  5. interface
  6. uses
  7. Classes, SysUtils, FileUtil, LazUTF8, SynEdit, Forms, Controls, Graphics,
  8. Dialogs, Menus, ComCtrls, ActnList, StdActns, SynEditMiscClasses, MisUtils,
  9. Globales, SynFacilUtils, FormRemoteOpenDial, FrameTabSession;
  10. type
  11. { TfrmRemoteEditor }
  12. TfrmRemoteEditor = class(TForm)
  13. published
  14. acFilOpen: TAction;
  15. acFilSaveAs: TAction;
  16. acFilSave: TAction;
  17. acFilNew: TAction;
  18. acFilExit: TAction;
  19. acSrchSearch: TAction;
  20. acSrchSearchNext: TAction;
  21. acSrchReplace: TAction;
  22. acEdiCopy: TEditCopy;
  23. acEdiCut: TEditCut;
  24. acEdiPaste: TEditPaste;
  25. acEdiRedo: TAction;
  26. acEdiSelecAll: TAction;
  27. acEdiUndo: TAction;
  28. AcToolSettings: TAction;
  29. ActionList: TActionList;
  30. acViewFilPanel: TAction;
  31. ImageList1: TImageList;
  32. MainMenu1: TMainMenu;
  33. MenuItem1: TMenuItem;
  34. MenuItem10: TMenuItem;
  35. MenuItem11: TMenuItem;
  36. MenuItem12: TMenuItem;
  37. MenuItem13: TMenuItem;
  38. MenuItem14: TMenuItem;
  39. MenuItem15: TMenuItem;
  40. MenuItem16: TMenuItem;
  41. MenuItem18: TMenuItem;
  42. MenuItem19: TMenuItem;
  43. MenuItem20: TMenuItem;
  44. MenuItem21: TMenuItem;
  45. MenuItem22: TMenuItem;
  46. MenuItem24: TMenuItem;
  47. MenuItem25: TMenuItem;
  48. MenuItem26: TMenuItem;
  49. mnLenguaje: TMenuItem;
  50. mnRecents: TMenuItem;
  51. MenuItem17: TMenuItem;
  52. MenuItem2: TMenuItem;
  53. MenuItem23: TMenuItem;
  54. MenuItem3: TMenuItem;
  55. MenuItem4: TMenuItem;
  56. MenuItem5: TMenuItem;
  57. MenuItem6: TMenuItem;
  58. MenuItem7: TMenuItem;
  59. MenuItem8: TMenuItem;
  60. MenuItem9: TMenuItem;
  61. OpenDialog1: TOpenDialog;
  62. PopupMenu1: TPopupMenu;
  63. SaveDialog1: TSaveDialog;
  64. StatusBar1: TStatusBar;
  65. ed: TSynEdit;
  66. ToolBar1: TToolBar;
  67. ToolButton1: TToolButton;
  68. ToolButton10: TToolButton;
  69. ToolButton11: TToolButton;
  70. ToolButton2: TToolButton;
  71. ToolButton3: TToolButton;
  72. ToolButton4: TToolButton;
  73. ToolButton5: TToolButton;
  74. ToolButton6: TToolButton;
  75. ToolButton7: TToolButton;
  76. ToolButton8: TToolButton;
  77. ToolButton9: TToolButton;
  78. acViewStaBar: TAction;
  79. acViewLinNum: TAction;
  80. procedure acFilOpenExecute(Sender: TObject);
  81. procedure acFilSaveAsExecute(Sender: TObject);
  82. procedure acFilSaveExecute(Sender: TObject);
  83. procedure acFilNewExecute(Sender: TObject);
  84. procedure acFilExitExecute(Sender: TObject);
  85. procedure acEdiRedoExecute(Sender: TObject);
  86. procedure acEdiSelecAllExecute(Sender: TObject);
  87. procedure acEdiUndoExecute(Sender: TObject);
  88. procedure AcToolSettingsExecute(Sender: TObject);
  89. procedure ChangeEditorState;
  90. procedure editChangeFileInform;
  91. procedure edSpecialLineMarkup(Sender: TObject; Line: integer;
  92. var Special: boolean; Markup: TSynSelectedColor);
  93. procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
  94. procedure FormCreate(Sender: TObject);
  95. procedure FormDestroy(Sender: TObject);
  96. procedure FormDropFiles(Sender: TObject; const FileNames: array of String);
  97. procedure FormShow(Sender: TObject);
  98. private
  99. edit: TSynFacilEditor;
  100. lineas: TStringList; //lista temporal
  101. public
  102. MsjErr: String;
  103. NomArcLocal: string; //nombre de archivo local
  104. procedure AbrirRemoto(arc: string);
  105. end;
  106. var
  107. frmRemoteEditor: TfrmRemoteEditor;
  108. implementation
  109. uses FormPrincipal, FormConfig;
  110. {$R *.lfm}
  111. { TfrmRemoteEditor }
  112. procedure TfrmRemoteEditor.FormCreate(Sender: TObject);
  113. begin
  114. InicEditorC1(ed); //inicia editor con configuraciones por defecto
  115. ed.OnSpecialLineMarkup:=@edSpecialLineMarkup; //solo para corregir falla de resaltado de línea actual
  116. edit := TSynFacilEditor.Create(ed,'SinNombre', 'sh');
  117. edit.OnChangeEditorState:=@ChangeEditorState;
  118. edit.OnChangeFileInform:=@editChangeFileInform;
  119. //define paneles
  120. edit.PanFileSaved := StatusBar1.Panels[0]; //panel para mensaje "Guardado"
  121. edit.PanCursorPos := StatusBar1.Panels[1]; //panel para la posición del cursor
  122. edit.PanForEndLin := StatusBar1.Panels[2]; //panel para el tipo de delimitador de línea
  123. edit.PanCodifFile := StatusBar1.Panels[3]; //panel para la codificación del archivo
  124. edit.PanLangName := StatusBar1.Panels[4]; //panel para el nombre del lenguaje
  125. lineas := TStringList.Create;
  126. end;
  127. procedure TfrmRemoteEditor.FormShow(Sender: TObject);
  128. begin
  129. edit.NewFile; //para actualizar estado
  130. mnLenguaje.Clear;
  131. edit.InitMenuLanguages(mnLenguaje, patSyntax);
  132. edit.LoadSyntaxFromPath; //para que busque el archivo apropiado
  133. edit.InitMenuRecents(mnRecents,nil); //inicia el menú "Recientes"
  134. end;
  135. procedure TfrmRemoteEditor.FormCloseQuery(Sender: TObject; var CanClose: boolean);
  136. var
  137. rpta: Byte;
  138. begin
  139. if edit.Modified then begin //primero pregunta
  140. rpta := MsgYesNoCancel('File modified. Save on Server?');
  141. if rpta = 3 then begin //Cancel
  142. CanClose := false; //no deja cerrar
  143. exit;
  144. end;
  145. if rpta = 1 then begin //Yes
  146. acFilSaveExecute(self); //Primero guarda
  147. end;
  148. end;
  149. //se debe cerrar.
  150. //Limpiar el contenido, ya que solo se ocultará, y no queremos que aparezca el último
  151. //archivo cargado.
  152. edit.NewFile(false);
  153. end;
  154. procedure TfrmRemoteEditor.FormDestroy(Sender: TObject);
  155. begin
  156. lineas.Destroy;
  157. edit.Destroy;
  158. end;
  159. procedure TfrmRemoteEditor.FormDropFiles(Sender: TObject; const FileNames: array of String);
  160. begin
  161. //Carga archivo arrastrados
  162. if edit.SaveQuery then Exit; //Verifica cambios
  163. edit.LoadFile(FileNames[0]);
  164. edit.LoadSyntaxFromPath; //para que busque el archivo apropiado
  165. end;
  166. procedure TfrmRemoteEditor.ChangeEditorState;
  167. begin
  168. acFilSave.Enabled:=edit.Modified;
  169. acEdiUndo.Enabled:=edit.CanUndo;
  170. acEdiRedo.Enabled:=edit.CanRedo;
  171. //Para estas acciones no es necesario controlarlas, porque son acciones pre-determinadas
  172. // acEdiCortar.Enabled := edit.canCopy;
  173. // acEdiCopiar.Enabled := edit.canCopy;
  174. // acEdiPegar.Enabled:= edit.CanPaste;
  175. end;
  176. procedure TfrmRemoteEditor.editChangeFileInform;
  177. begin
  178. //actualiza nombre de archivo
  179. Caption := 'Remote Editor - ' + edit.FileName;
  180. end;
  181. procedure TfrmRemoteEditor.edSpecialLineMarkup(Sender: TObject; Line: integer;
  182. var Special: boolean; Markup: TSynSelectedColor);
  183. begin
  184. //vacío
  185. end;
  186. /////////////////// Acciones de Archivo /////////////////////
  187. procedure TfrmRemoteEditor.acFilNewExecute(Sender: TObject);
  188. begin
  189. edit.NewFile;
  190. edit.LoadSyntaxFromPath; //para que busque el archivo apropiado
  191. end;
  192. procedure TfrmRemoteEditor.acFilOpenExecute(Sender: TObject);
  193. begin
  194. // OpenDialog1.Filter:='Text files|*.txt|All files|*.*';
  195. // edit.OpenDialog(OpenDialog1);
  196. frmRemoteOpenDial.ShowModal;
  197. if frmRemoteOpenDial.archivo <> '' then begin
  198. AbrirRemoto(frmRemoteOpenDial.archivo);
  199. end;
  200. end;
  201. procedure TfrmRemoteEditor.acFilSaveExecute(Sender: TObject);
  202. var
  203. txt: String;
  204. ses: TfraTabSession;
  205. begin
  206. txt := edit.Text; //toma texto
  207. { -- Esta sustitución antigua, falla cuando se usa el carcater !
  208. txt := StringReplace(txt, '\', '\\',[rfReplaceAll]); //para proteger del comando
  209. txt := StringReplace(txt, '$', '\$',[rfReplaceAll]);
  210. txt := StringReplace(txt, '`', '\`',[rfReplaceAll]);
  211. txt := StringReplace(txt, '"', '\"',[rfReplaceAll]);
  212. txt := StringReplace(txt, '\\\\"', '\\\\\"',[rfReplaceAll]); //esta combinación debe ser así en ksh
  213. txt := StringReplace(txt, #9, '\t',[rfReplaceAll]);
  214. ed.Enabled := False;
  215. frmPrincipal.EnviarComando('echo "' + txt + '" > "' + edit.NomArc+'"', lineas);
  216. ed.Enabled := True;
  217. }
  218. {Usa comillas simples para evitar sustitución, porque las comillas simples ponen todo
  219. literalmente. El problema está cuando se quiere imprimir precisamente, comilla simple.
  220. Para ello se debe hacer una sustitución}
  221. ed.Enabled := False;
  222. txt := StringReplace(txt, '''', '''"''"''',[rfReplaceAll]);
  223. if frmPrincipal.GetCurSession(ses) then begin
  224. ses.EnviarComando('echo ''' + txt + ''' > "' + edit.FileName+'"', lineas);
  225. end;
  226. ed.Enabled := True;
  227. //para actualizar controles
  228. edit.Modified:=false; //Este método no es público en la librería original
  229. // edit.SaveFile;
  230. end;
  231. procedure TfrmRemoteEditor.acFilSaveAsExecute(Sender: TObject);
  232. var
  233. arc0: String;
  234. begin
  235. // edit.SaveAsDialog(SaveDialog1);
  236. if not SaveDialog1.Execute then begin //se canceló
  237. exit; //se canceló
  238. end;
  239. arc0 := SaveDialog1.FileName;
  240. if FileExists(arc0) then begin
  241. if MsgYesNoCancel('File already exists. Overwrite?',[arc0]) in [2,3] then exit;
  242. end;
  243. NomArcLocal := UTF8ToSys(arc0); //asigna nuevo nombre
  244. // if ExtractFileExt(NomArc) = '' then NomArc += '.'+extDef; //completa extensión
  245. edit.SaveFile; //lo guarda
  246. end;
  247. procedure TfrmRemoteEditor.acFilExitExecute(Sender: TObject);
  248. begin
  249. frmRemoteEditor.Close;
  250. end;
  251. //////////// Acciones de Edición ////////////////
  252. procedure TfrmRemoteEditor.acEdiUndoExecute(Sender: TObject);
  253. begin
  254. edit.Undo;
  255. end;
  256. procedure TfrmRemoteEditor.AcToolSettingsExecute(Sender: TObject);
  257. begin
  258. config.Configurar('3');
  259. end;
  260. procedure TfrmRemoteEditor.acEdiRedoExecute(Sender: TObject);
  261. begin
  262. edit.Redo;
  263. end;
  264. procedure TfrmRemoteEditor.acEdiSelecAllExecute(Sender: TObject);
  265. begin
  266. ed.SelectAll;
  267. end;
  268. procedure TfrmRemoteEditor.AbrirRemoto(arc: string);
  269. //Permite editar un archivo almacenado en un archivo externo
  270. var
  271. ses: TfraTabSession;
  272. begin
  273. if self.Visible and edit.SaveQuery then Exit; //Verifica cambios
  274. if not self.Visible then self.Show;
  275. if frmPrincipal.GetCurSession(ses) then begin
  276. MsjErr := ses.EnviarComando('cat "'+arc+'"', lineas);
  277. end;
  278. ed.Lines.Clear;
  279. ed.Lines.AddStrings(lineas);
  280. edit.FileName:=arc;
  281. //para actualizar controles
  282. edit.Modified:=false; //Este método no es público en la librería original)
  283. //para actualizar nombre
  284. edit.ChangeFileInform; //Este método no es público en la librería original)
  285. edit.LoadSyntaxFromPath; //para que busque el archivo apropiado
  286. end;
  287. end.