2 using System.Drawing;
\r
3 using System.Windows.Forms;
\r
4 using NaGet.Packages;
\r
5 using NaGet.Packages.Install;
\r
7 using System.Collections.Generic;
\r
9 namespace AppliStation
\r
12 /// Description of PackageListViewForm.
\r
14 public partial class PackageListViewForm : Form
\r
16 protected PackageListsManager pkgListsMan = null;
\r
18 public PackageListViewForm()
\r
21 // The InitializeComponent() call is required for Windows Forms designer support.
\r
23 InitializeComponent();
\r
25 installToolStripMenuItem.Font = new Font(installToolStripMenuItem.Font, FontStyle.Bold);
\r
26 uninstallToolStripMenuItem.Font = new Font(uninstallToolStripMenuItem.Font, FontStyle.Bold);
\r
28 pkgListsMan = new PackageListsManager();
\r
30 this.Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath);
\r
31 AppliStation.Util.NativeMethods.ListView_EnableVistaExplorerTheme(packageListView);
\r
32 AppliStation.Util.NativeMethods.ListView_SetDoubleBuffer(packageListView, true);
\r
35 private void ShowInfoToDetailBoxFor(Package pkg)
\r
39 detailBox.SelectionFont = new Font(detailBox.Font.FontFamily, 12);
\r
40 detailBox.SelectedText += string.Format("{0} ({1})\r\n", pkg.Name, pkg.Version);
\r
41 if (! string.IsNullOrEmpty(pkg.Tags) ) {
\r
42 detailBox.SelectionFont = new Font(detailBox.Font.FontFamily, 8);
\r
43 detailBox.SelectedText += "タグ:";
\r
44 foreach (string tag in pkg.Tags.Split(' ')) {
\r
45 detailBox.AppendText(" ");
\r
46 AppliStation.Util.NativeMethods.RichTextBox_AddTextLink(detailBox, tag);
\r
48 detailBox.AppendText("\r\n");
\r
50 if (pkg is InstalledPackage) {
\r
51 InstalledPackage iPkg = (InstalledPackage) pkg;
\r
52 System.Text.StringBuilder sb = new System.Text.StringBuilder();
\r
53 if (iPkg.UninstallInfo.InstallDate != null) {
\r
54 sb.AppendFormat("インストールした日: {0:d} ", iPkg.UninstallInfo.InstallDate.Value);
\r
56 if (iPkg.UninstallInfo.EstimatedSize > 0) {
\r
57 sb.AppendFormat("サイズ: {0} ", NaGet.Utils.FormatSize(iPkg.UninstallInfo.EstimatedSize*1024));
\r
60 if (sb.Length > 0) {
\r
61 detailBox.SelectionFont = new Font(detailBox.Font.FontFamily, 8);
\r
62 detailBox.SelectedText += sb.ToString();
\r
63 detailBox.SelectedText += "\r\n";
\r
66 detailBox.SelectionFont = detailBox.Font;
\r
67 if (pkg.Url != null && pkg.Url.Href != null) {
\r
68 detailBox.SelectedText += "公式サイト: ";
\r
69 AppliStation.Util.NativeMethods.RichTextBox_AddTextLink(detailBox, pkg.Url.Href);
\r
70 detailBox.SelectedText += "\r\n";
\r
72 detailBox.SelectedText += pkg.Summary;
\r
75 void PackageListViewSelectedIndexChanged(object sender, EventArgs e)
\r
77 uint installPkgCount = 0;
\r
78 uint uninstallPkgCount = 0;
\r
79 bool installBtnEnabled, uninstallBtnEnabled;
\r
81 Package[] selectedPkgs = NaGet.Utils.IEnumerable2Array<Package>(GetSelectedPackages<Package>());
\r
82 foreach (Package pkg in selectedPkgs) {
\r
83 if (pkg is InstalledPackage) {
\r
84 uninstallPkgCount ++;
\r
89 installBtnEnabled = (installPkgCount > 0) && (uninstallPkgCount == 0);
\r
90 uninstallBtnEnabled = (uninstallPkgCount == 1) && (installPkgCount == 0);
\r
92 upgradeToolStripButton.Visible = (selectedPkgs.Length <= 0);
\r
93 informationToolStripDropDownButton.Visible = (selectedPkgs.Length == 1);
\r
94 uninstallToolStripButton.Visible = uninstallBtnEnabled;
\r
95 installToolStripButton.Visible = installBtnEnabled;
\r
97 // detailBoxのメッセージ設定
\r
99 switch (selectedPkgs.Length) {
\r
101 int count = packageListView.Items.Count;
\r
102 detailBox.Text = (count > 0) ? string.Format("{0}個のソフトがあります。", count)
\r
103 : "該当するソフトがありません。";
\r
106 ShowInfoToDetailBoxFor(selectedPkgs[0]);
\r
108 default: // case 2 and over:
\r
109 detailBox.Text = (installBtnEnabled)? string.Format("{0}個のソフトが選択されています。", installPkgCount) :
\r
110 (uninstallBtnEnabled)? string.Format("{0}個のインストール済みのソフトが選択されています。", uninstallPkgCount) :
\r
111 string.Format("{0}個のソフトが選択されています。\r\n(うち{1}個はインストール済み、{2}個はインストール可能)", installPkgCount+uninstallPkgCount, uninstallPkgCount, installPkgCount);
\r
116 detailBox.Select(0, 0);
\r
117 detailBox.ScrollToCaret();
\r
118 } catch (System.Runtime.InteropServices.COMException) {
\r
119 // ScrollToCaretでこけることがある
\r
123 void PackageListViewItemActivate(object sender, EventArgs e)
\r
125 if (packageListView.SelectedItems.Count <= 0) {
\r
129 foreach (ListViewItem item in packageListView.SelectedItems) {
\r
130 Package pkg = (Package) item.Tag;
\r
132 if (pkg is InstalledPackage) {
\r
133 UninstallToolStripButtonClick(sender, e);
\r
135 InstallToolStripButtonClick(sender, e);
\r
142 private void buildInstalledDirectoryMenuItemStripChildren(InstalledPackage pkg)
\r
144 //installedDirectoryStripMenuItem.BaseFolderPath = pkg.UninstallInfo.InstallLocation;
\r
145 installedDirectoryStripMenuItem.BaseFolderPath = pkg.discoverInstalledLocation();
\r
148 #region packageListViewのSort関連
\r
150 AppliStation.Util.ListViewItemSortComparer packageListViewSortComparer;
\r
152 void PackageListViewColumnClick(object sender, ColumnClickEventArgs e)
\r
154 SortOrder order = SortOrder.None;
\r
156 if (packageListViewSortComparer == null) {
\r
157 order = SortOrder.Ascending;
\r
158 packageListViewSortComparer = new AppliStation.Util.ListViewItemSortComparer(e.Column, order);
\r
159 packageListView.ListViewItemSorter = packageListViewSortComparer;
\r
161 if (packageListViewSortComparer.Column == e.Column) {
\r
162 order = (packageListViewSortComparer.Order == SortOrder.Ascending)? SortOrder.Descending : SortOrder.Ascending;
\r
164 packageListViewSortComparer.Order = order;
\r
166 order = packageListViewSortComparer.Order;
\r
167 packageListViewSortComparer.Column = e.Column;
\r
170 packageListView.Sort();
\r
172 AppliStation.Util.NativeMethods.ColumnHeader_SetSortState(packageListView, e.Column, order);
\r
176 // SendMessage(hWnd, LVM_SETSELECTEDCOLUMN, column, NULL);
\r
177 AppliStation.Util.NativeMethods.SendMessage(packageListView.Handle, 0x1000+140, (uint) e.Column, 0);
\r
178 } catch (Exception) {
\r
184 void Form_OnLoad(object sender, EventArgs e)
\r
186 packageListViewImageList.Images.Add("installed", Icon.ExtractAssociatedIcon(Application.ExecutablePath));
\r
188 updatePackageFilterToolStripMenuItemCheckState();
\r
189 installedASPackageFilterToolStripMenuItem.Image = packageListViewImageList.Images["installed"];
\r
190 installedSysPackageFilterToolStripMenuItem.Image = packageListViewImageList.Images["sys"];
\r
193 #region PackageFilter関連
\r
195 private enum PackageFilterIndex : int
\r
203 private PackageFilterIndex currentPackageFilter = PackageFilterIndex.All;
\r
205 private PackageFilterIndex CurrentPackageFilter {
\r
207 return currentPackageFilter;
\r
210 currentPackageFilter = value;
\r
212 updatePackageFilterToolStripMenuItemCheckState();
\r
216 private void updatePackageFilterToolStripMenuItemCheckState()
\r
218 ToolStripMenuItem selected = getCheckedPackageFilterToolStripItem();
\r
220 foreach (ToolStripMenuItem item in packageFilterToolStripDropDownButton.DropDown.Items) {
\r
221 item.Checked = selected == item;
\r
224 packageFilterToolStripDropDownButton.Text = selected.Text;
\r
225 packageFilterToolStripDropDownButton.Image = selected.Image;
\r
226 packageFilterToolStripDropDownButton.ToolTipText = selected.ToolTipText;
\r
229 private ToolStripMenuItem getCheckedPackageFilterToolStripItem()
\r
231 switch (currentPackageFilter) {
\r
232 case PackageFilterIndex.NotInstalled:
\r
233 return notInstalledPackageFilterToolStripMenuItem;
\r
234 case PackageFilterIndex.InstalledAS:
\r
235 return installedASPackageFilterToolStripMenuItem;
\r
236 case PackageFilterIndex.InstalledSys:
\r
237 return installedSysPackageFilterToolStripMenuItem;
\r
239 return allPackageFilterToolStripMenuItem;
\r
243 void AnyPackageFilterToolStripMenuItemClicked(object sender, EventArgs e)
\r
245 if (sender == notInstalledPackageFilterToolStripMenuItem) {
\r
246 currentPackageFilter = PackageFilterIndex.NotInstalled;
\r
247 } else if (sender == installedASPackageFilterToolStripMenuItem) {
\r
248 currentPackageFilter = PackageFilterIndex.InstalledAS;
\r
249 } else if (sender == installedSysPackageFilterToolStripMenuItem) {
\r
250 currentPackageFilter = PackageFilterIndex.InstalledSys;
\r
252 currentPackageFilter = PackageFilterIndex.All;
\r
255 updatePackageFilterToolStripMenuItemCheckState();
\r
256 searchTextBox.FireTextChangedTrigger();
\r
257 PackageListViewUpdate();
\r
262 void PackageListViewUpdate()
\r
264 this.packageListView.Items.Clear();
\r
266 if (currentPackageFilter == PackageFilterIndex.All || currentPackageFilter == PackageFilterIndex.NotInstalled) {
\r
267 foreach (Package pkg in pkgListsMan.AvailablePkgList.Search(searchTextBox.Text)) {
\r
268 if (Installation.GetPreferInstallerIndex(pkg) >= 0) { // インストール可能
\r
269 if (currentPackageFilter == PackageFilterIndex.NotInstalled &&
\r
270 (pkgListsMan.InstalledPkgList.GetPackageForName(pkg.Name) != null||
\r
271 pkgListsMan.SystemInstalledPkgList.GetPackageForName(pkg.Name) != null) ) {
\r
272 continue; // インストール済みは次のループへ(未インストールソフト抽出時)
\r
275 ListViewItem item = new ListViewItem(new string[]{pkg.Name, pkg.Version, pkg.Summary});
\r
277 item.ToolTipText = pkg.Summary;
\r
279 this.packageListView.Items.Add(item);
\r
284 if (currentPackageFilter == PackageFilterIndex.All || currentPackageFilter == PackageFilterIndex.InstalledAS) {
\r
285 foreach (Package pkg in pkgListsMan.InstalledPkgList.Search(searchTextBox.Text)) {
\r
286 ListViewItem item = new ListViewItem(new string[]{pkg.Name, pkg.Version, pkg.Summary});
\r
288 item.ToolTipText = pkg.Summary;
\r
289 item.ImageKey = "installed";
\r
291 this.packageListView.Items.Add(item);
\r
295 if (currentPackageFilter == PackageFilterIndex.All || currentPackageFilter == PackageFilterIndex.InstalledSys) {
\r
296 foreach (Package pkg in pkgListsMan.SystemInstalledPkgList.Search(searchTextBox.Text)) {
\r
297 ListViewItem item = new ListViewItem(new string[]{pkg.Name, pkg.Version, pkg.Summary});
\r
299 item.ToolTipText = pkg.Summary;
\r
300 item.ImageKey = "sys";
\r
302 this.packageListView.Items.Add(item);
\r
306 PackageListViewSelectedIndexChanged(packageListView, null);
\r
307 detailBox.Refresh();
\r
309 //this.packageListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
\r
312 void DetailBoxLinkClicked(object sender, LinkClickedEventArgs e)
\r
314 if (System.Text.RegularExpressions.Regex.IsMatch(e.LinkText, "^https?://")){
\r
315 /* URLの場合はブラウザ起動 */
\r
317 System.Diagnostics.Process.Start(e.LinkText);
\r
318 } catch (System.ComponentModel.Win32Exception) {
\r
319 MessageBox.Show(string.Format("{0}を開くのに失敗しました。", e.LinkText), "ブラウザ起動エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
322 /* それ以外はタグとみなして検索 */
\r
323 searchTextBox.Text = e.LinkText;
\r
327 internal void updateActionInvoke(bool downloadPackageListsFlag)
\r
329 AppliStation.Util.ExecutionProgressViewer prog = new AppliStation.Util.ExecutionProgressViewer();
\r
330 prog.Shown += delegate(object sender2, EventArgs e2) {
\r
331 NaGet.SubCommands.NaGetUpdate tasks = new NaGet.SubCommands.NaGetUpdate(pkgListsMan, downloadPackageListsFlag);
\r
332 prog.SetTaskSet(tasks);
\r
334 prog.StartTaskSet();
\r
336 prog.Text = "リストの更新";
\r
337 prog.ShowDialog(this);
\r
340 void UpdateToolStripMenuItemClick(object sender, EventArgs e)
\r
342 updateActionInvoke(true);
\r
344 UpdatePackageList();
\r
347 void LocalupdateToolStripMenuItemClick(object sender, EventArgs e)
\r
349 updateActionInvoke(false);
\r
351 UpdatePackageList();
\r
354 void OptionToolStripMenuItemClick(object sender, EventArgs e)
\r
356 UserPrefForm userPrefForm = new UserPrefForm();
\r
357 DialogResult result = userPrefForm.ShowDialog(this);
\r
359 if (result == DialogResult.OK) {
\r
360 if (userPrefForm.IsRepositoryListSettingChanged) {
\r
361 updateActionInvoke(true);
\r
362 UpdatePackageList();
\r
367 #region searchTextBoxまわり
\r
369 void SearchTextBoxKeyPress(object sender, KeyPressEventArgs e)
\r
371 switch (e.KeyChar) {
\r
372 case (char)Keys.Enter:
\r
373 searchTextBox.FireTextChangedTrigger();
\r
375 case (char)Keys.Escape:
\r
376 searchTextBox.Text = string.Empty;
\r
381 void SearchTextBoxTextChangedTriggerFired(object sender, EventArgs e)
\r
383 PackageListViewUpdate();
\r
388 internal void installActionInvoke(Installation[] insts)
\r
390 AppliStation.Util.ExecutionProgressViewer prog = new AppliStation.Util.ExecutionProgressViewer();
\r
391 prog.Shown += delegate(object sender2, EventArgs e2) {
\r
392 NaGet.SubCommands.NaGetInstall tasks = new NaGet.SubCommands.NaGetInstall(pkgListsMan, insts);
\r
393 prog.SetTaskSet(tasks);
\r
395 prog.StartTaskSet();
\r
397 prog.Text = string.Format("ソフトウェアのインストール");
\r
398 prog.ShowDialog(this);
\r
401 void InstallToolStripButtonClick(object sender, EventArgs e)
\r
403 InstallationConfirmForm confirm = new InstallationConfirmForm();
\r
404 confirm.PkgListsManager = pkgListsMan;
\r
405 confirm.Installations = Installation.ConvertInstallations( NaGet.Utils.IEnumerable2Array(GetSelectedPackages<Package>()) );
\r
406 confirm.UseRunas = confirm.GetShouldUseRunas();
\r
407 DialogResult result = confirm.ShowDialog(this);
\r
409 if (result == DialogResult.OK) {
\r
410 Installation[] insts = confirm.CheckedInstallations;
\r
412 if (confirm.UseRunas) {
\r
413 installRunasActionInvoke(insts);
\r
415 installActionInvoke(insts);
\r
418 UpdatePackageList();
\r
422 public void installRunasActionInvoke(Installation[] insts)
\r
424 this.setWindowEnabled(false);
\r
426 string tmpfileName = Path.GetTempFileName();
\r
428 NaGet.Utils.PutSerializeObject(tmpfileName, insts);
\r
430 System.Diagnostics.ProcessStartInfo procInfo = new System.Diagnostics.ProcessStartInfo();
\r
431 procInfo.FileName = Application.ExecutablePath;
\r
432 procInfo.Arguments = string.Format("--noupdate --cmd=install \"--instsref={0}\"", tmpfileName);
\r
433 procInfo.Verb = "runas";
\r
434 procInfo.WorkingDirectory = Environment.CurrentDirectory;
\r
436 System.Diagnostics.Process hProc = System.Diagnostics.Process.Start(procInfo);
\r
437 hProc.EnableRaisingEvents = true;
\r
438 hProc.SynchronizingObject = this;
\r
439 hProc.Exited += delegate(object sender, EventArgs e) {
\r
440 UpdatePackageList();
\r
442 this.setWindowEnabled(true);
\r
443 this.BringToFront();
\r
445 if (File.Exists(tmpfileName)) {
\r
446 File.Delete(tmpfileName);
\r
449 } catch (System.ComponentModel.Win32Exception ex) {
\r
450 MessageBox.Show(ex.Message, "インストール", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
452 if (File.Exists(tmpfileName)) {
\r
453 File.Delete(tmpfileName);
\r
454 } this.setWindowEnabled(true);
\r
458 internal void uninstallActionInvoke(InstalledPackage[] pkgs)
\r
460 AppliStation.Util.ExecutionProgressViewer prog = new AppliStation.Util.ExecutionProgressViewer();
\r
461 prog.Shown += delegate(object sender2, EventArgs e2) {
\r
462 NaGet.SubCommands.NaGetUninstall tasks = new NaGet.SubCommands.NaGetUninstall(pkgListsMan, pkgs);
\r
463 prog.SetTaskSet(tasks);
\r
465 prog.StartTaskSet();
\r
467 prog.Text = string.Format("ソフトウェアのアンインストール");
\r
468 prog.ShowDialog(this);
\r
471 internal void uninstallRunasActionInvoke(InstalledPackage[] pkgs)
\r
473 this.setWindowEnabled(false);
\r
475 string tmpfileName = Path.GetTempFileName();
\r
477 NaGet.Utils.PutSerializeObject(tmpfileName, pkgs);
\r
479 System.Diagnostics.ProcessStartInfo procInfo = new System.Diagnostics.ProcessStartInfo();
\r
480 procInfo.FileName = Application.ExecutablePath;
\r
481 procInfo.Arguments = string.Format("--noupdate --cmd=uninstall \"--pkgsref={0}\"", tmpfileName);
\r
482 procInfo.Verb = "runas";
\r
483 procInfo.WorkingDirectory = Environment.CurrentDirectory;
\r
485 System.Diagnostics.Process hProc = System.Diagnostics.Process.Start(procInfo);
\r
486 hProc.EnableRaisingEvents = true;
\r
487 hProc.SynchronizingObject = this;
\r
488 hProc.Exited += delegate(object sender, EventArgs e) {
\r
489 UpdatePackageList();
\r
491 this.setWindowEnabled(true);
\r
492 this.BringToFront();
\r
494 if (File.Exists(tmpfileName)) {
\r
495 File.Delete(tmpfileName);
\r
498 } catch (System.ComponentModel.Win32Exception ex) {
\r
499 MessageBox.Show(ex.Message, "アンインストール", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
501 this.setWindowEnabled(true);
\r
502 if (File.Exists(tmpfileName)) {
\r
503 File.Delete(tmpfileName);
\r
508 void UninstallToolStripButtonClick(object sender, EventArgs e)
\r
510 PackageUninstallConfirmForm confirm = new PackageUninstallConfirmForm();
\r
511 foreach (InstalledPackage pkg in GetSelectedPackages<InstalledPackage>()) {
\r
512 confirm.UninstallPackage = pkg;
\r
515 confirm.UseRunas = confirm.GetShouldUseRunas();
\r
516 DialogResult result = confirm.ShowDialog(this);
\r
518 if (result == DialogResult.OK) {
\r
519 InstalledPackage[] instPkgs = new InstalledPackage[]{confirm.UninstallPackage};
\r
521 if (confirm.UseRunas) {
\r
522 uninstallRunasActionInvoke(instPkgs);
\r
524 uninstallActionInvoke(instPkgs);
\r
527 UpdatePackageList();
\r
532 void WebOfficialToolStripMenuItemClick(object sender, EventArgs e)
\r
534 foreach (Package pkg in GetSelectedPackages<Package>()) {
\r
535 string linkURL = pkg.Url.Href;
\r
537 if (! (pkg == null || string.IsNullOrEmpty(linkURL))) {
\r
539 System.Diagnostics.Process.Start(linkURL);
\r
540 } catch (System.ComponentModel.Win32Exception) {
\r
541 MessageBox.Show(string.Format("{0}を開くのに失敗しました。", linkURL), "ブラウザ起動エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
548 void WebGoogleSearchToolStripMenuItemClick(object sender, EventArgs e)
\r
550 foreach (Package pkg in GetSelectedPackages<Package>()) {
\r
551 string q = System.Web.HttpUtility.UrlEncode(pkg.Name, System.Text.Encoding.UTF8);
\r
552 string googleURL = @"http://www.google.co.jp/search?q="+q;
\r
555 System.Diagnostics.Process.Start(googleURL);
\r
556 } catch (System.ComponentModel.Win32Exception) {
\r
557 MessageBox.Show("Googleを開くのに失敗しました。", "ブラウザ起動エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
564 void OpenInstalledDirectoryStripMenuItemClick(object sender, EventArgs e)
\r
566 foreach (InstalledPackage pkg in GetSelectedPackages<InstalledPackage>()) {
\r
567 if (pkg.Type == InstallerType.ARCHIVE) {
\r
568 System.Diagnostics.Process.Start(Path.Combine(NaGet.Env.ArchiveProgramFiles, pkg.Name));
\r
569 } else if (Directory.Exists(pkg.discoverInstalledLocation())) {
\r
570 System.Diagnostics.Process.Start(pkg.discoverInstalledLocation());
\r
578 void PropertiesToolStripMenuItemClick(object sender, EventArgs e)
\r
580 foreach (Package pkg in GetSelectedPackages<Package>()) {
\r
581 PackageInfoForm form = new PackageInfoForm();
\r
582 form.SelectedObject = pkg;
\r
583 form.Text = string.Format("{0}({1})のプロパティ", pkg.Name, pkg.Version);
\r
585 form.ShowDialog(this);
\r
591 void PackageListContextMenuStripOpening(object sender, System.ComponentModel.CancelEventArgs e)
\r
593 // コンテクストメニューから開かれなかった場合はインストール/アンインストールは表示しない
\r
594 bool parentIsPkgListView = (packageListContextMenuStrip.SourceControl == packageListView);
\r
595 // メニューアイテムのインストール/アンインストールの表示はツールストリップに同じ
\r
596 installToolStripMenuItem.Visible = parentIsPkgListView && installToolStripButton.Visible;
\r
597 uninstallToolStripMenuItem.Visible = parentIsPkgListView && uninstallToolStripButton.Visible;
\r
599 // インストールもアンインストールもできない状態ならば、メニューを表示しない
\r
600 if (! (installToolStripButton.Visible || uninstallToolStripButton.Visible)) {
\r
606 bool selectionIsOnlyOne = packageListView.SelectedItems.Count == 1;
\r
607 if (selectionIsOnlyOne) {
\r
608 Package pkg = GetSelectedPackage<Package>();
\r
609 bool isInstalledPackage = pkg is InstalledPackage;
\r
611 webResourcesToolStripMenuItem.Text = string.Format(
\r
612 webResourcesToolStripMenuItem.Tag.ToString(),
\r
613 pkg.Name.Replace("&", "&&")); // pkg.Nameに&が含まれているときはエンコード
\r
614 webOfficialToolStripMenuItem.Enabled = ! (pkg.Url == null || string.IsNullOrEmpty(pkg.Url.Href));
\r
615 // webGoogleSearchToolStripMenuItem always active.
\r
617 bool installedDirectoryStripMenuItemVisible = isInstalledPackage &&
\r
618 ( (pkg.Type == InstallerType.ARCHIVE) || Directory.Exists(((InstalledPackage) pkg).discoverInstalledLocation()) );
\r
619 installedDirectoryStripMenuItem.Visible = installedDirectoryStripMenuItemVisible;
\r
620 if (installedDirectoryStripMenuItemVisible) {
\r
621 buildInstalledDirectoryMenuItemStripChildren((InstalledPackage) pkg);
\r
625 packageListContextMenuStripSeparator.Visible = parentIsPkgListView && selectionIsOnlyOne;
\r
626 webResourcesToolStripMenuItem.Visible = selectionIsOnlyOne;
\r
627 if (! selectionIsOnlyOne) installedDirectoryStripMenuItem.Visible = false;
\r
628 propertiesToolStripMenuItem.Visible = selectionIsOnlyOne;
\r
631 private IEnumerable<Package> getUpdatedPackages(PackageList<InstalledPackage> installedPkgList, PackageList<Package> avaiablePkgList, IComparer<string> verComp)
\r
633 foreach (InstalledPackage pkg in installedPkgList) {
\r
634 Package avaiablePkg = avaiablePkgList.GetPackageForName(pkg.Name);
\r
636 if (avaiablePkgList != null) {
\r
637 if (verComp.Compare(pkg.Version, avaiablePkg.Version) < 0 &&
\r
638 installedPkgList.GetPackageForPackage(pkg.Name, avaiablePkg.Version) == null) {
\r
640 yield return avaiablePkg;
\r
646 void UpgradeToolStripButtonClick(object sender, EventArgs e)
\r
648 List<Package> pkgs;
\r
649 VersionComparetor verComp = new VersionComparetor();
\r
650 PackageList<Package> avaiablePackageList = pkgListsMan.AvailablePkgList;
\r
652 pkgs = NaGet.Utils.MeargeList(
\r
653 getUpdatedPackages(pkgListsMan.InstalledPkgList, avaiablePackageList, verComp),
\r
654 getUpdatedPackages(pkgListsMan.SystemInstalledPkgList, avaiablePackageList, verComp)
\r
657 if (pkgs.Count <= 0) {
\r
658 MessageBox.Show(this, "更新されたソフトはありません", "ソフトの更新");
\r
662 InstallationConfirmForm confirm = new InstallationConfirmForm();
\r
663 confirm.PkgListsManager = pkgListsMan;
\r
664 confirm.Installations = Installation.ConvertInstallations(pkgs.ToArray());
\r
665 DialogResult result = confirm.ShowDialog(this);
\r
667 if (result == DialogResult.OK) {
\r
668 Installation[] insts = confirm.CheckedInstallations;
\r
670 if (confirm.UseRunas) {
\r
671 installRunasActionInvoke(insts);
\r
673 installActionInvoke(insts);
\r
676 UpdatePackageList();
\r
680 public void UpdatePackageList()
\r
682 pkgListsMan.LoadPackageLists();
\r
683 this.PackageListViewUpdate();
\r
687 /// インストールするよう選択されたパッケージの配列
\r
689 public IEnumerable<TPackage> GetSelectedPackages<TPackage>() where TPackage : Package
\r
691 foreach (ListViewItem item in packageListView.SelectedItems) {
\r
692 yield return (TPackage) item.Tag;
\r
697 /// インストールするよう選択されたパッケージをひとつ返す。
\r
699 /// <returns>選択されたパッケージ(選択されていないときはnull)</returns>
\r
700 public TPackage GetSelectedPackage<TPackage>() where TPackage : Package
\r
702 foreach (ListViewItem item in packageListView.SelectedItems) {
\r
703 return (TPackage) item.Tag;
\r
709 /// 自ウィンドウの有効無効(Enabled)を(必要あればInvokeして)実行する
\r
711 /// <param name="enabled">有効か否か。Enabledの値に入れられる</param>
\r
712 private void setWindowEnabled(bool enabled)
\r
714 MethodInvoker process = (MethodInvoker) delegate() {
\r
715 this.Enabled = enabled;
\r
718 if (InvokeRequired) {
\r