/packager/openinstalledpkgdlg.pas

http://github.com/graemeg/lazarus · Pascal · 218 lines · 161 code · 27 blank · 30 comment · 14 complexity · 43f39f43bc4bbb12e2beb9d527b7fa2b MD5 · raw file

  1. {
  2. ***************************************************************************
  3. * *
  4. * This source is free software; you can redistribute it and/or modify *
  5. * it under the terms of the GNU General Public License as published by *
  6. * the Free Software Foundation; either version 2 of the License, or *
  7. * (at your option) any later version. *
  8. * *
  9. * This code is distributed in the hope that it will be useful, but *
  10. * WITHOUT ANY WARRANTY; without even the implied warranty of *
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
  12. * General Public License for more details. *
  13. * *
  14. * A copy of the GNU General Public License is available on the World *
  15. * Wide Web at <http://www.gnu.org/copyleft/gpl.html>. You can also *
  16. * obtain it by writing to the Free Software Foundation, *
  17. * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
  18. * *
  19. ***************************************************************************
  20. Author: Mattias Gaertner
  21. Abstract:
  22. Defines TOpenLoadedPackagesDlg - The dialog let the user choose one of
  23. the loaded packages.
  24. }
  25. unit OpenInstalledPkgDlg;
  26. {$mode objfpc}{$H+}
  27. interface
  28. uses
  29. SysUtils, Forms, Controls, ComCtrls, StdCtrls, ExtCtrls, LCLProc, ButtonPanel,
  30. IDEHelpIntf, IDEWindowIntf, PackageIntf, ListViewFilterEdit,
  31. PackageDefs, LazarusIDEStrConsts, PackageSystem;
  32. type
  33. { TOpenLoadedPackagesDlg }
  34. TOpenLoadedPackagesDlg = class(TForm)
  35. ButtonPanel1: TButtonPanel;
  36. FilterEdit: TListViewFilterEdit;
  37. PkgListView: TListView;
  38. HintMemo: TMemo;
  39. Splitter1: TSplitter;
  40. procedure FormClose(Sender: TObject; var {%H-}CloseAction: TCloseAction);
  41. procedure FormCreate(Sender: TObject);
  42. procedure HelpButtonClick(Sender: TObject);
  43. procedure OpenButtonClick(Sender: TObject);
  44. procedure PkgListViewDblClick(Sender: TObject);
  45. procedure PkgListViewSelectItem(Sender: TObject; {%H-}Item: TListItem; {%H-}Selected: Boolean);
  46. private
  47. public
  48. Package: TLazPackage;
  49. procedure UpdateSelection;
  50. procedure UpdatePackageList;
  51. end;
  52. function ShowOpenLoadedPkgDlg(out OpenPackage: TLazPackage): TModalResult;
  53. implementation
  54. {$R *.lfm}
  55. function ShowOpenLoadedPkgDlg(out OpenPackage: TLazPackage): TModalResult;
  56. var
  57. Dlg: TOpenLoadedPackagesDlg;
  58. begin
  59. OpenPackage:=nil;
  60. Dlg:=TOpenLoadedPackagesDlg.Create(nil);
  61. try
  62. Dlg.UpdatePackageList;
  63. Dlg.UpdateSelection;
  64. Result:=Dlg.ShowModal;
  65. if (Result=mrOK) and (Dlg.Package<>nil) then
  66. OpenPackage:=Dlg.Package
  67. else
  68. OpenPackage:=nil;
  69. finally
  70. Dlg.Free;
  71. end;
  72. end;
  73. { TOpenLoadedPackagesDlg }
  74. procedure TOpenLoadedPackagesDlg.PkgListViewDblClick(Sender: TObject);
  75. begin
  76. OpenButtonClick(Sender);
  77. end;
  78. procedure TOpenLoadedPackagesDlg.PkgListViewSelectItem(Sender: TObject;
  79. Item: TListItem; Selected: Boolean);
  80. begin
  81. UpdateSelection;
  82. end;
  83. procedure TOpenLoadedPackagesDlg.UpdateSelection;
  84. var
  85. CurPkg: TLazPackage;
  86. LI: TListItem;
  87. HintStr: String;
  88. begin
  89. LI:=PkgListView.Selected;
  90. ButtonPanel1.OKButton.Enabled:=Assigned(LI);
  91. if Assigned(LI) then begin
  92. CurPkg:=PackageGraph.FindPackageWithName(LI.Caption,nil);
  93. if CurPkg=nil then
  94. HintMemo.Text:='Package "'+LI.Caption+'" was already closed'
  95. else begin
  96. HintStr:=Format(lisOIPFilename, [CurPkg.Filename]);
  97. if CurPkg.Missing then
  98. HintStr:=Format(lisOIPThisPackageIsInstalledButTheLpkFileWasNotFound,[HintStr+LineEnding]);
  99. HintStr:=Format(lisOIPDescriptionDescription, [HintStr+LineEnding,
  100. BreakString(CurPkg.Description, 60, length(lisOIPDescription))]);
  101. if CurPkg.License<>'' then //use same indent as previous entry
  102. HintStr:=Format(lisOIPLicenseLicense, [HintStr+LineEnding,
  103. BreakString(CurPkg.License, 60, length(lisOIPDescription))]);
  104. HintMemo.Text:=HintStr;
  105. end;
  106. end else begin
  107. HintMemo.Text:=lisOIPPleaseSelectAPackage;
  108. end;
  109. end;
  110. procedure TOpenLoadedPackagesDlg.OpenButtonClick(Sender: TObject);
  111. begin
  112. if PkgListView.Selected=nil then exit;
  113. Package:=PackageGraph.FindPackageWithName(PkgListView.Selected.Caption,nil);
  114. if Package=nil then
  115. ModalResult:=mrCancel
  116. else
  117. ModalResult:=mrOk;
  118. end;
  119. procedure TOpenLoadedPackagesDlg.FormCreate(Sender: TObject);
  120. var
  121. NewColumn: TListColumn;
  122. begin
  123. Caption:=lisOIPOpenLoadedPackage;
  124. IDEDialogLayoutList.ApplyLayout(Self,450,450);
  125. with PkgListView do begin
  126. NewColumn:=Columns.Add;
  127. NewColumn.Caption:=lisOIPPackageName;
  128. NewColumn.Width:=150;
  129. NewColumn:=Columns.Add;
  130. NewColumn.Caption:=lisVersion;
  131. NewColumn.Width:=80;
  132. NewColumn:=Columns.Add;
  133. NewColumn.Caption:=lisOIPState;
  134. NewColumn.Width:=300;
  135. end;
  136. ButtonPanel1.OKButton.Caption:=lisOpen;
  137. ButtonPanel1.OKButton.Enabled:=False;
  138. end;
  139. procedure TOpenLoadedPackagesDlg.FormClose(Sender: TObject; var CloseAction: TCloseAction);
  140. begin
  141. IDEDialogLayoutList.SaveLayout(Self);
  142. end;
  143. procedure TOpenLoadedPackagesDlg.HelpButtonClick(Sender: TObject);
  144. begin
  145. LazarusHelp.ShowHelpForIDEControl(Self);
  146. end;
  147. function PkgStateToString(APackage: TLazPackage): string;
  148. procedure AddState(const s: string);
  149. begin
  150. if Result='' then
  151. Result:=Result+s
  152. else
  153. Result:=Result+', '+s;
  154. end;
  155. begin
  156. Result:='';
  157. if APackage.Modified then AddState(lisOIPmodified);
  158. if APackage.Missing then AddState(lisOIPmissing);
  159. case APackage.Installed of
  160. pitStatic: AddState(lisOIPinstalledStatic);
  161. pitDynamic: AddState(lisOIPinstalledDynamic);
  162. end;
  163. case APackage.AutoInstall of
  164. pitStatic: AddState(lisOIPautoInstallStatic);
  165. pitDynamic: AddState(lisOIPautoInstallDynamic);
  166. end;
  167. if APackage.ReadOnly then AddState(lisOIPreadonly);
  168. end;
  169. procedure TOpenLoadedPackagesDlg.UpdatePackageList;
  170. procedure UpdateOnePackage(aPkg: TLazPackage);
  171. var
  172. Data: TListViewDataItem;
  173. begin
  174. Data.Data := nil;
  175. SetLength(Data.StringArray, 3);
  176. Data.StringArray[0] := aPkg.Name;
  177. Data.StringArray[1] := aPkg.Version.AsString;
  178. Data.StringArray[2] := PkgStateToString(aPkg);
  179. FilterEdit.Items.Add(Data);
  180. end;
  181. var
  182. i: Integer;
  183. begin
  184. FilterEdit.Items.Clear;
  185. for i:=0 to PackageGraph.Count-1 do
  186. UpdateOnePackage(PackageGraph[i]);
  187. FilterEdit.InvalidateFilter;
  188. end;
  189. end.