2 using System.Threading;
\r
4 using System.Drawing;
\r
5 using System.Windows.Forms;
\r
6 using System.Diagnostics;
\r
9 namespace AppliStation.Util
\r
11 public class ToolStripPetitLauncherMenuItem : ToolStripMenuItem
\r
13 private Thread thread;
\r
15 private string baseFolderPath;
\r
20 public string BaseFolderPath {
\r
21 get { return baseFolderPath; }
\r
23 baseFolderPath = value;
\r
29 /// ドロップアイテムの(再)生成を行う
\r
31 public void BuildItems()
\r
33 if (thread != null) {
\r
34 if (! thread.Join(1000)) {
\r
40 DropDownItems.Clear();
\r
41 if (Directory.Exists(baseFolderPath)) {
\r
42 thread = new Thread(new ThreadStart(buildItems));
\r
49 private delegate int ToolStripItemCollection_AddDelegate(ToolStripItem item);
\r
50 private void _addToItemsInv(ToolStripItem item)
\r
52 if (Parent.InvokeRequired) {
\r
53 Parent.Invoke(new ToolStripItemCollection_AddDelegate(DropDownItems.Add), item);
\r
55 DropDownItems.Add(item);
\r
59 private void buildItems()
\r
62 string folderPath = baseFolderPath;
\r
63 ToolStripSeparator sep = new ToolStripSeparator();
\r
66 ToolStripMenuItem item = CreateMenuItemForFile(folderPath);
\r
67 item.Text = "フォルダを開く(&O)";
\r
69 _addToItemsInv(item);
\r
71 _addToItemsInv(sep);
\r
73 if (Directory.Exists(folderPath)) {
\r
74 foreach (string exeFile in Directory.GetFiles(folderPath, "*.exe")) {
\r
75 if (baseFolderPath != folderPath) return; // 途中でなんか操作されているならば終了
\r
77 if (NaGet.InteropServices.PEFileInfoUtils.GetPEFileType(exeFile) == NaGet.InteropServices.PEFileInfoUtils.PEFileType.WinGUI) {
\r
78 _addToItemsInv(CreateMenuItemForFile(exeFile));
\r
82 } catch (ThreadInterruptedException) {}
\r
88 /// 与えられたファイルのランチャーに相当するメニューアイテムを生成する
\r
90 /// <param name="filePath">ファイルパス</param>
\r
91 /// <returns>生成されたメニューアイテム</returns>
\r
92 public static ToolStripMenuItem CreateMenuItemForFile(string filePath)
\r
94 ToolStripMenuItem item = new ToolStripMenuItem();
\r
95 string fileName = Path.GetFileName(filePath);
\r
97 item.Text = fileName;
\r
98 item.ShowShortcutKeys = false;
\r
99 item.Tag = filePath;
\r
100 item.Click += new System.EventHandler(menuItemForFileClicked);
\r
102 if (File.Exists(filePath)) {
\r
103 item.Image = Icon.ExtractAssociatedIcon(filePath).ToBitmap();
\r
105 StringBuilder sb = new StringBuilder();
\r
106 sb.AppendFormat("場所: {0}", Path.GetDirectoryName(filePath));
\r
108 FileVersionInfo vInfo = FileVersionInfo.GetVersionInfo(filePath);
\r
110 if (! string.IsNullOrEmpty(vInfo.FileDescription))
\r
111 sb.AppendFormat("\r\nファイルの説明: {0}", vInfo.FileDescription);
\r
112 if (! string.IsNullOrEmpty(vInfo.CompanyName))
\r
113 sb.AppendFormat("\r\n会社: {0}", vInfo.CompanyName);
\r
114 if (! string.IsNullOrEmpty(vInfo.FileVersion))
\r
115 sb.AppendFormat("\r\nファイルバージョン: {0}", vInfo.FileVersion);
\r
116 } catch (Exception) {}
\r
117 item.ToolTipText = sb.ToString();
\r
119 item.ToolTipText = filePath;
\r
126 /// <see cref="CreateMenuItemForFile" />により使われるイベントハンドラ
\r
128 /// <param name="sender"></param>
\r
129 /// <param name="e"></param>
\r
130 private static void menuItemForFileClicked(object sender, EventArgs e)
\r
132 ToolStripMenuItem item = (ToolStripMenuItem) sender;
\r
134 ProcessStartInfo procInfo = new ProcessStartInfo(item.Tag.ToString());
\r
135 procInfo.WorkingDirectory = Path.GetDirectoryName(procInfo.FileName);
\r
136 Process.Start(procInfo);
\r