diff options
author | dolphin <dolphin@lindenlab.com> | 2013-08-15 09:32:12 -0700 |
---|---|---|
committer | dolphin <dolphin@lindenlab.com> | 2013-08-15 09:32:12 -0700 |
commit | 02b501e4dc9a389878cd323e4f781bc752fec737 (patch) | |
tree | c810fe1fb051a9fc561ac279d5f152e28a039b8d | |
parent | 01b363ba52fcdbe4835b067df2d1abe0ea142a9c (diff) |
Move the experience panel to the bottom of the editor floater
-rwxr-xr-x | indra/newview/CMakeLists.txt | 2 | ||||
-rw-r--r-- | indra/newview/llexperienceassociationresponder.cpp | 80 | ||||
-rw-r--r-- | indra/newview/llexperienceassociationresponder.h | 53 | ||||
-rwxr-xr-x | indra/newview/llpreviewscript.cpp | 132 | ||||
-rwxr-xr-x | indra/newview/llpreviewscript.h | 35 | ||||
-rwxr-xr-x | indra/newview/skins/default/xui/en/floater_live_lsleditor.xml | 167 | ||||
-rwxr-xr-x | indra/newview/skins/default/xui/en/panel_script_ed.xml | 41 | ||||
-rwxr-xr-x | indra/newview/skins/default/xui/en/sidepanel_item_info.xml | 889 | ||||
-rw-r--r-- | indra/tools/vstool/DispatchUtility.cs | 271 | ||||
-rw-r--r-- | indra/tools/vstool/app.config | 3 |
10 files changed, 1051 insertions, 622 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 7d361e4f6a..9caff9e038 100755 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -188,6 +188,7 @@ set(viewer_SOURCE_FILES lleventnotifier.cpp lleventpoll.cpp llexpandabletextbox.cpp + llexperienceassociationresponder.cpp llexternaleditor.cpp llface.cpp llfasttimerview.cpp @@ -773,6 +774,7 @@ set(viewer_HEADER_FILES lleventnotifier.h lleventpoll.h llexpandabletextbox.h + llexperienceassociationresponder.h llexternaleditor.h llface.h llfasttimerview.h diff --git a/indra/newview/llexperienceassociationresponder.cpp b/indra/newview/llexperienceassociationresponder.cpp new file mode 100644 index 0000000000..69451bc054 --- /dev/null +++ b/indra/newview/llexperienceassociationresponder.cpp @@ -0,0 +1,80 @@ +/** + * @file llexperienceassociationresponder.cpp + * @brief llexperienceassociationresponder implementation + * + * $LicenseInfo:firstyear=2013&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2013, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" +#include "llexperienceassociationresponder.h" +#include "llexperiencecache.h" + +ExperienceAssociationResponder::ExperienceAssociationResponder(ExperienceAssociationResponder::callback_t callback):mCallback(callback) +{ + ref(); +} + +void ExperienceAssociationResponder::error( U32 status, const std::string& reason ) +{ + LLSD msg; + msg["error"]=(LLSD::Integer)status; + msg["message"]=reason; + LL_INFOS("ExperienceAssociation") << "Failed to look up associated experience: " << status << ": " << reason << LL_ENDL; + + sendResult(msg); + +} +void ExperienceAssociationResponder::result( const LLSD& content ) +{ + if(!content.has("experience")) + { + + LLSD msg; + msg["message"]="no experience"; + msg["error"]=-1; + sendResult(msg); + LL_ERRS("ExperienceAssociation") << "Associated experience missing" << LL_ENDL; + } + + LLExperienceCache::get(content["experience"].asUUID(), boost::bind(&ExperienceAssociationResponder::sendResult, this, _1)); + + /* LLLiveLSLEditor* scriptCore = LLFloaterReg::findTypedInstance<LLLiveLSLEditor>("preview_scriptedit", mParent); + + if(!scriptCore) + return; + + LLUUID id; + if(content.has("experience")) + { + id=content["experience"].asUUID(); + } + scriptCore->setAssociatedExperience(id);*/ +} + +void ExperienceAssociationResponder::sendResult( const LLSD& experience ) +{ + mCallback(experience); + unref(); +} + + + diff --git a/indra/newview/llexperienceassociationresponder.h b/indra/newview/llexperienceassociationresponder.h new file mode 100644 index 0000000000..aa0c51abb5 --- /dev/null +++ b/indra/newview/llexperienceassociationresponder.h @@ -0,0 +1,53 @@ +#include "llhttpclient.h" +#include "llsd.h" +/** + * @file llexperienceassociationresponder.h + * @brief llexperienceassociationresponder and related class definitions + * + * $LicenseInfo:firstyear=2013&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2013, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + + + +#ifndef LL_LLEXPERIENCEASSOCIATIONRESPONDER_H +#define LL_LLEXPERIENCEASSOCIATIONRESPONDER_H + +#include "llhttpclient.h" +#include "llsd.h" + +class ExperienceAssociationResponder : public LLHTTPClient::Responder +{ +public: + typedef boost::function<void(const LLSD& experience)> callback_t; + + ExperienceAssociationResponder(callback_t callback); + virtual void result(const LLSD& content); + virtual void error(U32 status, const std::string& reason); + +private: + void sendResult(const LLSD& experience); + + callback_t mCallback; + +}; + +#endif // LL_LLEXPERIENCEASSOCIATIONRESPONDER_H diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index bd8f65e767..09152ac060 100755 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -87,6 +87,7 @@ #include "llviewercontrol.h" #include "llappviewer.h" #include "llexperiencecache.h" +#include "llexperienceassociationresponder.h" const std::string HELLO_LSL = "default\n" @@ -119,54 +120,23 @@ static bool have_script_upload_cap(LLUUID& object_id) return object && (! object->getRegion()->getCapability("UpdateScriptTask").empty()); } -class ExperienceAssociationResponder : public LLHTTPClient::Responder -{ -public: - ExperienceAssociationResponder(const LLUUID& parent):mParent(parent) - { - } - - LLUUID mParent; - - virtual void result(const LLSD& content) - { - - LLLiveLSLEditor* scriptCore = LLFloaterReg::findTypedInstance<LLLiveLSLEditor>("preview_scriptedit", mParent); - - if(!scriptCore) - return; - - LLUUID id; - if(content.has("experience")) - { - id=content["experience"].asUUID(); - } - scriptCore->setAssociatedExperience(id); - } - - virtual void error(U32 status, const std::string& reason) - { - llinfos << "Failed to look up associated script: " << status << ": " << reason << llendl; - } - -}; class ExperienceResponder : public LLHTTPClient::Responder { public: - ExperienceResponder(const LLHandle<LLScriptEdCore>& parent):mParent(parent) + ExperienceResponder(const LLHandle<LLLiveLSLEditor>& parent):mParent(parent) { } - LLHandle<LLScriptEdCore> mParent; + LLHandle<LLLiveLSLEditor> mParent; virtual void result(const LLSD& content) { - LLScriptEdCore* scriptCore = mParent.get(); - if(!scriptCore) + LLLiveLSLEditor* parent = mParent.get(); + if(!parent) return; - scriptCore->setExperienceIds(content["experience_ids"]); + parent->setExperienceIds(content["experience_ids"]); } }; @@ -426,34 +396,37 @@ LLScriptEdCore::~LLScriptEdCore() delete mLiveFile; } -void LLScriptEdCore::experienceChanged() +void LLLiveLSLEditor::experienceChanged() { - if(mAssociatedExperience != mExperiences->getSelectedValue().asUUID()) + if(mScriptEd->getAssociatedExperience() != mExperiences->getSelectedValue().asUUID()) { - enableSave(TRUE); - getChildView("Save_btn")->setEnabled(TRUE); - mAssociatedExperience = mExperiences->getSelectedValue().asUUID(); + mScriptEd->enableSave(getIsModifiable()); + //getChildView("Save_btn")->setEnabled(TRUE); + mScriptEd->setAssociatedExperience(mExperiences->getSelectedValue().asUUID()); + updateExperiencePanel(); } } -void LLScriptEdCore::onToggleExperience( LLUICtrl *ui, void* userdata ) +void LLLiveLSLEditor::onToggleExperience( LLUICtrl *ui, void* userdata ) { - LLScriptEdCore* self = (LLScriptEdCore*)userdata; + LLLiveLSLEditor* self = (LLLiveLSLEditor*)userdata; LLUUID id; if(self->mExperienceEnabled->get()) { - if(self->mAssociatedExperience.isNull()) + if(self->mScriptEd->getAssociatedExperience().isNull()) { id=self->mExperienceIds.beginArray()->asUUID(); } } - if(id != self->mAssociatedExperience) + if(id != self->mScriptEd->getAssociatedExperience()) { - self->enableSave(TRUE); + self->mScriptEd->enableSave(self->getIsModifiable()); } - self->setAssociatedExperience(id); + self->mScriptEd->setAssociatedExperience(id); + + self->updateExperiencePanel(); } BOOL LLScriptEdCore::postBuild() @@ -462,12 +435,6 @@ BOOL LLScriptEdCore::postBuild() mFunctions = getChild<LLComboBox>( "Insert..."); - mExperiences = getChild<LLComboBox>("Experiences..."); - mExperiences->setCommitCallback(boost::bind(&LLScriptEdCore::experienceChanged, this)); - - mExperienceEnabled = getChild<LLCheckBoxCtrl>("enable_xp"); - - childSetCommitCallback("enable_xp", onToggleExperience, this); childSetCommitCallback("Insert...", &LLScriptEdCore::onBtnInsertFunction, this); @@ -482,8 +449,6 @@ BOOL LLScriptEdCore::postBuild() - requestExperiences(); - std::vector<std::string> funcs; std::vector<std::string> tooltips; @@ -1290,18 +1255,18 @@ LLUUID LLScriptEdCore::getAssociatedExperience()const return mAssociatedExperience; } -void LLScriptEdCore::setExperienceIds( const LLSD& experience_ids ) +void LLLiveLSLEditor::setExperienceIds( const LLSD& experience_ids ) { mExperienceIds=experience_ids; updateExperiencePanel(); } -void LLScriptEdCore::updateExperiencePanel() +void LLLiveLSLEditor::updateExperiencePanel() { - BOOL editable = mEditor->getEnabled(); + BOOL editable = getIsModifiable(); - if(mAssociatedExperience.isNull()) + if(mScriptEd->getAssociatedExperience().isNull()) { mExperienceEnabled->set(FALSE); mExperiences->setVisible(FALSE); @@ -1328,10 +1293,10 @@ void LLScriptEdCore::updateExperiencePanel() } } -void LLScriptEdCore::addExperienceInfo(const LLSD& experience, BOOL enabled) +void LLLiveLSLEditor::addExperienceInfo(const LLSD& experience, BOOL enabled) { LLUUID id = experience[LLExperienceCache::EXPERIENCE_ID].asUUID(); - EAddPosition position = (id == mAssociatedExperience)?ADD_TOP:ADD_BOTTOM; + EAddPosition position = (id == mScriptEd->getAssociatedExperience())?ADD_TOP:ADD_BOTTOM; LLScrollListItem* item=mExperiences->add(experience[LLExperienceCache::NAME], id, position ); if(!enabled) { @@ -1339,20 +1304,20 @@ void LLScriptEdCore::addExperienceInfo(const LLSD& experience, BOOL enabled) } } -void LLScriptEdCore::buildExperienceList() +void LLLiveLSLEditor::buildExperienceList() { mExperiences->clear(); bool foundAssociated=false; for(LLSD::array_const_iterator it = mExperienceIds.beginArray(); it != mExperienceIds.endArray(); ++it) { LLUUID id = it->asUUID(); - foundAssociated |= (id == mAssociatedExperience); - LLExperienceCache::get(id, boost::bind(&LLScriptEdCore::addExperienceInfo, this, _1, TRUE)); + foundAssociated |= (id == mScriptEd->getAssociatedExperience()); + LLExperienceCache::get(id, boost::bind(&LLLiveLSLEditor::addExperienceInfo, this, _1, TRUE)); } if(!foundAssociated ) { - LLExperienceCache::get(mAssociatedExperience, boost::bind(&LLScriptEdCore::addExperienceInfo, this, _1, FALSE)); + LLExperienceCache::get(mScriptEd->getAssociatedExperience(), boost::bind(&LLLiveLSLEditor::addExperienceInfo, this, _1, FALSE)); } } @@ -1361,14 +1326,13 @@ void LLScriptEdCore::buildExperienceList() void LLScriptEdCore::setAssociatedExperience( const LLUUID& experience_id ) { mAssociatedExperience = experience_id; - updateExperiencePanel(); } -void LLScriptEdCore::requestExperiences() +void LLLiveLSLEditor::requestExperiences() { - if (!mEditor->getEnabled()) + if (!getIsModifiable()) { return; } @@ -1379,7 +1343,7 @@ void LLScriptEdCore::requestExperiences() std::string lookup_url=region->getCapability("GetCreatorExperiences"); if(!lookup_url.empty()) { - LLHTTPClient::get(lookup_url, new ExperienceResponder(getDerivedHandle<LLScriptEdCore>())); + LLHTTPClient::get(lookup_url, new ExperienceResponder(getDerivedHandle<LLLiveLSLEditor>())); } } } @@ -1945,6 +1909,15 @@ BOOL LLLiveLSLEditor::postBuild() mScriptEd->mEditor->makePristine(); mScriptEd->mEditor->setFocus(TRUE); + + mExperiences = getChild<LLComboBox>("Experiences..."); + mExperiences->setCommitCallback(boost::bind(&LLLiveLSLEditor::experienceChanged, this)); + + mExperienceEnabled = getChild<LLCheckBoxCtrl>("enable_xp"); + + childSetCommitCallback("enable_xp", onToggleExperience, this); + + return LLPreview::postBuild(); } @@ -2078,6 +2051,8 @@ void LLLiveLSLEditor::loadAsset() time_corrected()); mAssetStatus = PREVIEW_ASSET_LOADED; } + + requestExperiences(); } // static @@ -2556,7 +2531,11 @@ void LLLiveLSLEditor::fetchAssociatedExperience(const LLUUID& asset_id) LLSD fields; fields.append("experience"); request["fields"] = fields; - LLHTTPClient::post(lookup_url, request, new ExperienceAssociationResponder(getKey())); + + ExperienceAssociationResponder::callback_t f = boost::bind(&LLLiveLSLEditor::setAssociatedExperience, getDerivedHandle<LLLiveLSLEditor>(), _1); + LLHTTPClient::post(lookup_url, request, new ExperienceAssociationResponder(f)); + + //test me pls } } } @@ -2634,10 +2613,17 @@ BOOL LLLiveLSLEditor::monoChecked() const return FALSE; } -void LLLiveLSLEditor::setAssociatedExperience( const LLUUID& experience_id ) +void LLLiveLSLEditor::setAssociatedExperience( LLHandle<LLLiveLSLEditor> editor, const LLSD& experience ) { - if(mScriptEd) + LLLiveLSLEditor* scriptEd = editor.get(); + if(scriptEd) { - mScriptEd->setAssociatedExperience(experience_id); + LLUUID id; + if(experience.has(LLExperienceCache::EXPERIENCE_ID)) + { + id=experience[LLExperienceCache::EXPERIENCE_ID].asUUID(); + } + scriptEd->mScriptEd->setAssociatedExperience(id); + scriptEd->updateExperiencePanel(); } } diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h index 9578396f91..bd594cdb9d 100755 --- a/indra/newview/llpreviewscript.h +++ b/indra/newview/llpreviewscript.h @@ -101,19 +101,13 @@ public: static void onBtnInsertFunction(LLUICtrl*, void*); static void onBtnLoadFromFile(void*); static void onBtnSaveToFile(void*); - static void onToggleExperience(LLUICtrl *ui, void* userdata); static bool enableSaveToFileMenu(void* userdata); static bool enableLoadFromFileMenu(void* userdata); - virtual bool hasAccelerators() const { return true; } - void addExperienceInfo( const LLSD& experience, BOOL enabled ); - void setExperienceIds(const LLSD& experience_ids); - void buildExperienceList(); + virtual bool hasAccelerators() const { return true; } LLUUID getAssociatedExperience()const; - void setAssociatedExperience( const LLUUID& experience_id ); - void updateExperiencePanel(); private: void onBtnHelp(); @@ -128,10 +122,6 @@ private: void enableSave(BOOL b) {mEnableSave = b;} - void requestExperiences(); - void experienceChanged(); - void addAssociatedExperience(const LLSD& experience); - protected: void deleteBridges(); void setHelpPage(const std::string& help_string); @@ -146,9 +136,7 @@ private: void (*mSaveCallback)(void* userdata, BOOL close_after_save); void (*mSearchReplaceCallback) (void* userdata); void* mUserdata; - LLComboBox *mFunctions; - LLComboBox *mExperiences; - LLCheckBoxCtrl *mExperienceEnabled; + LLComboBox *mFunctions; BOOL mForceClose; LLPanel* mCodePanel; LLScrollListCtrl* mErrorList; @@ -161,7 +149,6 @@ private: BOOL mHasScriptData; LLLiveLSLFile* mLiveFile; LLUUID mAssociatedExperience; - LLSD mExperienceIds; LLScriptEdContainer* mContainer; // parent view }; @@ -244,8 +231,19 @@ public: /*virtual*/ BOOL postBuild(); void setIsNew() { mIsNew = TRUE; } - void setAssociatedExperience( const LLUUID& experience_id ); + + static void setAssociatedExperience( LLHandle<LLLiveLSLEditor> editor, const LLSD& experience ); + static void onToggleExperience(LLUICtrl *ui, void* userdata); + void fetchAssociatedExperience(const LLUUID& asset_id); + + void addExperienceInfo( const LLSD& experience, BOOL enabled ); + void setExperienceIds(const LLSD& experience_ids); + void buildExperienceList(); + void updateExperiencePanel(); + void requestExperiences(); + void experienceChanged(); + void addAssociatedExperience(const LLSD& experience); private: virtual BOOL canClose(); @@ -299,6 +297,11 @@ private: LLCheckBoxCtrl* mMonoCheckbox; BOOL mIsModifiable; + + + LLComboBox *mExperiences; + LLCheckBoxCtrl *mExperienceEnabled; + LLSD mExperienceIds; }; #endif // LL_LLPREVIEWSCRIPT_H diff --git a/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml index 562936ed80..d8c2a753a1 100755 --- a/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml @@ -1,71 +1,110 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <floater - legacy_header_height="18" - bevel_style="none" - border_style="line" - can_resize="true" - height="580" - layout="topleft" - min_height="271" - min_width="328" - name="script ed float" - help_topic="script_ed_float" - save_rect="true" - title="SCRIPT: NEW SCRIPT" - width="508"> - <floater.string - name="not_allowed"> - You can not view or edit this script, since it has been set as "no copy". You need full permissions to view or edit a script inside an object. - </floater.string> - <floater.string - name="script_running"> - Running - </floater.string> - <floater.string - name="Title"> - SCRIPT: [NAME] - </floater.string> - <panel - bevel_style="none" + legacy_header_height="18" + bevel_style="none" + border_style="line" + can_resize="true" + height="582" + layout="topleft" + min_height="271" + min_width="328" + name="script ed float" + help_topic="script_ed_float" + save_rect="true" + title="SCRIPT: NEW SCRIPT" + width="508"> + <floater.string + name="not_allowed"> + You can not view or edit this script, since it has been set as "no copy". You need full permissions to view or edit a script inside an object. + </floater.string> + <floater.string + name="script_running"> + Running + </floater.string> + <floater.string + name="Title"> + SCRIPT: [NAME] + </floater.string> + <floater.string + name="experience_enabled"> + Uncheck to remove the current experience + </floater.string> + <floater.string + name="no_experiences"> + You are not authorized for any experiences + </floater.string> + <floater.string + name="add_experiences"> + Select to add an experience + </floater.string> + <panel + bevel_style="none" - border_style="line" - follows="left|top|right|bottom" - height="522" - layout="topleft" - left="10" - name="script ed panel" - top="20" - width="497" /> - <button - follows="left|bottom" - height="23" - label="Reset" - label_selected="Reset" - layout="topleft" - name="Reset" - left="10" - width="85" /> - <check_box + border_style="line" + follows="left|top|right|bottom" + height="499" + layout="topleft" + left="10" + name="script ed panel" + top="16" + width="501" /> + <button + follows="left|bottom" + height="23" + label="Reset" + label_selected="Reset" + layout="topleft" + name="Reset" + left="10" + width="85" /> + <check_box left_delta="90" top_delta="3" - enabled="false" - follows="left|bottom" - font="SansSerif" - height="18" - initial_value="true" - label="Running" - layout="topleft" - name="running" - width="205" /> - <check_box + enabled="false" + follows="left|bottom" + font="SansSerif" + height="18" + initial_value="true" + label="Running" + layout="topleft" + name="running" + width="205" /> + <check_box left_delta="140" - enabled="true" - follows="left|bottom" - font="SansSerif" - height="18" - initial_value="true" - label="Mono" - layout="topleft" - name="mono" - width="100" /> + enabled="true" + follows="left|bottom" + font="SansSerif" + height="18" + initial_value="true" + label="Mono" + layout="topleft" + name="mono" + width="100" /> + <check_box width="130" + height="21" + enabled="false" + left="9" + top_pad="10" + layout="topleft" + follows="bottom|left" + label="Use Experience:" + name="enable_xp"/> + <combo_box + label="" + top_pad="-21" + left="149" + right="467" + layout="topleft" + follows="left|bottom|right" + visible="false" + name="Experiences..."/> + <button label=">" + name="view_profile" + height="23" + width="23" + right="496" + layout="topleft" + top_pad="-23" + follows="right" + visible="false"/> </floater> diff --git a/indra/newview/skins/default/xui/en/panel_script_ed.xml b/indra/newview/skins/default/xui/en/panel_script_ed.xml index 18a8ddc1bf..ed99651a78 100755 --- a/indra/newview/skins/default/xui/en/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/en/panel_script_ed.xml @@ -32,18 +32,6 @@ name="external_editor_not_set"> Select an editor by setting the environment variable LL_SCRIPT_EDITOR or the ExternalEditor setting. </panel.string> - <panel.string - name="experience_enabled"> - Uncheck to remove the current experience - </panel.string> - <panel.string - name="no_experiences"> - You are not authorized for any experiences - </panel.string> - <panel.string - name="add_experiences"> - Select to add an experience - </panel.string> <menu_bar bg_visible="false" follows="left|top" @@ -162,7 +150,7 @@ length="1" follows="left|top|right|bottom" font="Monospace" - height="346" + height="369" ignore_tab="false" layout="topleft" max_length="65536" @@ -217,32 +205,5 @@ right="396" name="Edit_btn" width="81" /> - <check_box width="130" - height="21" - enabled="false" - left="0" - top="490" - layout="topleft" - follows="bottom|left" - label="Use Experience:" - name="enable_xp"/> - <combo_box - label="" - top_pad="-23" - left="135" - right="454" - layout="topleft" - follows="left|bottom|right" - visible="false" - name="Experiences..."/> - <button label=">" - name="view_profile" - height="23" - width="23" - right="482" - layout="topleft" - top_pad="-23" - follows="right" - visible="false"/> </panel> diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml index c5dfb703e5..c9c19f6d57 100755 --- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml @@ -1,440 +1,471 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel - follows="all" - height="570" - layout="topleft" - name="item properties" - help_topic="item_properties" - title="Item Profile" - width="333"> - <panel.string - name="unknown"> - (unknown) - </panel.string> - <panel.string - name="unknown_multiple"> - (unknown / multiple) - </panel.string> - <panel.string - name="public"> - (public) - </panel.string> - <panel.string - name="you_can"> - You can: - </panel.string> - <panel.string - name="owner_can"> - Owner can: - </panel.string> - <panel.string - name="acquiredDate"> - [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] - </panel.string> - <panel.string - name="origin_inventory"> - (Inventory) - </panel.string> - <panel.string - name="origin_inworld"> - (Inworld) - </panel.string> - <icon - follows="top|right" - height="18" - image_name="Lock" - layout="topleft" - right="-15" - mouse_opaque="true" - name="IconLocked" - top="8" - width="18" /> - <button - follows="top|left" - height="24" - image_hover_unselected="BackButton_Over" - image_pressed="BackButton_Press" - image_unselected="BackButton_Off" - layout="topleft" - left="12" - name="back_btn" - tab_stop="false" - top="2" - width="30" - use_draw_context_alpha="false" /> - <text - follows="top|left|right" - font="SansSerifHugeBold" - height="26" - layout="topleft" - left_pad="3" - name="title" - text_color="LtGray" - top="2" - use_ellipses="true" - value="Item Profile" - width="275" /> - <text - follows="top|left|right" - height="13" - layout="topleft" - left="45" - name="origin" - text_color="LtGray_50" - use_ellipses="true" - value="(Inventory)" - width="275" /> - <scroll_container - color="DkGray2" - follows="all" - layout="topleft" - left="9" - name="item_profile_scroll" - opaque="true" - height="493" - width="313" - top="45"> - <panel - follows="left|top|right" - height="390" - help_topic="" - label="" - layout="topleft" - left="0" - name="item_profile" - top="0" - width="295"> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="5" - name="LabelItemNameTitle" - top="10" - width="78"> - Name: - </text> - <line_editor - border_style="line" - border_thickness="1" - follows="left|top|right" - height="20" - layout="topleft" - left_delta="78" - max_length_bytes="63" - name="LabelItemName" - top_delta="0" - width="210" /> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="5" - name="LabelItemDescTitle" - top_pad="10" - width="78"> - Description: - </text> - <line_editor - border_style="line" - border_thickness="1" - follows="left|top|right" - height="23" - layout="topleft" - left_delta="78" - max_length_bytes="127" - name="LabelItemDesc" - top_delta="-5" - width="210" /> - <text - type="string" - length="1" - follows="left|top" - height="23" - layout="topleft" - left="5" - name="LabelCreatorTitle" - top_pad="10" - width="78"> - Creator: - </text> - <avatar_icon - follows="top|left" - height="20" - default_icon_name="Generic_Person" - layout="topleft" - left_pad="0" - top_delta="-6" - mouse_opaque="true" - width="20" /> - <text - type="string" - follows="left|right|top" - font="SansSerifSmall" - height="15" - layout="topleft" - left_pad="5" - name="LabelCreatorName" - top_delta="6" - use_ellipses="true" - width="165"> - </text> - <button - follows="top|right" - height="16" + follows="all" + height="570" + layout="topleft" + name="item properties" + help_topic="item_properties" + title="Item Profile" + width="333"> + <panel.string + name="no_experience"> + (none) + </panel.string> + <panel.string + name="unknown"> + (unknown) + </panel.string> + <panel.string + name="unknown_multiple"> + (unknown / multiple) + </panel.string> + <panel.string + name="public"> + (public) + </panel.string> + <panel.string + name="you_can"> + You can: + </panel.string> + <panel.string + name="owner_can"> + Owner can: + </panel.string> + <panel.string + name="acquiredDate"> + [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] + </panel.string> + <panel.string + name="origin_inventory"> + (Inventory) + </panel.string> + <panel.string + name="origin_inworld"> + (Inworld) + </panel.string> + <icon + follows="top|right" + height="18" + image_name="Lock" + layout="topleft" + right="-15" + mouse_opaque="true" + name="IconLocked" + top="8" + width="18" /> + <button + follows="top|left" + height="24" + image_hover_unselected="BackButton_Over" + image_pressed="BackButton_Press" + image_unselected="BackButton_Off" + layout="topleft" + left="12" + name="back_btn" + tab_stop="false" + top="2" + width="30" + use_draw_context_alpha="false" /> + <text + follows="top|left|right" + font="SansSerifHugeBold" + height="26" + layout="topleft" + left_pad="3" + name="title" + text_color="LtGray" + top="2" + use_ellipses="true" + value="Item Profile" + width="275" /> + <text + follows="top|left|right" + height="13" + layout="topleft" + left="45" + name="origin" + text_color="LtGray_50" + use_ellipses="true" + value="(Inventory)" + width="275" /> + <scroll_container + color="DkGray2" + follows="all" + layout="topleft" + left="9" + name="item_profile_scroll" + opaque="true" + height="493" + width="313" + top="45"> + <panel + follows="left|top|right" + height="390" + help_topic="" + label="" + layout="topleft" + left="0" + name="item_profile" + top="0" + width="295"> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left="5" + name="LabelItemNameTitle" + top="10" + width="78"> + Name: + </text> + <line_editor + border_style="line" + border_thickness="1" + follows="left|top|right" + height="20" + layout="topleft" + left_delta="78" + max_length_bytes="63" + name="LabelItemName" + top_delta="0" + width="210" /> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left="5" + name="LabelItemDescTitle" + top_pad="10" + width="78"> + Description: + </text> + <line_editor + border_style="line" + border_thickness="1" + follows="left|top|right" + height="23" + layout="topleft" + left_delta="78" + max_length_bytes="127" + name="LabelItemDesc" + top_delta="-5" + width="210" /> + <text + type="string" + length="1" + follows="left|top" + height="23" + layout="topleft" + left="5" + name="LabelCreatorTitle" + top_pad="10" + width="78"> + Creator: + </text> + <avatar_icon + follows="top|left" + height="20" + default_icon_name="Generic_Person" + layout="topleft" + left_pad="0" + top_delta="-6" + mouse_opaque="true" + width="20" /> + <text + type="string" + follows="left|right|top" + font="SansSerifSmall" + height="15" + layout="topleft" + left_pad="5" + name="LabelCreatorName" + top_delta="6" + use_ellipses="true" + width="165"> + </text> + <button + follows="top|right" + height="16" + image_selected="Inspector_I" + image_unselected="Inspector_I" + layout="topleft" + right="-5" + name="BtnCreator" + top_delta="-6" + width="16" /> + <text + type="string" + length="1" + follows="left|top" + height="23" + layout="topleft" + left="5" + name="LabelOwnerTitle" + top_pad="10" + width="78"> + Owner: + </text> + <avatar_icon + follows="top|left" + height="20" + default_icon_name="Generic_Person" + layout="topleft" + left_pad="0" + top_delta="-6" + mouse_opaque="true" + width="20" /> + <text + type="string" + follows="left|right|top" + font="SansSerifSmall" + height="15" + layout="topleft" + left_pad="5" + name="LabelOwnerName" + top_delta="6" + use_ellipses="true" + width="165"> + </text> + <button + follows="top|right" + height="16" image_selected="Inspector_I" image_unselected="Inspector_I" + layout="topleft" + right="-5" + name="BtnOwner" + top_delta="-3" + width="16" /> + <text + type="string" + length="1" + follows="left|top" + height="23" + layout="topleft" + left="5" + name="LabelAcquiredTitle" + top_pad="10" + width="78"> + Acquired: + </text> + <text + type="string" + length="1" + follows="left|top|right" + height="23" + layout="topleft" + left_delta="78" + name="LabelAcquiredDate" + top_delta="0" + width="210"> + </text> + <panel + border="false" + follows="left|top|right" + layout="topleft" + mouse_opaque="false" + name="perms_inv" + left="0" + top_pad="25" + height="155" + width="313"> + <text + type="string" + length="1" + left="10" + top_pad="13" + text_color="EmphasisColor" + height="15" + follows="left|top|right" + layout="topleft" + name="perm_modify" + width="200"> + You can: + </text> + <check_box + height="18" + label="Modify" + layout="topleft" + left="20" + name="CheckOwnerModify" + top_pad="0" + width="90" /> + <check_box + height="18" + label="Copy" + layout="topleft" + left_pad="0" + name="CheckOwnerCopy" + width="90" /> + <check_box + height="18" + label="Transfer" + layout="topleft" + left_pad="0" + name="CheckOwnerTransfer" + width="106" /> + <text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + left="10" + name="AnyoneLabel" + top_pad="8" + width="100"> + Anyone: + </text> + <check_box + height="18" + label="Copy" layout="topleft" - right="-5" - name="BtnCreator" - top_delta="-6" - width="16" /> - <text + left_pad="0" + name="CheckEveryoneCopy" + top_delta="-2" + width="150" /> + <text type="string" length="1" follows="left|top" - height="23" + height="16" layout="topleft" - left="5" - name="LabelOwnerTitle" - top_pad="10" - width="78"> - Owner: - </text> - <avatar_icon - follows="top|left" - height="20" - default_icon_name="Generic_Person" - layout="topleft" - left_pad="0" - top_delta="-6" - mouse_opaque="true" - width="20" /> - <text + left="10" + name="GroupLabel" + top_pad="8" + width="100"> + Group: + </text> + <check_box + height="18" + label="Share" + layout="topleft" + left_pad="0" + top_delta="-2" + name="CheckShareWithGroup" + tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions." + width="150" /> + <text type="string" - follows="left|right|top" - font="SansSerifSmall" - height="15" - layout="topleft" - left_pad="5" - name="LabelOwnerName" - top_delta="6" - use_ellipses="true" - width="165"> - </text> - <button - follows="top|right" - height="16" - image_selected="Inspector_I" - image_unselected="Inspector_I" - layout="topleft" - right="-5" - name="BtnOwner" - top_delta="-3" - width="16" /> - <text - type="string" - length="1" - follows="left|top" - height="23" - layout="topleft" - left="5" - name="LabelAcquiredTitle" - top_pad="10" - width="78"> - Acquired: - </text> - <text - type="string" - length="1" - follows="left|top|right" - height="23" - layout="topleft" - left_delta="78" - name="LabelAcquiredDate" - top_delta="0" - width="210"> - </text> - <panel - border="false" - follows="left|top|right" - layout="topleft" - mouse_opaque="false" - name="perms_inv" - left="0" - top_pad="25" - height="155" - width="313"> - <text - type="string" - length="1" - left="10" - top_pad="13" - text_color="EmphasisColor" - height="15" - follows="left|top|right" - layout="topleft" - name="perm_modify" - width="200"> - You can: - </text> - <check_box - height="18" - label="Modify" - layout="topleft" - left="20" - name="CheckOwnerModify" - top_pad="0" - width="90" /> - <check_box - height="18" - label="Copy" - layout="topleft" - left_pad="0" - name="CheckOwnerCopy" - width="90" /> - <check_box - height="18" - label="Transfer" - layout="topleft" - left_pad="0" - name="CheckOwnerTransfer" - width="106" /> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left="10" - name="AnyoneLabel" - top_pad="8" - width="100"> - Anyone: - </text> - <check_box - height="18" - label="Copy" - layout="topleft" - left_pad="0" - name="CheckEveryoneCopy" - top_delta="-2" - width="150" /> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left="10" - name="GroupLabel" - top_pad="8" - width="100"> - Group: - </text> - <check_box - height="18" - label="Share" - layout="topleft" - left_pad="0" - top_delta="-2" - name="CheckShareWithGroup" - tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions." - width="150" /> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left="10" - name="NextOwnerLabel" - top_pad="8" - width="200" - word_wrap="true"> - Next owner: - </text> - <check_box - height="18" - label="Modify" - layout="topleft" - left="20" - top_pad="0" - name="CheckNextOwnerModify" - width="90" /> - <check_box - height="18" - label="Copy" - layout="topleft" - left_pad="0" - name="CheckNextOwnerCopy" - width="90" /> - <check_box - height="18" - label="Transfer" - layout="topleft" - left_pad="0" - name="CheckNextOwnerTransfer" - tool_tip="Next owner can give away or resell this object" - width="106" /> - </panel> + length="1" + follows="left|top" + height="16" + layout="topleft" + left="10" + name="NextOwnerLabel" + top_pad="8" + width="200" + word_wrap="true"> + Next owner: + </text> <check_box - height="18" - label="For Sale" - layout="topleft" - left="20" - name="CheckPurchase" - top_pad="20" - width="100" /> - <combo_box - height="23" - left_pad="0" - layout="topleft" - follows="left|top" - name="combobox sale copy" - width="170"> - <combo_box.item - label="Copy" - name="Copy" - value="Copy" /> - <combo_box.item - label="Original" - name="Original" - value="Original" /> - </combo_box> - <spinner - follows="left|top" - decimal_digits="0" - increment="1" - control_name="Edit Cost" - name="Edit Cost" - label="Price: L$" - label_width="75" - left="120" - width="170" - min_val="0" - height="23" - max_val="999999999" - top_pad="10"/> - </panel> - </scroll_container> - <panel - height="30" - layout="topleft" - name="button_panel" - left="5" - top_pad="0" - width="313"> - <button - height="23" - label="Cancel" - layout="topleft" - name="cancel_btn" - right="-1" - width="100" /> - </panel> - </panel> + height="18" + label="Modify" + layout="topleft" + left="20" + top_pad="0" + name="CheckNextOwnerModify" + width="90" /> + <check_box + height="18" + label="Copy" + layout="topleft" + left_pad="0" + name="CheckNextOwnerCopy" + width="90" /> + <check_box + height="18" + label="Transfer" + layout="topleft" + left_pad="0" + name="CheckNextOwnerTransfer" + tool_tip="Next owner can give away or resell this object" + width="106" /> + </panel> + <check_box + height="18" + label="For Sale" + layout="topleft" + left="20" + name="CheckPurchase" + top_pad="20" + width="100" /> + <combo_box + height="23" + left_pad="0" + layout="topleft" + follows="left|top" + name="combobox sale copy" + width="170"> + <combo_box.item + label="Copy" + name="Copy" + value="Copy" /> + <combo_box.item + label="Original" + name="Original" + value="Original" /> + </combo_box> + <spinner + follows="left|top" + decimal_digits="0" + increment="1" + control_name="Edit Cost" + name="Edit Cost" + label="Price: L$" + label_width="75" + left="120" + width="170" + min_val="0" + height="23" + max_val="999999999" + top_pad="10"/> + + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left="5" + name="LabelItemExperienceTitle" + top_pad="10" + width="78"> + Experience: + </text> + <text + type="string" + length="1" + follows="left|top|right" + height="10" + layout="topleft" + left_delta="78" + name="LabelItemExperience" + top_delta="0" + width="210" + >(loading)</text> + </panel> + + </scroll_container> + <panel + height="30" + layout="topleft" + name="button_panel" + left="5" + top_pad="0" + width="313" + follows="top|right|left"> + <button + follows="top|right" + height="23" + label="Cancel" + layout="topleft" + name="cancel_btn" + right="-1" + width="100" /> + </panel> +</panel> diff --git a/indra/tools/vstool/DispatchUtility.cs b/indra/tools/vstool/DispatchUtility.cs new file mode 100644 index 0000000000..6056ac55a1 --- /dev/null +++ b/indra/tools/vstool/DispatchUtility.cs @@ -0,0 +1,271 @@ +#region Using Directives
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Runtime.InteropServices;
+using System.Reflection;
+using System.Security.Permissions;
+
+#endregion
+
+namespace TestDispatchUtility
+{
+ /// <summary>
+ /// Provides helper methods for working with COM IDispatch objects that have a registered type library.
+ /// </summary>
+ public static class DispatchUtility
+ {
+ #region Private Constants
+
+ private const int S_OK = 0; //From WinError.h
+ private const int LOCALE_SYSTEM_DEFAULT = 2 << 10; //From WinNT.h == 2048 == 0x800
+
+ #endregion
+
+ #region Public Methods
+
+ /// <summary>
+ /// Gets whether the specified object implements IDispatch.
+ /// </summary>
+ /// <param name="obj">An object to check.</param>
+ /// <returns>True if the object implements IDispatch. False otherwise.</returns>
+ public static bool ImplementsIDispatch(object obj)
+ {
+ bool result = obj is IDispatchInfo;
+ return result;
+ }
+
+ /// <summary>
+ /// Gets a Type that can be used with reflection.
+ /// </summary>
+ /// <param name="obj">An object that implements IDispatch.</param>
+ /// <param name="throwIfNotFound">Whether an exception should be thrown if a Type can't be obtained.</param>
+ /// <returns>A .NET Type that can be used with reflection.</returns>
+ /// <exception cref="InvalidCastException">If <paramref name="obj"/> doesn't implement IDispatch.</exception>
+ [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
+ public static Type GetType(object obj, bool throwIfNotFound)
+ {
+ RequireReference(obj, "obj");
+ Type result = GetType((IDispatchInfo)obj, throwIfNotFound);
+ return result;
+ }
+
+ /// <summary>
+ /// Tries to get the DISPID for the requested member name.
+ /// </summary>
+ /// <param name="obj">An object that implements IDispatch.</param>
+ /// <param name="name">The name of a member to lookup.</param>
+ /// <param name="dispId">If the method returns true, this holds the DISPID on output.
+ /// If the method returns false, this value should be ignored.</param>
+ /// <returns>True if the member was found and resolved to a DISPID. False otherwise.</returns>
+ /// <exception cref="InvalidCastException">If <paramref name="obj"/> doesn't implement IDispatch.</exception>
+ [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
+ public static bool TryGetDispId(object obj, string name, out int dispId)
+ {
+ RequireReference(obj, "obj");
+ bool result = TryGetDispId((IDispatchInfo)obj, name, out dispId);
+ return result;
+ }
+
+ /// <summary>
+ /// Invokes a member by DISPID.
+ /// </summary>
+ /// <param name="obj">An object that implements IDispatch.</param>
+ /// <param name="dispId">The DISPID of a member. This can be obtained using
+ /// <see cref="TryGetDispId(object, string, out int)"/>.</param>
+ /// <param name="args">The arguments to pass to the member.</param>
+ /// <returns>The member's return value.</returns>
+ /// <remarks>
+ /// This can invoke a method or a property get accessor.
+ /// </remarks>
+ public static object Invoke(object obj, int dispId, object[] args)
+ {
+ string memberName = "[DispId=" + dispId + "]";
+ object result = Invoke(obj, memberName, args);
+ return result;
+ }
+
+ /// <summary>
+ /// Invokes a member by name.
+ /// </summary>
+ /// <param name="obj">An object.</param>
+ /// <param name="memberName">The name of the member to invoke.</param>
+ /// <param name="args">The arguments to pass to the member.</param>
+ /// <returns>The member's return value.</returns>
+ /// <remarks>
+ /// This can invoke a method or a property get accessor.
+ /// </remarks>
+ public static object Invoke(object obj, string memberName, object[] args)
+ {
+ RequireReference(obj, "obj");
+ Type type = obj.GetType();
+ object result = type.InvokeMember(memberName, BindingFlags.InvokeMethod | BindingFlags.GetProperty,
+ null, obj, args, null);
+ return result;
+ }
+
+ #endregion
+
+ #region Private Methods
+
+ /// <summary>
+ /// Requires that the value is non-null.
+ /// </summary>
+ /// <typeparam name="T">The type of the value.</typeparam>
+ /// <param name="value">The value to check.</param>
+ /// <param name="name">The name of the value.</param>
+ private static void RequireReference<T>(T value, string name) where T : class
+ {
+ if (value == null)
+ {
+ throw new ArgumentNullException(name);
+ }
+ }
+
+ /// <summary>
+ /// Gets a Type that can be used with reflection.
+ /// </summary>
+ /// <param name="dispatch">An object that implements IDispatch.</param>
+ /// <param name="throwIfNotFound">Whether an exception should be thrown if a Type can't be obtained.</param>
+ /// <returns>A .NET Type that can be used with reflection.</returns>
+ private static Type GetType(IDispatchInfo dispatch, bool throwIfNotFound)
+ {
+ RequireReference(dispatch, "dispatch");
+
+ Type result = null;
+ int typeInfoCount;
+ int hr = dispatch.GetTypeInfoCount(out typeInfoCount);
+ if (hr == S_OK && typeInfoCount > 0)
+ {
+ // Type info isn't usually culture-aware for IDispatch, so we might as well pass
+ // the default locale instead of looking up the current thread's LCID each time
+ // (via CultureInfo.CurrentCulture.LCID).
+ dispatch.GetTypeInfo(0, LOCALE_SYSTEM_DEFAULT, out result);
+ }
+
+ if (result == null && throwIfNotFound)
+ {
+ // If the GetTypeInfoCount called failed, throw an exception for that.
+ Marshal.ThrowExceptionForHR(hr);
+
+ // Otherwise, throw the same exception that Type.GetType would throw.
+ throw new TypeLoadException();
+ }
+
+ return result;
+ }
+
+ /// <summary>
+ /// Tries to get the DISPID for the requested member name.
+ /// </summary>
+ /// <param name="dispatch">An object that implements IDispatch.</param>
+ /// <param name="name">The name of a member to lookup.</param>
+ /// <param name="dispId">If the method returns true, this holds the DISPID on output.
+ /// If the method returns false, this value should be ignored.</param>
+ /// <returns>True if the member was found and resolved to a DISPID. False otherwise.</returns>
+ private static bool TryGetDispId(IDispatchInfo dispatch, string name, out int dispId)
+ {
+ RequireReference(dispatch, "dispatch");
+ RequireReference(name, "name");
+
+ bool result = false;
+
+ // Members names aren't usually culture-aware for IDispatch, so we might as well
+ // pass the default locale instead of looking up the current thread's LCID each time
+ // (via CultureInfo.CurrentCulture.LCID).
+ Guid iidNull = Guid.Empty;
+ int hr = dispatch.GetDispId(ref iidNull, ref name, 1, LOCALE_SYSTEM_DEFAULT, out dispId);
+
+ const int DISP_E_UNKNOWNNAME = unchecked((int)0x80020006); //From WinError.h
+ const int DISPID_UNKNOWN = -1; //From OAIdl.idl
+ if (hr == S_OK)
+ {
+ result = true;
+ }
+ else if (hr == DISP_E_UNKNOWNNAME && dispId == DISPID_UNKNOWN)
+ {
+ // This is the only supported "error" case because it means IDispatch
+ // is saying it doesn't know the member we asked about.
+ result = false;
+ }
+ else
+ {
+ // The other documented result codes are all errors.
+ Marshal.ThrowExceptionForHR(hr);
+ }
+
+ return result;
+ }
+
+ #endregion
+
+ #region Private Interfaces
+
+ /// <summary>
+ /// A partial declaration of IDispatch used to lookup Type information and DISPIDs.
+ /// </summary>
+ /// <remarks>
+ /// This interface only declares the first three methods of IDispatch. It omits the
+ /// fourth method (Invoke) because there are already plenty of ways to do dynamic
+ /// invocation in .NET. But the first three methods provide dynamic type metadata
+ /// discovery, which .NET doesn't provide normally if you have a System.__ComObject
+ /// RCW instead of a strongly-typed RCW.
+ /// <para/>
+ /// Note: The original declaration of IDispatch is in OAIdl.idl.
+ /// </remarks>
+ [ComImport]
+ [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
+ [Guid("00020400-0000-0000-C000-000000000046")]
+ private interface IDispatchInfo
+ {
+ /// <summary>
+ /// Gets the number of Types that the object provides (0 or 1).
+ /// </summary>
+ /// <param name="typeInfoCount">Returns 0 or 1 for the number of Types provided by <see cref="GetTypeInfo"/>.</param>
+ /// <remarks>
+ /// http://msdn.microsoft.com/en-us/library/da876d53-cb8a-465c-a43e-c0eb272e2a12(VS.85)
+ /// </remarks>
+ [PreserveSig]
+ int GetTypeInfoCount(out int typeInfoCount);
+
+ /// <summary>
+ /// Gets the Type information for an object if <see cref="GetTypeInfoCount"/> returned 1.
+ /// </summary>
+ /// <param name="typeInfoIndex">Must be 0.</param>
+ /// <param name="lcid">Typically, LOCALE_SYSTEM_DEFAULT (2048).</param>
+ /// <param name="typeInfo">Returns the object's Type information.</param>
+ /// <remarks>
+ /// http://msdn.microsoft.com/en-us/library/cc1ec9aa-6c40-4e70-819c-a7c6dd6b8c99(VS.85)
+ /// </remarks>
+ void GetTypeInfo(int typeInfoIndex, int lcid, [MarshalAs(UnmanagedType.CustomMarshaler,
+ MarshalTypeRef = typeof(System.Runtime.InteropServices.CustomMarshalers.TypeToTypeInfoMarshaler))] out Type typeInfo);
+
+ /// <summary>
+ /// Gets the DISPID of the specified member name.
+ /// </summary>
+ /// <param name="riid">Must be IID_NULL. Pass a copy of Guid.Empty.</param>
+ /// <param name="name">The name of the member to look up.</param>
+ /// <param name="nameCount">Must be 1.</param>
+ /// <param name="lcid">Typically, LOCALE_SYSTEM_DEFAULT (2048).</param>
+ /// <param name="dispId">If a member with the requested <paramref name="name"/>
+ /// is found, this returns its DISPID and the method's return value is 0.
+ /// If the method returns a non-zero value, then this parameter's output value is
+ /// undefined.</param>
+ /// <returns>Zero for success. Non-zero for failure.</returns>
+ /// <remarks>
+ /// http://msdn.microsoft.com/en-us/library/6f6cf233-3481-436e-8d6a-51f93bf91619(VS.85)
+ /// </remarks>
+ [PreserveSig]
+ int GetDispId(ref Guid riid, ref string name, int nameCount, int lcid, out int dispId);
+
+ // NOTE: The real IDispatch also has an Invoke method next, but we don't need it.
+ // We can invoke methods using .NET's Type.InvokeMember method with the special
+ // [DISPID=n] syntax for member "names", or we can get a .NET Type using GetTypeInfo
+ // and invoke methods on that through reflection.
+ // Type.InvokeMember: http://msdn.microsoft.com/en-us/library/de3dhzwy.aspx
+ }
+
+ #endregion
+ }
+}
diff --git a/indra/tools/vstool/app.config b/indra/tools/vstool/app.config new file mode 100644 index 0000000000..8494f728ff --- /dev/null +++ b/indra/tools/vstool/app.config @@ -0,0 +1,3 @@ +<?xml version="1.0"?>
+<configuration>
+<startup><supportedRuntime version="v2.0.50727"/></startup></configuration>
|