OSDN Git Service

AppliStation,パフォーマンスチューニング,SendMessage引数型修正など(動作変更なし)
[applistation/AppliStation.git] / AppliStation / PackageListViewForm.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 using System.IO;\r
7 using System.Collections.Generic;\r
8 \r
9 namespace AppliStation\r
10 {\r
11         /// <summary>\r
12         /// Description of PackageListViewForm.\r
13         /// </summary>\r
14         public partial class PackageListViewForm : Form\r
15         {\r
16                 private PackageListsManager pkgListsMan = null;\r
17                 \r
18                 public PackageListViewForm()\r
19                 {\r
20                         //\r
21                         // The InitializeComponent() call is required for Windows Forms designer support.\r
22                         //\r
23                         InitializeComponent();\r
24                         \r
25                         installToolStripMenuItem.Font = new Font(installToolStripMenuItem.Font, FontStyle.Bold);\r
26                         uninstallToolStripMenuItem.Font = new Font(uninstallToolStripMenuItem.Font, FontStyle.Bold);\r
27                         \r
28                         pkgListsMan = new PackageListsManager();\r
29                         packageListView.Data = pkgListsMan;\r
30                         \r
31                         this.Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath);\r
32                         AppliStation.Util.NativeMethods.ListView_EnableVistaExplorerTheme(packageListView);\r
33                         AppliStation.Util.NativeMethods.ListView_SetDoubleBuffer(packageListView, true);\r
34                 }\r
35                 \r
36                 private void ShowInfoToDetailBoxFor(Package pkg)\r
37                 {\r
38                         detailBox.Clear();\r
39                         \r
40                         detailBox.SelectionFont = new Font(detailBox.Font.FontFamily, 12);\r
41                         detailBox.SelectedText += string.Format("{0} ({1})\r\n", pkg.Name, pkg.Version);\r
42                         if (! string.IsNullOrEmpty(pkg.Tags) ) {\r
43                                 detailBox.SelectionFont = new Font(detailBox.Font.FontFamily, 8);\r
44                                 detailBox.SelectedText += "タグ:";\r
45                                 foreach (string tag in pkg.Tags.Split(' ')) {\r
46                                         detailBox.AppendText(" ");\r
47                                         AppliStation.Util.NativeMethods.RichTextBox_AddTextLink(detailBox, tag);\r
48                                 }\r
49                                 detailBox.AppendText("\r\n");\r
50                         }\r
51                         \r
52                         // インストール済みパッケージの場合\r
53                         InstalledPackage iPkg = pkg as InstalledPackage;\r
54                         if (iPkg != null) {\r
55                                 System.Text.StringBuilder sb = new System.Text.StringBuilder();\r
56                                 if (iPkg.UninstallInfo.InstallDate != null) {\r
57                                         sb.AppendFormat("インストールした日: {0:d}  ", iPkg.UninstallInfo.InstallDate.Value);\r
58                                 }\r
59                                 if (iPkg.UninstallInfo.EstimatedSize > 0) {\r
60                                         sb.AppendFormat("サイズ: {0}  ", NaGet.Utils.FormatSize(iPkg.UninstallInfo.EstimatedSize*1024));\r
61                                 }\r
62                                 \r
63                                 if (sb.Length > 0) {\r
64                                         detailBox.SelectionFont = new Font(detailBox.Font.FontFamily, 8);\r
65                                         detailBox.SelectedText += sb.ToString();\r
66                                         detailBox.SelectedText += "\r\n";\r
67                                 }\r
68                         }\r
69                         detailBox.SelectionFont = detailBox.Font;\r
70                         if (pkg.Url != null && pkg.Url.Href != null) {\r
71                                 detailBox.SelectedText += "公式サイト: ";\r
72                                 AppliStation.Util.NativeMethods.RichTextBox_AddTextLink(detailBox, pkg.Url.Href);\r
73                                 detailBox.SelectedText += "\r\n";\r
74                         }\r
75                         detailBox.SelectedText += pkg.Summary;\r
76                 }\r
77                 \r
78                 void PackageListViewSelectedIndexChanged(object sender, EventArgs e)\r
79                 {\r
80                         updateSelectedPackages();\r
81                 }\r
82                 \r
83                 private void updateSelectedPackages()\r
84                 {\r
85                         uint installPkgCount = 0;\r
86                         uint uninstallPkgCount = 0;\r
87                         bool installBtnEnabled, uninstallBtnEnabled;\r
88                         \r
89                         foreach (Package pkg in packageListView.SelectedPackages) {\r
90                                 if (pkg is InstalledPackage) {\r
91                                         uninstallPkgCount ++;\r
92                                 } else {\r
93                                         installPkgCount ++;\r
94                                 }\r
95                         }\r
96                         uint pkgCount = installPkgCount + uninstallPkgCount;\r
97                         installBtnEnabled = (installPkgCount > 0) && (uninstallPkgCount == 0);\r
98                         uninstallBtnEnabled = (uninstallPkgCount == 1) && (installPkgCount == 0);\r
99                         \r
100                         informationToolStripDropDownButton.Visible = (pkgCount == 1);\r
101                         uninstallToolStripButton.Visible = uninstallBtnEnabled;\r
102                         installToolStripButton.Visible = installBtnEnabled;\r
103                         \r
104                         // detailBoxのメッセージ設定\r
105                         detailBox.Clear();\r
106                         switch (pkgCount) {\r
107                                 case 0:\r
108                                         int count = packageListView.Items.Count;\r
109                                         detailBox.Text = (count > 0) ? string.Format("{0}個のソフトがあります。", count)\r
110                                                 : "該当するソフトがありません。";\r
111                                         break;\r
112                                 case 1:\r
113                                         ShowInfoToDetailBoxFor(packageListView.SelectedPackage);\r
114                                         break;\r
115                                 default: // case 2 and over:\r
116                                         detailBox.Text = (installBtnEnabled)? string.Format("{0}個のソフトが選択されています。", installPkgCount) :\r
117                                                 (uninstallBtnEnabled)? string.Format("{0}個のインストール済みのソフトが選択されています。", uninstallPkgCount) :\r
118                                                 string.Format("{0}個のソフトが選択されています。\r\n(うち{1}個はインストール済み、{2}個はインストール可能)", pkgCount, uninstallPkgCount, installPkgCount);\r
119                                         break;\r
120                         }\r
121                         \r
122                         try {\r
123                                 detailBox.Select(0, 0);\r
124                                 detailBox.ScrollToCaret();\r
125                         } catch (System.Runtime.InteropServices.COMException) {\r
126                                 // ScrollToCaretでこけることがある\r
127                         }\r
128                 }\r
129 \r
130                 void PackageListViewItemActivate(object sender, EventArgs e)\r
131                 {\r
132                         Package pkg = packageListView.SelectedPackage;\r
133                         \r
134                         if (pkg != null) {\r
135                                 if (pkg is InstalledPackage) {\r
136                                         UninstallToolStripButtonClick(sender, e);\r
137                                 } else {\r
138                                         InstallToolStripButtonClick(sender, e);\r
139                                 }\r
140                         }\r
141                 }\r
142                 \r
143                 private void buildInstalledDirectoryMenuItemStripChildren(InstalledPackage pkg)\r
144                 {\r
145                         //installedDirectoryStripMenuItem.BaseFolderPath = pkg.UninstallInfo.InstallLocation;\r
146                         installedDirectoryStripMenuItem.BaseFolderPath = pkg.discoverInstalledLocation();\r
147                 }\r
148                 \r
149                 void Form_OnLoad(object sender, EventArgs e)\r
150                 {\r
151                         packageListViewImageList.Images.Add("installed", Icon.ExtractAssociatedIcon(Application.ExecutablePath));\r
152                         \r
153                         updatePackageFilterToolStripMenuItemCheckState();\r
154                         notInstalledPackageFilterToolStripMenuItem.Image = packageListViewImageList.Images["available-new"];\r
155                         installedASPackageFilterToolStripMenuItem.Image = packageListViewImageList.Images["installed"];\r
156                         installedSysPackageFilterToolStripMenuItem.Image = packageListViewImageList.Images["sys"];\r
157                         \r
158                         packageListView.UpdateItems();\r
159                         updateSelectedPackages();\r
160                 }\r
161                 \r
162                 #region PackageFilter関連\r
163                 \r
164                 /// <summary>\r
165                 /// packgageFilterToolStripのリストを更新する。\r
166                 /// </summary>\r
167                 private void updatePackageFilterToolStripMenuItemCheckState()\r
168                 {\r
169                         ToolStripMenuItem selected = getCheckedPackageFilterToolStripItem();\r
170                         \r
171                         foreach (ToolStripMenuItem item in packageFilterToolStripDropDownButton.DropDown.Items) {\r
172                                 item.Checked = (selected == item);\r
173                         }\r
174                         \r
175                         packageFilterToolStripDropDownButton.Text = selected.Text;\r
176                         packageFilterToolStripDropDownButton.Image = selected.Image;\r
177                         packageFilterToolStripDropDownButton.ToolTipText = selected.ToolTipText;\r
178                 }\r
179                 \r
180                 private ToolStripMenuItem getCheckedPackageFilterToolStripItem()\r
181                 {\r
182                         switch (packageListView.FilteringType) {\r
183                                 case PackageListViewPkgTypeFilter.NotInstalled:\r
184                                         return notInstalledPackageFilterToolStripMenuItem;\r
185                                 case PackageListViewPkgTypeFilter.InstalledAS:\r
186                                         return installedASPackageFilterToolStripMenuItem;\r
187                                 case PackageListViewPkgTypeFilter.InstalledSys:\r
188                                         return installedSysPackageFilterToolStripMenuItem;\r
189                                 default:\r
190                                         return allPackageFilterToolStripMenuItem;\r
191                         }\r
192                 }\r
193                 \r
194                 void AnyPackageFilterToolStripMenuItemClicked(object sender, EventArgs e)\r
195                 {\r
196                         if (sender == notInstalledPackageFilterToolStripMenuItem) {\r
197                                 packageListView.FilteringType = PackageListViewPkgTypeFilter.NotInstalled;\r
198                         } else if (sender == installedASPackageFilterToolStripMenuItem) {\r
199                                 packageListView.FilteringType = PackageListViewPkgTypeFilter.InstalledAS;\r
200                         } else if (sender == installedSysPackageFilterToolStripMenuItem) {\r
201                                 packageListView.FilteringType = PackageListViewPkgTypeFilter.InstalledSys;\r
202                         } else {\r
203                                 packageListView.FilteringType = PackageListViewPkgTypeFilter.All;\r
204                         }\r
205                         \r
206                         updatePackageFilterToolStripMenuItemCheckState();\r
207                         searchTextBox.FireTextChangedTrigger();\r
208                 }\r
209                 \r
210                 #endregion\r
211                 \r
212                 void DetailBoxLinkClicked(object sender, LinkClickedEventArgs e)\r
213                 {\r
214                         if (System.Text.RegularExpressions.Regex.IsMatch(e.LinkText, "^https?://")){\r
215                                 /* URLの場合はブラウザ起動 */\r
216                                 try {\r
217                                         System.Diagnostics.Process.Start(e.LinkText);\r
218                                 } catch (System.ComponentModel.Win32Exception) {\r
219                                         MessageBox.Show(string.Format("{0}を開くのに失敗しました。", e.LinkText), "ブラウザ起動エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
220                                 }\r
221                         } else {\r
222                                 /* それ以外はタグとみなして検索 */\r
223                                 searchTextBox.Text = e.LinkText;\r
224                         }\r
225                 }\r
226                 \r
227                 internal void updateActionInvoke(bool downloadPackageListsFlag)\r
228                 {\r
229                         AppliStation.Util.ExecutionProgressViewer prog = new AppliStation.Util.ExecutionProgressViewer();\r
230                         prog.Shown += delegate(object sender2, EventArgs e2) {\r
231                                 NaGet.SubCommands.NaGetUpdate tasks = new NaGet.SubCommands.NaGetUpdate(pkgListsMan, downloadPackageListsFlag);\r
232                                 prog.SetTaskSet(tasks);\r
233                                 prog.Refresh();\r
234                                 prog.StartTaskSet();\r
235                         };\r
236                         prog.Text = "リストの更新";\r
237                         prog.ShowDialog(this);\r
238                 }\r
239                         \r
240                 void UpdateToolStripMenuItemClick(object sender, EventArgs e)\r
241                 {\r
242                         updateActionInvoke(true);\r
243                         \r
244                         UpdatePackageList();\r
245                 }\r
246                 \r
247                 void LocalupdateToolStripMenuItemClick(object sender, EventArgs e)\r
248                 {\r
249                         updateActionInvoke(false);\r
250                         \r
251                         UpdatePackageList();\r
252                 }\r
253                 \r
254                 void OptionToolStripMenuItemClick(object sender, EventArgs e)\r
255                 {\r
256                         UserPrefForm userPrefForm = new UserPrefForm();\r
257                         DialogResult result = userPrefForm.ShowDialog(this);\r
258                         \r
259                         if (result == DialogResult.OK) {\r
260                                 if (userPrefForm.IsRepositoryListSettingChanged) {\r
261                                         updateActionInvoke(true);\r
262                                         UpdatePackageList();\r
263                                 }\r
264                         }\r
265                 }\r
266                 \r
267                 #region searchTextBoxまわり\r
268                 \r
269                 void SearchTextBoxKeyPress(object sender, KeyPressEventArgs e)\r
270                 {\r
271                         switch (e.KeyChar) {\r
272                                 case (char)Keys.Enter:\r
273                                         searchTextBox.FireTextChangedTrigger();\r
274                                         break;\r
275                                 case (char)Keys.Escape:\r
276                                         searchTextBox.Text = string.Empty;\r
277                                         break;\r
278                         }\r
279                 }\r
280                 \r
281                 void SearchTextBoxTextChangedTriggerFired(object sender, EventArgs e)\r
282                 {\r
283                         packageListView.FilteringKeyword = searchTextBox.Text;\r
284                 }\r
285                 \r
286                 #endregion\r
287                 \r
288                 internal void installActionInvoke(Installation[] insts)\r
289                 {\r
290                         AppliStation.Util.ExecutionProgressViewer prog = new AppliStation.Util.ExecutionProgressViewer();\r
291                         prog.Shown += delegate(object sender2, EventArgs e2) {\r
292                                 NaGet.SubCommands.NaGetInstall tasks = new NaGet.SubCommands.NaGetInstall(pkgListsMan, insts);\r
293                                 prog.SetTaskSet(tasks);\r
294                                 prog.Refresh();\r
295                                 prog.StartTaskSet();\r
296                         };\r
297                         prog.Text = string.Format("ソフトウェアのインストール");\r
298                         prog.ShowDialog(this);\r
299                 }\r
300                 \r
301                 void InstallToolStripButtonClick(object sender, EventArgs e)\r
302                 {\r
303                         InstallationConfirmForm confirm = new InstallationConfirmForm();\r
304                         confirm.PkgListsManager = pkgListsMan;\r
305                         confirm.Installations = Installation.ConvertInstallations( NaGet.Utils.IEnumerable2Array(packageListView.SelectedPackages) );\r
306                         confirm.UseRunas = confirm.GetShouldUseRunas();\r
307                         DialogResult result = confirm.ShowDialog(this);\r
308                         \r
309                         if (result == DialogResult.OK) {\r
310                                 Installation[] insts = confirm.CheckedInstallations;\r
311                                 \r
312                                 if (confirm.UseRunas) {\r
313                                         installRunasActionInvoke(insts);\r
314                                 } else {\r
315                                         installActionInvoke(insts);\r
316                                 }\r
317                                 \r
318                                 UpdatePackageList();\r
319                         }\r
320                 }\r
321                 \r
322                 public void installRunasActionInvoke(Installation[] insts)\r
323                 {\r
324                         this.setWindowEnabled(false);\r
325                         \r
326                         string tmpfileName = Path.GetTempFileName();\r
327                         try {\r
328                                 NaGet.Utils.PutSerializeObject(tmpfileName, insts);\r
329                                 \r
330                                 System.Diagnostics.ProcessStartInfo procInfo = new System.Diagnostics.ProcessStartInfo();\r
331                                 procInfo.FileName = Application.ExecutablePath;\r
332                                 procInfo.Arguments = string.Format("--noupdate --cmd=install \"--instsref={0}\"", tmpfileName);\r
333                                 procInfo.Verb = "runas";\r
334                                 procInfo.WorkingDirectory = Environment.CurrentDirectory;\r
335                                 \r
336                                 System.Diagnostics.Process hProc = System.Diagnostics.Process.Start(procInfo);\r
337                                 hProc.EnableRaisingEvents = true;\r
338                                 hProc.SynchronizingObject = this;\r
339                                 hProc.Exited += delegate(object sender, EventArgs e) {\r
340                                         UpdatePackageList();\r
341                                         \r
342                                         this.setWindowEnabled(true);\r
343                                         this.BringToFront();\r
344                                         \r
345                                         if (File.Exists(tmpfileName)) {\r
346                                                 File.Delete(tmpfileName);\r
347                                         }\r
348                                 };\r
349                         } catch (System.ComponentModel.Win32Exception ex) {\r
350                                 MessageBox.Show(ex.Message, "インストール", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
351                                 \r
352                                 if (File.Exists(tmpfileName)) {\r
353                                         File.Delete(tmpfileName);\r
354                                 }                               this.setWindowEnabled(true);\r
355                         }\r
356                 }\r
357                 \r
358                 internal void uninstallActionInvoke(InstalledPackage[] pkgs)\r
359                 {\r
360                         AppliStation.Util.ExecutionProgressViewer prog = new AppliStation.Util.ExecutionProgressViewer();\r
361                         prog.Shown += delegate(object sender2, EventArgs e2) {\r
362                                 NaGet.SubCommands.NaGetUninstall tasks = new NaGet.SubCommands.NaGetUninstall(pkgListsMan, pkgs);\r
363                                 prog.SetTaskSet(tasks);\r
364                                 prog.Refresh();\r
365                                 prog.StartTaskSet();\r
366                         };\r
367                         prog.Text = string.Format("ソフトウェアのアンインストール");\r
368                         prog.ShowDialog(this);\r
369                 }\r
370                 \r
371                 internal void uninstallRunasActionInvoke(InstalledPackage[] pkgs)\r
372                 {                       \r
373                         this.setWindowEnabled(false);\r
374                         \r
375                         string tmpfileName = Path.GetTempFileName();\r
376                         try {\r
377                                 NaGet.Utils.PutSerializeObject(tmpfileName, pkgs);\r
378                                 \r
379                                 System.Diagnostics.ProcessStartInfo procInfo = new System.Diagnostics.ProcessStartInfo();\r
380                                 procInfo.FileName = Application.ExecutablePath;\r
381                                 procInfo.Arguments = string.Format("--noupdate --cmd=uninstall \"--pkgsref={0}\"", tmpfileName);\r
382                                 procInfo.Verb = "runas";\r
383                                 procInfo.WorkingDirectory = Environment.CurrentDirectory;\r
384                                 \r
385                                 System.Diagnostics.Process hProc = System.Diagnostics.Process.Start(procInfo);\r
386                                 hProc.EnableRaisingEvents = true;\r
387                                 hProc.SynchronizingObject = this;\r
388                                 hProc.Exited += delegate(object sender, EventArgs e) {\r
389                                         UpdatePackageList();\r
390                                         \r
391                                         this.setWindowEnabled(true);\r
392                                         this.BringToFront();\r
393                                         \r
394                                         if (File.Exists(tmpfileName)) {\r
395                                                 File.Delete(tmpfileName);\r
396                                         }\r
397                                 };\r
398                         } catch (System.ComponentModel.Win32Exception ex) {\r
399                                 MessageBox.Show(ex.Message, "アンインストール", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
400                                 \r
401                                 this.setWindowEnabled(true);\r
402                                 if (File.Exists(tmpfileName)) {\r
403                                         File.Delete(tmpfileName);\r
404                                 }\r
405                         }\r
406                 }\r
407                 \r
408                 void UninstallToolStripButtonClick(object sender, EventArgs e)\r
409                 {\r
410                         PackageUninstallConfirmForm confirm = new PackageUninstallConfirmForm();\r
411                         confirm.UninstallPackage = (InstalledPackage) packageListView.SelectedPackage;\r
412                         confirm.UseRunas = confirm.GetShouldUseRunas();\r
413                         DialogResult result = confirm.ShowDialog(this);\r
414                         \r
415                         if (result == DialogResult.OK) {\r
416                                 InstalledPackage[] instPkgs = new InstalledPackage[]{confirm.UninstallPackage};\r
417                                 \r
418                                 if (confirm.UseRunas) {\r
419                                         uninstallRunasActionInvoke(instPkgs);\r
420                                 } else {\r
421                                         uninstallActionInvoke(instPkgs);\r
422                                 }\r
423                                 \r
424                                 UpdatePackageList();\r
425                         }\r
426                 }\r
427                 \r
428                 \r
429                 void WebOfficialToolStripMenuItemClick(object sender, EventArgs e)\r
430                 {\r
431                         Package pkg = packageListView.SelectedPackage;\r
432                         if (pkg != null) {\r
433                                 string linkURL = pkg.Url.Href;\r
434                                 \r
435                                 if (! string.IsNullOrEmpty(linkURL)) {\r
436                                         try {\r
437                                                 System.Diagnostics.Process.Start(linkURL);\r
438                                         } catch (System.ComponentModel.Win32Exception) {\r
439                                                 MessageBox.Show(string.Format("{0}を開くのに失敗しました。", linkURL), "ブラウザ起動エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
440                                         }\r
441                                 }\r
442                         }\r
443                 }\r
444                 \r
445                 void WebGoogleSearchToolStripMenuItemClick(object sender, EventArgs e)\r
446                 {\r
447                         Package pkg = packageListView.SelectedPackage;\r
448                         if (pkg != null) {\r
449                                 string q = System.Web.HttpUtility.UrlEncode(pkg.Name, System.Text.Encoding.UTF8);\r
450                                 string googleURL = @"http://www.google.co.jp/search?q="+q;\r
451                                 \r
452                                 try {\r
453                                         System.Diagnostics.Process.Start(googleURL);\r
454                                 } catch (System.ComponentModel.Win32Exception) {\r
455                                         MessageBox.Show("Googleを開くのに失敗しました。", "ブラウザ起動エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
456                                 }\r
457                         }\r
458                 }\r
459                 \r
460                 void OpenInstalledDirectoryStripMenuItemClick(object sender, EventArgs e)\r
461                 {\r
462                         InstalledPackage pkg = (InstalledPackage) packageListView.SelectedPackage;\r
463                         if (pkg != null) {\r
464                                 if (pkg.Type == InstallerType.ARCHIVE || pkg.Type == InstallerType.ITSELF) {\r
465                                         System.Diagnostics.Process.Start(Path.Combine(NaGet.Env.ArchiveProgramFiles, pkg.Name));\r
466                                 } else if (Directory.Exists(pkg.discoverInstalledLocation())) {\r
467                                         System.Diagnostics.Process.Start(pkg.discoverInstalledLocation());\r
468                                 }\r
469                         }\r
470                 }\r
471                 \r
472                 \r
473                 void PropertiesToolStripMenuItemClick(object sender, EventArgs e)\r
474                 {\r
475                         Package pkg = packageListView.SelectedPackage;\r
476                         if (pkg != null) {\r
477                                 PackageInfoForm form = new PackageInfoForm();\r
478                                 form.SelectedObject = pkg;\r
479                                 form.Text = string.Format("{0}({1})のプロパティ", pkg.Name, pkg.Version);\r
480                                 \r
481                                 form.ShowDialog(this);\r
482                         }\r
483                 }\r
484                 \r
485                 void PackageListContextMenuStripOpening(object sender, System.ComponentModel.CancelEventArgs e)\r
486                 {\r
487                         // コンテクストメニューから開かれなかった場合はインストール/アンインストールは表示しない\r
488                         bool parentIsPkgListView = (packageListContextMenuStrip.SourceControl == packageListView);\r
489                         // メニューアイテムのインストール/アンインストールの表示はツールストリップに同じ\r
490                         installToolStripMenuItem.Visible = parentIsPkgListView && installToolStripButton.Visible;\r
491                         uninstallToolStripMenuItem.Visible = parentIsPkgListView && uninstallToolStripButton.Visible;\r
492                         \r
493                         // インストールもアンインストールもできない状態ならば、メニューを表示しない\r
494                         if (! (installToolStripButton.Visible || uninstallToolStripButton.Visible)) {\r
495                                 e.Cancel = true;\r
496                                 return;\r
497                         }\r
498                         \r
499                         // 選択パッケージが1つのとき\r
500                         bool selectionIsOnlyOne = packageListView.SelectedItems.Count == 1;\r
501                         if (selectionIsOnlyOne) {\r
502                                 Package pkg = packageListView.SelectedPackage;\r
503                                 InstalledPackage iPkg = pkg as InstalledPackage;\r
504                                 \r
505                                 webResourcesToolStripMenuItem.Text = string.Format(\r
506                                         webResourcesToolStripMenuItem.Tag.ToString(),\r
507                                         pkg.Name.Replace("&", "&&")); // pkg.Nameに&が含まれているときはエンコード\r
508                                 webOfficialToolStripMenuItem.Enabled = ! (pkg.Url == null || string.IsNullOrEmpty(pkg.Url.Href));\r
509                                 // webGoogleSearchToolStripMenuItem always active.\r
510                                 \r
511                                 // インストール済みパッケージのとき\r
512                                 if (iPkg != null) {\r
513                                         bool installedDirectoryStripMenuItemVisible = \r
514                                                 (pkg.Type == InstallerType.ARCHIVE) ||\r
515                                                 (pkg.Type == InstallerType.ITSELF) ||\r
516                                                 Directory.Exists(iPkg.discoverInstalledLocation());\r
517                                         \r
518                                         installedDirectoryStripMenuItem.Visible = installedDirectoryStripMenuItemVisible;\r
519                                         if (installedDirectoryStripMenuItemVisible) {\r
520                                                 buildInstalledDirectoryMenuItemStripChildren(iPkg);\r
521                                         }\r
522                                 } else {\r
523                                         installedDirectoryStripMenuItem.Visible = false;\r
524                                 }\r
525                         }\r
526                         \r
527                         packageListContextMenuStripSeparator.Visible = parentIsPkgListView && selectionIsOnlyOne;\r
528                         webResourcesToolStripMenuItem.Visible = selectionIsOnlyOne;\r
529                         if (! selectionIsOnlyOne) installedDirectoryStripMenuItem.Visible = false;\r
530                         propertiesToolStripMenuItem.Visible = selectionIsOnlyOne;\r
531                 }\r
532                 \r
533                 private IEnumerable<Package> getUpdatedPackages(PackageList<InstalledPackage> installedPkgList, PackageList<Package> avaiablePkgList, IComparer<string> verComp)\r
534                 {\r
535                         foreach (InstalledPackage pkg in installedPkgList) {\r
536                                 Package avaiablePkg = avaiablePkgList.GetPackageForName(pkg.Name);\r
537                                 \r
538                                 if (avaiablePkg != null) {\r
539                                         if (verComp.Compare(pkg.Version, avaiablePkg.Version) < 0 &&\r
540                                             installedPkgList.GetPackageForPackage(pkg.Name, avaiablePkg.Version) == null) {\r
541                                                 \r
542                                                 yield return avaiablePkg;\r
543                                         }\r
544                                 }\r
545                         }\r
546                 }\r
547                 \r
548                 void UpgradeToolStripButtonClick(object sender, EventArgs e)\r
549                 {\r
550                         List<Package> pkgs;\r
551                         VersionComparetor verComp = new VersionComparetor();\r
552                         PackageList<Package> avaiablePackageList = pkgListsMan.AvailablePkgList;\r
553                         \r
554                         pkgs = NaGet.Utils.MergeList(\r
555                                 getUpdatedPackages(pkgListsMan.InstalledPkgList, avaiablePackageList, verComp),\r
556                                 getUpdatedPackages(pkgListsMan.SystemInstalledPkgList, avaiablePackageList, verComp)\r
557                         );\r
558                         \r
559                         if (pkgs.Count <= 0) {\r
560                                 MessageBox.Show(this, "更新されたソフトはありません", "ソフトの更新");\r
561                                 return;\r
562                         }\r
563                         \r
564                         InstallationConfirmForm confirm = new InstallationConfirmForm();\r
565                         confirm.PkgListsManager = pkgListsMan;\r
566                         confirm.Installations = Installation.ConvertInstallations(pkgs.ToArray());\r
567                         DialogResult result = confirm.ShowDialog(this);\r
568                         \r
569                         if (result == DialogResult.OK) {\r
570                                 Installation[] insts = confirm.CheckedInstallations;\r
571                                 \r
572                                 if (confirm.UseRunas) {\r
573                                         installRunasActionInvoke(insts);\r
574                                 } else {\r
575                                         installActionInvoke(insts);\r
576                                 }\r
577                                 \r
578                                 UpdatePackageList();\r
579                         }\r
580                 }\r
581                 \r
582                 protected override bool ProcessCmdKey(ref Message msg, Keys keyData)\r
583                 {\r
584                         if ((int)keyData == (int)Keys.Control + (int)Keys.E) {\r
585                                 searchTextBox.SelectAll();\r
586                                 searchTextBox.Focus();\r
587                                 return true;\r
588                         }\r
589                         \r
590                         return base.ProcessCmdKey(ref msg, keyData);\r
591                 }\r
592                 \r
593                 public void UpdatePackageList()\r
594                 {\r
595                         pkgListsMan.LoadPackageLists();\r
596                         packageListView.UpdateItems();\r
597                         updateSelectedPackages();\r
598                 }\r
599                 \r
600                 /// <summary>\r
601                 /// 自ウィンドウの有効無効(Enabled)を(必要あればInvokeして)実行する \r
602                 /// </summary>\r
603                 /// <param name="enabled">有効か否か。Enabledの値に入れられる</param>\r
604                 private void setWindowEnabled(bool enabled)\r
605                 {\r
606                         MethodInvoker process = (MethodInvoker) delegate() {\r
607                                 this.Enabled = enabled;\r
608                         };\r
609                         \r
610                         if (InvokeRequired) {\r
611                                 Invoke(process);\r
612                         } else {\r
613                                 process.Invoke();\r
614                         }\r
615                 }\r
616         }\r
617 \r
618 }\r