X-Git-Url: http://git.sourceforge.jp/view?p=applistation%2FAppliStation.git;a=blobdiff_plain;f=AppliStation%2FPackageListViewForm.cs;h=a66d9a69137f1bdb64f72e25524780ca4c63f860;hp=46da5efffb9de78ac726a8468b805deb084234ab;hb=202377d120df8670eca37760385d1f3616b6f8a1;hpb=5c657d2488b269b308fa65b56027968e5b2c94cd diff --git a/AppliStation/PackageListViewForm.cs b/AppliStation/PackageListViewForm.cs index 46da5ef..a66d9a6 100644 --- a/AppliStation/PackageListViewForm.cs +++ b/AppliStation/PackageListViewForm.cs @@ -6,6 +6,8 @@ using NaGet.Packages.Install; using System.IO; using System.Collections.Generic; +using AppliStation.PackageInfo; + namespace AppliStation { /// @@ -13,7 +15,7 @@ namespace AppliStation /// public partial class PackageListViewForm : Form { - protected PackageListsManager pkgListsMan = null; + private PackageListsManager pkgListsMan = null; public PackageListViewForm() { @@ -26,6 +28,7 @@ namespace AppliStation uninstallToolStripMenuItem.Font = new Font(uninstallToolStripMenuItem.Font, FontStyle.Bold); pkgListsMan = new PackageListsManager(); + packageListView.Data = pkgListsMan; this.Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath); AppliStation.Util.NativeMethods.ListView_EnableVistaExplorerTheme(packageListView); @@ -47,8 +50,10 @@ namespace AppliStation } detailBox.AppendText("\r\n"); } - if (pkg is InstalledPackage) { - InstalledPackage iPkg = (InstalledPackage) pkg; + + // インストール済みパッケージの場合 + InstalledPackage iPkg = pkg as InstalledPackage; + if (iPkg != null) { System.Text.StringBuilder sb = new System.Text.StringBuilder(); if (iPkg.UninstallInfo.InstallDate != null) { sb.AppendFormat("インストールした日: {0:d} ", iPkg.UninstallInfo.InstallDate.Value); @@ -74,41 +79,53 @@ namespace AppliStation void PackageListViewSelectedIndexChanged(object sender, EventArgs e) { + updateSelectedPackages(); + } + + private void updateSelectedPackages() + { uint installPkgCount = 0; uint uninstallPkgCount = 0; bool installBtnEnabled, uninstallBtnEnabled; - Package[] selectedPkgs = NaGet.Utils.IEnumerable2Array(SelectedPackages()); - foreach (Package pkg in selectedPkgs) { + foreach (Package pkg in packageListView.SelectedPackages) { if (pkg is InstalledPackage) { uninstallPkgCount ++; } else { installPkgCount ++; } } + + uint pkgCount = installPkgCount + uninstallPkgCount; installBtnEnabled = (installPkgCount > 0) && (uninstallPkgCount == 0); uninstallBtnEnabled = (uninstallPkgCount == 1) && (installPkgCount == 0); - upgradeToolStripButton.Visible = (selectedPkgs.Length <= 0); - informationToolStripDropDownButton.Visible = (selectedPkgs.Length == 1); + // ToolStrip + informationToolStripDropDownButton.Visible = (pkgCount == 1); uninstallToolStripButton.Visible = uninstallBtnEnabled; installToolStripButton.Visible = installBtnEnabled; + // MenuStrip + webResourceToolStripMenuItem.Visible = (pkgCount == 1); + uninstallToolStripMenuItem.Visible = uninstallBtnEnabled; + installToolStripMenuItem.Visible = installBtnEnabled; + downloadToolStripMenuItem.Visible = (pkgCount > 0); // detailBoxのメッセージ設定 - detailBox.Clear(); - switch (selectedPkgs.Length) { + switch (pkgCount) { case 0: int count = packageListView.Items.Count; + detailBox.Clear(); detailBox.Text = (count > 0) ? string.Format("{0}個のソフトがあります。", count) : "該当するソフトがありません。"; break; case 1: - ShowInfoToDetailBoxFor(selectedPkgs[0]); + ShowInfoToDetailBoxFor(packageListView.SelectedPackage); break; default: // case 2 and over: + detailBox.Clear(); detailBox.Text = (installBtnEnabled)? string.Format("{0}個のソフトが選択されています。", installPkgCount) : (uninstallBtnEnabled)? string.Format("{0}個のインストール済みのソフトが選択されています。", uninstallPkgCount) : - string.Format("{0}個のソフトが選択されています。\r\n(うち{1}個はインストール済み、{2}個はインストール可能)", installPkgCount+uninstallPkgCount, uninstallPkgCount, installPkgCount); + string.Format("{0}個のソフトが選択されています。\r\n(うち{1}個はインストール済み、{2}個はインストール可能)", pkgCount, uninstallPkgCount, installPkgCount); break; } @@ -122,103 +139,41 @@ namespace AppliStation void PackageListViewItemActivate(object sender, EventArgs e) { - if (packageListView.SelectedItems.Count <= 0) { - return; // exit - } + Package pkg = packageListView.SelectedPackage; - foreach (ListViewItem item in packageListView.SelectedItems) { - Package pkg = (Package) item.Tag; - + if (pkg != null) { if (pkg is InstalledPackage) { UninstallToolStripButtonClick(sender, e); } else { InstallToolStripButtonClick(sender, e); } - - break; } } - 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) - { - SortOrder order = SortOrder.None; - - if (packageListViewSortComparer == null) { - order = SortOrder.Ascending; - packageListViewSortComparer = new AppliStation.Util.ListViewItemSortComparer(e.Column, order); - packageListView.ListViewItemSorter = packageListViewSortComparer; - } else { - if (packageListViewSortComparer.Column == e.Column) { - order = (packageListViewSortComparer.Order == SortOrder.Ascending)? SortOrder.Descending : SortOrder.Ascending; - - packageListViewSortComparer.Order = order; - } else { - order = packageListViewSortComparer.Order; - packageListViewSortComparer.Column = e.Column; - } - - packageListView.Sort(); - } - AppliStation.Util.NativeMethods.ColumnHeader_SetSortState(packageListView, e.Column, order); - - // ソート対象列の色付け - try { - // SendMessage(hWnd, LVM_SETSELECTEDCOLUMN, column, NULL); - AppliStation.Util.NativeMethods.SendMessage(packageListView.Handle, 0x1000+140, (uint) e.Column, 0); - } catch (Exception) { - } - } - - #endregion - void Form_OnLoad(object sender, EventArgs e) { packageListViewImageList.Images.Add("installed", Icon.ExtractAssociatedIcon(Application.ExecutablePath)); updatePackageFilterToolStripMenuItemCheckState(); + notInstalledPackageFilterToolStripMenuItem.Image = packageListViewImageList.Images["available-new"]; installedASPackageFilterToolStripMenuItem.Image = packageListViewImageList.Images["installed"]; installedSysPackageFilterToolStripMenuItem.Image = packageListViewImageList.Images["sys"]; + + packageListView.UpdateItems(); + updateSelectedPackages(); } #region PackageFilter関連 - private enum PackageFilterIndex : int - { - All = 0, - NotInstalled = 1, - InstalledAS = 2, - InstalledSys = 3, - } - - private PackageFilterIndex currentPackageFilter = PackageFilterIndex.All; - - private PackageFilterIndex CurrentPackageFilter { - get { - return currentPackageFilter; - } - set { - currentPackageFilter = value; - - updatePackageFilterToolStripMenuItemCheckState(); - } - } - + /// + /// packgageFilterToolStripのリストを更新する。 + /// private void updatePackageFilterToolStripMenuItemCheckState() { ToolStripMenuItem selected = getCheckedPackageFilterToolStripItem(); foreach (ToolStripMenuItem item in packageFilterToolStripDropDownButton.DropDown.Items) { - item.Checked = selected == item; + item.Checked = (selected == item); } packageFilterToolStripDropDownButton.Text = selected.Text; @@ -228,12 +183,12 @@ namespace AppliStation private ToolStripMenuItem getCheckedPackageFilterToolStripItem() { - switch (currentPackageFilter) { - case PackageFilterIndex.NotInstalled: + switch (packageListView.FilteringType) { + case PackageListViewPkgTypeFilter.NotInstalled: return notInstalledPackageFilterToolStripMenuItem; - case PackageFilterIndex.InstalledAS: + case PackageListViewPkgTypeFilter.InstalledAS: return installedASPackageFilterToolStripMenuItem; - case PackageFilterIndex.InstalledSys: + case PackageListViewPkgTypeFilter.InstalledSys: return installedSysPackageFilterToolStripMenuItem; default: return allPackageFilterToolStripMenuItem; @@ -243,72 +198,21 @@ namespace AppliStation void AnyPackageFilterToolStripMenuItemClicked(object sender, EventArgs e) { if (sender == notInstalledPackageFilterToolStripMenuItem) { - currentPackageFilter = PackageFilterIndex.NotInstalled; + packageListView.FilteringType = PackageListViewPkgTypeFilter.NotInstalled; } else if (sender == installedASPackageFilterToolStripMenuItem) { - currentPackageFilter = PackageFilterIndex.InstalledAS; + packageListView.FilteringType = PackageListViewPkgTypeFilter.InstalledAS; } else if (sender == installedSysPackageFilterToolStripMenuItem) { - currentPackageFilter = PackageFilterIndex.InstalledSys; + packageListView.FilteringType = PackageListViewPkgTypeFilter.InstalledSys; } else { - currentPackageFilter = PackageFilterIndex.All; + packageListView.FilteringType = PackageListViewPkgTypeFilter.All; } updatePackageFilterToolStripMenuItemCheckState(); searchTextBox.FireTextChangedTrigger(); - PackageListViewUpdate(); } #endregion - void PackageListViewUpdate() - { - this.packageListView.Items.Clear(); - - if (currentPackageFilter == PackageFilterIndex.All || currentPackageFilter == PackageFilterIndex.NotInstalled) { - foreach (Package pkg in pkgListsMan.AvailablePkgList.Search(searchTextBox.Text)) { - if (Installation.GetPreferInstallerIndex(pkg) >= 0) { // インストール可能 - if (currentPackageFilter == PackageFilterIndex.NotInstalled && - (pkgListsMan.InstalledPkgList.GetPackageForName(pkg.Name) != null|| - pkgListsMan.SystemInstalledPkgList.GetPackageForName(pkg.Name) != null) ) { - continue; // インストール済みは次のループへ(未インストールソフト抽出時) - } - - ListViewItem item = new ListViewItem(new string[]{pkg.Name, pkg.Version, pkg.Summary}); - item.Tag = pkg; - item.ToolTipText = pkg.Summary; - - this.packageListView.Items.Add(item); - } - } - } - - if (currentPackageFilter == PackageFilterIndex.All || currentPackageFilter == PackageFilterIndex.InstalledAS) { - foreach (Package pkg in pkgListsMan.InstalledPkgList.Search(searchTextBox.Text)) { - ListViewItem item = new ListViewItem(new string[]{pkg.Name, pkg.Version, pkg.Summary}); - item.Tag = pkg; - item.ToolTipText = pkg.Summary; - item.ImageKey = "installed"; - - this.packageListView.Items.Add(item); - } - } - - if (currentPackageFilter == PackageFilterIndex.All || currentPackageFilter == PackageFilterIndex.InstalledSys) { - foreach (Package pkg in pkgListsMan.SystemInstalledPkgList.Search(searchTextBox.Text)) { - ListViewItem item = new ListViewItem(new string[]{pkg.Name, pkg.Version, pkg.Summary}); - item.Tag = pkg; - item.ToolTipText = pkg.Summary; - item.ImageKey = "sys"; - - this.packageListView.Items.Add(item); - } - } - - PackageListViewSelectedIndexChanged(packageListView, null); - detailBox.Refresh(); - - //this.packageListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); - } - void DetailBoxLinkClicked(object sender, LinkClickedEventArgs e) { if (System.Text.RegularExpressions.Regex.IsMatch(e.LinkText, "^https?://")){ @@ -328,7 +232,7 @@ 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); + NaGet.SubCommands.NaGetUpdate2 tasks = new NaGet.SubCommands.NaGetUpdate2(pkgListsMan, downloadPackageListsFlag); prog.SetTaskSet(tasks); prog.Refresh(); prog.StartTaskSet(); @@ -337,7 +241,7 @@ namespace AppliStation prog.ShowDialog(this); } - void UpdateToolStripButtonClick(object sender, EventArgs e) + void UpdateToolStripMenuItemClick(object sender, EventArgs e) { updateActionInvoke(true); @@ -351,6 +255,142 @@ namespace AppliStation UpdatePackageList(); } + void SoftCollectionFileImportToolStripMenuItemClick(object sender, EventArgs e) + { + string pwd = Directory.GetCurrentDirectory(); + + OpenFileDialog fd = new OpenFileDialog(); + fd.Filter = "ソフトコレクションファイル (*.txt)|*.txt"; + fd.DefaultExt = "txt"; + fd.CheckFileExists = true; + fd.CheckPathExists = true; + fd.Multiselect = false; + fd.ShowDialog(); + if (fd.FileNames.Length > 0) { + string filepath = Path.GetFullPath(fd.FileName); + Directory.SetCurrentDirectory(pwd); // ファイルダイアログで変わったカレントディレクトリを戻す + + IList pkgs; + IList invalid; + + try { + PackageCollectionFileData collectionData = new PackageCollectionFileData(); + collectionData.load(filepath); + collectionData.generatePackages(pkgListsMan, out pkgs, out invalid); + + if (invalid.Count > 0) { + DialogResult result = MessageBox.Show("一部読み込みの失敗したパッケージがありますが続行しますか?", "インポート", MessageBoxButtons.OKCancel, MessageBoxIcon.Error); + if (result != DialogResult.OK) { + return; + } + } + } catch (IOException) { + MessageBox.Show("ファイルの読み込みに失敗しました", "インポート", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + { + InstallationConfirmForm confirm = new InstallationConfirmForm(); + confirm.PkgListsManager = pkgListsMan; + confirm.Installations = Installation.ConvertInstallations( NaGet.Utils.IEnumerable2Array(pkgs) ); + confirm.UseRunas = confirm.GetShouldUseRunas(); + DialogResult result = confirm.ShowDialog(this); + + if (result == DialogResult.OK) { + Installation[] insts = confirm.CheckedInstallations; + + if (confirm.UseRunas) { + installRunasActionInvoke(insts); + } else { + installActionInvoke(insts); + } + + UpdatePackageList(); + } + } + } else { + Directory.SetCurrentDirectory(pwd); // ファイルダイアログで変わったカレントディレクトリを戻す + } + } + + void SoftCollectionFileExportToolStripMenuItemClick(object sender, EventArgs e) + { + string pwd = Directory.GetCurrentDirectory(); + string[] softtargets = new string[]{ + "PCにインストールされたソフト", + "AppliStation内でインストールされたソフト", + "インストールされたソフトすべて;PCとAppliStationにインストールされたソフトの両方" + }; + int softtargetid = softtargets.Length - 1; + + { + AppliStation.Util.OptionDialog optdialog = AppliStation.Util.OptionDialog.createCommandSelectionDialog( + "ソフトコレクションファイルに出力するソフトの種類を選択してください。", "エクスポート", "エクスポートするソフト", + System.Drawing.SystemIcons.Question, + softtargets, softtargets.Length-1); + if (optdialog.ShowDialog(this) != DialogResult.OK) { + return; // canceled + } else if (optdialog.UserInputValue != null) { + softtargetid = (int) optdialog.UserInputValue; + } + } + + SaveFileDialog fd = new SaveFileDialog(); + fd.Filter = "ソフトコレクションファイル (*.txt)|*.txt"; + fd.DefaultExt = "txt"; + fd.CheckPathExists = true; + fd.OverwritePrompt = true; + fd.ShowDialog(); + if (fd.FileNames.Length > 0) { + string filepath = Path.GetFullPath(fd.FileName); + Directory.SetCurrentDirectory(pwd); // ファイルダイアログで変わったカレントディレクトリを戻す + + PackageCollectionFileData collectionData = new PackageCollectionFileData(); + + switch (softtargetid) { + case 0: // PCにインストール + collectionData.loadPackages(pkgListsMan.SystemInstalledPkgList.GetEnumerator()); + break; + case 1: // AppliStation内にインストール + collectionData.loadPackages(pkgListsMan.InstalledPkgList.GetEnumerator()); + break; + case 2: // すべて + default: + collectionData.loadPackages(pkgListsMan.GetAllInstalledPackages()); + break; + } + + try { + collectionData.saveAs(fd.FileName); + } catch (UnauthorizedAccessException) { + if ((File.GetAttributes(fd.FileName) & FileAttributes.ReadOnly) != 0) { + MessageBox.Show("読み取り専用属性が設定されています。\n別のファイルを指定してください。", "エクスポート", MessageBoxButtons.OK, MessageBoxIcon.Error); + } else { + MessageBox.Show("ファイルへの書き込みが許可されていません。\n別のファイルを指定してください。", "エクスポート", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + return; + } catch (IOException) { + MessageBox.Show("ファイルの書き込みに失敗しました", "エクスポート", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + } else { + Directory.SetCurrentDirectory(pwd); // ファイルダイアログで変わったカレントディレクトリを戻す + } + } + + 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) @@ -367,7 +407,7 @@ namespace AppliStation void SearchTextBoxTextChangedTriggerFired(object sender, EventArgs e) { - PackageListViewUpdate(); + packageListView.FilteringKeyword = searchTextBox.Text; } #endregion @@ -376,7 +416,7 @@ 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); + NaGet.SubCommands.NaGetInstall2 tasks = new NaGet.SubCommands.NaGetInstall2(pkgListsMan, insts); prog.SetTaskSet(tasks); prog.Refresh(); prog.StartTaskSet(); @@ -389,7 +429,7 @@ namespace AppliStation { InstallationConfirmForm confirm = new InstallationConfirmForm(); confirm.PkgListsManager = pkgListsMan; - confirm.Installations = Installation.ConvertInstallations( NaGet.Utils.IEnumerable2Array(SelectedPackages()) ); + confirm.Installations = Installation.ConvertInstallations( NaGet.Utils.IEnumerable2Array(packageListView.SelectedPackages) ); confirm.UseRunas = confirm.GetShouldUseRunas(); DialogResult result = confirm.ShowDialog(this); @@ -438,8 +478,7 @@ namespace AppliStation if (File.Exists(tmpfileName)) { File.Delete(tmpfileName); - } - this.setWindowEnabled(true); + } this.setWindowEnabled(true); } } @@ -447,7 +486,7 @@ namespace AppliStation { AppliStation.Util.ExecutionProgressViewer prog = new AppliStation.Util.ExecutionProgressViewer(); prog.Shown += delegate(object sender2, EventArgs e2) { - NaGet.SubCommands.NaGetUninstall tasks = new NaGet.SubCommands.NaGetUninstall(pkgListsMan, pkgs); + NaGet.SubCommands.NaGetUninstall2 tasks = new NaGet.SubCommands.NaGetUninstall2(pkgListsMan, pkgs); prog.SetTaskSet(tasks); prog.Refresh(); prog.StartTaskSet(); @@ -496,10 +535,7 @@ namespace AppliStation void UninstallToolStripButtonClick(object sender, EventArgs e) { PackageUninstallConfirmForm confirm = new PackageUninstallConfirmForm(); - foreach (InstalledPackage pkg in SelectedPackages()) { - confirm.UninstallPackage = pkg; - break; - } + confirm.UninstallPackage = (InstalledPackage) packageListView.SelectedPackage; confirm.UseRunas = confirm.GetShouldUseRunas(); DialogResult result = confirm.ShowDialog(this); @@ -516,26 +552,48 @@ namespace AppliStation } } + internal void downloadActionInvoke(Installation[] pkgs) + { + AppliStation.Util.ExecutionProgressViewer prog = new AppliStation.Util.ExecutionProgressViewer(); + prog.Shown += delegate(object sender2, EventArgs e2) { + NaGet.SubCommands.NaGetDownloadToCache2 tasks = new NaGet.SubCommands.NaGetDownloadToCache2(pkgListsMan, pkgs); + prog.SetTaskSet(tasks); + prog.Refresh(); + prog.StartTaskSet(); + }; + prog.Text = string.Format("キャッシュへのダウンロード"); + prog.ShowDialog(this); + } - void WebOfficialToolStripMenuItemClick(object sender, EventArgs e) + void DownloadToolStripMenuItemClick(object sender, EventArgs e) { - foreach (Package pkg in SelectedPackages()) { + Installation[] insts = Installation.ConvertInstallations( NaGet.Utils.IEnumerable2Array(packageListView.SelectedPackages) ); + + downloadActionInvoke(insts); + + UpdatePackageList(); + } + + void WebOfficialMenuItemClick(object sender, EventArgs e) + { + Package pkg = packageListView.SelectedPackage; + if (pkg != null) { string linkURL = pkg.Url.Href; - if (! (pkg == null || string.IsNullOrEmpty(linkURL))) { + if (! string.IsNullOrEmpty(linkURL)) { try { System.Diagnostics.Process.Start(linkURL); } catch (System.ComponentModel.Win32Exception) { MessageBox.Show(string.Format("{0}を開くのに失敗しました。", linkURL), "ブラウザ起動エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); } } - break; } } - void WebGoogleSearchToolStripMenuItemClick(object sender, EventArgs e) + void WebGoogleSearchMenuItemClick(object sender, EventArgs e) { - foreach (Package pkg in SelectedPackages()) { + Package pkg = packageListView.SelectedPackage; + if (pkg != null) { string q = System.Web.HttpUtility.UrlEncode(pkg.Name, System.Text.Encoding.UTF8); string googleURL = @"http://www.google.co.jp/search?q="+q; @@ -544,102 +602,125 @@ namespace AppliStation } catch (System.ComponentModel.Win32Exception) { MessageBox.Show("Googleを開くのに失敗しました。", "ブラウザ起動エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); } - - break; } } void OpenInstalledDirectoryStripMenuItemClick(object sender, EventArgs e) { - foreach (InstalledPackage pkg in SelectedPackages()) { - if (pkg.Type == InstallerType.ARCHIVE) { + InstalledPackage pkg = (InstalledPackage) packageListView.SelectedPackage; + if (pkg != null) { + if (pkg.Type == InstallerType.ARCHIVE || pkg.Type == InstallerType.ITSELF) { System.Diagnostics.Process.Start(Path.Combine(NaGet.Env.ArchiveProgramFiles, pkg.Name)); - } else if (Directory.Exists(pkg.discoverInstalledLocation())) { - System.Diagnostics.Process.Start(pkg.discoverInstalledLocation()); + } else if (Directory.Exists(pkg.DiscoverInstalledLocation())) { + System.Diagnostics.Process.Start(pkg.DiscoverInstalledLocation()); } - - break; } } - void PropertiesToolStripMenuItemClick(object sender, EventArgs e) + void PropertiesCommonMenuItemClick(object sender, EventArgs e) { - foreach (Package pkg in SelectedPackages()) { + if (packageListView.SelectedItems.Count >= 5) { + string msg = string.Format("{0}個のプロパティダイアログを開こうとしています。\n継続しますか?", packageListView.SelectedItems.Count); + if (MessageBox.Show(msg, "プロパティ", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) != DialogResult.OK) { + return; + } + } + + foreach (Package pkg in packageListView.SelectedPackages) { PackageInfoForm form = new PackageInfoForm(); form.SelectedObject = pkg; form.Text = string.Format("{0}({1})のプロパティ", pkg.Name, pkg.Version); - form.ShowDialog(this); - - break; + form.Show(this); } } - void PackageListContextMenuStripOpening(object sender, System.ComponentModel.CancelEventArgs e) + private void updateLauncherMenuItem(AppliStation.Util.ToolStripPetitLauncherMenuItem launcherMenuItem) { - // コンテクストメニューから開かれなかった場合はインストール/アンインストールは表示しない - bool parentIsPkgListView = (packageListContextMenuStrip.SourceControl == packageListView); - // メニューアイテムのインストール/アンインストールの表示はツールストリップに同じ - installToolStripMenuItem.Visible = parentIsPkgListView && installToolStripButton.Visible; - uninstallToolStripMenuItem.Visible = parentIsPkgListView && uninstallToolStripButton.Visible; - - // インストールもアンインストールもできない状態ならば、メニューを表示しない - if (! (installToolStripButton.Visible || uninstallToolStripButton.Visible)) { - e.Cancel = true; - return; - } - - // 選択パッケージが1つのとき bool selectionIsOnlyOne = packageListView.SelectedItems.Count == 1; + if (selectionIsOnlyOne) { - Package pkg = SelectedPackage(); - bool isInstalledPackage = pkg is InstalledPackage; - - webResourcesToolStripMenuItem.Text = string.Format( - webResourcesToolStripMenuItem.Tag.ToString(), - pkg.Name.Replace("&", "&&")); // pkg.Nameに&が含まれているときはエンコード - webOfficialToolStripMenuItem.Enabled = ! (pkg.Url == null || string.IsNullOrEmpty(pkg.Url.Href)); - // webGoogleSearchToolStripMenuItem always active. + Package pkg = packageListView.SelectedPackage; + InstalledPackage iPkg = pkg as InstalledPackage; - bool installedDirectoryStripMenuItemVisible = isInstalledPackage && - ( (pkg.Type == InstallerType.ARCHIVE) || Directory.Exists(((InstalledPackage) pkg).discoverInstalledLocation()) ); - installedDirectoryStripMenuItem.Visible = installedDirectoryStripMenuItemVisible; - if (installedDirectoryStripMenuItemVisible) { - buildInstalledDirectoryMenuItemStripChildren((InstalledPackage) pkg); + // インストール済みパッケージのとき + if (iPkg != null) { + bool launcherMenuItemVisible = + (pkg.Type == InstallerType.ARCHIVE) || + (pkg.Type == InstallerType.ITSELF) || + Directory.Exists(iPkg.DiscoverInstalledLocation()); + + launcherMenuItem.Visible = launcherMenuItemVisible; + if (launcherMenuItemVisible) { + launcherMenuItem.BaseFolderPath = iPkg.DiscoverInstalledLocation(); + } + } else { + launcherMenuItem.Visible = false; } + } else { + launcherMenuItem.Visible = false; } - - packageListContextMenuStripSeparator.Visible = parentIsPkgListView && selectionIsOnlyOne; - webResourcesToolStripMenuItem.Visible = selectionIsOnlyOne; - if (! selectionIsOnlyOne) installedDirectoryStripMenuItem.Visible = false; - propertiesToolStripMenuItem.Visible = selectionIsOnlyOne; } - private IEnumerable getUpdatedPackages(PackageList installedPkgList, PackageList avaiablePkgList, IComparer verComp) + void PackageListContextMenuStripOpening(object sender, System.ComponentModel.CancelEventArgs e) { - foreach (InstalledPackage pkg in installedPkgList) { - Package avaiablePkg = avaiablePkgList.GetPackageForName(pkg.Name); - - if (avaiablePkgList != null) { - if (verComp.Compare(pkg.Version, avaiablePkg.Version) < 0 && - installedPkgList.GetPackageForPackage(pkg.Name, avaiablePkg.Version) == null) { - - yield return avaiablePkg; - } + bool selectionIsOnlyOne = packageListView.SelectedItems.Count == 1; + bool hasSelection = packageListView.SelectedItems.Count > 0; + + updateSelectedPackages(); + + // インストール先のフォルダの設定 + updateLauncherMenuItem(installedDirectoryToolStripMenuItem); + + if (packageListView.View == View.Details) { + // ヘッダ部がクリックされたとき、パッケージが選択されていないものとして扱って処理をする。 + int headerHeight = AppliStation.Util.NativeMethods.ColumnHeader_GetSize(packageListView).Height; + if (packageListView.PointToClient(packageListContextMenuStrip.Location).Y < headerHeight) { + selectionIsOnlyOne = hasSelection = false; + installToolStripMenuItem.Visible = false; + uninstallToolStripMenuItem.Visible = false; + installedDirectoryToolStripMenuItem.Visible = false; } } + + packageListContextMenuStripSeparator.Visible = selectionIsOnlyOne; + webResourceToolStripMenuItem.Visible = selectionIsOnlyOne; + propertiesToolStripMenuItem.Visible = hasSelection; + columnToolStripMenuItem.Visible = (! hasSelection) && (packageListView.View == View.Details); } - void UpgradeToolStripButtonClick(object sender, EventArgs e) + void InformationToolStripDropDownButtonDropDownOpening(object sender, EventArgs e) { - List pkgs; - VersionComparetor verComp = new VersionComparetor(); - PackageList avaiablePackageList = pkgListsMan.AvailablePkgList; + bool selectionIsOnlyOne = packageListView.SelectedItems.Count == 1; + bool hasSelection = packageListView.SelectedItems.Count > 0; + + // インストール先のフォルダの設定 + updateLauncherMenuItem(installedDirectoryMenuItem); - pkgs = NaGet.Utils.MeargeList( - getUpdatedPackages(pkgListsMan.InstalledPkgList, avaiablePackageList, verComp), - getUpdatedPackages(pkgListsMan.SystemInstalledPkgList, avaiablePackageList, verComp) + webResourceMenuItem.Visible = selectionIsOnlyOne; + propertiesMenuItem.Visible = hasSelection; + } + + void WebResourceCommonContextMenuStripOpening(object sender, System.ComponentModel.CancelEventArgs e) + { + Package pkg = packageListView.SelectedPackage; + + if (pkg != null && pkg.Url != null && !string.IsNullOrEmpty(pkg.Url.Href)) { + webOfficialMenuItem.Enabled = true; + webOfficialMenuItem.ToolTipText = pkg.Url.Href; + } else { + webOfficialMenuItem.Enabled = false; + webOfficialMenuItem.ToolTipText = null; + } + + // webGoogleSearchMenuItem always active. + } + + void UpgradeToolStripButtonClick(object sender, EventArgs e) + { + List pkgs = new List( + UpgradeFinder.GetUpgradePackages(pkgListsMan) ); if (pkgs.Count <= 0) { @@ -665,35 +746,22 @@ namespace AppliStation } } - public void UpdatePackageList() - { - pkgListsMan.LoadPackageLists(); - this.PackageListViewUpdate(); - } - - /// - /// インストールするよう選択されたパッケージの配列 - /// - public IEnumerable SelectedPackages() where TPackage : Package + protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { - List pkgs = new List(); - foreach (ListViewItem item in packageListView.SelectedItems) { - pkgs.Add((TPackage) item.Tag); + if ((int)keyData == (int)Keys.Control + (int)Keys.E) { + searchTextBox.SelectAll(); + searchTextBox.Focus(); + return true; } - return pkgs; + return base.ProcessCmdKey(ref msg, keyData); } - /// - /// インストールするよう選択されたパッケージをひとつ返す。 - /// - /// 選択されたパッケージ(選択されていないときはnull) - public TPackage SelectedPackage() where TPackage : Package + public void UpdatePackageList() { - foreach (ListViewItem item in packageListView.SelectedItems) { - return (TPackage) item.Tag; - } - return null; + pkgListsMan.LoadPackageLists(); + packageListView.UpdateItems(); + updateSelectedPackages(); } /// @@ -712,6 +780,47 @@ namespace AppliStation process.Invoke(); } } + + void ColumnCommonToolStripMenuItemClick(object sender, EventArgs e) + { + packageListView.BeginUpdate(); + ColumnHeader sortcolumn = packageListView.SortColumn; + + // 列の追加と削除 + foreach (ToolStripItem item in columnToolStripMenuItem.DropDownItems) { + ToolStripMenuItem menu = item as ToolStripMenuItem; + if (menu != null) { + bool exists = false; + // 列が存在しているがチェックが外れていたら削除する。 + foreach (ColumnHeader header in packageListView.Columns) { + if (header.Tag == menu.Tag) { + exists = true; + if (sortcolumn == header) { + packageListView.SortColumn = sortcolumn = null; + } + if (menu.Checked == false) { + packageListView.Columns.Remove(header); + } + break; + } + } + + // 列が存在していなく、チェックがされているなら追加する。 + if (menu.Checked && !exists) { + ColumnHeader header = new ColumnHeader(); + header.Text = menu.Text; + header.Tag = menu.Tag; + packageListView.Columns.Add(header); + } + } + } + + AppliStation.Util.NativeMethods.ColumnHeader_SetSortState(packageListView, (sortcolumn != null)? sortcolumn.Index : -1, SortOrder.None); + + packageListView.UpdateItems(); + + packageListView.EndUpdate(); + } } }