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