2 using System.Drawing;
\r
3 using System.Windows.Forms;
\r
4 using NaGet.Packages;
\r
5 using NaGet.Packages.Install;
\r
7 namespace AppliStation
\r
10 /// Description of PackagesInstallConfirmForm.
\r
12 public partial class InstallationConfirmForm : Form
\r
14 private Installation[] installations;
\r
16 private PackageListsManager pkgListMan;
\r
19 /// パッケージインストール処理の集合
\r
21 public Installation[] Installations {
\r
22 get { return installations; }
\r
24 installations = value;
\r
26 // 基本はサイレントインストールを行うこととする
\r
27 foreach (Installation inst in installations) {
\r
28 inst.Silent = inst.IsSupportsSilent;
\r
31 updateInstsListView();
\r
35 public PackageListsManager PkgListsManager {
\r
36 get { return pkgListMan; }
\r
40 updateInstsListView();
\r
44 public InstallationConfirmForm()
\r
47 // The InitializeComponent() call is required for Windows Forms designer support.
\r
49 InitializeComponent();
\r
51 // 管理者権限で動いているならばrunasが必要にはならないので表示しない
\r
52 if (NaGet.Utils.IsAdministrators()) {
\r
53 runasCheckBox.Checked = false;
\r
54 runasCheckBox.Visible = false;
\r
56 AppliStation.Util.NativeMethods.ListView_EnableVistaExplorerTheme(instsListView);
\r
60 /// インストールリストを更新したなどで、リストの表示を更新する
\r
62 private void updateInstsListView()
\r
64 instsListView.Items.Clear();
\r
66 if (installations != null) {
\r
67 foreach (Installation inst in installations) {
\r
68 Package pkg = inst.InstalledPackage;
\r
70 string[] itemData = new string[instsListView.Columns.Count];
\r
71 itemData[nameColumnHeader.Index] = pkg.Name;
\r
73 Package curPkg = null;
\r
74 if (pkgListMan != null) {
\r
75 curPkg = pkgListMan.InstalledPkgList.GetPackageForName(pkg.Name) ??
\r
76 pkgListMan.SystemInstalledPkgList.GetPackageForName(pkg.Name);
\r
78 itemData[versionColumnHeader.Index] = pkg.Version;
\r
79 itemData[currentVersionColumnHeader.Index] = (curPkg != null)? curPkg.Version : "-";
\r
80 // itemData[silentInstColumnHeader.Index] の設定は instViewUpdateSilentInstallView で
\r
82 ListViewItem item = new ListViewItem(itemData);
\r
84 item.ToolTipText = pkg.Summary;
\r
85 item.Checked = true;
\r
86 instViewUpdateSilentInstallView(item);
\r
88 instsListView.Items.Add(item);
\r
92 InstsListViewItemChecked(instsListView, null);
\r
93 instsListView.Refresh();
\r
97 /// アイテムのサイレントインストール部分の表示の更新を行う。
\r
99 /// <param name="item">対象のインストーラのリストアイテム</param>
\r
100 private void instViewUpdateSilentInstallView(ListViewItem item)
\r
102 Installation inst = (Installation) item.Tag;
\r
103 item.SubItems[silentInstColumnHeader.Index].Text =
\r
104 (inst.SupportsSilentOnly)? "サイレントインストールのみサポート" :
\r
105 (inst.Silent)? "サイレントインストール" :
\r
106 (inst.IsSupportsSilent)? "手動でインストール" :
\r
107 "サイレントインストールできませんので、手動でインストールします";
\r
110 #region instsListViewのオーナードドロー関連
\r
112 void InstsListViewDrawSubItem(object sender, DrawListViewSubItemEventArgs e)
\r
114 if (e.Header == silentInstColumnHeader) {
\r
115 Installation inst = ((Installation) e.Item.Tag);
\r
117 //e.DrawBackground();
\r
118 e.Graphics.Clip.Intersect(e.Bounds);
\r
121 AppliStation.Util.GUIUtils.Graphics_DrawCenterImage(
\r
123 instListViewSilentInstallImageList.Images[0],
\r
125 } else if (inst.IsSupportsSilent) {
\r
126 AppliStation.Util.GUIUtils.Graphics_DrawCenterImage(
\r
128 instListViewSilentInstallImageList.Images[0],
\r
130 AppliStation.Util.GUIUtils.GetImageAttributeToGrayOut(0.5f));
\r
133 e.DrawDefault = true;
\r
137 void InstsListViewDrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)
\r
139 if (e.Header == silentInstColumnHeader) {
\r
140 e.DrawBackground();
\r
141 e.Graphics.Clip.Intersect(e.Bounds);
\r
142 AppliStation.Util.GUIUtils.Graphics_DrawCenterImage(
\r
144 instListViewSilentInstallImageList.Images[0],
\r
147 e.DrawDefault = true;
\r
153 void InstsListViewItemChecked(object sender, ItemCheckedEventArgs e)
\r
155 System.Windows.Forms.ListView.CheckedListViewItemCollection checkeds = instsListView.CheckedItems;
\r
157 okButton.Enabled = checkeds != null && checkeds.Count > 0;
\r
160 AppliStation.Util.ListViewItemSortComparer packageListViewSortComparer;
\r
162 void InstsListViewColumnClick(object sender, ColumnClickEventArgs e)
\r
164 SortOrder order = SortOrder.None;
\r
166 if (packageListViewSortComparer == null) {
\r
167 order = SortOrder.Ascending;
\r
168 packageListViewSortComparer = new AppliStation.Util.ListViewItemSortComparer(e.Column, order);
\r
169 instsListView.ListViewItemSorter = packageListViewSortComparer;
\r
171 if (packageListViewSortComparer.Column == e.Column) {
\r
172 order = (packageListViewSortComparer.Order == SortOrder.Ascending)? SortOrder.Descending : SortOrder.Ascending;
\r
174 packageListViewSortComparer.Order = order;
\r
176 order = packageListViewSortComparer.Order;
\r
177 packageListViewSortComparer.Column = e.Column;
\r
180 instsListView.Sort();
\r
182 AppliStation.Util.NativeMethods.ColumnHeader_SetSortState(instsListView, e.Column, order);
\r
186 // SendMessage(hWnd, LVM_SETSELECTEDCOLUMN, column, NULL);
\r
187 AppliStation.Util.NativeMethods.SendMessage(instsListView.Handle, 0x1000+140, (uint) e.Column, 0);
\r
188 } catch (Exception) {
\r
193 void InstsListViewContextMenuStripOpening(object sender, System.ComponentModel.CancelEventArgs e)
\r
195 System.Windows.Forms.ListView.CheckedIndexCollection chkIdxes = instsListView.CheckedIndices;
\r
196 System.Windows.Forms.ListView.SelectedIndexCollection selIdxes = instsListView.SelectedIndices;
\r
198 silentInstallStripMenuItem.Visible = selIdxes.Count > 0;
\r
199 if (selIdxes.Count > 0) {
\r
200 Installation inst0th = ((Installation) instsListView.Items[selIdxes[0]].Tag);
\r
201 bool bChecked = inst0th.Silent;
\r
202 bool bEnabled = (inst0th.IsSupportsSilent && (!inst0th.SupportsSilentOnly));
\r
203 silentInstallStripMenuItem.Checked = bChecked;
\r
204 silentInstallStripMenuItem.Enabled = bEnabled;
\r
206 for (int i = 1; i < selIdxes.Count; i++) {
\r
207 Installation inst = ((Installation) instsListView.Items[selIdxes[i]].Tag);
\r
209 if ( (bChecked != inst.Silent) ||
\r
210 (bEnabled != (inst.IsSupportsSilent && (!inst.SupportsSilentOnly))) ) {
\r
211 silentInstallStripMenuItem.CheckState = CheckState.Indeterminate;
\r
212 silentInstallStripMenuItem.Enabled = false;
\r
217 instListToolStripSeparator.Visible = selIdxes.Count > 0;
\r
220 selectAllInstsStripMenuItem.Enabled = chkIdxes.Count < instsListView.Items.Count;
\r
221 unselectAllInstsStripMenuItem.Enabled = chkIdxes.Count > 0;
\r
224 void SilentInstallStripMenuItemClick(object sender, EventArgs e)
\r
226 bool silent = ! silentInstallStripMenuItem.Checked;
\r
227 foreach (ListViewItem item in instsListView.SelectedItems) {
\r
228 ((Installation) item.Tag).Silent = silent;
\r
229 instViewUpdateSilentInstallView(item);
\r
233 void SelectAllInstsStripMenuItemClick(object sender, EventArgs e)
\r
235 foreach (ListViewItem item in instsListView.Items) {
\r
236 item.Checked = true;
\r
238 instsListView.Refresh();
\r
241 void UnselectAllInstsStripMenuItemClick(object sender, EventArgs e)
\r
243 foreach (ListViewItem item in instsListView.CheckedItems) {
\r
244 item.Checked = false;
\r
246 instsListView.Refresh();
\r
250 /// インストールするよう選択されたパッケージの配列
\r
252 public Installation[] CheckedInstallations {
\r
254 System.Collections.Generic.List<Installation> insts = new System.Collections.Generic.List<Installation>();
\r
255 foreach (ListViewItem item in instsListView.CheckedItems) {
\r
256 insts.Add((Installation) item.Tag);
\r
258 return insts.ToArray();
\r
267 public bool UseRunas {
\r
269 runasCheckBox.Checked = (! NaGet.Utils.IsAdministrators()) && value;
\r
274 return runasCheckBox.Checked;
\r
279 /// 選択されたパッケージを調査して、Runasを使うべきかいなかを返す
\r
281 public bool GetShouldUseRunas()
\r
283 if (NaGet.Utils.IsAdministrators()) {
\r
284 // 管理者権限で動いている場合は不要
\r
286 } else if (NaGet.Utils.IsUACEnabled()) {
\r
287 // UACが適用されている場合は標準では不要とする
\r
291 // ひとつでもPCターゲットなインストーラがあれば必要とする
\r
292 foreach (Installation inst in CheckedInstallations) {
\r
293 if (inst.TargetPC) return true;
\r
299 void RunasCheckBoxCheckedChanged(object sender, EventArgs e)
\r
304 private void updateUseRunas()
\r
307 System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(InstallationConfirmForm));
\r
308 okButton.Image = ((System.Drawing.Bitmap)(resources.GetObject("okButton.Image")));
\r
310 okButton.Image = null;
\r