OSDN Git Service

AppliStation-GUI,簡易ランチャーにてbinフォルダ以下も見るようにした。
authorttp <ttp@users.sourceforge.jp>
Sun, 7 Jun 2009 03:41:36 +0000 (12:41 +0900)
committerttp <ttp@users.sourceforge.jp>
Sun, 7 Jun 2009 03:41:36 +0000 (12:41 +0900)
na-get-lib,相対パスを求める関数を変更。

AppliStation/AppliStation.Util/ToolStripPetitLauncherMenuItem.cs
na-get-lib/NaGet/Utils.cs

index b90d674..353982a 100644 (file)
@@ -81,24 +81,31 @@ namespace AppliStation.Util
                        }\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
@@ -106,7 +113,7 @@ namespace AppliStation.Util
                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
@@ -117,7 +124,16 @@ namespace AppliStation.Util
                                        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
@@ -132,9 +148,9 @@ namespace AppliStation.Util
                /// <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
@@ -143,12 +159,11 @@ namespace AppliStation.Util
                /// </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
index 59a61d7..55fafd8 100644 (file)
@@ -316,38 +316,35 @@ namespace NaGet
                }\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