FormConfig.pas 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  1. {Unidad con formulario de configuración para manejar las propiedades de
  2. una aplicación. Está pensado para usarse con frames de la clase Tframe,
  3. definida en la unidad "PropertyFrame".
  4. }
  5. unit FormConfig;
  6. {$mode objfpc}{$H+}
  7. interface
  8. uses
  9. SysUtils, Classes, Forms, Graphics, SynEdit, Buttons, ComCtrls, ExtCtrls,
  10. StdCtrls, EditBtn, Controls, MisUtils, FrameCfgSynEdit, Globales, MiConfigXML;
  11. type
  12. TEvCambiaProp = procedure of object; //evento para indicar que hay cambio
  13. { TConfig }
  14. TConfig = class(TForm)
  15. bitAceptar: TBitBtn;
  16. bitAplicar: TBitBtn;
  17. bitCancel: TBitBtn;
  18. chkListDet: TCheckBox;
  19. chkMarLin: TCheckBox;
  20. chkMosOcul: TCheckBox;
  21. chkMosRut: TCheckBox;
  22. chkOpenLast: TCheckBox;
  23. chkRefDesp: TCheckBox;
  24. DirectoryEdit1: TDirectoryEdit;
  25. DirectoryEdit2: TDirectoryEdit;
  26. DirectoryEdit3: TDirectoryEdit;
  27. edTpoMax: TEdit;
  28. edTpoMax1: TEdit;
  29. Label1: TLabel;
  30. Label2: TLabel;
  31. lblRutLeng: TLabel;
  32. lblRutMac: TLabel;
  33. lblRutScript: TLabel;
  34. PageControl1: TPageControl;
  35. Panel1: TPanel;
  36. TabGeneral: TTabSheet;
  37. TabFilePath: TTabSheet;
  38. TabMacSett: TTabSheet;
  39. TabMacEdit: TTabSheet;
  40. TabRemEdEdit: TTabSheet;
  41. TabRemExpl: TTabSheet;
  42. TreeView1: TTreeView;
  43. procedure bitAceptarClick(Sender: TObject);
  44. procedure bitAplicarClick(Sender: TObject);
  45. procedure bitCancelClick(Sender: TObject);
  46. procedure FormCreate(Sender: TObject);
  47. procedure FormDestroy(Sender: TObject);
  48. procedure FormShow(Sender: TObject);
  49. procedure TreeView1Click(Sender: TObject);
  50. private
  51. function GetTabFromId(id: string): TTabSheet;
  52. function ActivateControl(ctlRef: TComponent): boolean;
  53. procedure MostEnVentana;
  54. { private declarations }
  55. public
  56. //msjError: string;
  57. edMacr : TSynEdit; //Referencia al editor panel de comando
  58. edRemo : TSynEdit; //Referencia al editor remoto
  59. //Frames de configuración
  60. fcEdMacr : TfraCfgSynEdit; //Editor de macros
  61. fcEdRemo : TfraCfgSynEdit; //Editor remoto
  62. //Evento
  63. OnPropertiesChanged: procedure of object; //Evento de cambio de propiedades
  64. public //Propiedades generales
  65. VerPanCom : boolean; //Panel de comandos
  66. VerBHerPcom : boolean; //Barra de herramientas
  67. VerBHerTerm : boolean; //Barra de herramientas
  68. VerBarEst : boolean; //Barra de estado
  69. TipAlineam : integer; //Tipo de alineamiento de pantalla
  70. RecentFiles : TStringList; //Lista de archivos recientes
  71. AbrirUltScr : boolean;
  72. public //Propiedades de rutas de archivos
  73. UltScript : string; //Último script editado
  74. foldTemp : string; { TODO : ¿Realmente conviene personalizar estas rutas? ¿Por qué no las dejamos fijas en las rutas que se definen en la unidad "Globales"? }
  75. foldMacros : string;
  76. foldLenguajes : string;
  77. public //Configuraciones de Macros
  78. TpoMax : integer;
  79. marLin : boolean;
  80. public //Configuraciones del explorador remoto
  81. TpoMax2: integer; //Tiempo máximo de espera
  82. MosRut : boolean; //muestra la ruta actual
  83. ListDet: boolean;
  84. MosOcul: boolean;
  85. RefDesp: boolean;
  86. public
  87. procedure Iniciar();
  88. procedure ReadFromFile(iniFile: string='');
  89. procedure SaveToFile(iniFile: string='');
  90. procedure Configurar(Id: string='');
  91. end;
  92. var
  93. Config: TConfig;
  94. implementation
  95. {$R *.lfm}
  96. { TConfig }
  97. procedure TConfig.FormCreate(Sender: TObject);
  98. begin
  99. RecentFiles := TStringList.Create;
  100. //Crea frames de configuración de SynEdit
  101. fcEdMacr:= TfraCfgSynEdit.Create(Self);
  102. fcEdMacr.Name := 'emac'; //Para que no de error de nombre
  103. fcEdMacr.parent := TabMacEdit;
  104. fcEdRemo:= TfraCfgSynEdit.Create(Self);
  105. fcEdRemo.Name := 'erem'; //Para que no de error de nombre
  106. fcEdRemo.parent := TabRemEdEdit;
  107. //Prepara página y Selecciona primera opción
  108. PageControl1.ShowTabs := false;
  109. TreeView1.Items[0].Selected:=true;
  110. TreeView1Click(self);
  111. cfgFile.VerifyFile;
  112. end;
  113. procedure TConfig.FormDestroy(Sender: TObject);
  114. begin
  115. RecentFiles.Destroy
  116. end;
  117. procedure TConfig.FormShow(Sender: TObject);
  118. begin
  119. MostEnVentana; //carga las propiedades en el frame
  120. end;
  121. procedure TConfig.Iniciar();
  122. //Inicia el formulario de configuración. Debe llamarse antes de usar el formulario y
  123. //después de haber cargado todos los frames.
  124. begin
  125. //Configuraciones generales
  126. cfgFile.Asoc_Bol('VerPanCom' , @VerPanCom , true);
  127. cfgFile.Asoc_Bol('VerBHerPcom', @VerBHerPcom, true);
  128. cfgFile.Asoc_Bol('VerBHerTerm', @VerBHerTerm, true);
  129. cfgFile.Asoc_Bol('VerBarEst' , @VerBarEst , true);
  130. cfgFile.Asoc_Int('TipAlineam' , @TipAlineam , 0);
  131. cfgFile.Asoc_StrList('Recents_ses', @RecentFiles);
  132. //Propiedades de rutas de archivos
  133. cfgFile.Asoc_Str('UltScript' , @UltScript ,'');
  134. cfgFile.Asoc_Bol('AbrirUltScr', @AbrirUltScr, chkOpenLast , true);
  135. cfgFile.Asoc_Str('foldTemp' , @foldTemp , DirectoryEdit1, patTemp);
  136. cfgFile.Asoc_Str('Macros' , @foldMacros , DirectoryEdit2, patMacros);
  137. cfgFile.Asoc_Str('Lenguajes' , @foldLenguajes , DirectoryEdit3, patSyntax);
  138. //Configuraciones de foldMacros
  139. cfgFile.Asoc_Int('TpoMax' , @TpoMax, edTpoMax , 10, 1, 180);
  140. cfgFile.Asoc_Bol('MarLin' , @marLin, chkMarLin, false);
  141. //Configuración de editor de foldMacros
  142. fcEdMacr.Iniciar('edMacros', cfgFile, $E8FFE8);
  143. //Configuración de editor remoto
  144. fcEdRemo.Iniciar('edRemoto', cfgFile);
  145. //Configuraciones del explorador remoto
  146. cfgFile.Asoc_Int('TpoMax2' , @TpoMax2, edTpoMax1 , 10, 1, 180);
  147. cfgFile.Asoc_Bol('MosRut' , @MosRut , chkMosRut , true);
  148. cfgFile.Asoc_Bol('ListDet' , @ListDet, chkListDet, true);
  149. cfgFile.Asoc_Bol('MosOcul' , @MosOcul, chkMosOcul, false);
  150. cfgFile.Asoc_Bol('RefDesp' , @RefDesp, chkRefDesp, true);
  151. //lee parámetros del archivo de configuración.
  152. ReadFromFile;
  153. end;
  154. function TConfig.GetTabFromId(id: string): TTabSheet;
  155. {Retorna una página del PageControl, de acuerdo al ID indicado.}
  156. begin
  157. case id of
  158. '1',
  159. '1.1' : exit(TabGeneral);
  160. '1.2' : exit(TabFilePath);
  161. '2',
  162. '2.1' : exit(TabMacSett);
  163. '2.2' : exit(TabMacEdit);
  164. '3',
  165. '3.1' : exit(TabRemEdEdit);
  166. '4' : exit(TabRemExpl);
  167. else
  168. exit(nil);
  169. end;
  170. end;
  171. procedure TConfig.TreeView1Click(Sender: TObject);
  172. var
  173. id: String;
  174. begin
  175. if TreeView1.Selected = nil then exit;
  176. //hay ítem seleccionado
  177. id := IdFromTTreeNode(TreeView1.Selected);
  178. if GetTabFromId(id) <> nil then GetTabFromId(id).Show;
  179. end;
  180. function TConfig.ActivateControl(ctlRef: TComponent): boolean;
  181. {Intenta seleccionar un control de la ventana de la configuración, a partir de una
  182. referencia "TComponente". Si logra la identifiación, devuelve en:
  183. "ctl" -> El control como un TWinControl.
  184. "tab" -> El contenedor como un TTabSheet.
  185. }
  186. var
  187. pag: TComponent;
  188. tab: TTabSheet;
  189. it: TTreeNode;
  190. id: String;
  191. ctl: TWinControl;
  192. begin
  193. if ctlRef=nil then exit(false);
  194. //Busca al contenedor
  195. pag := ctlRef.GetParentComponent;
  196. if pag.ClassName = 'TTabSheet' then begin
  197. //Lo contiene un TTabSheet. Lo activamos.
  198. tab := TTabSheet(pag);
  199. //tab.Show; Esto activaría la página, pero no actualizaría el TreeView1
  200. //Busca el ítem del árbol que activa esa página
  201. for it in TreeView1.Items do begin
  202. id := IdFromTTreeNode(it); //Obtiene ID
  203. if GetTabFromId(id)=nil then continue;
  204. if GetTabFromId(id) = tab then begin
  205. //Encontramos el id que selecciona al "tab2.
  206. it.Selected := true; //Selecciona en el TreeView1
  207. TreeView1Click(self); //Activa el "tab".
  208. //Intenta seleccionar al control
  209. if ctlRef is TWinControl then begin
  210. ctl := TWinControl(ctlRef);
  211. if (it.Visible=true) and (ctl.Visible = true) and ctl.CanFocus then begin
  212. ctl.SetFocus;
  213. end;
  214. end;
  215. exit(true); //Se ubicó
  216. end;
  217. end;
  218. //No se encontró al ítem que selecciona a este "tab".
  219. exit(false);
  220. end else begin
  221. //No se conoce al contenedor
  222. exit(false);
  223. end;
  224. end;
  225. procedure TConfig.bitAceptarClick(Sender: TObject);
  226. begin
  227. bitAplicarClick(Self);
  228. if cfgFile.MsjErr<>'' then exit; //hubo error
  229. self.Close; //porque es modal
  230. end;
  231. procedure TConfig.bitAplicarClick(Sender: TObject);
  232. begin
  233. if not cfgFile.WindowToProperties then begin
  234. //Se produjo un error
  235. //Trata de seleccionar al control con error.
  236. ActivateControl(cfgFile.ctlErr.ctlRef);
  237. MsgErr(cfgFile.MsjErr);
  238. exit;
  239. end;
  240. //Valida las rutas leidas
  241. if not DirectoryExists(foldTemp) then begin
  242. MsgExc('Folder not found: %s',[foldTemp]);
  243. foldTemp := patTemp;
  244. end;
  245. if not DirectoryExists(foldMacros) then begin
  246. MsgExc('Folder not found: %s', [foldMacros]);
  247. foldMacros := patMacros;
  248. end;
  249. if not DirectoryExists(foldLenguajes) then begin
  250. MsgExc('Folder not found: %s', [foldLenguajes]);
  251. foldLenguajes := patSyntax;
  252. end;
  253. if OnPropertiesChanged<>nil then OnPropertiesChanged();
  254. SaveToFile; //Guarda propiedades en disco
  255. end;
  256. procedure TConfig.bitCancelClick(Sender: TObject);
  257. begin
  258. self.Hide;
  259. end;
  260. procedure TConfig.Configurar(Id: string='');
  261. //Muestra el formulario, de modo que permita configurar la sesión actual
  262. var
  263. it: TTreeNode;
  264. begin
  265. if Id<> '' then begin /////se pide mostrar un Id en especial
  266. //oculta los demás
  267. it := TTreeNodeFromId(Id,TreeView1);
  268. if it <> nil then it.Selected:=true;
  269. TreeView1Click(self);
  270. end else begin ////////muestra todos
  271. for it in TreeView1.Items do begin
  272. it.Visible:=true;
  273. end;
  274. end;
  275. Showmodal;
  276. end;
  277. procedure TConfig.MostEnVentana;
  278. //Muestra las propiedades en la ventana de configuración.
  279. begin
  280. if not cfgFile.PropertiesToWindow then begin
  281. MsgErr(cfgFile.MsjErr);
  282. end;
  283. end;
  284. procedure TConfig.ReadFromFile(iniFile: string = '');
  285. begin
  286. if not cfgFile.FileToProperties then begin
  287. MsgErr(cfgFile.MsjErr);
  288. end;
  289. if OnPropertiesChanged<>nil then OnPropertiesChanged();
  290. end;
  291. procedure TConfig.SaveToFile(iniFile: string='');
  292. //Escribe el archivo de configuración
  293. begin
  294. if not cfgFile.PropertiesToFile then begin
  295. MsgErr(cfgFile.MsjErr);
  296. end;
  297. end;
  298. end.