1 unit compiler_parsing_options;
2 
3 {$mode objfpc}{$H+}
4 
5 interface
6 
7 uses
8   SysUtils,
9   // LCL
10   ExtCtrls, StdCtrls,
11   // CodeTools
12   LinkScanner,
13   // IdeIntf
14   IDEOptionsIntf, IDEOptEditorIntf,
15   // IDE
16   CompilerOptions, PackageDefs, LazarusIDEStrConsts;
17 
18 type
19 
20   { TCompilerParsingOptionsFrame }
21 
22   TCompilerParsingOptionsFrame = class(TAbstractIDEOptionsEditor)
23     cmbSyntaxMode: TComboBox;
24     grpAsmStyle: TRadioGroup;
25     grpSyntaxMode: TGroupBox;
26     grpSyntaxOptions: TCheckGroup;
27   private
28     FIsPackage: boolean;
29   public
GetTitlenull30     function GetTitle: string; override;
31     procedure Setup({%H-}ADialog: TAbstractOptionsEditorDialog); override;
32     procedure ReadSettings(AOptions: TAbstractIDEOptions); override;
33     procedure WriteSettings(AOptions: TAbstractIDEOptions); override;
SupportedOptionsClassnull34     class function SupportedOptionsClass: TAbstractIDEOptionsClass; override;
35   end;
36 
37 implementation
38 
39 {$R *.lfm}
40 
41 const
42   // CompilerMode names to be shown after -M...
43   CompilerModesPretty: array[TCompilerMode] of shortstring = (
44       'fpc', 'Delphi', 'DelphiUnicode', 'gpc', 'tp', 'ObjFPC', 'MacPas', 'iso',
45       'ExtPas'
46     );
47   // CompilerMode descriptions.
48   CompilerModesDescr: array[TCompilerMode] of shortstring = (
49       'Free Pascal', 'Delphi', 'Delphi Unicode', 'GNU Pascal', 'Turbo Pascal',
50       'Object Pascal', 'Mac Pascal', 'ISO/IEC 7185 Pascal',
51       'Extended Pascal, ISO 10206'
52     );
53 
SyntaxModeToCaptionnull54 function SyntaxModeToCaption(const ModeStr: string): string;
55 var
56   cm: TCompilerMode;
57 begin
58   Result := '';
59   for cm := Low(TCompilerMode) to High(TCompilerMode) do
60     if CompareText(ModeStr, CompilerModeNames[cm]) = 0 then
61     begin
62       if cm = cmOBJFPC then
63         Result := lisObjectPascalDefault  // Is this needed?
64       else
65         Result := CompilerModesDescr[cm];
66       Result := Result + ' (-M' + CompilerModesPretty[cm] + ')';
67       Break;
68     end;
69 end;
70 
CaptionToSyntaxModenull71 function CaptionToSyntaxMode(const Caption: string): string;
72 var
73   cm: TCompilerMode;
74 begin
75   Result := 'ObjFPC';
76   // Some modes would go wrong if iterated forward, thus iterate backwards.
77   for cm := High(TCompilerMode) downto Low(TCompilerMode) do
78     if Pos('-M' + CompilerModesPretty[cm], Caption) > 0 then
79     begin
80       Result := CompilerModesPretty[cm];
81       Break;
82     end;
83 end;
84 
85 { TCompilerParsingOptionsFrame }
86 
TCompilerParsingOptionsFrame.GetTitlenull87 function TCompilerParsingOptionsFrame.GetTitle: string;
88 begin
89   Result := dlgCOParsing;
90 end;
91 
92 procedure TCompilerParsingOptionsFrame.Setup(ADialog: TAbstractOptionsEditorDialog);
93 var
94   m: TCompilerMode;
95   s: string;
96 begin
97   grpSyntaxMode.Caption := lisSyntaxMode + ' (-M, {$MODE})';
98   cmbSyntaxMode.Items.BeginUpdate;
99   cmbSyntaxMode.Items.Clear;
100   for m := Low(TCompilerMode) to High(TCompilerMode) do
101   begin
102     s := SyntaxModeToCaption(CompilerModeNames[m]);
103     if s <> '' then
104       cmbSyntaxMode.Items.Add(s);
105   end;
106   cmbSyntaxMode.Items.EndUpdate;
107 
108   with grpAsmStyle do
109   begin
110     Caption := dlgCOAsmStyle + ' (-R)';
111     Items.BeginUpdate;
112     Items.Clear;
113     Items.Add(lisDefault);
114     Items.Add('Intel');
115     Items.Add('AT&&T');
116     Items.EndUpdate;
117   end;
118 
119   with grpSyntaxOptions do
120   begin
121     AutoSize := True;
122     Caption := dlgSyntaxOptions;
123     Items.BeginUpdate;
124     Items.Add(dlgCOCOps + ' (-Sc, {$COPERATORS ON})');
125     Items.Add(dlgLabelGoto + ' (-Sg, {$GOTO ON})');
126     Items.Add(dlgCppInline + ' (-Si, {$INLINE ON})');
127     Items.Add(dlgCMacro + ' (-Sm, {$MACRO ON})');
128     Items.Add(dlgInitDoneOnly + ' (-Ss)');
129     Items.Add(dlgStaticKeyword + ' (-St)');
130     Items.Add(dlgCOAnsiStr + ' (-Sh, {$H+})');
131     Items.EndUpdate;
132   end;
133 end;
134 
135 procedure TCompilerParsingOptionsFrame.ReadSettings(AOptions: TAbstractIDEOptions);
136 var
137   CurOptions: TBaseCompilerOptions;
138 begin
139   CurOptions := AOptions as TBaseCompilerOptions;
140   FIsPackage := CurOptions is TPkgCompilerOptions;
141   with CurOptions do
142   begin
143     cmbSyntaxMode.Text := SyntaxModeToCaption(SyntaxMode);
144 
145     if (AssemblerStyle in [1,2,3]) then
146       grpAsmStyle.ItemIndex := AssemblerStyle
147     else
148       grpAsmStyle.ItemIndex := 0;
149 
150     with grpSyntaxOptions do
151     begin
152       Checked[0] := CStyleOperators;
153       Checked[1] := AllowLabel;
154       Checked[2] := CPPInline;
155       Checked[3] := CStyleMacros;
156       Checked[4] := InitConstructor;
157       Checked[5] := StaticKeyword;
158       Checked[6] := UseAnsiStrings;
159     end;
160   end;
161 end;
162 
163 procedure TCompilerParsingOptionsFrame.WriteSettings(AOptions: TAbstractIDEOptions);
164 begin
165   with AOptions as TBaseCompilerOptions do
166   begin
167     SyntaxMode := CaptionToSyntaxMode(cmbSyntaxMode.Text);
168 
169     AssemblerStyle := grpAsmStyle.ItemIndex;
170 
171     with grpSyntaxOptions do
172     begin
173       CStyleOperators := Checked[0];
174       AllowLabel := Checked[1];
175       CPPInline := Checked[2];
176       CStyleMacros := Checked[3];
177       InitConstructor := Checked[4];
178       StaticKeyword := Checked[5];
179       UseAnsiStrings := Checked[6];
180     end;
181   end;
182 end;
183 
TCompilerParsingOptionsFrame.SupportedOptionsClassnull184 class function TCompilerParsingOptionsFrame.SupportedOptionsClass: TAbstractIDEOptionsClass;
185 begin
186   Result := TBaseCompilerOptions;
187 end;
188 
189 initialization
190   RegisterIDEOptionsEditor(GroupCompiler, TCompilerParsingOptionsFrame,
191     CompilerOptionsParsing);
192   RegisterIDEOptionsEditor(GroupPkgCompiler, TCompilerParsingOptionsFrame,
193     CompilerOptionsParsing);
194 
195 end.
196 
197