FormPrincipal.pas 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721
  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. begin
  167. //Carga archivo arrastrados
  168. // if ePCom.SaveQuery then Exit; //Verifica cambios
  169. // ePCom.LoadFile(FileNames[0]);
  170. end;
  171. procedure TfrmPrincipal.FormShow(Sender: TObject);
  172. begin
  173. InitMenuRecents(mnRecents, Config.RecentFiles, 8);
  174. TranslateMsgs := true; //activa la traducción en los mensajes
  175. frmEditMacros.Init(TabSessions);
  176. //Aquí ya sabemos que Config está creado. Lo configuramos.
  177. Config.edMacr := frmEditMacros.ed;
  178. COnfig.edRemo := frmRemoteEditor.ed;
  179. Config.OnPropertiesChanged := @PropertiesChanged;
  180. Config.Iniciar(); //Inicia la configuración
  181. //muestra dirección IP actual
  182. //ActualizarInfoPanel0;
  183. //actualiza menús
  184. mnSesionesAlmClick(self);
  185. mnEjecMacroClick(self);
  186. mnAbrMacroClick(self);
  187. UpdateHeader; //Actualiza barra de título
  188. end;
  189. procedure TfrmPrincipal.UpdateHeader;
  190. var
  191. pag: TfraTabSession;
  192. begin
  193. //Actualiza encabezado
  194. if GetCurSession(pag) then begin
  195. Caption := NOM_PROG + '-' + VER_PROG + ' - ' + pag.FileName;
  196. end else begin
  197. Caption := NOM_PROG + '-' + VER_PROG;
  198. end;
  199. end;
  200. procedure TfrmPrincipal.edPComSpecialLineMarkup(Sender: TObject; Line: integer;
  201. var Special: boolean; Markup: TSynSelectedColor);
  202. begin
  203. //vacío
  204. end;
  205. /////////////// Funciones para manejo de macros///////////////
  206. procedure TfrmPrincipal.mnSesionesAlmClick(Sender: TObject);
  207. begin
  208. mnSesionesAlm.Clear;
  209. LeeArchEnMenu(patSessions + DirectorySeparator +'*.ses', mnSesionesAlm, @itemAbreSesion);
  210. end;
  211. procedure TfrmPrincipal.mnEjecMacroClick(Sender: TObject);
  212. begin
  213. mnEjecMacro.Clear;
  214. LeeArchEnMenu(config.macros + DirectorySeparator +'*.ttm', mnEjecMacro,@itemEjecMacro);
  215. end;
  216. procedure TfrmPrincipal.mnAbrMacroClick(Sender: TObject);
  217. begin
  218. mnAbrMacro.Clear;
  219. LeeArchEnMenu(config.macros + DirectorySeparator +'*.ttm', mnAbrMacro,@itemAbreMacro);
  220. end;
  221. procedure TfrmPrincipal.AbrirSesion(fileSession: string);
  222. //Abre una sesión
  223. var
  224. pag: TfraTabSession;
  225. i: Integer;
  226. begin
  227. // //Actualiza menús
  228. // mnEjecMacroClick(self);
  229. // mnAbrMacroClick(self);
  230. //Si es ruta relativa, la vuelve absoluta.
  231. if Pos(DirectorySeparator, fileSession) = 0 then begin
  232. fileSession := patApp + fileSession;
  233. end;
  234. //Verifica si ya está abierto
  235. for i:=0 to TabSessions.pages.Count-1 do begin
  236. pag := TabSessions.pages[i];
  237. if UpCase(pag.fileName) = fileSession then begin
  238. //Ya está abierto
  239. TabSessions.TabIndex := i; //Selecciona
  240. exit;
  241. end;
  242. end;
  243. //Crea nueva página
  244. pag := TabSessions.AddPage(MSG_FILE_EXT);
  245. pag.fileName := fileSession;
  246. //Carga archivo
  247. pag.LoadFromFile; //Podría generar error.
  248. //Actualiza la barra de título.
  249. UpdateHeader;
  250. end;
  251. procedure TfrmPrincipal.itemAbreSesion(Sender: TObject);
  252. begin
  253. AbrirSesion(patSessions + DirectorySeparator + TMenuItem(Sender).Caption);
  254. end;
  255. procedure TfrmPrincipal.itemEjecMacro(Sender: TObject);
  256. //Ejecuta la macro elegida
  257. begin
  258. frmEditMacros.Ejecutar(config.macros + DirectorySeparator + TMenuItem(Sender).Caption);
  259. end;
  260. procedure TfrmPrincipal.itemAbreMacro(Sender: TObject);
  261. begin
  262. frmEditMacros.Show;
  263. frmEditMacros.Abrir(config.macros + DirectorySeparator + TMenuItem(Sender).Caption);
  264. end;
  265. procedure TfrmPrincipal.PropertiesChanged;
  266. //Configura el entorno (IDE) a partir de la configuración global (FormConfig).
  267. begin
  268. //Inicia visibilidad de paneles. Estas son propiedades del entrono, no de un editor en particular
  269. //Barra de herramientas
  270. // tbTerm.Visible := Config.VerBHerTerm;
  271. // AcTerVerBHer.Checked := Config.VerBHerTerm;
  272. //Barra de estado.
  273. MostrarBarEst(Config.VerBarEst);
  274. //Apariencia de los editores
  275. Config.fcEdMacr.ConfigEditor(frmEditMacros.ed);
  276. Config.fcEdRemo.ConfigEditor(frmRemoteEditor.ed);
  277. frmEditMacros.ed.Invalidate;
  278. frmRemoteEditor.ed.Invalidate;
  279. end;
  280. procedure TfrmPrincipal.FormKeyDown(Sender: TObject; var Key: Word;
  281. Shift: TShiftState);
  282. var
  283. pag: TfraTabSession;
  284. begin
  285. case Key of
  286. VK_TAB: begin
  287. if Shift = [ssCtrl] then begin //Ctrl+Tab
  288. TabSessions.SelectNextEditor;
  289. end;
  290. if Shift = [ssShift, ssCtrl] then begin //Shift+Ctrl+Tab
  291. TabSessions.SelectPrevEditor;
  292. end;
  293. end;
  294. VK_1: begin
  295. if Shift = [ssCtrl] then begin //Ctrl+1
  296. if not GetCurSession(pag) then exit;
  297. //Selecciona panel de comandos
  298. pag.edPCom.SetFocus;
  299. end;
  300. end;
  301. VK_2: begin
  302. if Shift = [ssCtrl] then begin //Ctrl+2
  303. if not GetCurSession(pag) then exit;
  304. //Selecciona Terminal
  305. pag.edTerm.SetFocus;
  306. end;
  307. end;
  308. VK_F4: begin
  309. if Shift = [ssCtrl] then begin //Ctrl+F4
  310. TabSessions.ClosePage;
  311. Key := 0; //Sino daría error en las rutinas que procesen la tecla.
  312. end;
  313. end;
  314. VK_F2: begin
  315. if not GetCurSession(pag) then exit;
  316. pag.showPCom := not pag.showPCom;
  317. pag.PropertiesChanged; //Para actualizar cambios.
  318. end;
  319. VK_S: begin
  320. if Shift = [ssCtrl] then begin //Ctrl+S
  321. AcFilSavSesExecute(self); //Guarda sesión
  322. end;
  323. end;
  324. end;
  325. end;
  326. procedure TfrmPrincipal.FormClose(Sender: TObject; var CloseAction: TCloseAction
  327. );
  328. begin
  329. Config.SaveToFile; //guarda configuración
  330. end;
  331. procedure TfrmPrincipal.FormCloseQuery(Sender: TObject; var CanClose: boolean);
  332. var
  333. lstClosedFiles: string;
  334. begin
  335. if ejecMac then begin
  336. if MsgYesNo('En este momento, se está ejecutando una macro. ¿Detenerla?') = 1 then begin
  337. frmEditMacros.DetenerEjec;
  338. exit;
  339. end;
  340. canClose := false; //cancela el cierre
  341. end;
  342. //Prueba cerrando todas las ventanas
  343. if not TabSessions.CloseAll(lstClosedFiles) then begin
  344. canClose := false; //Se canceló
  345. end;
  346. end;
  347. procedure TfrmPrincipal.StatusBar1DrawPanel(StatusBar: TStatusBar;
  348. Panel: TStatusPanel; const Rect: TRect);
  349. begin
  350. if panel.Index = 0 then begin
  351. if ejecMac then begin
  352. if parpadPan0 then begin
  353. // StatusBar.Canvas.Font.Bold := true;
  354. StatusBar.Canvas.Font.Color:=clBlue;
  355. StatusBar.Canvas.Pen.Color := clWhite;
  356. StatusBar.Canvas.Brush.Color := clWhite;
  357. StatusBar.Canvas.Rectangle(Rect);
  358. StatusBar.Canvas.TextRect(Rect, 2 + Rect.Left, 2 + Rect.Top, dic('Ejecutando macro'));
  359. end else begin
  360. // StatusBar.Canvas.Font.Bold := true;
  361. StatusBar.Canvas.Font.Color:=clWhite;
  362. StatusBar.Canvas.Pen.Color := clBlue;
  363. StatusBar.Canvas.Brush.Color := clBlue;
  364. StatusBar.Canvas.Rectangle(Rect);
  365. StatusBar.Canvas.TextRect(Rect, 2 + Rect.Left, 2 + Rect.Top, dic('Ejecutando macro'));
  366. end;
  367. end else begin
  368. StatusBar.Canvas.Font.Color:=clBlack;
  369. // StatusBar.Canvas.Font.Bold := true;
  370. StatusBar.Canvas.TextRect(Rect, 2 + Rect.Left, 2 + Rect.Top, StatusBar1.Panels[0].Text);
  371. end;
  372. end;
  373. if panel.Index = 1 then begin
  374. if curProc<>nil then begin
  375. curProc.DrawStatePanel(StatusBar.Canvas, Rect);
  376. end;
  377. end;
  378. end;
  379. procedure TfrmPrincipal.TabSessionsPageEvent(event: string; page: TObject; out res: string);
  380. var
  381. pag: TfraTabSession;
  382. begin
  383. pag := TfraTabSession(page);
  384. res := ''; //Por defecto
  385. case event of
  386. 'req_init': begin //Solicitud de inicialización de página
  387. pag.Init();
  388. end;
  389. 'req_activate': begin //Solicita activar la página
  390. pag.Activate();
  391. end;
  392. 'req_conn_gui': begin //Una sesión requiere conectarse a la GUI, para mostrar información o su estado.
  393. curProc := pag.proc; //Apunta al proceso actual. Usado para refrescar StatusBar1
  394. pag.proc.panelState := StatusBar1.Panels[1];
  395. pag.PanInfoConn := StatusBar1.Panels[0];
  396. pag.ePCom.PanCursorPos := StatusBar1.Panels[2];
  397. pag.ePCom.PanLangName := StatusBar1.Panels[4];
  398. UpdateHeader; //Actualiza encabezado.
  399. end;
  400. 'query_close': begin //Se consulta antes de cerrar una ventana
  401. if pag.queryClose then begin
  402. //SE va a cerrar.
  403. res := 'Y';
  404. //Verfica si se va a eliminar al que apuntamos con "curProc".
  405. if curProc = pag.proc then curProc := nil;
  406. end else begin
  407. res := 'N';
  408. end;
  409. end;
  410. 'reg_def_ext': begin //Se pide extensión por defecto para archivos.
  411. res := MSG_FILE_EXT;
  412. end;
  413. 'req_filt_save': begin //Se pide el filtro del diálogo "Save as...".
  414. res := MSG_FILE_DES + '|*' + MSG_FILE_EXT + '|' +
  415. MSG_ALLFILES + '|*.*'
  416. end;
  417. 'reg_reg_file': begin //Se pide registrar archivo en el histórico
  418. AddRecentFile(pag.FileName);
  419. end;
  420. 'req_new_page': begin //Se pide agregar una nueva página. Desde el menú de las lenguetas.
  421. AcFilNewSesExecute(self);
  422. end;
  423. 'req_open_page': begin //Se pide abrir una página
  424. AcFIlOpeSesExecute(self);
  425. end;
  426. end;
  427. end;
  428. procedure TfrmPrincipal.Timer1Timer(Sender: TObject);
  429. //Temporizador cada de 0.5 segundos
  430. begin
  431. //Muestra mensaje de ejecución
  432. if ejecMac then begin
  433. //fuerza refresco del panel
  434. parpadPan0 := not parpadPan0; //para el parpadeo
  435. StatusBar1.InvalidatePanel(0,[ppText]);
  436. end;
  437. end;
  438. procedure TfrmPrincipal.MostrarBarEst(visibilidad:boolean );
  439. //Solo por esta función se debe cambiar la visibilidad de la barra de estado
  440. begin
  441. StatusBar1.Visible:=visibilidad;
  442. AcViewStatusBar.Checked:=visibilidad;
  443. Config.VerBarEst :=visibilidad; //Actualiza variable global
  444. Config.SaveToFile; //guarda cambio
  445. end;
  446. function TfrmPrincipal.AvailableConnection: boolean;
  447. //Indica si la conexión está en estado ECO_READY, es decir, que puede
  448. //recibir un comando
  449. var
  450. pag: TfraTabSession;
  451. begin
  452. if not GetCurSession(pag) then exit(false);
  453. Result := (pag.proc.state = ECO_READY);
  454. end;
  455. //Acciones sobre la session actual.
  456. function TfrmPrincipal.GetCurSession(out pag: TfraTabSession): boolean;
  457. {Devuelve en "pag" la referencia a la sesión actual. Si no hay sesión actual,
  458. devuelve FALSE.}
  459. begin
  460. if TabSessions.TabIndex = -1 then exit(false);
  461. pag := TabSessions.ActivePage;
  462. exit(true);
  463. end;
  464. procedure TfrmPrincipal.SetCurPort(port: integer);
  465. begin
  466. if TabSessions.TabIndex = -1 then exit;
  467. TabSessions.ActivePage.Port := IntToStr(port);
  468. TabSessions.ActivePage.UpdateCommand;
  469. end;
  470. procedure TfrmPrincipal.SetCurIP(ip: string);
  471. begin
  472. if TabSessions.TabIndex = -1 then exit;
  473. TabSessions.ActivePage.IP := ip;
  474. TabSessions.ActivePage.UpdateCommand;
  475. end;
  476. procedure TfrmPrincipal.SetCurConnType(ctyp: TTipCon);
  477. begin
  478. if TabSessions.TabIndex = -1 then exit;
  479. TabSessions.ActivePage.Tipo := ctyp;
  480. TabSessions.ActivePage.UpdateCommand;
  481. end;
  482. procedure TfrmPrincipal.SetCurLineDelimSend(delim: TUtLineDelSend);
  483. begin
  484. if TabSessions.TabIndex = -1 then exit;
  485. TabSessions.ActivePage.LineDelimSend := delim;
  486. TabSessions.ActivePage.UpdateCommand; { TODO : ¿Es necesario? }
  487. end;
  488. procedure TfrmPrincipal.SetCurOther(txt: string);
  489. begin
  490. if TabSessions.TabIndex = -1 then exit;
  491. TabSessions.ActivePage.Other := txt;
  492. TabSessions.ActivePage.UpdateCommand;
  493. end;
  494. procedure TfrmPrincipal.RecentClick(Sender: TObject);
  495. //Se selecciona un archivo de la lista de recientes
  496. var
  497. cap, recFile: string;
  498. begin
  499. cap := TMenuItem(Sender).Caption;
  500. recFile := MidStr(cap, 4,150);
  501. if not FileExists(recFile) then exit;
  502. AbrirSesion(recFile);
  503. end;
  504. procedure TfrmPrincipal.ActualMenusReciente(Sender: TObject);
  505. {Actualiza el menú de archivos recientes con la lista de los archivos abiertos
  506. recientemente. }
  507. var
  508. i: Integer;
  509. RecentFiles: TStringList;
  510. begin
  511. RecentFiles := Config.RecentFiles;
  512. if mnRecents = nil then exit;
  513. if RecentFiles = nil then exit;
  514. //Protección
  515. if RecentFiles.Count = 0 then begin
  516. mnRecents[0].Caption := MSG_NOFILES;
  517. mnRecents[0].Enabled:=false;
  518. for i:= 1 to mnRecents.Count-1 do begin
  519. mnRecents[i].Visible:=false;
  520. end;
  521. exit;
  522. end;
  523. //hace visible los ítems
  524. mnRecents[0].Enabled:=true;
  525. for i:= 0 to mnRecents.Count-1 do begin
  526. if i<RecentFiles.Count then
  527. mnRecents[i].Visible:=true
  528. else
  529. mnRecents[i].Visible:=false;
  530. end;
  531. //pone etiquetas a los menús, incluyendo un atajo numérico
  532. for i:=0 to RecentFiles.Count-1 do begin
  533. mnRecents[i].Caption := '&'+IntToStr(i+1)+' '+RecentFiles[i];
  534. end;
  535. end;
  536. procedure TfrmPrincipal.AddRecentFile(arch: string);
  537. //Agrega el nombre de un archivo reciente
  538. var hay: integer; //bandera-índice
  539. i: integer;
  540. RecentFiles: TStringList;
  541. begin
  542. RecentFiles := Config.RecentFiles;
  543. if RecentFiles = nil then exit;
  544. //verifica si ya existe
  545. hay := -1; //valor inicial
  546. for i:= 0 to RecentFiles.Count-1 do
  547. if RecentFiles[i] = arch then hay := i;
  548. if hay = -1 then //no existe
  549. RecentFiles.Insert(0,arch) //agrega al inicio
  550. else begin //ya existe
  551. RecentFiles.Delete(hay); //lo elimina
  552. RecentFiles.Insert(0,arch); //lo agrega al inicio
  553. end;
  554. while RecentFiles.Count>MaxRecents do //Mantiene tamaño máximo
  555. RecentFiles.Delete(MaxRecents);
  556. end;
  557. procedure TfrmPrincipal.LoadLastFileEdited;
  558. {Carga el último archivo de la lista de recientes}
  559. begin
  560. if mnRecents.Count = 0 then exit;
  561. ActualMenusReciente(self);
  562. mnRecents.Items[0].Click;
  563. end;
  564. procedure TfrmPrincipal.LoadListFiles(lst: string);
  565. var
  566. a: TStringDynArray;
  567. i: Integer;
  568. filName: String;
  569. begin
  570. a := Explode(LineEnding, lst);
  571. for i:=0 to high(a) do begin
  572. filName := trim(a[i]);
  573. if filName = '' then continue;
  574. AbrirSesion(filName);
  575. end;
  576. end;
  577. procedure TfrmPrincipal.InitMenuRecents(menRecents0: TMenuItem; RecentList: TStringList;
  578. MaxRecents0: integer=5);
  579. //Configura un menú, con el historial de los archivos abiertos recientemente
  580. //"nRecents", es el número de archivos recientes que se guardará
  581. var
  582. i: Integer;
  583. begin
  584. mnRecents := menRecents0;
  585. Config.RecentFiles := RecentList; //gaurda referencia a lista
  586. MaxRecents := MaxRecents0;
  587. //configura menú
  588. mnRecents.OnClick:=@ActualMenusReciente;
  589. for i:= 1 to MaxRecents do begin
  590. AddItemToMenu(mnRecents, '&'+IntToStr(i), @RecentClick);
  591. end;
  592. end;
  593. /////////////////////// ACCIONES ////////////////////////
  594. //Acciones de archivo
  595. procedure TfrmPrincipal.AcFilQckConnecExecute(Sender: TObject); //conexión rápida
  596. var
  597. ses: TfraTabSession;
  598. begin
  599. frmQuickConnect.ShowModal;
  600. if frmQuickConnect.Cancel then exit;
  601. if not StringLike(frmQuickConnect.ip, '*.*.*.*') then begin
  602. MsgErr('Invalid IP address.');
  603. exit;
  604. end;
  605. case frmQuickConnect.tipo of
  606. TCON_TELNET: begin
  607. ses := TabSessions.AddPage(MSG_FILE_EXT);
  608. ses.InicConectTelnet(frmQuickConnect.ip);
  609. end;
  610. TCON_SSH : begin
  611. ses := TabSessions.AddPage(MSG_FILE_EXT);
  612. ses.InicConectSSH(frmQuickConnect.ip);
  613. end;
  614. end;
  615. //InicConect; //inicia conexión
  616. //Almacena conexión
  617. Config.SaveToFile; //guarda en configuración}
  618. end;
  619. procedure TfrmPrincipal.AcFilNewWinExecute(Sender: TObject);
  620. //Abre una nueva ventana de la aplicación
  621. begin
  622. Exec('TitoTerm.exe','');
  623. end;
  624. procedure TfrmPrincipal.AcFilNewSesExecute(Sender: TObject); //Genera una nueva sesión
  625. var
  626. ses: TfraTabSession;
  627. l: TStrings;
  628. begin
  629. ses := TabSessions.AddPage(MSG_FILE_EXT);
  630. TabSessions.SetFocus;
  631. ses.ExecSettings; //Muestra ventana de configuración
  632. l := ses.edPCom.Lines;
  633. case ses.Tipo of
  634. TCON_SSH: begin
  635. l.Add('###########################################');
  636. l.Add('## New SSH session created ' + DateTimeToStr(now));
  637. l.Add('###########################################');
  638. l.Add('IP: ' + ses.IP);
  639. l.Add('Port: ' + ses.Port);
  640. end;
  641. end;
  642. ses.setModified(true); //Marca como modificado
  643. end;
  644. procedure TfrmPrincipal.AcFIlOpeSesExecute(Sender: TObject); //Abrir sesión
  645. begin
  646. OpenDialog1.Filter := MSG_FILE_DES + '|*' + MSG_FILE_EXT + '|' +
  647. MSG_ALLFILES + '|*.*';
  648. //OpenDialog1.InitialDir:=patSessions; //busca aquí por defecto
  649. if not OpenDialog1.Execute then exit; //se canceló
  650. AbrirSesion(OpenDialog1.FileName);
  651. end;
  652. procedure TfrmPrincipal.AcFilSavSesExecute(Sender: TObject); //guardar sesión
  653. var
  654. ses: TfraTabSession;
  655. begin
  656. if GetCurSession(ses) then begin
  657. ses.SaveToFile;
  658. end;
  659. end;
  660. procedure TfrmPrincipal.AcFilSavSesAsExecute(Sender: TObject); //guarda sesión como
  661. var
  662. ses: TfraTabSession;
  663. begin
  664. if GetCurSession(ses) then begin
  665. ses.SaveAsDialog;
  666. UpdateHeader; //Actualiza barra de título
  667. end;
  668. end;
  669. procedure TfrmPrincipal.AcFilExitExecute(Sender: TObject);
  670. begin
  671. Close;
  672. end;
  673. //Acciones de Ver
  674. procedure TfrmPrincipal.AcViewStatusBarExecute(Sender: TObject);
  675. begin
  676. MostrarBarEst(not AcViewStatusBar.Checked);
  677. end;
  678. //Acciones de macros
  679. procedure TfrmPrincipal.AcMacEditorExecute(Sender: TObject);
  680. begin
  681. frmEditMacros.Show;
  682. end;
  683. procedure TfrmPrincipal.AcMacRecordExecute(Sender: TObject);
  684. begin
  685. frmEditMacros.AcHerGrabExecute(self);
  686. end;
  687. //Acciones de Herramientas
  688. procedure TfrmPrincipal.AcToolRemExplorExecute(Sender: TObject);
  689. begin
  690. frmRemoteExplor.Show;
  691. end;
  692. procedure TfrmPrincipal.AcToolRemEditExecute(Sender: TObject);
  693. begin
  694. frmRemoteEditor.Show;
  695. end;
  696. procedure TfrmPrincipal.AcToolSettExecute(Sender: TObject);
  697. begin
  698. Config.Configurar;
  699. end;
  700. //Acciones de ayuda
  701. procedure TfrmPrincipal.acHlpHelpExecute(Sender: TObject);
  702. begin
  703. OpenURL('https://github.com/t-edson/Tito-s-Terminal/tree/master/Docs');
  704. end;
  705. end.
  706. //1810