FormPrincipal.pas 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758
  1. {Define a la ventana de sesión. Esta ventana permite mostrar el texto que va llegando
  2. de un proceso. Servirá para visualizar como se interactúa con la sesión y para poder
  3. iniciar conexiones a sqlplus mediante el telnet.}
  4. unit FormPrincipal;
  5. {$mode objfpc}{$H+}
  6. interface
  7. uses
  8. Classes, SysUtils, Types, FileUtil, LazUTF8, SynEdit, Forms, Controls,
  9. Graphics, Dialogs, Menus, ActnList, ExtCtrls, ComCtrls, SynEditKeyCmds,
  10. SynEditMiscClasses, LCLType, LCLProc, LCLIntf, UnTerminal, Clipbrd,
  11. FormQuickConnect, FormConfig, FormRemoteExplor, FormEditMacros, MisUtils,
  12. Globales, SynFacilUtils, FormRemoteEditor,
  13. FrameTabSessions, FrameTabSession, uPreBasicos, uPreProces, StrUtils;
  14. type
  15. TlogState = (logStopped, logRunning, logPaused);
  16. { TfrmPrincipal }
  17. TfrmPrincipal = class(TForm)
  18. published
  19. AcFilExit: TAction;
  20. AcFilQckConnec: TAction;
  21. AcFilNewWin: TAction;
  22. AcToolSett: TAction;
  23. AcFilSavSesAs: TAction;
  24. AcFIlOpeSes: TAction;
  25. AcFilSavSes: TAction;
  26. AcFilNewSes: TAction;
  27. AcMacRecord: TAction;
  28. acHlpHelp: TAction;
  29. acHlpAbout: TAction;
  30. AcViewStatusBar: TAction;
  31. AcToolRemExplor: TAction;
  32. AcToolRemEdit: TAction;
  33. AcMacEditor: TAction;
  34. ActionList1: TActionList;
  35. ImageList1: TImageList;
  36. MainMenu1: TMainMenu;
  37. MenuItem1: TMenuItem;
  38. MenuItem10: TMenuItem;
  39. MenuItem2: TMenuItem;
  40. MenuItem6: TMenuItem;
  41. MenuItem7: TMenuItem;
  42. MenuItem8: TMenuItem;
  43. MenuItem9: TMenuItem;
  44. mnEjecMacro: TMenuItem;
  45. mnAbrMacro: TMenuItem;
  46. mnGraMacro: TMenuItem;
  47. mnMacros: TMenuItem;
  48. mnRecents: TMenuItem;
  49. mnAyuAyu: TMenuItem;
  50. mnView: TMenuItem;
  51. mnFile: TMenuItem;
  52. MenuItem3: TMenuItem;
  53. MenuItem62: TMenuItem;
  54. MenuItem63: TMenuItem;
  55. MenuItem64: TMenuItem;
  56. MenuItem65: TMenuItem;
  57. MenuItem66: TMenuItem;
  58. mnSesionesAlm: TMenuItem;
  59. MenuItem47: TMenuItem;
  60. mnHelp: TMenuItem;
  61. MenuItem37: TMenuItem;
  62. mnTools: TMenuItem;
  63. MenuItem4: TMenuItem;
  64. MenuItem40: TMenuItem;
  65. MenuItem5: TMenuItem;
  66. OpenDialog1: TOpenDialog;
  67. Splitter1: TSplitter;
  68. StatusBar1: TStatusBar;
  69. Timer1: TTimer;
  70. procedure AcFIlOpeSesExecute(Sender: TObject);
  71. procedure AcFilSavSesAsExecute(Sender: TObject);
  72. procedure AcFilSavSesExecute(Sender: TObject);
  73. procedure AcFilQckConnecExecute(Sender: TObject);
  74. procedure AcFilNewSesExecute(Sender: TObject);
  75. procedure AcFilNewWinExecute(Sender: TObject);
  76. procedure AcFilExitExecute(Sender: TObject);
  77. procedure acHlpHelpExecute(Sender: TObject);
  78. procedure AcMacRecordExecute(Sender: TObject);
  79. procedure AcToolSettExecute(Sender: TObject);
  80. procedure AcToolRemEditExecute(Sender: TObject);
  81. procedure AcViewStatusBarExecute(Sender: TObject);
  82. procedure AcMacEditorExecute(Sender: TObject);
  83. procedure AcToolRemExplorExecute(Sender: TObject);
  84. procedure edPComSpecialLineMarkup(Sender: TObject; Line: integer;
  85. var Special: boolean; Markup: TSynSelectedColor);
  86. procedure UpdateHeader;
  87. procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
  88. procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
  89. procedure FormCreate(Sender: TObject);
  90. procedure FormDestroy(Sender: TObject);
  91. procedure FormDropFiles(Sender: TObject; const FileNames: array of String);
  92. procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  93. procedure FormShow(Sender: TObject);
  94. procedure itemEjecMacro(Sender: TObject);
  95. procedure itemAbreMacro(Sender: TObject);
  96. procedure mnAbrMacroClick(Sender: TObject);
  97. procedure mnEjecMacroClick(Sender: TObject);
  98. procedure mnSesionesAlmClick(Sender: TObject);
  99. procedure StatusBar1DrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel;
  100. const Rect: TRect);
  101. procedure Timer1Timer(Sender: TObject);
  102. private
  103. parpadPan0: boolean; //para activar el parpadeo del panel0
  104. ticComRec : integer; //contador para comando recurrente
  105. TabSessions: TfraTabSessions; //Panel de editores
  106. procedure AbrirSesion(fileSession: string);
  107. procedure PropertiesChanged;
  108. procedure TabSessionsPageEvent(event: string; page: TObject; out res: string);
  109. procedure itemAbreSesion(Sender: TObject);
  110. procedure MostrarBarEst(visibilidad: boolean);
  111. public
  112. // proc : TConsoleProc; //referencia al proceso actual
  113. curProc: TConsoleProc2; //referencia al proceso actual
  114. ejecMac: boolean; //indica que está ejecutando una macro
  115. ejecCom: boolean; //indica que está ejecutando un comando (editor remoto, exp. remoto ...)
  116. function AvailableConnection: boolean;
  117. public //Acciones sobre la session actual.
  118. function GetCurSession(out pag: TfraTabSession): boolean;
  119. procedure SetCurPort(port: integer);
  120. procedure SetCurIP(ip: string);
  121. procedure SetCurConnType(ctyp: TTipCon);
  122. procedure SetCurLineDelimSend(delim: TUtLineDelSend);
  123. procedure SetCurOther(txt: string);
  124. private //Manejo de menús recientes
  125. // mnRecents : TMenuItem; //Menú de archivos recientes
  126. // RecentFiles : TStringList; //Lista de archivos recientes
  127. MaxRecents : integer; //Máxima cantidad de archivos recientes
  128. procedure RecentClick(Sender: TObject);
  129. procedure ActualMenusReciente(Sender: TObject);
  130. procedure AddRecentFile(arch: string);
  131. procedure LoadLastFileEdited;
  132. procedure LoadListFiles(lst: string);
  133. procedure InitMenuRecents(menRecents0: TMenuItem; RecentList: TStringList;
  134. MaxRecents0: integer = 5);
  135. end;
  136. var
  137. frmPrincipal: TfrmPrincipal;
  138. implementation
  139. {$R *.lfm}
  140. resourcestring
  141. MSG_NOFILES = 'No files';
  142. MSG_FILE_EXT = '.ses'; //Extensión de archivo a usar.
  143. MSG_FILE_DES = 'Session Files'; //Descripción de archivo
  144. MSG_ALLFILES = 'All files';
  145. { TfrmPrincipal }
  146. procedure TfrmPrincipal.FormCreate(Sender: TObject);
  147. begin
  148. ticComRec := 0;
  149. ejecMac := false;
  150. //Inicia proceso
  151. StatusBar1.OnDrawPanel:=@StatusBar1DrawPanel;
  152. ///////////// Crea controlador de páginas
  153. TabSessions := TfraTabSessions.Create(self);
  154. TabSessions.Parent := self;
  155. TabSessions.Left := 0;
  156. TabSessions.Top := 0;
  157. TabSessions.Align := alClient;
  158. //Manejador de todos los eventos de una página
  159. TabSessions.OnPageEvent := @TabSessionsPageEvent;
  160. end;
  161. procedure TfrmPrincipal.FormDestroy(Sender: TObject);
  162. begin
  163. end;
  164. procedure TfrmPrincipal.FormDropFiles(Sender: TObject;
  165. const FileNames: array of String);
  166. var
  167. i: Integer;
  168. begin
  169. //Carga archivo arrastrados
  170. for i:=0 to high(FileNames) do begin
  171. AbrirSesion(FileNames[i]);
  172. end;
  173. end;
  174. procedure TfrmPrincipal.FormShow(Sender: TObject);
  175. begin
  176. InitMenuRecents(mnRecents, Config.RecentFiles, 8);
  177. TranslateMsgs := true; //activa la traducción en los mensajes
  178. frmEditMacros.Init(TabSessions);
  179. //Aquí ya sabemos que Config está creado. Lo configuramos.
  180. Config.edMacr := frmEditMacros.ed;
  181. COnfig.edRemo := frmRemoteEditor.ed;
  182. Config.OnPropertiesChanged := @PropertiesChanged;
  183. Config.Iniciar(); //Inicia la configuración
  184. //muestra dirección IP actual
  185. //ActualizarInfoPanel0;
  186. //actualiza menús
  187. mnSesionesAlmClick(self);
  188. mnEjecMacroClick(self);
  189. mnAbrMacroClick(self);
  190. UpdateHeader; //Actualiza barra de título
  191. end;
  192. procedure TfrmPrincipal.UpdateHeader;
  193. var
  194. pag: TfraTabSession;
  195. begin
  196. //Actualiza encabezado
  197. if GetCurSession(pag) then begin
  198. Caption := NOM_PROG + '-' + VER_PROG + ' - ' + pag.FileName;
  199. end else begin
  200. Caption := NOM_PROG + '-' + VER_PROG;
  201. end;
  202. end;
  203. procedure TfrmPrincipal.edPComSpecialLineMarkup(Sender: TObject; Line: integer;
  204. var Special: boolean; Markup: TSynSelectedColor);
  205. begin
  206. //vacío
  207. end;
  208. /////////////// Funciones para manejo de macros///////////////
  209. procedure TfrmPrincipal.mnSesionesAlmClick(Sender: TObject);
  210. begin
  211. mnSesionesAlm.Clear;
  212. LeeArchEnMenu(patSessions + DirectorySeparator +'*.ses', mnSesionesAlm, @itemAbreSesion);
  213. end;
  214. procedure TfrmPrincipal.mnEjecMacroClick(Sender: TObject);
  215. begin
  216. mnEjecMacro.Clear;
  217. LeeArchEnMenu(config.foldMacros + DirectorySeparator +'*.ttm', mnEjecMacro,@itemEjecMacro);
  218. end;
  219. procedure TfrmPrincipal.mnAbrMacroClick(Sender: TObject);
  220. begin
  221. mnAbrMacro.Clear;
  222. LeeArchEnMenu(config.foldMacros + DirectorySeparator +'*.ttm', mnAbrMacro,@itemAbreMacro);
  223. end;
  224. procedure TfrmPrincipal.AbrirSesion(fileSession: string);
  225. //Abre una sesión
  226. var
  227. pag: TfraTabSession;
  228. i: Integer;
  229. begin
  230. // //Actualiza menús
  231. // mnEjecMacroClick(self);
  232. // mnAbrMacroClick(self);
  233. //Si es ruta relativa, la vuelve absoluta.
  234. if Pos(DirectorySeparator, fileSession) = 0 then begin
  235. fileSession := patApp + fileSession;
  236. end;
  237. //Verifica si ya está abierto
  238. for i:=0 to TabSessions.pages.Count-1 do begin
  239. pag := TabSessions.pages[i];
  240. if UpCase(pag.fileName) = UpCase(fileSession) then begin
  241. //Ya está abierto
  242. TabSessions.TabIndex := i; //Selecciona
  243. exit;
  244. end;
  245. end;
  246. //Crea nueva página
  247. pag := TabSessions.AddPage(MSG_FILE_EXT);
  248. pag.fileName := fileSession;
  249. //Carga archivo
  250. pag.LoadFromFile; //Podría generar error.
  251. //Actualiza la barra de título.
  252. UpdateHeader;
  253. end;
  254. procedure TfrmPrincipal.itemAbreSesion(Sender: TObject);
  255. begin
  256. AbrirSesion(patSessions + DirectorySeparator + TMenuItem(Sender).Caption);
  257. end;
  258. procedure TfrmPrincipal.itemEjecMacro(Sender: TObject);
  259. //Ejecuta la macro elegida
  260. begin
  261. frmEditMacros.Ejecutar(config.foldMacros + DirectorySeparator + TMenuItem(Sender).Caption);
  262. end;
  263. procedure TfrmPrincipal.itemAbreMacro(Sender: TObject);
  264. begin
  265. frmEditMacros.Show;
  266. frmEditMacros.Abrir(config.foldMacros + DirectorySeparator + TMenuItem(Sender).Caption);
  267. end;
  268. procedure TfrmPrincipal.PropertiesChanged;
  269. //Configura el entorno (IDE) a partir de la configuración global (FormConfig).
  270. begin
  271. //Inicia visibilidad de paneles. Estas son propiedades del entrono, no de un editor en particular
  272. //Barra de herramientas
  273. // tbTerm.Visible := Config.VerBHerTerm;
  274. // AcTerVerBHer.Checked := Config.VerBHerTerm;
  275. //Barra de estado.
  276. MostrarBarEst(Config.VerBarEst);
  277. //Apariencia de los editores
  278. Config.fcEdMacr.ConfigEditor(frmEditMacros.ed);
  279. Config.fcEdRemo.ConfigEditor(frmRemoteEditor.ed);
  280. frmEditMacros.ed.Invalidate;
  281. frmRemoteEditor.ed.Invalidate;
  282. end;
  283. procedure TfrmPrincipal.FormKeyDown(Sender: TObject; var Key: Word;
  284. Shift: TShiftState);
  285. var
  286. pag: TfraTabSession;
  287. begin
  288. case Key of
  289. VK_TAB: begin
  290. if Shift = [ssCtrl] then begin //Ctrl+Tab
  291. TabSessions.SelectNextEditor;
  292. end;
  293. if Shift = [ssShift, ssCtrl] then begin //Shift+Ctrl+Tab
  294. TabSessions.SelectPrevEditor;
  295. end;
  296. end;
  297. VK_1: begin
  298. if Shift = [ssCtrl] then begin //Ctrl+1
  299. if not GetCurSession(pag) then exit;
  300. //Selecciona panel de comandos
  301. pag.edPCom.SetFocus;
  302. end;
  303. end;
  304. VK_2: begin
  305. if Shift = [ssCtrl] then begin //Ctrl+2
  306. if not GetCurSession(pag) then exit;
  307. //Selecciona Terminal
  308. pag.edTerm.SetFocus;
  309. end;
  310. end;
  311. VK_F4: begin
  312. if Shift = [ssCtrl] then begin //Ctrl+F4
  313. TabSessions.ClosePage;
  314. Key := 0; //Sino daría error en las rutinas que procesen la tecla.
  315. end;
  316. end;
  317. VK_F2: begin
  318. if not GetCurSession(pag) then exit;
  319. pag.showPCom := not pag.showPCom;
  320. pag.PropertiesChanged; //Para actualizar cambios.
  321. end;
  322. VK_S: begin
  323. if Shift = [ssCtrl] then begin //Ctrl+S
  324. AcFilSavSesExecute(self); //Guarda sesión
  325. end;
  326. end;
  327. end;
  328. end;
  329. procedure TfrmPrincipal.FormClose(Sender: TObject; var CloseAction: TCloseAction
  330. );
  331. begin
  332. Config.SaveToFile; //guarda configuración
  333. end;
  334. procedure TfrmPrincipal.FormCloseQuery(Sender: TObject; var CanClose: boolean);
  335. var
  336. lstClosedFiles: string;
  337. begin
  338. if ejecMac then begin
  339. if MsgYesNo('En este momento, se está ejecutando una macro. ¿Detenerla?') = 1 then begin
  340. frmEditMacros.DetenerEjec;
  341. exit;
  342. end;
  343. canClose := false; //cancela el cierre
  344. end;
  345. //Prueba cerrando todas las ventanas
  346. if not TabSessions.CloseAll(lstClosedFiles) then begin
  347. canClose := false; //Se canceló
  348. end;
  349. end;
  350. procedure TfrmPrincipal.StatusBar1DrawPanel(StatusBar: TStatusBar;
  351. Panel: TStatusPanel; const Rect: TRect);
  352. begin
  353. if panel.Index = 0 then begin
  354. if ejecMac then begin
  355. if parpadPan0 then begin
  356. // StatusBar.Canvas.Font.Bold := true;
  357. StatusBar.Canvas.Font.Color:=clBlue;
  358. StatusBar.Canvas.Pen.Color := clWhite;
  359. StatusBar.Canvas.Brush.Color := clWhite;
  360. StatusBar.Canvas.Rectangle(Rect);
  361. StatusBar.Canvas.TextRect(Rect, 2 + Rect.Left, 2 + Rect.Top, dic('Ejecutando macro'));
  362. end else begin
  363. // StatusBar.Canvas.Font.Bold := true;
  364. StatusBar.Canvas.Font.Color:=clWhite;
  365. StatusBar.Canvas.Pen.Color := clBlue;
  366. StatusBar.Canvas.Brush.Color := clBlue;
  367. StatusBar.Canvas.Rectangle(Rect);
  368. StatusBar.Canvas.TextRect(Rect, 2 + Rect.Left, 2 + Rect.Top, dic('Ejecutando macro'));
  369. end;
  370. end else begin
  371. StatusBar.Canvas.Font.Color:=clBlack;
  372. // StatusBar.Canvas.Font.Bold := true;
  373. StatusBar.Canvas.TextRect(Rect, 2 + Rect.Left, 2 + Rect.Top, StatusBar1.Panels[0].Text);
  374. end;
  375. end;
  376. if panel.Index = 1 then begin
  377. if curProc<>nil then begin
  378. curProc.DrawStatePanel(StatusBar.Canvas, Rect);
  379. end;
  380. end;
  381. end;
  382. procedure TfrmPrincipal.TabSessionsPageEvent(event: string; page: TObject; out res: string);
  383. var
  384. pag: TfraTabSession;
  385. begin
  386. pag := TfraTabSession(page);
  387. res := ''; //Por defecto
  388. case event of
  389. 'req_init': begin //Solicitud de inicialización de página
  390. pag.Init();
  391. end;
  392. 'req_activate': begin //Solicita activar la página
  393. pag.Activate();
  394. end;
  395. 'req_conn_gui': begin //Una sesión requiere conectarse a la GUI, para mostrar información o su estado.
  396. curProc := pag.proc; //Apunta al proceso actual. Usado para refrescar StatusBar1
  397. pag.proc.panelState := StatusBar1.Panels[1];
  398. pag.PanInfoConn := StatusBar1.Panels[0];
  399. pag.ePCom.PanCursorPos := StatusBar1.Panels[2];
  400. pag.ePCom.PanLangName := StatusBar1.Panels[4];
  401. UpdateHeader; //Actualiza encabezado.
  402. end;
  403. 'query_close': begin //Se consulta antes de cerrar una ventana
  404. if pag.queryClose then begin
  405. //SE va a cerrar.
  406. res := 'Y';
  407. //Verfica si se va a eliminar al que apuntamos con "curProc".
  408. if curProc = pag.proc then curProc := nil;
  409. end else begin
  410. res := 'N';
  411. end;
  412. end;
  413. 'reg_def_ext': begin //Se pide extensión por defecto para archivos.
  414. res := MSG_FILE_EXT;
  415. end;
  416. 'req_filt_save': begin //Se pide el filtro del diálogo "Save as...".
  417. res := MSG_FILE_DES + '|*' + MSG_FILE_EXT + '|' +
  418. MSG_ALLFILES + '|*.*'
  419. end;
  420. 'reg_reg_file': begin //Se pide registrar archivo en el histórico
  421. AddRecentFile(pag.FileName);
  422. end;
  423. 'req_new_page': begin //Se pide agregar una nueva página. Desde el menú de las lenguetas.
  424. AcFilNewSesExecute(self);
  425. end;
  426. 'req_open_page': begin //Se pide abrir una página
  427. AcFIlOpeSesExecute(self);
  428. end;
  429. 'exec_explor': begin
  430. AcToolRemExplorExecute(self);
  431. end;
  432. 'exec_edit': begin
  433. AcToolRemEditExecute(self);
  434. end;
  435. end;
  436. end;
  437. procedure TfrmPrincipal.Timer1Timer(Sender: TObject);
  438. //Temporizador cada de 0.5 segundos
  439. begin
  440. //Muestra mensaje de ejecución
  441. if ejecMac then begin
  442. //fuerza refresco del panel
  443. parpadPan0 := not parpadPan0; //para el parpadeo
  444. StatusBar1.InvalidatePanel(0,[ppText]);
  445. end;
  446. end;
  447. procedure TfrmPrincipal.MostrarBarEst(visibilidad:boolean );
  448. //Solo por esta función se debe cambiar la visibilidad de la barra de estado
  449. begin
  450. StatusBar1.Visible:=visibilidad;
  451. AcViewStatusBar.Checked:=visibilidad;
  452. Config.VerBarEst :=visibilidad; //Actualiza variable global
  453. Config.SaveToFile; //guarda cambio
  454. end;
  455. function TfrmPrincipal.AvailableConnection: boolean;
  456. //Indica si la conexión está en estado ECO_READY, es decir, que puede
  457. //recibir un comando
  458. var
  459. pag: TfraTabSession;
  460. begin
  461. if not GetCurSession(pag) then exit(false);
  462. Result := (pag.proc.state = ECO_READY);
  463. end;
  464. //Acciones sobre la session actual.
  465. function TfrmPrincipal.GetCurSession(out pag: TfraTabSession): boolean;
  466. {Devuelve en "pag" la referencia a la sesión actual. Si no hay sesión actual,
  467. devuelve FALSE.}
  468. begin
  469. if TabSessions.TabIndex = -1 then exit(false);
  470. pag := TabSessions.ActivePage;
  471. exit(true);
  472. end;
  473. procedure TfrmPrincipal.SetCurPort(port: integer);
  474. begin
  475. if TabSessions.TabIndex = -1 then exit;
  476. TabSessions.ActivePage.Port := IntToStr(port);
  477. TabSessions.ActivePage.UpdateCommand;
  478. end;
  479. procedure TfrmPrincipal.SetCurIP(ip: string);
  480. begin
  481. if TabSessions.TabIndex = -1 then exit;
  482. TabSessions.ActivePage.IP := ip;
  483. TabSessions.ActivePage.UpdateCommand;
  484. end;
  485. procedure TfrmPrincipal.SetCurConnType(ctyp: TTipCon);
  486. begin
  487. if TabSessions.TabIndex = -1 then exit;
  488. TabSessions.ActivePage.Tipo := ctyp;
  489. TabSessions.ActivePage.UpdateCommand;
  490. end;
  491. procedure TfrmPrincipal.SetCurLineDelimSend(delim: TUtLineDelSend);
  492. begin
  493. if TabSessions.TabIndex = -1 then exit;
  494. TabSessions.ActivePage.LineDelimSend := delim;
  495. TabSessions.ActivePage.UpdateCommand; { TODO : ¿Es necesario? }
  496. end;
  497. procedure TfrmPrincipal.SetCurOther(txt: string);
  498. begin
  499. if TabSessions.TabIndex = -1 then exit;
  500. TabSessions.ActivePage.Other := txt;
  501. TabSessions.ActivePage.UpdateCommand;
  502. end;
  503. procedure TfrmPrincipal.RecentClick(Sender: TObject);
  504. //Se selecciona un archivo de la lista de recientes
  505. var
  506. cap, recFile: string;
  507. begin
  508. cap := TMenuItem(Sender).Caption;
  509. recFile := MidStr(cap, 4,150);
  510. if not FileExists(recFile) then exit;
  511. AbrirSesion(recFile);
  512. end;
  513. procedure TfrmPrincipal.ActualMenusReciente(Sender: TObject);
  514. {Actualiza el menú de archivos recientes con la lista de los archivos abiertos
  515. recientemente. }
  516. var
  517. i: Integer;
  518. RecentFiles: TStringList;
  519. begin
  520. RecentFiles := Config.RecentFiles;
  521. if mnRecents = nil then exit;
  522. if RecentFiles = nil then exit;
  523. //Protección
  524. if RecentFiles.Count = 0 then begin
  525. mnRecents[0].Caption := MSG_NOFILES;
  526. mnRecents[0].Enabled:=false;
  527. for i:= 1 to mnRecents.Count-1 do begin
  528. mnRecents[i].Visible:=false;
  529. end;
  530. exit;
  531. end;
  532. //hace visible los ítems
  533. mnRecents[0].Enabled:=true;
  534. for i:= 0 to mnRecents.Count-1 do begin
  535. if i<RecentFiles.Count then
  536. mnRecents[i].Visible:=true
  537. else
  538. mnRecents[i].Visible:=false;
  539. end;
  540. //pone etiquetas a los menús, incluyendo un atajo numérico
  541. for i:=0 to RecentFiles.Count-1 do begin
  542. mnRecents[i].Caption := '&'+IntToStr(i+1)+' '+RecentFiles[i];
  543. end;
  544. end;
  545. procedure TfrmPrincipal.AddRecentFile(arch: string);
  546. //Agrega el nombre de un archivo reciente
  547. var hay: integer; //bandera-índice
  548. i: integer;
  549. RecentFiles: TStringList;
  550. begin
  551. RecentFiles := Config.RecentFiles;
  552. if RecentFiles = nil then exit;
  553. //verifica si ya existe
  554. hay := -1; //valor inicial
  555. for i:= 0 to RecentFiles.Count-1 do
  556. if RecentFiles[i] = arch then hay := i;
  557. if hay = -1 then //no existe
  558. RecentFiles.Insert(0,arch) //agrega al inicio
  559. else begin //ya existe
  560. RecentFiles.Delete(hay); //lo elimina
  561. RecentFiles.Insert(0,arch); //lo agrega al inicio
  562. end;
  563. while RecentFiles.Count>MaxRecents do //Mantiene tamaño máximo
  564. RecentFiles.Delete(MaxRecents);
  565. end;
  566. procedure TfrmPrincipal.LoadLastFileEdited;
  567. {Carga el último archivo de la lista de recientes}
  568. begin
  569. if mnRecents.Count = 0 then exit;
  570. ActualMenusReciente(self);
  571. mnRecents.Items[0].Click;
  572. end;
  573. procedure TfrmPrincipal.LoadListFiles(lst: string);
  574. var
  575. a: TStringDynArray;
  576. i: Integer;
  577. filName: String;
  578. begin
  579. a := Explode(LineEnding, lst);
  580. for i:=0 to high(a) do begin
  581. filName := trim(a[i]);
  582. if filName = '' then continue;
  583. AbrirSesion(filName);
  584. end;
  585. end;
  586. procedure TfrmPrincipal.InitMenuRecents(menRecents0: TMenuItem; RecentList: TStringList;
  587. MaxRecents0: integer=5);
  588. //Configura un menú, con el historial de los archivos abiertos recientemente
  589. //"nRecents", es el número de archivos recientes que se guardará
  590. var
  591. i: Integer;
  592. begin
  593. mnRecents := menRecents0;
  594. Config.RecentFiles := RecentList; //gaurda referencia a lista
  595. MaxRecents := MaxRecents0;
  596. //configura menú
  597. mnRecents.OnClick:=@ActualMenusReciente;
  598. for i:= 1 to MaxRecents do begin
  599. AddItemToMenu(mnRecents, '&'+IntToStr(i), @RecentClick);
  600. end;
  601. end;
  602. /////////////////////// ACCIONES ////////////////////////
  603. //Acciones de archivo
  604. procedure TfrmPrincipal.AcFilQckConnecExecute(Sender: TObject); //conexión rápida
  605. var
  606. ses: TfraTabSession;
  607. begin
  608. frmQuickConnect.ShowModal;
  609. if frmQuickConnect.Cancel then exit;
  610. if not StringLike(frmQuickConnect.ip, '*.*.*.*') then begin
  611. MsgErr('Invalid IP address.');
  612. exit;
  613. end;
  614. case frmQuickConnect.tipo of
  615. TCON_TELNET: begin
  616. ses := TabSessions.AddPage(MSG_FILE_EXT);
  617. ses.InicConectTelnet(frmQuickConnect.ip);
  618. end;
  619. TCON_SSH : begin
  620. ses := TabSessions.AddPage(MSG_FILE_EXT);
  621. ses.InicConectSSH(frmQuickConnect.ip);
  622. end;
  623. end;
  624. //InicConect; //inicia conexión
  625. //Almacena conexión
  626. Config.SaveToFile; //guarda en configuración}
  627. end;
  628. procedure TfrmPrincipal.AcFilNewWinExecute(Sender: TObject);
  629. //Abre una nueva ventana de la aplicación
  630. begin
  631. Exec('TitoTerm.exe','');
  632. end;
  633. procedure TfrmPrincipal.AcFilNewSesExecute(Sender: TObject); //Genera una nueva sesión
  634. var
  635. ses: TfraTabSession;
  636. l: TStrings;
  637. begin
  638. ses := TabSessions.AddPage(MSG_FILE_EXT);
  639. TabSessions.SetFocus;
  640. ses.ExecSettings; //Muestra ventana de configuración
  641. l := ses.edPCom.Lines;
  642. case ses.Tipo of
  643. TCON_SSH: begin
  644. l.Add('###########################################');
  645. l.Add('## New SSH session created ' + DateTimeToStr(now));
  646. l.Add('###########################################');
  647. l.Add('IP: ' + ses.IP);
  648. l.Add('Port: ' + ses.Port);
  649. end;
  650. TCON_TELNET: begin
  651. l.Add('###########################################');
  652. l.Add('## New Telnet session created ' + DateTimeToStr(now));
  653. l.Add('###########################################');
  654. l.Add('IP: ' + ses.IP);
  655. l.Add('Port: ' + ses.Port);
  656. end;
  657. TCON_SERIAL: begin
  658. l.Add('###########################################');
  659. l.Add('## New SERIAL session created ' + DateTimeToStr(now));
  660. l.Add('###########################################');
  661. // l.Add('IP: ' + ses.IP);
  662. // l.Add('Port: ' + ses.Port);
  663. end;
  664. end;
  665. ses.setModified(true); //Marca como modificado
  666. end;
  667. procedure TfrmPrincipal.AcFIlOpeSesExecute(Sender: TObject); //Abrir sesión
  668. begin
  669. OpenDialog1.Filter := MSG_FILE_DES + '|*' + MSG_FILE_EXT + '|' +
  670. MSG_ALLFILES + '|*.*';
  671. //OpenDialog1.InitialDir:=patSessions; //busca aquí por defecto
  672. if not OpenDialog1.Execute then exit; //se canceló
  673. AbrirSesion(OpenDialog1.FileName);
  674. end;
  675. procedure TfrmPrincipal.AcFilSavSesExecute(Sender: TObject); //guardar sesión
  676. var
  677. ses: TfraTabSession;
  678. begin
  679. if GetCurSession(ses) then begin
  680. ses.SaveToFile;
  681. end;
  682. end;
  683. procedure TfrmPrincipal.AcFilSavSesAsExecute(Sender: TObject); //guarda sesión como
  684. var
  685. ses: TfraTabSession;
  686. begin
  687. if GetCurSession(ses) then begin
  688. ses.SaveAsDialog;
  689. UpdateHeader; //Actualiza barra de título
  690. end;
  691. end;
  692. procedure TfrmPrincipal.AcFilExitExecute(Sender: TObject);
  693. begin
  694. Close;
  695. end;
  696. //Acciones de Ver
  697. procedure TfrmPrincipal.AcViewStatusBarExecute(Sender: TObject);
  698. begin
  699. MostrarBarEst(not AcViewStatusBar.Checked);
  700. end;
  701. //Acciones de macros
  702. procedure TfrmPrincipal.AcMacEditorExecute(Sender: TObject);
  703. begin
  704. frmEditMacros.Show;
  705. end;
  706. procedure TfrmPrincipal.AcMacRecordExecute(Sender: TObject);
  707. begin
  708. frmEditMacros.AcHerGrabExecute(self);
  709. end;
  710. //Acciones de Herramientas
  711. procedure TfrmPrincipal.AcToolRemExplorExecute(Sender: TObject);
  712. var
  713. ses: TfraTabSession;
  714. begin
  715. if not GetCurSession(ses) then begin
  716. MsgBox('There isn''t an active session.');
  717. exit;
  718. end;
  719. frmRemoteExplor.Init(ses);
  720. frmRemoteExplor.Show;
  721. end;
  722. procedure TfrmPrincipal.AcToolRemEditExecute(Sender: TObject);
  723. var
  724. ses: TfraTabSession;
  725. begin
  726. if not GetCurSession(ses) then begin
  727. MsgBox('There isn''t an active session.');
  728. exit;
  729. end;
  730. frmRemoteEditor.Init(ses);
  731. frmRemoteEditor.Show;
  732. end;
  733. procedure TfrmPrincipal.AcToolSettExecute(Sender: TObject);
  734. begin
  735. Config.Configurar;
  736. end;
  737. //Acciones de ayuda
  738. procedure TfrmPrincipal.acHlpHelpExecute(Sender: TObject);
  739. begin
  740. OpenURL('https://github.com/t-edson/Tito-s-Terminal/tree/master/Docs');
  741. end;
  742. end.
  743. //1810