FormPrincipal.pas 25 KB

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