diff --git a/.gitattributes b/.gitattributes
index 8cfbe3b505..16aaf3fcd2 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -2905,6 +2905,8 @@ components/pochecker/Proj/README.txt svneol=native#text/plain
components/pochecker/Proj/pochecker.lpi svneol=native#text/plain
components/pochecker/Proj/pochecker.lpr svneol=native#text/plain
components/pochecker/README.txt svneol=native#text/plain
+components/pochecker/graphstat.lfm svneol=native#text/plain
+components/pochecker/graphstat.pp svneol=native#text/pascal
components/pochecker/languages/pocheckerconsts.cs.po svneol=native#text/plain
components/pochecker/languages/pocheckerconsts.de.po svneol=native#text/plain
components/pochecker/languages/pocheckerconsts.es.po svneol=native#text/plain
diff --git a/components/pochecker/Proj/pochecker.lpi b/components/pochecker/Proj/pochecker.lpi
index e2e025fdf6..7473e4b8db 100644
--- a/components/pochecker/Proj/pochecker.lpi
+++ b/components/pochecker/Proj/pochecker.lpi
@@ -69,7 +69,7 @@
-
+
@@ -85,6 +85,7 @@
+
@@ -104,6 +105,14 @@
+
+
+
+
+
+
+
+
diff --git a/components/pochecker/Proj/pochecker.lpr b/components/pochecker/Proj/pochecker.lpr
index 5c2660e44d..90f2b272fa 100644
--- a/components/pochecker/Proj/pochecker.lpr
+++ b/components/pochecker/Proj/pochecker.lpr
@@ -7,7 +7,8 @@ uses
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset
- Forms, pocheckermain, pofamilies, resultdlg, simplepofiles, pocheckerconsts;
+ Forms, pocheckermain, pofamilies, resultdlg, simplepofiles, pocheckerconsts,
+ graphstat;
{$R *.res}
@@ -15,6 +16,7 @@ begin
RequireDerivedFormResource := True;
Application.Initialize;
Application.CreateForm(TPoCheckerForm, PoCheckerForm);
+ Application.CreateForm(TGraphStatForm, GraphStatForm);
Application.Run;
end.
diff --git a/components/pochecker/graphstat.lfm b/components/pochecker/graphstat.lfm
new file mode 100644
index 0000000000..a89b1f8c05
--- /dev/null
+++ b/components/pochecker/graphstat.lfm
@@ -0,0 +1,24 @@
+object GraphStatForm: TGraphStatForm
+ Left = 652
+ Height = 544
+ Top = 116
+ Width = 636
+ HorzScrollBar.Page = 602
+ HorzScrollBar.Range = 4000
+ HorzScrollBar.Visible = False
+ VertScrollBar.Page = 510
+ VertScrollBar.Range = 4000
+ BorderStyle = bsDialog
+ Caption = 'Graphical summary'
+ ClientHeight = 544
+ ClientWidth = 619
+ OnCreate = FormCreate
+ OnShow = FormShow
+ LCLVersion = '1.3'
+ object Img: TImage
+ Left = 0
+ Height = 4000
+ Top = 0
+ Width = 4000
+ end
+end
diff --git a/components/pochecker/graphstat.pp b/components/pochecker/graphstat.pp
new file mode 100644
index 0000000000..64afb01c1a
--- /dev/null
+++ b/components/pochecker/graphstat.pp
@@ -0,0 +1,254 @@
+unit GraphStat;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
+ PoFamilies, PoCheckerConsts, Math, LCLProc;
+
+type
+
+ { TGraphStatForm }
+
+ TGraphStatForm = class(TForm)
+ Img: TImage;
+ procedure FormCreate(Sender: TObject);
+ procedure FormShow(Sender: TObject);
+ private
+ { private declarations }
+ WidthPerStat: Integer;
+ HeightPerStat: Integer;
+ LegHeight: Integer;
+ SingleLegItemHeight: Integer;
+ FPoFamilyStats: TPoFamilyStats;
+ procedure CalcBoundsRequiredPerStat(out AWidth, AHeight: Integer);
+ procedure PrepareDimensions;
+ procedure DrawGraphs;
+ procedure DrawGraph(AStat: TStat; ARow, ACol: Integer);
+ procedure DrawLegenda;
+ public
+ { public declarations }
+ property PoFamilyStats: TPoFamilyStats read FPoFamilyStats write FPoFamilyStats;
+ end;
+
+var
+ GraphStatForm: TGraphStatForm;
+
+implementation
+
+{$R *.lfm}
+
+const
+ Radius = 30;
+ Cols = 4;
+ clBack = clWhite;
+ clPie = clForm;
+ clTrans = clGreen;
+ clUnTrans = clRed;
+ clFuzzy = clFuchsia;
+ clCircle = clBlack;
+ clTxt = clBlack;
+ LMargin = 10;
+ RMargin = 10;
+ TMargin = 10;
+ BMargin = 10;
+ TxtMargin = 5;
+ LegTMargin = 40;
+ LegBMargin = 10;
+ LegLMargin = LMargin;
+ LegBarHeight = 20;
+ LegBarWidth = 40;
+
+{ TGraphStatForm }
+
+procedure TGraphStatForm.FormShow(Sender: TObject);
+begin
+ PrepareDimensions;
+ DrawGraphs;
+ DrawLegenda;
+end;
+
+procedure TGraphStatForm.FormCreate(Sender: TObject);
+begin
+ Caption := sGrapStatFormCaption;
+end;
+
+procedure TGraphStatForm.CalcBoundsRequiredPerStat(out AWidth, AHeight: Integer);
+var
+ i, TW, TH, MaxTH: Integer;
+ Stat: TStat;
+begin
+ AWidth := 2 * Radius;
+ MaxTH := 0;
+ for i := 0 to FPoFamilyStats.Count - 1 do
+ begin
+ Stat := FPoFamilyStats.Items[i];
+ TW := Img.Canvas.TextWidth(Stat.PoName);
+ TH := Img.Canvas.TextHeight(Stat.PoName);
+ if TW > AWidth then AWidth := TW;
+ if TH > MaxTH then MaxTH := TH;
+ end;
+ //Add margins
+ AWidth := AWidth + LMargin + RMargin; //L+R
+ AHeight := TMargin + 2 * Radius + TxtMargin + MaxTH + BMargin; //Top+distance between text and graph+Bottom
+ //Debugln('TGraphStatForm.CalcBoundsRequiredPerStat: AWidth = ',DbgS(AWidth),' AHeight = ',DbgS(AHeight),' MaxTH = ',DbgS(MaxTH));
+end;
+
+procedure TGraphStatForm.PrepareDimensions;
+var
+ Rows, IHeight: Integer;
+begin
+ CalcBoundsRequiredPerStat(WidthPerStat, HeightPerStat);
+ Img.Width := Cols * WidthPerStat;
+ Rows := Ceil(PoFamilyStats.Count / Cols);
+ IHeight := HeightPerStat * Rows;
+ SingleLegItemHeight := Max(Img.Canvas.TextHeight('qWM'), LegBarHeight);
+ LegHeight := LegTMargin + TxtMargin + (3 * SingleLegItemHeight + TxtMargin) + LegBMargin;
+ IHeight := IHeight + LegHeight;
+
+ ClientWidth := Img.Width;
+ Img.Height := IHeight;
+ Img.Height := IHeight;
+ //DebugLn('TGraphStatForm.FormShow: Img.Width -> ',DbgS(Img.Width), ' Canvas.Width = ',DbgS(Img.Canvas.Width));
+ //DebugLn('TGraphStatForm.FormShow: Img.Height -> ',DbgS(Img.Height),' Canvas.Heigth = ',DbgS(Img.Canvas.Height));
+ ClientHeight := Min(Screen.Height - 50, Img.Height);
+ VertScrollBar.Visible := (ClientHeight < Img.Height);
+ if Top + ClientHeight + 50 > Screen.Height then Top := 0;
+end;
+
+procedure TGraphStatForm.DrawGraphs;
+var
+ Index, ARow, ACol: Integer;
+begin
+ //debugln('TGraphStatForm.DrawGraphs: FPoFamilyStats.Count = ',DbgS(FPoFamilyStats.Count));
+ Img.Canvas.Brush.Color := clBack;
+ Img.Canvas.Clear;
+ Img.Canvas.FillRect(0,0,Img.Width,Img.Height);
+ for Index := 0 to FPoFamilyStats.Count - 1 do
+ begin
+ ARow := Index mod Cols;
+ ACol := Index div Cols;
+ DrawGraph(FPoFamilyStats.Items[Index], ARow, ACol);
+ end;
+end;
+
+procedure TGraphStatForm.DrawGraph(AStat: TStat; ARow, ACol: Integer);
+var
+ X,Y, TW: Integer;
+ Origo: TPoint;
+ OrigoCol, PixCol: TColor;
+begin
+ //debugln('TGraphStatForm.DrawGraph: PoName = ',DbgS(AStat.PoName));
+ Origo.X := (ARow * WidthPerStat) + (WidthPerStat div 2);
+ Origo.Y := (ACol * HeightPerStat) + Radius + TMargin;
+ //debugln('TGraphStatForm.DrawGraph: ARow = ',DbgS(ARow),' ACol = ',DbgS(ACol));
+ //debugln('TGraphStatForm.DrawGraph: Origo.X = ',DbgS(Origo.X),' Origo.Y = ',DbgS(Origo.Y));
+
+ {
+ Img.Canvas.Pen.Color := clCircle;
+ Img.Canvas.Brush.Color := clPie;
+ Img.Canvas.EllipseC(Origo.X,Origo.Y,Radius,Radius);
+ }
+
+ with Img do
+ begin
+ //First draw a circle
+ Canvas.Brush.Color := clPie;
+ Canvas.Pen.Color := clCircle;
+ Canvas.EllipseC(Origo.X,Origo.Y,Radius,Radius);
+
+ //Draw the Translated section
+ Canvas.MoveTo(Origo);
+ Canvas.LineTo(Origo.X + Radius, Origo.Y);
+ Canvas.MoveTo(Origo);
+
+ X := Origo.X + Round(Cos(AStat.FracTranslated * (2 * pi)) * Radius);
+ Y := Origo.Y - Round(Sin(AStat.FracTranslated * (2 * pi)) * Radius);
+ Canvas.LineTo(X, Y);
+ OrigoCol := Canvas.Pixels[Origo.X,Origo.Y];
+ //Calculate a point inside the section
+ X := Origo.X + Round(Cos((AStat.FracTranslated/2) * (2 * pi)) * (Radius - 3));
+ Y := Origo.Y - Round(Sin((AStat.FracTranslated/2) * (2 * pi)) * (Radius - 3));
+ Canvas.Brush.Color := clTrans;
+ PixCol := Canvas.Pixels[X,Y];
+ //Don't FloodFill if the section has no visible pixels on the screen
+ if (PixCol <> OrigoCol) then Canvas.FloodFill(X,Y,PixCol,fsSurface);
+
+
+ //Draw the UnTranslated section
+ Canvas.MoveTo(Origo);
+ X := Origo.X + Round(Cos((AStat.FracTranslated+AStat.FracUnTranslated) * 2 * pi) * Radius);
+ Y := Origo.Y - Round(Sin((AStat.FracTranslated+AStat.FracUnTranslated) * 2 * pi) * Radius);
+ Canvas.LineTo(X, Y);
+ //Calculate a point inside the section
+ X := Origo.X + Round(Cos((AStat.FracTranslated+AStat.FracUnTranslated/2) * (2 * pi)) * (Radius - 3));
+ Y := Origo.Y - Round(Sin((AStat.FracTranslated+AStat.FracUnTranslated/2) * (2 * pi)) * (Radius - 3));
+ Canvas.Brush.Color := clUnTrans;
+ PixCol := Canvas.Pixels[X,Y];
+ //Don't FloodFill if the section has no visible pixels on the screen
+ if (PixCol <> OrigoCol) then Canvas.FloodFill(X,Y,PixCol,fsSurface);
+
+
+ //Draw the Fuzzy section
+ Canvas.MoveTo(Origo);
+ X := Origo.X + Round(Cos((AStat.FracTranslated+AStat.FracUnTranslated+AStat.FracFuzzy) * 2 * pi) * Radius);
+ Y := Origo.Y - Round(Sin((AStat.FracTranslated+AStat.FracUnTranslated+AStat.FracFuzzy) * 2 * pi) * Radius);
+ Canvas.LineTo(X, Y);
+ //Calculate a point inside the section
+ X := Origo.X + Round(Cos((AStat.FracTranslated+AStat.FracUnTranslated+AStat.FracFuzzy/2) * (2 * pi)) * (Radius - 3));
+ Y := Origo.Y - Round(Sin((AStat.FracTranslated+AStat.FracUnTranslated+AStat.FracFuzzy/2) * (2 * pi)) * (Radius - 3));
+ Canvas.Brush.Color := clFuzzy;
+ PixCol := Canvas.Pixels[X,Y];
+ //Don't FloodFill if the section has no visible pixels on the screen
+ if (PixCol <> OrigoCol) then Canvas.FloodFill(X,Y,PixCol,fsSurface);
+ //Draw the text
+ TW := Canvas.TextWidth(AStat.PoName);
+ X := Origo.X - (TW div 2);
+ Y := Origo.Y + Radius + TxtMargin;
+ Canvas.Pen.Color := clTxt;
+ Canvas.Brush.Color := clBack;
+ Canvas.TextOut(X, Y, AStat.PoName);
+ end;
+
+end;
+
+procedure TGraphStatForm.DrawLegenda;
+var
+ X, Y, LegTop, TH: Integer;
+begin
+ LegTop := Img.Height - LegHeight;
+ //Debugln('TGraphStatForm.DrawLegenda: LegTop = ',DbgS(LegTop));
+ with Img do
+ begin
+ TH := Canvas.TextHeight('qWM');
+ X := LegLMargin;
+ Y := LegTop;
+ Canvas.Pen.Color := clTxt;
+ Canvas.MoveTo(LegLMargin, LegTop);
+ Canvas.LineTo(Img.Width - LegLMargin, LegTop);
+ Y := Y + TxtMargin;
+
+ Canvas.Brush.Color := clTrans;
+ Canvas.FillRect(X,Y,X+LegBarWidth,Y+LegBarHeight);
+ Canvas.Brush.Color := clBack;
+ Canvas.TextOut(X + LegBarWidth + TxtMargin, Y + ((LegBarHeight - TH) div 2), 'Translated');
+
+ Y := Y + SingleLegItemHeight + TxtMargin;
+ Canvas.Brush.Color := clUnTrans;
+ Canvas.FillRect(X,Y,X+LegBarWidth,Y+LegBarHeight);
+ Canvas.Brush.Color := clBack;
+ Canvas.TextOut(X + LegBarWidth + TxtMargin, Y + ((LegBarHeight - TH) div 2), 'Untranslated');
+
+
+ Y := Y + SingleLegItemHeight + TxtMargin;
+ Canvas.Brush.Color := clFuzzy;
+ Canvas.FillRect(X,Y,X+LegBarWidth,Y+LegBarHeight);
+ Canvas.Brush.Color := clBack;
+ Canvas.TextOut(X + LegBarWidth + TxtMargin, Y + ((LegBarHeight - TH) div 2), 'Fuzzy');
+ end;
+end;
+
+end.
+
diff --git a/components/pochecker/pocheckerconsts.pas b/components/pochecker/pocheckerconsts.pas
index 017cdb9486..7fe6e35755 100644
--- a/components/pochecker/pocheckerconsts.pas
+++ b/components/pochecker/pocheckerconsts.pas
@@ -31,6 +31,10 @@ resourcestring
sSaveCaption = 'Save to file';
sResults = 'Results';
sCopyCaption = 'Copy to clipboard';
+ sShowStatGraph = 'Show statistics graph';
+
+ //Graphical summary form
+ sGrapStatFormCaption = 'Graphical summary';
//PoFamiles
sOriginal = 'Original';
diff --git a/components/pochecker/pocheckermain.pp b/components/pochecker/pocheckermain.pp
index c46d50f872..f96c4bfbe1 100644
--- a/components/pochecker/pocheckermain.pp
+++ b/components/pochecker/pocheckermain.pp
@@ -373,6 +373,10 @@ begin
try
ResultDlg.Log.Assign(SL);
FreeAndNil(SL); //No need to keep 2 copies of this data
+ if (pttCheckStatistics in TestTypes) then
+ ResultDlg.PoFamilyStats := PoFamily.PoFamilyStats
+ else
+ ResultDlg.PoFamilyStats := nil;
ResultDlg.ShowModal;
finally
ResultDlg.Free;
diff --git a/components/pochecker/pofamilies.pp b/components/pochecker/pofamilies.pp
index 1b7a50481b..38d6062ede 100644
--- a/components/pochecker/pofamilies.pp
+++ b/components/pochecker/pofamilies.pp
@@ -103,15 +103,19 @@ Type
property NrTranslated: Integer read FNrTranslated;
property NrUnTranslated: Integer read FNrUnTranslated;
property NrFuzzy: Integer read FNrFuzzy;
- function PercTranslated: Double;
- function PercUnTranslated: Double;
- function PercFuzzy: Double;
+ function PercTranslated: Double; inline;
+ function PercUnTranslated: Double; inline;
+ function PercFuzzy: Double; inline;
+ function FracTranslated: Double;
+ function FracUnTranslated: Double;
+ function FracFuzzy: Double;
end;
TPoFamilyStats = class
private
FList: TFPObjectList;
function GetCount: Integer;
+ function GetItems(Index: Integer): TStat;
public
procedure Clear;
procedure Add(AName: String; ANrTotal, ANrTranslated, ANrUnTranslated, ANrFuzzy: Integer);
@@ -119,6 +123,7 @@ Type
destructor Destroy; override;
procedure AddStatisticsToLog(ALog: TStrings);
+ property Items[Index: Integer]: TStat read GetItems;
property Count: Integer read GetCount;
end;
@@ -325,17 +330,32 @@ end;
function TStat.PercTranslated: Double;
begin
- Result := 100 * (FNrTranslated / FNrTotal);
+ Result := 100 * FracTranslated;
end;
function TStat.PercUnTranslated: Double;
begin
- Result := 100 * (FNrUnTranslated / FNrTotal);
+ Result := 100 * FracUnTranslated;
end;
function TStat.PercFuzzy: Double;
begin
- Result := 100 * (FNrFuzzy / FNrTotal);
+ Result := 100 * FracFuzzy;
+end;
+
+function TStat.FracTranslated: Double;
+begin
+ Result := (FNrTranslated / FNrTotal);
+end;
+
+function TStat.FracUnTranslated: Double;
+begin
+ Result := (FNrUnTranslated / FNrTotal);
+end;
+
+function TStat.FracFuzzy: Double;
+begin
+ Result := (FNrFuzzy / FNrTotal);
end;
{ TPoFamilyStats }
@@ -345,6 +365,11 @@ begin
Result := FList.Count;
end;
+function TPoFamilyStats.GetItems(Index: Integer): TStat;
+begin
+ Result := TStat(FList.Items[Index]);
+end;
+
procedure TPoFamilyStats.Clear;
begin
FList.Clear;
diff --git a/components/pochecker/resultdlg.lfm b/components/pochecker/resultdlg.lfm
index fbf7886890..bc4db5a075 100644
--- a/components/pochecker/resultdlg.lfm
+++ b/components/pochecker/resultdlg.lfm
@@ -13,7 +13,7 @@ object ResultDlgForm: TResultDlgForm
OnDestroy = FormDestroy
OnKeyDown = FormKeyDown
OnShow = FormShow
- LCLVersion = '0.9.31'
+ LCLVersion = '1.3'
object Panel1: TPanel
Left = 0
Height = 50
@@ -27,10 +27,10 @@ object ResultDlgForm: TResultDlgForm
object CloseBtn: TBitBtn
AnchorSideRight.Control = Panel1
AnchorSideRight.Side = asrBottom
- Left = 643
+ Left = 657
Height = 26
Top = 12
- Width = 89
+ Width = 75
Anchors = [akRight]
AutoSize = True
BorderSpacing.Right = 10
@@ -41,10 +41,10 @@ object ResultDlgForm: TResultDlgForm
end
object SaveBtn: TBitBtn
AnchorSideRight.Control = CloseBtn
- Left = 534
+ Left = 544
Height = 26
Top = 12
- Width = 99
+ Width = 103
Anchors = [akRight]
AutoSize = True
BorderSpacing.Around = 10
@@ -90,10 +90,10 @@ object ResultDlgForm: TResultDlgForm
end
object CopyBtn: TBitBtn
AnchorSideRight.Control = SaveBtn
- Left = 395
+ Left = 393
Height = 26
Top = 12
- Width = 129
+ Width = 141
Anchors = [akRight]
AutoSize = True
BorderSpacing.Around = 10
@@ -137,6 +137,52 @@ object ResultDlgForm: TResultDlgForm
OnClick = CopyBtnClick
TabOrder = 0
end
+ object GraphStatBtn: TBitBtn
+ Left = 224
+ Height = 26
+ Top = 12
+ Width = 155
+ Anchors = [akRight]
+ Caption = 'Show statistics graph'
+ Glyph.Data = {
+ 36040000424D3604000000000000360000002800000010000000100000000100
+ 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF002E28EE0C2821EB81221BEAC91D15E8FF1911E72DFFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00403BF2453833F1DE5856EBFF6C6DE7FF332DE9FF1F17E82D984B20D29145
+ 1DC98B411981853D160CFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005452
+ F6546262F3FF7D7FEEFF9499EBFF8D91E9FF3B37ECFF261FEB2DA15127D2D68E
+ 62FFB86643FF8D421ADE863D1748FFFFFF00FFFFFF00FFFFFF00696AFA155F5F
+ F8F39599F2FFA5AAEEFF7B81E6FF979AEBFF4440EFFF2E28EE2DA95A2DD2DB99
+ 70FFE6A47FFFCB8057FFA65531FF883E1854FFFFFF00FFFFFF007476FB116B6C
+ FA996262F9F98485F4FFA3A8EFFFA0A5EDFF4F4CF1FF3733F12DB36234D2DEA1
+ 79FFDE895BFFE6A67FFFD0875CFF90451CF38A401915FFFFFF00449A4C733D91
+ 44666275D31B6566F98D5C5CF8F37C7EF3FF5958F4FF423EF22DBA6C3BD2E1A8
+ 81FFE09264FFD9794CFFE7A884FFBE704AFF91451D84FFFFFF004DA556CF90BF
+ 93FF3F9346EA388A3F725471B51D5F5FF87B5655F7ED4E4BF52DC37544D2E4B0
+ 8BFFE39C6DFFDD8554FFE29667FFDA976DFF9A4C22CFFFFFFF0056AF60F0CAE8
+ C8FFAFD9ABFF92BF94FF3A8D40ED3482397E8171B814A4759118CB804BD2E7B7
+ 93FFE7A677FFE0905DFFDE8E5CFFE6AD88FFA35328F3FFFFFF0060B86BF9B6E0
+ B1FF7BCC6FFF92D289FFADD9A9FF89B88BFF35843A9DD7915B56D18954F6EFC8
+ A9FFE6A673FFE29B67FFE29866FFE7B38FFFAB5C2EF0FFFFFF0068C175CFBADF
+ B8FF7ACC6DFF66C659FF72C866FFA8DAA3FF68A86DFF37863D3CD8925DC3E6B5
+ 8EFFF0CCACFFE5A671FFE9B184FFE3AF88FFB46435CFFFFFFF0073C87F84B3DA
+ B5FFA2D89AFF6DCA5FFF66C658FF80CC75FFA3CEA3FF3F9346CFD4996232D993
+ 5EFCF2D1B2FFEBB98DFFF0C9AAFFD89C70FFBC6D3D84FFFFFF007CCF891274CA
+ 82F3BEE1BEFF94D489FF6ECA62FF6EC960FF9ED697FF93C196FF41964769DE9C
+ 6696E7B48EFFF3D3B5FFE9BB98FFCB804BF3C5774512FFFFFF00FFFFFF007CD0
+ 8A51A0D5A8FFBAE0BBFFA7DAA0FF7DCE70FF7FCD73FFB0D9ADFF4AA152ED9B9D
+ 5B23DF9E68EDEBC29EFFDDA273FFD1895451FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF007ED18C3F78CC85DEB4DCB7FFBCE0BAFFB9E1B5FFCEEACBFFA4CEA6FF4BA3
+ 5496E3A46F69DF9F69DEDC99633FFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF007FD28E0C79CE877E73C87FC66AC277FC63BC6FFC5BB567C655AD
+ 5E7D8CA76103E4A6710AFFFFFF00FFFFFF00FFFFFF00FFFFFF00
+ }
+ OnClick = GraphStatBtnClick
+ TabOrder = 3
+ end
end
inline LogMemo: TSynEdit
Left = 98
@@ -656,6 +702,7 @@ object ResultDlgForm: TResultDlgForm
ShiftMask = [ssShift, ssAlt, ssCtrl]
Command = emcMouseLink
end>
+ MouseTextActions = <>
MouseSelActions = <
item
ClickDir = cdDown
@@ -667,23 +714,38 @@ object ResultDlgForm: TResultDlgForm
VisibleSpecialChars = [vscSpace, vscTabAtLast]
ReadOnly = True
ScrollBars = ssAutoBoth
+ SelectedColor.FrameEdges = sfeAround
+ SelectedColor.BackPriority = 50
+ SelectedColor.ForePriority = 50
+ SelectedColor.FramePriority = 50
+ SelectedColor.BoldPriority = 50
+ SelectedColor.ItalicPriority = 50
+ SelectedColor.UnderlinePriority = 50
+ SelectedColor.StrikeOutPriority = 50
+ IncrementColor.FrameEdges = sfeAround
+ HighlightAllColor.FrameEdges = sfeAround
BracketHighlightStyle = sbhsBoth
BracketMatchColor.Background = clNone
BracketMatchColor.Foreground = clNone
+ BracketMatchColor.FrameEdges = sfeAround
BracketMatchColor.Style = [fsBold]
FoldedCodeColor.Background = clNone
FoldedCodeColor.Foreground = clGray
FoldedCodeColor.FrameColor = clGray
+ FoldedCodeColor.FrameEdges = sfeAround
MouseLinkColor.Background = clNone
MouseLinkColor.Foreground = clBlue
+ MouseLinkColor.FrameEdges = sfeAround
LineHighlightColor.Background = clNone
LineHighlightColor.Foreground = clNone
+ LineHighlightColor.FrameEdges = sfeAround
inline SynLeftGutterPartList1: TSynGutterPartList
object SynGutterLineNumber1: TSynGutterLineNumber
Width = 17
MouseActions = <>
MarkupInfo.Background = clBtnFace
MarkupInfo.Foreground = clNone
+ MarkupInfo.FrameEdges = sfeAround
DigitCount = 2
ShowOnlyLineNumbersMultiplesOf = 1
ZeroStart = False
diff --git a/components/pochecker/resultdlg.pp b/components/pochecker/resultdlg.pp
index 8f594f30a9..fc5a36f3f8 100644
--- a/components/pochecker/resultdlg.pp
+++ b/components/pochecker/resultdlg.pp
@@ -7,13 +7,14 @@ interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
ExtCtrls, Buttons, ClipBrd, LCLType, LCLProc, SynEdit, SynHighlighterPo,
- pocheckerconsts;
+ PoFamilies, GraphStat, PoCheckerConsts;
type
{ TResultDlgForm }
TResultDlgForm = class(TForm)
+ GraphStatBtn: TBitBtn;
CopyBtn: TBitBtn;
SaveBtn: TBitBtn;
CloseBtn: TBitBtn;
@@ -27,12 +28,15 @@ type
procedure FormDestroy(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure FormShow(Sender: TObject);
+ procedure GraphStatBtnClick(Sender: TObject);
procedure SaveBtnClick(Sender: TObject);
private
PoHL: TSynPoSyn;
+ FPoFamilyStats: TPoFamilyStats;
procedure SaveToFile;
public
property Log: TStringList read FLog write FLog;
+ property PoFamilyStats: TPoFamilyStats read FPoFamilyStats write FPoFamilyStats;
end;
implementation
@@ -51,6 +55,7 @@ begin
LogMemo.Highlighter := PoHL;
SaveBtn.Caption := sSaveCaption;
CopyBtn.Caption := sCopyCaption;
+ GraphStatBtn.Caption := sShowStatGraph;
end;
procedure TResultDlgForm.FormClose(Sender: TObject;
@@ -84,6 +89,13 @@ end;
procedure TResultDlgForm.FormShow(Sender: TObject);
begin
LogMemo.Lines.Assign(FLog);
+ GraphStatBtn.Visible := (PoFamilyStats <> nil) and (PoFamilyStats.Count > 0);
+end;
+
+procedure TResultDlgForm.GraphStatBtnClick(Sender: TObject);
+begin
+ GraphStatForm.PoFamilyStats := Self.PoFamilyStats;
+ GraphStatForm.ShowModal;
end;
procedure TResultDlgForm.SaveBtnClick(Sender: TObject);
@@ -105,7 +117,7 @@ begin
try
LogMemo.Lines.SaveToFile(SaveDialog.FileName);
except
- MessageDlg('GPoCheck',Format(sSaveError,[SaveDialog.FileName]), mtError, [mbOk], 0);
+ MessageDlg('Po-checker',Format(sSaveError,[SaveDialog.FileName]), mtError, [mbOk], 0);
end;
end;
end;