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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1335, USA.   *
18  *                                                                         *
19  ***************************************************************************
20 
21   Author: Mattias Gaertner
22 
23   Abstract:
24     Defines TOpenLoadedPackagesDlg - The dialog let the user choose one of
25     the loaded packages.
26 }
27 unit OpenInstalledPkgDlg;
28 
29 {$mode objfpc}{$H+}
30 
31 interface
32 
33 uses
34   SysUtils,
35   // LCL
36   Forms, Controls, ComCtrls, StdCtrls, ExtCtrls, LCLType, ButtonPanel,
37   // LazUtils
38   LazStringUtils,
39   // LazControls
40   ListViewFilterEdit,
41   // IdeIntf
42   IDEHelpIntf, IDEWindowIntf, PackageIntf,
43   // IDE
44   PackageDefs, LazarusIDEStrConsts, PackageSystem;
45 
46 type
47 
48   { TOpenLoadedPackagesDlg }
49 
50   TOpenLoadedPackagesDlg = class(TForm)
51     ButtonPanel1: TButtonPanel;
52     FilterEdit: TListViewFilterEdit;
53     PkgListView: TListView;
54     HintMemo: TMemo;
55     Splitter1: TSplitter;
56     procedure FormClose(Sender: TObject; var {%H-}CloseAction: TCloseAction);
57     procedure FormCreate(Sender: TObject);
58     procedure HelpButtonClick(Sender: TObject);
59     procedure OpenButtonClick(Sender: TObject);
60     procedure PkgListViewDblClick(Sender: TObject);
61     procedure PkgListViewKeyPress(Sender: TObject; var Key: char);
62     procedure PkgListViewSelectItem(Sender: TObject; {%H-}Item: TListItem; {%H-}Selected: Boolean);
63   private
64     Package: TLazPackage;
65   public
66     procedure UpdateSelection;
67     procedure UpdatePackageList;
68   end;
69 
ShowOpenLoadedPkgDlgnull70 function ShowOpenLoadedPkgDlg(out OpenPackage: TLazPackage): TModalResult;
71 
72 implementation
73 
74 {$R *.lfm}
75 
ShowOpenLoadedPkgDlgnull76 function ShowOpenLoadedPkgDlg(out OpenPackage: TLazPackage): TModalResult;
77 var
78   Dlg: TOpenLoadedPackagesDlg;
79 begin
80   Dlg:=TOpenLoadedPackagesDlg.Create(nil);
81   try
82     Dlg.UpdatePackageList;
83     Dlg.UpdateSelection;
84     Result:=Dlg.ShowModal;
85     OpenPackage:=Dlg.Package;
86     Assert((Result=mrOK) or (OpenPackage=nil));
87   finally
88     Dlg.Free;
89   end;
90 end;
91 
92 { TOpenLoadedPackagesDlg }
93 
94 procedure TOpenLoadedPackagesDlg.PkgListViewDblClick(Sender: TObject);
95 begin
96   OpenButtonClick(Sender);
97 end;
98 
99 procedure TOpenLoadedPackagesDlg.PkgListViewKeyPress(Sender: TObject; var Key: char);
100 begin
101   if Key = Char(VK_RETURN) then
102     OpenButtonClick(Nil);
103 end;
104 
105 procedure TOpenLoadedPackagesDlg.PkgListViewSelectItem(Sender: TObject;
106   Item: TListItem; Selected: Boolean);
107 begin
108   UpdateSelection;
109 end;
110 
111 procedure TOpenLoadedPackagesDlg.UpdateSelection;
112 var
113   CurPkg: TLazPackage;
114   LI: TListItem;
115   HintStr: String;
116 begin
117   LI:=PkgListView.Selected;
118   ButtonPanel1.OKButton.Enabled:=Assigned(LI);
119   if Assigned(LI) then begin
120     CurPkg:=PackageGraph.FindPackageWithName(LI.Caption,nil);
121     if CurPkg=nil then
122       HintMemo.Text:='Package "'+LI.Caption+'" was already closed'
123     else begin
124       HintStr:=Format(lisOIPFilename, [CurPkg.Filename]);
125       if CurPkg.Missing then
126         HintStr:=Format(lisOIPThisPackageIsInstalledButTheLpkFileWasNotFound,[HintStr+LineEnding]);
127       HintStr:=Format(lisOIPDescriptionDescription, [HintStr+LineEnding,
128         BreakString(CurPkg.Description, 60, length(lisOIPDescription))]);
129       if CurPkg.License<>'' then //use same indent as previous entry
130         HintStr:=Format(lisOIPLicenseLicense, [HintStr+LineEnding,
131         BreakString(CurPkg.License, 60, length(lisOIPDescription))]);
132       HintMemo.Text:=HintStr;
133     end;
134   end else begin
135     HintMemo.Text:=lisOIPPleaseSelectAPackage;
136   end;
137 end;
138 
139 procedure TOpenLoadedPackagesDlg.OpenButtonClick(Sender: TObject);
140 begin
141   if Assigned(PkgListView.Selected) then
142   begin
143     Package:=PackageGraph.FindPackageWithName(PkgListView.Selected.Caption,nil);
144     if Assigned(Package) then
145     begin
146       ModalResult:=mrOk;
147       Exit;
148     end;
149   end;
150   ModalResult:=mrCancel;
151 end;
152 
153 procedure TOpenLoadedPackagesDlg.FormCreate(Sender: TObject);
154 var
155   NewColumn: TListColumn;
156 begin
157   Caption:=lisOIPOpenLoadedPackage;
158   IDEDialogLayoutList.ApplyLayout(Self,450,450);
159 
160   with PkgListView do begin
161     NewColumn:=Columns.Add;
162     NewColumn.Caption:=lisOIPPackageName;
163     NewColumn.Width:=150;
164     NewColumn:=Columns.Add;
165     NewColumn.Caption:=lisVersion;
166     NewColumn.Width:=80;
167     NewColumn:=Columns.Add;
168     NewColumn.Caption:=lisOIPState;
169     NewColumn.Width:=300;
170   end;
171   ButtonPanel1.OKButton.Caption:=lisOpen;
172   ButtonPanel1.OKButton.Enabled:=False;
173 end;
174 
175 procedure TOpenLoadedPackagesDlg.FormClose(Sender: TObject; var CloseAction: TCloseAction);
176 begin
177   IDEDialogLayoutList.SaveLayout(Self);
178 end;
179 
180 procedure TOpenLoadedPackagesDlg.HelpButtonClick(Sender: TObject);
181 begin
182   LazarusHelp.ShowHelpForIDEControl(Self);
183 end;
184 
PkgStateToStringnull185 function PkgStateToString(APackage: TLazPackage): string;
186 
187   procedure AddState(const s: string);
188   begin
189     if Result='' then
190       Result:=Result+s
191     else
192       Result:=Result+', '+s;
193   end;
194 
195 begin
196   Result:='';
197   if APackage.Modified then AddState(lisOIPmodified);
198   if APackage.Missing then AddState(lisOIPmissing);
199   case APackage.Installed of
200     pitStatic: AddState(lisOIPinstalledStatic);
201     pitDynamic: AddState(lisOIPinstalledDynamic);
202   end;
203   case APackage.AutoInstall of
204     pitStatic: AddState(lisOIPautoInstallStatic);
205     pitDynamic: AddState(lisOIPautoInstallDynamic);
206   end;
207   if APackage.ReadOnly then AddState(lisOIPreadonly);
208 end;
209 
210 procedure TOpenLoadedPackagesDlg.UpdatePackageList;
211 
212   procedure UpdateOnePackage(aPkg: TLazPackage);
213   var
214     ListItem: TListViewDataItem;
215   begin
216     //ListItem.Initialize(3);
217     ListItem.Data := Nil;
218     SetLength(ListItem.StringArray, 3);
219     ListItem.StringArray[0] := aPkg.Name;
220     ListItem.StringArray[1] := aPkg.Version.AsString;
221     ListItem.StringArray[2] := PkgStateToString(aPkg);
222     FilterEdit.Items.Add(ListItem);
223   end;
224 
225 var
226   i: Integer;
227 begin
228   FilterEdit.Items.Clear;
229   for i:=0 to PackageGraph.Count-1 do
230     UpdateOnePackage(PackageGraph[i]);
231   FilterEdit.InvalidateFilter;
232 end;
233 
234 end.
235 
236