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
9 namespace AppliStation
\r
12 /// PackageListViewの表示フィルタ
\r
15 public enum PackageListViewPkgTypeFilter : uint
\r
21 All = NotInstalled | InstalledAS | InstalledSys
\r
24 public class PackageListView : ListView
\r
27 PackageListsManager pkgListMan = null;
\r
29 PackageListViewPkgTypeFilter filteringType = PackageListViewPkgTypeFilter.All;
\r
31 string filteringKeyword = null;
\r
33 [Category("Action")]
\r
34 public event EventHandler FilterUpdated;
\r
36 public PackageListView()
\r
41 /// パッケージリストのデータを設定・取得する。
\r
43 [Category("Behavior")]
\r
44 [DefaultValue(null)]
\r
45 public PackageListsManager Data
\r
47 get { return this.pkgListMan; }
\r
49 this.pkgListMan = value;
\r
58 /// 表示パッケージ種類フィルタを設定・取得する。
\r
60 [Category("Behavior")]
\r
61 [DefaultValue(PackageListViewPkgTypeFilter.All)]
\r
62 public PackageListViewPkgTypeFilter FilteringType {
\r
63 get { return filteringType; }
\r
65 if (filteringType != value) {
\r
66 filteringType = value;
\r
72 OnFilterUpdated(new EventArgs());
\r
78 /// 表示の際のフィルタリングキーワード
\r
80 [Category("Behavior")]
\r
81 [DefaultValue(typeof(string), null)]
\r
82 public string FilteringKeyword {
\r
83 get { return filteringKeyword; }
\r
85 if (filteringKeyword != value) {
\r
86 filteringKeyword = value;
\r
92 OnFilterUpdated(new EventArgs());
\r
100 public Package SelectedPackage {
\r
102 if (SelectedItems.Count > 0) {
\r
103 return (Package) (SelectedItems[0].Tag);
\r
111 /// 選択されたパッケージをイテレータとして返す
\r
113 public IEnumerable<Package> SelectedPackages {
\r
115 foreach (ListViewItem item in SelectedItems) {
\r
116 yield return (Package) item.Tag;
\r
121 #region データ領域作成メソッド群
\r
123 private ListViewItem createListViewItemForPackage(Package pkg, ImageCategory imageKey)
\r
125 string[] labels = new string[]{
\r
126 pkg.Name, pkg.Version, pkg.Summary,
\r
129 ListViewItem item = new ListViewItem(labels);
\r
131 item.ToolTipText = pkg.Summary;
\r
132 item.ImageKey = ImageCategory_ToString(imageKey);
\r
137 public void UpdateItems()
\r
139 string ImageKeyAvailable = ImageCategory_ToString(ImageCategory.Available);
\r
140 string ImageKeyAvailableNew = ImageCategory_ToString(ImageCategory.AvailableNew);
\r
141 string ImageKeyInstalled = ImageCategory_ToString(ImageCategory.Installed);
\r
142 string ImageKeySystem = ImageCategory_ToString(ImageCategory.System);
\r
143 string keyword = filteringKeyword ?? string.Empty;
\r
145 this.Items.Clear();
\r
148 if ((filteringType & PackageListViewPkgTypeFilter.NotInstalled) != 0) {
\r
149 foreach (Package pkg in pkgListMan.AvailablePkgList.Search(keyword)) {
\r
150 if (Installation.GetPreferInstallerIndex(pkg) >= 0) { // インストール可能
\r
151 bool isInstalledAS = (pkgListMan.InstalledPkgList.GetPackageForName(pkg.Name) != null);
\r
152 bool isInstalledSys = (pkgListMan.SystemInstalledPkgList.GetPackageForName(pkg.Name) != null);
\r
154 // インストールされていて、インストール済みソフトを表示しないならば、次のループへ
\r
155 if ((((filteringType & PackageListViewPkgTypeFilter.InstalledAS) == 0) && isInstalledAS) ||
\r
156 (((filteringType & PackageListViewPkgTypeFilter.InstalledSys) == 0) && isInstalledSys)) {
\r
160 ImageCategory cat = (isInstalledAS || isInstalledSys)? ImageCategory.Available : ImageCategory.AvailableNew;
\r
161 Items.Add(createListViewItemForPackage(pkg, cat));
\r
166 // AppliStationにインストール済みのパッケージ
\r
167 if ((filteringType & PackageListViewPkgTypeFilter.InstalledAS) != 0) {
\r
168 foreach (Package pkg in pkgListMan.InstalledPkgList.Search(keyword)) {
\r
169 Items.Add(createListViewItemForPackage(pkg, ImageCategory.Installed));
\r
173 // PCにインストール済みのパッケージ
\r
174 if ((filteringType & PackageListViewPkgTypeFilter.InstalledSys) != 0) {
\r
175 foreach (Package pkg in pkgListMan.SystemInstalledPkgList.Search(keyword)) {
\r
176 Items.Add(createListViewItemForPackage(pkg, ImageCategory.System));
\r
183 protected enum ImageCategory : uint {
\r
190 protected static string ImageCategory_ToString(ImageCategory cat)
\r
193 case ImageCategory.Available: return "available";
\r
194 case ImageCategory.AvailableNew: return "available-new";
\r
195 case ImageCategory.Installed: return "installed";
\r
196 case ImageCategory.System: return "sys";
\r
197 default: return string.Empty;
\r
203 protected virtual void OnFilterUpdated(EventArgs e)
\r
205 if (FilterUpdated != null) {
\r
206 FilterUpdated(this, e);
\r
212 AppliStation.Util.ListViewItemSortComparer sortComparer;
\r
214 protected override void OnColumnClick(ColumnClickEventArgs e)
\r
216 if (this.HeaderStyle == ColumnHeaderStyle.Clickable) {
\r
220 base.OnColumnClick(e);
\r
223 private void onColumnClick(ColumnClickEventArgs e)
\r
225 SortOrder order = SortOrder.None;
\r
227 if (sortComparer == null) {
\r
228 order = SortOrder.Ascending;
\r
229 sortComparer = new AppliStation.Util.ListViewItemSortComparer(e.Column, order);
\r
230 ListViewItemSorter = sortComparer;
\r
232 if (sortComparer.Column == e.Column) {
\r
233 order = (sortComparer.Order == SortOrder.Ascending)? SortOrder.Descending : SortOrder.Ascending;
\r
235 sortComparer.Order = order;
\r
237 order = sortComparer.Order;
\r
238 sortComparer.Column = e.Column;
\r
243 AppliStation.Util.NativeMethods.ColumnHeader_SetSortState(this, e.Column, order);
\r
247 // SendMessage(hWnd, LVM_SETSELECTEDCOLUMN, column, NULL);
\r
248 AppliStation.Util.NativeMethods.SendMessage(this.Handle, 0x1000+140, (uint) e.Column, 0);
\r
249 } catch (Exception) {
\r