00001
00032 #ifndef LL_LLPREVIEWSCRIPT_H
00033 #define LL_LLPREVIEWSCRIPT_H
00034
00035 #include "lldarray.h"
00036 #include "llpreview.h"
00037 #include "lltabcontainer.h"
00038 #include "llinventory.h"
00039 #include "llcombobox.h"
00040 #include "lliconctrl.h"
00041 #include "llframetimer.h"
00042
00043
00044 class LLMessageSystem;
00045 class LLTextEditor;
00046 class LLButton;
00047 class LLCheckBoxCtrl;
00048 class LLScrollListCtrl;
00049 class LLViewerObject;
00050 struct LLEntryAndEdCore;
00051 class LLMenuBarGL;
00052 class LLFloaterScriptSearch;
00053 class LLKeywordToken;
00054
00055
00056 class LLScriptEdCore : public LLPanel
00057 {
00058 friend class LLPreviewScript;
00059 friend class LLPreviewLSL;
00060 friend class LLLiveLSLEditor;
00061 friend class LLFloaterScriptSearch;
00062
00063 public:
00064 LLScriptEdCore(
00065 const std::string& name,
00066 const LLRect& rect,
00067 const std::string& sample,
00068 const std::string& help,
00069 const LLHandle<LLFloater>& floater_handle,
00070 void (*load_callback)(void* userdata),
00071 void (*save_callback)(void* userdata, BOOL close_after_save),
00072 void (*search_replace_callback)(void* userdata),
00073 void* userdata,
00074 S32 bottom_pad = 0);
00075 ~LLScriptEdCore();
00076
00077 void initMenu();
00078
00079 virtual void draw();
00080
00081 BOOL canClose();
00082
00083 static void handleSaveChangesDialog(S32 option, void* userdata);
00084 static void handleReloadFromServerDialog(S32 option, void* userdata);
00085
00086 static void onHelpWebDialog(S32 option, void* userdata);
00087 static void onBtnHelp(void* userdata);
00088 static void onBtnDynamicHelp(void* userdata);
00089 static void onCheckLock(LLUICtrl*, void*);
00090 static void onHelpComboCommit(LLUICtrl* ctrl, void* userdata);
00091 static void onClickBack(void* userdata);
00092 static void onClickForward(void* userdata);
00093 static void onBtnInsertSample(void*);
00094 static void onBtnInsertFunction(LLUICtrl*, void*);
00095 static void doSave( void* userdata, BOOL close_after_save );
00096 static void onBtnSave(void*);
00097 static void onBtnUndoChanges(void*);
00098 static void onSearchMenu(void* userdata);
00099
00100 static void onUndoMenu(void* userdata);
00101 static void onRedoMenu(void* userdata);
00102 static void onCutMenu(void* userdata);
00103 static void onCopyMenu(void* userdata);
00104 static void onPasteMenu(void* userdata);
00105 static void onSelectAllMenu(void* userdata);
00106 static void onDeselectMenu(void* userdata);
00107
00108 static BOOL enableUndoMenu(void* userdata);
00109 static BOOL enableRedoMenu(void* userdata);
00110 static BOOL enableCutMenu(void* userdata);
00111 static BOOL enableCopyMenu(void* userdata);
00112 static BOOL enablePasteMenu(void* userdata);
00113 static BOOL enableSelectAllMenu(void* userdata);
00114 static BOOL enableDeselectMenu(void* userdata);
00115
00116 static BOOL hasChanged(void* userdata);
00117
00118 void selectFirstError();
00119
00120 virtual BOOL handleKeyHere(KEY key, MASK mask);
00121
00122 protected:
00123 void deleteBridges();
00124 void setHelpPage(const LLString& help_string);
00125 void updateDynamicHelp(BOOL immediate = FALSE);
00126 void addHelpItemToHistory(const LLString& help_string);
00127
00128 static void onErrorList(LLUICtrl*, void* user_data);
00129
00130 virtual const char *getTitleName() const { return "Script"; }
00131
00132 private:
00133 LLString mSampleText;
00134 std::string mHelpFile;
00135 LLTextEditor* mEditor;
00136 void (*mLoadCallback)(void* userdata);
00137 void (*mSaveCallback)(void* userdata, BOOL close_after_save);
00138 void (*mSearchReplaceCallback) (void* userdata);
00139 void* mUserdata;
00140 LLComboBox *mFunctions;
00141 BOOL mForceClose;
00142
00143 LLPanel* mCodePanel;
00144 LLScrollListCtrl* mErrorList;
00145 LLDynamicArray<LLEntryAndEdCore*> mBridges;
00146 LLHandle<LLFloater> mLiveHelpHandle;
00147 LLKeywordToken* mLastHelpToken;
00148 LLFrameTimer mLiveHelpTimer;
00149 S32 mLiveHelpHistorySize;
00150 };
00151
00152
00153
00154 class LLPreviewLSL : public LLPreview
00155 {
00156 public:
00157 LLPreviewLSL(const std::string& name, const LLRect& rect, const std::string& title,
00158 const LLUUID& item_uuid );
00159 virtual void callbackLSLCompileSucceeded();
00160 virtual void callbackLSLCompileFailed(const LLSD& compile_errors);
00161
00162 void open();
00163
00164 protected:
00165 virtual BOOL canClose();
00166 void closeIfNeeded();
00167 virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
00168
00169 virtual void loadAsset();
00170 void saveIfNeeded();
00171 void uploadAssetViaCaps(const std::string& url,
00172 const std::string& filename,
00173 const LLUUID& item_id);
00174 void uploadAssetLegacy(const std::string& filename,
00175 const LLUUID& item_id,
00176 const LLTransactionID& tid);
00177
00178 static void onSearchReplace(void* userdata);
00179 static void onLoad(void* userdata);
00180 static void onSave(void* userdata, BOOL close_after_save);
00181
00182 static void onLoadComplete(LLVFS *vfs, const LLUUID& uuid,
00183 LLAssetType::EType type,
00184 void* user_data, S32 status, LLExtStat ext_status);
00185 static void onSaveComplete(const LLUUID& uuid, void* user_data, S32 status, LLExtStat ext_status);
00186 static void onSaveBytecodeComplete(const LLUUID& asset_uuid, void* user_data, S32 status, LLExtStat ext_status);
00187 static LLPreviewLSL* getInstance(const LLUUID& uuid);
00188
00189 static void* createScriptEdPanel(void* userdata);
00190
00191
00192 protected:
00193
00194 virtual const char *getTitleName() const { return "Script"; }
00195 LLScriptEdCore* mScriptEd;
00196
00197 S32 mPendingUploads;
00198 };
00199
00200
00201
00202 class LLLiveLSLEditor : public LLPreview
00203 {
00204 public:
00205 LLLiveLSLEditor(const std::string& name, const LLRect& rect,
00206 const std::string& title,
00207 const LLUUID& object_id, const LLUUID& item_id);
00208 ~LLLiveLSLEditor();
00209
00210
00211 static LLLiveLSLEditor* show(const LLUUID& item_id, const LLUUID& object_id);
00212 static void hide(const LLUUID& item_id, const LLUUID& object_id);
00213 static LLLiveLSLEditor* find(const LLUUID& item_id, const LLUUID& object_id);
00214
00215 static void processScriptRunningReply(LLMessageSystem* msg, void**);
00216
00217 virtual void callbackLSLCompileSucceeded(const LLUUID& task_id,
00218 const LLUUID& item_id,
00219 bool is_script_running);
00220 virtual void callbackLSLCompileFailed(const LLSD& compile_errors);
00221
00222
00223 void open();
00224
00225 protected:
00226 virtual BOOL canClose();
00227 void closeIfNeeded();
00228 virtual void draw();
00229 virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
00230
00231 virtual void loadAsset();
00232 void loadAsset(BOOL is_new);
00233 void saveIfNeeded();
00234 void uploadAssetViaCaps(const std::string& url,
00235 const std::string& filename,
00236 const LLUUID& task_id,
00237 const LLUUID& item_id,
00238 BOOL is_running);
00239 void uploadAssetLegacy(const std::string& filename,
00240 LLViewerObject* object,
00241 const LLTransactionID& tid,
00242 BOOL is_running);
00243
00244 static void onSearchReplace(void* userdata);
00245 static void onLoad(void* userdata);
00246 static void onSave(void* userdata, BOOL close_after_save);
00247
00248 static void onLoadComplete(LLVFS *vfs, const LLUUID& asset_uuid,
00249 LLAssetType::EType type,
00250 void* user_data, S32 status, LLExtStat ext_status);
00251 static void onSaveTextComplete(const LLUUID& asset_uuid, void* user_data, S32 status, LLExtStat ext_status);
00252 static void onSaveBytecodeComplete(const LLUUID& asset_uuid, void* user_data, S32 status, LLExtStat ext_status);
00253 static void onRunningCheckboxClicked(LLUICtrl*, void* userdata);
00254 static void onReset(void* userdata);
00255
00256 void loadScriptText(const char* filename);
00257 void loadScriptText(LLVFS *vfs, const LLUUID &uuid, LLAssetType::EType type);
00258
00259 static void onErrorList(LLUICtrl*, void* user_data);
00260
00261 static void* createScriptEdPanel(void* userdata);
00262
00263
00264 protected:
00265 LLUUID mObjectID;
00266 LLUUID mItemID;
00267 BOOL mIsNew;
00268 LLScriptEdCore* mScriptEd;
00269
00270 LLCheckBoxCtrl *mRunningCheckbox;
00271 BOOL mAskedForRunningInfo;
00272 BOOL mHaveRunningInfo;
00273 LLButton *mResetButton;
00274 LLPointer<LLViewerInventoryItem> mItem;
00275 BOOL mCloseAfterSave;
00276
00277 S32 mPendingUploads;
00278
00279 static LLMap<LLUUID, LLLiveLSLEditor*> sInstances;
00280 };
00281
00282
00283 extern const char HELP_LSL[];
00284
00285 #endif // LL_LLPREVIEWSCRIPT_H