diff --git a/.gitattributes b/.gitattributes index 3a708f79e2..614cb21fe9 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3262,6 +3262,7 @@ components/onlinepackagemanager/images/Tree_Buttons/Database.png -text svneol=un components/onlinepackagemanager/images/Tree_Buttons/Error.png -text svneol=unset#image/png components/onlinepackagemanager/images/Tree_Buttons/FileVersion.png -text svneol=unset#image/png components/onlinepackagemanager/images/Tree_Buttons/Info.png -text svneol=unset#image/png +components/onlinepackagemanager/images/Tree_Buttons/New_Package.png -text svneol=unset#image/png components/onlinepackagemanager/images/Tree_Buttons/Ok.png -text svneol=unset#image/png components/onlinepackagemanager/images/Tree_Buttons/Refresh.png -text svneol=unset#image/png components/onlinepackagemanager/images/Tree_Buttons/Refresh1.png -text svneol=unset#image/png diff --git a/components/onlinepackagemanager/images/Tree_Buttons/New_Package.png b/components/onlinepackagemanager/images/Tree_Buttons/New_Package.png new file mode 100644 index 0000000000..8a991d26b1 Binary files /dev/null and b/components/onlinepackagemanager/images/Tree_Buttons/New_Package.png differ diff --git a/components/onlinepackagemanager/opkman_mainfrm.lfm b/components/onlinepackagemanager/opkman_mainfrm.lfm index 534e6d2340..a8925bfed7 100644 --- a/components/onlinepackagemanager/opkman_mainfrm.lfm +++ b/components/onlinepackagemanager/opkman_mainfrm.lfm @@ -525,6 +525,14 @@ object MainFrm: TMainFrm Caption = 'Hide JSON' OnClick = miJSONShowClick end + object miJSONSort: TMenuItem + Caption = 'Sort by name' + OnClick = miJSONSortClick + end + object miSaveToFile: TMenuItem + Caption = 'Save to file' + OnClick = miSaveToFileClick + end end object pmCreate: TPopupMenu left = 144 @@ -546,7 +554,7 @@ object MainFrm: TMainFrm left = 64 top = 163 Bitmap = { - 4C69190000001000000010000000A38D780095806C12B3A18B9FC5B49FFEC6B5 + 4C691A0000001000000010000000A38D780095806C12B3A18B9FC5B49FFEC6B5 A0FFC6B5A0FFC6B5A0FFC6B5A1FFBEAD98E3A5917C4BFFFFFF00988674000000 0000000000000000000000000000FFEAD300AC9A886AD5C9BBF9E3D9CBFFE2D9 CAFFE2D9CAFFE2D9CAFFE3D9CAFFE0D6C8FFC3B4A4CB84715C189B8874000000 @@ -1346,7 +1354,39 @@ object MainFrm: TMainFrm B3F4A1A1A18D717171164F4F4F014F4F4F0170707016A0A0A08DB3B3B3F4B6B6 B6F56D6D6D064D4D4D004D4D4D004D4D4D004D4D4D006565650B9C9C9C877676 761F515151014D4D4D004D4D4D004D4D4D004D4D4D00505050017575751F9C9C - 9C876767670B4D4D4D004D4D4D00 + 9C876767670B4D4D4D004D4D4D00FFFFFF00DD790000FFE8DD00FFE8DD00FFE8 + DD00DD790080E08417FFE69537FFEBA658FFEEB06FFFEEB06FFFEBA658FFE695 + 37FFE08417FFDD7900BFFFFFFF00FFFFFF00DB780000FFE8DD00FFE8DD00FFE8 + DD00DB7800FFFFE8DDFFFFE8DDFFFFE8DDFFFFE8DDFFFFE8DDFFFFE8DDFFF6CC + A6FFDB7800FFDB780000FFFFFF00FFFFFF00D8770000FFE1CF00FFE1CF00D877 + 0080ECAD68FFFFE1CFFFFFE1CFFFFFE1CFFFFFE1CFFFFFE1CFFFF5C79BFFD877 + 00FFFFE1CF00D8770000FFFFFF00FFFFFF00D5760000FFD9BB00FFD9BB00D576 + 00FFFFD9BBFFFFD9BBFFFFD9BBFFFFD9BBFFFFD9BBFFF4BF8CFFD57600FFFFD9 + BB00FFD9BB00D5760000FFFFFF00FFFFFF00D2760000FFCEA400D2760080E9A2 + 52FFFFCEA4FFFFCEA4FFFFCEA4FFFFCEA4FFF4B87BFFD27600FFFFCEA400FFCE + A400FFCEA400D2760000FFFFFF00FFFFFF00CE740000FFC28A00CE7400FFFFC2 + 8AFFFFC28AFFFFC28AFFFFC28AFFF3AE67FFDA8823FFCE7400FFCE7400FFCE74 + 00FFCE7400FFCE7400BFFFFFFF00FFFFFF00CA730000CA730080E59638FFFFB7 + 6FFFFFB76FFFFFB76FFFFFCFA6FFFFE8DDFFFFE8DDFFFFE8DDFFFFE8DDFFF2CB + A6FFCA7300FFCA730000FFFFFF00FFFFFF00C6720000C67200FFF29633FFF297 + 33FFF49939FFFAA347FFFEA850FFFEA850FFFBA449FFFAA246FFF19C3EFFC672 + 00FFFFA95300C6720000FFFFFF00FFFFFF00C1700080E0871DFFEE8C1CFFEE8C + 1CFFEE8C1CFFEA8615FFE37F0BFFDD7900FFE5810EFFEF922BFFC17000FFFF9E + 3900FF9E3900C1700000FFFFFF00FFFFFF00BD6F00BFBD6F00FFBD6F00FFBD6F + 00FFBD6F00FFCE7809FFE27D05FFE8810BFFEE8919FFBD6F00FFFF932200FF93 + 2200FF932200BD6F0000FFFFFF00FFFFFF00B96E0000FF8A0E00FF840000FF84 + 0000B96E0080DC7B07FFEB8006FFED820AFFB96E00FFFF840000FF8A0E00FF8A + 0E00FF8A0E00B96E0000FFFFFF00FFFFFF00B56C0000FF840000FF840000FF84 + 0000B56C00FFEE7E00FFEC7E00FFB56C00FFDD790000DD790000FF840000FF84 + 0000FF840000B56C0000FFFFFF00FFFFFF00B26B0000FF840000FF840000B26B + 0080D97800FFEC7E00FFB26B00FFFF840000FF840000FF840000FF840000FF84 + 0000FF840000B26B0000FFFFFF00FFFFFF00AF6A0000FF840000FF840000AF6A + 00FFEB7D00FFAF6A00FFFF840000FF840000FF840000FF840000FF840000FF84 + 0000FF840000AF6A0000FFFFFF00FFFFFF00AC690000AC690000AC690080AC69 + 00FFAC6900FFAC690000AC690000AC690000AC690000AC690000AC690000AC69 + 0000AC690000AC690000FFFFFF00FFFFFF00AA690000AA690000AA6900BFAA69 + 00FFAA690000AA690000AA690000AA690000AA690000AA690000AA690000AA69 + 0000AA690000AA690000FFFFFF00 } end object imTBNor: TImageList @@ -3415,4 +3455,10 @@ object MainFrm: TMainFrm FF00FFFFFF00FFFFFF00FFFFFF00 } end + object SD: TSaveDialog + DefaultExt = '.*.json' + Filter = '*.json|*.json' + left = 248 + top = 288 + end end diff --git a/components/onlinepackagemanager/opkman_mainfrm.pas b/components/onlinepackagemanager/opkman_mainfrm.pas index 23823d8a71..551d823d5c 100644 --- a/components/onlinepackagemanager/opkman_mainfrm.pas +++ b/components/onlinepackagemanager/opkman_mainfrm.pas @@ -44,10 +44,13 @@ type cbPackageType: TComboBox; imTBDis: TImageList; MenuItem1: TMenuItem; + miSaveToFile: TMenuItem; + miJSONSort: TMenuItem; miResetRating: TMenuItem; miCopyToClpBrd: TMenuItem; miCreateRepository: TMenuItem; miCreateRepositoryPackage: TMenuItem; + SD: TSaveDialog; tbCleanUp1: TToolButton; tbOptions: TToolButton; cbAll: TCheckBox; @@ -82,7 +85,9 @@ type procedure miCopyToClpBrdClick(Sender: TObject); procedure miCreateRepositoryClick(Sender: TObject); procedure miCreateRepositoryPackageClick(Sender: TObject); + procedure miJSONSortClick(Sender: TObject); procedure miResetRatingClick(Sender: TObject); + procedure miSaveToFileClick(Sender: TObject); procedure pnToolBarResize(Sender: TObject); procedure tbCleanUpClick(Sender: TObject); procedure tbDownloadClick(Sender: TObject); @@ -920,6 +925,42 @@ begin end; end; +procedure TMainFrm.miJSONSortClick(Sender: TObject); +var + JSON: TJSONStringType; +begin + JSON := ''; + SerializablePackages.Sort; + SerializablePackages.PackagesToJSON(JSON); + mJSON.Lines.BeginUpdate; + try + mJSON.Clear; + mJSON.Text := JSON; + finally + mJSON.Lines.EndUpdate; + end; +end; + +procedure TMainFrm.miSaveToFileClick(Sender: TObject); +var + JSON: TJSONStringType; + Ms: TMemoryStream; +begin + if SD.Execute then + begin + JSON := ''; + SerializablePackages.PackagesToJSON(JSON); + Ms := TMemoryStream.Create; + try + Ms.Write(Pointer(JSON)^, Length(JSON)); + Ms.Position := 0; + Ms.SaveToFile(SD.FileName); + finally + Ms.Free; + end; + end; +end; + procedure TMainFrm.SetupControls; var I: Integer; diff --git a/components/onlinepackagemanager/opkman_serializablepackages.pas b/components/onlinepackagemanager/opkman_serializablepackages.pas index 6aa2cb11da..2c6d42a744 100644 --- a/components/onlinepackagemanager/opkman_serializablepackages.pas +++ b/components/onlinepackagemanager/opkman_serializablepackages.pas @@ -291,6 +291,7 @@ type function IsInstalledVersionOk(PackageDependency: TPackageDependency; InstalledVersion: String): Boolean; function GetPackageInstallState(const APackage: TPackage): Integer; overload; procedure DeleteDownloadedZipFiles; + procedure Sort; public property Count: Integer read GetCount; property DownloadCount: Integer read GetDownloadCount; @@ -1439,6 +1440,19 @@ begin end; end; +function SortByName(Item1, Item2: TCollectionItem): Integer; +var + Package1, Package2: TPackage; +begin + Package1 := TPackage(Item1); + Package2 := TPackage(Item2); + Result := CompareText(Package1.FDisplayName, Package2.FDisplayName); +end; + +procedure TSerializablePackages.Sort; +begin + FPackages.Sort(@SortByName); +end; function TSerializablePackages.IsDependencyOk(PackageDependency: TPackageDependency; DependencyPackage: TPackageFile): Boolean; diff --git a/components/onlinepackagemanager/opkman_visualtree.pas b/components/onlinepackagemanager/opkman_visualtree.pas index 172c648aaa..6df614dba4 100644 --- a/components/onlinepackagemanager/opkman_visualtree.pas +++ b/components/onlinepackagemanager/opkman_visualtree.pas @@ -31,7 +31,7 @@ interface uses Classes, SysUtils, Controls, Graphics, Menus, Dialogs, Forms, LCLIntf, contnrs, - PackageIntf, Buttons, Math, opkman_VirtualTrees, opkman_common, + PackageIntf, Buttons, Math, dateutils, opkman_VirtualTrees, opkman_common, opkman_serializablepackages; @@ -247,6 +247,7 @@ begin TreeOptions.MiscOptions := [toCheckSupport, toFullRepaintOnResize, toInitOnSave, toWheelPanning]; TreeOptions.PaintOptions := [toHideFocusRect, toAlwaysHideSelection, toPopupMode, toShowButtons, toShowDropmark, toShowRoot, toThemeAware]; TreeOptions.SelectionOptions := [toFullRowSelect, toRightClickSelect]; + TreeOptions.StringOptions := [toShowStaticText]; TreeOptions.AutoOptions := [toAutoTristateTracking]; OnBeforeCellPaint := @VSTBeforeCellPaint; OnChecking := @VSTChecking; @@ -322,6 +323,7 @@ begin Data^.HasUpdate := SerializablePackages.Items[I].HasUpdate; Data^.DisableInOPM := SerializablePackages.Items[I].DisableInOPM; Data^.Rating := SerializablePackages.Items[I].Rating; + Data^.RepositoryDate := SerializablePackages.Items[I].RepositoryDate; FVST.IsDisabled[Node] := Data^.DisableInOPM; Data^.DataType := 1; for J := 0 to SerializablePackages.Items[I].PackageFiles.Count - 1 do @@ -1346,7 +1348,16 @@ var begin Data := FVST.GetNodeData(Node); if Column = 0 then - ImageIndex := Data^.DataType + begin + case Data^.DataType of + 1: if DaysBetween(Now, Data^.RepositoryDate) <= 31 then + ImageIndex := 25 + else + ImageIndex := 1; + else + ImageIndex := Data^.DataType + end; + end; end; function TVisualTree.GetDisplayString(const AStr: String): String; @@ -1374,134 +1385,149 @@ var Data: PData; begin Data := FVST.GetNodeData(Node); - if Column = 0 then + if TextType = ttStatic then begin - case Data^.DataType of - 0: CellText := Data^.Repository; - 1: if Trim(Data^.PackageDisplayName) = '' then - CellText := Data^.PackageName - else - CellText := Data^.PackageDisplayName; - 2: CellText := Data^.PackageFileName; - 3: CellText := rsMainFrm_VSTText_Description; - 4: CellText := rsMainFrm_VSTText_Author; - 5: CellText := rsMainFrm_VSTText_LazCompatibility; - 6: CellText := rsMainFrm_VSTText_FPCCompatibility; - 7: CellText := rsMainFrm_VSTText_SupportedWidgetsets; - 8: CellText := rsMainFrm_VSTText_Packagetype; - 9: CellText := rsMainFrm_VSTText_License; - 10: CellText := rsMainFrm_VSTText_Dependecies; - 11: CellText := rsMainFrm_VSTText_PackageInfo; - 12: CellText := rsMainFrm_VSTText_Category; - 13: CellText := rsMainFrm_VSTText_RepositoryFilename; - 14: CellText := rsMainFrm_VSTText_RepositoryFileSize; - 15: CellText := rsMainFrm_VSTText_RepositoryFileHash; - 16: CellText := rsMainFrm_VSTText_RepositoryFileDate; - 17: CellText := rsMainFrm_VSTText_HomePageURL; - 18: CellText := rsMainFrm_VSTText_DownloadURL; - 19: CellText := rsMainFrm_VSTText_SVNURL; - end; - end - else if Column = 1 then - begin - case Data^.DataType of - 1: case Data^.InstallState of - //0: CellText := rsMainFrm_VSTText_Install0; - 1: CellText := rsMainFrm_VSTText_Install1; - 2: CellText := rsMainFrm_VSTText_Install2; - end; - 2: begin - if Data^.InstalledVersion <> '' then - CellText := Data^.InstalledVersion - else - CellText := '-'; - end + if Column = 0 then + begin + if DaysBetween(Now, Data^.RepositoryDate) <= 31 then + CellText := '- ' + FormatDateTime('YYYY.MM.DD', Data^.RepositoryDate) else CellText := ''; end - end - else if Column = 2 then - begin - if Data^.DataType = 2 then - CellText := Data^.Version else CellText := ''; end - else if Column = 3 then + else if TextType = ttNormal then begin - case Data^.DataType of - 1: if Data^.HasUpdate then - CellText := 'NEW'; - 2: begin - if (Data^.InstalledVersion <> '') and (Data^.UpdateVersion <> '') then - CellText := Data^.UpdateVersion + if Column = 0 then + begin + case Data^.DataType of + 0: CellText := Data^.Repository; + 1: if Trim(Data^.PackageDisplayName) = '' then + CellText := Data^.PackageName else - CellText := '-'; - end + CellText := Data^.PackageDisplayName; + 2: CellText := Data^.PackageFileName; + 3: CellText := rsMainFrm_VSTText_Description; + 4: CellText := rsMainFrm_VSTText_Author; + 5: CellText := rsMainFrm_VSTText_LazCompatibility; + 6: CellText := rsMainFrm_VSTText_FPCCompatibility; + 7: CellText := rsMainFrm_VSTText_SupportedWidgetsets; + 8: CellText := rsMainFrm_VSTText_Packagetype; + 9: CellText := rsMainFrm_VSTText_License; + 10: CellText := rsMainFrm_VSTText_Dependecies; + 11: CellText := rsMainFrm_VSTText_PackageInfo; + 12: CellText := rsMainFrm_VSTText_Category; + 13: CellText := rsMainFrm_VSTText_RepositoryFilename; + 14: CellText := rsMainFrm_VSTText_RepositoryFileSize; + 15: CellText := rsMainFrm_VSTText_RepositoryFileHash; + 16: CellText := rsMainFrm_VSTText_RepositoryFileDate; + 17: CellText := rsMainFrm_VSTText_HomePageURL; + 18: CellText := rsMainFrm_VSTText_DownloadURL; + 19: CellText := rsMainFrm_VSTText_SVNURL; + end; + end + else if Column = 1 then + begin + case Data^.DataType of + 1: case Data^.InstallState of + //0: CellText := rsMainFrm_VSTText_Install0; + 1: CellText := rsMainFrm_VSTText_Install1; + 2: CellText := rsMainFrm_VSTText_Install2; + end; + 2: begin + if Data^.InstalledVersion <> '' then + CellText := Data^.InstalledVersion + else + CellText := '-'; + end + else + CellText := ''; + end + end + else if Column = 2 then + begin + if Data^.DataType = 2 then + CellText := Data^.Version else CellText := ''; end - end - else if Column = 4 then - begin - case Data^.DataType of - 0: CellText := ''; - 1: CellText := ''; - 2: case Ord(Data^.PackageState) of - 0: CellText := rsMainFrm_VSTText_PackageState0; - 1: CellText := rsMainFrm_VSTText_PackageState1; - 2: CellText := rsMainFrm_VSTText_PackageState2; - 3: begin - if not Data^.HasUpdate then - begin - if (Data^.UpdateVersion = '') then + else if Column = 3 then + begin + case Data^.DataType of + 1: if Data^.HasUpdate then + CellText := 'NEW'; + 2: begin + if (Data^.InstalledVersion <> '') and (Data^.UpdateVersion <> '') then + CellText := Data^.UpdateVersion + else + CellText := '-'; + end + else + CellText := ''; + end + end + else if Column = 4 then + begin + case Data^.DataType of + 0: CellText := ''; + 1: CellText := ''; + 2: case Ord(Data^.PackageState) of + 0: CellText := rsMainFrm_VSTText_PackageState0; + 1: CellText := rsMainFrm_VSTText_PackageState1; + 2: CellText := rsMainFrm_VSTText_PackageState2; + 3: begin + if not Data^.HasUpdate then begin - if Data^.InstalledVersion >= Data^.Version then - CellText := rsMainFrm_VSTText_PackageState4 + if (Data^.UpdateVersion = '') then + begin + if Data^.InstalledVersion >= Data^.Version then + CellText := rsMainFrm_VSTText_PackageState4 + else + CellText := rsMainFrm_VSTText_PackageState5 + end else - CellText := rsMainFrm_VSTText_PackageState5 + begin + if (Data^.InstalledVersion >= Data^.UpdateVersion) then + CellText := rsMainFrm_VSTText_PackageState4 + else + CellText := rsMainFrm_VSTText_PackageState6 + end; end else - begin - if (Data^.InstalledVersion >= Data^.UpdateVersion) then - CellText := rsMainFrm_VSTText_PackageState4 - else - CellText := rsMainFrm_VSTText_PackageState6 - end; - end - else - CellText := rsMainFrm_VSTText_PackageState6; - Data^.IsUpdated := CellText = rsMainFrm_VSTText_PackageState4; - end; - end; - 3: CellText := GetDisplayString(Data^.Description); - 4: CellText := Data^.Author; - 5: CellText := Data^.LazCompatibility; - 6: CellText := Data^.FPCCompatibility; - 7: CellText := Data^.SupportedWidgetSet; - 8: case Data^.PackageType of - ptRunAndDesignTime: CellText := rsMainFrm_VSTText_PackageType0; - ptDesignTime: CellText := rsMainFrm_VSTText_PackageType1; - ptRunTime: CellText := rsMainFrm_VSTText_PackageType2; - ptRunTimeOnly: CellText := rsMainFrm_VSTText_PackageType3; - end; - 9: CellText := GetDisplayString(Data^.License); - 10: CellText := Data^.Dependencies; - 11: CellText := ''; - 12: CellText := TranslateCategories(Data^.Category); - 13: CellText := Data^.RepositoryFileName; - 14: CellText := FormatSize(Data^.RepositoryFileSize); - 15: CellText := Data^.RepositoryFileHash; - 16: CellText := FormatDateTime('YYYY.MM.DD', Data^.RepositoryDate); - 17: CellText := Data^.HomePageURL; - 18: CellText := Data^.DownloadURL; - 19: CellText := Data^.SVNURL; - end; - end - else if Column = 5 then - begin - CellText := ''; - end + CellText := rsMainFrm_VSTText_PackageState6; + Data^.IsUpdated := CellText = rsMainFrm_VSTText_PackageState4; + end; + end; + 3: CellText := GetDisplayString(Data^.Description); + 4: CellText := Data^.Author; + 5: CellText := Data^.LazCompatibility; + 6: CellText := Data^.FPCCompatibility; + 7: CellText := Data^.SupportedWidgetSet; + 8: case Data^.PackageType of + ptRunAndDesignTime: CellText := rsMainFrm_VSTText_PackageType0; + ptDesignTime: CellText := rsMainFrm_VSTText_PackageType1; + ptRunTime: CellText := rsMainFrm_VSTText_PackageType2; + ptRunTimeOnly: CellText := rsMainFrm_VSTText_PackageType3; + end; + 9: CellText := GetDisplayString(Data^.License); + 10: CellText := Data^.Dependencies; + 11: CellText := ''; + 12: CellText := TranslateCategories(Data^.Category); + 13: CellText := Data^.RepositoryFileName; + 14: CellText := FormatSize(Data^.RepositoryFileSize); + 15: CellText := Data^.RepositoryFileHash; + 16: CellText := FormatDateTime('YYYY.MM.DD', Data^.RepositoryDate); + 17: CellText := Data^.HomePageURL; + 18: CellText := Data^.DownloadURL; + 19: CellText := Data^.SVNURL; + end; + end + else if Column = 5 then + begin + CellText := ''; + end + end; end; procedure TVisualTree.VSTHeaderClick(Sender: TVTHeader; Column: TColumnIndex; @@ -1539,66 +1565,80 @@ var Data: PData; begin Data := FVST.GetNodeData(Node); - case column of - 2: begin - if Data^.DataType = 2 then - begin - if (Data^.InstalledVersion = '') or ((Data^.InstalledVersion <> '') and (Data^.InstalledVersion < Data^.Version)) then - TargetCanvas.Font.Style := TargetCanvas.Font.Style + [fsBold] - else - TargetCanvas.Font.Style := TargetCanvas.Font.Style - [fsBold]; - end; - if Node <> Sender.FocusedNode then - TargetCanvas.Font.Color := clBlack - else - TargetCanvas.Font.Color := clWhite; - end; - 3: begin - case Data^.DataType of - 1: TargetCanvas.Font.Style := TargetCanvas.Font.Style + [fsBold]; - 2: if Data^.HasUpdate then - TargetCanvas.Font.Style := TargetCanvas.Font.Style + [fsBold] - else - TargetCanvas.Font.Style := TargetCanvas.Font.Style - [fsBold]; - end; - if Node <> Sender.FocusedNode then - TargetCanvas.Font.Color := clBlack - else - TargetCanvas.Font.Color := clWhite; - end; - 4: begin - if (FHoverNode = Node) and (FHoverColumn = Column) and ((Data^.DataType = 17) or (Data^.DataType = 18)) then - begin - TargetCanvas.Font.Style := TargetCanvas.Font.Style + [fsUnderline]; - if Node <> Sender.FocusedNode then - TargetCanvas.Font.Color := clBlue - else - TargetCanvas.Font.Color := clWhite; - end - else if (Data^.DataType = 2) and (Data^.IsUpdated) then - begin - TargetCanvas.Font.Style := TargetCanvas.Font.Style + [fsBold]; - if Node <> Sender.FocusedNode then - TargetCanvas.Font.Color := clGreen - else - TargetCanvas.Font.Color := clWhite; - end - else - begin - if Node <> Sender.FocusedNode then + if TextType = ttStatic then + begin + if Column = 0 then + begin + if DaysBetween(Now, Data^.RepositoryDate) <= 31 then + begin + TargetCanvas.Font.Style := TargetCanvas.Font.Style - [fsBold]; + TargetCanvas.Font.Color := clBlack; + end + end + end + else if TextType = ttNormal then + begin + case column of + 2: begin + if Data^.DataType = 2 then + begin + if (Data^.InstalledVersion = '') or ((Data^.InstalledVersion <> '') and (Data^.InstalledVersion < Data^.Version)) then + TargetCanvas.Font.Style := TargetCanvas.Font.Style + [fsBold] + else + TargetCanvas.Font.Style := TargetCanvas.Font.Style - [fsBold]; + end; + if Node <> Sender.FocusedNode then TargetCanvas.Font.Color := clBlack else TargetCanvas.Font.Color := clWhite; end; - end - else - begin - if Node <> Sender.FocusedNode then - TargetCanvas.Font.Color := FVST.Font.Color - else - TargetCanvas.Font.Color := clWhite; - end; - end; + 3: begin + case Data^.DataType of + 1: TargetCanvas.Font.Style := TargetCanvas.Font.Style + [fsBold]; + 2: if Data^.HasUpdate then + TargetCanvas.Font.Style := TargetCanvas.Font.Style + [fsBold] + else + TargetCanvas.Font.Style := TargetCanvas.Font.Style - [fsBold]; + end; + if Node <> Sender.FocusedNode then + TargetCanvas.Font.Color := clBlack + else + TargetCanvas.Font.Color := clWhite; + end; + 4: begin + if (FHoverNode = Node) and (FHoverColumn = Column) and ((Data^.DataType = 17) or (Data^.DataType = 18)) then + begin + TargetCanvas.Font.Style := TargetCanvas.Font.Style + [fsUnderline]; + if Node <> Sender.FocusedNode then + TargetCanvas.Font.Color := clBlue + else + TargetCanvas.Font.Color := clWhite; + end + else if (Data^.DataType = 2) and (Data^.IsUpdated) then + begin + TargetCanvas.Font.Style := TargetCanvas.Font.Style + [fsBold]; + if Node <> Sender.FocusedNode then + TargetCanvas.Font.Color := clGreen + else + TargetCanvas.Font.Color := clWhite; + end + else + begin + if Node <> Sender.FocusedNode then + TargetCanvas.Font.Color := clBlack + else + TargetCanvas.Font.Color := clWhite; + end; + end + else + begin + if Node <> Sender.FocusedNode then + TargetCanvas.Font.Color := FVST.Font.Color + else + TargetCanvas.Font.Color := clWhite; + end; + end; + end end; procedure TVisualTree.VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);