2 using System.Drawing;
\r
3 using System.Windows.Forms;
\r
4 using System.Collections.Generic;
\r
5 using System.ComponentModel;
\r
6 using NaGet.Packages;
\r
7 using NaGet.Packages.Install;
\r
8 using AppliStation.PackageInfo;
\r
10 namespace AppliStation
\r
13 /// PackageListViewの表示フィルタ
\r
16 public enum PackageListViewPkgTypeFilter
\r
22 All = NotInstalled | InstalledAS | InstalledSys
\r
25 public class PackageListView : ListView
\r
28 PackageListsManager pkgListMan = null;
\r
30 PackageListViewPkgTypeFilter filteringType = PackageListViewPkgTypeFilter.All;
\r
32 string filteringKeyword = null;
\r
34 AppliStation.Util.ListViewItemSortComparer sortComparer;
\r
36 [Category("Action")]
\r
37 public event EventHandler FilterUpdated;
\r
39 public PackageListView()
\r
41 ListViewItemSorter = sortComparer = new AppliStation.Util.ListViewItemSortComparer();
\r
45 /// パッケージリストのデータを設定・取得する。
\r
47 [Category("Behavior")]
\r
48 [DefaultValue(null)]
\r
49 public PackageListsManager Data
\r
51 get { return this.pkgListMan; }
\r
53 this.pkgListMan = value;
\r
62 /// 表示パッケージ種類フィルタを設定・取得する。
\r
64 [Category("Behavior")]
\r
65 [DefaultValue(PackageListViewPkgTypeFilter.All)]
\r
66 public PackageListViewPkgTypeFilter FilteringType {
\r
67 get { return filteringType; }
\r
69 if (filteringType != value) {
\r
70 filteringType = value;
\r
76 OnFilterUpdated(new EventArgs());
\r
82 /// 表示の際のフィルタリングキーワード
\r
84 [Category("Behavior")]
\r
85 [DefaultValue(typeof(string), null)]
\r
86 public string FilteringKeyword {
\r
87 get { return filteringKeyword; }
\r
89 if (filteringKeyword != value) {
\r
90 filteringKeyword = value;
\r
96 OnFilterUpdated(new EventArgs());
\r
102 /// 選択されたパッケージを1つ返す
\r
104 public Package SelectedPackage {
\r
106 if (SelectedItems.Count > 0) {
\r
107 return (Package) (SelectedItems[0].Tag);
\r
115 /// 選択されたパッケージをイテレータとして返す
\r
117 public IEnumerable<Package> SelectedPackages {
\r
119 foreach (ListViewItem item in SelectedItems) {
\r
120 yield return (Package) item.Tag;
\r
125 #region データ領域作成メソッド群
\r
127 private ListViewItem createListViewItemForPackage(Package pkg, ImageCategory imageKey)
\r
129 string[] labels = new string[this.Columns.Count];
\r
130 foreach (ColumnHeader header in this.Columns) {
\r
131 string tag = header.Tag as string;
\r
133 if (tag == "Name") labels[header.Index] = pkg.Name;
\r
134 if (tag == "Version") labels[header.Index] = pkg.Version;
\r
135 if (tag == "Summary") labels[header.Index] = pkg.Summary;
\r
136 if (tag == "PackageListName") labels[header.Index] = pkg.PackageListName;
\r
137 if (tag == "License") labels[header.Index] = PackageDescripter.GetLicenseValueLabel(pkg);
\r
138 if (tag == "InstallDate") {
\r
139 InstalledPackage instPkg = pkg as InstalledPackage;
\r
140 if (instPkg != null && instPkg.UninstallInfo.InstallDate.HasValue) {
\r
141 labels[header.Index] = instPkg.UninstallInfo.InstallDate.Value.ToShortDateString();
\r
146 ListViewItem item = new ListViewItem(labels);
\r
148 item.ToolTipText = pkg.Summary;
\r
149 item.ImageKey = ImageCategory_ToString(imageKey);
\r
154 public void UpdateItems()
\r
156 string ImageKeyAvailable = ImageCategory_ToString(ImageCategory.Available);
\r
157 string ImageKeyAvailableNew = ImageCategory_ToString(ImageCategory.AvailableNew);
\r
158 string ImageKeyInstalled = ImageCategory_ToString(ImageCategory.Installed);
\r
159 string ImageKeySystem = ImageCategory_ToString(ImageCategory.System);
\r
160 string keyword = filteringKeyword ?? string.Empty;
\r
162 this.BeginUpdate();
\r
163 this.Items.Clear();
\r
166 if ((filteringType & PackageListViewPkgTypeFilter.NotInstalled) != 0) {
\r
167 foreach (Package pkg in pkgListMan.AvailablePkgList.Search(keyword)) {
\r
168 if (Installation.GetPreferInstallerIndex(pkg) >= 0) { // インストール可能
\r
169 bool isInstalledAS = (pkgListMan.InstalledPkgList.GetPackageForName(pkg.Name) != null);
\r
170 bool isInstalledSys = (pkgListMan.SystemInstalledPkgList.GetPackageForName(pkg.Name) != null);
\r
172 // インストールされていて、インストール済みソフトを表示しないならば、次のループへ
\r
173 if ((((filteringType & PackageListViewPkgTypeFilter.InstalledAS) == 0) && isInstalledAS) ||
\r
174 (((filteringType & PackageListViewPkgTypeFilter.InstalledSys) == 0) && isInstalledSys)) {
\r
178 ImageCategory cat = (isInstalledAS || isInstalledSys)? ImageCategory.Available : ImageCategory.AvailableNew;
\r
179 Items.Add(createListViewItemForPackage(pkg, cat));
\r
184 // AppliStationにインストール済みのパッケージ
\r
185 if ((filteringType & PackageListViewPkgTypeFilter.InstalledAS) != 0) {
\r
186 foreach (Package pkg in pkgListMan.InstalledPkgList.Search(keyword)) {
\r
187 Items.Add(createListViewItemForPackage(pkg, ImageCategory.Installed));
\r
191 // PCにインストール済みのパッケージ
\r
192 if ((filteringType & PackageListViewPkgTypeFilter.InstalledSys) != 0) {
\r
193 foreach (Package pkg in pkgListMan.SystemInstalledPkgList.Search(keyword)) {
\r
194 Items.Add(createListViewItemForPackage(pkg, ImageCategory.System));
\r
203 protected enum ImageCategory {
\r
210 protected static string ImageCategory_ToString(ImageCategory cat)
\r
213 case ImageCategory.Available: return "available";
\r
214 case ImageCategory.AvailableNew: return "available-new";
\r
215 case ImageCategory.Installed: return "installed";
\r
216 case ImageCategory.System: return "sys";
\r
217 default: return string.Empty;
\r
223 protected virtual void OnFilterUpdated(EventArgs e)
\r
225 if (FilterUpdated != null) {
\r
226 FilterUpdated(this, e);
\r
232 protected void sortColumn(ColumnHeader column)
\r
234 int columnIndex = column.Index;
\r
235 SortOrder order = SortOrder.None;
\r
237 if (sortComparer.ColumnIndex == columnIndex) {
\r
238 order = (sortComparer.Order == SortOrder.Ascending)? SortOrder.Descending : SortOrder.Ascending;
\r
240 sortComparer.Order = order;
\r
242 order = SortOrder.Ascending;
\r
243 sortComparer.Column = column;
\r
247 AppliStation.Util.NativeMethods.ColumnHeader_SetSortState(this, columnIndex, order);
\r
251 // SendMessage(hWnd, LVM_SETSELECTEDCOLUMN, columnIndex, NULL);
\r
252 AppliStation.Util.NativeMethods.SendMessage(this.Handle, 0x1000+140, new IntPtr(columnIndex), IntPtr.Zero);
\r
253 } catch (Exception) {
\r
257 protected override void OnColumnClick(ColumnClickEventArgs e)
\r
259 if (this.HeaderStyle == ColumnHeaderStyle.Clickable) {
\r
260 sortColumn(this.Columns[e.Column]);
\r
263 base.OnColumnClick(e);
\r