Skip to content

Commit cb3d109

Browse files
committed
fix(theme): central ActiveStyleServices provider for shared UI files
3 weitere Stellen verwendeten die VCL-globale Vcl.Themes.StyleServices und ignorierten damit das IDE-Theme bei VCL/IDE-Style-Mismatch: * uIDETheme.RebuildCache: FrameBg/FrameFg-Cache hatte falsche Werte * uIDEStatsTiles.TTilePanel.Paint: Tile-Border-Pen im VCL-Style * uIDEHelpPanel.ShowFinding/Placeholder: Hint-Header-Background falsch Fix: zentraler Hook in uAnalyserTheme.pas: var StyleServicesProvider: TStyleServicesProvider = nil; function ActiveStyleServices: TCustomStyleServices; IDE-Plugin's RegisterAnalyserDockableForm setzt den Provider auf eine Closure die IOTAIDEThemingServices.StyleServices liefert. Standalone laesst's nil, ActiveStyleServices faellt auf Vcl.Themes.StyleServices zurueck. Damit folgen alle shared UI-Komponenten (SeverityBg, TilePanel.Paint, HelpDescLabel.Color) automatisch dem IDE-Theme im Plugin-Kontext und dem VCL-Style im Standalone-Kontext — ohne dass jeder Caller den Service-Lookup selbst machen muss. uIDETheme.RebuildCache holt Theming.StyleServices direkt (ist eh IDE- only), kein Umweg ueber den Provider noetig.
1 parent 18f6ff8 commit cb3d109

5 files changed

Lines changed: 65 additions & 9 deletions

File tree

StaticCodeAnalyserForm/sources/UI/uAnalyserTheme.pas

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,25 @@
1515
interface
1616

1717
uses
18+
System.SysUtils,
1819
Vcl.Graphics, Vcl.Themes,
1920
uAnalyserTypes;
2021

22+
type
23+
TStyleServicesProvider = reference to function: TCustomStyleServices;
24+
25+
var
26+
// Global Hook fuer Color-Auflösung. IDE-Plugin setzt das auf eine
27+
// Funktion die IOTAIDEThemingServices.StyleServices liefert.
28+
// Standalone laesst's nil — ActiveStyleServices faellt dann auf die
29+
// VCL-globale Vcl.Themes.StyleServices zurueck.
30+
StyleServicesProvider: TStyleServicesProvider = nil;
31+
32+
// Liefert die aktive TCustomStyleServices. Im IDE-Plugin-Kontext via
33+
// StyleServicesProvider die IDE-spezifische (folgt IDE-Theme).
34+
// Sonst die VCL-globale (folgt TStyleManager.ActiveStyle).
35+
function ActiveStyleServices: TCustomStyleServices;
36+
2137
// Saturierte Akzentfarbe fuer eine Severity. Wird verwendet:
2238
// * 3px-Indikatorleiste am linken Zellenrand
2339
// * Akzent-Schriftfarben fuer "Vorher"/"Nachher"-Labels
@@ -48,6 +64,15 @@ implementation
4864
Winapi.Windows,
4965
uAnalyserPalette;
5066

67+
function ActiveStyleServices: TCustomStyleServices;
68+
begin
69+
Result := nil;
70+
if Assigned(StyleServicesProvider) then
71+
Result := StyleServicesProvider();
72+
if not Assigned(Result) then
73+
Result := Vcl.Themes.StyleServices;
74+
end;
75+
5176
function SeverityAccent(Severity: TFindingSeverity): TColor;
5277
begin
5378
case Severity of
@@ -81,7 +106,10 @@ function BlendColor(Base, Accent: TColor; Ratio: Single): TColor;
81106
function SeverityBg(Severity: TFindingSeverity;
82107
ABase: TColor): TColor;
83108
begin
84-
Result := SeverityBg(Severity, ABase, StyleServices);
109+
// Default-Pfad: via ActiveStyleServices — im IDE-Plugin liefert das die
110+
// IDE-StyleServices via StyleServicesProvider, im Standalone die VCL-
111+
// globale.
112+
Result := SeverityBg(Severity, ABase, ActiveStyleServices);
85113
end;
86114

87115
function SeverityBg(Severity: TFindingSeverity;

StaticCodeAnalyserForm/sources/UI/uIDEHelpPanel.pas

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ procedure TFindingHintPanel.ApplyLayout;
314314
procedure TFindingHintPanel.ShowPlaceholder;
315315
begin
316316
FHelpDescLabel.Caption := ' ' + _('Select a row to see the fix hint');
317-
FHelpDescLabel.Color := StyleServices.GetSystemColor(IDE_BG_CHROME);
317+
FHelpDescLabel.Color := ActiveStyleServices.GetSystemColor(IDE_BG_CHROME);
318318
FHelpBefore.Lines.Text := '';
319319
FHelpAfter.Lines.Text := '';
320320
end;
@@ -324,7 +324,7 @@ procedure TFindingHintPanel.ShowFinding(F: TLeakFinding);
324324
Hint : TFixHint;
325325
ColorDefault : TColor;
326326
begin
327-
ColorDefault := StyleServices.GetSystemColor(IDE_BG_CHROME);
327+
ColorDefault := ActiveStyleServices.GetSystemColor(IDE_BG_CHROME);
328328

329329
if not Assigned(F) then
330330
begin

StaticCodeAnalyserForm/sources/UI/uIDEStatsTiles.pas

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ TEntry = record
150150
implementation
151151

152152
uses
153-
Winapi.Windows, uAnalyserPalette, uIDEColors, uLocalization;
153+
Winapi.Windows, uAnalyserPalette, uAnalyserTheme, uIDEColors, uLocalization;
154154

155155
type
156156
// Access-Class zum Lesen/Schreiben von TControl.OnResize (protected).
@@ -236,8 +236,10 @@ procedure TTilePanel.Paint;
236236
Canvas.Brush.Style := bsClear;
237237
// BorderColor ist ein System-Color-Index (z. B. cl3DDkShadow). Canvas.Pen
238238
// resolved nur ueber GetSysColor (Windows nativ), nicht ueber den aktiven
239-
// VCL-Style. Daher hier explizit ueber StyleServices aufloesen.
240-
Canvas.Pen.Color := StyleServices.GetSystemColor(FBorderColor);
239+
// Style. ActiveStyleServices liefert die IDE-StyleServices im Plugin-
240+
// Kontext, sonst die VCL-globale — damit folgt der Border-Pen dem
241+
// gleichen Theme wie der Rest des Plugins.
242+
Canvas.Pen.Color := ActiveStyleServices.GetSystemColor(FBorderColor);
241243
Canvas.Pen.Width := 1;
242244
Canvas.Rectangle(ClientRect);
243245
end;

StaticCodeAnalyserIDE/uIDEAnalyserForm.pas

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3785,6 +3785,21 @@ procedure RegisterAnalyserDockableForm;
37853785
// und der nachfolgende Unregister-Pfad doppel-frees riskieren.
37863786
if not Supports(BorlandIDEServices, INTAServices, NTASvc) then Exit;
37873787

3788+
// Globaler Hook: ActiveStyleServices liefert ab jetzt die IDE-Theme-
3789+
// StyleServices statt der VCL-globalen. Damit folgen alle shared UI-
3790+
// Komponenten (uAnalyserTheme.SeverityBg, uIDEStatsTiles.TTilePanel.
3791+
// Paint, uIDEHelpPanel) dem IDE-Theme - kritisch wenn der User einen
3792+
// anderen VCL-Style aktiv hat als das IDE-Theme.
3793+
uAnalyserTheme.StyleServicesProvider :=
3794+
function: TCustomStyleServices
3795+
var
3796+
Theming: IOTAIDEThemingServices;
3797+
begin
3798+
Result := nil;
3799+
if Supports(BorlandIDEServices, IOTAIDEThemingServices, Theming) then
3800+
Result := Theming.StyleServices;
3801+
end;
3802+
37883803
GDockableForm := TAnalyserDockableForm.Create;
37893804

37903805
// Dockable Form registrieren (fuer Desktop-State-Persistenz)

StaticCodeAnalyserIDE/uIDETheme.pas

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -263,10 +263,21 @@ procedure TIDEThemeImpl.EnsureNotifier;
263263

264264
procedure TIDEThemeImpl.RebuildCache;
265265
var
266-
Svc : INTACodeEditorServices;
266+
Svc : INTACodeEditorServices;
267+
Theming : IOTAIDEThemingServices;
268+
Styles : TCustomStyleServices;
267269
begin
268-
FFrameBg := StyleServices.GetSystemColor(clWindow);
269-
FFrameFg := StyleServices.GetSystemColor(clWindowText);
270+
// IDE-StyleServices verwenden (folgt IDE-Theme), nicht VCL-globale —
271+
// die kann von TStyleManager.ActiveStyle abweichen wenn der User
272+
// einen anderen VCL-Style als das IDE-Theme aktiv hat.
273+
Styles := nil;
274+
if Supports(BorlandIDEServices, IOTAIDEThemingServices, Theming) then
275+
Styles := Theming.StyleServices;
276+
if not Assigned(Styles) then
277+
Styles := Vcl.Themes.StyleServices;
278+
FFrameBg := Styles.GetSystemColor(clWindow);
279+
FFrameFg := Styles.GetSystemColor(clWindowText);
280+
270281
FEditorBg := clNone;
271282
try
272283
if Supports(BorlandIDEServices, INTACodeEditorServices, Svc) then

0 commit comments

Comments
 (0)