OSDN Git Service

AppliStation-GUI,検索時にテキストが変化していなくても検索をガリガリするバグを修正
[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                 protected 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                         \r
30                         this.Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath);\r
31                 }\r
32                 \r
33                 void PackageListViewSelectedIndexChanged(object sender, EventArgs e)\r
34                 {\r
35                         bool installBtnEnabled = false;\r
36                         bool uninstallBtnEnabled = false;\r
37                         \r
38                         detailBox.Clear();\r
39                         foreach (ListViewItem item in packageListView.SelectedItems) {\r
40                                 Package pkg = (Package) item.Tag;\r
41                                 \r
42                                 bool isInstalledPackage = pkg is InstalledPackage;\r
43                                 uninstallBtnEnabled = isInstalledPackage;\r
44                                 installBtnEnabled = ! isInstalledPackage;\r
45                                 \r
46                                 detailBox.SelectionFont = new Font(detailBox.Font.FontFamily, 12);\r
47                                 detailBox.SelectedText += string.Format("{0} ({1})\r\n", pkg.Name, pkg.Version);\r
48                                 if (! string.IsNullOrEmpty(pkg.Tags) ) {\r
49                                         detailBox.SelectionFont = new Font(detailBox.Font.FontFamily, 8);\r
50                                         detailBox.SelectedText += string.Format("\83^\83O: {0}\r\n", pkg.Tags);\r
51                                 }\r
52                                 if (isInstalledPackage) {\r
53                                         InstalledPackage iPkg = (InstalledPackage) pkg;\r
54                                         System.Text.StringBuilder sb = new System.Text.StringBuilder();\r
55                                         if (iPkg.UninstallInfo.InstallDate != null) {\r
56                                                 sb.AppendFormat("\83C\83\93\83X\83g\81[\83\8b\82µ\82½\93ú: {0:d}  ", iPkg.UninstallInfo.InstallDate.Value);\r
57                                         }\r
58                                         if (iPkg.UninstallInfo.EstimatedSize > 0) {\r
59                                                 sb.AppendFormat("\83T\83C\83Y: {0}  ", NaGet.Utils.FormatSize(iPkg.UninstallInfo.EstimatedSize*1024));\r
60                                         }\r
61                                         \r
62                                         if (sb.Length > 0) {\r
63                                                 detailBox.SelectionFont = new Font(detailBox.Font.FontFamily, 8);\r
64                                                 detailBox.SelectedText += sb.ToString();\r
65                                                 detailBox.SelectedText += "\r\n";\r
66                                         }\r
67                                 }\r
68                                 detailBox.SelectionFont = detailBox.Font;\r
69                                 if (pkg.Url != null && pkg.Url.Href != null) {\r
70                                         detailBox.SelectedText += "\8cö\8e®\83T\83C\83g: " + pkg.Url.Href + "\r\n";\r
71                                 }\r
72                                 detailBox.SelectedText += pkg.Summary;\r
73                                 \r
74                                 break;\r
75                         }\r
76                         \r
77                         uninstallToolStripButton.Visible = uninstallBtnEnabled;\r
78                         installToolStripButton.Visible = installBtnEnabled;\r
79                         \r
80                         if (packageListView.SelectedItems.Count <= 0) {\r
81                                 detailBox.SelectionFont = detailBox.Font;\r
82                                 int count = packageListView.Items.Count;\r
83                                 detailBox.Text = (count > 0) ? string.Format("{0}\8cÂ\82Ì\83\\83t\83g\82ª\82 \82è\82Ü\82·\81B", count)\r
84                                         : "\8aY\93\96\82·\82é\83\\83t\83g\82ª\82 \82è\82Ü\82¹\82ñ\81B";\r
85                         }\r
86                         \r
87                         detailBox.SelectionStart = 0;\r
88                         detailBox.ScrollToCaret();\r
89                 }\r
90 \r
91                 void PackageListViewItemActivate(object sender, EventArgs e)\r
92                 {\r
93                         if (packageListView.SelectedItems.Count <= 0) {\r
94                                 return; // exit \r
95                         }\r
96                         \r
97                         foreach (ListViewItem item in packageListView.SelectedItems) {\r
98                                 Package pkg = (Package) item.Tag;\r
99                                 \r
100                                 if (pkg is InstalledPackage) {\r
101                                         UninstallToolStripButtonClick(sender, e);\r
102                                 } else {\r
103                                         InstallToolStripButtonClick(sender, e);\r
104                                 }\r
105                                 \r
106                                 break;\r
107                         }\r
108                 }\r
109                 \r
110                 AppliStation.Util.ListViewItemSortComparer packageListViewSortComparer;\r
111 \r
112                 void PackageListViewColumnClick(object sender, ColumnClickEventArgs e)\r
113                 {\r
114                         SortOrder order = SortOrder.None;\r
115                         \r
116                         if (packageListViewSortComparer == null) {\r
117                                 order = SortOrder.Ascending;\r
118                                 packageListViewSortComparer = new AppliStation.Util.ListViewItemSortComparer(e.Column, order);\r
119                                 packageListView.ListViewItemSorter = packageListViewSortComparer;\r
120                         } else {\r
121                                 if (packageListViewSortComparer.Column == e.Column) {\r
122                                         order = (packageListViewSortComparer.Order == SortOrder.Ascending)? SortOrder.Descending : SortOrder.Ascending;\r
123                                         \r
124                                         packageListViewSortComparer.Order = order;\r
125                                 } else {\r
126                                         order = packageListViewSortComparer.Order;\r
127                                         packageListViewSortComparer.Column = e.Column;\r
128                                 }\r
129                                 \r
130                                 packageListView.Sort();\r
131                         }\r
132                         AppliStation.Util.NativeMethods.ColumnHeader_SetSortState(packageListView, e.Column, order);\r
133                         \r
134                         // \83\\81[\83g\91Î\8fÛ\97ñ\82Ì\90F\95t\82¯\r
135                         try {\r
136                                 // SendMessage(hWnd, LVM_SETSELECTEDCOLUMN, column, NULL);\r
137                                 AppliStation.Util.NativeMethods.SendMessage(packageListView.Handle, 0x1000+140, (uint) e.Column, 0);\r
138                         } catch (Exception) {   \r
139                         }\r
140                 }\r
141                 \r
142                 void Form_OnLoad(object sender, EventArgs e)\r
143                 {\r
144                         System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PackageListViewForm));\r
145                         ImageList imageList = new ImageList();\r
146                         imageList.Images.Add("installed", this.Icon);\r
147                         imageList.Images.Add("sys", (Icon)(resources.GetObject("sysinstalled.Icon")));\r
148                         packageListView.SmallImageList = imageList;\r
149                         \r
150                         updatePackageFilterToolStripMenuItemCheckState();\r
151                         installedASPackageFilterToolStripMenuItem.Image = this.Icon.ToBitmap();\r
152                         installedSysPackageFilterToolStripMenuItem.Image = ((Icon)(resources.GetObject("sysinstalled.Icon"))).ToBitmap();\r
153                 }\r
154                 \r
155                 #region PackageFilter\8aÖ\98A\r
156                 \r
157                 private enum PackageFilterIndex : int\r
158                 {\r
159                         All = 0,\r
160                         NotInstalled = 1,\r
161                         InstalledAS = 2,\r
162                         InstalledSys = 3,\r
163                 }\r
164                 \r
165                 private PackageFilterIndex currentPackageFilter = PackageFilterIndex.All;\r
166                 \r
167                 private PackageFilterIndex CurrentPackageFilter {\r
168                         get {\r
169                                 return currentPackageFilter;\r
170                         }\r
171                         set {\r
172                                 currentPackageFilter = value;\r
173                                 \r
174                                 updatePackageFilterToolStripMenuItemCheckState();\r
175                         }\r
176                 }\r
177                 \r
178                 private void updatePackageFilterToolStripMenuItemCheckState()\r
179                 {\r
180                         ToolStripMenuItem selected = getCheckedPackageFilterToolStripItem();\r
181                         \r
182                         foreach (ToolStripMenuItem item in packageFilterToolStripDropDownButton.DropDown.Items) {\r
183                                 item.Checked = selected == item;\r
184                         }\r
185                         \r
186                         packageFilterToolStripDropDownButton.Text = selected.Text;\r
187                         packageFilterToolStripDropDownButton.Image = selected.Image;\r
188                         packageFilterToolStripDropDownButton.ToolTipText = selected.ToolTipText;\r
189                 }\r
190                 \r
191                 private ToolStripMenuItem getCheckedPackageFilterToolStripItem()\r
192                 {\r
193                         switch (currentPackageFilter) {\r
194                                 case PackageFilterIndex.NotInstalled:\r
195                                         return notInstalledPackageFilterToolStripMenuItem;\r
196                                 case PackageFilterIndex.InstalledAS:\r
197                                         return installedASPackageFilterToolStripMenuItem;\r
198                                 case PackageFilterIndex.InstalledSys:\r
199                                         return installedSysPackageFilterToolStripMenuItem;\r
200                                 default:\r
201                                         return allPackageFilterToolStripMenuItem;\r
202                         }\r
203                 }\r
204                 \r
205                 void AnyPackageFilterToolStripMenuItemClicked(object sender, EventArgs e)\r
206                 {\r
207                         if (sender == notInstalledPackageFilterToolStripMenuItem) {\r
208                                 currentPackageFilter = PackageFilterIndex.NotInstalled;\r
209                         } else if (sender == installedASPackageFilterToolStripMenuItem) {\r
210                                 currentPackageFilter = PackageFilterIndex.InstalledAS;\r
211                         } else if (sender == installedSysPackageFilterToolStripMenuItem) {\r
212                                 currentPackageFilter = PackageFilterIndex.InstalledSys;\r
213                         } else {\r
214                                 currentPackageFilter = PackageFilterIndex.All;\r
215                         }\r
216                         \r
217                         updatePackageFilterToolStripMenuItemCheckState();\r
218                         searchTextBoxUpdate(false);\r
219                 }\r
220                 \r
221                 #endregion\r
222                 \r
223                 private string oldSearchKeywords = null;\r
224                 void PackageListViewUpdate()\r
225                 {\r
226                         string searchKeywords = this.SearchKeyword;\r
227                         if (oldSearchKeywords == searchKeywords) { // \8dX\90V\82³\82ê\82Ä\82¢\82È\82¢\8fê\8d\87\82Í\8c\9f\8dõ\82µ\82È\82¢\r
228                                 return;\r
229                         }\r
230                         \r
231                         this.packageListView.Items.Clear();\r
232                         \r
233                         if (currentPackageFilter == PackageFilterIndex.All || currentPackageFilter == PackageFilterIndex.NotInstalled) {\r
234                                 foreach (Package pkg in pkgListsMan.AvailablePkgList.Search(searchKeywords)) {\r
235                                         if (Installation.GetPreferInstallerIndex(pkg) >= 0) { // \83C\83\93\83X\83g\81[\83\8b\89Â\94\\r
236                                                 if (currentPackageFilter == PackageFilterIndex.NotInstalled &&\r
237                                                     (pkgListsMan.InstalledPkgList.GetPackageForName(pkg.Name) != null||\r
238                                                      pkgListsMan.SystemInstalledPkgList.GetPackageForName(pkg.Name) != null) ) {\r
239                                                         continue; // \83C\83\93\83X\83g\81[\83\8b\8dÏ\82Ý\82Í\8e\9f\82Ì\83\8b\81[\83v\82Ö(\96¢\83C\83\93\83X\83g\81[\83\8b\83\\83t\83g\92\8a\8fo\8e\9e)\r
240                                                 }\r
241                                                 \r
242                                                 ListViewItem item = new ListViewItem(new string[]{pkg.Name, pkg.Version, pkg.Summary});\r
243                                                 item.Tag = pkg;\r
244                                                 item.ToolTipText = pkg.Summary;\r
245                 \r
246                                                 this.packageListView.Items.Add(item);\r
247                                         }\r
248                                 }\r
249                         }\r
250                         \r
251                         if (currentPackageFilter == PackageFilterIndex.All || currentPackageFilter == PackageFilterIndex.InstalledAS) {\r
252                                 foreach (Package pkg in pkgListsMan.InstalledPkgList.Search(this.SearchKeyword)) {\r
253                                         ListViewItem item = new ListViewItem(new string[]{pkg.Name, pkg.Version, pkg.Summary});\r
254                                         item.Tag = pkg;\r
255                                         item.ToolTipText = pkg.Summary;\r
256                                         item.ImageKey = "installed";\r
257         \r
258                                         this.packageListView.Items.Add(item);\r
259                                 }\r
260                         }\r
261                         \r
262                         if (currentPackageFilter == PackageFilterIndex.All || currentPackageFilter == PackageFilterIndex.InstalledSys) {\r
263                                 foreach (Package pkg in pkgListsMan.SystemInstalledPkgList.Search(this.SearchKeyword)) {\r
264                                         ListViewItem item = new ListViewItem(new string[]{pkg.Name, pkg.Version, pkg.Summary});\r
265                                         item.Tag = pkg;\r
266                                         item.ToolTipText = pkg.Summary;\r
267                                         item.ImageKey = "sys";\r
268         \r
269                                         this.packageListView.Items.Add(item);\r
270                                 }\r
271                         }\r
272                         \r
273                         PackageListViewSelectedIndexChanged(packageListView, null);\r
274                         detailBox.Refresh();\r
275                         \r
276                         //this.packageListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);\r
277                         \r
278                         oldSearchKeywords = searchKeywords; // \89ß\8b\8e\82Ì\8c\9f\8dõ\83L\81[\83\8f\81[\83h\82Æ\82µ\82Ä\8ao\82¦\82Ä\82¨\82­\r
279                 }\r
280                 \r
281                 void PackageDetailBoxLinkClicked(object sender, LinkClickedEventArgs e)\r
282                 {\r
283                         System.Diagnostics.Process.Start(e.LinkText);\r
284                 }\r
285                 \r
286                 internal void updateActionInvoke(bool downloadPackageListsFlag)\r
287                 {\r
288                         AppliStation.Util.ExecutionProgressViewer prog = new AppliStation.Util.ExecutionProgressViewer();\r
289                         prog.Shown += delegate(object sender2, EventArgs e2) {\r
290                                 NaGet.SubCommands.NaGetUpdate tasks = new NaGet.SubCommands.NaGetUpdate(pkgListsMan, downloadPackageListsFlag);\r
291                                 tasks.Downloader = prog.Downloader;\r
292                                 prog.SetTaskSet(tasks);\r
293                                 prog.Refresh();\r
294                                 prog.StartTaskSet();\r
295                         };\r
296                         prog.Text = "\83\8a\83X\83g\82Ì\8dX\90V";\r
297                         prog.ShowDialog(this);\r
298                 }\r
299                         \r
300                 void UpdateToolStripButtonClick(object sender, EventArgs e)\r
301                 {\r
302                         updateActionInvoke(true);\r
303                         \r
304                         UpdatePackageList();\r
305                 }\r
306                 \r
307                 void LocalupdateToolStripMenuItemClick(object sender, EventArgs e)\r
308                 {\r
309                         updateActionInvoke(false);\r
310                         \r
311                         UpdatePackageList();\r
312                 }\r
313                 \r
314                 #region searchTextBox\82Ü\82í\82è\r
315                 \r
316                 private bool searchTextBoxIsEmpty = true;\r
317                 \r
318                 private Timer searchUpdateTimer = null;\r
319                 \r
320                 string SearchKeyword {\r
321                         get {\r
322                                 return searchTextBoxIsEmpty? string.Empty : searchTextBox.Text;\r
323                         }\r
324                 }\r
325                 \r
326                 void SearchTextBoxEnter(object sender, EventArgs e)\r
327                 {\r
328                         if (searchTextBoxIsEmpty) {\r
329                                 searchTextBox.Text = string.Empty;\r
330                                 searchTextBox.ForeColor = DefaultForeColor;\r
331                                 searchTextBoxIsEmpty = false;\r
332                         }\r
333                 }\r
334                 \r
335                 void SearchTextBoxLeave(object sender, EventArgs e)\r
336                 {\r
337                         if (string.IsNullOrEmpty(searchTextBox.Text)) {\r
338                                 searchTextBox.Text = "\8c\9f\8dõ";\r
339                                 searchTextBox.ForeColor = SystemColors.GrayText;\r
340                                 searchTextBoxIsEmpty = true;\r
341                         }\r
342                 }\r
343                 \r
344                 void SearchTextBoxTextChanged(object sender, EventArgs e)\r
345                 {\r
346                         if (searchTextBox.Focused) {\r
347                                 searchTextBoxUpdate(false);\r
348                         }\r
349                 }\r
350                 \r
351                 void SearchTextBoxKeyPress(object sender, KeyPressEventArgs e)\r
352                 {\r
353                         switch (e.KeyChar) {\r
354                                 case (char)Keys.Enter:\r
355                                         searchTextBoxUpdate(true);\r
356                                         break;\r
357                                 case (char)Keys.Escape:\r
358                                         searchTextBox.Text = "";\r
359                                         break;\r
360                         }\r
361                 }\r
362                 \r
363                 private void searchTextBoxUpdate(bool force)\r
364                 {\r
365                         if (! this.Created) return;\r
366                         \r
367                         if (searchUpdateTimer != null) {\r
368                                 searchUpdateTimer.Stop();\r
369                         } else {\r
370                                 searchUpdateTimer = new Timer();\r
371                                 searchUpdateTimer.Tick += searchUpdateTimerTick;\r
372                         }\r
373                         searchUpdateTimer.Interval = (force)? 10 : 500;\r
374                         searchUpdateTimer.Start();\r
375                 }\r
376                 \r
377                 private void searchUpdateTimerTick(object sender, EventArgs e)\r
378                 {\r
379                         searchUpdateTimer.Stop();\r
380                         searchUpdateTimer = null;\r
381                         \r
382                         PackageListViewUpdate();\r
383                 }\r
384                 \r
385                 #endregion\r
386                 \r
387                 internal void installActionInvoke(Package[] pkgs)\r
388                 {\r
389                         AppliStation.Util.ExecutionProgressViewer prog = new AppliStation.Util.ExecutionProgressViewer();\r
390                         prog.Shown += delegate(object sender2, EventArgs e2) {\r
391                                 NaGet.SubCommands.NaGetInstall tasks = new NaGet.SubCommands.NaGetInstall(pkgListsMan, pkgs);\r
392                                 tasks.Downloader = prog.Downloader;\r
393                                 prog.SetTaskSet(tasks);\r
394                                 prog.Refresh();\r
395                                 prog.StartTaskSet();\r
396                         };\r
397                         prog.Text = string.Format("\83\\83t\83g\83E\83F\83A\82Ì\83C\83\93\83X\83g\81[\83\8b");\r
398                         prog.ShowDialog(this);\r
399                 }\r
400                 \r
401                 void InstallToolStripButtonClick(object sender, EventArgs e)\r
402                 {\r
403                         PackagesInstallConfirmForm confirm = new PackagesInstallConfirmForm();\r
404                         confirm.PkgListsManager = pkgListsMan;\r
405                         confirm.Packages = SelectedPackages<Package>();\r
406                         confirm.UseRunas = confirm.GetShouldUseRunas();\r
407                         DialogResult result = confirm.ShowDialog(this);\r
408                         \r
409                         if (result == DialogResult.OK) {\r
410                                 Package[] instPkgs = confirm.CheckedPackages;\r
411                                 \r
412                                 if (confirm.UseRunas) {\r
413                                         this.Enabled = false;\r
414                                         installRunasActionInvoke(instPkgs);\r
415                                         this.Enabled = true;\r
416                                         this.Focus();\r
417                                 } else {\r
418                                         installActionInvoke(instPkgs);\r
419                                 }\r
420                                 \r
421                                 UpdatePackageList();\r
422                         }\r
423                 }\r
424                 \r
425                 public void installRunasActionInvoke(Package[] pkgs)\r
426                 {\r
427                         string tmpfileName = System.IO.Path.GetTempFileName();\r
428                         try {\r
429                                 NaGet.Utils.PutSerializeObject(tmpfileName, pkgs);\r
430                                 \r
431                                 System.Diagnostics.ProcessStartInfo procInfo = new System.Diagnostics.ProcessStartInfo();\r
432                                 procInfo.FileName = Application.ExecutablePath;\r
433                                 procInfo.Arguments = string.Format("--noupdate --cmd=install \"--pkgsref={0}\"", tmpfileName);\r
434                                 procInfo.Verb = "runas";\r
435                                 procInfo.WorkingDirectory = Environment.CurrentDirectory;\r
436                                 \r
437                                 using (System.Diagnostics.Process hProc = System.Diagnostics.Process.Start(procInfo)) {\r
438                                         hProc.WaitForExit();\r
439                                 }\r
440                                 \r
441                                 pkgListsMan.LoadPackageLists();\r
442                         } catch (System.ComponentModel.Win32Exception ex) {\r
443                                 MessageBox.Show(ex.Message, "\83C\83\93\83X\83g\81[\83\8b", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
444                         } finally {\r
445                                 if (File.Exists(tmpfileName)) {\r
446                                         File.Delete(tmpfileName);\r
447                                 }\r
448                         }\r
449                 }\r
450                 \r
451                 internal void uninstallActionInvoke(InstalledPackage[] pkgs)\r
452                 {\r
453                         AppliStation.Util.ExecutionProgressViewer prog = new AppliStation.Util.ExecutionProgressViewer();\r
454                         prog.Shown += delegate(object sender2, EventArgs e2) {\r
455                                 NaGet.SubCommands.NaGetUninstall tasks = new NaGet.SubCommands.NaGetUninstall(pkgListsMan, pkgs);\r
456                                 prog.SetTaskSet(tasks);\r
457                                 prog.Refresh();\r
458                                 prog.StartTaskSet();\r
459                         };\r
460                         prog.Text = string.Format("\83\\83t\83g\83E\83F\83A\82Ì\83A\83\93\83C\83\93\83X\83g\81[\83\8b");\r
461                         prog.ShowDialog(this);\r
462                 }\r
463                 \r
464                 internal void uninstallRunasActionInvoke(InstalledPackage[] pkgs)\r
465                 {\r
466                         string tmpfileName = System.IO.Path.GetTempFileName();\r
467                         try {\r
468                                 NaGet.Utils.PutSerializeObject(tmpfileName, pkgs);\r
469                                 \r
470                                 System.Diagnostics.ProcessStartInfo procInfo = new System.Diagnostics.ProcessStartInfo();\r
471                                 procInfo.FileName = Application.ExecutablePath;\r
472                                 procInfo.Arguments = string.Format("--noupdate --cmd=uninstall \"--pkgsref={0}\"", tmpfileName);\r
473                                 procInfo.Verb = "runas";\r
474                                 procInfo.WorkingDirectory = Environment.CurrentDirectory;\r
475                                 \r
476                                 using (System.Diagnostics.Process hProc = System.Diagnostics.Process.Start(procInfo)) {\r
477                                         hProc.WaitForExit();\r
478                                 }\r
479                                 \r
480                                 pkgListsMan.LoadPackageLists();\r
481                         } catch (System.ComponentModel.Win32Exception ex) {\r
482                                 MessageBox.Show(ex.Message, "\83A\83\93\83C\83\93\83X\83g\81[\83\8b", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
483                         } finally {\r
484                                 if (File.Exists(tmpfileName)) {\r
485                                         File.Delete(tmpfileName);\r
486                                 }\r
487                         }\r
488                 }\r
489                 \r
490                 void UninstallToolStripButtonClick(object sender, EventArgs e)\r
491                 {\r
492                         PackageUninstallConfirmForm confirm = new PackageUninstallConfirmForm();\r
493                         foreach (InstalledPackage pkg in SelectedPackages<InstalledPackage>()) {\r
494                                 confirm.UninstallPackage = pkg;\r
495                                 break;\r
496                         }\r
497                         confirm.UseRunas = confirm.GetShouldUseRunas();\r
498                         DialogResult result = confirm.ShowDialog(this);\r
499                         \r
500                         if (result == DialogResult.OK) {\r
501                                 InstalledPackage[] instPkgs = new InstalledPackage[]{confirm.UninstallPackage};\r
502                                 \r
503                                 if (confirm.UseRunas) {\r
504                                         this.Enabled = false;\r
505                                         uninstallRunasActionInvoke(instPkgs);\r
506                                         this.Enabled = true;\r
507                                         this.Focus();\r
508                                 } else {\r
509                                         uninstallActionInvoke(instPkgs);\r
510                                 }\r
511                                 \r
512                                 UpdatePackageList();\r
513                         }\r
514                 }\r
515                 \r
516                 \r
517                 void WebOfficialToolStripMenuItemClick(object sender, EventArgs e)\r
518                 {\r
519                         foreach (Package pkg in SelectedPackages<Package>()) {\r
520                                 string linkURL = pkg.Url.Href;\r
521                                 \r
522                                 if (! (pkg == null || string.IsNullOrEmpty(linkURL))) {\r
523                                         System.Diagnostics.Process.Start(linkURL);\r
524                                 }\r
525                                 break;\r
526                         }\r
527                 }\r
528                 \r
529                 void WebGoogleSearchToolStripMenuItemClick(object sender, EventArgs e)\r
530                 {\r
531                         foreach (Package pkg in SelectedPackages<Package>()) {\r
532                                 string q = System.Web.HttpUtility.UrlEncode(pkg.Name, System.Text.Encoding.UTF8);\r
533                                 string googleURL = @"http://www.google.co.jp/search?q="+q;\r
534                                 \r
535                                 System.Diagnostics.Process.Start(googleURL);\r
536 \r
537                                 break;\r
538                         }\r
539                 }\r
540                 \r
541                 void OpenInstalledDirectoryStripMenuItemClick(object sender, EventArgs e)\r
542                 {\r
543                         foreach (InstalledPackage pkg in SelectedPackages<InstalledPackage>()) {\r
544                                 if (pkg.Type == InstallerType.ARCHIVE) {\r
545                                         System.Diagnostics.Process.Start(Path.Combine(NaGet.Env.ArchiveProgramFiles, pkg.Name));\r
546                                 } else if (Directory.Exists(pkg.UninstallInfo.InstallLocation)) {\r
547                                         System.Diagnostics.Process.Start(pkg.UninstallInfo.InstallLocation);\r
548                                 }\r
549 \r
550                                 break;\r
551                         }\r
552                 }\r
553                 \r
554                 \r
555                 void PropertiesToolStripMenuItemClick(object sender, EventArgs e)\r
556                 {\r
557                         foreach (Package pkg in SelectedPackages<Package>()) {\r
558                                 PackageInfoForm form = new PackageInfoForm();\r
559                                 form.SelectedObject = pkg;\r
560                                 form.Text = pkg.ToString() + "\82Ì\83v\83\8d\83p\83e\83B";\r
561                                 form.AutoSize = true;\r
562                                 \r
563                                 form.ShowDialog(this);\r
564 \r
565                                 break;\r
566                         }\r
567                 }\r
568                 \r
569                 void PackageListContextMenuStripOpening(object sender, System.ComponentModel.CancelEventArgs e)\r
570                 {\r
571                         // \91I\91ð\82³\82ê\82Ä\82¢\82È\82¢\82È\82ç\8aJ\82©\82È\82¢\r
572                         if (packageListView.SelectedItems.Count <= 0) {\r
573                                 e.Cancel = true;\r
574                                 return;\r
575                         }\r
576                         \r
577                         foreach (Package pkg in SelectedPackages<Package>()) {\r
578                                 bool isInstalledPackage = pkg is InstalledPackage;\r
579                                 \r
580                                 installToolStripMenuItem.Visible = ! isInstalledPackage;\r
581                                 uninstallToolStripMenuItem.Visible = isInstalledPackage;\r
582                                 \r
583                                 webResourcesToolStripMenuItem.Text = string.Format(webResourcesToolStripMenuItem.Tag.ToString(), pkg.Name);\r
584                                 webOfficialToolStripMenuItem.Enabled = ! (pkg.Url == null || string.IsNullOrEmpty(pkg.Url.Href));\r
585                                 // webGoogleSearchToolStripMenuItem always active.\r
586                                 \r
587                                 openInstalledDirectoryStripMenuItem.Visible = isInstalledPackage &&\r
588                                         ( (pkg.Type == InstallerType.ARCHIVE) || Directory.Exists(((InstalledPackage) pkg).UninstallInfo.InstallLocation) );\r
589 \r
590                                 break;\r
591                         }\r
592                 }\r
593                 \r
594                 private IEnumerable<Package> getUpdatedPackages(PackageList<InstalledPackage> installedPkgList, PackageList<Package> avaiablePkgList, IComparer<string> verComp)\r
595                 {\r
596                         foreach (InstalledPackage pkg in installedPkgList.Packages) {\r
597                                 Package avaiablePkg = avaiablePkgList.GetPackageForName(pkg.Name);\r
598                                 \r
599                                 if (avaiablePkgList != null) {\r
600                                         if (verComp.Compare(pkg.Version, avaiablePkg.Version) < 0 &&\r
601                                             installedPkgList.GetPackageForPackage(pkg.Name, avaiablePkg.Version) == null) {\r
602                                                 \r
603                                                 yield return avaiablePkg;\r
604                                         }\r
605                                 }\r
606                         }\r
607                 }\r
608                 \r
609                 void UpgradeToolStripButtonClick(object sender, EventArgs e)\r
610                 {\r
611                         List<Package> pkgs = new List<Package>();\r
612                         VersionComparetor verComp = new VersionComparetor();\r
613                         PackageList<Package> avaiablePackageList = pkgListsMan.AvailablePkgList;\r
614                         \r
615                         pkgs.AddRange(getUpdatedPackages(pkgListsMan.InstalledPkgList, avaiablePackageList, verComp));\r
616                         pkgs.AddRange(getUpdatedPackages(pkgListsMan.SystemInstalledPkgList, avaiablePackageList, verComp));\r
617                         \r
618                         if (pkgs.Count <= 0) {\r
619                                 MessageBox.Show(this, "\8dX\90V\82³\82ê\82½\83\\83t\83g\82Í\82 \82è\82Ü\82¹\82ñ", "\83\\83t\83g\82Ì\8dX\90V");\r
620                                 return;\r
621                         }\r
622                         \r
623                         PackagesInstallConfirmForm confirm = new PackagesInstallConfirmForm();\r
624                         confirm.PkgListsManager = pkgListsMan;\r
625                         confirm.Packages = pkgs.ToArray();\r
626                         DialogResult result = confirm.ShowDialog(this);\r
627                         \r
628                         if (result == DialogResult.OK) {\r
629                                 Package[] instPkgs = confirm.CheckedPackages;\r
630                                 \r
631                                 if (confirm.UseRunas) {\r
632                                         this.Enabled = false;\r
633                                         installRunasActionInvoke(instPkgs);\r
634                                         this.Enabled = true;\r
635                                 } else {\r
636                                         installActionInvoke(instPkgs);\r
637                                 }\r
638                                 \r
639                                 UpdatePackageList();\r
640                         }\r
641                 }\r
642                 \r
643                 public void UpdatePackageList()\r
644                 {\r
645                         pkgListsMan.LoadPackageLists();\r
646                         this.PackageListViewUpdate();\r
647                 }\r
648                 \r
649                 /// <summary>\r
650                 /// \83C\83\93\83X\83g\81[\83\8b\82·\82é\82æ\82¤\91I\91ð\82³\82ê\82½\83p\83b\83P\81[\83W\82Ì\94z\97ñ\r
651                 /// </summary>\r
652                 public TPackage[] SelectedPackages<TPackage>() where TPackage : Package\r
653                 {\r
654                                 List<TPackage> pkgs = new List<TPackage>();\r
655                                 foreach (ListViewItem item in packageListView.SelectedItems) {\r
656                                         pkgs.Add((TPackage) item.Tag);\r
657                                 }\r
658                                 \r
659                                 return pkgs.ToArray();\r
660                 }\r
661         }\r
662 \r
663 }\r