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
53 if (Directory.Exists(baseFolderPath)) {
\r
54 thread = new Thread(new ThreadStart(buildItems));
\r
61 private delegate int ToolStripItemCollection_AddDelegate(ToolStripItem item);
\r
62 private void _addToItemsInv(ToolStripItem item)
\r
64 if (InvokerForm.InvokeRequired) {
\r
65 InvokerForm.Invoke(new ToolStripItemCollection_AddDelegate(DropDownItems.Add), item);
\r
67 DropDownItems.Add(item);
\r
70 private delegate void ToolStripItemCollection_InsertDelegate(int index, ToolStripItem item);
\r
71 private void _insertToItemsInv(int index, ToolStripItem item)
\r
73 if (InvokerForm.InvokeRequired) {
\r
74 InvokerForm.Invoke(new ToolStripItemCollection_InsertDelegate(DropDownItems.Insert), index, item);
\r
76 DropDownItems.Insert(index, item);
\r
80 private void _insertItemFor(string filepath, ref bool cmdIsAdded, string basedir)
\r
82 string extension = Path.GetExtension(filepath).ToLower();
\r
84 string dirname = Path.GetDirectoryName(filepath);
\r
85 string itemtext = NaGet.Utils.GetRelativePath(basedir, filepath);
\r
87 Debug.Assert(! itemtext.Contains(".."), string.Format("{2} -- base:{0}, dirname:{1}", basedir, dirname, itemtext));
\r
90 if (extension == ".exe") {
\r
91 switch (NaGet.InteropServices.PEFileInfoUtils.GetPEFileType(filepath)) {
\r
92 case NaGet.InteropServices.PEFileType.WinGUI:
\r
93 _addToItemsInv(CreateMenuItemForFile(filepath, itemtext));
\r
95 case NaGet.InteropServices.PEFileType.WinConsole:
\r
96 case NaGet.InteropServices.PEFileType.MSDosCom:
\r
98 _insertToItemsInv(0, CreateMenuItemForCmdAt(basedir));
\r
103 } else if ((extension == ".bat") || (extension == ".lnk")) {
\r
104 _addToItemsInv(CreateMenuItemForFile(filepath, itemtext));
\r
109 private void buildItems()
\r
111 DropDownItems.Clear();
\r
114 string folderPath = Path.GetFullPath(baseFolderPath);
\r
115 ToolStripSeparator sep = new ToolStripSeparator();
\r
116 bool cmdIsAdded = false;
\r
118 _addToItemsInv(CreateMenuItemForFolder(folderPath));
\r
119 _addToItemsInv(sep);
\r
121 if (Directory.Exists(folderPath)) {
\r
122 foreach (string filepath in Directory.GetFiles(folderPath)) {
\r
123 if (baseFolderPath != folderPath) return; // 途中でなんか操作されているならば終了
\r
125 _insertItemFor(filepath, ref cmdIsAdded, folderPath);
\r
128 string bindir = Path.Combine(folderPath, "bin");
\r
129 if (Directory.Exists(bindir)) {
\r
130 foreach (string filepath in Directory.GetFiles(bindir)) {
\r
131 if (baseFolderPath != folderPath) return; // 途中でなんか操作されているならば終了
\r
133 _insertItemFor(filepath, ref cmdIsAdded, folderPath);
\r
137 } catch (ThreadInterruptedException) {}
\r
143 /// 与えられたフォルダーを開くメニューアイテムを生成する
\r
145 /// <param name="folderPath"></param>
\r
146 /// <returns></returns>
\r
147 private static ToolStripMenuItem CreateMenuItemForFolder(string folderPath)
\r
149 ToolStripMenuItem item = CreateMenuItemForFile(folderPath, "フォルダーを開く(&O)");
\r
150 item.Image = GUIUtils.ShellIconForFolder.ToBitmap();
\r
151 item.ShowShortcutKeys = true;
\r
156 /// 与えられたファイルのランチャーに相当するメニューアイテムを生成する
\r
158 /// <param name="filePath">ファイルパス</param>
\r
159 /// <returns>生成されたメニューアイテム</returns>
\r
160 private static ToolStripMenuItem CreateMenuItemForFile(string filePath, string text)
\r
162 ToolStripMenuItem item = new ToolStripMenuItem();
\r
165 item.ShowShortcutKeys = false;
\r
166 item.Tag = filePath;
\r
167 item.Click += new System.EventHandler(menuItemForFileClicked);
\r
169 if (File.Exists(filePath)) {
\r
170 item.Image = Icon.ExtractAssociatedIcon(filePath).ToBitmap();
\r
172 StringBuilder sb = new StringBuilder();
\r
173 sb.AppendFormat("場所: {0}", Path.GetDirectoryName(filePath));
\r
174 if (File.Exists(filePath)) {
\r
175 FileVersionInfo vInfo = FileVersionInfo.GetVersionInfo(filePath);
\r
177 if (! string.IsNullOrEmpty(vInfo.FileDescription))
\r
178 sb.AppendFormat("\r\nファイルの説明: {0}", vInfo.FileDescription);
\r
179 if (! string.IsNullOrEmpty(vInfo.CompanyName))
\r
180 sb.AppendFormat("\r\n会社: {0}", vInfo.CompanyName);
\r
181 if (! string.IsNullOrEmpty(vInfo.FileVersion))
\r
182 sb.AppendFormat("\r\nファイルバージョン: {0}", vInfo.FileVersion);
\r
184 item.ToolTipText = sb.ToString();
\r
186 item.ToolTipText = filePath;
\r
193 /// <see cref="CreateMenuItemForFile" />により使われるイベントハンドラ
\r
195 /// <param name="sender"></param>
\r
196 /// <param name="e"></param>
\r
197 private static void menuItemForFileClicked(object sender, EventArgs e)
\r
199 ToolStripMenuItem item = (ToolStripMenuItem) sender;
\r
201 ProcessStartInfo procInfo = new ProcessStartInfo(item.Tag.ToString());
\r
202 procInfo.WorkingDirectory = Path.GetDirectoryName(procInfo.FileName);
\r
204 Process.Start(procInfo);
\r
205 } catch (Win32Exception ex) {
\r
206 MessageBox.Show(ex.Message, procInfo.FileName, MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
211 /// 与えられたフォルダーのところでコマンドプロンプトを開く。
\r
213 /// <param name="folderPath">カレントフォルダー及びパスに追加されるフォルダー</param>
\r
214 /// <returns>生成されたメニューアイテム</returns>
\r
215 private static ToolStripMenuItem CreateMenuItemForCmdAt(string folderPath)
\r
217 string cmdPath = Environment.GetEnvironmentVariable("comspec");
\r
218 if (string.IsNullOrEmpty(cmdPath) || (!File.Exists(cmdPath)))
\r
219 throw new FileNotFoundException(null, Environment.ExpandEnvironmentVariables("%comspec%"));
\r
221 ToolStripMenuItem item = new ToolStripMenuItem();
\r
223 item.Text = string.Format("この場所で{0}を開く(&C)", (cmdPath.EndsWith(@"\command.com"))? "MS-DOSプロンプト" : "コマンドプロンプト");
\r
224 item.Tag = folderPath;
\r
225 item.Click += new System.EventHandler(menuItemForCmdAtClicked);
\r
227 item.Image = Icon.ExtractAssociatedIcon(cmdPath).ToBitmap();
\r
228 } catch (Exception) {}
\r
234 /// <see cref="CreateMenuItemForCmdAt" />により使われるイベントハンドラ
\r
236 /// <param name="sender"></param>
\r
237 /// <param name="e"></param>
\r
238 private static void menuItemForCmdAtClicked(object sender, EventArgs e)
\r
240 ToolStripMenuItem item = (ToolStripMenuItem) sender;
\r
241 string cmdPath = Environment.GetEnvironmentVariable("comspec");
\r
243 ProcessStartInfo procInfo = new ProcessStartInfo(cmdPath);
\r
244 procInfo.UseShellExecute = false;
\r
245 procInfo.WorkingDirectory = item.Tag.ToString();
\r
246 procInfo.EnvironmentVariables["PATH"] = Environment.GetEnvironmentVariable("path")
\r
247 + Path.PathSeparator + item.Tag.ToString();
\r
248 Process.Start(procInfo);
\r