lldirpicker.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:7k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lldirpicker.cpp
  3.  * @brief OS-specific file picker
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #include "llviewerprecompiledheaders.h"
  33. #include "lldirpicker.h"
  34. //#include "llviewermessage.h"
  35. #include "llworld.h"
  36. #include "llviewerwindow.h"
  37. #include "llkeyboard.h"
  38. #include "lldir.h"
  39. #include "llframetimer.h"
  40. #include "lltrans.h"
  41. #include "llwindow.h" // beforeDialog()
  42. #if LL_LINUX || LL_SOLARIS
  43. # include "llfilepicker.h"
  44. #endif
  45. //
  46. // Globals
  47. //
  48. LLDirPicker LLDirPicker::sInstance;
  49. #if LL_WINDOWS
  50. #include <shlobj.h>
  51. #endif
  52. //
  53. // Implementation
  54. //
  55. #if LL_WINDOWS
  56. LLDirPicker::LLDirPicker() :
  57. mFileName(NULL),
  58. mLocked(false)
  59. {
  60. }
  61. LLDirPicker::~LLDirPicker()
  62. {
  63. // nothing
  64. }
  65. BOOL LLDirPicker::getDir(std::string* filename)
  66. {
  67. if( mLocked )
  68. {
  69. return FALSE;
  70. }
  71. BOOL success = FALSE;
  72. // Modal, so pause agent
  73. send_agent_pause();
  74.    BROWSEINFO bi;
  75.    memset(&bi, 0, sizeof(bi));
  76.    bi.ulFlags   = BIF_USENEWUI;
  77.    bi.hwndOwner = (HWND)gViewerWindow->getPlatformWindow();
  78.    bi.lpszTitle = NULL;
  79.    ::OleInitialize(NULL);
  80.    LPITEMIDLIST pIDL = ::SHBrowseForFolder(&bi);
  81.    if(pIDL != NULL)
  82.    {
  83.       WCHAR buffer[_MAX_PATH] = {''};
  84.       if(::SHGetPathFromIDList(pIDL, buffer) != 0)
  85.       {
  86.    // Set the string value.
  87.     mDir = utf16str_to_utf8str(llutf16string(buffer));
  88.          success = TRUE;
  89.       }
  90.       // free the item id list
  91.       CoTaskMemFree(pIDL);
  92.    }
  93.    ::OleUninitialize();
  94. send_agent_resume();
  95. // Account for the fact that the app has been stalled.
  96. LLFrameTimer::updateFrameTime();
  97. return success;
  98. }
  99. std::string LLDirPicker::getDirName()
  100. {
  101. return mDir;
  102. }
  103. /////////////////////////////////////////////DARWIN
  104. #elif LL_DARWIN
  105. LLDirPicker::LLDirPicker() :
  106. mFileName(NULL),
  107. mLocked(false)
  108. {
  109. reset();
  110. memset(&mNavOptions, 0, sizeof(mNavOptions));
  111. OSStatus error = NavGetDefaultDialogCreationOptions(&mNavOptions);
  112. if (error == noErr)
  113. {
  114. mNavOptions.modality = kWindowModalityAppModal;
  115. }
  116. }
  117. LLDirPicker::~LLDirPicker()
  118. {
  119. // nothing
  120. }
  121. //static
  122. pascal void LLDirPicker::doNavCallbackEvent(NavEventCallbackMessage callBackSelector,
  123.  NavCBRecPtr callBackParms, void* callBackUD)
  124. {
  125. switch(callBackSelector)
  126. {
  127. case kNavCBStart:
  128. {
  129. if (!sInstance.mFileName) break;
  130.  
  131. OSStatus error = noErr; 
  132. AEDesc theLocation = {typeNull, NULL};
  133. FSSpec outFSSpec;
  134. //Convert string to a FSSpec
  135. FSRef myFSRef;
  136. const char* filename=sInstance.mFileName->c_str();
  137. error = FSPathMakeRef ((UInt8*)filename, &myFSRef,  NULL); 
  138. if (error != noErr) break;
  139. error = FSGetCatalogInfo (&myFSRef, kFSCatInfoNone, NULL, NULL, &outFSSpec, NULL);
  140. if (error != noErr) break;
  141. error = AECreateDesc(typeFSS, &outFSSpec, sizeof(FSSpec), &theLocation);
  142. if (error != noErr) break;
  143. error = NavCustomControl(callBackParms->context,
  144. kNavCtlSetLocation, (void*)&theLocation);
  145. }
  146. }
  147. }
  148. OSStatus LLDirPicker::doNavChooseDialog()
  149. {
  150. OSStatus error = noErr;
  151. NavDialogRef navRef = NULL;
  152. NavReplyRecord navReply;
  153. memset(&navReply, 0, sizeof(navReply));
  154. // NOTE: we are passing the address of a local variable here.  
  155. //   This is fine, because the object this call creates will exist for less than the lifetime of this function.
  156. //   (It is destroyed by NavDialogDispose() below.)
  157. error = NavCreateChooseFolderDialog(&mNavOptions, &doNavCallbackEvent, NULL, NULL, &navRef);
  158. gViewerWindow->mWindow->beforeDialog();
  159. if (error == noErr)
  160. error = NavDialogRun(navRef);
  161. gViewerWindow->mWindow->afterDialog();
  162. if (error == noErr)
  163. error = NavDialogGetReply(navRef, &navReply);
  164. if (navRef)
  165. NavDialogDispose(navRef);
  166. if (error == noErr && navReply.validRecord)
  167. {
  168. FSRef fsRef;
  169. AEKeyword theAEKeyword;
  170. DescType typeCode;
  171. Size actualSize = 0;
  172. char path[LL_MAX_PATH];  /*Flawfinder: ignore*/
  173. memset(&fsRef, 0, sizeof(fsRef));
  174. error = AEGetNthPtr(&navReply.selection, 1, typeFSRef, &theAEKeyword, &typeCode, &fsRef, sizeof(fsRef), &actualSize);
  175. if (error == noErr)
  176. error = FSRefMakePath(&fsRef, (UInt8*) path, sizeof(path));
  177. if (error == noErr)
  178. mDir = path;
  179. }
  180. return error;
  181. }
  182. BOOL LLDirPicker::getDir(std::string* filename)
  183. {
  184. if( mLocked ) return FALSE;
  185. BOOL success = FALSE;
  186. OSStatus error = noErr;
  187. mFileName = filename;
  188. // mNavOptions.saveFileName 
  189. // Modal, so pause agent
  190. send_agent_pause();
  191. {
  192. error = doNavChooseDialog();
  193. }
  194. send_agent_resume();
  195. if (error == noErr)
  196. {
  197. if (mDir.length() >  0)
  198. success = true;
  199. }
  200. // Account for the fact that the app has been stalled.
  201. LLFrameTimer::updateFrameTime();
  202. return success;
  203. }
  204. std::string LLDirPicker::getDirName()
  205. {
  206. return mDir;
  207. }
  208. void LLDirPicker::reset()
  209. {
  210. mLocked = false;
  211. mDir.clear();
  212. }
  213. #elif LL_LINUX || LL_SOLARIS
  214. LLDirPicker::LLDirPicker() :
  215. mFileName(NULL),
  216. mLocked(false)
  217. {
  218. mFilePicker = new LLFilePicker();
  219. reset();
  220. }
  221. LLDirPicker::~LLDirPicker()
  222. {
  223. delete mFilePicker;
  224. }
  225. void LLDirPicker::reset()
  226. {
  227. if (mFilePicker)
  228. mFilePicker->reset();
  229. }
  230. BOOL LLDirPicker::getDir(std::string* filename)
  231. {
  232. reset();
  233. if (mFilePicker)
  234. {
  235. GtkWindow* picker = mFilePicker->buildFilePicker(false, true,
  236.  "dirpicker");
  237. if (picker)
  238. {    
  239.    gtk_window_set_title(GTK_WINDOW(picker), LLTrans::getString("choose_the_directory").c_str());
  240.    gtk_widget_show_all(GTK_WIDGET(picker));
  241.    gtk_main();
  242.    return (!mFilePicker->getFirstFile().empty());
  243. }
  244. }
  245. return FALSE;
  246. }
  247. std::string LLDirPicker::getDirName()
  248. {
  249. if (mFilePicker)
  250. {
  251. return mFilePicker->getFirstFile();
  252. }
  253. return "";
  254. }
  255. #else // not implemented
  256. LLDirPicker::LLDirPicker() 
  257. {
  258. reset();
  259. }
  260. LLDirPicker::~LLDirPicker()
  261. {
  262. }
  263. void LLDirPicker::reset()
  264. {
  265. }
  266. BOOL LLDirPicker::getDir(std::string* filename)
  267. {
  268. return FALSE;
  269. }
  270. std::string LLDirPicker::getDirName()
  271. {
  272. return "";
  273. }
  274. #endif