}\r
}\r
\r
- private void _insertItemFor(string filepath, ref bool cmdIsAdded)\r
+ private void _insertItemFor(string filepath, ref bool cmdIsAdded, string basedir)\r
{\r
string extension = Path.GetExtension(filepath).ToLower();\r
+ \r
+ string dirname = Path.GetDirectoryName(filepath);\r
+ string itemtext = NaGet.Utils.GetRelativePath(basedir, filepath);\r
+#if DEBUG\r
+Debug.Assert(! itemtext.Contains(".."), string.Format("{2} -- base:{0}, dirname:{1}", basedir, dirname, itemtext));\r
+#endif\r
+ \r
if (extension == ".exe") {\r
switch (NaGet.InteropServices.PEFileInfoUtils.GetPEFileType(filepath)) {\r
case NaGet.InteropServices.PEFileInfoUtils.PEFileType.WinGUI:\r
- _addToItemsInv(CreateMenuItemForFile(filepath));\r
+ _addToItemsInv(CreateMenuItemForFile(filepath, itemtext));\r
break;\r
case NaGet.InteropServices.PEFileInfoUtils.PEFileType.WinConsole:\r
case NaGet.InteropServices.PEFileInfoUtils.PEFileType.MSDosCom:\r
if (! cmdIsAdded) {\r
- _insertToItemsInv(0, CreateMenuItemForCmdAt(Path.GetDirectoryName(filepath)));\r
+ _insertToItemsInv(0, CreateMenuItemForCmdAt(basedir));\r
cmdIsAdded = true;\r
}\r
break;\r
}\r
} else if ((extension == ".bat") || (extension == ".lnk")) {\r
- _addToItemsInv(CreateMenuItemForFile(filepath));\r
+ _addToItemsInv(CreateMenuItemForFile(filepath, itemtext));\r
}\r
}\r
\r
private void buildItems()\r
{\r
try {\r
- string folderPath = baseFolderPath;\r
+ string folderPath = Path.GetFullPath(baseFolderPath);\r
ToolStripSeparator sep = new ToolStripSeparator();\r
bool cmdIsAdded = false;\r
\r
foreach (string filepath in Directory.GetFiles(folderPath)) {\r
if (baseFolderPath != folderPath) return; // 途中でなんか操作されているならば終了\r
\r
- _insertItemFor(filepath, ref cmdIsAdded);\r
+ _insertItemFor(filepath, ref cmdIsAdded, folderPath);\r
+ }\r
+ \r
+ string bindir = Path.Combine(folderPath, "bin");\r
+ if (Directory.Exists(bindir)) {\r
+ foreach (string filepath in Directory.GetFiles(bindir)) {\r
+ if (baseFolderPath != folderPath) return; // 途中でなんか操作されているならば終了\r
+ \r
+ _insertItemFor(filepath, ref cmdIsAdded, folderPath);\r
+ }\r
}\r
}\r
} catch (ThreadInterruptedException) {}\r
/// <returns></returns>\r
public static ToolStripMenuItem CreateMenuItemForFolder(string folderPath)\r
{\r
- ToolStripMenuItem item = CreateMenuItemForFile(folderPath);\r
+ ToolStripMenuItem item = CreateMenuItemForFile(folderPath, "フォルダを開く(&O)");\r
item.Image = GUIUtils.GetShellIconForFolder().ToBitmap();\r
- item.Text = "フォルダを開く(&O)";\r
+ item.ShowShortcutKeys = true;\r
return item;\r
}\r
\r
/// </summary>\r
/// <param name="filePath">ファイルパス</param>\r
/// <returns>生成されたメニューアイテム</returns>\r
- public static ToolStripMenuItem CreateMenuItemForFile(string filePath)\r
+ public static ToolStripMenuItem CreateMenuItemForFile(string filePath, string text)\r
{\r
ToolStripMenuItem item = new ToolStripMenuItem();\r
- string fileName = Path.GetFileName(filePath);\r
\r
- item.Text = fileName;\r
+ item.Text = text;\r
item.ShowShortcutKeys = false;\r
item.Tag = filePath;\r
item.Click += new System.EventHandler(menuItemForFileClicked);\r
}\r
\r
/// <summary>\r
- /// Converts a given absolute path and a given base path to a path that leads\r
- /// from the base path to the absoulte path. (as a relative path)\r
+ /// パスがフォルダのとき、最後がパスセパレータで終了するようにする。\r
/// </summary>\r
+ /// <param name="path">パス</param>\r
+ /// <returns>処理されたパス</returns>\r
+ private static string fixLastPathCharForDirectory(string path)\r
+ {\r
+ string fixedPath = path;\r
+ if (Directory.Exists(path) && path[path.Length-1] != Path.DirectorySeparatorChar) {\r
+ fixedPath += Path.DirectorySeparatorChar;\r
+ }\r
+ return fixedPath;\r
+ }\r
+ \r
+ /// <summary>\r
+ /// 絶対パスを相対パスに変換して返します。\r
+ /// </summary>\r
+ /// <param name="baseDirectoryPath">相対パスの基準のフォルダ</param>\r
+ /// <param name="absPath">絶対パス</param>\r
+ /// <returns><code>absPath</code>の絶対パス表現</returns>\r
public static string GetRelativePath(string baseDirectoryPath, string absPath)\r
{\r
- // TODO SharpDevelopのICSharpCode.Core.FileUtilityからのコピペ(GPL)\r
+ Uri baseuri = new Uri(fixLastPathCharForDirectory(baseDirectoryPath));\r
+ Uri absuri = new Uri(fixLastPathCharForDirectory(absPath));\r
\r
- string[] bPath = splitPath(baseDirectoryPath);\r
- string[] aPath = splitPath(absPath);\r
- int indx = 0;\r
- for(; indx < Math.Min(bPath.Length, aPath.Length); ++indx){\r
- if(!bPath[indx].Equals(aPath[indx], StringComparison.OrdinalIgnoreCase))\r
- break;\r
- }\r
-\r
- if (indx == 0) {\r
- return absPath;\r
- }\r
-\r
- StringBuilder erg = new StringBuilder();\r
-\r
- if(indx == bPath.Length) {\r
-// erg.Append('.');\r
-// erg.Append(Path.DirectorySeparatorChar);\r
- } else {\r
- for (int i = indx; i < bPath.Length; ++i) {\r
- erg.Append("..");\r
- erg.Append(Path.DirectorySeparatorChar);\r
- }\r
- }\r
- erg.Append(String.Join(Path.DirectorySeparatorChar.ToString(), aPath, indx, aPath.Length-indx));\r
- return erg.ToString();\r
+ string relative = baseuri.MakeRelativeUri(absuri).ToString();\r
+ relative = System.Web.HttpUtility.UrlDecode(relative);\r
+ relative = relative.Replace('/', Path.DirectorySeparatorChar);\r
+ \r
+ return relative;\r
}\r
\r
/// <summary>\r