From 51972779d5e1ba90e913e40107e2ccc4cfdafce7 Mon Sep 17 00:00:00 2001 From: wp_xxyyzz Date: Wed, 12 Nov 2014 22:55:22 +0000 Subject: [PATCH] fpspreadsheet: Add actions for visual modification of font style, horizontal and vertical alignment of selected cells. git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@3721 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- .../fpspreadsheet/examples/fpsctrls/main.lfm | 544 +++++++++++++++++- .../fpspreadsheet/examples/fpsctrls/main.pas | 30 +- .../examples/fpsctrls_no_install/main.lfm | 474 ++++++++++++++- .../examples/fpsctrls_no_install/main.pas | 136 ++++- components/fpspreadsheet/fpsactions.pas | 319 ++++++++-- .../fpspreadsheet/fpspreadsheetctrls.pas | 1 + 6 files changed, 1420 insertions(+), 84 deletions(-) diff --git a/components/fpspreadsheet/examples/fpsctrls/main.lfm b/components/fpspreadsheet/examples/fpsctrls/main.lfm index 92b8f2180..6f793427e 100644 --- a/components/fpspreadsheet/examples/fpsctrls/main.lfm +++ b/components/fpspreadsheet/examples/fpsctrls/main.lfm @@ -4,7 +4,7 @@ object Form1: TForm1 Top = 242 Width = 925 Caption = 'Form1' - ClientHeight = 575 + ClientHeight = 580 ClientWidth = 925 Menu = MainMenu LCLVersion = '1.3' @@ -29,7 +29,7 @@ object Form1: TForm1 end object CellIndicator: TsCellIndicator Left = 95 - Height = 28 + Height = 23 Top = 9 Width = 80 TabOrder = 1 @@ -38,7 +38,7 @@ object Form1: TForm1 end object CellEdit: TsCellEdit Left = 184 - Height = 28 + Height = 23 Top = 9 Width = 731 Anchors = [akTop, akLeft, akRight] @@ -49,7 +49,7 @@ object Form1: TForm1 end object WorkbookTabControl: TsWorkbookTabControl Left = 0 - Height = 507 + Height = 512 Top = 68 Width = 672 TabIndex = 0 @@ -61,8 +61,8 @@ object Form1: TForm1 WorkbookSource = WorkbookSource object WorksheetGrid: TsWorksheetGrid Left = 2 - Height = 477 - Top = 28 + Height = 487 + Top = 23 Width = 668 FrozenCols = 0 FrozenRows = 0 @@ -75,6 +75,7 @@ object Form1: TForm1 Font.Color = clBlack Font.Height = -13 Font.Name = 'Arial' + Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goRowSizing, goColSizing, goEditing, goThumbTracking, goSmoothScroll] ParentFont = False RowCount = 101 TabOrder = 1 @@ -114,7 +115,7 @@ object Form1: TForm1 end object InspectorTabControl: TTabControl Left = 677 - Height = 507 + Height = 512 Top = 68 Width = 248 OnChange = InspectorTabControlChange @@ -129,8 +130,8 @@ object Form1: TForm1 TabOrder = 2 object Inspector: TsSpreadsheetInspector Left = 2 - Height = 477 - Top = 28 + Height = 487 + Top = 23 Width = 244 Align = alClient RowCount = 25 @@ -142,7 +143,7 @@ object Form1: TForm1 'Options=boAutoCalc, boCalcBeforeSaving, boReadFormulas' 'FormatSettings=' ' ThousandSeparator=.' - ' DecimalSeparator=,' + ' DecimalSeparator=.' ' ListSeparator=;' ' DateSeparator=.' ' TimeSeparator=:' @@ -168,14 +169,14 @@ object Form1: TForm1 WorkbookSource = WorkbookSource Mode = imWorkbook ColWidths = ( - 109 - 110 + 111 + 112 ) end end object Splitter1: TSplitter Left = 672 - Height = 507 + Height = 512 Top = 68 Width = 5 Align = alRight @@ -192,30 +193,113 @@ object Form1: TForm1 object ToolButton1: TToolButton Left = 1 Top = 2 - Action = AddWorksheetAction + Action = AcAddWorksheet end object ToolButton2: TToolButton Left = 24 Top = 2 - Action = RenameWorksheetAction + Action = AcDeleteWorksheet end object ToolButton3: TToolButton Left = 47 Top = 2 - Action = RenameWorksheetAction + Action = acRenameWorksheet end object ToolButton4: TToolButton - Left = 70 + Left = 75 + Height = 22 Top = 2 Width = 3 Caption = 'ToolButton4' Style = tbsDivider end object ToolButton5: TToolButton - Left = 73 + Left = 323 Top = 2 Action = AcFileExit end + object ToolButton6: TToolButton + Left = 78 + Top = 2 + Action = AcFontBold + end + object ToolButton7: TToolButton + Left = 101 + Top = 2 + Action = AcFontItalic + end + object ToolButton8: TToolButton + Left = 124 + Top = 2 + Action = AcFontUnderline + end + object ToolButton9: TToolButton + Left = 70 + Height = 22 + Top = 2 + Width = 5 + Caption = 'ToolButton9' + Style = tbsDivider + end + object ToolButton10: TToolButton + Left = 170 + Height = 22 + Top = 2 + Width = 5 + Caption = 'ToolButton10' + Style = tbsDivider + end + object ToolButton11: TToolButton + Left = 147 + Top = 2 + Action = AcFontStrikeout + end + object ToolButton12: TToolButton + Left = 175 + Top = 2 + Action = AcHorAlignLeft + end + object ToolButton13: TToolButton + Left = 198 + Top = 2 + Action = AcHorAlignCenter + end + object ToolButton14: TToolButton + Left = 221 + Top = 2 + Action = AcHorAlignRight + end + object ToolButton15: TToolButton + Left = 244 + Height = 22 + Top = 2 + Width = 5 + Caption = 'ToolButton15' + Style = tbsDivider + end + object ToolButton16: TToolButton + Left = 249 + Top = 2 + Action = AcVertAlignTop + end + object ToolButton17: TToolButton + Left = 272 + Top = 2 + Action = AcVertAlignCenter + end + object ToolButton18: TToolButton + Left = 295 + Top = 2 + Action = AcVertAlignBottom + end + object ToolButton19: TToolButton + Left = 318 + Height = 22 + Top = 2 + Width = 5 + Caption = 'ToolButton19' + Style = tbsDivider + end end object WorkbookSource: TsWorkbookSource AutoDetectFormat = False @@ -232,29 +316,29 @@ object Form1: TForm1 end object ActionList: TActionList Images = ImageList - left = 434 + left = 432 top = 180 - object AddWorksheetAction: TsWorksheetAddAction + object AcAddWorksheet: TsWorksheetAddAction Category = 'FPSpreadsheet' + WorkbookSource = WorkbookSource Caption = 'Add' Hint = 'Add empty worksheet' ImageIndex = 1 - WorkbookSource = WorkbookSource NameMask = 'Sheet%d' end - object DeleteWorksheetAction: TsWorksheetDeleteAction + object AcDeleteWorksheet: TsWorksheetDeleteAction Category = 'FPSpreadsheet' + WorkbookSource = WorkbookSource Caption = 'Delete' Hint = 'Delete worksheet' ImageIndex = 2 - WorkbookSource = WorkbookSource end - object RenameWorksheetAction: TsWorksheetRenameAction + object acRenameWorksheet: TsWorksheetRenameAction Category = 'FPSpreadsheet' + WorkbookSource = WorkbookSource Caption = 'Rename...' Hint = 'Rename worksheet' ImageIndex = 3 - WorkbookSource = WorkbookSource end object AcFileExit: TFileExit Category = 'File' @@ -262,12 +346,92 @@ object Form1: TForm1 Hint = 'Exit' ImageIndex = 0 end + object AcFontBold: TsFontStyleAction + Category = 'FPSpreadsheet' + WorkbookSource = WorkbookSource + Caption = 'Bold' + Hint = 'Bold font' + ImageIndex = 4 + FontStyle = fssBold + end + object AcFontItalic: TsFontStyleAction + Category = 'FPSpreadsheet' + WorkbookSource = WorkbookSource + Caption = 'Italic' + Hint = 'Italic font' + ImageIndex = 5 + FontStyle = fssItalic + end + object AcFontUnderline: TsFontStyleAction + Category = 'FPSpreadsheet' + WorkbookSource = WorkbookSource + Caption = 'Underline' + Hint = 'Underlines font' + ImageIndex = 6 + FontStyle = fssUnderline + end + object AcFontStrikeout: TsFontStyleAction + Category = 'FPSpreadsheet' + WorkbookSource = WorkbookSource + Caption = 'Strikeout' + Hint = 'Strike-out font' + ImageIndex = 7 + FontStyle = fssStrikeOut + end + object AcVertAlignTop: TsVertAlignmentAction + Category = 'FPSpreadsheet' + WorkbookSource = WorkbookSource + Caption = 'Top' + Hint = 'Top-aligned text' + ImageIndex = 11 + VertAlignment = vaTop + end + object AcVertAlignCenter: TsVertAlignmentAction + Category = 'FPSpreadsheet' + WorkbookSource = WorkbookSource + Caption = 'Center' + Hint = 'Vertically centered text' + ImageIndex = 12 + VertAlignment = vaCenter + end + object AcVertAlignBottom: TsVertAlignmentAction + Category = 'FPSpreadsheet' + WorkbookSource = WorkbookSource + Caption = 'Bottom' + Hint = 'Bottom-aligned text' + ImageIndex = 13 + VertAlignment = vaBottom + end + object AcHorAlignLeft: TsHorAlignmentAction + Category = 'FPSpreadsheet' + WorkbookSource = WorkbookSource + Caption = 'Left' + Hint = 'Left-aligned text' + ImageIndex = 8 + HorAlignment = haLeft + end + object AcHorAlignCenter: TsHorAlignmentAction + Category = 'FPSpreadsheet' + WorkbookSource = WorkbookSource + Caption = 'Center' + Hint = 'Centered text' + ImageIndex = 9 + HorAlignment = haCenter + end + object AcHorAlignRight: TsHorAlignmentAction + Category = 'FPSpreadsheet' + WorkbookSource = WorkbookSource + Caption = 'Right' + Hint = 'Right-aligned text' + ImageIndex = 10 + HorAlignment = haRight + end end object ImageList: TImageList - left = 434 + left = 432 top = 249 Bitmap = { - 4C69040000001000000010000000003F9300003F9300003F9300003F9424003F + 4C690E0000001000000010000000003F9300003F9300003F9300003F9424003F 948A003E93CC004095CC004095CC004095CC004095CC004095CC004095CC0040 95CC004095CC00409599003F9400003F9300003F9324003F938A0E4B9CD33F76 C0EC5D90D4FF3365A9FFA0A0A0FFA9A9A9FFA9A9A9FFAAAAAAFFACACACFFAEAE @@ -395,6 +559,326 @@ object Form1: TForm1 FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00777777607777 + 77CF747474FF707070EF6B6B6B7F656565AF606060EF5959599F53535310FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF007373 + 737F696969FF6A6A6ABFFFFFFF00FFFFFF005858589F545454FF4A4A4ACFFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006D6D + 6D7F656565FF636363BFFFFFFF00FFFFFF004F4F4F7F4E4E4EFF414141FFFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006767 + 677F5F5F5FFF5B5B5BBFFFFFFF004D4D4D10464646DF464646FF3838389FFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006060 + 607F595959FF535353DF4C4C4C7F454545CF444444FF363636BFFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005858 + 587F535353FF4A4A4ABFFFFFFF00FFFFFF003434349F383838FF262626CF1F1F + 1F10FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004F4F + 4F7F4D4D4DFF414141BFFFFFFF00FFFFFF002B2B2B10262626FF2D2D2DFF1717 + 1770FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004646 + 467F464646FF383838BFFFFFFF00FFFFFF00FFFFFF001C1C1CFF292929FF1010 + 107FFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003D3D + 3D7F404040FF2F2F2FCFFFFFFF00FFFFFF001B1B1B70242424FF0F0F0FEF0A0A + 0A20FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003C3C3C603434 + 34AF2D2D2DBF262626BF1F1F1F8F1919198F131313BF0D0D0D8F09090920FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF006B6B6B80656565F0606060FF595959F0535353C0FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF005E5E5EE0595959FF51515160FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF005C5C5C30575757FF4F4F4FF0FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF0054545490525252FF464646A0FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF004C4C4CE0494949FF3D3D3D50FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF004A4A4A30454545FF3C3C3CF0FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF0041414190444444FF323232A0FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00383838E0383838FF2A2A2A50FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF0036363640353535FF282828FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003434 + 34802D2D2DC0262626C01F1F1FC0191919B0FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00777777607777 + 77EF777777FF7575758FFFFFFF00FFFFFF00FFFFFF00616161AF5B5B5BFF5454 + 5470FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF007777 + 77BF747474FFFFFFFF00FFFFFF00FFFFFF00FFFFFF0059595910535353CFFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF007373 + 73BF6E6E6EFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004A4A4ABFFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006D6D + 6DBF686868FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00414141BFFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006767 + 67BF616161FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00383838BFFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006060 + 60BF595959FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002F2F2FBFFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005858 + 58BF515151FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00262626BFFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004F4F + 4F8F4B4B4BFF41414150FFFFFF00FFFFFF00FFFFFF00242424401E1E1E8FFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004646 + 46203F3F3FEF383838CF31313120FFFFFF00232323401C1C1CCF16161620FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00363636202F2F2F9F282828BF212121BF1B1B1B8F14141430FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002B2B + 2BFF242424FF1E1E1EFF171717FF121212FF0C0C0CFF070707FF030303FFFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF0074747411707070996B6B6B666565657760606099595959BBFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF006E6E6EEE6A6A6A77FFFFFF00FFFFFF0058585877515151FFFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006D6D + 6D66666666FF63636388FFFFFF00FFFFFF00FFFFFF00484848BBFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006767 + 6744606060FF5B5B5BFF545454994D4D4D33FFFFFF003F3F3F44FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00595959BB555555FF515151FF484848FF3D3D3DCC36363644FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0077777775777777FF777777FF7777 + 77FF777777FF777777FF5F5F5FFF3C3C3CFF181818FF000000FF000000FF0000 + 00FF000000FF00000074FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004F4F + 4F11FFFFFF00FFFFFF00FFFFFF00323232662B2B2BDD323232FF1E1E1ECCFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004646 + 46663F3F3F77FFFFFF00FFFFFF00FFFFFF00FFFFFF001C1C1CFF161616DDFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003D3D + 3D66373737FF2F2F2F11FFFFFF00FFFFFF00FFFFFF00141414EE0F0F0F77FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003434 + 34662D2D2DEE262626CC1F1F1F7719191966131313770D0D0D88FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00767676FF747474FF7070 + 70FF6C6C6CFF686868FF636363FF5E5E5EFF595959FF535353FF4E4E4EFF4848 + 48FF424242FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006F6F6FFF6B6B6BFF6666 + 66FF616161FF5C5C5CFF575757FF515151FF4B4B4BFF454545FFFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00646464FF5F5F5FFF5A5A + 5AFF545454FF4F4F4FFF494949FF434343FF3D3D3DFF373737FF313131FF2B2B + 2BFF252525FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00585858FF525252FF4C4C + 4CFF464646FF404040FF3A3A3AFF343434FF2E2E2EFF282828FFFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004A4A4AFF444444FF3E3E + 3EFF383838FF323232FF2C2C2CFF262626FF202020FF1B1B1BFF161616FF1111 + 11FF0C0C0CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003C3C3CFF353535FF2F2F + 2FFF292929FF242424FF1E1E1EFF191919FF141414FF0F0F0FFFFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00767676FF747474FF7070 + 70FF6C6C6CFF686868FF636363FF5E5E5EFF595959FF535353FF4E4E4EFF4848 + 48FF424242FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006B6B6B6B6666 + 66FF616161FF5C5C5CFF575757FF515151FF4B4B4BFF454545FF3F3F3FFF3939 + 396BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00646464FF5F5F5FFF5A5A + 5AFF545454FF4F4F4FFF494949FF434343FF3D3D3DFF373737FF313131FF2B2B + 2BFF252525FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005252526B4C4C + 4CFF464646FF404040FF3A3A3AFF343434FF2E2E2EFF282828FF232323FF1D1D + 1D6BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004A4A4AFF444444FF3E3E + 3EFF383838FF323232FF2C2C2CFF262626FF202020FF1B1B1BFF161616FF1111 + 11FF0C0C0CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003535356B2F2F + 2FFF292929FF242424FF1E1E1EFF191919FF141414FF0F0F0FFF0B0B0BFF0707 + 076BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00767676FF747474FF7070 + 70FF6C6C6CFF686868FF636363FF5E5E5EFF595959FF535353FF4E4E4EFF4848 + 48FF424242FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00616161FF5C5C5CFF575757FF515151FF4B4B4BFF454545FF3F3F3FFF3939 + 39FF333333FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00646464FF5F5F5FFF5A5A + 5AFF545454FF4F4F4FFF494949FF434343FF3D3D3DFF373737FF313131FF2B2B + 2BFF252525FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00464646FF404040FF3A3A3AFF343434FF2E2E2EFF282828FF232323FF1D1D + 1DFF181818FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004A4A4AFF444444FF3E3E + 3EFF383838FF323232FF2C2C2CFF262626FF202020FF1B1B1BFF161616FF1111 + 11FF0C0C0CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00292929FF242424FF1E1E1EFF191919FF141414FF0F0F0FFF0B0B0BFF0707 + 07FF030303FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00757575FF737373FF6F6F + 6FFF6B6B6BFF676767FF626262FF5D5D5DFF585858FF525252FF4D4D4DFF4747 + 47FF414141FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006E6E6EFF6A6A6AFF6565 + 65FF606060FF5B5B5BFF565656FF505050FF4A4A4AFF444444FF3E3E3EFF3838 + 38FF323232FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00636363005E5E5E005959 + 5900535353004E4E4E0048484800424242003C3C3C0036363600303030002A2A + 2A0024242400FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0057575700515151004B4B + 4B00454545003F3F3F0039393900333333002D2D2D0027272700222222001C1C + 1C0017171700FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0049494900434343003D3D + 3D0037373700313131002B2B2B00252525001F1F1F001A1A1A00151515001111 + 11000C0C0C00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003B3B3B00343434002E2E + 2E0028282800232323001D1D1D0018181800131313000F0F0F000B0B0B000707 + 070003030300FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0075757500737373006F6F + 6F006B6B6B0067676700626262005D5D5D0058585800525252004D4D4D004747 + 470041414100FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006E6E6E006A6A6A006565 + 6500606060005B5B5B0056565600505050004A4A4A00444444003E3E3E003838 + 380032323200FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00636363FF5E5E5EFF5959 + 59FF535353FF4E4E4EFF484848FF424242FF3C3C3CFF363636FF303030FF2A2A + 2AFF242424FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00575757FF515151FF4B4B + 4BFF454545FF3F3F3FFF393939FF333333FF2D2D2DFF272727FF222222FF1C1C + 1CFF171717FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0049494900434343003D3D + 3D0037373700313131002B2B2B00252525001F1F1F001A1A1A00151515001111 + 11000C0C0C00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003B3B3B00343434002E2E + 2E0028282800232323001D1D1D0018181800131313000F0F0F000B0B0B000707 + 070003030300FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0075757500737373006F6F + 6F006B6B6B0067676700626262005D5D5D0058585800525252004D4D4D004747 + 470041414100FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006E6E6E006A6A6A006565 + 6500606060005B5B5B0056565600505050004A4A4A00444444003E3E3E003838 + 380032323200FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00636363005E5E5E005959 + 5900535353004E4E4E0048484800424242003C3C3C0036363600303030002A2A + 2A0024242400FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0057575700515151004B4B + 4B00454545003F3F3F0039393900333333002D2D2D0027272700222222001C1C + 1C0017171700FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00494949FF434343FF3D3D + 3DFF373737FF313131FF2B2B2BFF252525FF1F1F1FFF1A1A1AFF151515FF1111 + 11FF0C0C0CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003B3B3BFF343434FF2E2E + 2EFF282828FF232323FF1D1D1DFF181818FF131313FF0F0F0FFF0B0B0BFF0707 + 07FF030303FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00 } end @@ -412,16 +896,16 @@ object Form1: TForm1 object MnuWorksheet: TMenuItem Caption = 'Worksheet' object MnuAddSheet: TMenuItem - Action = AddWorksheetAction + Action = AcAddWorksheet end object MenuItem2: TMenuItem - Action = DeleteWorksheetAction + Action = AcDeleteWorksheet end object MenuItem3: TMenuItem Caption = '-' end object MenuItem4: TMenuItem - Action = RenameWorksheetAction + Action = acRenameWorksheet end end end diff --git a/components/fpspreadsheet/examples/fpsctrls/main.pas b/components/fpspreadsheet/examples/fpsctrls/main.pas index f7a8e1ebb..c94cfe16c 100644 --- a/components/fpspreadsheet/examples/fpsctrls/main.pas +++ b/components/fpspreadsheet/examples/fpsctrls/main.pas @@ -32,18 +32,42 @@ type Panel1: TPanel; CellEdit: TsCellEdit; CellIndicator: TsCellIndicator; + AcFontBold: TsFontStyleAction; + AcFontItalic: TsFontStyleAction; + AcVertAlignTop: TsVertAlignmentAction; + AcVertAlignCenter: TsVertAlignmentAction; + AcVertAlignBottom: TsVertAlignmentAction; + AcHorAlignLeft: TsHorAlignmentAction; + AcHorAlignCenter: TsHorAlignmentAction; + AcHorAlignRight: TsHorAlignmentAction; + ToolButton11: TToolButton; + ToolButton12: TToolButton; + ToolButton13: TToolButton; + ToolButton14: TToolButton; + ToolButton15: TToolButton; + ToolButton16: TToolButton; + ToolButton17: TToolButton; + ToolButton18: TToolButton; + ToolButton19: TToolButton; + AcFontUnderline: TsFontStyleAction; + AcFontStrikeout: TsFontStyleAction; Splitter1: TSplitter; Inspector: TsSpreadsheetInspector; InspectorTabControl: TTabControl; - AddWorksheetAction: TsWorksheetAddAction; - DeleteWorksheetAction: TsWorksheetDeleteAction; - RenameWorksheetAction: TsWorksheetRenameAction; + AcAddWorksheet: TsWorksheetAddAction; + AcDeleteWorksheet: TsWorksheetDeleteAction; + acRenameWorksheet: TsWorksheetRenameAction; ToolBar1: TToolBar; ToolButton1: TToolButton; + ToolButton10: TToolButton; ToolButton2: TToolButton; ToolButton3: TToolButton; ToolButton4: TToolButton; ToolButton5: TToolButton; + ToolButton6: TToolButton; + ToolButton7: TToolButton; + ToolButton8: TToolButton; + ToolButton9: TToolButton; WorkbookSource: TsWorkbookSource; WorkbookTabControl: TsWorkbookTabControl; WorksheetGrid: TsWorksheetGrid; diff --git a/components/fpspreadsheet/examples/fpsctrls_no_install/main.lfm b/components/fpspreadsheet/examples/fpsctrls_no_install/main.lfm index d18650504..7d1c16dd8 100644 --- a/components/fpspreadsheet/examples/fpsctrls_no_install/main.lfm +++ b/components/fpspreadsheet/examples/fpsctrls_no_install/main.lfm @@ -4,7 +4,7 @@ object Form1: TForm1 Top = 177 Width = 874 Caption = 'Form1' - ClientHeight = 503 + ClientHeight = 508 ClientWidth = 874 Menu = MainMenu OnCreate = FormCreate @@ -12,7 +12,7 @@ object Form1: TForm1 object Panel1: TPanel Left = 0 Height = 74 - Top = 0 + Top = 26 Width = 874 Align = alTop BevelOuter = bvNone @@ -126,10 +126,10 @@ object Form1: TForm1 end object CbLoader: TComboBox Left = 104 - Height = 28 + Height = 23 Top = 8 Width = 148 - ItemHeight = 20 + ItemHeight = 15 ItemIndex = 1 Items.Strings = ( 'Workbook' @@ -142,17 +142,17 @@ object Form1: TForm1 end object Label1: TLabel Left = 13 - Height = 20 + Height = 15 Top = 11 - Width = 73 + Width = 58 Caption = 'Loaded by:' ParentColor = False end end object InspectorTabControl: TTabControl Left = 577 - Height = 429 - Top = 74 + Height = 408 + Top = 100 Width = 297 OnChange = InspectorTabControlChange TabIndex = 0 @@ -167,12 +167,95 @@ object Form1: TForm1 end object Splitter1: TSplitter Left = 572 - Height = 429 - Top = 74 + Height = 408 + Top = 100 Width = 5 Align = alRight ResizeAnchor = akRight end + object ToolBar1: TToolBar + Left = 0 + Height = 26 + Top = 0 + Width = 874 + Caption = 'ToolBar1' + Images = ImageList1 + TabOrder = 3 + object TbBold: TToolButton + Left = 1 + Top = 2 + Caption = 'TbBold' + end + object TbItalic: TToolButton + Left = 24 + Top = 2 + Caption = 'TbItalic' + end + object TbUnderline: TToolButton + Left = 47 + Top = 2 + Caption = 'TbUnderline' + end + object TbStrikeout: TToolButton + Left = 70 + Top = 2 + Caption = 'TbStrikeout' + end + object ToolButton1: TToolButton + Left = 93 + Height = 22 + Top = 2 + Width = 5 + Caption = 'ToolButton1' + Style = tbsDivider + end + object TbHorAlignLeft: TToolButton + Left = 98 + Top = 2 + Caption = 'TbHorAlignLeft' + end + object TbHorAlignCenter: TToolButton + Left = 121 + Top = 2 + Caption = 'TbHorAlignCenter' + end + object TbHorAlignRight: TToolButton + Left = 144 + Top = 2 + Caption = 'TbHorAlignRight' + end + object ToolButton2: TToolButton + Left = 167 + Height = 22 + Top = 2 + Width = 5 + Caption = 'ToolButton2' + Style = tbsDivider + end + object TbVertAlignTop: TToolButton + Left = 172 + Top = 2 + Caption = 'TbVertAlignTop' + end + object TbVertAlignCenter: TToolButton + Left = 195 + Top = 2 + Caption = 'TbVertAlignCenter' + end + object TbVertAlignBottom: TToolButton + Left = 218 + Top = 2 + Caption = 'TbVertAlignBottom' + end + object ToolButton6: TToolButton + Left = 241 + Height = 22 + Top = 2 + Width = 5 + Caption = 'ToolButton6' + Style = tbsDivider + end + end object OpenDialog: TOpenDialog DefaultExt = '.xls' Filter = 'All spreadsheet files|*.xls;*.xlsx;*.ods;*.csv|All Excel files (*.xls, *.xlsx)|*.xls;*.xlsx|Excel XML spreadsheet (*.xlsx)|*.xlsx|Excel 97-2003 spreadsheets (*.xls)|*.xls|Excel 5 spreadsheet (*.xls)|*.xls|Excel 2.1 spreadsheets (*.xls)|*.xls|LibreOffice/OpenOffice spreadsheet (*.ods)|*.ods|Comma-delimited files (*.csv)|*.csv|Wikitable (pipes) (.wikitable_pipes)|*.wikitable_pipes' @@ -181,6 +264,7 @@ object Form1: TForm1 top = 80 end object MainMenu: TMainMenu + Images = ImageList1 left = 203 top = 80 object MnuFile: TMenuItem @@ -203,9 +287,52 @@ object Form1: TForm1 Caption = 'New Item6' end end + object MnuCells: TMenuItem + Caption = 'Cell' + object MnuFontStyle: TMenuItem + Caption = 'Font style' + object MnuBOld: TMenuItem + Caption = 'New Item14' + end + object MnuItalic: TMenuItem + Caption = 'New Item15' + end + object MnuUnderline: TMenuItem + Caption = 'New Item16' + end + object MnuStrikeout: TMenuItem + Caption = 'New Item17' + end + end + object MnuHorAlignment: TMenuItem + Caption = 'Horizontal alignment' + object MnuHorAlignLeft: TMenuItem + Caption = 'New Item12' + end + object MnuHorAlignCenter: TMenuItem + Caption = 'New Item14' + end + object MnuHorAlignRight: TMenuItem + Caption = 'New Item13' + end + end + object MnuVertAlignment: TMenuItem + Caption = 'Vertical alignment' + object MnuVertAlignTop: TMenuItem + Caption = 'New Item19' + end + object MnuVertAlignCenter: TMenuItem + Caption = 'New Item20' + end + object MnuVertAlignBottom: TMenuItem + Caption = 'New Item21' + end + end + end end end object ActionList: TActionList + Images = ImageList1 left = 203 top = 144 object AcFileExit: TFileExit @@ -214,4 +341,331 @@ object Form1: TForm1 Hint = 'Exit' end end + object ImageList1: TImageList + left = 203 + top = 216 + Bitmap = { + 4C690A0000001000000010000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00777777607777 + 77CF747474FF707070EF6B6B6B7F656565AF606060EF5959599F53535310FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF007373 + 737F696969FF6A6A6ABFFFFFFF00FFFFFF005858589F545454FF4A4A4ACFFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006D6D + 6D7F656565FF636363BFFFFFFF00FFFFFF004F4F4F7F4E4E4EFF414141FFFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006767 + 677F5F5F5FFF5B5B5BBFFFFFFF004D4D4D10464646DF464646FF3838389FFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006060 + 607F595959FF535353DF4C4C4C7F454545CF444444FF363636BFFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005858 + 587F535353FF4A4A4ABFFFFFFF00FFFFFF003434349F383838FF262626CF1F1F + 1F10FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004F4F + 4F7F4D4D4DFF414141BFFFFFFF00FFFFFF002B2B2B10262626FF2D2D2DFF1717 + 1770FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004646 + 467F464646FF383838BFFFFFFF00FFFFFF00FFFFFF001C1C1CFF292929FF1010 + 107FFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003D3D + 3D7F404040FF2F2F2FCFFFFFFF00FFFFFF001B1B1B70242424FF0F0F0FEF0A0A + 0A20FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003C3C3C603434 + 34AF2D2D2DBF262626BF1F1F1F8F1919198F131313BF0D0D0D8F09090920FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF006B6B6B80656565F0606060FF595959F0535353C0FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF005E5E5EE0595959FF51515160FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF005C5C5C30575757FF4F4F4FF0FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF0054545490525252FF464646A0FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF004C4C4CE0494949FF3D3D3D50FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF004A4A4A30454545FF3C3C3CF0FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF0041414190444444FF323232A0FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00383838E0383838FF2A2A2A50FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF0036363640353535FF282828FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003434 + 34802D2D2DC0262626C01F1F1FC0191919B0FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00777777607777 + 77EF777777FF7575758FFFFFFF00FFFFFF00FFFFFF00616161AF5B5B5BFF5454 + 5470FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF007777 + 77BF747474FFFFFFFF00FFFFFF00FFFFFF00FFFFFF0059595910535353CFFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF007373 + 73BF6E6E6EFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004A4A4ABFFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006D6D + 6DBF686868FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00414141BFFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006767 + 67BF616161FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00383838BFFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006060 + 60BF595959FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002F2F2FBFFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005858 + 58BF515151FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00262626BFFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004F4F + 4F8F4B4B4BFF41414150FFFFFF00FFFFFF00FFFFFF00242424401E1E1E8FFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004646 + 46203F3F3FEF383838CF31313120FFFFFF00232323401C1C1CCF16161620FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00363636202F2F2F9F282828BF212121BF1B1B1B8F14141430FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002B2B + 2BFF242424FF1E1E1EFF171717FF121212FF0C0C0CFF070707FF030303FFFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF0074747411707070996B6B6B666565657760606099595959BBFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF006E6E6EEE6A6A6A77FFFFFF00FFFFFF0058585877515151FFFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006D6D + 6D66666666FF63636388FFFFFF00FFFFFF00FFFFFF00484848BBFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006767 + 6744606060FF5B5B5BFF545454994D4D4D33FFFFFF003F3F3F44FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00595959BB555555FF515151FF484848FF3D3D3DCC36363644FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0077777775777777FF777777FF7777 + 77FF777777FF777777FF5F5F5FFF3C3C3CFF181818FF000000FF000000FF0000 + 00FF000000FF00000074FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004F4F + 4F11FFFFFF00FFFFFF00FFFFFF00323232662B2B2BDD323232FF1E1E1ECCFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004646 + 46663F3F3F77FFFFFF00FFFFFF00FFFFFF00FFFFFF001C1C1CFF161616DDFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003D3D + 3D66373737FF2F2F2F11FFFFFF00FFFFFF00FFFFFF00141414EE0F0F0F77FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003434 + 34662D2D2DEE262626CC1F1F1F7719191966131313770D0D0D88FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00767676FF747474FF7070 + 70FF6C6C6CFF686868FF636363FF5E5E5EFF595959FF535353FF4E4E4EFF4848 + 48FF424242FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006F6F6FFF6B6B6BFF6666 + 66FF616161FF5C5C5CFF575757FF515151FF4B4B4BFF454545FFFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00646464FF5F5F5FFF5A5A + 5AFF545454FF4F4F4FFF494949FF434343FF3D3D3DFF373737FF313131FF2B2B + 2BFF252525FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00585858FF525252FF4C4C + 4CFF464646FF404040FF3A3A3AFF343434FF2E2E2EFF282828FFFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004A4A4AFF444444FF3E3E + 3EFF383838FF323232FF2C2C2CFF262626FF202020FF1B1B1BFF161616FF1111 + 11FF0C0C0CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003C3C3CFF353535FF2F2F + 2FFF292929FF242424FF1E1E1EFF191919FF141414FF0F0F0FFFFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00767676FF747474FF7070 + 70FF6C6C6CFF686868FF636363FF5E5E5EFF595959FF535353FF4E4E4EFF4848 + 48FF424242FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006B6B6B6B6666 + 66FF616161FF5C5C5CFF575757FF515151FF4B4B4BFF454545FF3F3F3FFF3939 + 396BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00646464FF5F5F5FFF5A5A + 5AFF545454FF4F4F4FFF494949FF434343FF3D3D3DFF373737FF313131FF2B2B + 2BFF252525FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005252526B4C4C + 4CFF464646FF404040FF3A3A3AFF343434FF2E2E2EFF282828FF232323FF1D1D + 1D6BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004A4A4AFF444444FF3E3E + 3EFF383838FF323232FF2C2C2CFF262626FF202020FF1B1B1BFF161616FF1111 + 11FF0C0C0CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003535356B2F2F + 2FFF292929FF242424FF1E1E1EFF191919FF141414FF0F0F0FFF0B0B0BFF0707 + 076BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00767676FF747474FF7070 + 70FF6C6C6CFF686868FF636363FF5E5E5EFF595959FF535353FF4E4E4EFF4848 + 48FF424242FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00616161FF5C5C5CFF575757FF515151FF4B4B4BFF454545FF3F3F3FFF3939 + 39FF333333FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00646464FF5F5F5FFF5A5A + 5AFF545454FF4F4F4FFF494949FF434343FF3D3D3DFF373737FF313131FF2B2B + 2BFF252525FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00464646FF404040FF3A3A3AFF343434FF2E2E2EFF282828FF232323FF1D1D + 1DFF181818FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004A4A4AFF444444FF3E3E + 3EFF383838FF323232FF2C2C2CFF262626FF202020FF1B1B1BFF161616FF1111 + 11FF0C0C0CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00292929FF242424FF1E1E1EFF191919FF141414FF0F0F0FFF0B0B0BFF0707 + 07FF030303FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00757575FF737373FF6F6F + 6FFF6B6B6BFF676767FF626262FF5D5D5DFF585858FF525252FF4D4D4DFF4747 + 47FF414141FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006E6E6EFF6A6A6AFF6565 + 65FF606060FF5B5B5BFF565656FF505050FF4A4A4AFF444444FF3E3E3EFF3838 + 38FF323232FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00636363005E5E5E005959 + 5900535353004E4E4E0048484800424242003C3C3C0036363600303030002A2A + 2A0024242400FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0057575700515151004B4B + 4B00454545003F3F3F0039393900333333002D2D2D0027272700222222001C1C + 1C0017171700FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0049494900434343003D3D + 3D0037373700313131002B2B2B00252525001F1F1F001A1A1A00151515001111 + 11000C0C0C00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003B3B3B00343434002E2E + 2E0028282800232323001D1D1D0018181800131313000F0F0F000B0B0B000707 + 070003030300FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0075757500737373006F6F + 6F006B6B6B0067676700626262005D5D5D0058585800525252004D4D4D004747 + 470041414100FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006E6E6E006A6A6A006565 + 6500606060005B5B5B0056565600505050004A4A4A00444444003E3E3E003838 + 380032323200FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00636363FF5E5E5EFF5959 + 59FF535353FF4E4E4EFF484848FF424242FF3C3C3CFF363636FF303030FF2A2A + 2AFF242424FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00575757FF515151FF4B4B + 4BFF454545FF3F3F3FFF393939FF333333FF2D2D2DFF272727FF222222FF1C1C + 1CFF171717FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0049494900434343003D3D + 3D0037373700313131002B2B2B00252525001F1F1F001A1A1A00151515001111 + 11000C0C0C00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003B3B3B00343434002E2E + 2E0028282800232323001D1D1D0018181800131313000F0F0F000B0B0B000707 + 070003030300FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0075757500737373006F6F + 6F006B6B6B0067676700626262005D5D5D0058585800525252004D4D4D004747 + 470041414100FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006E6E6E006A6A6A006565 + 6500606060005B5B5B0056565600505050004A4A4A00444444003E3E3E003838 + 380032323200FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00636363005E5E5E005959 + 5900535353004E4E4E0048484800424242003C3C3C0036363600303030002A2A + 2A0024242400FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0057575700515151004B4B + 4B00454545003F3F3F0039393900333333002D2D2D0027272700222222001C1C + 1C0017171700FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00494949FF434343FF3D3D + 3DFF373737FF313131FF2B2B2BFF252525FF1F1F1FFF1A1A1AFF151515FF1111 + 11FF0C0C0CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003B3B3BFF343434FF2E2E + 2EFF282828FF232323FF1D1D1DFF181818FF131313FF0F0F0FFF0B0B0BFF0707 + 07FF030303FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00 + } + end end diff --git a/components/fpspreadsheet/examples/fpsctrls_no_install/main.pas b/components/fpspreadsheet/examples/fpsctrls_no_install/main.pas index 826ee22c9..1ac7d258d 100644 --- a/components/fpspreadsheet/examples/fpsctrls_no_install/main.pas +++ b/components/fpspreadsheet/examples/fpsctrls_no_install/main.pas @@ -18,8 +18,23 @@ type BtnLoad: TButton; CbLoader: TComboBox; AcFileExit: TFileExit; + ImageList1: TImageList; Label1: TLabel; MainMenu: TMainMenu; + MnuVertAlignTop: TMenuItem; + MnuVertAlignCenter: TMenuItem; + MnuVertAlignBottom: TMenuItem; + MnuVertAlignment: TMenuItem; + MnuBOld: TMenuItem; + MnuItalic: TMenuItem; + MnuUnderline: TMenuItem; + MnuStrikeout: TMenuItem; + MnuFontStyle: TMenuItem; + MnuHorAlignRight: TMenuItem; + MnuHorAlignCenter: TMenuItem; + MnuHorAlignLeft: TMenuItem; + MnuCells: TMenuItem; + MnuHorAlignment: TMenuItem; MnuFileExit: TMenuItem; MnuRenameWorksheet: TMenuItem; MnuDeleteWorksheet: TMenuItem; @@ -34,6 +49,20 @@ type SpeedButton3: TSpeedButton; Splitter1: TSplitter; InspectorTabControl: TTabControl; + ToolBar1: TToolBar; + TbBold: TToolButton; + TbItalic: TToolButton; + TbUnderline: TToolButton; + TbStrikeout: TToolButton; + ToolButton1: TToolButton; + TbHorAlignLeft: TToolButton; + TbHorAlignCenter: TToolButton; + TbHorAlignRight: TToolButton; + ToolButton2: TToolButton; + TbVertAlignTop: TToolButton; + TbVertAlignCenter: TToolButton; + TbVertAlignBottom: TToolButton; + ToolButton6: TToolButton; procedure BtnLoadClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure InspectorTabControlChange(Sender: TObject); @@ -94,7 +123,7 @@ end; procedure TForm1.FormCreate(Sender: TObject); var - actn: TAction; + actn: TCustomAction; begin WorkbookSource := TsWorkbookSource.Create(self); with WorkbookSource do begin @@ -114,7 +143,7 @@ begin begin Parent := WorkbookTabControl; Align := alClient; - Options := Options + [goEditing]; + Options := Options + [goEditing, goRowSizing, goColSizing]; TextOverflow := true; WorkbookSource := Self.WorkbookSource; end; @@ -163,6 +192,109 @@ begin end; MnuRenameWorksheet.Action := actn; + { Font styles } + actn := TsFontStyleAction.Create(self); + with TsFontStyleAction(actn) do begin + ActionList := Self.ActionList; + ImageIndex := 0; + WorkbookSource := Self.WorkbookSource; + FontStyle := fssBold; + end; + MnuBold.Action := actn; + tbBold.Action := actn; + + actn := TsFontStyleAction.Create(self); + with TsFontStyleAction(actn) do begin + ActionList := Self.ActionList; + ImageIndex := 1; + WorkbookSource := Self.WorkbookSource; + FontStyle := fssItalic; + end; + MnuItalic.Action := actn; + TbItalic.Action := actn; + + actn := TsFontStyleAction.Create(self); + with TsFontStyleAction(actn) do begin + ActionList := Self.ActionList; + ImageIndex := 2; + WorkbookSource := Self.WorkbookSource; + FontStyle := fssUnderline; + end; + MnuUnderline.Action := actn; + TbUnderline.Action := actn; + + actn := TsFontStyleAction.Create(self); + with TsFontStyleAction(actn) do begin + ActionList := Self.ActionList; + ImageIndex := 3; + WorkbookSource := Self.WorkbookSource; + FontStyle := fssStrikeout; + end; + MnuStrikeout.Action := actn; + TbStrikeout.Action := actn; + + { Horizontal alignments } + actn := TsHorAlignmentAction.Create(self); + with TsHorAlignmentAction(actn) do begin + ActionList := self.ActionList; + ImageIndex := 4; + WorkbookSource := Self.WorkbookSource; + HorAlignment := haLeft; + end; + MnuHorAlignLeft.Action := actn; + TbHorAlignLeft.Action := actn; + + actn := TsHorAlignmentAction.Create(self); + with TsHorAlignmentAction(actn) do begin + ActionList := self.ActionList; + ImageIndex := 5; + WorkbookSource := Self.WorkbookSource; + HorAlignment := haCenter; + end; + MnuHorAlignCenter.Action := actn; + TbHorAlignCenter.Action := actn; + + actn := TsHorAlignmentAction.Create(self); + with TsHorAlignmentAction(actn) do begin + ActionList := self.ActionList; + ImageIndex := 6; + WorkbookSource := Self.WorkbookSource; + HorAlignment := haRight; + end; + MnuHorAlignRight.Action := actn; + TbHorAlignRight.Action := Actn; + + { Vertical alignments } + actn := TsVertAlignmentAction.Create(self); + with TsVertAlignmentAction(actn) do begin + ActionList := self.ActionList; + ImageIndex := 7; + WorkbookSource := Self.WorkbookSource; + VertAlignment := vaTop; + end; + MnuVertAlignTop.Action := actn; + TbVertAlignTop.Action := actn; + + actn := TsVertAlignmentAction.Create(self); + with TsVertAlignmentAction(actn) do begin + ActionList := self.ActionList; + ImageIndex := 8; + WorkbookSource := Self.WorkbookSource; + VertAlignment := vaCenter; + end; + MnuVertAlignCenter.Action := actn; + TbVertAlignCenter.Action := actn; + + actn := TsVertAlignmentAction.Create(self); + with TsVertAlignmentAction(actn) do begin + ActionList := self.ActionList; + ImageIndex := 9; + WorkbookSource := Self.WorkbookSource; + VertAlignment := vaBottom; + end; + MnuVertAlignBottom.Action := actn; + TbVertAlignBottom.Action := Actn; + end; procedure TForm1.InspectorTabControlChange(Sender: TObject); diff --git a/components/fpspreadsheet/fpsactions.pas b/components/fpspreadsheet/fpsactions.pas index 2ed11fd82..d61706a65 100644 --- a/components/fpspreadsheet/fpsactions.pas +++ b/components/fpspreadsheet/fpsactions.pas @@ -7,13 +7,15 @@ uses fpspreadsheet, fpspreadsheetctrls; type - TsSpreadsheetAction = class(TAction) + TsSpreadsheetAction = class(TCustomAction) private FWorkbookSource: TsWorkbookSource; + function GetSelection: TsCellRangeArray; function GetWorkbook: TsWorkbook; function GetWorksheet: TsWorksheet; protected procedure Notification(AComponent: TComponent; Operation: TOperation); override; + property Selection: TsCellRangeArray read GetSelection; property Worksheet: TsWorksheet read GetWorksheet; public function HandlesTarget(Target: TObject): Boolean; override; @@ -23,6 +25,7 @@ type property WorkbookSource: TsWorkbookSource read FWorkbookSource write FWorkbookSource; end; + { --- Actions related to worksheets --- } TsWorksheetAction = class(TsSpreadsheetAction) @@ -31,6 +34,20 @@ type function HandlesTarget(Target: TObject): Boolean; override; procedure UpdateTarget(Target: TObject); override; property Worksheet; + published + property Caption; + property Enabled; + property HelpContext; + property HelpKeyword; + property HelpType; + property Hint; + property ImageIndex; + property OnExecute; + property OnHint; + property OnUpdate; + property SecondaryShortCuts; + property ShortCut; + property Visible; end; TsWorksheetNameEvent = procedure (Sender: TObject; AWorksheet: TsWorksheet; @@ -72,7 +89,88 @@ type read FOnGetWorksheetName write FOnGetWorksheetName; end; - procedure Register; + + { --- Actions related to cell and cell selection formatting--- } + + TsCellFormatAction = class(TsSpreadsheetAction) + private + // + protected + procedure ApplyFormatToCell(ACell: PCell); virtual; + procedure ExtractFromCell(ACell: PCell); virtual; + public + procedure ExecuteTarget(Target: TObject); override; + function HandlesTarget(Target: TObject): Boolean; override; + procedure UpdateTarget(Target: TObject); override; + property Selection; + property Worksheet; + published + property Caption; + property Enabled; + property HelpContext; + property HelpKeyword; + property HelpType; + property Hint; + property ImageIndex; + property OnExecute; + property OnHint; + property OnUpdate; + property SecondaryShortCuts; + property ShortCut; + property Visible; + end; + + + { TsFontStyleAction } + + TsFontStyleAction = class(TsCellFormatAction) + private + FFontStyle: TsFontStyle; + procedure SetFontStyle(AValue: TsFontStyle); + protected + procedure ApplyFormatToCell(ACell: PCell); override; + procedure ExtractFromCell(ACell: PCell); override; + public + constructor Create(AOwner: TComponent); override; + published + property FontStyle: TsFontStyle read FFontStyle write SetFontStyle; + end; + + + { TsHorAlignmentAction } + + TsHorAlignmentAction = class(TsCellFormatAction) + private + FHorAlign: TsHorAlignment; + procedure SetHorAlign(AValue: TsHorAlignment); + protected + procedure ApplyFormatToCell(ACell: PCell); override; + procedure ExtractFromCell(ACell: PCell); override; + public + constructor Create(AOwner: TComponent); override; + published + property HorAlignment: TsHorAlignment read FHorAlign write SetHorAlign; + end; + + + { TsVertAlignmentAction } + + TsVertAlignmentAction = class(TsCellFormatAction) + private + FVertAlign: TsVertAlignment; + procedure SetVertAlign(AValue: TsVertAlignment); + protected + procedure ApplyFormatToCell(ACell: PCell); override; + procedure ExtractFromCell(ACell: PCell); override; + public + constructor Create(AOwner: TComponent); override; + published + property VertAlignment: TsVertAlignment read FVertAlign write SetVertAlign; + end; + + +procedure Register; + implementation @@ -82,13 +180,20 @@ uses procedure Register; begin RegisterActions('FPSpreadsheet', [ - TsWorksheetAddAction, TsWorksheetDeleteAction, TsWorksheetRenameAction + TsWorksheetAddAction, TsWorksheetDeleteAction, TsWorksheetRenameAction, + TsFontStyleAction, + TsHorAlignmentAction, TsVertAlignmentAction ], nil); end; { TsSpreadsheetAction } +function TsSpreadsheetAction.GetSelection: TsCellRangeArray; +begin + Result := Worksheet.GetSelection; +end; + function TsSpreadsheetAction.GetWorkbook: TsWorkbook; begin if FWorkbookSource <> nil then @@ -266,47 +371,183 @@ begin end; - (* - { TsSpreadsheetAction } +{ TsCellFormatAction } - TsSpreadsheetAction = class(TAction) - private - FWorkbookSource: TsWorkbookSource; - function GetWorkbook: TsWorkbook; - function GetWorksheet: TsWorksheet; - procedure SetWorkbookLink(AValue: TsWorkbookSource); - protected - procedure Notification(AComponent: TComponent; Operation: TOperation); override; - procedure UpdateCell; virtual; - procedure UpdateWorkbook; virtual; - procedure UpdateWorksheet; virtual; - public - destructor Destroy; override; - procedure ListenerNotification(AChangedItems: TsNotificationItems; - AData: Pointer = nil); - property Workbook: TsWorkbook read GetWorkbook; - property Worksheet: TsWorksheet read GetWorksheet; - published - property WorkbookLink: TsWorkbookSource read FWorkbookSource write SetWorkbookLink; +{ Copies the format item for which the action is responsible to the + specified cell. Must be overridden by descendants. } +procedure TsCellFormatAction.ApplyFormatToCell(ACell: PCell); +begin +end; + +procedure TsCellFormatAction.ExecuteTarget(Target: TObject); +var + range: Integer; + r,c: Cardinal; + sel: TsCellRangeArray; + cell: PCell; +begin + if not HandlesTarget(Target) then + exit; + sel := GetSelection; + for range := 0 to High(sel) do + for r := sel[range].Row1 to sel[range].Row2 do + for c := sel[range].Col1 to sel[range].Col2 do + begin + cell := Worksheet.GetCell(r, c); // Use "GetCell", empty cells will be formatted! + if cell <> nil then + ApplyFormatToCell(cell); + end; +end; + +{ Extracts the format item for which the action is responsible from the + specified cell. Must be overridden by descendants. } +procedure TsCellFormatAction.ExtractFromCell(ACell: PCell); +begin +end; + +function TsCellFormatAction.HandlesTarget(Target: TObject): Boolean; +begin + Result := inherited HandlesTarget(Target) and (Worksheet <> nil) and (Length(GetSelection) > 0); +end; + +procedure TsCellFormatAction.UpdateTarget(Target: TObject); +var + cell: PCell; +begin + Enabled := inherited Enabled and (Worksheet <> nil) and (Length(GetSelection) > 0); + if not Enabled then + exit; + + cell := Worksheet.FindCell(Worksheet.ActiveCellRow, Worksheet.ActiveCellCol); + ExtractFromCell(cell); +end; + + +{ TsFontStyleAction } + +constructor TsFontStyleAction.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + AutoCheck := true; +end; + +procedure TsFontStyleAction.ApplyFormatToCell(ACell: PCell); +var + fnt: TsFont; + fs: TsFontStyles; +begin + fnt := Workbook.GetFont(ACell^.FontIndex); + fs := fnt.Style; + if Checked then + Include(fs, FFontStyle) + else + Exclude(fs, FFontStyle); + Worksheet.WriteFontStyle(ACell, fs); +end; + +procedure TsFontStyleAction.ExtractFromCell(ACell: PCell); +var + fnt: TsFont; + fs: TsFontStyles; +begin + if (ACell = nil) then + Checked := false + else + if (uffBold in ACell^.UsedFormattingFields) then + Checked := (FFontStyle = fssBold) + else + if (uffFont in ACell^.UsedFormattingFields) then + begin + fnt := Workbook.GetFont(ACell^.FontIndex); + Checked := (FFontStyle in fnt.Style); + end else + Checked := false; +end; + +procedure TsFontStyleAction.SetFontStyle(AValue: TsFontStyle); +begin + FFontStyle := AValue; + case AValue of + fssBold: begin Caption := 'Bold'; Hint := 'Bold font'; end; + fssItalic: begin Caption := 'Italic'; Hint := 'Italic font'; end; + fssUnderline: begin Caption := 'Underline'; Hint := 'Underlines font'; end; + fssStrikeout: begin Caption := 'Strikeout'; Hint := 'Strike-out font'; end; end; +end; - {TsWorksheetNavigateAction} - TsWorksheetNavigateAction = class(TsSpreadsheetAction) - public - function Update: Boolean; override; + +{ TsHorAlignmentAction } + +constructor TsHorAlignmentAction.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + GroupIndex := 1411122312; // Date/time when this was written + AutoCheck := true; +end; + +procedure TsHorAlignmentAction.ApplyFormatToCell(ACell: PCell); +begin + if Checked then + Worksheet.WriteHorAlignment(ACell, FHorAlign) + else + Worksheet.WriteHorAlignment(ACell, haDefault); +end; + +procedure TsHorAlignmentAction.ExtractFromCell(ACell: PCell); +begin + if (ACell = nil) or not (uffHorAlign in ACell^.UsedFormattingFields) then + Checked := false + else + Checked := ACell^.HorAlignment = FHorAlign; +end; + +procedure TsHorAlignmentAction.SetHorAlign(AValue: TsHorAlignment); +begin + FHorAlign := AValue; + case FHorAlign of + haLeft : begin Caption := 'Left'; Hint := 'Left-aligned text'; end; + haCenter : begin Caption := 'Center'; Hint := 'Centered text'; end; + haRight : begin Caption := 'Right'; Hint := 'Right-aligned text'; end; + haDefault: begin Caption := 'Default'; Hint := 'Default horizontal text alignment'; end; end; +end; - {TsNextWorksheetAction} - TsNextWorksheetAction = class(TAction) - public - function Execute: Boolean; override; + +{ TsVertAlignmentAction } + +constructor TsVertAlignmentAction.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + GroupIndex := 1411122322; // Date/time when this was written + AutoCheck := true; +end; + +procedure TsVertAlignmentAction.ApplyFormatToCell(ACell: PCell); +begin + if Checked then + Worksheet.WriteVertAlignment(ACell, FVertAlign) + else + Worksheet.WriteVertAlignment(ACell, vaDefault); +end; + +procedure TsVertAlignmentAction.ExtractFromCell(ACell: PCell); +begin + if (ACell = nil) or not (uffVertAlign in ACell^.UsedFormattingFields) then + Checked := false + else + Checked := ACell^.VertAlignment = FVertAlign; +end; + +procedure TsVertAlignmentAction.SetVertAlign(AValue: TsVertAlignment); +begin + FVertAlign := AValue; + case FVertAlign of + vaTop : begin Caption := 'Top'; Hint := 'Top-aligned text'; end; + vaCenter : begin Caption := 'Center'; Hint := 'Vertically centered text'; end; + vaBottom : begin Caption := 'Bottom'; Hint := 'Bottom-aligned text'; end; + vaDefault: begin Caption := 'Default'; Hint := 'Default vertical text alignment'; end; end; - - {TsPreviosWorksheetAction} - TsPreviousWorksheetAction = class(TAction) - public - function Execute: Boolean; override; - end; *) +end; - end. +end. diff --git a/components/fpspreadsheet/fpspreadsheetctrls.pas b/components/fpspreadsheet/fpspreadsheetctrls.pas index 841cc2521..02ee49080 100644 --- a/components/fpspreadsheet/fpspreadsheetctrls.pas +++ b/components/fpspreadsheet/fpspreadsheetctrls.pas @@ -746,6 +746,7 @@ begin begin FWorksheet.OnChangeCell := @CellChangedHandler; FWorksheet.OnSelectCell := @CellSelectedHandler; + FWorksheet.OnChangeFont := @CellChangedHandler; NotifyListeners([lniWorksheet]); SelectCell(FWorksheet.ActiveCellRow, FWorksheet.ActiveCellCol); end else