using System; using System.Drawing; using System.Windows.Forms; using NaGet.Packages; namespace AppliStation { /// /// Description of PackagesInstallConfirmForm. /// public partial class PackagesInstallConfirmForm : Form { private Package[] packages; private PackageListsManager pkgListMan; /// /// パッケージの集合 /// public Package[] Packages { get { return packages; } set { packages = value; updatePackagesListView(); } } public PackageListsManager PkgListsManager { get { return pkgListMan; } set { pkgListMan = value; updatePackagesListView(); } } public PackagesInstallConfirmForm() { // // The InitializeComponent() call is required for Windows Forms designer support. // InitializeComponent(); // 管理者権限で動いているならばrunasが必要にはならないので表示しない if (NaGet.Utils.IsAdministrators()) { runasCheckBox.Checked = false; runasCheckBox.Visible = false; } } private void updatePackagesListView() { packageListView.Items.Clear(); if (packages != null && packages.Length > 0) { foreach (Package pkg in packages) { Package curPkg = null; if (pkgListMan != null) { curPkg = pkgListMan.InstalledPkgList.GetPackageForName(pkg.Name); if (curPkg == null) curPkg = pkgListMan.SystemInstalledPkgList.GetPackageForName(pkg.Name); } string curVersion = (curPkg == null)? "-" : curPkg.Version; ListViewItem item = new ListViewItem(new string[]{pkg.Name, pkg.Version, curVersion}); item.Tag = pkg; item.ToolTipText = pkg.Summary; item.Checked = true; packageListView.Items.Add(item); } } PackageListViewItemChecked(packageListView, null); packageListView.Refresh(); } void PackageListViewItemChecked(object sender, ItemCheckedEventArgs e) { System.Windows.Forms.ListView.CheckedListViewItemCollection checkeds = packageListView.CheckedItems; okButton.Enabled = checkeds != null && checkeds.Count > 0; } AppliStation.Util.ListViewItemSortComparer packageListViewSortComparer; void PackageListViewColumnClick(object sender, ColumnClickEventArgs e) { SortOrder order = SortOrder.None; if (packageListViewSortComparer == null) { order = SortOrder.Ascending; packageListViewSortComparer = new AppliStation.Util.ListViewItemSortComparer(e.Column, order); packageListView.ListViewItemSorter = packageListViewSortComparer; } else { if (packageListViewSortComparer.Column == e.Column) { order = (packageListViewSortComparer.Order == SortOrder.Ascending)? SortOrder.Descending : SortOrder.Ascending; packageListViewSortComparer.Order = order; } else { order = packageListViewSortComparer.Order; packageListViewSortComparer.Column = e.Column; } packageListView.Sort(); } AppliStation.Util.NativeMethods.ColumnHeader_SetSortState(packageListView, e.Column, order); // ソート対象列の色付け try { // SendMessage(hWnd, LVM_SETSELECTEDCOLUMN, column, NULL); AppliStation.Util.NativeMethods.SendMessage(packageListView.Handle, 0x1000+140, (uint) e.Column, 0); } catch (Exception) { } } void PackageListViewContextMenuStripOpening(object sender, System.ComponentModel.CancelEventArgs e) { System.Windows.Forms.ListView.CheckedIndexCollection coll = packageListView.CheckedIndices; selectAllPackagesStripMenuItem.Enabled = coll.Count < packages.Length; unselectAllPackagesStripMenuItem.Enabled = coll.Count > 0; } void SelectAllPackagesStripMenuItemClick(object sender, EventArgs e) { foreach (ListViewItem item in packageListView.Items) { item.Checked = true; } packageListView.Refresh(); } void UnselectAllPackagesStripMenuItemClick(object sender, EventArgs e) { foreach (ListViewItem item in packageListView.CheckedItems) { item.Checked = false; } packageListView.Refresh(); } /// /// インストールするよう選択されたパッケージの配列 /// public Package[] CheckedPackages { get { System.Collections.Generic.List pkgs = new System.Collections.Generic.List(); foreach (ListViewItem item in packageListView.CheckedItems) { pkgs.Add((Package) item.Tag); } return pkgs.ToArray(); } } #region runas関連 /// /// runasで実行するか否か /// public bool UseRunas { set { runasCheckBox.Checked = (! NaGet.Utils.IsAdministrators()) && value; updateUseRunas(); } get { return runasCheckBox.Checked; } } /// /// 選択されたパッケージを調査して、Runasを使うべきかいなかを返す /// public bool GetShouldUseRunas() { if (NaGet.Utils.IsAdministrators()) { // 管理者権限で動いている場合は不要 return false; } else if (NaGet.Utils.IsUACEnabled()) { // UACが適用されている場合は標準では不要とする return false; } bool useRunas = false; foreach (Package pkg in CheckedPackages) { if (pkg.Type != InstallerType.ARCHIVE) { useRunas = true; break; } } return useRunas; } void RunasCheckBoxCheckedChanged(object sender, EventArgs e) { updateUseRunas(); } private void updateUseRunas() { if (UseRunas) { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PackagesInstallConfirmForm)); okButton.Image = ((System.Drawing.Bitmap)(resources.GetObject("okButton.Image"))); } else { okButton.Image = null; } } #endregion } }