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,
12   Globales, MiConfigXML, MiConfigBasic, SynEditMarkupHighAll, SynEditMarkup;
13 type
14 
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     chkAutoindent: TCheckBox;
25     chkVerPanVer: TCheckBox;
26     chkHighCurLin: TCheckBox;
27     cbutLinAct: TColorButton;
28     chkVerNumLin: TCheckBox;
29     chkVerMarPle: TCheckBox;
30     cbutBackCol: TColorButton;
31     cbutTextCol: TColorButton;
32     GroupBox1: TGroupBox;
33     GroupBox2: TGroupBox;
34     Label1: TLabel;
35     Label10: TLabel;
36     Label11: TLabel;
37     Label12: TLabel;
38     Label2: TLabel;
39     Label3: TLabel;
40     Label8: TLabel;
41     Label9: TLabel;
42     procedure chkHighCurLinChange(Sender: TObject);
43     procedure chkHighCurWordChange(Sender: TObject);
44     procedure chkVerPanVerChange(Sender: TObject);
45   public
46     //configuración del editor
47     MarLinAct  : boolean;   //marcar línea actual
48     Autoindent : boolean;   //Autotabulación
49     ResPalAct  : boolean;   //resaltar palabra actual
50     ResPalCFon : TColor;    //color de fondo de la palabra actual
51     ResPalCTxt : TColor;    //color de texto de la palabra actual
52     ResPalCBor : TColor;    //color de borde de la palabra actual
53     ResPalFWord: Boolean;    //Activa "palabra completa"
54 
55     cTxtNor    : TColor;    //color de texto normal
56     cFonEdi    : TColor;    //Color de fondo del control de edición
57     cFonSel    : TColor;    //color del fondo de la selección
58     cTxtSel    : TColor;    //color del texto de la selección
59     cLinAct    : TColor;    //color de la línea actual
60     //panel vertical
61     VerPanVer  : boolean;    //ver pánel vertical
62     VerNumLin  : boolean;    //ver número de línea
63     VerMarPle  : boolean;    //ver marcas de plegado
64     cFonPan     : TColor;    //color de fondo del panel vertical
65     cTxtPan     : TColor;    //color de texto del panel vertical
66     ArcRecientes: TStringList;  //Lista de archivos recientes
67 
68     procedure PropToWindow;
69     procedure Iniciar(section: string; cfgFile: TMiConfigXML); //Inicia el frame
70     procedure ConfigEditor(ed: TSynEdit);
71     procedure SetLanguage;
72   public
73     //genera constructor y destructor
74     constructor Create(AOwner: TComponent) ; override;
75     destructor Destroy; override;
76   end;
77 
78 implementation
79 {$R *.lfm}
80 //const
81 //  MAX_ARC_REC = 5;  //si se cambia, actualizar ActualMenusReciente()
82 
83 { TfraCfgSynEdit }
84 procedure TfraCfgSynEdit.SetLanguage;
85 //Rutina de traducción
86 begin
87    {$I ..\language\tra_CfgSynEdit.pas}
88 end;
89 procedure TfraCfgSynEdit.Iniciar(section: string; cfgFile: TMiConfigXML);
90 var
91   s: TParElem;
92 begin
93   //Asigna referencia necesarias
94   //crea las relaciones variable-control
95   s:=cfgFile.Asoc_TCol(section+ '/cTxtNor', @cTxtNor, cbutTextCol, clBlack);
96   s.categ := 1;   //marca como propiedad de tipo "Tema"
97   s:=cfgFile.Asoc_TCol(section+ '/cFonEdi', @cFonEdi, cbutBackCol,  clWhite);
98   s.categ := 1;   //marca como propiedad de tipo "Tema"
99   s:=cfgFile.Asoc_TCol(section+ '/cLinAct', @cLinAct, cbutLinAct, clYellow);
100   s.categ := 1;   //marca como propiedad de tipo "Tema"
101 
102   s:=cfgFile.Asoc_Bol(section+ '/Autoindent', @Autoindent, chkAutoindent, true);
103   s:=cfgFile.Asoc_Bol(section+ '/MarLinAct' , @MarLinAct , chkHighCurLin , false);
104 
105   s:=cfgFile.Asoc_Bol(section+ '/ResPalCur' , @ResPalAct , chkHighCurWord , true);
106   s.categ := 1;
107   s:=cfgFile.Asoc_TCol(section+ '/ResPalCFon',@ResPalCFon, cbutResPalCFon, clSkyBlue);
108   s.categ := 1;
109   s:=cfgFile.Asoc_TCol(section+ '/ResPalCTxt',@ResPalCTxt, cbutResPalCTxt, clBlack);
110   s.categ := 1;
111   s:=cfgFile.Asoc_TCol(section+ '/ResPalCBor',@ResPalCBor, cbutResPalCBor, clSkyBlue);
112   s.categ := 1;
113   s:=cfgFile.Asoc_Bol(section+ '/ResPalFWord',@ResPalFWord, chkFullWord, false);
114 
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 
123   cfgFile.Asoc_StrList(section+ '/recient', @ArcRecientes);
124 end;
125 procedure TfraCfgSynEdit.chkVerPanVerChange(Sender: TObject);
126 begin
127   chkVerNumLin.Enabled:=chkVerPanVer.Checked;
128   chkVerMarPle.Enabled:=chkVerPanVer.Checked;
129   cbutFonPan.Enabled:=chkVerPanVer.Checked;
130   cbutTxtPan.Enabled:=chkVerPanVer.Checked;
131   label2.Enabled:=chkVerPanVer.Checked;
132   label3.Enabled:=chkVerPanVer.Checked;
133 end;
134 procedure TfraCfgSynEdit.chkHighCurLinChange(Sender: TObject);
135 begin
136   label1.Enabled:=chkHighCurLin.Checked;
137   cbutLinAct.Enabled:=chkHighCurLin.Checked;
138 end;
139 procedure TfraCfgSynEdit.chkHighCurWordChange(Sender: TObject);
140 begin
141   label10.Enabled:=chkHighCurWord.Checked;
142   cbutResPalCFon.Enabled:=chkHighCurWord.Checked;
143 end;
144 procedure TfraCfgSynEdit.PropToWindow;
145 begin
146    inherited;
147    chkHighCurLinChange(self);  //para actualizar
148    chkVerPanVerChange(self);  //para actualizar
149 end;
150 constructor TfraCfgSynEdit.Create(AOwner: TComponent);
151 begin
152   inherited Create(AOwner);
153   ArcRecientes := TStringList.Create;  //crea lista
154 end;
155 destructor TfraCfgSynEdit.Destroy;
156 begin
157   FreeAndNil(ArcRecientes);
158   inherited Destroy;
159 end;
160 procedure TfraCfgSynEdit.ConfigEditor(ed: TSynEdit);
161 {Configura el editor con las propiedades almacenadas}
162 var
163   marc: TSynEditMarkup;
164 begin
165    if ed = nil then exit;  //protección
166 
167    ed.Font.Color:=cTxtNor;      //color de texto normal
168    ed.Color:=cFonEdi;           //color de fondo
169    if MarLinAct then          //resaltado de línea actual
170      ed.LineHighlightColor.Background:=cLinAct
171    else
172      ed.LineHighlightColor.Background:=clNone;
173    //configura panel vertical
174    ed.Gutter.Visible:=VerPanVer;  //muestra panel vertical
175    ed.Gutter.Parts[1].Visible:=VerNumLin;  //Número de línea
176    if ed.Gutter.Parts.Count>4 then
177      ed.Gutter.Parts[4].Visible:=VerMarPle;  //marcas de plegado
178    ed.Gutter.Color:=cFonPan;   //color de fondo del panel
179    ed.Gutter.Parts[1].MarkupInfo.Background:=cFonPan; //fondo del núemro de línea
180    ed.Gutter.Parts[1].MarkupInfo.Foreground:=cTxtPan; //texto del núemro de línea
181 
182    ////////Configura el resaltado de la palabra actual //////////
183    marc := ed.MarkupByClass[TSynEditMarkupHighlightAllCaret];
184    if marc<>nil then begin  //hay marcador
185       marc.Enabled:=ResPalAct;  //configura
186       marc.MarkupInfo.Background := ResPalCFon;
187       marc.MarkupInfo.FrameColor := ResPalCBor;
188       marc.MarkupInfo.Foreground := ResPalCTxt;
189       TSynEditMarkupHighlightAllCaret(marc).FullWord := ResPalFWord;
190    end;
191    ///////fija color de delimitadores () {} [] ///////////
192    ed.BracketMatchColor.Foreground := clRed;
193    //Opciones
194    if Autoindent then begin
195      ed.Options := ed.Options + [eoAutoIndent];
196    end else begin
197      ed.Options := ed.Options - [eoAutoIndent];
198    end;
199 end;
200 
201 end.
202 
203