using System; using System.Drawing; using System.Windows.Forms; using System.Text; using System.IO; using NaGet.Packages.Install; using NaGet.Packages; namespace AppliStation { /// /// Description of PackageInfoForm. /// public partial class PackageInfoForm : Form { private Package pkg; public PackageInfoForm() { InitializeComponent(); } /// /// 現在選択中(=表示中)のパッケージ /// public Package SelectedObject { get { return pkg; } set { pkg = value; updateSelectedObject(); } } private void updateSelectedObject() { bool isInstalledPackage = pkg is InstalledPackage; iconLabel.Image = null; iconLabel.Size = Size.Empty; if (isInstalledPackage) { Icon icon = AppliStation.Util.GUIUtils.GetIconForPackage((InstalledPackage) pkg); if (icon != null) { iconLabel.Image = icon.ToBitmap(); iconLabel.Size = icon.Size; } } nameLabel.Text = string.Format("{0} ({1})", pkg.Name, pkg.Version); nameLabel.Font = new Font(SystemFonts.CaptionFont.FontFamily, SystemFonts.CaptionFont.Size*1.25f); summaryTextBox.Text = pkg.Summary; if (isInstalledPackage) { UninstallInformation uninstInfo = ((InstalledPackage) pkg).UninstallInfo; string instPath = null; if (pkg.Type == InstallerType.ARCHIVE) { instPath = Path.Combine(NaGet.Env.ArchiveProgramFiles, pkg.Name); } else if (Directory.Exists(uninstInfo.InstallLocation)) { instPath = uninstInfo.InstallLocation; } statusLinkLabel.Links.Clear(); if (string.IsNullOrEmpty(instPath)) { statusLinkLabel.Text = "情報が提供されていません"; statusLinkLabel.Enabled = false; } else { statusLinkLabel.Text = instPath; statusLinkLabel.Enabled = true; addLinkToLinkLabel(statusLinkLabel, uninstInfo.InstallLocation, uninstInfo.InstallLocation); } } urlLinkLabel.Links.Clear(); if (pkg.Url != null) { urlLinkLabel.Text = pkg.Url.Href; urlLinkLabel.Links.Add(0, pkg.Url.Href.Length, pkg.Url.Href); } else { urlLinkLabel.Text = string.Empty; urlLinkLabel.Enabled = false; urlLabel.Enabled = false; } tagsTextBox.Text = pkg.Tags; setLinkLabelFromLicense(licenseLinkLabel, pkg.License, (pkg.Url!=null)?pkg.Url.Href:string.Empty); setTypeValueLabel(typeValueLabel, pkg.Type); tabControl1.TabPages.Clear(); if (pkg is InstalledPackage && string.IsNullOrEmpty(pkg.Version)) { tabControl1.Visible = false; } else { tabControl1.Visible = true; foreach (Installer inst in pkg.Installer) { TabPage page = new TabPage(string.Format("インストーラ その{0}", tabControl1.TabCount+1)); page.Dock = DockStyle.Fill; InstallerInfoForm instForm = new InstallerInfoForm(); instForm.SelectedObject = inst; instForm.Dock = DockStyle.Fill; page.Controls.Add(instForm); tabControl1.TabPages.Add(page); } } this.Size = new Size(this.Size.Width, (tabControl1.TabCount>0)? 380 : 250); } /// /// インストーラの種類についてラベルにテキストを設定する /// /// 設定先のラベル /// インストーラの種類 private static void setLinkLabelFromLicense(LinkLabel linklabel, string license, string publicSiteUrl) { linklabel.Enabled = true; switch (license ?? string.Empty) { case "": if (string.IsNullOrEmpty(publicSiteUrl)) { linklabel.Text = "フリーソフトウェア (無償)"; linklabel.Enabled = false; } else { linklabel.Text = "フリーソフトウェア (詳細は公式サイトなどで確認してください)"; addLinkToLinkLabel(linklabel, "公式サイト", publicSiteUrl); } break; #region オープンソースかつコピーレフト case "GPL": linklabel.Text = "GPL (オープンソース)"; addLinkToLinkLabel(linklabel, "GPL", @"http://www.opensource.jp/gpl/gpl.ja.html"); addLinkToLinkLabel(linklabel, "オープンソース", @"http://creativecommons.org/licenses/GPL/2.0/deed.ja"); break; case "GPLv2": case "GPLv2+": linklabel.Text = "GPLv2 (オープンソース)"; addLinkToLinkLabel(linklabel, "GPLv2", @"http://www.gnu.org/licenses/gpl-2.0.txt"); break; case "GPLv3": case "GPLv3+": linklabel.Text = "GPLv3 (オープンソース)"; addLinkToLinkLabel(linklabel, "GPLv3", @"http://www.gnu.org/licenses/gpl-3.0.txt"); break; case "LGPL": linklabel.Text = "LGPL (オープンソース)"; addLinkToLinkLabel(linklabel, "LGPL", @"http://www.opensource.jp/lesser/lgpl.ja.html"); addLinkToLinkLabel(linklabel, "オープンソース", @"http://creativecommons.org/licenses/LGPL/2.1/deed.ja"); break; case "LGPLv2": case "LGPLv2+": linklabel.Text = "LGPLv2 (オープンソース)"; addLinkToLinkLabel(linklabel, "LGPLv2", @"http://www.gnu.org/licenses/lgpl-2.1.txt"); break; case "LGPLv3": case "LGPLv3+": linklabel.Text = "LGPLv3 (オープンソース)"; addLinkToLinkLabel(linklabel, "LGPLv3", @"http://www.gnu.org/licenses/lgpl-3.0.txt"); break; case "AGPLv3": case "AGPLv3+": linklabel.Text = "AGPLv3 (オープンソース)"; addLinkToLinkLabel(linklabel, "AGPLv3", @"http://www.gnu.org/licenses/agpl-3.0.txt"); break; case "MPL": linklabel.Text = "MPL (オープンソース)"; addLinkToLinkLabel(linklabel, "MPL", @"http://www.mozilla.org/MPL/MPL-1.1.html"); break; case "CPL": linklabel.Text = "CPL (オープンソース)"; linklabel.Links.Add(0, linklabel.Text.Length, @"http://sourceforge.jp/projects/opensource/wiki/licenses%2FCommon_Public_License"); break; case "Artistic": linklabel.Text = "Artisticライセンス (オープンソース)"; addLinkToLinkLabel(linklabel, "Artisticライセンス", @"http://www.perlfoundation.org/artistic_license_2_0"); break; #endregion #region オープンソースだが、コピーレフトでない著名なライセンス case "MIT": linklabel.Text = "MITライセンス (オープンソース)"; addLinkToLinkLabel(linklabel, "MITライセンス", @"http://www.opensource.org/licenses/mit-license.php"); break; case "BSD": linklabel.Text = "修正済BSDライセンス (オープンソース)"; addLinkToLinkLabel(linklabel, "BSDライセンス", @"http://www.opensource.org/licenses/bsd-license.php"); break; case "Apache": case "ASLv2": case "ASLv2+": linklabel.Text = "Apacheライセンス (オープンソース)"; addLinkToLinkLabel(linklabel, "Apacheライセンス", @"http://www.apache.org/licenses/LICENSE-2.0.txt"); break; case "zlib": linklabel.Text = "zlibライセンス"; linklabel.Links.Add(0, linklabel.Text.Length, @"http://opentechpress.jp/docs/licenses/zlib-license.shtml"); break; #endregion case "WTFPL": case "WTFPLv2": linklabel.Text = "WTFPL"; linklabel.Links.Add(0, linklabel.Text.Length, @"http://sam.zoy.org/wtfpl/"); break; case "NYSL": linklabel.Text = "煮るなり焼くなり好きにしろライセンス"; linklabel.Links.Add(0, linklabel.Text.Length, @"http://www.kmonos.net/nysl/NYSL_withfaq.TXT"); break; case "Public Domain": linklabel.Text = "パブリックドメイン (著作権帰属なし)"; linklabel.Links.Add(0, linklabel.Text.Length, @"http://e-words.jp/w/E38391E38396E383AAE38383E382AFE38389E383A1E382A4E383B3.html"); break; default: if (license.StartsWith("http://")) { linklabel.Text = license; linklabel.Links.Add(0, license.Length, license); } else { linklabel.Text = license; linklabel.Links.Add(0, 0, string.Empty); } break; } } /// /// インストーラの種類についてラベルにテキストを設定する /// /// 設定先のラベル /// インストーラの種類 private static void setTypeValueLabel(Label typeValueLabel, InstallerType instType) { switch (instType) { case InstallerType.ARCHIVE: typeValueLabel.Text = "自己解凍書庫または書庫"; break; case InstallerType.EXEC_INSTALLER: typeValueLabel.Text = "インストーラ形式"; break; case InstallerType.MSI_PACKAGE: typeValueLabel.Text = "MSIファイル形式"; break; default: typeValueLabel.Text = "不明なインストール形式(インストール不能)"; break; } } /// /// リンクラベルのリンク挿入便利メソッド /// /// 対象リンクラベル /// リンク対象文字列 /// リンクオブジェクト private static void addLinkToLinkLabel(LinkLabel linkLabel, string word, string link) { int pos = linkLabel.Text.IndexOf(word, 0); if (pos >= 0) { linkLabel.Links.Add(pos, word.Length, link); } else throw new ArgumentException(string.Format("label text \"{0}\" does not contain \"{1}\"!", linkLabel.Text, word)); } private void linkLabelLinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { string linkData = e.Link.LinkData.ToString(); if (Directory.Exists(linkData)) { e.Link.Visited = true; System.Diagnostics.Process.Start(e.Link.LinkData.ToString()); } else if (System.Text.RegularExpressions.Regex.IsMatch(linkData, @"^(https?|file)://")) { e.Link.Visited = true; try { System.Diagnostics.Process.Start(e.Link.LinkData.ToString()); } catch (System.ComponentModel.Win32Exception) { MessageBox.Show(string.Format("{0}を開くのに失敗しました。", e.Link.LinkData), "ブラウザ起動エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } } }