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 using AppliStation.PackageInfo;\r
10 \r
11 namespace AppliStation\r
12 {\r
13         /// <summary>\r
14         /// Description of PackageListViewForm.\r
15         /// </summary>\r
16         public partial class PackageListViewForm : Form\r
17         {\r
18                 private PackageListsManager pkgListsMan = null;\r
19                 \r
20                 public PackageListViewForm()\r
21                 {\r
22                         //\r
23                         // The InitializeComponent() call is required for Windows Forms designer support.\r
24                         //\r
25                         InitializeComponent();\r
26                         \r
27                         installToolStripMenuItem.Font = new Font(installToolStripMenuItem.Font, FontStyle.Bold);\r
28                         uninstallToolStripMenuItem.Font = new Font(uninstallToolStripMenuItem.Font, FontStyle.Bold);\r
29                         \r
30                         pkgListsMan = new PackageListsManager();\r
31                         packageListView.Data = pkgListsMan;\r
32                         \r
33                         this.Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath);\r
34                         AppliStation.Util.NativeMethods.ListView_EnableVistaExplorerTheme(packageListView);\r
35                         AppliStation.Util.NativeMethods.ListView_SetDoubleBuffer(packageListView, true);\r
36                 }\r
37                 \r
38                 private void ShowInfoToDetailBoxFor(Package pkg)\r
39                 {\r
40                         detailBox.Clear();\r
41                         \r
42                         detailBox.SelectionFont = new Font(detailBox.Font.FontFamily, 12);\r
43                         detailBox.SelectedText += string.Format("{0} ({1})\r\n", pkg.Name, pkg.Version);\r
44                         if (! string.IsNullOrEmpty(pkg.Tags) ) {\r
45                                 detailBox.SelectionFont = new Font(detailBox.Font.FontFamily, 8);\r
46                                 detailBox.SelectedText += "タグ:";\r
47                                 foreach (string tag in pkg.Tags.Split(' ')) {\r
48                                         detailBox.AppendText(" ");\r
49                                         AppliStation.Util.NativeMethods.RichTextBox_AddTextLink(detailBox, tag);\r
50                                 }\r
51                                 detailBox.AppendText("\r\n");\r
52                         }\r
53                         \r
54                         // インストール済みパッケージの場合\r
55                         InstalledPackage iPkg = pkg as InstalledPackage;\r
56                         if (iPkg != null) {\r
57                                 System.Text.StringBuilder sb = new System.Text.StringBuilder();\r
58                                 if (iPkg.UninstallInfo.InstallDate != null) {\r
59                                         sb.AppendFormat("インストールした日: {0:d}  ", iPkg.UninstallInfo.InstallDate.Value);\r
60                                 }\r
61                                 if (iPkg.UninstallInfo.EstimatedSize > 0) {\r
62                                         sb.AppendFormat("サイズ: {0}  ", NaGet.Utils.FormatSize(iPkg.UninstallInfo.EstimatedSize*1024));\r
63                                 }\r
64                                 \r
65                                 if (sb.Length > 0) {\r
66                                         detailBox.SelectionFont = new Font(detailBox.Font.FontFamily, 8);\r
67                                         detailBox.SelectedText += sb.ToString();\r
68                                         detailBox.SelectedText += "\r\n";\r
69                                 }\r
70                         }\r
71                         detailBox.SelectionFont = detailBox.Font;\r
72                         if (pkg.Url != null && pkg.Url.Href != null) {\r
73                                 detailBox.SelectedText += "公式サイト: ";\r
74                                 AppliStation.Util.NativeMethods.RichTextBox_AddTextLink(detailBox, pkg.Url.Href);\r
75                                 detailBox.SelectedText += "\r\n";\r
76                         }\r
77                         detailBox.SelectedText += pkg.Summary;\r
78                 }\r
79                 \r
80                 void PackageListViewSelectedIndexChanged(object sender, EventArgs e)\r
81                 {\r
82                         updateSelectedPackages();\r
83                 }\r
84                 \r
85                 private void updateSelectedPackages()\r
86                 {\r
87                         uint installPkgCount = 0;\r
88                         uint uninstallPkgCount = 0;\r
89                         bool installBtnEnabled, uninstallBtnEnabled;\r
90                         \r
91                         foreach (Package pkg in packageListView.SelectedPackages) {\r
92                                 if (pkg is InstalledPackage) {\r
93                                         uninstallPkgCount ++;\r
94                                 } else {\r
95                                         installPkgCount ++;\r
96                                 }\r
97                         }\r
98                         \r
99                         uint pkgCount = installPkgCount + uninstallPkgCount;\r
100                         installBtnEnabled = (installPkgCount > 0) && (uninstallPkgCount == 0);\r
101                         uninstallBtnEnabled = (uninstallPkgCount == 1) && (installPkgCount == 0);\r
102                         \r
103                         // ToolStrip\r
104                         informationToolStripDropDownButton.Visible = (pkgCount == 1);\r
105                         uninstallToolStripButton.Visible = uninstallBtnEnabled;\r
106                         installToolStripButton.Visible = installBtnEnabled;\r
107                         // MenuStrip\r
108                         webResourceToolStripMenuItem.Visible = (pkgCount == 1);\r
109                         uninstallToolStripMenuItem.Visible = uninstallBtnEnabled;\r
110                         installToolStripMenuItem.Visible = installBtnEnabled;\r
111                         \r
112                         // detailBoxのメッセージ設定\r
113                         switch (pkgCount) {\r
114                                 case 0:\r
115                                         int count = packageListView.Items.Count;\r
116                                         detailBox.Clear();\r
117                                         detailBox.Text = (count > 0) ? string.Format("{0}個のソフトがあります。", count)\r
118                                                 : "該当するソフトがありません。";\r
119                                         break;\r
120                                 case 1:\r
121                                         ShowInfoToDetailBoxFor(packageListView.SelectedPackage);\r
122                                         break;\r
123                                 default: // case 2 and over:\r
124                                         detailBox.Clear();\r
125                                         detailBox.Text = (installBtnEnabled)? string.Format("{0}個のソフトが選択されています。", installPkgCount) :\r
126                                                 (uninstallBtnEnabled)? string.Format("{0}個のインストール済みのソフトが選択されています。", uninstallPkgCount) :\r
127                                                 string.Format("{0}個のソフトが選択されています。\r\n(うち{1}個はインストール済み、{2}個はインストール可能)", pkgCount, uninstallPkgCount, installPkgCount);\r
128                                         break;\r
129                         }\r
130                         \r
131                         try {\r
132                                 detailBox.Select(0, 0);\r
133                                 detailBox.ScrollToCaret();\r
134                         } catch (System.Runtime.InteropServices.COMException) {\r
135                                 // ScrollToCaretでこけることがある\r
136                         }\r
137                 }\r
138 \r
139                 void PackageListViewItemActivate(object sender, EventArgs e)\r
140                 {\r
141                         Package pkg = packageListView.SelectedPackage;\r
142                         \r
143                         if (pkg != null) {\r
144                                 if (pkg is InstalledPackage) {\r
145                                         UninstallToolStripButtonClick(sender, e);\r
146                                 } else {\r
147                                         InstallToolStripButtonClick(sender, e);\r
148                                 }\r
149                         }\r
150                 }\r
151                 \r
152                 void Form_OnLoad(object sender, EventArgs e)\r
153                 {\r
154                         packageListViewImageList.Images.Add("installed", Icon.ExtractAssociatedIcon(Application.ExecutablePath));\r
155                         \r
156                         updatePackageFilterToolStripMenuItemCheckState();\r
157                         notInstalledPackageFilterToolStripMenuItem.Image = packageListViewImageList.Images["available-new"];\r
158                         installedASPackageFilterToolStripMenuItem.Image = packageListViewImageList.Images["installed"];\r
159                         installedSysPackageFilterToolStripMenuItem.Image = packageListViewImageList.Images["sys"];\r
160                         \r
161                         packageListView.UpdateItems();\r
162                         updateSelectedPackages();\r
163                 }\r
164                 \r
165                 #region PackageFilter関連\r
166                 \r
167                 /// <summary>\r
168                 /// packgageFilterToolStripのリストを更新する。\r
169                 /// </summary>\r
170                 private void updatePackageFilterToolStripMenuItemCheckState()\r
171                 {\r
172                         ToolStripMenuItem selected = getCheckedPackageFilterToolStripItem();\r
173                         \r
174                         foreach (ToolStripMenuItem item in packageFilterToolStripDropDownButton.DropDown.Items) {\r
175                                 item.Checked = (selected == item);\r
176                         }\r
177                         \r
178                         packageFilterToolStripDropDownButton.Text = selected.Text;\r
179                         packageFilterToolStripDropDownButton.Image = selected.Image;\r
180                         packageFilterToolStripDropDownButton.ToolTipText = selected.ToolTipText;\r
181                 }\r
182                 \r
183                 private ToolStripMenuItem getCheckedPackageFilterToolStripItem()\r
184                 {\r
185                         switch (packageListView.FilteringType) {\r
186                                 case PackageListViewPkgTypeFilter.NotInstalled:\r
187                                         return notInstalledPackageFilterToolStripMenuItem;\r
188                                 case PackageListViewPkgTypeFilter.InstalledAS:\r
189                                         return installedASPackageFilterToolStripMenuItem;\r
190                                 case PackageListViewPkgTypeFilter.InstalledSys:\r
191                                         return installedSysPackageFilterToolStripMenuItem;\r
192                                 default:\r
193                                         return allPackageFilterToolStripMenuItem;\r
194                         }\r
195                 }\r
196                 \r
197                 void AnyPackageFilterToolStripMenuItemClicked(object sender, EventArgs e)\r
198                 {\r
199                         if (sender == notInstalledPackageFilterToolStripMenuItem) {\r
200                                 packageListView.FilteringType = PackageListViewPkgTypeFilter.NotInstalled;\r
201                         } else if (sender == installedASPackageFilterToolStripMenuItem) {\r
202                                 packageListView.FilteringType = PackageListViewPkgTypeFilter.InstalledAS;\r
203                         } else if (sender == installedSysPackageFilterToolStripMenuItem) {\r
204                                 packageListView.FilteringType = PackageListViewPkgTypeFilter.InstalledSys;\r
205                         } else {\r
206                                 packageListView.FilteringType = PackageListViewPkgTypeFilter.All;\r
207                         }\r
208                         \r
209                         updatePackageFilterToolStripMenuItemCheckState();\r
210                         searchTextBox.FireTextChangedTrigger();\r
211                 }\r
212                 \r
213                 #endregion\r
214                 \r
215                 void DetailBoxLinkClicked(object sender, LinkClickedEventArgs e)\r
216                 {\r
217                         if (System.Text.RegularExpressions.Regex.IsMatch(e.LinkText, "^https?://")){\r
218                                 /* URLの場合はブラウザ起動 */\r
219                                 try {\r
220                                         System.Diagnostics.Process.Start(e.LinkText);\r
221                                 } catch (System.ComponentModel.Win32Exception) {\r
222                                         MessageBox.Show(string.Format("{0}を開くのに失敗しました。", e.LinkText), "ブラウザ起動エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
223                                 }\r
224                         } else {\r
225                                 /* それ以外はタグとみなして検索 */\r
226                                 searchTextBox.Text = e.LinkText;\r
227                         }\r
228                 }\r
229                 \r
230                 internal void updateActionInvoke(bool downloadPackageListsFlag)\r
231                 {\r
232                         AppliStation.Util.ExecutionProgressViewer prog = new AppliStation.Util.ExecutionProgressViewer();\r
233                         prog.Shown += delegate(object sender2, EventArgs e2) {\r
234                                 NaGet.SubCommands.NaGetUpdate tasks = new NaGet.SubCommands.NaGetUpdate(pkgListsMan, downloadPackageListsFlag);\r
235                                 prog.SetTaskSet(tasks);\r
236                                 prog.Refresh();\r
237                                 prog.StartTaskSet();\r
238                         };\r
239                         prog.Text = "リストの更新";\r
240                         prog.ShowDialog(this);\r
241                 }\r
242                         \r
243                 void UpdateToolStripMenuItemClick(object sender, EventArgs e)\r
244                 {\r
245                         updateActionInvoke(true);\r
246                         \r
247                         UpdatePackageList();\r
248                 }\r
249                 \r
250                 void LocalupdateToolStripMenuItemClick(object sender, EventArgs e)\r
251                 {\r
252                         updateActionInvoke(false);\r
253                         \r
254                         UpdatePackageList();\r
255                 }\r
256                 \r
257                 void SoftCollectionFileImportToolStripMenuItemClick(object sender, EventArgs e)\r
258                 {\r
259                         string pwd = Directory.GetCurrentDirectory();\r
260                         \r
261                         OpenFileDialog fd = new OpenFileDialog();\r
262                         fd.Filter = "ソフトコレクションファイル (*.txt)|*.txt";\r
263                         fd.DefaultExt = "txt";\r
264                         fd.CheckFileExists = true;\r
265                         fd.CheckPathExists = true;\r
266                         fd.Multiselect = false;\r
267                         fd.ShowDialog();\r
268                         if (fd.FileNames.Length > 0) {\r
269                                 string filepath = Path.GetFullPath(fd.FileName);\r
270                                 Directory.SetCurrentDirectory(pwd); // ファイルダイアログで変わったカレントディレクトリを戻す\r
271                                 \r
272                                 IList<Package> pkgs;\r
273                                 IList<string> invalid;\r
274                                 \r
275                                 try {\r
276                                         PackageCollectionFileData collectionData = new PackageCollectionFileData();\r
277                                         collectionData.load(filepath);\r
278                                         collectionData.generatePackages(pkgListsMan, out pkgs, out invalid);\r
279                                         \r
280                                         if (invalid.Count > 0) {\r
281                                                 DialogResult result = MessageBox.Show("一部読み込みの失敗したパッケージがありますが続行しますか?", "インポート", MessageBoxButtons.OKCancel, MessageBoxIcon.Error);\r
282                                                 if (result != DialogResult.OK) {\r
283                                                         return;\r
284                                                 }\r
285                                         }\r
286                                 } catch (IOException) {\r
287                                         MessageBox.Show("ファイルの読み込みに失敗しました", "インポート", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
288                                         return;\r
289                                 }\r
290                                 \r
291                                 {\r
292                                         InstallationConfirmForm confirm = new InstallationConfirmForm();\r
293                                         confirm.PkgListsManager = pkgListsMan;\r
294                                         confirm.Installations = Installation.ConvertInstallations( NaGet.Utils.IEnumerable2Array(pkgs) );\r
295                                         confirm.UseRunas = confirm.GetShouldUseRunas();\r
296                                         DialogResult result = confirm.ShowDialog(this);\r
297                                         \r
298                                         if (result == DialogResult.OK) {\r
299                                                 Installation[] insts = confirm.CheckedInstallations;\r
300                                                 \r
301                                                 if (confirm.UseRunas) {\r
302                                                         installRunasActionInvoke(insts);\r
303                                                 } else {\r
304                                                         installActionInvoke(insts);\r
305                                                 }\r
306                                                 \r
307                                                 UpdatePackageList();\r
308                                         }\r
309                                 }\r
310                         } else {\r
311                                 Directory.SetCurrentDirectory(pwd); // ファイルダイアログで変わったカレントディレクトリを戻す\r
312                         }\r
313                 }\r
314                 \r
315                 void SoftCollectionFileExportToolStripMenuItemClick(object sender, EventArgs e)\r
316                 {\r
317                         string pwd = Directory.GetCurrentDirectory();\r
318                         \r
319                         SaveFileDialog fd = new SaveFileDialog();\r
320                         fd.Filter = "ソフトコレクションファイル (*.txt)|*.txt";\r
321                         fd.DefaultExt = "txt";\r
322                         fd.CheckPathExists = true;\r
323                         fd.OverwritePrompt = true;\r
324                         fd.ShowDialog();\r
325                         if (fd.FileNames.Length > 0) {\r
326                                 string filepath = Path.GetFullPath(fd.FileName);\r
327                                 Directory.SetCurrentDirectory(pwd); // ファイルダイアログで変わったカレントディレクトリを戻す\r
328                                 \r
329                                 PackageCollectionFileData collectionData = new PackageCollectionFileData();\r
330                                 \r
331                                 collectionData.loadPackages(pkgListsMan.GetAllInstalledPackages());\r
332                                 \r
333                                 try {\r
334                                         collectionData.saveAs(fd.FileName);\r
335                                 } catch (UnauthorizedAccessException) {\r
336                                         if ((File.GetAttributes(fd.FileName) & FileAttributes.ReadOnly) != 0) {\r
337                                                 MessageBox.Show("読み取り専用属性が設定されています。\n別のファイルを指定してください。", "エクスポート", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
338                                         } else {\r
339                                                 MessageBox.Show("ファイルへの書き込みが許可されていません。\n別のファイルを指定してください。", "エクスポート", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
340                                         }\r
341                                         return;\r
342                                 } catch (IOException) {\r
343                                         MessageBox.Show("ファイルの書き込みに失敗しました", "エクスポート", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
344                                         return;\r
345                                 }\r
346                         } else {\r
347                                 Directory.SetCurrentDirectory(pwd); // ファイルダイアログで変わったカレントディレクトリを戻す\r
348                         }\r
349                 }\r
350                 \r
351                 void OptionToolStripMenuItemClick(object sender, EventArgs e)\r
352                 {\r
353                         UserPrefForm userPrefForm = new UserPrefForm();\r
354                         DialogResult result = userPrefForm.ShowDialog(this);\r
355                         \r
356                         if (result == DialogResult.OK) {\r
357                                 if (userPrefForm.IsRepositoryListSettingChanged) {\r
358                                         updateActionInvoke(true);\r
359                                         UpdatePackageList();\r
360                                 }\r
361                         }\r
362                 }\r
363                 \r
364                 #region searchTextBoxまわり\r
365                 \r
366                 void SearchTextBoxKeyPress(object sender, KeyPressEventArgs e)\r
367                 {\r
368                         switch (e.KeyChar) {\r
369                                 case (char)Keys.Enter:\r
370                                         searchTextBox.FireTextChangedTrigger();\r
371                                         break;\r
372                                 case (char)Keys.Escape:\r
373                                         searchTextBox.Text = string.Empty;\r
374                                         break;\r
375                         }\r
376                 }\r
377                 \r
378                 void SearchTextBoxTextChangedTriggerFired(object sender, EventArgs e)\r
379                 {\r
380                         packageListView.FilteringKeyword = searchTextBox.Text;\r
381                 }\r
382                 \r
383                 #endregion\r
384                 \r
385                 internal void installActionInvoke(Installation[] insts)\r
386                 {\r
387                         AppliStation.Util.ExecutionProgressViewer prog = new AppliStation.Util.ExecutionProgressViewer();\r
388                         prog.Shown += delegate(object sender2, EventArgs e2) {\r
389                                 NaGet.SubCommands.NaGetInstall tasks = new NaGet.SubCommands.NaGetInstall(pkgListsMan, insts);\r
390                                 prog.SetTaskSet(tasks);\r
391                                 prog.Refresh();\r
392                                 prog.StartTaskSet();\r
393                         };\r
394                         prog.Text = string.Format("ソフトウェアのインストール");\r
395                         prog.ShowDialog(this);\r
396                 }\r
397                 \r
398                 void InstallToolStripButtonClick(object sender, EventArgs e)\r
399                 {\r
400                         InstallationConfirmForm confirm = new InstallationConfirmForm();\r
401                         confirm.PkgListsManager = pkgListsMan;\r
402                         confirm.Installations = Installation.ConvertInstallations( NaGet.Utils.IEnumerable2Array(packageListView.SelectedPackages) );\r
403                         confirm.UseRunas = confirm.GetShouldUseRunas();\r
404                         DialogResult result = confirm.ShowDialog(this);\r
405                         \r
406                         if (result == DialogResult.OK) {\r
407                                 Installation[] insts = confirm.CheckedInstallations;\r
408                                 \r
409                                 if (confirm.UseRunas) {\r
410                                         installRunasActionInvoke(insts);\r
411                                 } else {\r
412                                         installActionInvoke(insts);\r
413                                 }\r
414                                 \r
415                                 UpdatePackageList();\r
416                         }\r
417                 }\r
418                 \r
419                 public void installRunasActionInvoke(Installation[] insts)\r
420                 {\r
421                         this.setWindowEnabled(false);\r
422                         \r
423                         string tmpfileName = Path.GetTempFileName();\r
424                         try {\r
425                                 NaGet.Utils.PutSerializeObject(tmpfileName, insts);\r
426                                 \r
427                                 System.Diagnostics.ProcessStartInfo procInfo = new System.Diagnostics.ProcessStartInfo();\r
428                                 procInfo.FileName = Application.ExecutablePath;\r
429                                 procInfo.Arguments = string.Format("--noupdate --cmd=install \"--instsref={0}\"", tmpfileName);\r
430                                 procInfo.Verb = "runas";\r
431                                 procInfo.WorkingDirectory = Environment.CurrentDirectory;\r
432                                 \r
433                                 System.Diagnostics.Process hProc = System.Diagnostics.Process.Start(procInfo);\r
434                                 hProc.EnableRaisingEvents = true;\r
435                                 hProc.SynchronizingObject = this;\r
436                                 hProc.Exited += delegate(object sender, EventArgs e) {\r
437                                         UpdatePackageList();\r
438                                         \r
439                                         this.setWindowEnabled(true);\r
440                                         this.BringToFront();\r
441                                         \r
442                                         if (File.Exists(tmpfileName)) {\r
443                                                 File.Delete(tmpfileName);\r
444                                         }\r
445                                 };\r
446                         } catch (System.ComponentModel.Win32Exception ex) {\r
447                                 MessageBox.Show(ex.Message, "インストール", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
448                                 \r
449                                 if (File.Exists(tmpfileName)) {\r
450                                         File.Delete(tmpfileName);\r
451                                 }                               this.setWindowEnabled(true);\r
452                         }\r
453                 }\r
454                 \r
455                 internal void uninstallActionInvoke(InstalledPackage[] pkgs)\r
456                 {\r
457                         AppliStation.Util.ExecutionProgressViewer prog = new AppliStation.Util.ExecutionProgressViewer();\r
458                         prog.Shown += delegate(object sender2, EventArgs e2) {\r
459                                 NaGet.SubCommands.NaGetUninstall tasks = new NaGet.SubCommands.NaGetUninstall(pkgListsMan, pkgs);\r
460                                 prog.SetTaskSet(tasks);\r
461                                 prog.Refresh();\r
462                                 prog.StartTaskSet();\r
463                         };\r
464                         prog.Text = string.Format("ソフトウェアのアンインストール");\r
465                         prog.ShowDialog(this);\r
466                 }\r
467                 \r
468                 internal void uninstallRunasActionInvoke(InstalledPackage[] pkgs)\r
469                 {                       \r
470                         this.setWindowEnabled(false);\r
471                         \r
472                         string tmpfileName = Path.GetTempFileName();\r
473                         try {\r
474                                 NaGet.Utils.PutSerializeObject(tmpfileName, pkgs);\r
475                                 \r
476                                 System.Diagnostics.ProcessStartInfo procInfo = new System.Diagnostics.ProcessStartInfo();\r
477                                 procInfo.FileName = Application.ExecutablePath;\r
478                                 procInfo.Arguments = string.Format("--noupdate --cmd=uninstall \"--pkgsref={0}\"", tmpfileName);\r
479                                 procInfo.Verb = "runas";\r
480                                 procInfo.WorkingDirectory = Environment.CurrentDirectory;\r
481                                 \r
482                                 System.Diagnostics.Process hProc = System.Diagnostics.Process.Start(procInfo);\r
483                                 hProc.EnableRaisingEvents = true;\r
484                                 hProc.SynchronizingObject = this;\r
485                                 hProc.Exited += delegate(object sender, EventArgs e) {\r
486                                         UpdatePackageList();\r
487                                         \r
488                                         this.setWindowEnabled(true);\r
489                                         this.BringToFront();\r
490                                         \r
491                                         if (File.Exists(tmpfileName)) {\r
492                                                 File.Delete(tmpfileName);\r
493                                         }\r
494                                 };\r
495                         } catch (System.ComponentModel.Win32Exception ex) {\r
496                                 MessageBox.Show(ex.Message, "アンインストール", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
497                                 \r
498                                 this.setWindowEnabled(true);\r
499                                 if (File.Exists(tmpfileName)) {\r
500                                         File.Delete(tmpfileName);\r
501                                 }\r
502                         }\r
503                 }\r
504                 \r
505                 void UninstallToolStripButtonClick(object sender, EventArgs e)\r
506                 {\r
507                         PackageUninstallConfirmForm confirm = new PackageUninstallConfirmForm();\r
508                         confirm.UninstallPackage = (InstalledPackage) packageListView.SelectedPackage;\r
509                         confirm.UseRunas = confirm.GetShouldUseRunas();\r
510                         DialogResult result = confirm.ShowDialog(this);\r
511                         \r
512                         if (result == DialogResult.OK) {\r
513                                 InstalledPackage[] instPkgs = new InstalledPackage[]{confirm.UninstallPackage};\r
514                                 \r
515                                 if (confirm.UseRunas) {\r
516                                         uninstallRunasActionInvoke(instPkgs);\r
517                                 } else {\r
518                                         uninstallActionInvoke(instPkgs);\r
519                                 }\r
520                                 \r
521                                 UpdatePackageList();\r
522                         }\r
523                 }\r
524                 \r
525                 \r
526                 void WebOfficialMenuItemClick(object sender, EventArgs e)\r
527                 {\r
528                         Package pkg = packageListView.SelectedPackage;\r
529                         if (pkg != null) {\r
530                                 string linkURL = pkg.Url.Href;\r
531                                 \r
532                                 if (! string.IsNullOrEmpty(linkURL)) {\r
533                                         try {\r
534                                                 System.Diagnostics.Process.Start(linkURL);\r
535                                         } catch (System.ComponentModel.Win32Exception) {\r
536                                                 MessageBox.Show(string.Format("{0}を開くのに失敗しました。", linkURL), "ブラウザ起動エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
537                                         }\r
538                                 }\r
539                         }\r
540                 }\r
541                 \r
542                 void WebGoogleSearchMenuItemClick(object sender, EventArgs e)\r
543                 {\r
544                         Package pkg = packageListView.SelectedPackage;\r
545                         if (pkg != null) {\r
546                                 string q = System.Web.HttpUtility.UrlEncode(pkg.Name, System.Text.Encoding.UTF8);\r
547                                 string googleURL = @"http://www.google.co.jp/search?q="+q;\r
548                                 \r
549                                 try {\r
550                                         System.Diagnostics.Process.Start(googleURL);\r
551                                 } catch (System.ComponentModel.Win32Exception) {\r
552                                         MessageBox.Show("Googleを開くのに失敗しました。", "ブラウザ起動エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
553                                 }\r
554                         }\r
555                 }\r
556                 \r
557                 void OpenInstalledDirectoryStripMenuItemClick(object sender, EventArgs e)\r
558                 {\r
559                         InstalledPackage pkg = (InstalledPackage) packageListView.SelectedPackage;\r
560                         if (pkg != null) {\r
561                                 if (pkg.Type == InstallerType.ARCHIVE || pkg.Type == InstallerType.ITSELF) {\r
562                                         System.Diagnostics.Process.Start(Path.Combine(NaGet.Env.ArchiveProgramFiles, pkg.Name));\r
563                                 } else if (Directory.Exists(pkg.DiscoverInstalledLocation())) {\r
564                                         System.Diagnostics.Process.Start(pkg.DiscoverInstalledLocation());\r
565                                 }\r
566                         }\r
567                 }\r
568                 \r
569                 \r
570                 void PropertiesCommonMenuItemClick(object sender, EventArgs e)\r
571                 {\r
572                         if (packageListView.SelectedItems.Count >= 5) {\r
573                                 string msg = string.Format("{0}個のプロパティダイアログを開こうとしています。\n継続しますか?", packageListView.SelectedItems.Count);\r
574                                 if (MessageBox.Show(msg, "プロパティ", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) != DialogResult.OK) {\r
575                                         return;\r
576                                 }\r
577                         }\r
578                         \r
579                         foreach (Package pkg in packageListView.SelectedPackages) {\r
580                                 PackageInfoForm form = new PackageInfoForm();\r
581                                 form.SelectedObject = pkg;\r
582                                 form.Text = string.Format("{0}({1})のプロパティ", pkg.Name, pkg.Version);\r
583                                 \r
584                                 form.Show(this);\r
585                         }\r
586                 }\r
587                 \r
588                 private void updateLauncherMenuItem(AppliStation.Util.ToolStripPetitLauncherMenuItem launcherMenuItem)\r
589                 {\r
590                         bool selectionIsOnlyOne = packageListView.SelectedItems.Count == 1;\r
591                         \r
592                         if (selectionIsOnlyOne) {\r
593                                 Package pkg = packageListView.SelectedPackage;\r
594                                 InstalledPackage iPkg = pkg as InstalledPackage;\r
595                                 \r
596                                 // インストール済みパッケージのとき\r
597                                 if (iPkg != null) {\r
598                                         bool launcherMenuItemVisible = \r
599                                                 (pkg.Type == InstallerType.ARCHIVE) ||\r
600                                                 (pkg.Type == InstallerType.ITSELF) ||\r
601                                                 Directory.Exists(iPkg.DiscoverInstalledLocation());\r
602                                         \r
603                                         launcherMenuItem.Visible = launcherMenuItemVisible;\r
604                                         if (launcherMenuItemVisible) {\r
605                                                 launcherMenuItem.BaseFolderPath = iPkg.DiscoverInstalledLocation();\r
606                                         }\r
607                                 } else {\r
608                                         launcherMenuItem.Visible = false;\r
609                                 }\r
610                         } else {\r
611                                 launcherMenuItem.Visible = false;\r
612                         }\r
613                 }\r
614                 \r
615                 void PackageListContextMenuStripOpening(object sender, System.ComponentModel.CancelEventArgs e)\r
616                 {\r
617                         bool selectionIsOnlyOne = packageListView.SelectedItems.Count == 1;\r
618                         bool hasSelection = packageListView.SelectedItems.Count > 0;\r
619                         \r
620                         updateSelectedPackages();\r
621                         \r
622                         // インストール先のフォルダの設定\r
623                         updateLauncherMenuItem(installedDirectoryToolStripMenuItem);\r
624                         \r
625                         if (packageListView.View == View.Details) {\r
626                                 // ヘッダ部がクリックされたとき、パッケージが選択されていないものとして扱って処理をする。\r
627                                 int headerHeight = AppliStation.Util.NativeMethods.ColumnHeader_GetSize(packageListView).Height;\r
628                                 if (packageListView.PointToClient(packageListContextMenuStrip.Location).Y < headerHeight) {\r
629                                         selectionIsOnlyOne = hasSelection = false;\r
630                                         installToolStripMenuItem.Visible = false;\r
631                                         uninstallToolStripMenuItem.Visible = false;\r
632                                         installedDirectoryToolStripMenuItem.Visible = false;\r
633                                 }\r
634                         }\r
635                         \r
636                         packageListContextMenuStripSeparator.Visible = selectionIsOnlyOne;\r
637                         webResourceToolStripMenuItem.Visible = selectionIsOnlyOne;\r
638                         propertiesToolStripMenuItem.Visible = hasSelection;\r
639                         columnToolStripMenuItem.Visible = (! hasSelection) && (packageListView.View == View.Details);\r
640                 }\r
641                 \r
642                 void InformationToolStripDropDownButtonDropDownOpening(object sender, EventArgs e)\r
643                 {\r
644                         bool selectionIsOnlyOne = packageListView.SelectedItems.Count == 1;\r
645                         bool hasSelection = packageListView.SelectedItems.Count > 0;\r
646                         \r
647                         // インストール先のフォルダの設定\r
648                         updateLauncherMenuItem(installedDirectoryMenuItem);\r
649                         \r
650                         webResourceMenuItem.Visible = selectionIsOnlyOne;\r
651                         propertiesMenuItem.Visible = hasSelection;\r
652                 }\r
653                 \r
654                 void WebResourceCommonContextMenuStripOpening(object sender, System.ComponentModel.CancelEventArgs e)\r
655                 {\r
656                         Package pkg = packageListView.SelectedPackage;\r
657                         \r
658                         if (pkg != null && pkg.Url != null && !string.IsNullOrEmpty(pkg.Url.Href)) {\r
659                                 webOfficialMenuItem.Enabled = true;\r
660                                 webOfficialMenuItem.ToolTipText = pkg.Url.Href;\r
661                         } else {\r
662                                 webOfficialMenuItem.Enabled = false;\r
663                                 webOfficialMenuItem.ToolTipText = null;\r
664                         }\r
665                         \r
666                         // webGoogleSearchMenuItem always active.\r
667                 }\r
668                 \r
669                 private IEnumerable<Package> getUpdatedPackages(PackageList<InstalledPackage> installedPkgList, PackageList<Package> avaiablePkgList, IComparer<string> verComp)\r
670                 {\r
671                         foreach (InstalledPackage pkg in installedPkgList) {\r
672                                 Package avaiablePkg = avaiablePkgList.GetPackageForName(pkg.Name);\r
673                                 \r
674                                 if (avaiablePkg != null) {\r
675                                         if (verComp.Compare(pkg.Version, avaiablePkg.Version) < 0 &&\r
676                                             installedPkgList.GetPackageForPackage(pkg.Name, avaiablePkg.Version) == null) {\r
677                                                 \r
678                                                 yield return avaiablePkg;\r
679                                         }\r
680                                 }\r
681                         }\r
682                 }\r
683                 \r
684                 void UpgradeToolStripButtonClick(object sender, EventArgs e)\r
685                 {\r
686                         List<Package> pkgs;\r
687                         VersionComparetor verComp = new VersionComparetor();\r
688                         PackageList<Package> avaiablePackageList = pkgListsMan.AvailablePkgList;\r
689                         \r
690                         pkgs = NaGet.Utils.MergeList(\r
691                                 getUpdatedPackages(pkgListsMan.InstalledPkgList, avaiablePackageList, verComp),\r
692                                 getUpdatedPackages(pkgListsMan.SystemInstalledPkgList, avaiablePackageList, verComp)\r
693                         );\r
694                         \r
695                         if (pkgs.Count <= 0) {\r
696                                 MessageBox.Show(this, "更新されたソフトはありません", "ソフトの更新");\r
697                                 return;\r
698                         }\r
699                         \r
700                         InstallationConfirmForm confirm = new InstallationConfirmForm();\r
701                         confirm.PkgListsManager = pkgListsMan;\r
702                         confirm.Installations = Installation.ConvertInstallations(pkgs.ToArray());\r
703                         DialogResult result = confirm.ShowDialog(this);\r
704                         \r
705                         if (result == DialogResult.OK) {\r
706                                 Installation[] insts = confirm.CheckedInstallations;\r
707                                 \r
708                                 if (confirm.UseRunas) {\r
709                                         installRunasActionInvoke(insts);\r
710                                 } else {\r
711                                         installActionInvoke(insts);\r
712                                 }\r
713                                 \r
714                                 UpdatePackageList();\r
715                         }\r
716                 }\r
717                 \r
718                 protected override bool ProcessCmdKey(ref Message msg, Keys keyData)\r
719                 {\r
720                         if ((int)keyData == (int)Keys.Control + (int)Keys.E) {\r
721                                 searchTextBox.SelectAll();\r
722                                 searchTextBox.Focus();\r
723                                 return true;\r
724                         }\r
725                         \r
726                         return base.ProcessCmdKey(ref msg, keyData);\r
727                 }\r
728                 \r
729                 public void UpdatePackageList()\r
730                 {\r
731                         pkgListsMan.LoadPackageLists();\r
732                         packageListView.UpdateItems();\r
733                         updateSelectedPackages();\r
734                 }\r
735                 \r
736                 /// <summary>\r
737                 /// 自ウィンドウの有効無効(Enabled)を(必要あればInvokeして)実行する \r
738                 /// </summary>\r
739                 /// <param name="enabled">有効か否か。Enabledの値に入れられる</param>\r
740                 private void setWindowEnabled(bool enabled)\r
741                 {\r
742                         MethodInvoker process = (MethodInvoker) delegate() {\r
743                                 this.Enabled = enabled;\r
744                         };\r
745                         \r
746                         if (InvokeRequired) {\r
747                                 Invoke(process);\r
748                         } else {\r
749                                 process.Invoke();\r
750                         }\r
751                 }\r
752                 \r
753                 void ColumnCommonToolStripMenuItemClick(object sender, EventArgs e)\r
754                 {\r
755                         packageListView.BeginUpdate();\r
756                         ColumnHeader sortcolumn = packageListView.SortColumn;\r
757                         \r
758                         // 列の追加と削除\r
759                         foreach (ToolStripItem item in columnToolStripMenuItem.DropDownItems) {\r
760                                 ToolStripMenuItem menu = item as ToolStripMenuItem;\r
761                                 if (menu != null) {\r
762                                         bool exists = false;\r
763                                         // 列が存在しているがチェックが外れていたら削除する。\r
764                                         foreach (ColumnHeader header in packageListView.Columns) {\r
765                                                 if (header.Tag == menu.Tag) {\r
766                                                         exists = true;\r
767                                                         if (sortcolumn == header) {\r
768                                                                 packageListView.SortColumn = sortcolumn = null;\r
769                                                         }\r
770                                                         if (menu.Checked == false) {\r
771                                                                 packageListView.Columns.Remove(header);\r
772                                                         }\r
773                                                         break;\r
774                                                 }\r
775                                         }\r
776                                         \r
777                                         // 列が存在していなく、チェックがされているなら追加する。\r
778                                         if (menu.Checked && !exists) {\r
779                                                 ColumnHeader header = new ColumnHeader();\r
780                                                 header.Text = menu.Text;\r
781                                                 header.Tag = menu.Tag;\r
782                                                 packageListView.Columns.Add(header);\r
783                                         }\r
784                                 }\r
785                         }\r
786                         \r
787                         AppliStation.Util.NativeMethods.ColumnHeader_SetSortState(packageListView, (sortcolumn != null)? sortcolumn.Index : -1, SortOrder.None);\r
788                         \r
789                         packageListView.UpdateItems();\r
790                         \r
791                         packageListView.EndUpdate();\r
792                 }\r
793         }\r
794 \r
795 }\r