FormEditMacros.pas 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. unit FormEditMacros;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, FileUtil, SynEdit, Forms, Controls, Graphics, Dialogs,
  6. LCLProc, Menus, ComCtrls, ActnList, StdActns, MisUtils, SynFacilUtils,
  7. UnTerminal, Parser, Globales, FrameTabSessions;
  8. type
  9. { TfrmEditMacros }
  10. TfrmEditMacros = class(TForm)
  11. published
  12. acFilOpen: TAction;
  13. acFilSaveAs: TAction;
  14. acFilSave: TAction;
  15. acFilNew: TAction;
  16. acFilExit: TAction;
  17. acSrchSearch: TAction;
  18. acSrchSearchNext: TAction;
  19. acSrchReplace: TAction;
  20. acEdiCopy: TEditCopy;
  21. acEdiCut: TEditCut;
  22. acEdiPaste: TEditPaste;
  23. acEdiRedo: TAction;
  24. acEdiSelecAll: TAction;
  25. acEdiUndo: TAction;
  26. AcHerConfig: TAction;
  27. AcHerEjec: TAction;
  28. AcHerDeten: TAction;
  29. AcHerGrab: TAction;
  30. ActionList: TActionList;
  31. acVerPanArc: TAction;
  32. ImageList1: TImageList;
  33. MainMenu1: TMainMenu;
  34. mnArchivo: TMenuItem;
  35. MenuItem10: TMenuItem;
  36. MenuItem11: TMenuItem;
  37. MenuItem12: TMenuItem;
  38. MenuItem13: TMenuItem;
  39. MenuItem14: TMenuItem;
  40. MenuItem15: TMenuItem;
  41. MenuItem16: TMenuItem;
  42. MenuItem18: TMenuItem;
  43. MenuItem19: TMenuItem;
  44. MenuItem20: TMenuItem;
  45. MenuItem21: TMenuItem;
  46. MenuItem22: TMenuItem;
  47. MenuItem24: TMenuItem;
  48. MenuItem25: TMenuItem;
  49. MenuItem26: TMenuItem;
  50. MenuItem27: TMenuItem;
  51. MenuItem28: TMenuItem;
  52. mnRecientes: TMenuItem;
  53. mnHerram: TMenuItem;
  54. mnEdicion: TMenuItem;
  55. MenuItem23: TMenuItem;
  56. MenuItem3: TMenuItem;
  57. MenuItem4: TMenuItem;
  58. MenuItem5: TMenuItem;
  59. MenuItem6: TMenuItem;
  60. MenuItem7: TMenuItem;
  61. MenuItem8: TMenuItem;
  62. MenuItem9: TMenuItem;
  63. OpenDialog1: TOpenDialog;
  64. PopupMenu1: TPopupMenu;
  65. SaveDialog1: TSaveDialog;
  66. StatusBar1: TStatusBar;
  67. ed: TSynEdit;
  68. ToolBar1: TToolBar;
  69. ToolButton1: TToolButton;
  70. ToolButton10: TToolButton;
  71. ToolButton11: TToolButton;
  72. ToolButton12: TToolButton;
  73. ToolButton13: TToolButton;
  74. ToolButton14: TToolButton;
  75. ToolButton2: TToolButton;
  76. ToolButton3: TToolButton;
  77. ToolButton4: TToolButton;
  78. ToolButton5: TToolButton;
  79. ToolButton6: TToolButton;
  80. ToolButton7: TToolButton;
  81. ToolButton8: TToolButton;
  82. ToolButton9: TToolButton;
  83. acVerBarEst: TAction;
  84. acVerNumLin: TAction;
  85. procedure acFilOpenExecute(Sender: TObject);
  86. procedure acFilSaveAsExecute(Sender: TObject);
  87. procedure acFilSaveExecute(Sender: TObject);
  88. procedure acFilNewExecute(Sender: TObject);
  89. procedure acFilExitExecute(Sender: TObject);
  90. procedure acEdiRedoExecute(Sender: TObject);
  91. procedure acEdiSelecAllExecute(Sender: TObject);
  92. procedure acEdiUndoExecute(Sender: TObject);
  93. procedure AcHerConfigExecute(Sender: TObject);
  94. procedure AcHerDetenExecute(Sender: TObject);
  95. procedure AcHerEjecExecute(Sender: TObject);
  96. procedure AcHerGrabExecute(Sender: TObject);
  97. procedure ChangeEditorState;
  98. procedure editChangeFileInform;
  99. procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
  100. procedure FormCreate(Sender: TObject);
  101. procedure FormDestroy(Sender: TObject);
  102. procedure FormDropFiles(Sender: TObject; const FileNames: array of String);
  103. private
  104. edit: TSynFacilEditor;
  105. procedure MarcarError(nLin, nCol: integer);
  106. public
  107. sessions: TfraTabSessions;
  108. procedure Ejecutar(arc: string);
  109. procedure DetenerEjec;
  110. procedure Abrir(arc: string);
  111. procedure Init(sessions0: TfraTabSessions);
  112. end;
  113. var
  114. frmEditMacros: TfrmEditMacros;
  115. implementation
  116. uses FormConfig;
  117. {$R *.lfm}
  118. { TfrmEditMacros }
  119. procedure TfrmEditMacros.FormCreate(Sender: TObject);
  120. begin
  121. edit := TSynFacilEditor.Create(ed,'SinNombre', 'ttm');
  122. edit.OnChangeEditorState:=@ChangeEditorState;
  123. edit.OnChangeFileInform:=@editChangeFileInform;
  124. //define paneles
  125. edit.PanFileSaved := StatusBar1.Panels[0]; //panel para mensaje "Guardado"
  126. edit.PanCursorPos := StatusBar1.Panels[1]; //panel para la posición del cursor
  127. // edit.PanForEndLin := StatusBar1.Panels[2]; //panel para el tipo de delimitador de línea
  128. edit.PanCodifFile := StatusBar1.Panels[3]; //panel para la codificación del archivo
  129. edit.NewFile;
  130. edit.LoadSyntaxFromFile(patSyntax+DirectorySeparator+'Terminal Macro.xml');
  131. edit.InitMenuRecents(mnRecientes, nil); //inicia el menú "Recientes"
  132. InicEditorC1(ed); //inicia editor con configuraciones por defecto
  133. end;
  134. procedure TfrmEditMacros.FormCloseQuery(Sender: TObject; var CanClose: boolean);
  135. begin
  136. if edit.SaveQuery then CanClose := false; //cancela
  137. end;
  138. procedure TfrmEditMacros.FormDestroy(Sender: TObject);
  139. begin
  140. edit.Free;
  141. end;
  142. procedure TfrmEditMacros.FormDropFiles(Sender: TObject; const FileNames: array of String);
  143. begin
  144. //Carga archivo arrastrados
  145. if edit.SaveQuery then Exit; //Verifica cambios
  146. edit.LoadFile(FileNames[0]);
  147. end;
  148. procedure TfrmEditMacros.ChangeEditorState;
  149. begin
  150. acFilSave.Enabled:=edit.Modified;
  151. acEdiUndo.Enabled:=edit.CanUndo;
  152. acEdiRedo.Enabled:=edit.CanRedo;
  153. //Para estas acciones no es necesario controlarlas, porque son acciones pre-determinadas
  154. // acEdiCortar.Enabled := edit.canCopy;
  155. // acEdiCopiar.Enabled := edit.canCopy;
  156. // acEdiPegar.Enabled:= edit.CanPaste;
  157. end;
  158. procedure TfrmEditMacros.editChangeFileInform;
  159. begin
  160. //actualiza nombre de archivo
  161. Caption := 'Editor de Macros - ' + edit.FileName;
  162. end;
  163. /////////////////// Acciones de Archivo /////////////////////
  164. procedure TfrmEditMacros.acFilNewExecute(Sender: TObject);
  165. begin
  166. edit.NewFile;
  167. ed.Lines[0] := '// Sample of macro for '+NOM_PROG;
  168. ed.Lines.Add(dic('// Created: ') + DateTimeToStr(Now) );
  169. ed.Lines.Add('disconnect '+ '//Disconnect if it''s connected');
  170. ed.Lines.Add('connect "192.168.1.1" '+'//Connect to a new IP');
  171. ed.Lines.Add('wait "login: "');
  172. ed.Lines.Add('sendln "usuario"');
  173. ed.Lines.Add('wait "password: "');
  174. ed.Lines.Add('sendln "clave"');
  175. ed.Lines.Add('pause 3 '+'//wait for 3 seconds');
  176. ed.Lines.Add('sendln "cd /folder"');
  177. end;
  178. procedure TfrmEditMacros.acFilOpenExecute(Sender: TObject);
  179. begin
  180. OpenDialog1.Filter:='Tito''s Telnet Macro |*.ttm|Todos los archivos|*.*';
  181. OpenDialog1.InitialDir:=config.macros; //busca aquí por defecto
  182. edit.OpenDialog(OpenDialog1);
  183. end;
  184. procedure TfrmEditMacros.acFilSaveExecute(Sender: TObject);
  185. begin
  186. edit.SaveFile;
  187. end;
  188. procedure TfrmEditMacros.acFilSaveAsExecute(Sender: TObject);
  189. begin
  190. SaveDialog1.InitialDir:=config.macros; //busca aquí por defecto
  191. edit.SaveAsDialog(SaveDialog1);
  192. end;
  193. procedure TfrmEditMacros.acFilExitExecute(Sender: TObject);
  194. begin
  195. frmEditMacros.Close;
  196. end;
  197. procedure TfrmEditMacros.MarcarError(nLin, nCol: integer);
  198. begin
  199. //posiciona curosr
  200. // ed.CaretX := nCol;
  201. // ed.CaretY := nLin;
  202. ed.LogicalCaretXY:=Point(nCol,nLin);
  203. edit.RefreshPanCursor; //Para actualizar la información del cursor en el panel
  204. //define línea con error
  205. edit.linErr := nLin;
  206. ed.Invalidate; //refresca
  207. end;
  208. //////////// Acciones de Edición ////////////////
  209. procedure TfrmEditMacros.acEdiUndoExecute(Sender: TObject);
  210. begin
  211. edit.Undo;
  212. end;
  213. procedure TfrmEditMacros.acEdiRedoExecute(Sender: TObject);
  214. begin
  215. edit.Redo;
  216. end;
  217. procedure TfrmEditMacros.acEdiSelecAllExecute(Sender: TObject);
  218. begin
  219. ed.SelectAll;
  220. end;
  221. //////////// Acciones de Herramientas ////////////////
  222. procedure TfrmEditMacros.AcHerEjecExecute(Sender: TObject);
  223. begin
  224. cxp.Compilar(edit.FileName, ed.Lines);
  225. if cxp.HayError then begin
  226. MarcarError(cxp.ErrorLine, cxp.ErrorCol);
  227. cxp.ShowError;
  228. end;
  229. end;
  230. procedure TfrmEditMacros.AcHerGrabExecute(Sender: TObject);
  231. //Graba la onexión actual
  232. begin
  233. //Inicialización
  234. ed.ClearAll;
  235. ed.Lines.Add(dic('// Macro generated for ')+NOM_PROG);
  236. ed.Lines.Add(dic('// Date: ') + DateTimeToStr(Now) );
  237. ed.Lines.Add('DISCONNECT '+'//Disconnect if it''s connected');
  238. ed.Lines.Add('CLEAR '+'//Clear the terminal');
  239. //lee parámetros de la configuración actual
  240. if sessions.TabIndex = -1 then exit;
  241. case sessions.ActivePage.Tipo of
  242. TCON_TELNET: begin
  243. ed.Lines.Add('curTYPE := "Telnet"');
  244. end;
  245. TCON_SSH : begin
  246. ed.Lines.Add('curTYPE := "SSH"');
  247. end;
  248. TCON_SERIAL: begin
  249. ed.Lines.Add('curTYPE := "Serial"');
  250. end;
  251. TCON_OTHER : begin
  252. ed.Lines.Add('curTYPE := "Other" //Este es el tipo para otros procesos');
  253. ed.Lines.Add('curAPP := "'+ sessions.ActivePage.Other +'" //El proceso que vamoa a lanzar');
  254. end;
  255. end;
  256. case sessions.ActivePage.LineDelimSend of
  257. LDS_CRLF:
  258. ed.Lines.Add('curENDLINE := "CRLF" //El tipo de salto de línea a enviar');
  259. LDS_CR:
  260. ed.Lines.Add('curENDLINE := "CR" //El tipo de salto de línea a enviar');
  261. LDS_LF:
  262. ed.Lines.Add('curENDLINE := "LF" //El tipo de salto de línea a enviar');
  263. end;
  264. //conecta
  265. ed.Lines.Add('CONNECT '+'//Start connection');
  266. // PAUSE 3 //Espera unos segundos
  267. // DETECT_PROMPT //Configura la línea actual como el prompt
  268. end;
  269. procedure TfrmEditMacros.AcHerDetenExecute(Sender: TObject);
  270. begin
  271. DetenerEjec;
  272. end;
  273. procedure TfrmEditMacros.AcHerConfigExecute(Sender: TObject);
  274. begin
  275. config.Configurar('2');
  276. end;
  277. procedure TfrmEditMacros.DetenerEjec;
  278. //Detiene la ejecución de la macro en curso
  279. begin
  280. if not cxp.ejecProg then exit;
  281. cxp.stop := true; //manda mensaje para detener la macro
  282. end;
  283. procedure TfrmEditMacros.Ejecutar(arc: string);
  284. //Permite ejecutar una macro almacenada en un archivo externo
  285. var
  286. larc: TStringList;
  287. begin
  288. larc := Tstringlist.Create;
  289. larc.LoadFromFile(arc);
  290. cxp.Compilar(arc, larc);
  291. if cxp.HayError then begin
  292. self.Show; //por si no estaba visible
  293. //muestra error en el editor
  294. if edit.FileName= arc then begin
  295. //lo tiene en el editor
  296. MarcarError(cxp.ErrorLine,cxp.ErrorCol);
  297. cxp.ShowError;
  298. end else begin
  299. //no está abierto
  300. Abrir(arc); //lo abre
  301. MarcarError(cxp.ErrorLine,cxp.ErrorCol);
  302. cxp.ShowError;
  303. end;
  304. end;
  305. larc.Free;
  306. end;
  307. procedure TfrmEditMacros.Abrir(arc: string);
  308. //Permite editar una macro almacenada en un archivo externo
  309. begin
  310. if edit.SaveQuery then Exit; //Verifica cambios
  311. edit.LoadFile(arc);
  312. end;
  313. procedure TfrmEditMacros.Init(sessions0: TfraTabSessions);
  314. begin
  315. //Guarda referencia a las sesiones para controlarlas.
  316. sessions := sessions0;
  317. end;
  318. end.