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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llfilepicker.h
  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. // OS specific file selection dialog. This is implemented as a
  33. // singleton class, so call the instance() method to get the working
  34. // instance. When you call getMultipleOpenFile(), it locks the picker
  35. // until you iterate to the end of the list of selected files with
  36. // getNextFile() or call reset().
  37. #ifndef LL_LLFILEPICKER_H
  38. #define LL_LLFILEPICKER_H
  39. #include "stdtypes.h"
  40. #if LL_DARWIN
  41. #include <Carbon/Carbon.h>
  42. // AssertMacros.h does bad things.
  43. #undef verify
  44. #undef check
  45. #undef require
  46. #include <vector>
  47. #include "llstring.h"
  48. #endif
  49. // Need commdlg.h for OPENFILENAMEA
  50. #ifdef LL_WINDOWS
  51. #include <commdlg.h>
  52. #endif
  53. extern "C" {
  54. // mostly for Linux, possible on others
  55. #if LL_GTK
  56. # include "gtk/gtk.h"
  57. #endif // LL_GTK
  58. }
  59. class LLFilePicker
  60. {
  61. #ifdef LL_GTK
  62. friend class LLDirPicker;
  63. friend void chooser_responder(GtkWidget *, gint, gpointer);
  64. #endif // LL_GTK
  65. public:
  66. // calling this before main() is undefined
  67. static LLFilePicker& instance( void ) { return sInstance; }
  68. enum ELoadFilter
  69. {
  70. FFLOAD_ALL = 1,
  71. FFLOAD_WAV = 2,
  72. FFLOAD_IMAGE = 3,
  73. FFLOAD_ANIM = 4,
  74. #ifdef _CORY_TESTING
  75. FFLOAD_GEOMETRY = 5,
  76. #endif
  77. FFLOAD_XML = 6,
  78. FFLOAD_SLOBJECT = 7,
  79. FFLOAD_RAW = 8,
  80. };
  81. enum ESaveFilter
  82. {
  83. FFSAVE_ALL = 1,
  84. FFSAVE_WAV = 3,
  85. FFSAVE_TGA = 4,
  86. FFSAVE_BMP = 5,
  87. FFSAVE_AVI = 6,
  88. FFSAVE_ANIM = 7,
  89. #ifdef _CORY_TESTING
  90. FFSAVE_GEOMETRY = 8,
  91. #endif
  92. FFSAVE_XML = 9,
  93. FFSAVE_COLLADA = 10,
  94. FFSAVE_RAW = 11,
  95. FFSAVE_J2C = 12,
  96. FFSAVE_PNG = 13,
  97. FFSAVE_JPEG = 14,
  98. };
  99. // open the dialog. This is a modal operation
  100. BOOL getSaveFile( ESaveFilter filter = FFSAVE_ALL, const std::string& filename = LLStringUtil::null );
  101. BOOL getOpenFile( ELoadFilter filter = FFLOAD_ALL );
  102. BOOL getMultipleOpenFiles( ELoadFilter filter = FFLOAD_ALL );
  103. // Get the filename(s) found. getFirstFile() sets the pointer to
  104. // the start of the structure and allows the start of iteration.
  105. const std::string getFirstFile();
  106. // getNextFile() increments the internal representation and
  107. // returns the next file specified by the user. Returns NULL when
  108. // no more files are left. Further calls to getNextFile() are
  109. // undefined.
  110. const std::string getNextFile();
  111. // This utility function extracts the current file name without
  112. // doing any incrementing.
  113. const std::string getCurFile();
  114. // Returns the index of the current file.
  115. S32 getCurFileNum() const { return mCurrentFile; }
  116. S32 getFileCount() const { return (S32)mFiles.size(); }
  117. // See llvfs/lldir.h : getBaseFileName and getDirName to extract base or directory names
  118. // clear any lists of buffers or whatever, and make sure the file
  119. // picker isn't locked.
  120. void reset();
  121. private:
  122. enum
  123. {
  124. SINGLE_FILENAME_BUFFER_SIZE = 1024,
  125. //FILENAME_BUFFER_SIZE = 65536
  126. FILENAME_BUFFER_SIZE = 65000
  127. };
  128. #if LL_WINDOWS
  129. OPENFILENAMEW mOFN; // for open and save dialogs
  130. WCHAR mFilesW[FILENAME_BUFFER_SIZE];
  131. BOOL setupFilter(ELoadFilter filter);
  132. #endif
  133. #if LL_DARWIN
  134. NavDialogCreationOptions mNavOptions;
  135. std::vector<std::string> mFileVector;
  136. UInt32 mFileIndex;
  137. OSStatus doNavChooseDialog(ELoadFilter filter);
  138. OSStatus doNavSaveDialog(ESaveFilter filter, const std::string& filename);
  139. void getFilePath(SInt32 index);
  140. void getFileName(SInt32 index);
  141. static Boolean navOpenFilterProc(AEDesc *theItem, void *info, void *callBackUD, NavFilterModes filterMode);
  142. #endif
  143. #if LL_GTK
  144. static void add_to_selectedfiles(gpointer data, gpointer user_data);
  145. static void chooser_responder(GtkWidget *widget, gint response, gpointer user_data);
  146. // we remember the last path that was accessed for a particular usage
  147. std::map <std::string, std::string> mContextToPathMap;
  148. std::string mCurContextName;
  149. #endif
  150. std::vector<std::string> mFiles;
  151. S32 mCurrentFile;
  152. bool mLocked;
  153. static LLFilePicker sInstance;
  154. protected:
  155. #if LL_GTK
  156.         GtkWindow* buildFilePicker(bool is_save, bool is_folder,
  157.    std::string context = "generic");
  158. #endif
  159. public:
  160. // don't call these directly please.
  161. LLFilePicker();
  162. ~LLFilePicker();
  163. };
  164. #endif