FrameCfgSynEdit.pas 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. {Unidad con frame para almacenar y configurar las propiedades de un editor
  2. SynEdit. Las propiedades que se manejan son con respecto al coloreado.
  3. El frame definido, está pensado para usarse en una ventana de configuración.
  4. También incluye una lista para almacenamiento de los archivos recientes
  5. Por Tito Hinostroza 23/11/2013
  6. }
  7. unit FrameCfgSynEdit;
  8. {$mode objfpc}{$H+}
  9. interface
  10. uses
  11. Classes, SysUtils, Forms, StdCtrls, Dialogs, SynEdit, Graphics, Spin, LCLType,
  12. Globales, MiConfigXML, MiConfigBasic, SynEditMarkupHighAll, SynEditMarkup,
  13. SynPluginSyncroEdit, SynPluginMultiCaret;
  14. type
  15. { TfraCfgSynEdit }
  16. TfraCfgSynEdit = class(TFrame)
  17. cbutFonPan: TColorButton;
  18. cbutResPalCFon: TColorButton;
  19. cbutResPalCTxt: TColorButton;
  20. cbutResPalCBor: TColorButton;
  21. cbutTxtPan: TColorButton;
  22. chkFullWord: TCheckBox;
  23. chkHighCurWord: TCheckBox;
  24. chkVerBarDesH: TCheckBox;
  25. chkVerBarDesV: TCheckBox;
  26. chkVerPanVer: TCheckBox;
  27. chkHighCurLin: TCheckBox;
  28. cbutLinAct: TColorButton;
  29. chkVerNumLin: TCheckBox;
  30. chkVerMarPle: TCheckBox;
  31. cbutBackCol: TColorButton;
  32. cbutTextCol: TColorButton;
  33. cmbTipoLetra: TComboBox;
  34. GroupBox1: TGroupBox;
  35. GroupBox2: TGroupBox;
  36. Label1: TLabel;
  37. Label10: TLabel;
  38. Label11: TLabel;
  39. Label12: TLabel;
  40. Label2: TLabel;
  41. Label3: TLabel;
  42. Label6: TLabel;
  43. Label7: TLabel;
  44. Label8: TLabel;
  45. Label9: TLabel;
  46. spTam: TSpinEdit;
  47. procedure chkHighCurLinChange(Sender: TObject);
  48. procedure chkHighCurWordChange(Sender: TObject);
  49. procedure chkVerPanVerChange(Sender: TObject);
  50. public
  51. //Configuración del editor
  52. TipLet : string; //Tipo de letra
  53. TamLet : integer; //Tamaño de letra
  54. showVertSB : boolean; //Mostrar barra de desplazamiento vertical.
  55. showHoriSB : boolean; //Mostrar barra de desplazamiento horizontal.
  56. MarLinAct : boolean; //marcar línea actual
  57. Autoindent : boolean; //Autotabulación
  58. ResPalAct : boolean; //Resaltar palabra actual
  59. ResPalCFon : TColor; //Color de fondo de la palabra actual
  60. ResPalCTxt : TColor; //Color de texto de la palabra actual
  61. ResPalCBor : TColor; //Color de borde de la palabra actual
  62. ResPalFWord: Boolean; //Activa "palabra completa"
  63. cTxtNor : TColor; //color de texto normal
  64. cFonEdi : TColor; //Color de fondo del control de edición
  65. cFonSel : TColor; //color del fondo de la selección
  66. cTxtSel : TColor; //color del texto de la selección
  67. cLinAct : TColor; //color de la línea actual
  68. //Panel vertical
  69. VerPanVer : boolean; //ver pánel vertical
  70. VerNumLin : boolean; //ver número de línea
  71. VerMarPle : boolean; //ver marcas de plegado
  72. cFonPan : TColor; //color de fondo del panel vertical
  73. cTxtPan : TColor; //color de texto del panel vertical
  74. ArcRecientes: TStringList; //Lista de archivos recientes
  75. procedure PropToWindow;
  76. procedure Iniciar(section: string; cfgFile: TMiConfigXML; colFonDef: TColor =
  77. clWhite); //Inicia el frame
  78. procedure ConfigEditor(ed: TSynEdit);
  79. public
  80. //Genera constructor y destructor
  81. constructor Create(AOwner: TComponent) ; override;
  82. destructor Destroy; override;
  83. end;
  84. implementation
  85. {$R *.lfm}
  86. //const
  87. // MAX_ARC_REC = 5; //si se cambia, actualizar ActualMenusReciente()
  88. procedure TfraCfgSynEdit.Iniciar(section: string; cfgFile: TMiConfigXML;
  89. colFonDef: TColor = clWhite);
  90. var
  91. s: TParElem;
  92. begin
  93. //Asigna referencia necesarias
  94. //Crea las relaciones variable-control
  95. s:=cfgFile.Asoc_Str(section+ '/TipLet' , @TipLet, cmbTipoLetra, 'Courier New');
  96. s:=cfgFile.Asoc_Int(section+ '/TamLet' , @TamLet, spTam, 10);
  97. s:=cfgFile.Asoc_Bol(section+ '/showVertSB', @showVertSB, chkVerBarDesV, true);
  98. s:=cfgFile.Asoc_Bol(section+ '/showHoriSB', @showHoriSB, chkVerBarDesH, true);
  99. s:=cfgFile.Asoc_TCol(section+ '/cTxtNor', @cTxtNor, cbutTextCol, clBlack);
  100. s.categ := 1; //marca como propiedad de tipo "Tema"
  101. s:=cfgFile.Asoc_TCol(section+ '/cFonEdi', @cFonEdi, cbutBackCol, colFonDef);
  102. s.categ := 1; //marca como propiedad de tipo "Tema"
  103. s:=cfgFile.Asoc_TCol(section+ '/cLinAct', @cLinAct, cbutLinAct, clYellow);
  104. s.categ := 1; //marca como propiedad de tipo "Tema"
  105. s:=cfgFile.Asoc_Bol(section+ '/MarLinAct' , @MarLinAct , chkHighCurLin , false);
  106. s:=cfgFile.Asoc_Bol(section+ '/ResPalCur' , @ResPalAct , chkHighCurWord , true);
  107. s.categ := 1;
  108. s:=cfgFile.Asoc_TCol(section+ '/ResPalCFon',@ResPalCFon, cbutResPalCFon, clSkyBlue);
  109. s.categ := 1;
  110. s:=cfgFile.Asoc_TCol(section+ '/ResPalCTxt',@ResPalCTxt, cbutResPalCTxt, clBlack);
  111. s.categ := 1;
  112. s:=cfgFile.Asoc_TCol(section+ '/ResPalCBor',@ResPalCBor, cbutResPalCBor, clSkyBlue);
  113. s.categ := 1;
  114. s:=cfgFile.Asoc_Bol(section+ '/ResPalFWord',@ResPalFWord, chkFullWord, false);
  115. s:=cfgFile.Asoc_Bol(section+ '/VerPanVer', @VerPanVer, chkVerPanVer, true);
  116. s:=cfgFile.Asoc_Bol(section+ '/VerNumLin', @VerNumLin, chkVerNumLin, false);
  117. s:=cfgFile.Asoc_Bol(section+ '/VerMarPle', @VerMarPle, chkVerMarPle, true);
  118. s:=cfgFile.Asoc_TCol(section+ '/cFonPan' , @cFonPan , cbutFonPan , clWhite);
  119. s.categ := 1; //marca como propiedad de tipo "Tema"
  120. s:=cfgFile.Asoc_TCol(section+ '/cTxtPan' , @cTxtPan , cbutTxtPan , clBlack);
  121. s.categ := 1; //marca como propiedad de tipo "Tema"
  122. cfgFile.Asoc_StrList(section+ '/recient', @ArcRecientes);
  123. end;
  124. procedure TfraCfgSynEdit.chkVerPanVerChange(Sender: TObject);
  125. begin
  126. chkVerNumLin.Enabled:=chkVerPanVer.Checked;
  127. chkVerMarPle.Enabled:=chkVerPanVer.Checked;
  128. cbutFonPan.Enabled:=chkVerPanVer.Checked;
  129. cbutTxtPan.Enabled:=chkVerPanVer.Checked;
  130. label2.Enabled:=chkVerPanVer.Checked;
  131. label3.Enabled:=chkVerPanVer.Checked;
  132. end;
  133. procedure TfraCfgSynEdit.chkHighCurLinChange(Sender: TObject);
  134. begin
  135. label1.Enabled:=chkHighCurLin.Checked;
  136. cbutLinAct.Enabled:=chkHighCurLin.Checked;
  137. end;
  138. procedure TfraCfgSynEdit.chkHighCurWordChange(Sender: TObject);
  139. begin
  140. label10.Enabled:=chkHighCurWord.Checked;
  141. cbutResPalCFon.Enabled:=chkHighCurWord.Checked;
  142. end;
  143. procedure TfraCfgSynEdit.PropToWindow;
  144. begin
  145. inherited;
  146. chkHighCurLinChange(self); //para actualizar
  147. chkVerPanVerChange(self); //para actualizar
  148. end;
  149. constructor TfraCfgSynEdit.Create(AOwner: TComponent);
  150. begin
  151. inherited Create(AOwner);
  152. ArcRecientes := TStringList.Create; //crea lista
  153. cmbTipoLetra.Items.Clear;
  154. cmbTipoLetra.Items.Add('Courier New');
  155. cmbTipoLetra.Items.Add('Fixedsys');
  156. cmbTipoLetra.Items.Add('Lucida Console');
  157. cmbTipoLetra.Items.Add('Consolas');
  158. cmbTipoLetra.Items.Add('Cambria');
  159. end;
  160. destructor TfraCfgSynEdit.Destroy;
  161. begin
  162. FreeAndNil(ArcRecientes);
  163. inherited Destroy;
  164. end;
  165. procedure TfraCfgSynEdit.ConfigEditor(ed: TSynEdit);
  166. {Configura el editor con las propiedades almacenadas}
  167. var
  168. marc: TSynEditMarkup;
  169. fSynchro: TSynPluginSyncroEdit;
  170. fMultiCaret: TSynPluginMultiCaret;
  171. begin
  172. if ed = nil then exit; //protección
  173. //Tipo de texto
  174. if TipLet <> '' then ed.Font.Name:=TipLet;
  175. if (TamLet > 6) and (TamLet < 32) then ed.Font.Size:=Round(TamLet);
  176. //Colores
  177. ed.Font.Color:=cTxtNor; //color de texto normal
  178. ed.Color:=cFonEdi; //color de fondo
  179. //Resaltado de línea actual
  180. if MarLinAct then
  181. ed.LineHighlightColor.Background:=cLinAct
  182. else
  183. ed.LineHighlightColor.Background:=clNone;
  184. //Configura panel vertical
  185. ed.Gutter.Visible:=VerPanVer; //muestra panel vertical
  186. ed.Gutter.Parts[1].Visible:=VerNumLin; //Número de línea
  187. if ed.Gutter.Parts.Count>4 then
  188. ed.Gutter.Parts[4].Visible:=VerMarPle; //marcas de plegado
  189. ed.Gutter.Color:=cFonPan; //color de fondo del panel
  190. ed.Gutter.Parts[1].MarkupInfo.Background:=cFonPan; //fondo del núemro de línea
  191. ed.Gutter.Parts[1].MarkupInfo.Foreground:=cTxtPan; //texto del núemro de línea
  192. if showVertSB and showHoriSB then //barras de desplazamiento
  193. ed.ScrollBars:= ssBoth
  194. else if showVertSB and not showHoriSB then
  195. ed.ScrollBars:= ssVertical
  196. else if not showVertSB and showHoriSB then
  197. ed.ScrollBars:= ssHorizontal
  198. else
  199. ed.ScrollBars := ssNone;
  200. ////////Configura el resaltado de la palabra actual //////////
  201. marc := ed.MarkupByClass[TSynEditMarkupHighlightAllCaret];
  202. if marc<>nil then begin //hay marcador
  203. marc.Enabled:=ResPalAct; //configura
  204. marc.MarkupInfo.Background := ResPalCFon;
  205. marc.MarkupInfo.FrameColor := ResPalCBor;
  206. marc.MarkupInfo.Foreground := ResPalCTxt;
  207. TSynEditMarkupHighlightAllCaret(marc).FullWord := ResPalFWord;
  208. end;
  209. ///////fija color de delimitadores () {} [] ///////////
  210. ed.BracketMatchColor.Foreground := clRed;
  211. //Crea un "plugin" de edición síncrona
  212. fSynchro := TSynPluginSyncroEdit.Create(self);
  213. fSynchro.Editor := ed;
  214. //Configura múltiples cursores
  215. fMultiCaret := TSynPluginMultiCaret.Create(self);
  216. with fMultiCaret do begin
  217. Editor := ed;
  218. with KeyStrokes do begin
  219. Add.Command := ecPluginMultiCaretSetCaret;
  220. Add.Key := VK_INSERT;
  221. Add.Shift := [ssShift, ssCtrl];
  222. Add.ShiftMask := [ssShift,ssCtrl,ssAlt];
  223. // Add.Command := ecPluginMultiCaretUnsetCaret;
  224. // Add.Key := VK_DELETE;
  225. // Add.Shift := [ssShift, ssCtrl];
  226. // Add.ShiftMask := [ssShift,ssCtrl,ssAlt];
  227. end;
  228. end;
  229. end;
  230. end.