OSDN Git Service

空白の入ったパスがDolphinで開けなかったバグを修正。
[tpi/lychee.git] / src / lychee / functions.cpp
1 /*******************************************************************************\r
2   TPI - flexible but useless plug-in framework.\r
3   Copyright (C) 2002-2009 Silky\r
4 \r
5   This library is free software; you can redistribute it and/or modify it under\r
6   the terms of the GNU Lesser General Public License as published by the Free\r
7   Software Foundation; either version 2.1 of the License, or (at your option)\r
8   any later version.\r
9 \r
10   This library is distributed in the hope that it will be useful, but WITHOUT\r
11   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or \r
12   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License\r
13   for more details.\r
14 \r
15   You should have received a copy of the GNU Lesser General Public License along\r
16   with this library; if not, write to the Free Software Foundation, Inc.,\r
17   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r
18 \r
19   $Id$\r
20 *******************************************************************************/\r
21 \r
22 //******************************************************************************\r
23 //    ファイル読み込み\r
24 //******************************************************************************\r
25 \r
26 #include "lychee.h"\r
27 #include "frm_main.h"\r
28 #include "dlg_make.h"\r
29 #include "functions.h"\r
30 \r
31 //******************************************************************************\r
32 //    コントロール処理系関数\r
33 //******************************************************************************\r
34 \r
35 bool TreeView_CheckNewerItem(wxTreeCtrl * tree_ctrl, wxTreeItemId idParent, const wxString & szDirPath, bool bReallyMake)\r
36 {\r
37         // 最初の子アイテムを取得。\r
38         wxTreeItemIdValue idv;\r
39         wxTreeItemId idChild = tree_ctrl->GetFirstChild(idParent, idv);\r
40         wxChar cSep = wxFileName::GetPathSeparator();\r
41         while (idChild.IsOk())\r
42         {\r
43                 // アイテムと名前が同じならOK。\r
44                 if (tree_ctrl->GetItemText(idChild) == szDirPath.BeforeFirst(cSep))\r
45                 {\r
46                         // これ以下の階層が無い場合。\r
47                         if (szDirPath.Find(cSep) == wxNOT_FOUND)\r
48                         {\r
49                                 return bReallyMake;\r
50                         }\r
51 \r
52                         // まだ階層が有る場合、再帰。\r
53                         return TreeView_CheckNewerItem(tree_ctrl, idChild, szDirPath.AfterFirst(cSep), bReallyMake);\r
54                 }\r
55 \r
56                 idChild = tree_ctrl->GetNextSibling(idChild);\r
57         }\r
58 \r
59         // 対象が無い場合には作成。\r
60         if (! szDirPath.IsEmpty())\r
61         {\r
62                 if (! bReallyMake)\r
63                 {\r
64                         // 確認するだけならここで終了。\r
65                         return true;\r
66                 }\r
67 \r
68                 // 2階層以上深い場合にも対応。\r
69                 wxString szTemp = szDirPath;\r
70                 wxTreeItemId idTemp = idParent;\r
71                 do\r
72                 {\r
73                         // 展開してから作成。\r
74                         idTemp = tree_ctrl->AppendItem(idTemp, szTemp.BeforeFirst(cSep), 0, 1);\r
75                         szTemp = szTemp.AfterFirst(cSep);\r
76                 }\r
77                 while (szTemp.Find(cSep) != wxNOT_FOUND);\r
78 \r
79                 // 最後に空でない場合にはもう1階層作成。\r
80                 if (! szTemp.IsEmpty())\r
81                 {\r
82                         tree_ctrl->AppendItem(idTemp, szTemp, 0, 1);\r
83                 }\r
84         }\r
85 \r
86         return false;\r
87 }\r
88 \r
89 wxString TreeView_GetItemPath(wxTreeCtrl * tree_ctrl, wxTreeItemId idItem)\r
90 {\r
91         wxString szItemName = tree_ctrl->GetItemText(idItem), szNodePath = wxEmptyString;\r
92         wxChar cSep = wxFileName::GetPathSeparator();\r
93 \r
94         // アイテムの名前を取得。\r
95         while (! szItemName.IsEmpty())\r
96         {\r
97                 if (szItemName == wxT("-----"))\r
98                 {\r
99                         break;\r
100                 }\r
101 \r
102                 // パスに追加。\r
103                 szNodePath = szItemName + cSep + szNodePath;\r
104 \r
105                 // 親アイテムに遡る。\r
106                 idItem = tree_ctrl->GetItemParent(idItem);\r
107                 if (idItem == tree_ctrl->GetRootItem())\r
108                 {\r
109                         // ここにくるのは書庫内全表示時。\r
110                         szNodePath = wxT("*");\r
111                         break;\r
112                 }\r
113                 szItemName = tree_ctrl->GetItemText(idItem);\r
114         }\r
115 \r
116         return (szNodePath.Find(cSep) == wxNOT_FOUND) ? szNodePath : szNodePath.BeforeLast(cSep);\r
117 }\r
118 \r
119 //******************************************************************************\r
120 //    諸処理関数\r
121 //******************************************************************************\r
122 \r
123 // ディレクトリを新規に作成。\r
124 wxFileName MakeDirPath(wxFileName fnPath, wxString szBase, bool bAct)\r
125 {\r
126         // とりあえず作ってみる。\r
127         wxFileName fnDir = fnPath;\r
128         fnDir.AppendDir(szBase);\r
129         if (! fnDir.DirExists() && ! ::wxFileExists(fnDir.GetPath()))\r
130         {\r
131                 if (! bAct || fnDir.Mkdir())\r
132                 {\r
133                         return fnDir;\r
134                 }\r
135         }\r
136 \r
137         // ダメなら"_%d"を付加して試行。\r
138         for (int i = 0; i < 255; i++)\r
139         {\r
140                 fnDir = fnPath;\r
141                 fnDir.AppendDir(szBase + wxString::Format(wxT("_%d"), i));\r
142                 if (! fnDir.DirExists() && ! ::wxFileExists(fnDir.GetPath()))\r
143                 {\r
144                         if (! bAct || fnDir.Mkdir())\r
145                         {\r
146                                 return fnDir;\r
147                         }\r
148                 }\r
149         }\r
150 \r
151         // エラー終了。\r
152         fnDir.Clear();\r
153         return fnDir;\r
154 }\r
155 \r
156 wxArrayString MakeTargetFileList(MainFrame * frm, bool fOnlyOneFile)\r
157 {\r
158         wxArrayString as;\r
159         const int nState = frm->list_ctrl->GetSelectedItemCount() == 0 ? wxLIST_STATE_DONTCARE : wxLIST_STATE_SELECTED;\r
160         long nId = frm->list_ctrl->GetNextItem(-1, wxLIST_NEXT_ALL, nState);\r
161         while (nId != -1)\r
162         {\r
163                 as.Add(frm->list_ctrl->showFileInfo[nId].szStoredName);\r
164                 if (fOnlyOneFile)\r
165                 {\r
166                         break;\r
167                 }\r
168                 nId = frm->list_ctrl->GetNextItem(nId, wxLIST_NEXT_ALL, nState);\r
169         }\r
170 \r
171         return as;\r
172 }\r
173 \r
174 bool WillMakeDirByArcName(MainFrame * frm, MakeDialog * mk)\r
175 {\r
176         if (mk->chDirMake->GetSelection() != 2)\r
177         {\r
178                 return mk->chDirMake->GetSelection() == 1;\r
179         }\r
180 \r
181         // ルートにディレクトリとファイル合わせて2個以上あるとき、ディレクトリを作成。\r
182         wxTreeItemId tiArcRoot = frm->tree_ctrl->GetLastChild(frm->tree_ctrl->GetRootItem());\r
183         switch (frm->tree_ctrl->GetChildrenCount(tiArcRoot, false))\r
184         {\r
185         case 0:\r
186         {\r
187                 // ディレクトリがないので、ルートにファイルが2個以上あるかどうかを判定。\r
188                 bool fFlag = false;\r
189                 for (size_t i = 0; i < frm->fileinfo.GetCount(); i++)\r
190                 {\r
191                         if (frm->fileinfo[i].fnFileName.GetPath().IsEmpty())\r
192                         {\r
193                                 // ファイルはルートにある。\r
194                                 if (fFlag)\r
195                                 {\r
196                                         return true;\r
197                                 }\r
198 \r
199                                 fFlag = true;\r
200                         }\r
201                 }\r
202                 break;\r
203         }\r
204         case 1:\r
205                 // ディレクトリが1個なので、ルートにファイルがないかどうかを判定。\r
206                 for (size_t i = 0; i < frm->fileinfo.GetCount(); i++)\r
207                 {\r
208                         // ディレクトリメンバが格納されている場合には、その名前がツリービューのアイテム名に一致した場合はカウントしない。\r
209                         if (frm->fileinfo[i].fnFileName.GetPath().IsEmpty() && frm->fileinfo[i].fnFileName.GetFullName() != frm->tree_ctrl->GetItemText(frm->tree_ctrl->GetLastChild(tiArcRoot)))\r
210                         {\r
211                                 return true;\r
212                         }\r
213                 }\r
214                 break;\r
215         default:\r
216                 // ディレクトリだけで2個以上あるので、自動的に展開先ディレクトリを作成。\r
217                 return true;\r
218         }\r
219 \r
220         return false;\r
221 }\r
222 \r
223 wxString GetFileTypeName(wxFileName fn)\r
224 {\r
225         wxString szExt = fn.GetExt().MakeUpper();\r
226         wxString sz = szExt + (szExt.IsEmpty() ? wxEmptyString : wxT(" ")) + _("file");\r
227         wxFileType * ftFile = wxTheMimeTypesManager->GetFileTypeFromExtension(szExt);\r
228         if (ftFile)\r
229         {\r
230                 ftFile->GetDescription(& sz);\r
231         }\r
232         return sz;\r
233 }\r
234 \r
235 wxIcon GetFileTypeIcon(wxFileName fn)\r
236 {\r
237         wxIcon icon;\r
238         wxIconLocation ilFile;\r
239         wxFileType * ftFile = wxTheMimeTypesManager->GetFileTypeFromExtension(fn.GetExt());\r
240         if (ftFile && ftFile->GetIcon(& ilFile))\r
241         {\r
242                 if (! ::wxFileExists(ilFile.GetFileName()))\r
243                 {\r
244                         icon.CopyFromBitmap(wxBitmap((ilFile.GetFileName() == wxT("%1") || ilFile.GetFileName() == wxT("\"%1\"")) ? L_DIR_S_ICO wxT("exe.png") : L_DIR_S_ICO wxT("file.png"), wxBITMAP_TYPE_ANY));\r
245                 }\r
246                 else\r
247                 {\r
248                         icon = wxIcon(ilFile);\r
249                 }\r
250         }\r
251         else\r
252         {\r
253                 icon.CopyFromBitmap(wxBitmap(L_DIR_S_ICO wxT("file.png"), wxBITMAP_TYPE_ANY));\r
254         }\r
255         return icon;\r
256 }\r
257 \r
258 wxString QuoteString(wxString s)\r
259 {\r
260         return wxT('"') + s + wxT('"');\r
261 }\r