2 using System.Threading;
\r
4 using System.Drawing;
\r
5 using System.Windows.Forms;
\r
6 using System.Diagnostics;
\r
9 using System.ComponentModel;
\r
11 namespace AppliStation.Util
\r
13 public class ToolStripPetitLauncherMenuItem : ToolStripMenuItem
\r
15 private Thread thread;
\r
17 private string baseFolderPath;
\r
19 private Form invokerForm;
\r
25 public string BaseFolderPath {
\r
26 get { return baseFolderPath; }
\r
28 baseFolderPath = value;
\r
34 /// 別スレッドからInvokeするときのオブジェクト
\r
36 public Form InvokerForm {
\r
37 get { return invokerForm; }
\r
38 set { invokerForm = value; }
\r
42 /// ドロップアイテムの(再)生成を行う
\r
44 public void BuildItems()
\r
46 if (thread != null) {
\r
47 if (! thread.Join(500)) {
\r
54 DropDownItems.Clear();
\r
55 } catch (NullReferenceException) {
\r
57 if (Directory.Exists(baseFolderPath)) {
\r
58 thread = new Thread(new ThreadStart(buildItems));
\r
65 private delegate int ToolStripItemCollection_AddDelegate(ToolStripItem item);
\r
66 private void _addToItemsInv(ToolStripItem item)
\r
68 if (InvokerForm.InvokeRequired) {
\r
69 InvokerForm.Invoke(new ToolStripItemCollection_AddDelegate(DropDownItems.Add), item);
\r
71 DropDownItems.Add(item);
\r
74 private delegate void ToolStripItemCollection_InsertDelegate(int index, ToolStripItem item);
\r
75 private void _insertToItemsInv(int index, ToolStripItem item)
\r
77 if (InvokerForm.InvokeRequired) {
\r
78 InvokerForm.Invoke(new ToolStripItemCollection_InsertDelegate(DropDownItems.Insert), index, item);
\r
80 DropDownItems.Insert(index, item);
\r
84 private void _insertItemFor(string filepath, ref bool cmdIsAdded)
\r
86 string extension = Path.GetExtension(filepath).ToLower();
\r
87 if (extension == ".exe") {
\r
88 switch (NaGet.InteropServices.PEFileInfoUtils.GetPEFileType(filepath)) {
\r
89 case NaGet.InteropServices.PEFileInfoUtils.PEFileType.WinGUI:
\r
90 _addToItemsInv(CreateMenuItemForFile(filepath));
\r
92 case NaGet.InteropServices.PEFileInfoUtils.PEFileType.WinConsole:
\r
93 case NaGet.InteropServices.PEFileInfoUtils.PEFileType.MSDosCom:
\r
95 _insertToItemsInv(0, CreateMenuItemForCmdAt(Path.GetDirectoryName(filepath)));
\r
100 } else if ((extension == ".bat") || (extension == ".lnk")) {
\r
101 _addToItemsInv(CreateMenuItemForFile(filepath));
\r
106 private void buildItems()
\r
109 string folderPath = baseFolderPath;
\r
110 ToolStripSeparator sep = new ToolStripSeparator();
\r
111 bool cmdIsAdded = false;
\r
113 _addToItemsInv(CreateMenuItemForFolder(folderPath));
\r
114 _addToItemsInv(sep);
\r
116 if (Directory.Exists(folderPath)) {
\r
117 foreach (string filepath in Directory.GetFiles(folderPath)) {
\r
118 if (baseFolderPath != folderPath) return; // 途中でなんか操作されているならば終了
\r
120 _insertItemFor(filepath, ref cmdIsAdded);
\r
123 } catch (ThreadInterruptedException) {}
\r
129 /// 与えられたフォルダを開くメニューアイテムを生成する
\r
131 /// <param name="folderPath"></param>
\r
132 /// <returns></returns>
\r
133 public static ToolStripMenuItem CreateMenuItemForFolder(string folderPath)
\r
135 ToolStripMenuItem item = CreateMenuItemForFile(folderPath);
\r
136 item.Image = GUIUtils.GetShellIconForFolder().ToBitmap();
\r
137 item.Text = "フォルダを開く(&O)";
\r
142 /// 与えられたファイルのランチャーに相当するメニューアイテムを生成する
\r
144 /// <param name="filePath">ファイルパス</param>
\r
145 /// <returns>生成されたメニューアイテム</returns>
\r
146 public static ToolStripMenuItem CreateMenuItemForFile(string filePath)
\r
148 ToolStripMenuItem item = new ToolStripMenuItem();
\r
149 string fileName = Path.GetFileName(filePath);
\r
151 item.Text = fileName;
\r
152 item.ShowShortcutKeys = false;
\r
153 item.Tag = filePath;
\r
154 item.Click += new System.EventHandler(menuItemForFileClicked);
\r
156 if (File.Exists(filePath)) {
\r
157 item.Image = Icon.ExtractAssociatedIcon(filePath).ToBitmap();
\r
159 StringBuilder sb = new StringBuilder();
\r
160 sb.AppendFormat("場所: {0}", Path.GetDirectoryName(filePath));
\r
162 FileVersionInfo vInfo = FileVersionInfo.GetVersionInfo(filePath);
\r
164 if (! string.IsNullOrEmpty(vInfo.FileDescription))
\r
165 sb.AppendFormat("\r\nファイルの説明: {0}", vInfo.FileDescription);
\r
166 if (! string.IsNullOrEmpty(vInfo.CompanyName))
\r
167 sb.AppendFormat("\r\n会社: {0}", vInfo.CompanyName);
\r
168 if (! string.IsNullOrEmpty(vInfo.FileVersion))
\r
169 sb.AppendFormat("\r\nファイルバージョン: {0}", vInfo.FileVersion);
\r
170 } catch (Exception) {}
\r
171 item.ToolTipText = sb.ToString();
\r
173 item.ToolTipText = filePath;
\r
180 /// <see cref="CreateMenuItemForFile" />により使われるイベントハンドラ
\r
182 /// <param name="sender"></param>
\r
183 /// <param name="e"></param>
\r
184 private static void menuItemForFileClicked(object sender, EventArgs e)
\r
186 ToolStripMenuItem item = (ToolStripMenuItem) sender;
\r
188 ProcessStartInfo procInfo = new ProcessStartInfo(item.Tag.ToString());
\r
189 procInfo.WorkingDirectory = Path.GetDirectoryName(procInfo.FileName);
\r
191 Process.Start(procInfo);
\r
192 } catch (Win32Exception ex) {
\r
193 MessageBox.Show(ex.Message, procInfo.FileName, MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
198 /// 与えられたフォルダのところでコマンドプロンプトを開く。
\r
200 /// <param name="folderPath">カレントフォルダ及びパスに追加されるフォルダ</param>
\r
201 /// <returns>生成されたメニューアイテム</returns>
\r
202 public static ToolStripMenuItem CreateMenuItemForCmdAt(string folderPath)
\r
204 string cmdPath = Environment.GetEnvironmentVariable("comspec");
\r
205 if (string.IsNullOrEmpty(cmdPath) || (!File.Exists(cmdPath)))
\r
206 throw new FileNotFoundException(null, Environment.ExpandEnvironmentVariables("%comspec%"));
\r
208 ToolStripMenuItem item = new ToolStripMenuItem();
\r
210 item.Text = string.Format("この場所で{0}を開く(&C)", (cmdPath.EndsWith(@"\command.com"))? "MS-DOSプロンプト" : "コマンドプロンプト");
\r
211 item.Tag = folderPath;
\r
212 item.Click += new System.EventHandler(menuItemForCmdAtClicked);
\r
214 item.Image = Icon.ExtractAssociatedIcon(cmdPath).ToBitmap();
\r
215 } catch (Exception) {}
\r
221 /// <see cref="CreateMenuItemForCmdAt" />により使われるイベントハンドラ
\r
223 /// <param name="sender"></param>
\r
224 /// <param name="e"></param>
\r
225 private static void menuItemForCmdAtClicked(object sender, EventArgs e)
\r
227 ToolStripMenuItem item = (ToolStripMenuItem) sender;
\r
228 string cmdPath = Environment.GetEnvironmentVariable("comspec");
\r
230 ProcessStartInfo procInfo = new ProcessStartInfo(cmdPath);
\r
231 procInfo.UseShellExecute = false;
\r
232 procInfo.WorkingDirectory = item.Tag.ToString();
\r
233 procInfo.EnvironmentVariables["PATH"] = Environment.GetEnvironmentVariable("path")
\r
234 + Path.PathSeparator + item.Tag.ToString();
\r
235 Process.Start(procInfo);
\r