X-Git-Url: http://git.sourceforge.jp/view?p=applistation%2FAppliStation.git;a=blobdiff_plain;f=AppliStation%2FPackageListViewForm.cs;h=70922da4683053bae99faafac21b5b0eb52e057b;hp=f84da5aab35b0f6443b2dbeb1bf9a2f97fc8e1de;hb=f78f4271e5c841f9c6df7443fb84679dd093dbb9;hpb=04563b142b886bf00a9ea9745f3cf4a56bf3d746 diff --git a/AppliStation/PackageListViewForm.cs b/AppliStation/PackageListViewForm.cs index f84da5a..70922da 100644 --- a/AppliStation/PackageListViewForm.cs +++ b/AppliStation/PackageListViewForm.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Drawing; using System.Windows.Forms; using NaGet.Packages; @@ -28,65 +28,96 @@ namespace AppliStation pkgListsMan = new PackageListsManager(); this.Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath); + AppliStation.Util.NativeMethods.ListView_EnableVistaExplorerTheme(packageListView); + AppliStation.Util.NativeMethods.ListView_SetDoubleBuffer(packageListView, true); } - void PackageListViewSelectedIndexChanged(object sender, EventArgs e) + private void ShowInfoToDetailBoxFor(Package pkg) { - bool installBtnEnabled = false; - bool uninstallBtnEnabled = false; - detailBox.Clear(); - foreach (ListViewItem item in packageListView.SelectedItems) { - Package pkg = (Package) item.Tag; - - bool isInstalledPackage = pkg is InstalledPackage; - uninstallBtnEnabled = isInstalledPackage; - installBtnEnabled = ! isInstalledPackage; - - detailBox.SelectionFont = new Font(detailBox.Font.FontFamily, 12); - detailBox.SelectedText += string.Format("{0} ({1})\r\n", pkg.Name, pkg.Version); - if (! string.IsNullOrEmpty(pkg.Tags) ) { - detailBox.SelectionFont = new Font(detailBox.Font.FontFamily, 8); - detailBox.SelectedText += string.Format("ƒ^ƒO: {0}\r\n", pkg.Tags); + + detailBox.SelectionFont = new Font(detailBox.Font.FontFamily, 12); + detailBox.SelectedText += string.Format("{0} ({1})\r\n", pkg.Name, pkg.Version); + if (! string.IsNullOrEmpty(pkg.Tags) ) { + detailBox.SelectionFont = new Font(detailBox.Font.FontFamily, 8); + detailBox.SelectedText += "タグ:"; + foreach (string tag in pkg.Tags.Split(' ')) { + detailBox.AppendText(" "); + AppliStation.Util.NativeMethods.RichTextBox_AddTextLink(detailBox, tag); } - if (isInstalledPackage) { - InstalledPackage iPkg = (InstalledPackage) pkg; - System.Text.StringBuilder sb = new System.Text.StringBuilder(); - if (iPkg.UninstallInfo.InstallDate != null) { - sb.AppendFormat("ƒCƒ“ƒXƒg[ƒ‹‚µ‚½“ú: {0:d} ", iPkg.UninstallInfo.InstallDate.Value); - } - if (iPkg.UninstallInfo.EstimatedSize > 0) { - sb.AppendFormat("ƒTƒCƒY: {0} ", NaGet.Utils.FormatSize(iPkg.UninstallInfo.EstimatedSize*1024)); - } - - if (sb.Length > 0) { - detailBox.SelectionFont = new Font(detailBox.Font.FontFamily, 8); - detailBox.SelectedText += sb.ToString(); - detailBox.SelectedText += "\r\n"; - } + detailBox.AppendText("\r\n"); + } + if (pkg is InstalledPackage) { + InstalledPackage iPkg = (InstalledPackage) pkg; + System.Text.StringBuilder sb = new System.Text.StringBuilder(); + if (iPkg.UninstallInfo.InstallDate != null) { + sb.AppendFormat("インストールした日: {0:d} ", iPkg.UninstallInfo.InstallDate.Value); } - detailBox.SelectionFont = detailBox.Font; - if (pkg.Url != null && pkg.Url.Href != null) { - detailBox.SelectedText += "ŒöŽ®ƒTƒCƒg: " + pkg.Url.Href + "\r\n"; + if (iPkg.UninstallInfo.EstimatedSize > 0) { + sb.AppendFormat("サイズ: {0} ", NaGet.Utils.FormatSize(iPkg.UninstallInfo.EstimatedSize*1024)); } - detailBox.SelectedText += pkg.Summary; - break; + if (sb.Length > 0) { + detailBox.SelectionFont = new Font(detailBox.Font.FontFamily, 8); + detailBox.SelectedText += sb.ToString(); + detailBox.SelectedText += "\r\n"; + } + } + detailBox.SelectionFont = detailBox.Font; + if (pkg.Url != null && pkg.Url.Href != null) { + detailBox.SelectedText += "公式サイト: "; + AppliStation.Util.NativeMethods.RichTextBox_AddTextLink(detailBox, pkg.Url.Href); + detailBox.SelectedText += "\r\n"; } + detailBox.SelectedText += pkg.Summary; + } + + void PackageListViewSelectedIndexChanged(object sender, EventArgs e) + { + uint installPkgCount = 0; + uint uninstallPkgCount = 0; + bool installBtnEnabled, uninstallBtnEnabled; + + Package[] selectedPkgs = NaGet.Utils.IEnumerable2Array(GetSelectedPackages()); + foreach (Package pkg in selectedPkgs) { + if (pkg is InstalledPackage) { + uninstallPkgCount ++; + } else { + installPkgCount ++; + } + } + installBtnEnabled = (installPkgCount > 0) && (uninstallPkgCount == 0); + uninstallBtnEnabled = (uninstallPkgCount == 1) && (installPkgCount == 0); + upgradeToolStripButton.Visible = (selectedPkgs.Length <= 0); + informationToolStripDropDownButton.Visible = (selectedPkgs.Length == 1); uninstallToolStripButton.Visible = uninstallBtnEnabled; installToolStripButton.Visible = installBtnEnabled; - packageCommandsToolStripSeparator.Visible = uninstallBtnEnabled || installBtnEnabled; - if (packageListView.SelectedItems.Count <= 0) { - detailBox.SelectionFont = detailBox.Font; - int count = packageListView.Items.Count; - detailBox.Text = (count > 0) ? string.Format("{0}ŒÂ‚̃\ƒtƒg‚ª‚ ‚è‚Ü‚·B", count) - : "ŠY“–‚·‚éƒ\ƒtƒg‚ª‚ ‚è‚Ü‚¹‚ñB"; + // detailBoxのメッセージ設定 + detailBox.Clear(); + switch (selectedPkgs.Length) { + case 0: + int count = packageListView.Items.Count; + detailBox.Text = (count > 0) ? string.Format("{0}個のソフトがあります。", count) + : "該当するソフトがありません。"; + break; + case 1: + ShowInfoToDetailBoxFor(selectedPkgs[0]); + break; + default: // case 2 and over: + detailBox.Text = (installBtnEnabled)? string.Format("{0}個のソフトが選択されています。", installPkgCount) : + (uninstallBtnEnabled)? string.Format("{0}個のインストール済みのソフトが選択されています。", uninstallPkgCount) : + string.Format("{0}個のソフトが選択されています。\r\n(うち{1}個はインストール済み、{2}個はインストール可能)", installPkgCount+uninstallPkgCount, uninstallPkgCount, installPkgCount); + break; } - detailBox.SelectionStart = 0; - detailBox.ScrollToCaret(); + try { + detailBox.Select(0, 0); + detailBox.ScrollToCaret(); + } catch (System.Runtime.InteropServices.COMException) { + // ScrollToCaretでこけることがある + } } void PackageListViewItemActivate(object sender, EventArgs e) @@ -108,6 +139,14 @@ namespace AppliStation } } + private void buildInstalledDirectoryMenuItemStripChildren(InstalledPackage pkg) + { + //installedDirectoryStripMenuItem.BaseFolderPath = pkg.UninstallInfo.InstallLocation; + installedDirectoryStripMenuItem.BaseFolderPath = pkg.discoverInstalledLocation(); + } + + #region packageListViewのSort関連 + AppliStation.Util.ListViewItemSortComparer packageListViewSortComparer; void PackageListViewColumnClick(object sender, ColumnClickEventArgs e) @@ -132,7 +171,7 @@ namespace AppliStation } AppliStation.Util.NativeMethods.ColumnHeader_SetSortState(packageListView, e.Column, order); - // ƒ\[ƒg‘Ώۗñ‚̐F•t‚¯ + // ソート対象列の色付け try { // SendMessage(hWnd, LVM_SETSELECTEDCOLUMN, column, NULL); AppliStation.Util.NativeMethods.SendMessage(packageListView.Handle, 0x1000+140, (uint) e.Column, 0); @@ -140,20 +179,18 @@ namespace AppliStation } } + #endregion + void Form_OnLoad(object sender, EventArgs e) { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PackageListViewForm)); - ImageList imageList = new ImageList(); - imageList.Images.Add("installed", this.Icon); - imageList.Images.Add("sys", (Icon)(resources.GetObject("sysinstalled.Icon"))); - packageListView.SmallImageList = imageList; + packageListViewImageList.Images.Add("installed", Icon.ExtractAssociatedIcon(Application.ExecutablePath)); updatePackageFilterToolStripMenuItemCheckState(); - installedASPackageFilterToolStripMenuItem.Image = this.Icon.ToBitmap(); - installedSysPackageFilterToolStripMenuItem.Image = ((Icon)(resources.GetObject("sysinstalled.Icon"))).ToBitmap(); + installedASPackageFilterToolStripMenuItem.Image = packageListViewImageList.Images["installed"]; + installedSysPackageFilterToolStripMenuItem.Image = packageListViewImageList.Images["sys"]; } - #region PackageFilterŠÖ˜A + #region PackageFilter関連 private enum PackageFilterIndex : int { @@ -228,11 +265,11 @@ namespace AppliStation if (currentPackageFilter == PackageFilterIndex.All || currentPackageFilter == PackageFilterIndex.NotInstalled) { foreach (Package pkg in pkgListsMan.AvailablePkgList.Search(searchTextBox.Text)) { - if (Installation.GetPreferInstallerIndex(pkg) >= 0) { // ƒCƒ“ƒXƒg[ƒ‹‰Â”\ + if (Installation.GetPreferInstallerIndex(pkg) >= 0) { // インストール可能 if (currentPackageFilter == PackageFilterIndex.NotInstalled && (pkgListsMan.InstalledPkgList.GetPackageForName(pkg.Name) != null|| pkgListsMan.SystemInstalledPkgList.GetPackageForName(pkg.Name) != null) ) { - continue; // ƒCƒ“ƒXƒg[ƒ‹Ï‚Ý‚ÍŽŸ‚̃‹[ƒv‚Ö(–¢ƒCƒ“ƒXƒg[ƒ‹ƒ\ƒtƒg’ŠoŽž) + continue; // インストール済みは次のループへ(未インストールソフト抽出時) } ListViewItem item = new ListViewItem(new string[]{pkg.Name, pkg.Version, pkg.Summary}); @@ -272,9 +309,19 @@ namespace AppliStation //this.packageListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); } - void PackageDetailBoxLinkClicked(object sender, LinkClickedEventArgs e) + void DetailBoxLinkClicked(object sender, LinkClickedEventArgs e) { - System.Diagnostics.Process.Start(e.LinkText); + if (System.Text.RegularExpressions.Regex.IsMatch(e.LinkText, "^https?://")){ + /* URLの場合はブラウザ起動 */ + try { + System.Diagnostics.Process.Start(e.LinkText); + } catch (System.ComponentModel.Win32Exception) { + MessageBox.Show(string.Format("{0}を開くのに失敗しました。", e.LinkText), "ブラウザ起動エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } else { + /* それ以外はタグとみなして検索 */ + searchTextBox.Text = e.LinkText; + } } internal void updateActionInvoke(bool downloadPackageListsFlag) @@ -282,16 +329,15 @@ namespace AppliStation AppliStation.Util.ExecutionProgressViewer prog = new AppliStation.Util.ExecutionProgressViewer(); prog.Shown += delegate(object sender2, EventArgs e2) { NaGet.SubCommands.NaGetUpdate tasks = new NaGet.SubCommands.NaGetUpdate(pkgListsMan, downloadPackageListsFlag); - tasks.Downloader = prog.Downloader; prog.SetTaskSet(tasks); prog.Refresh(); prog.StartTaskSet(); }; - prog.Text = "ƒŠƒXƒg‚̍XV"; + prog.Text = "リストの更新"; prog.ShowDialog(this); } - void UpdateToolStripButtonClick(object sender, EventArgs e) + void UpdateToolStripMenuItemClick(object sender, EventArgs e) { updateActionInvoke(true); @@ -305,7 +351,20 @@ namespace AppliStation UpdatePackageList(); } - #region searchTextBox‚Ü‚í‚è + void OptionToolStripMenuItemClick(object sender, EventArgs e) + { + UserPrefForm userPrefForm = new UserPrefForm(); + DialogResult result = userPrefForm.ShowDialog(this); + + if (result == DialogResult.OK) { + if (userPrefForm.IsRepositoryListSettingChanged) { + updateActionInvoke(true); + UpdatePackageList(); + } + } + } + + #region searchTextBoxまわり void SearchTextBoxKeyPress(object sender, KeyPressEventArgs e) { @@ -331,20 +390,19 @@ namespace AppliStation AppliStation.Util.ExecutionProgressViewer prog = new AppliStation.Util.ExecutionProgressViewer(); prog.Shown += delegate(object sender2, EventArgs e2) { NaGet.SubCommands.NaGetInstall tasks = new NaGet.SubCommands.NaGetInstall(pkgListsMan, insts); - tasks.Downloader = prog.Downloader; prog.SetTaskSet(tasks); prog.Refresh(); prog.StartTaskSet(); }; - prog.Text = string.Format("ƒ\ƒtƒgƒEƒFƒA‚̃Cƒ“ƒXƒg[ƒ‹"); + prog.Text = string.Format("ソフトウェアのインストール"); prog.ShowDialog(this); } void InstallToolStripButtonClick(object sender, EventArgs e) { - PackagesInstallConfirmForm confirm = new PackagesInstallConfirmForm(); + InstallationConfirmForm confirm = new InstallationConfirmForm(); confirm.PkgListsManager = pkgListsMan; - confirm.Installations = Installation.ConvertInstallations(SelectedPackages()); + confirm.Installations = Installation.ConvertInstallations( NaGet.Utils.IEnumerable2Array(GetSelectedPackages()) ); confirm.UseRunas = confirm.GetShouldUseRunas(); DialogResult result = confirm.ShowDialog(this); @@ -379,7 +437,7 @@ namespace AppliStation hProc.EnableRaisingEvents = true; hProc.SynchronizingObject = this; hProc.Exited += delegate(object sender, EventArgs e) { - pkgListsMan.LoadPackageLists(); + UpdatePackageList(); this.setWindowEnabled(true); this.BringToFront(); @@ -389,12 +447,11 @@ namespace AppliStation } }; } catch (System.ComponentModel.Win32Exception ex) { - MessageBox.Show(ex.Message, "ƒCƒ“ƒXƒg[ƒ‹", MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show(ex.Message, "インストール", MessageBoxButtons.OK, MessageBoxIcon.Error); if (File.Exists(tmpfileName)) { File.Delete(tmpfileName); - } - this.setWindowEnabled(true); + } this.setWindowEnabled(true); } } @@ -407,7 +464,7 @@ namespace AppliStation prog.Refresh(); prog.StartTaskSet(); }; - prog.Text = string.Format("ƒ\ƒtƒgƒEƒFƒA‚̃Aƒ“ƒCƒ“ƒXƒg[ƒ‹"); + prog.Text = string.Format("ソフトウェアのアンインストール"); prog.ShowDialog(this); } @@ -429,7 +486,7 @@ namespace AppliStation hProc.EnableRaisingEvents = true; hProc.SynchronizingObject = this; hProc.Exited += delegate(object sender, EventArgs e) { - pkgListsMan.LoadPackageLists(); + UpdatePackageList(); this.setWindowEnabled(true); this.BringToFront(); @@ -439,7 +496,7 @@ namespace AppliStation } }; } catch (System.ComponentModel.Win32Exception ex) { - MessageBox.Show(ex.Message, "ƒAƒ“ƒCƒ“ƒXƒg[ƒ‹", MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show(ex.Message, "アンインストール", MessageBoxButtons.OK, MessageBoxIcon.Error); this.setWindowEnabled(true); if (File.Exists(tmpfileName)) { @@ -451,7 +508,7 @@ namespace AppliStation void UninstallToolStripButtonClick(object sender, EventArgs e) { PackageUninstallConfirmForm confirm = new PackageUninstallConfirmForm(); - foreach (InstalledPackage pkg in SelectedPackages()) { + foreach (InstalledPackage pkg in GetSelectedPackages()) { confirm.UninstallPackage = pkg; break; } @@ -474,11 +531,15 @@ namespace AppliStation void WebOfficialToolStripMenuItemClick(object sender, EventArgs e) { - foreach (Package pkg in SelectedPackages()) { + foreach (Package pkg in GetSelectedPackages()) { string linkURL = pkg.Url.Href; if (! (pkg == null || string.IsNullOrEmpty(linkURL))) { - System.Diagnostics.Process.Start(linkURL); + try { + System.Diagnostics.Process.Start(linkURL); + } catch (System.ComponentModel.Win32Exception) { + MessageBox.Show(string.Format("{0}を開くのに失敗しました。", linkURL), "ブラウザ起動エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); + } } break; } @@ -486,11 +547,15 @@ namespace AppliStation void WebGoogleSearchToolStripMenuItemClick(object sender, EventArgs e) { - foreach (Package pkg in SelectedPackages()) { + foreach (Package pkg in GetSelectedPackages()) { string q = System.Web.HttpUtility.UrlEncode(pkg.Name, System.Text.Encoding.UTF8); string googleURL = @"http://www.google.co.jp/search?q="+q; - System.Diagnostics.Process.Start(googleURL); + try { + System.Diagnostics.Process.Start(googleURL); + } catch (System.ComponentModel.Win32Exception) { + MessageBox.Show("Googleを開くのに失敗しました。", "ブラウザ起動エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); + } break; } @@ -498,11 +563,11 @@ namespace AppliStation void OpenInstalledDirectoryStripMenuItemClick(object sender, EventArgs e) { - foreach (InstalledPackage pkg in SelectedPackages()) { + foreach (InstalledPackage pkg in GetSelectedPackages()) { if (pkg.Type == InstallerType.ARCHIVE) { System.Diagnostics.Process.Start(Path.Combine(NaGet.Env.ArchiveProgramFiles, pkg.Name)); - } else if (Directory.Exists(pkg.UninstallInfo.InstallLocation)) { - System.Diagnostics.Process.Start(pkg.UninstallInfo.InstallLocation); + } else if (Directory.Exists(pkg.discoverInstalledLocation())) { + System.Diagnostics.Process.Start(pkg.discoverInstalledLocation()); } break; @@ -512,10 +577,10 @@ namespace AppliStation void PropertiesToolStripMenuItemClick(object sender, EventArgs e) { - foreach (Package pkg in SelectedPackages()) { + foreach (Package pkg in GetSelectedPackages()) { PackageInfoForm form = new PackageInfoForm(); form.SelectedObject = pkg; - form.Text = string.Format("{0}({1})‚̃vƒƒpƒeƒB", pkg.Name, pkg.Version); + form.Text = string.Format("{0}({1})のプロパティ", pkg.Name, pkg.Version); form.ShowDialog(this); @@ -525,29 +590,42 @@ namespace AppliStation void PackageListContextMenuStripOpening(object sender, System.ComponentModel.CancelEventArgs e) { - // ‘I‘ð‚³‚ê‚Ä‚¢‚È‚¢‚È‚çŠJ‚©‚È‚¢ - if (packageListView.SelectedItems.Count <= 0) { + // コンテクストメニューから開かれなかった場合はインストール/アンインストールは表示しない + bool parentIsPkgListView = (packageListContextMenuStrip.SourceControl == packageListView); + // メニューアイテムのインストール/アンインストールの表示はツールストリップに同じ + installToolStripMenuItem.Visible = parentIsPkgListView && installToolStripButton.Visible; + uninstallToolStripMenuItem.Visible = parentIsPkgListView && uninstallToolStripButton.Visible; + + // インストールもアンインストールもできない状態ならば、メニューを表示しない + if (! (installToolStripButton.Visible || uninstallToolStripButton.Visible)) { e.Cancel = true; return; } - foreach (Package pkg in SelectedPackages()) { + // 選択パッケージが1つのとき + bool selectionIsOnlyOne = packageListView.SelectedItems.Count == 1; + if (selectionIsOnlyOne) { + Package pkg = GetSelectedPackage(); bool isInstalledPackage = pkg is InstalledPackage; - installToolStripMenuItem.Visible = ! isInstalledPackage; - uninstallToolStripMenuItem.Visible = isInstalledPackage; - webResourcesToolStripMenuItem.Text = string.Format( webResourcesToolStripMenuItem.Tag.ToString(), - pkg.Name.Replace("&", "&&")); // pkg.Name‚É&‚ªŠÜ‚Ü‚ê‚Ä‚¢‚é‚Æ‚«‚̓Gƒ“ƒR[ƒh + pkg.Name.Replace("&", "&&")); // pkg.Nameに&が含まれているときはエンコード webOfficialToolStripMenuItem.Enabled = ! (pkg.Url == null || string.IsNullOrEmpty(pkg.Url.Href)); // webGoogleSearchToolStripMenuItem always active. - openInstalledDirectoryStripMenuItem.Visible = isInstalledPackage && - ( (pkg.Type == InstallerType.ARCHIVE) || Directory.Exists(((InstalledPackage) pkg).UninstallInfo.InstallLocation) ); - - break; + bool installedDirectoryStripMenuItemVisible = isInstalledPackage && + ( (pkg.Type == InstallerType.ARCHIVE) || Directory.Exists(((InstalledPackage) pkg).discoverInstalledLocation()) ); + installedDirectoryStripMenuItem.Visible = installedDirectoryStripMenuItemVisible; + if (installedDirectoryStripMenuItemVisible) { + buildInstalledDirectoryMenuItemStripChildren((InstalledPackage) pkg); + } } + + packageListContextMenuStripSeparator.Visible = parentIsPkgListView && selectionIsOnlyOne; + webResourcesToolStripMenuItem.Visible = selectionIsOnlyOne; + if (! selectionIsOnlyOne) installedDirectoryStripMenuItem.Visible = false; + propertiesToolStripMenuItem.Visible = selectionIsOnlyOne; } private IEnumerable getUpdatedPackages(PackageList installedPkgList, PackageList avaiablePkgList, IComparer verComp) @@ -567,19 +645,21 @@ namespace AppliStation void UpgradeToolStripButtonClick(object sender, EventArgs e) { - List pkgs = new List(); + List pkgs; VersionComparetor verComp = new VersionComparetor(); PackageList avaiablePackageList = pkgListsMan.AvailablePkgList; - pkgs.AddRange(getUpdatedPackages(pkgListsMan.InstalledPkgList, avaiablePackageList, verComp)); - pkgs.AddRange(getUpdatedPackages(pkgListsMan.SystemInstalledPkgList, avaiablePackageList, verComp)); + pkgs = NaGet.Utils.MeargeList( + getUpdatedPackages(pkgListsMan.InstalledPkgList, avaiablePackageList, verComp), + getUpdatedPackages(pkgListsMan.SystemInstalledPkgList, avaiablePackageList, verComp) + ); if (pkgs.Count <= 0) { - MessageBox.Show(this, "XV‚³‚ꂽƒ\ƒtƒg‚Í‚ ‚è‚Ü‚¹‚ñ", "ƒ\ƒtƒg‚̍XV"); + MessageBox.Show(this, "更新されたソフトはありません", "ソフトの更新"); return; } - PackagesInstallConfirmForm confirm = new PackagesInstallConfirmForm(); + InstallationConfirmForm confirm = new InstallationConfirmForm(); confirm.PkgListsManager = pkgListsMan; confirm.Installations = Installation.ConvertInstallations(pkgs.ToArray()); DialogResult result = confirm.ShowDialog(this); @@ -604,22 +684,31 @@ namespace AppliStation } /// - /// ƒCƒ“ƒXƒg[ƒ‹‚·‚é‚悤‘I‘ð‚³‚ê‚½ƒpƒbƒP[ƒW‚Ì”z—ñ + /// インストールするよう選択されたパッケージの配列 /// - public TPackage[] SelectedPackages() where TPackage : Package + public IEnumerable GetSelectedPackages() where TPackage : Package { - List pkgs = new List(); - foreach (ListViewItem item in packageListView.SelectedItems) { - pkgs.Add((TPackage) item.Tag); - } - - return pkgs.ToArray(); + foreach (ListViewItem item in packageListView.SelectedItems) { + yield return (TPackage) item.Tag; + } + } + + /// + /// インストールするよう選択されたパッケージをひとつ返す。 + /// + /// 選択されたパッケージ(選択されていないときはnull) + public TPackage GetSelectedPackage() where TPackage : Package + { + foreach (ListViewItem item in packageListView.SelectedItems) { + return (TPackage) item.Tag; + } + return null; } /// - /// Ž©ƒEƒBƒ“ƒhƒE‚Ì—LŒø–³Œø(Enabled)‚ð(•K—v‚ ‚ê‚ÎInvoke‚µ‚Ä)ŽÀs‚·‚é + /// 自ウィンドウの有効無効(Enabled)を(必要あればInvokeして)実行する /// - /// —LŒø‚©”Û‚©BEnabled‚Ì’l‚É“ü‚ê‚ç‚ê‚é + /// 有効か否か。Enabledの値に入れられる private void setWindowEnabled(bool enabled) { MethodInvoker process = (MethodInvoker) delegate() {