OSDN Git Service

na-get-lib,ひとまず依存関係解決関数群を作った。
[applistation/AppliStation.git] / AppliStation / InstallationConfirmForm.cs
1 using System;\r
2 using System.Drawing;\r
3 using System.Windows.Forms;\r
4 using NaGet.Packages;\r
5 using NaGet.Packages.Install;\r
6 \r
7 namespace AppliStation\r
8 {\r
9         /// <summary>\r
10         /// Description of PackagesInstallConfirmForm.\r
11         /// </summary>\r
12         public partial class InstallationConfirmForm : Form\r
13         {\r
14                 private Installation[] installations;\r
15                 \r
16                 private PackageListsManager pkgListMan;\r
17                 \r
18                 /// <summary>\r
19                 /// パッケージインストール処理の集合\r
20                 /// </summary>\r
21                 public Installation[] Installations {\r
22                         get { return installations; }\r
23                         set {\r
24                                 installations = value;\r
25                                 \r
26                                 // 基本はサイレントインストールを行うこととする\r
27                                 foreach (Installation inst in installations) {\r
28                                         inst.Silent = inst.IsSupportsSilent;\r
29                                 }\r
30                                 \r
31                                 updateInstsListView();\r
32                         }\r
33                 }\r
34                 \r
35                 public PackageListsManager PkgListsManager {\r
36                         get { return pkgListMan; }\r
37                         set {\r
38                                 pkgListMan = value;\r
39                                 \r
40                                 updateInstsListView();\r
41                         }\r
42                 }\r
43                 \r
44                 public InstallationConfirmForm()\r
45                 {\r
46                         //\r
47                         // The InitializeComponent() call is required for Windows Forms designer support.\r
48                         //\r
49                         InitializeComponent();\r
50                         \r
51                         // 管理者権限で動いているならばrunasが必要にはならないので表示しない\r
52                         if (NaGet.Utils.IsAdministrators()) {\r
53                                 runasCheckBox.Checked = false;\r
54                                 runasCheckBox.Visible = false;\r
55                         }\r
56                         AppliStation.Util.NativeMethods.ListView_EnableVistaExplorerTheme(instsListView);\r
57                 }\r
58                 \r
59                 /// <summary>\r
60                 /// インストールリストを更新したなどで、リストの表示を更新する\r
61                 /// </summary>\r
62                 private void updateInstsListView()\r
63                 {\r
64                         instsListView.Items.Clear();\r
65                         \r
66                         if (installations != null) {\r
67                                 foreach (Installation inst in installations) {\r
68                                         Package pkg = inst.InstalledPackage;\r
69                                         \r
70                                         string[] itemData = new string[instsListView.Columns.Count];\r
71                                         itemData[nameColumnHeader.Index] = pkg.Name;\r
72                                         \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
77                                         }\r
78                                         itemData[versionColumnHeader.Index]        = pkg.Version;\r
79                                         itemData[currentVersionColumnHeader.Index] = (curPkg != null)? curPkg.Version : "-";\r
80                                         // itemData[silentInstColumnHeader.Index] の設定は instViewUpdateSilentInstallView で\r
81                                         \r
82                                         ListViewItem item = new ListViewItem(itemData);\r
83                                         item.Tag = inst;\r
84                                         item.ToolTipText = pkg.Summary;\r
85                                         item.Checked = true;\r
86                                         instViewUpdateSilentInstallView(item);\r
87                                         \r
88                                         instsListView.Items.Add(item);\r
89                                 }\r
90                         }\r
91                         \r
92                         InstsListViewItemChecked(instsListView, null);\r
93                         instsListView.Refresh();\r
94                 }\r
95                 \r
96                 /// <summary>\r
97                 /// アイテムのサイレントインストール部分の表示の更新を行う。\r
98                 /// </summary>\r
99                 /// <param name="item">対象のインストーラのリストアイテム</param>\r
100                 private void instViewUpdateSilentInstallView(ListViewItem item)\r
101                 {\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
108                 }\r
109                 \r
110                 #region instsListViewのオーナードドロー関連\r
111                 \r
112                 void InstsListViewDrawSubItem(object sender, DrawListViewSubItemEventArgs e)\r
113                 {\r
114                         if (e.Header == silentInstColumnHeader) {\r
115                                 Installation inst = ((Installation) e.Item.Tag);\r
116                                 \r
117                                 //e.DrawBackground();\r
118                                 e.Graphics.Clip.Intersect(e.Bounds);\r
119                                 \r
120                                 if (inst.Silent) {\r
121                                         AppliStation.Util.GUIUtils.Graphics_DrawCenterImage(\r
122                                                 e.Graphics,\r
123                                                 instListViewSilentInstallImageList.Images[0],\r
124                                                 e.Bounds, null);\r
125                                 } else if (inst.IsSupportsSilent) {\r
126                                         AppliStation.Util.GUIUtils.Graphics_DrawCenterImage(\r
127                                                 e.Graphics,\r
128                                                 instListViewSilentInstallImageList.Images[0],\r
129                                                 e.Bounds,\r
130                                                 AppliStation.Util.GUIUtils.GetImageAttributeToGrayOut(0.5f));\r
131                                 }\r
132                         } else {\r
133                                 e.DrawDefault = true;\r
134                         }\r
135                 }\r
136                 \r
137                 void InstsListViewDrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)\r
138                 {\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
143                                         e.Graphics,\r
144                                         instListViewSilentInstallImageList.Images[0],\r
145                                         e.Bounds, null);\r
146                         } else {\r
147                                 e.DrawDefault = true;\r
148                         }\r
149                 }\r
150                 \r
151                 #endregion\r
152                 \r
153                 void InstsListViewItemChecked(object sender, ItemCheckedEventArgs e)\r
154                 {\r
155                         System.Windows.Forms.ListView.CheckedListViewItemCollection checkeds = instsListView.CheckedItems;\r
156                         \r
157                         okButton.Enabled = checkeds != null && checkeds.Count > 0;\r
158                 }\r
159                 \r
160                 AppliStation.Util.ListViewItemSortComparer packageListViewSortComparer;\r
161 \r
162                 void InstsListViewColumnClick(object sender, ColumnClickEventArgs e)\r
163                 {\r
164                         SortOrder order = SortOrder.None;\r
165                         \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
170                         } else {\r
171                                 if (packageListViewSortComparer.Column == e.Column) {\r
172                                         order = (packageListViewSortComparer.Order == SortOrder.Ascending)? SortOrder.Descending : SortOrder.Ascending;\r
173                                         \r
174                                         packageListViewSortComparer.Order = order;\r
175                                 } else {\r
176                                         order = packageListViewSortComparer.Order;\r
177                                         packageListViewSortComparer.Column = e.Column;\r
178                                 }\r
179                                 \r
180                                 instsListView.Sort();\r
181                         }\r
182                         AppliStation.Util.NativeMethods.ColumnHeader_SetSortState(instsListView, e.Column, order);\r
183                         \r
184                         // ソート対象列の色付け\r
185                         try {\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
189                         }\r
190                 }\r
191                 \r
192                                 \r
193                 void InstsListViewContextMenuStripOpening(object sender, System.ComponentModel.CancelEventArgs e)\r
194                 {\r
195                         System.Windows.Forms.ListView.CheckedIndexCollection  chkIdxes = instsListView.CheckedIndices;\r
196                         System.Windows.Forms.ListView.SelectedIndexCollection selIdxes = instsListView.SelectedIndices;\r
197                         \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
205                                 \r
206                                 for (int i = 1; i < selIdxes.Count; i++) {\r
207                                         Installation inst = ((Installation) instsListView.Items[selIdxes[i]].Tag);\r
208                                         \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
213                                                 break;\r
214                                         }\r
215                                 }\r
216                         }\r
217                         instListToolStripSeparator.Visible = selIdxes.Count > 0;\r
218                 \r
219                         \r
220                         selectAllInstsStripMenuItem.Enabled = chkIdxes.Count < instsListView.Items.Count;\r
221                         unselectAllInstsStripMenuItem.Enabled = chkIdxes.Count > 0;\r
222                 }\r
223                 \r
224                 void SilentInstallStripMenuItemClick(object sender, EventArgs e)\r
225                 {\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
230                         }\r
231                 }\r
232                                 \r
233                 void SelectAllInstsStripMenuItemClick(object sender, EventArgs e)\r
234                 {\r
235                         foreach (ListViewItem item in instsListView.Items) {\r
236                                 item.Checked = true;\r
237                         }\r
238                         instsListView.Refresh();\r
239                 }\r
240                 \r
241                 void UnselectAllInstsStripMenuItemClick(object sender, EventArgs e)\r
242                 {\r
243                         foreach (ListViewItem item in instsListView.CheckedItems) {\r
244                                 item.Checked = false;\r
245                         }\r
246                         instsListView.Refresh();\r
247                 }\r
248                 \r
249                 /// <summary>\r
250                 /// インストールするよう選択されたパッケージの配列\r
251                 /// </summary>\r
252                 public Installation[] CheckedInstallations {\r
253                         get {\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
257                                 }\r
258                                 return insts.ToArray();\r
259                         }\r
260                 }\r
261                 \r
262                 #region runas関連\r
263                 \r
264                 /// <summary>\r
265                 /// runasで実行するか否か\r
266                 /// </summary>\r
267                 public bool UseRunas {\r
268                         set {\r
269                                 runasCheckBox.Checked = (! NaGet.Utils.IsAdministrators()) && value;\r
270                                 \r
271                                 updateUseRunas();\r
272                         }\r
273                         get {\r
274                                 return runasCheckBox.Checked;\r
275                         }\r
276                 }\r
277                 \r
278                 /// <summary>\r
279                 /// 選択されたパッケージを調査して、Runasを使うべきかいなかを返す\r
280                 /// </summary>\r
281                 public bool GetShouldUseRunas()\r
282                 {\r
283                         if (NaGet.Utils.IsAdministrators()) {\r
284                                 // 管理者権限で動いている場合は不要\r
285                                 return false;   \r
286                         } else if (NaGet.Utils.IsUACEnabled()) {\r
287                                 // UACが適用されている場合は標準では不要とする\r
288                                 return false;   \r
289                         }\r
290                         \r
291                         // ひとつでもPCターゲットなインストーラがあれば必要とする\r
292                         foreach (Installation inst in CheckedInstallations) {\r
293                                 if (inst.TargetPC) return true;\r
294                         }\r
295                         // それ以外は不要\r
296                         return false;\r
297                 }\r
298                 \r
299                 void RunasCheckBoxCheckedChanged(object sender, EventArgs e)\r
300                 {\r
301                         updateUseRunas();\r
302                 }\r
303                 \r
304                 private void updateUseRunas()\r
305                 {\r
306                         if (UseRunas) {\r
307                                 System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(InstallationConfirmForm));\r
308                                 okButton.Image = ((System.Drawing.Bitmap)(resources.GetObject("okButton.Image")));\r
309                         } else {\r
310                                 okButton.Image = null;\r
311                         }\r
312                 }\r
313                 \r
314                 #endregion\r
315                 \r
316         }\r
317 }\r