New form for Description/License.

git-svn-id: trunk@53472 -
This commit is contained in:
balazs 2016-11-28 13:44:15 +00:00
parent 7308974a80
commit f2bb8815c5
7 changed files with 234 additions and 20 deletions

2
.gitattributes vendored
View File

@ -3304,6 +3304,8 @@ components/onlinepackagemanager/opkman_mainfrm.pas svneol=native#text/pascal
components/onlinepackagemanager/opkman_options.pas svneol=native#text/pascal
components/onlinepackagemanager/opkman_optionsfrm.lfm svneol=native#text/plain
components/onlinepackagemanager/opkman_optionsfrm.pas svneol=native#text/pascal
components/onlinepackagemanager/opkman_packagedetailsfrm.lfm svneol=native#text/plain
components/onlinepackagemanager/opkman_packagedetailsfrm.pas svneol=native#text/pascal
components/onlinepackagemanager/opkman_packagelistfrm.lfm svneol=native#text/plain
components/onlinepackagemanager/opkman_packagelistfrm.pas svneol=native#text/pascal
components/onlinepackagemanager/opkman_progressfrm.lfm svneol=native#text/plain

View File

@ -20,7 +20,7 @@
<Description Value="Online package manger"/>
<License Value="GPL"/>
<Version Major="1"/>
<Files Count="16">
<Files Count="17">
<Item1>
<Filename Value="onlinepackagemanagerintf.pas"/>
<HasRegisterProc Value="True"/>
@ -91,6 +91,10 @@
<Filename Value="opkman_categoriesfrm.pas"/>
<UnitName Value="opkman_categoriesfrm"/>
</Item16>
<Item17>
<Filename Value="opkman_packagedetailsfrm.pas"/>
<UnitName Value="opkman_packagedetailsfrm"/>
</Item17>
</Files>
<RequiredPkgs Count="2">
<Item1>

View File

@ -12,7 +12,8 @@ uses
opkman_visualtree, opkman_serializablepackages, opkman_downloader,
opkman_common, opkman_progressfrm, opkman_zipper, opkman_timer,
opkman_installer, opkman_packagelistfrm, opkman_options,
opkman_createrepositorypackage, opkman_categoriesfrm, LazarusPackageIntf;
opkman_createrepositorypackage, opkman_categoriesfrm,
opkman_packagedetailsfrm, LazarusPackageIntf;
implementation

View File

@ -51,9 +51,11 @@ resourcestring
rsMainFrm_Caption = 'packages found';
rsMainFrm_VSTHeaderColumn_PackageName = 'Packages';
rsMainFrm_VSTHeaderColumn_PackageFile = 'Package file(.lpk)';
rsMainFrm_VSTHeaderColumn_Available = 'Available';
rsMainFrm_VSTHeaderColumn_Available = 'Repository';
rsMainFrm_VSTHeaderColumn_Installed = 'Installed';
rsMainFrm_VSTHeaderColumn_Update = 'Update';
rsMainFrm_VSTHeaderColumn_Data = 'Status/Data';
rsMainFrm_VSTHeaderColumn_Button = '';
rsMainFrm_VSTText_PackageCategory = 'Package category';
rsMainFrm_VSTText_PackageStatus = 'Package status';
rsMainFrm_VSTText_Version = 'Version';
@ -110,6 +112,8 @@ resourcestring
rsMainFrm_VSTText_PackageCategory24 = 'System';
rsMainFrm_VSTText_PackageCategory25 = 'Tabbed Components';
rsMainFrm_VSTText_PackageCategory26 = 'Other';
rsMainFrm_VSTText_Desc = 'Description for package';
rsMainFrm_VSTText_Lic = 'License info for package';
rsMainFrm_cbAll_Caption = 'All/None';
rsMainFrm_cbAll_Hint = 'Check/Uncheck packages';
rsMainFrm_lbFilter_Caption = 'Filter by:';

View File

@ -0,0 +1,24 @@
object PackageDetailsFrm: TPackageDetailsFrm
Left = 455
Height = 490
Top = 264
Width = 735
BorderIcons = [biSystemMenu, biMaximize]
ClientHeight = 490
ClientWidth = 735
Color = clBtnFace
PopupMode = pmExplicit
Position = poOwnerFormCenter
LCLVersion = '1.7'
object mDetails: TMemo
Left = 0
Height = 490
Top = 0
Width = 735
Align = alClient
Color = clBtnFace
ReadOnly = True
ScrollBars = ssBoth
TabOrder = 0
end
end

View File

@ -0,0 +1,30 @@
unit opkman_packagedetailsfrm;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
type
{ TPackageDetailsFrm }
TPackageDetailsFrm = class(TForm)
mDetails: TMemo;
private
public
end;
var
PackageDetailsFrm: TPackageDetailsFrm;
implementation
{$R *.lfm}
end.

View File

@ -31,7 +31,7 @@ interface
uses
Classes, SysUtils, Controls, Graphics, Menus, Dialogs, Forms, LCLIntf, contnrs,
PackageIntf, opkman_VirtualTrees, opkman_common, opkman_serializablepackages;
PackageIntf, Buttons, opkman_VirtualTrees, opkman_common, opkman_serializablepackages;
type
@ -62,6 +62,8 @@ type
DownloadURL: String;
SVNURL: String;
IsInstalled: Boolean;
ButtonID: Integer;
Button: TSpeedButton;
end;
TFilterBy = (fbPackageName, fbPackageFileName, fbPackageCategory, fbPackageState,
@ -105,8 +107,12 @@ type
procedure VSTMouseDown(Sender: TObject; Button: TMouseButton; {%H-}Shift: TShiftState; X, Y: Integer);
procedure VSTGetHint(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex;
var LineBreakStyle: TVTTooltipLineBreakStyle; var HintText: String);
procedure VSTAfterCellPaint(Sender: TBaseVirtualTree; {%H-}TargetCanvas: TCanvas;
Node: PVirtualNode; Column: TColumnIndex; const {%H-}CellRect: TRect);
procedure VSTCollapsed(Sender: TBaseVirtualTree; {%H-}Node: PVirtualNode);
procedure VSTOnDblClick(Sender: TObject);
function IsAllChecked(const AChecking: PVirtualNode): Boolean;
procedure ButtonClick(Sender: TObject);
public
constructor Create(const AParent: TWinControl; const AImgList: TImageList;
APopupMenu: TPopupMenu);
@ -131,7 +137,7 @@ var
VisualTree: TVisualTree = nil;
implementation
uses opkman_const, opkman_options;
uses opkman_const, opkman_options, opkman_packagedetailsfrm;
{ TVisualTree }
@ -153,28 +159,46 @@ begin
DefaultText := '';
Header.AutoSizeIndex := 3;
Header.Height := 25;
with Header.Columns.Add do begin
with Header.Columns.Add do
begin
Position := 0;
Width := 250;
Text := rsMainFrm_VSTHeaderColumn_PackageName;
end;
with Header.Columns.Add do begin
with Header.Columns.Add do
begin
Position := 1;
Alignment := taCenter;
Width := 75;
Text := rsMainFrm_VSTHeaderColumn_Installed;
end;
with Header.Columns.Add do begin
with Header.Columns.Add do
begin
Position := 2;
Alignment := taCenter;
Width := 75;
Text := rsMainFrm_VSTHeaderColumn_Available;
end;
with Header.Columns.Add do begin
Position := 3;
Width := 400;
with Header.Columns.Add do
begin
Position := 3;
Alignment := taCenter;
Width := 75;
Text := rsMainFrm_VSTHeaderColumn_Update;
end;
with Header.Columns.Add do
begin
Position := 4;
Width := 280;
Text := rsMainFrm_VSTHeaderColumn_Data;
end;
with Header.Columns.Add do
begin
Position := 5;
Width := 25;
Text := rsMainFrm_VSTHeaderColumn_Button;
Options := Options - [coResizable];
end;
Header.Options := [hoAutoResize, hoColumnResize, hoRestrictDrag, hoShowSortGlyphs, hoVisible, hoAutoSpring];
Header.SortColumn := 0;
HintMode := hmHint;
@ -196,6 +220,8 @@ begin
OnMouseDown := @VSTMouseDown;
OnDblClick := @VSTOnDblClick;
OnGetHint := @VSTGetHint;
OnAfterCellPaint := @VSTAfterCellPaint;
OnCollapsed := @VSTCollapsed;
OnFreeNode := @VSTFreeNode;
end;
end;
@ -212,10 +238,11 @@ var
RootNode, Node, ChildNode, GrandChildNode: PVirtualNode;
RootData, Data, ChildData, GrandChildData: PData;
PackageFile: TPackageFile;
UniqueID: Integer;
begin
FVST.Clear;
FVST.NodeDataSize := SizeOf(TData);
UniqueID := 0;
//add repository(DataType = 0)
RootNode := FVST.AddChild(nil);
RootData := FVST.GetNodeData(RootNode);
@ -248,6 +275,17 @@ begin
GrandChildData := FVST.GetNodeData(GrandChildNode);
GrandChildData^.Description := PackageFile.Description;
GrandChildData^.DataType := 3;
GrandChildData^.Button := TSpeedButton.Create(FVST);
with GrandChildData^.Button do
begin
Inc(UniqueID);
Caption := '...';
Parent := FVST;
Visible := True;
Tag := UniqueID;
OnClick := @ButtonClick;
end;
GrandChildData^.ButtonID := UniqueID;
//add author(DataType = 4)
GrandChildNode := FVST.AddChild(ChildNode);
GrandChildData := FVST.GetNodeData(GrandChildNode);
@ -283,6 +321,17 @@ begin
GrandChildData := FVST.GetNodeData(GrandChildNode);
GrandChildData^.License := PackageFile.License;
GrandChildData^.DataType := 10;
GrandChildData^.Button := TSpeedButton.Create(FVST);
with GrandChildData^.Button do
begin
Inc(UniqueID);
Caption := '...';
Parent := FVST;
Visible := True;
Tag := UniqueID;
OnClick := @ButtonClick;
end;
GrandChildData^.ButtonID := UniqueID;
end;
//add miscellaneous(DataType = 11)
ChildNode := FVST.AddChild(Node);
@ -329,7 +378,6 @@ begin
GrandChildData := FVST.GetNodeData(GrandChildNode);
GrandChildData^.SVNURL := SerializablePackages.Items[I].SVNURL;
GrandChildData^.DataType := 19;
end;
FVST.SortTree(0, opkman_VirtualTrees.sdAscending);
FVST.Expanded[RootNode] := True;
@ -352,6 +400,99 @@ begin
end;
end;
procedure TVisualTree.ButtonClick(Sender: TObject);
var
Node, ParentNode: PVirtualNode;
Data, ParentData: PData;
ButtonID: Integer;
Text: String;
FrmCaption: String;
begin
ButtonID := (Sender as TSpeedButton).Tag;
Node := VST.GetFirst;
while Assigned(Node) do
begin
Data := VST.GetNodeData(Node);
if Data^.ButtonID = ButtonID then
begin
ParentNode := Node^.Parent;
ParentData := VST.GetNodeData(ParentNode);
case Data^.DataType of
3: begin
Text := Data^.Description;
FrmCaption := rsMainFrm_VSTText_Desc + ' "' + ParentData^.PackageFileName + '"';
end;
10: begin
Text := Data^.License;
FrmCaption := rsMainFrm_VSTText_Lic + ' "' + ParentData^.PackageFileName + '"';
end;
end;
Break;
end;
Node := VST.GetNext(Node);
end;
PackageDetailsFrm := TPackageDetailsFrm.Create(TForm(FVST.Parent.Parent));
try
PackageDetailsFrm.Caption := FrmCaption;
PackageDetailsFrm.mDetails.Text := Text;
PackageDetailsFrm.ShowModal;
finally
PackageDetailsFrm.Free;
end;
end;
procedure TVisualTree.VSTAfterCellPaint(Sender: TBaseVirtualTree;
TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
const CellRect: TRect);
var
Data: PData;
R: TRect;
Text: String;
begin
if Column = 5 then
begin
Data := FVST.GetNodeData(Node);
if Assigned(Data^.Button) then
begin
R := FVST.GetDisplayRect(Node, Column, false);
Data^.Button.Left := R.Left + 1;
Data^.Button.Width := R.Right - R.Left -2;
Data^.Button.Top := R.Top + 1;
Data^.Button.Height := R.Bottom - R.Top - 2;
case Data^.DataType of
3: Text := Data^.Description;
10: Text := Data^.License;
end;
Data^.Button.Visible := ((R.Bottom > FVST.Top) and (R.Bottom < FVST.Top + FVST.Height)) and (Trim(Text) <> '')
end;
end;
end;
procedure TVisualTree.VSTCollapsed(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
ChildNode: PVirtualNode;
ChildData: PData;
R: TRect;
Text: String;
begin
ChildNode := VST.GetFirst;
while Assigned(ChildNode) do
begin
ChildData := VST.GetNodeData(ChildNode);
if Assigned(ChildData^.Button) then
begin
case ChildData^.DataType of
3: Text := ChildData^.Description;
10: Text := ChildData^.License;
end;
R := FVST.GetDisplayRect(ChildNode, 5, false);
ChildData^.Button.Visible := ((R.Bottom > FVST.Top) and (R.Bottom < FVST.Top + FVST.Height)) and (Trim(Text) <> '')
end;
ChildNode := VST.GetNext(ChildNode);
end;
end;
procedure TVisualTree.CheckNodes(const Checked: Boolean);
var
Node: PVirtualNode;
@ -874,7 +1015,7 @@ begin
else if (Data1^.DataType = 2) and (Data1^.DataType = 2) then
Result := CompareText(Data1^.PackageFileName, Data2^.PackageFileName);
end;
3: if (Data1^.DataType = 1) and (Data1^.DataType = 1) then
4: if (Data1^.DataType = 1) and (Data1^.DataType = 1) then
Result := Ord(Data1^.PackageState) - Ord(Data2^.PackageState);
end;
end;
@ -942,6 +1083,10 @@ begin
CellText := '';
end
else if Column = 3 then
begin
CellText := '';
end
else if Column = 4 then
begin
case Data^.DataType of
0: CellText := '';
@ -981,13 +1126,17 @@ begin
18: CellText := Data^.DownloadURL;
19: CellText := Data^.SVNURL;
end;
end;
end
else if Column = 5 then
begin
CellText := '';
end
end;
procedure TVisualTree.VSTHeaderClick(Sender: TVTHeader; Column: TColumnIndex;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if (Column = 1) or (Column = 2) then
if (Column > 0) then
Exit;
if Button = mbLeft then
begin
@ -1019,7 +1168,7 @@ var
Data: PData;
begin
Data := FVST.GetNodeData(Node);
if (Column = 3) and (FHoverNode = Node) and (FHoverColumn = Column) and ((Data^.DataType = 17) or (Data^.DataType = 18)) then
if (Column = 4) and (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
@ -1027,7 +1176,7 @@ begin
else
TargetCanvas.Font.Color := clWhite;
end
else if (Column = 3) and (Data^.DataType = 2) and (Data^.IsInstalled) then
else if (Column = 4) and (Data^.DataType = 2) and (Data^.IsInstalled) then
begin
TargetCanvas.Font.Style := TargetCanvas.Font.Style + [fsBold];
if Node <> Sender.FocusedNode then
@ -1087,7 +1236,7 @@ begin
for I := 0 to VST.Header.Columns.Count - 1 do
begin
VST.Header.Columns.GetColumnBounds(I, L, R);
if (X >= L) and (X <= R) and (I = 3) then
if (X >= L) and (X <= R) and (I = 4) then
begin
FLinkClicked := True;
if (Data^.DataType = 17) and (Trim(Data^.HomePageURL) <> '') then
@ -1114,7 +1263,7 @@ var
Data: PData;
begin
Data := FVST.GetNodeData(Node);
if (Column <> 3) then
if (Column <> 4) then
Exit;
LineBreakStyle := hlbForceMultiLine;
case Data^.DataType of