From dc32996691baa6040b0529542d1d34f855343996 Mon Sep 17 00:00:00 2001 From: wp_xxyyzz Date: Sat, 30 May 2015 14:32:09 +0000 Subject: [PATCH] fpspreadsheet: Collapsable/expandable items in TsSpreadsheetInspector git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@4165 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- .../examples/visual/fpsctrls/main.lfm | 6 +- .../fpspreadsheet/fpspreadsheetctrls.pas | 183 ++++++++++++------ 2 files changed, 121 insertions(+), 68 deletions(-) diff --git a/components/fpspreadsheet/examples/visual/fpsctrls/main.lfm b/components/fpspreadsheet/examples/visual/fpsctrls/main.lfm index f3f2d2676..ad3d76002 100644 --- a/components/fpspreadsheet/examples/visual/fpsctrls/main.lfm +++ b/components/fpspreadsheet/examples/visual/fpsctrls/main.lfm @@ -71,6 +71,7 @@ object MainForm: TMainForm Top = 23 Width = 277 Align = alClient + DefaultColWidth = 125 MouseWheelOption = mwGrid RowCount = 30 TabOrder = 1 @@ -114,10 +115,7 @@ object MainForm: TMainForm ) WorkbookSource = WorkbookSource Mode = imWorkbook - ColWidths = ( - 114 - 114 - ) + ExtendedColSizing = True end end object InspectorSplitter: TSplitter diff --git a/components/fpspreadsheet/fpspreadsheetctrls.pas b/components/fpspreadsheet/fpspreadsheetctrls.pas index fc505b145..4f4fe62b6 100644 --- a/components/fpspreadsheet/fpspreadsheetctrls.pas +++ b/components/fpspreadsheet/fpspreadsheetctrls.pas @@ -395,6 +395,10 @@ type can be assigned to a tab of a TabControl. } TsInspectorMode = (imWorkbook, imWorksheet, imCellValue, imCellProperties); + {@@ Inspector expanded nodes } + TsInspectorExpandedNode = (ienFormatSettings, ienPageLayout); + TsInspectorExpandedNodes = set of TsInspectorExpandedNode; + {@@ TsSpreadsheetInspector displays all properties of a workbook, worksheet, cell content and cell formatting in a way similar to the Object Inspector of Lazarus. } @@ -402,11 +406,14 @@ type private FWorkbookSource: TsWorkbookSource; FMode: TsInspectorMode; + FExpanded: TsInspectorExpandedNodes; function GetWorkbook: TsWorkbook; function GetWorksheet: TsWorksheet; + procedure SetExpanded(AValue: TsInspectorExpandedNodes); procedure SetMode(AValue: TsInspectorMode); procedure SetWorkbookSource(AValue: TsWorkbookSource); protected + procedure DblClick; override; procedure DoUpdate; virtual; procedure Notification(AComponent: TComponent; Operation: TOperation); override; procedure UpdateCellValue(ACell: PCell; AStrings: TStrings); virtual; @@ -432,6 +439,9 @@ type {@@ inherited from TValueListEditor, activates column titles and automatic column width adjustment by default } property DisplayOptions default [doColumnTitles, doAutoColResize]; + {@@ Displays subproperties } + property ExpandedNodes: TsInspectorExpandedNodes + read FExpanded write SetExpanded default [ienFormatSettings, ienPageLayout]; {@@ inherited from TValueListEditor. Turns of the fixed column by default} property FixedCols default 0; {@@ inherited from TStringGrid, but not published in TValueListEditor. } @@ -2457,6 +2467,7 @@ begin inherited Create(AOwner); DisplayOptions := DisplayOptions - [doKeyColFixed]; FixedCols := 0; + FExpanded := [ienFormatSettings, ienPageLayout]; with (TitleCaptions as TStringList) do begin OnChange := nil; // This fixes an issue with Laz 1.0 Clear; @@ -2476,6 +2487,32 @@ begin inherited Destroy; end; +{@@ ---------------------------------------------------------------------------- + Double-click on an expandable line expands or collapsed the sub-items +-------------------------------------------------------------------------------} +procedure TsSpreadsheetInspector.DblClick; +var + s: String; + expNodes: TsInspectorExpandedNodes; +begin + expNodes := FExpanded; + s := Cells[0, Row]; + if (pos('FormatSettings', s) > 0) or (pos('Format settings', s) > 0) then + begin + if (ienFormatSettings in expNodes) + then Exclude(expNodes, ienFormatSettings) + else Include(expNodes, ienFormatSettings); + end else + if (pos('Page layout', s) > 0) or (pos('PageLayout', s) > 0) then + begin + if (ienPageLayout in expNodes) + then Exclude(expNodes, ienPageLayout) + else Include(expNodes, ienPageLayout); + end else + exit; + SetExpanded(expNodes); +end; + {@@ ---------------------------------------------------------------------------- Updates the data shown by the inspector grid. Display depends on the FMode setting (workbook, worksheet, cell values, cell properties). @@ -2580,6 +2617,17 @@ begin SetWorkbookSource(nil); end; +{@@ ---------------------------------------------------------------------------- + Setter method for the Expanded property +-------------------------------------------------------------------------------} +procedure TsSpreadsheetInspector.SetExpanded(AValue: TsInspectorExpandedNodes); +begin + if AValue = FExpanded then + exit; + FExpanded := AValue; + DoUpdate; +end; + {@@ ---------------------------------------------------------------------------- Setter method for the Mode property. This property filters groups of properties for display (workbook-, worksheet-, cell value- or cell formatting-related @@ -2835,38 +2883,41 @@ begin if s <> '' then Delete(s, 1, 2); AStrings.Add('Options='+s); - AStrings.Add('FormatSettings='); - AStrings.Add(' ThousandSeparator='+AWorkbook.FormatSettings.ThousandSeparator); - AStrings.Add(' DecimalSeparator='+AWorkbook.FormatSettings.DecimalSeparator); - AStrings.Add(' ListSeparator='+AWorkbook.FormatSettings.ListSeparator); - AStrings.Add(' DateSeparator='+AWorkbook.FormatSettings.DateSeparator); - AStrings.Add(' TimeSeparator='+AWorkbook.FormatSettings.TimeSeparator); - AStrings.Add(' ShortDateFormat='+AWorkbook.FormatSettings.ShortDateFormat); - AStrings.Add(' LongDateFormat='+AWorkbook.FormatSettings.LongDateFormat); - AStrings.Add(' ShortTimeFormat='+AWorkbook.FormatSettings.ShortTimeFormat); - AStrings.Add(' LongTimeFormat='+AWorkbook.FormatSettings.LongTimeFormat); - AStrings.Add(' TimeAMString='+AWorkbook.FormatSettings.TimeAMString); - AStrings.Add(' TimePMString='+AWorkbook.FormatSettings.TimePMString); - s := AWorkbook.FormatSettings.ShortMonthNames[1]; - for i:=2 to 12 do - s := s + ', ' + AWorkbook.FormatSettings.ShortMonthNames[i]; - AStrings.Add(' ShortMonthNames='+s); - s := AWorkbook.FormatSettings.LongMonthnames[1]; - for i:=2 to 12 do - s := s +', ' + AWorkbook.FormatSettings.LongMonthNames[i]; - AStrings.Add(' LongMontNames='+s); - s := AWorkbook.FormatSettings.ShortDayNames[1]; - for i:=2 to 7 do - s := s + ', ' + AWorkbook.FormatSettings.ShortDayNames[i]; - AStrings.Add(' ShortMonthNames='+s); - s := AWorkbook.FormatSettings.LongDayNames[1]; - for i:=2 to 7 do - s := s +', ' + AWorkbook.FormatSettings.LongDayNames[i]; - AStrings.Add(' LongMontNames='+s); - AStrings.Add(' CurrencyString='+AWorkbook.FormatSettings.CurrencyString); - AStrings.Add(' PosCurrencyFormat='+IntToStr(AWorkbook.FormatSettings.CurrencyFormat)); - AStrings.Add(' NegCurrencyFormat='+IntToStr(AWorkbook.FormatSettings.NegCurrFormat)); - AStrings.Add(' TwoDigitYearCenturyWindow='+IntToStr(AWorkbook.FormatSettings.TwoDigitYearCenturyWindow)); + if (ienFormatSettings in FExpanded) then begin + AStrings.Add('(-) FormatSettings='); + AStrings.Add(' ThousandSeparator='+AWorkbook.FormatSettings.ThousandSeparator); + AStrings.Add(' DecimalSeparator='+AWorkbook.FormatSettings.DecimalSeparator); + AStrings.Add(' ListSeparator='+AWorkbook.FormatSettings.ListSeparator); + AStrings.Add(' DateSeparator='+AWorkbook.FormatSettings.DateSeparator); + AStrings.Add(' TimeSeparator='+AWorkbook.FormatSettings.TimeSeparator); + AStrings.Add(' ShortDateFormat='+AWorkbook.FormatSettings.ShortDateFormat); + AStrings.Add(' LongDateFormat='+AWorkbook.FormatSettings.LongDateFormat); + AStrings.Add(' ShortTimeFormat='+AWorkbook.FormatSettings.ShortTimeFormat); + AStrings.Add(' LongTimeFormat='+AWorkbook.FormatSettings.LongTimeFormat); + AStrings.Add(' TimeAMString='+AWorkbook.FormatSettings.TimeAMString); + AStrings.Add(' TimePMString='+AWorkbook.FormatSettings.TimePMString); + s := AWorkbook.FormatSettings.ShortMonthNames[1]; + for i:=2 to 12 do + s := s + ', ' + AWorkbook.FormatSettings.ShortMonthNames[i]; + AStrings.Add(' ShortMonthNames='+s); + s := AWorkbook.FormatSettings.LongMonthnames[1]; + for i:=2 to 12 do + s := s +', ' + AWorkbook.FormatSettings.LongMonthNames[i]; + AStrings.Add(' LongMontNames='+s); + s := AWorkbook.FormatSettings.ShortDayNames[1]; + for i:=2 to 7 do + s := s + ', ' + AWorkbook.FormatSettings.ShortDayNames[i]; + AStrings.Add(' ShortMonthNames='+s); + s := AWorkbook.FormatSettings.LongDayNames[1]; + for i:=2 to 7 do + s := s +', ' + AWorkbook.FormatSettings.LongDayNames[i]; + AStrings.Add(' LongMontNames='+s); + AStrings.Add(' CurrencyString='+AWorkbook.FormatSettings.CurrencyString); + AStrings.Add(' PosCurrencyFormat='+IntToStr(AWorkbook.FormatSettings.CurrencyFormat)); + AStrings.Add(' NegCurrencyFormat='+IntToStr(AWorkbook.FormatSettings.NegCurrFormat)); + AStrings.Add(' TwoDigitYearCenturyWindow='+IntToStr(AWorkbook.FormatSettings.TwoDigitYearCenturyWindow)); + end else + AStrings.Add('(+) FormatSettings=(dblclick for more...)'); for i:=0 to AWorkbook.GetFontCount-1 do AStrings.Add(Format('Font%d=%s', [i, AWorkbook.GetFontAsString(i)])); @@ -2912,40 +2963,44 @@ begin AStrings.Add(Format('Comments=%d items', [ASheet.Comments.Count])); AStrings.Add(Format('Hyperlinks=%d items', [ASheet.Hyperlinks.Count])); AStrings.Add(Format('MergedCells=%d items', [ASheet.MergedCells.Count])); - AStrings.Add('Page layout='); - AStrings.Add(Format(' Orientation=%s', [GetEnumName(TypeInfo(TsPageOrientation), ord(ASheet.PageLayout.Orientation))])); - AStrings.Add(Format(' Page width=%.1f mm', [ASheet.PageLayout.PageWidth])); - AStrings.Add(Format(' Page height=%.1f mm', [ASheet.PageLayout.PageHeight])); - AStrings.Add(Format(' Left margin=%.1f mm', [ASheet.PageLayout.LeftMargin])); - AStrings.Add(Format(' Right margin=%.1f mm', [ASheet.PageLayout.RightMargin])); - AStrings.Add(Format(' Top margin=%.1f mm', [ASheet.PageLayout.TopMargin])); - AStrings.Add(Format(' Bottom margin=%.1f mm', [ASheet.PageLayout.BottomMargin])); - AStrings.Add(Format(' Header distance=%.1f mm', [ASheet.PageLayout.HeaderMargin])); - AStrings.Add(Format(' Footer distance=%.1f mm', [ASheet.PageLayout.FooterMargin])); - if poUseStartPageNumber in ASheet.PageLayout.Options then - AStrings.Add(Format(' Start page number=%d', [ASheet.pageLayout.StartPageNumber])) - else - AStrings.Add (' Start page number=automatic'); - AStrings.Add(Format(' Scaling factor=%d%%', [ASheet.PageLayout.ScalingFactor])); - AStrings.Add(Format(' Copies=%d', [ASheet.PageLayout.Copies])); - if (ASheet.PageLayout.Options * [poDifferentOddEven, poDifferentFirst] <> []) then + if ienPageLayout in FExpanded then begin - AStrings.Add(Format(' Header (first)=%s', [StringReplace(ASheet.PageLayout.Headers[0], LineEnding, '\n', [rfReplaceAll])])); - AStrings.Add(Format(' Header (odd)=%s', [StringReplace(ASheet.PageLayout.Headers[1], LineEnding, '\n', [rfReplaceAll])])); - AStrings.Add(Format(' Header (even)=%s', [StringReplace(ASheet.PageLayout.Headers[2], LineEnding, '\n', [rfReplaceAll])])); - AStrings.Add(Format(' Footer (first)=%s', [StringReplace(ASheet.PageLayout.Footers[0], LineEnding, '\n', [rfReplaceAll])])); - AStrings.Add(Format(' Footer (odd)=%s', [StringReplace(ASheet.PageLayout.Footers[1], LineEnding, '\n', [rfReplaceall])])); - AStrings.Add(Format(' Footer (even)=%s', [StringReplace(ASheet.PageLayout.Footers[2], LineEnding, '\n', [rfReplaceAll])])); + AStrings.Add('(+) Page layout='); + AStrings.Add(Format(' Orientation=%s', [GetEnumName(TypeInfo(TsPageOrientation), ord(ASheet.PageLayout.Orientation))])); + AStrings.Add(Format(' Page width=%.1f mm', [ASheet.PageLayout.PageWidth])); + AStrings.Add(Format(' Page height=%.1f mm', [ASheet.PageLayout.PageHeight])); + AStrings.Add(Format(' Left margin=%.1f mm', [ASheet.PageLayout.LeftMargin])); + AStrings.Add(Format(' Right margin=%.1f mm', [ASheet.PageLayout.RightMargin])); + AStrings.Add(Format(' Top margin=%.1f mm', [ASheet.PageLayout.TopMargin])); + AStrings.Add(Format(' Bottom margin=%.1f mm', [ASheet.PageLayout.BottomMargin])); + AStrings.Add(Format(' Header distance=%.1f mm', [ASheet.PageLayout.HeaderMargin])); + AStrings.Add(Format(' Footer distance=%.1f mm', [ASheet.PageLayout.FooterMargin])); + if poUseStartPageNumber in ASheet.PageLayout.Options then + AStrings.Add(Format(' Start page number=%d', [ASheet.pageLayout.StartPageNumber])) + else + AStrings.Add (' Start page number=automatic'); + AStrings.Add(Format(' Scaling factor=%d%%', [ASheet.PageLayout.ScalingFactor])); + AStrings.Add(Format(' Copies=%d', [ASheet.PageLayout.Copies])); + if (ASheet.PageLayout.Options * [poDifferentOddEven, poDifferentFirst] <> []) then + begin + AStrings.Add(Format(' Header (first)=%s', [StringReplace(ASheet.PageLayout.Headers[0], LineEnding, '\n', [rfReplaceAll])])); + AStrings.Add(Format(' Header (odd)=%s', [StringReplace(ASheet.PageLayout.Headers[1], LineEnding, '\n', [rfReplaceAll])])); + AStrings.Add(Format(' Header (even)=%s', [StringReplace(ASheet.PageLayout.Headers[2], LineEnding, '\n', [rfReplaceAll])])); + AStrings.Add(Format(' Footer (first)=%s', [StringReplace(ASheet.PageLayout.Footers[0], LineEnding, '\n', [rfReplaceAll])])); + AStrings.Add(Format(' Footer (odd)=%s', [StringReplace(ASheet.PageLayout.Footers[1], LineEnding, '\n', [rfReplaceall])])); + AStrings.Add(Format(' Footer (even)=%s', [StringReplace(ASheet.PageLayout.Footers[2], LineEnding, '\n', [rfReplaceAll])])); + end else + begin + AStrings.Add(Format(' Header=%s', [StringReplace(ASheet.PageLayout.Headers[1], LineEnding, '\n', [rfReplaceAll])])); + AStrings.Add(Format(' Footer=%s', [StringReplace(ASheet.PageLayout.Footers[1], LineEnding, '\n', [rfReplaceAll])])); + end; + s := ''; + for po in TsPrintOption do + if po in ASheet.PageLayout.Options then s := s + '; ' + GetEnumName(typeInfo(TsPrintOption), ord(po)); + if s <> '' then Delete(s, 1, 2); + AStrings.Add(Format(' Options=%s', [s])); end else - begin - AStrings.Add(Format(' Header=%s', [StringReplace(ASheet.PageLayout.Headers[1], LineEnding, '\n', [rfReplaceAll])])); - AStrings.Add(Format(' Footer=%s', [StringReplace(ASheet.PageLayout.Footers[1], LineEnding, '\n', [rfReplaceAll])])); - end; - s := ''; - for po in TsPrintOption do - if po in ASheet.PageLayout.Options then s := s + '; ' + GetEnumName(typeInfo(TsPrintOption), ord(po)); - if s <> '' then Delete(s, 1, 2); - AStrings.Add(Format(' Options=%s', [s])); + AStrings.Add('(+) Page layout=(dblclick for more...)'); end; end;