diff options
Diffstat (limited to 'indra/newview/llpanelplaces.cpp')
-rw-r--r-- | indra/newview/llpanelplaces.cpp | 1910 |
1 files changed, 955 insertions, 955 deletions
diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index 1d5ed93c4d..67aa51e38a 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -5,21 +5,21 @@ * $LicenseInfo:firstyear=2009&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, 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$ */ @@ -77,54 +77,54 @@ // Constants static const F32 PLACE_INFO_UPDATE_INTERVAL = 3.0; -static const std::string AGENT_INFO_TYPE = "agent"; -static const std::string CREATE_LANDMARK_INFO_TYPE = "create_landmark"; -static const std::string CREATE_PICK_TYPE = "create_pick"; -static const std::string LANDMARK_INFO_TYPE = "landmark"; -static const std::string REMOTE_PLACE_INFO_TYPE = "remote_place"; -static const std::string TELEPORT_HISTORY_INFO_TYPE = "teleport_history"; +static const std::string AGENT_INFO_TYPE = "agent"; +static const std::string CREATE_LANDMARK_INFO_TYPE = "create_landmark"; +static const std::string CREATE_PICK_TYPE = "create_pick"; +static const std::string LANDMARK_INFO_TYPE = "landmark"; +static const std::string REMOTE_PLACE_INFO_TYPE = "remote_place"; +static const std::string TELEPORT_HISTORY_INFO_TYPE = "teleport_history"; static const std::string LANDMARK_TAB_INFO_TYPE = "open_landmark_tab"; // Support for secondlife:///app/parcel/{UUID}/about SLapps class LLParcelHandler : public LLCommandHandler { public: - // requires trusted browser to trigger - LLParcelHandler() : LLCommandHandler("parcel", UNTRUSTED_THROTTLE) { } - bool handle(const LLSD& params, + // requires trusted browser to trigger + LLParcelHandler() : LLCommandHandler("parcel", UNTRUSTED_THROTTLE) { } + bool handle(const LLSD& params, const LLSD& query_map, const std::string& grid, LLMediaCtrl* web) - { - if (params.size() < 2) - { - return false; - } - - if (!LLUI::getInstance()->mSettingGroups["config"]->getBOOL("EnablePlaceProfile")) - { - LLNotificationsUtil::add("NoPlaceInfo", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit")); - return true; - } - - LLUUID parcel_id; - if (!parcel_id.set(params[0], FALSE)) - { - return false; - } - if (params[1].asString() == "about") - { - if (parcel_id.notNull()) - { - LLSD key; - key["type"] = "remote_place"; - key["id"] = parcel_id; - LLFloaterSidePanelContainer::showPanel("places", key); - return true; - } - } - return false; - } + { + if (params.size() < 2) + { + return false; + } + + if (!LLUI::getInstance()->mSettingGroups["config"]->getBOOL("EnablePlaceProfile")) + { + LLNotificationsUtil::add("NoPlaceInfo", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit")); + return true; + } + + LLUUID parcel_id; + if (!parcel_id.set(params[0], FALSE)) + { + return false; + } + if (params[1].asString() == "about") + { + if (parcel_id.notNull()) + { + LLSD key; + key["type"] = "remote_place"; + key["id"] = parcel_id; + LLFloaterSidePanelContainer::showPanel("places", key); + return true; + } + } + return false; + } }; LLParcelHandler gParcelHandler; @@ -136,164 +136,164 @@ static void onSLURLBuilt(std::string& slurl); class LLPlacesParcelObserver : public LLParcelObserver { public: - LLPlacesParcelObserver(LLPanelPlaces* places_panel) : - LLParcelObserver(), - mPlaces(places_panel) - {} + LLPlacesParcelObserver(LLPanelPlaces* places_panel) : + LLParcelObserver(), + mPlaces(places_panel) + {} - /*virtual*/ void changed() - { - if (mPlaces) - mPlaces->changedParcelSelection(); - } + /*virtual*/ void changed() + { + if (mPlaces) + mPlaces->changedParcelSelection(); + } private: - LLPanelPlaces* mPlaces; + LLPanelPlaces* mPlaces; }; class LLPlacesInventoryObserver : public LLInventoryAddedObserver { public: - LLPlacesInventoryObserver(LLPanelPlaces* places_panel) : - mPlaces(places_panel) - {} + LLPlacesInventoryObserver(LLPanelPlaces* places_panel) : + mPlaces(places_panel) + {} - /*virtual*/ void changed(U32 mask) - { - LLInventoryAddedObserver::changed(mask); + /*virtual*/ void changed(U32 mask) + { + LLInventoryAddedObserver::changed(mask); - if (mPlaces && !mPlaces->tabsCreated()) - { - mPlaces->createTabs(); - } - } + if (mPlaces && !mPlaces->tabsCreated()) + { + mPlaces->createTabs(); + } + } protected: - /*virtual*/ void done() - { - mPlaces->showAddedLandmarkInfo(gInventory.getAddedIDs()); - } + /*virtual*/ void done() + { + mPlaces->showAddedLandmarkInfo(gInventory.getAddedIDs()); + } private: - LLPanelPlaces* mPlaces; + LLPanelPlaces* mPlaces; }; class LLPlacesRemoteParcelInfoObserver : public LLRemoteParcelInfoObserver { public: - LLPlacesRemoteParcelInfoObserver(LLPanelPlaces* places_panel) : - LLRemoteParcelInfoObserver(), - mPlaces(places_panel) - {} - - ~LLPlacesRemoteParcelInfoObserver() - { - // remove any in-flight observers - std::set<LLUUID>::iterator it; - for (it = mParcelIDs.begin(); it != mParcelIDs.end(); ++it) - { - const LLUUID &id = *it; - LLRemoteParcelInfoProcessor::getInstance()->removeObserver(id, this); - } - mParcelIDs.clear(); - } - - /*virtual*/ void processParcelInfo(const LLParcelData& parcel_data) - { - if (mPlaces) - { - mPlaces->changedGlobalPos(LLVector3d(parcel_data.global_x, - parcel_data.global_y, - parcel_data.global_z)); - } - - mParcelIDs.erase(parcel_data.parcel_id); - LLRemoteParcelInfoProcessor::getInstance()->removeObserver(parcel_data.parcel_id, this); - } - /*virtual*/ void setParcelID(const LLUUID& parcel_id) - { - if (!parcel_id.isNull()) - { - mParcelIDs.insert(parcel_id); - LLRemoteParcelInfoProcessor::getInstance()->addObserver(parcel_id, this); - LLRemoteParcelInfoProcessor::getInstance()->sendParcelInfoRequest(parcel_id); - } - } - /*virtual*/ void setErrorStatus(S32 status, const std::string& reason) - { - LL_ERRS() << "Can't complete remote parcel request. Http Status: " - << status << ". Reason : " << reason << LL_ENDL; - } + LLPlacesRemoteParcelInfoObserver(LLPanelPlaces* places_panel) : + LLRemoteParcelInfoObserver(), + mPlaces(places_panel) + {} + + ~LLPlacesRemoteParcelInfoObserver() + { + // remove any in-flight observers + std::set<LLUUID>::iterator it; + for (it = mParcelIDs.begin(); it != mParcelIDs.end(); ++it) + { + const LLUUID &id = *it; + LLRemoteParcelInfoProcessor::getInstance()->removeObserver(id, this); + } + mParcelIDs.clear(); + } + + /*virtual*/ void processParcelInfo(const LLParcelData& parcel_data) + { + if (mPlaces) + { + mPlaces->changedGlobalPos(LLVector3d(parcel_data.global_x, + parcel_data.global_y, + parcel_data.global_z)); + } + + mParcelIDs.erase(parcel_data.parcel_id); + LLRemoteParcelInfoProcessor::getInstance()->removeObserver(parcel_data.parcel_id, this); + } + /*virtual*/ void setParcelID(const LLUUID& parcel_id) + { + if (!parcel_id.isNull()) + { + mParcelIDs.insert(parcel_id); + LLRemoteParcelInfoProcessor::getInstance()->addObserver(parcel_id, this); + LLRemoteParcelInfoProcessor::getInstance()->sendParcelInfoRequest(parcel_id); + } + } + /*virtual*/ void setErrorStatus(S32 status, const std::string& reason) + { + LL_ERRS() << "Can't complete remote parcel request. Http Status: " + << status << ". Reason : " << reason << LL_ENDL; + } private: - std::set<LLUUID> mParcelIDs; - LLPanelPlaces* mPlaces; + std::set<LLUUID> mParcelIDs; + LLPanelPlaces* mPlaces; }; static LLPanelInjector<LLPanelPlaces> t_places("panel_places"); LLPanelPlaces::LLPanelPlaces() - : LLPanel(), - mActivePanel(NULL), - mFilterEditor(NULL), - mPlaceProfile(NULL), - mLandmarkInfo(NULL), - mItem(NULL), - mPlaceMenu(NULL), - mLandmarkMenu(NULL), - mPosGlobal(), - isLandmarkEditModeOn(false), - mTabsCreated(false) + : LLPanel(), + mActivePanel(NULL), + mFilterEditor(NULL), + mPlaceProfile(NULL), + mLandmarkInfo(NULL), + mItem(NULL), + mPlaceMenu(NULL), + mLandmarkMenu(NULL), + mPosGlobal(), + isLandmarkEditModeOn(false), + mTabsCreated(false) { - mParcelObserver = new LLPlacesParcelObserver(this); - mInventoryObserver = new LLPlacesInventoryObserver(this); - mRemoteParcelObserver = new LLPlacesRemoteParcelInfoObserver(this); + mParcelObserver = new LLPlacesParcelObserver(this); + mInventoryObserver = new LLPlacesInventoryObserver(this); + mRemoteParcelObserver = new LLPlacesRemoteParcelInfoObserver(this); - gInventory.addObserver(mInventoryObserver); + gInventory.addObserver(mInventoryObserver); - mAgentParcelChangedConnection = gAgent.addParcelChangedCallback( - boost::bind(&LLPanelPlaces::updateVerbs, this)); + mAgentParcelChangedConnection = gAgent.addParcelChangedCallback( + boost::bind(&LLPanelPlaces::updateVerbs, this)); - //buildFromFile( "panel_places.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder() + //buildFromFile( "panel_places.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder() } LLPanelPlaces::~LLPanelPlaces() { - if (gInventory.containsObserver(mInventoryObserver)) - gInventory.removeObserver(mInventoryObserver); + if (gInventory.containsObserver(mInventoryObserver)) + gInventory.removeObserver(mInventoryObserver); - LLViewerParcelMgr::getInstance()->removeObserver(mParcelObserver); + LLViewerParcelMgr::getInstance()->removeObserver(mParcelObserver); - delete mInventoryObserver; - delete mParcelObserver; - delete mRemoteParcelObserver; + delete mInventoryObserver; + delete mParcelObserver; + delete mRemoteParcelObserver; - if (mAgentParcelChangedConnection.connected()) - { - mAgentParcelChangedConnection.disconnect(); - } + if (mAgentParcelChangedConnection.connected()) + { + mAgentParcelChangedConnection.disconnect(); + } } BOOL LLPanelPlaces::postBuild() { - mTeleportBtn = getChild<LLButton>("teleport_btn"); - mTeleportBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onTeleportButtonClicked, this)); - - mShowOnMapBtn = getChild<LLButton>("map_btn"); - mShowOnMapBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onShowOnMapButtonClicked, this)); + mTeleportBtn = getChild<LLButton>("teleport_btn"); + mTeleportBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onTeleportButtonClicked, this)); - mSaveBtn = getChild<LLButton>("save_btn"); - mSaveBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onSaveButtonClicked, this)); + mShowOnMapBtn = getChild<LLButton>("map_btn"); + mShowOnMapBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onShowOnMapButtonClicked, this)); - mCancelBtn = getChild<LLButton>("cancel_btn"); - mCancelBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onCancelButtonClicked, this)); + mSaveBtn = getChild<LLButton>("save_btn"); + mSaveBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onSaveButtonClicked, this)); - mCloseBtn = getChild<LLButton>("close_btn"); - mCloseBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onBackButtonClicked, this)); + mCancelBtn = getChild<LLButton>("cancel_btn"); + mCancelBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onCancelButtonClicked, this)); - mOverflowBtn = getChild<LLMenuButton>("overflow_btn"); - mOverflowBtn->setMouseDownCallback(boost::bind(&LLPanelPlaces::onOverflowButtonClicked, this)); + mCloseBtn = getChild<LLButton>("close_btn"); + mCloseBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onBackButtonClicked, this)); + + mOverflowBtn = getChild<LLMenuButton>("overflow_btn"); + mOverflowBtn->setMouseDownCallback(boost::bind(&LLPanelPlaces::onOverflowButtonClicked, this)); mGearMenuButton = getChild<LLMenuButton>("options_gear_btn"); mGearMenuButton->setMouseDownCallback(boost::bind(&LLPanelPlaces::onGearMenuClick, this)); @@ -315,102 +315,102 @@ BOOL LLPanelPlaces::postBuild() , _7 // EAcceptance* accept )); - LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; - registrar.add("Places.OverflowMenu.Action", boost::bind(&LLPanelPlaces::onOverflowMenuItemClicked, this, _2)); - LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar; - enable_registrar.add("Places.OverflowMenu.Enable", boost::bind(&LLPanelPlaces::onOverflowMenuItemEnable, this, _2)); - - mPlaceMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_place.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); - if (mPlaceMenu) - { - mPlaceMenu->setAlwaysShowMenu(TRUE); - } - else - { - LL_WARNS() << "Error loading Place menu" << LL_ENDL; - } - - mLandmarkMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_landmark.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); - if (!mLandmarkMenu) - { - LL_WARNS() << "Error loading Landmark menu" << LL_ENDL; - } - - mTabContainer = getChild<LLTabContainer>("Places Tabs"); - if (mTabContainer) - { - mTabContainer->setCommitCallback(boost::bind(&LLPanelPlaces::onTabSelected, this)); - } + LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; + registrar.add("Places.OverflowMenu.Action", boost::bind(&LLPanelPlaces::onOverflowMenuItemClicked, this, _2)); + LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar; + enable_registrar.add("Places.OverflowMenu.Enable", boost::bind(&LLPanelPlaces::onOverflowMenuItemEnable, this, _2)); + + mPlaceMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_place.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); + if (mPlaceMenu) + { + mPlaceMenu->setAlwaysShowMenu(TRUE); + } + else + { + LL_WARNS() << "Error loading Place menu" << LL_ENDL; + } + + mLandmarkMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_landmark.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); + if (!mLandmarkMenu) + { + LL_WARNS() << "Error loading Landmark menu" << LL_ENDL; + } + + mTabContainer = getChild<LLTabContainer>("Places Tabs"); + if (mTabContainer) + { + mTabContainer->setCommitCallback(boost::bind(&LLPanelPlaces::onTabSelected, this)); + } mButtonsContainer = getChild<LLPanel>("button_layout_panel"); mButtonsContainer->setVisible(FALSE); mFilterContainer = getChild<LLLayoutStack>("top_menu_panel"); - mFilterEditor = getChild<LLFilterEditor>("Filter"); - if (mFilterEditor) - { - //when list item is being clicked the filter editor looses focus - //committing on focus lost leads to detaching list items - //BUT a detached list item cannot be made selected and must not be clicked onto - mFilterEditor->setCommitOnFocusLost(false); + mFilterEditor = getChild<LLFilterEditor>("Filter"); + if (mFilterEditor) + { + //when list item is being clicked the filter editor looses focus + //committing on focus lost leads to detaching list items + //BUT a detached list item cannot be made selected and must not be clicked onto + mFilterEditor->setCommitOnFocusLost(false); - mFilterEditor->setCommitCallback(boost::bind(&LLPanelPlaces::onFilterEdit, this, _2, false)); - } + mFilterEditor->setCommitCallback(boost::bind(&LLPanelPlaces::onFilterEdit, this, _2, false)); + } - mPlaceProfile = findChild<LLPanelPlaceProfile>("panel_place_profile"); - mLandmarkInfo = findChild<LLPanelLandmarkInfo>("panel_landmark_info"); - if (!mPlaceProfile || !mLandmarkInfo) - return FALSE; + mPlaceProfile = findChild<LLPanelPlaceProfile>("panel_place_profile"); + mLandmarkInfo = findChild<LLPanelLandmarkInfo>("panel_landmark_info"); + if (!mPlaceProfile || !mLandmarkInfo) + return FALSE; - mPlaceProfileBackBtn = mPlaceProfile->getChild<LLButton>("back_btn"); - mPlaceProfileBackBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onBackButtonClicked, this)); + mPlaceProfileBackBtn = mPlaceProfile->getChild<LLButton>("back_btn"); + mPlaceProfileBackBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onBackButtonClicked, this)); - mLandmarkInfo->getChild<LLButton>("back_btn")->setClickedCallback(boost::bind(&LLPanelPlaces::onBackButtonClicked, this)); + mLandmarkInfo->getChild<LLButton>("back_btn")->setClickedCallback(boost::bind(&LLPanelPlaces::onBackButtonClicked, this)); - LLLineEditor* title_editor = mLandmarkInfo->getChild<LLLineEditor>("title_editor"); - title_editor->setKeystrokeCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this), NULL); + LLLineEditor* title_editor = mLandmarkInfo->getChild<LLLineEditor>("title_editor"); + title_editor->setKeystrokeCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this), NULL); - LLTextEditor* notes_editor = mLandmarkInfo->getChild<LLTextEditor>("notes_editor"); - notes_editor->setKeystrokeCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this)); + LLTextEditor* notes_editor = mLandmarkInfo->getChild<LLTextEditor>("notes_editor"); + notes_editor->setKeystrokeCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this)); - LLComboBox* folder_combo = mLandmarkInfo->getChild<LLComboBox>("folder_combo"); - folder_combo->setCommitCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this)); + LLComboBox* folder_combo = mLandmarkInfo->getChild<LLComboBox>("folder_combo"); + folder_combo->setCommitCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this)); - LLButton* edit_btn = mLandmarkInfo->getChild<LLButton>("edit_btn"); - edit_btn->setCommitCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this)); + LLButton* edit_btn = mLandmarkInfo->getChild<LLButton>("edit_btn"); + edit_btn->setCommitCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this)); - createTabs(); - updateVerbs(); + createTabs(); + updateVerbs(); - return TRUE; + return TRUE; } void LLPanelPlaces::onOpen(const LLSD& key) { - if (!mPlaceProfile || !mLandmarkInfo) - return; - - if (key.size() != 0) - { - isLandmarkEditModeOn = false; - std::string key_type = key["type"].asString(); - if (key_type == LANDMARK_TAB_INFO_TYPE) - { - // Small hack: We need to toggle twice. The first toggle moves from the Landmark - // or Teleport History info panel to the Landmark or Teleport History list panel. - // For this first toggle, the mPlaceInfoType should be the one previously used so - // that the state can be corretly set. - // The second toggle forces the list to be set to Landmark. - // This avoids extracting and duplicating all the state logic from togglePlaceInfoPanel() - // here or some specific private method - togglePlaceInfoPanel(FALSE); - mPlaceInfoType = key_type; - togglePlaceInfoPanel(FALSE); - // Update the active tab - onTabSelected(); - // Update the buttons at the bottom of the panel - updateVerbs(); - } + if (!mPlaceProfile || !mLandmarkInfo) + return; + + if (key.size() != 0) + { + isLandmarkEditModeOn = false; + std::string key_type = key["type"].asString(); + if (key_type == LANDMARK_TAB_INFO_TYPE) + { + // Small hack: We need to toggle twice. The first toggle moves from the Landmark + // or Teleport History info panel to the Landmark or Teleport History list panel. + // For this first toggle, the mPlaceInfoType should be the one previously used so + // that the state can be corretly set. + // The second toggle forces the list to be set to Landmark. + // This avoids extracting and duplicating all the state logic from togglePlaceInfoPanel() + // here or some specific private method + togglePlaceInfoPanel(FALSE); + mPlaceInfoType = key_type; + togglePlaceInfoPanel(FALSE); + // Update the active tab + onTabSelected(); + // Update the buttons at the bottom of the panel + updateVerbs(); + } else if (key_type == CREATE_PICK_TYPE) { LLUUID item_id = key["item_id"]; @@ -426,236 +426,236 @@ void LLPanelPlaces::onOpen(const LLSD& key) } } } - else // "create_landmark" - { - mFilterEditor->clear(); - onFilterEdit("", false); - - mPlaceInfoType = key_type; - mPosGlobal.setZero(); - mItem = NULL; - mRegionId.setNull(); - togglePlaceInfoPanel(TRUE); - - if (mPlaceInfoType == AGENT_INFO_TYPE) - { - mPlaceProfile->setInfoType(LLPanelPlaceInfo::AGENT); - if (gAgent.getRegion()) - { - mRegionId = gAgent.getRegion()->getRegionID(); - } - } - else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE) - { - LLUUID dest_folder = key["dest_folder"]; - mLandmarkInfo->setInfoAndCreateLandmark(dest_folder); - - if (key.has("x") && key.has("y") && key.has("z")) - { - mPosGlobal = LLVector3d(key["x"].asReal(), - key["y"].asReal(), - key["z"].asReal()); - } - else - { - mPosGlobal = gAgent.getPositionGlobal(); - } - - mLandmarkInfo->displayParcelInfo(LLUUID(), mPosGlobal); - - mSaveBtn->setEnabled(FALSE); - } - else if (mPlaceInfoType == LANDMARK_INFO_TYPE) - { - mLandmarkInfo->setInfoType(LLPanelPlaceInfo::LANDMARK); - - LLUUID id = key["id"].asUUID(); - LLInventoryItem* item = gInventory.getItem(id); - if (!item) - return; + else // "create_landmark" + { + mFilterEditor->clear(); + onFilterEdit("", false); + + mPlaceInfoType = key_type; + mPosGlobal.setZero(); + mItem = NULL; + mRegionId.setNull(); + togglePlaceInfoPanel(TRUE); + + if (mPlaceInfoType == AGENT_INFO_TYPE) + { + mPlaceProfile->setInfoType(LLPanelPlaceInfo::AGENT); + if (gAgent.getRegion()) + { + mRegionId = gAgent.getRegion()->getRegionID(); + } + } + else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE) + { + LLUUID dest_folder = key["dest_folder"]; + mLandmarkInfo->setInfoAndCreateLandmark(dest_folder); + + if (key.has("x") && key.has("y") && key.has("z")) + { + mPosGlobal = LLVector3d(key["x"].asReal(), + key["y"].asReal(), + key["z"].asReal()); + } + else + { + mPosGlobal = gAgent.getPositionGlobal(); + } + + mLandmarkInfo->displayParcelInfo(LLUUID(), mPosGlobal); + + mSaveBtn->setEnabled(FALSE); + } + else if (mPlaceInfoType == LANDMARK_INFO_TYPE) + { + mLandmarkInfo->setInfoType(LLPanelPlaceInfo::LANDMARK); + + LLUUID id = key["id"].asUUID(); + LLInventoryItem* item = gInventory.getItem(id); + if (!item) + return; BOOL is_editable = gInventory.isObjectDescendentOf(id, gInventory.getRootFolderID()) && item->getPermissions().allowModifyBy(gAgent.getID()); mLandmarkInfo->setCanEdit(is_editable); - setItem(item); - } - else if (mPlaceInfoType == REMOTE_PLACE_INFO_TYPE) - { - if (key.has("id")) - { - LLUUID parcel_id = key["id"].asUUID(); - mPlaceProfile->setParcelID(parcel_id); - - // query the server to get the global 3D position of this - // parcel - we need this for teleport/mapping functions. - mRemoteParcelObserver->setParcelID(parcel_id); - } - else - { - mPosGlobal = LLVector3d(key["x"].asReal(), - key["y"].asReal(), - key["z"].asReal()); - mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal); - } - - mPlaceProfile->setInfoType(LLPanelPlaceInfo::PLACE); - } - else if (mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE) - { - S32 index = key["id"].asInteger(); - - const LLTeleportHistoryStorage::slurl_list_t& hist_items = - LLTeleportHistoryStorage::getInstance()->getItems(); - - mPosGlobal = hist_items[index].mGlobalPos; - - mPlaceProfile->setInfoType(LLPanelPlaceInfo::TELEPORT_HISTORY); - mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal); - } - - updateVerbs(); - } - } - - LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance(); - if (!parcel_mgr) - return; - - mParcelLocalId = parcel_mgr->getAgentParcel()->getLocalID(); - - // Start using LLViewerParcelMgr for land selection if - // information about nearby land is requested. - // Otherwise stop using land selection and deselect land. - if (mPlaceInfoType == AGENT_INFO_TYPE) - { - // We don't know if we are already added to LLViewerParcelMgr observers list - // so try to remove observer not to add an extra one. - parcel_mgr->removeObserver(mParcelObserver); - - parcel_mgr->addObserver(mParcelObserver); - parcel_mgr->selectParcelAt(gAgent.getPositionGlobal()); - } - else - { - parcel_mgr->removeObserver(mParcelObserver); - - // Clear the reference to selection to allow its removal in deselectUnused(). - mParcel.clear(); - - if (!parcel_mgr->selectionEmpty()) - { - parcel_mgr->deselectUnused(); - } - } + setItem(item); + } + else if (mPlaceInfoType == REMOTE_PLACE_INFO_TYPE) + { + if (key.has("id")) + { + LLUUID parcel_id = key["id"].asUUID(); + mPlaceProfile->setParcelID(parcel_id); + + // query the server to get the global 3D position of this + // parcel - we need this for teleport/mapping functions. + mRemoteParcelObserver->setParcelID(parcel_id); + } + else + { + mPosGlobal = LLVector3d(key["x"].asReal(), + key["y"].asReal(), + key["z"].asReal()); + mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal); + } + + mPlaceProfile->setInfoType(LLPanelPlaceInfo::PLACE); + } + else if (mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE) + { + S32 index = key["id"].asInteger(); + + const LLTeleportHistoryStorage::slurl_list_t& hist_items = + LLTeleportHistoryStorage::getInstance()->getItems(); + + mPosGlobal = hist_items[index].mGlobalPos; + + mPlaceProfile->setInfoType(LLPanelPlaceInfo::TELEPORT_HISTORY); + mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal); + } + + updateVerbs(); + } + } + + LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance(); + if (!parcel_mgr) + return; + + mParcelLocalId = parcel_mgr->getAgentParcel()->getLocalID(); + + // Start using LLViewerParcelMgr for land selection if + // information about nearby land is requested. + // Otherwise stop using land selection and deselect land. + if (mPlaceInfoType == AGENT_INFO_TYPE) + { + // We don't know if we are already added to LLViewerParcelMgr observers list + // so try to remove observer not to add an extra one. + parcel_mgr->removeObserver(mParcelObserver); + + parcel_mgr->addObserver(mParcelObserver); + parcel_mgr->selectParcelAt(gAgent.getPositionGlobal()); + } + else + { + parcel_mgr->removeObserver(mParcelObserver); + + // Clear the reference to selection to allow its removal in deselectUnused(). + mParcel.clear(); + + if (!parcel_mgr->selectionEmpty()) + { + parcel_mgr->deselectUnused(); + } + } } void LLPanelPlaces::setItem(LLInventoryItem* item) { - if (!mLandmarkInfo || !item) - return; - - mItem = item; - - LLAssetType::EType item_type = mItem->getActualType(); - if (item_type == LLAssetType::AT_LANDMARK || item_type == LLAssetType::AT_LINK) - { - // If the item is a link get a linked item - if (item_type == LLAssetType::AT_LINK) - { - mItem = gInventory.getItem(mItem->getLinkedUUID()); - if (mItem.isNull()) - return; - } - } - else - { - return; - } - - // Check if item is in agent's inventory and he has the permission to modify it. - BOOL is_landmark_editable = gInventory.isObjectDescendentOf(mItem->getUUID(), gInventory.getRootFolderID()) && - mItem->getPermissions().allowModifyBy(gAgent.getID()); - - mSaveBtn->setEnabled(is_landmark_editable); - - if (is_landmark_editable) - { - if(!mLandmarkInfo->setLandmarkFolder(mItem->getParentUUID()) && !mItem->getParentUUID().isNull()) - { - const LLViewerInventoryCategory* cat = gInventory.getCategory(mItem->getParentUUID()); - if (cat) - { - std::string cat_fullname = LLPanelLandmarkInfo::getFullFolderName(cat); - LLComboBox* folderList = mLandmarkInfo->getChild<LLComboBox>("folder_combo"); - folderList->add(cat_fullname, cat->getUUID(), ADD_TOP); - } - } - } - - mLandmarkInfo->displayItemInfo(mItem); - - LLLandmark* lm = gLandmarkList.getAsset(mItem->getAssetUUID(), - boost::bind(&LLPanelPlaces::onLandmarkLoaded, this, _1)); - if (lm) - { - onLandmarkLoaded(lm); - } + if (!mLandmarkInfo || !item) + return; + + mItem = item; + + LLAssetType::EType item_type = mItem->getActualType(); + if (item_type == LLAssetType::AT_LANDMARK || item_type == LLAssetType::AT_LINK) + { + // If the item is a link get a linked item + if (item_type == LLAssetType::AT_LINK) + { + mItem = gInventory.getItem(mItem->getLinkedUUID()); + if (mItem.isNull()) + return; + } + } + else + { + return; + } + + // Check if item is in agent's inventory and he has the permission to modify it. + BOOL is_landmark_editable = gInventory.isObjectDescendentOf(mItem->getUUID(), gInventory.getRootFolderID()) && + mItem->getPermissions().allowModifyBy(gAgent.getID()); + + mSaveBtn->setEnabled(is_landmark_editable); + + if (is_landmark_editable) + { + if(!mLandmarkInfo->setLandmarkFolder(mItem->getParentUUID()) && !mItem->getParentUUID().isNull()) + { + const LLViewerInventoryCategory* cat = gInventory.getCategory(mItem->getParentUUID()); + if (cat) + { + std::string cat_fullname = LLPanelLandmarkInfo::getFullFolderName(cat); + LLComboBox* folderList = mLandmarkInfo->getChild<LLComboBox>("folder_combo"); + folderList->add(cat_fullname, cat->getUUID(), ADD_TOP); + } + } + } + + mLandmarkInfo->displayItemInfo(mItem); + + LLLandmark* lm = gLandmarkList.getAsset(mItem->getAssetUUID(), + boost::bind(&LLPanelPlaces::onLandmarkLoaded, this, _1)); + if (lm) + { + onLandmarkLoaded(lm); + } } S32 LLPanelPlaces::notifyParent(const LLSD& info) { - if(info.has("update_verbs")) - { - if(mPosGlobal.isExactlyZero()) - { - mPosGlobal.setVec(info["global_x"], info["global_y"], info["global_z"]); - } - - updateVerbs(); - - return 1; - } - return LLPanel::notifyParent(info); + if(info.has("update_verbs")) + { + if(mPosGlobal.isExactlyZero()) + { + mPosGlobal.setVec(info["global_x"], info["global_y"], info["global_z"]); + } + + updateVerbs(); + + return 1; + } + return LLPanel::notifyParent(info); } void LLPanelPlaces::onLandmarkLoaded(LLLandmark* landmark) { - if (!mLandmarkInfo) - return; + if (!mLandmarkInfo) + return; - LLUUID region_id; - landmark->getRegionID(region_id); - landmark->getGlobalPos(mPosGlobal); - mLandmarkInfo->displayParcelInfo(region_id, mPosGlobal); + LLUUID region_id; + landmark->getRegionID(region_id); + landmark->getGlobalPos(mPosGlobal); + mLandmarkInfo->displayParcelInfo(region_id, mPosGlobal); - updateVerbs(); + updateVerbs(); } void LLPanelPlaces::onFilterEdit(const std::string& search_string, bool force_filter) { - if (!mActivePanel) - return; + if (!mActivePanel) + return; - if (force_filter || mActivePanel->getFilterSubString() != search_string) - { - std::string string = search_string; + if (force_filter || mActivePanel->getFilterSubString() != search_string) + { + std::string string = search_string; - // Searches are case-insensitive - // but we don't convert the typed string to upper-case so that it can be fed to the web search as-is. + // Searches are case-insensitive + // but we don't convert the typed string to upper-case so that it can be fed to the web search as-is. - mActivePanel->onSearchEdit(string); - } + mActivePanel->onSearchEdit(string); + } } void LLPanelPlaces::onTabSelected() { - mActivePanel = dynamic_cast<LLPanelPlacesTab*>(mTabContainer->getCurrentPanel()); - if (!mActivePanel) - return; + mActivePanel = dynamic_cast<LLPanelPlacesTab*>(mTabContainer->getCurrentPanel()); + if (!mActivePanel) + return; - onFilterEdit(mActivePanel->getFilterSubString(), true); - mActivePanel->updateVerbs(); + onFilterEdit(mActivePanel->getFilterSubString(), true); + mActivePanel->updateVerbs(); // History panel does not support deletion nor creation // Hide menus @@ -677,315 +677,315 @@ void LLPanelPlaces::onTabSelected() void LLPanelPlaces::onTeleportButtonClicked() { - LLPanelPlaceInfo* panel = getCurrentInfoPanel(); - if (panel && panel->getVisible()) - { - if (mPlaceInfoType == LANDMARK_INFO_TYPE) - { - if (mItem.isNull()) - { - LL_WARNS() << "NULL landmark item" << LL_ENDL; - llassert(mItem.notNull()); - return; - } - - LLSD payload; - payload["asset_id"] = mItem->getAssetUUID(); - LLSD args; - args["LOCATION"] = mItem->getName(); - LLNotificationsUtil::add("TeleportFromLandmark", args, payload); - } - else if (mPlaceInfoType == AGENT_INFO_TYPE || - mPlaceInfoType == REMOTE_PLACE_INFO_TYPE || - mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE) - { - LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance(); - if (!mPosGlobal.isExactlyZero() && worldmap_instance) - { - gAgent.teleportViaLocation(mPosGlobal); - worldmap_instance->trackLocation(mPosGlobal); - } - } - } - else - { - if (mActivePanel) - mActivePanel->onTeleport(); - } + LLPanelPlaceInfo* panel = getCurrentInfoPanel(); + if (panel && panel->getVisible()) + { + if (mPlaceInfoType == LANDMARK_INFO_TYPE) + { + if (mItem.isNull()) + { + LL_WARNS() << "NULL landmark item" << LL_ENDL; + llassert(mItem.notNull()); + return; + } + + LLSD payload; + payload["asset_id"] = mItem->getAssetUUID(); + LLSD args; + args["LOCATION"] = mItem->getName(); + LLNotificationsUtil::add("TeleportFromLandmark", args, payload); + } + else if (mPlaceInfoType == AGENT_INFO_TYPE || + mPlaceInfoType == REMOTE_PLACE_INFO_TYPE || + mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE) + { + LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance(); + if (!mPosGlobal.isExactlyZero() && worldmap_instance) + { + gAgent.teleportViaLocation(mPosGlobal); + worldmap_instance->trackLocation(mPosGlobal); + } + } + } + else + { + if (mActivePanel) + mActivePanel->onTeleport(); + } } void LLPanelPlaces::onShowOnMapButtonClicked() { - LLPanelPlaceInfo* panel = getCurrentInfoPanel(); - if (panel && panel->getVisible()) - { - LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance(); - if(!worldmap_instance) - return; - - if (mPlaceInfoType == AGENT_INFO_TYPE || - mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE || - mPlaceInfoType == REMOTE_PLACE_INFO_TYPE || - mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE) - { - if (!mPosGlobal.isExactlyZero()) - { - worldmap_instance->trackLocation(mPosGlobal); - LLFloaterReg::showInstance("world_map", "center"); - } - } - else if (mPlaceInfoType == LANDMARK_INFO_TYPE) - { - if (mItem.isNull()) - { - LL_WARNS() << "NULL landmark item" << LL_ENDL; - llassert(mItem.notNull()); - return; - } - LLLandmark* landmark = gLandmarkList.getAsset(mItem->getAssetUUID()); - if (!landmark) - return; - - LLVector3d landmark_global_pos; - if (!landmark->getGlobalPos(landmark_global_pos)) - return; - - if (!landmark_global_pos.isExactlyZero()) - { - worldmap_instance->trackLocation(landmark_global_pos); - LLFloaterReg::showInstance("world_map", "center"); - } - } - } - else - { - if (mActivePanel && mActivePanel->isSingleItemSelected()) - { - mActivePanel->onShowOnMap(); - } - else - { - LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance(); - LLVector3d global_pos = gAgent.getPositionGlobal(); - - if (!global_pos.isExactlyZero() && worldmap_instance) - { - worldmap_instance->trackLocation(global_pos); - LLFloaterReg::showInstance("world_map", "center"); - } - } - } + LLPanelPlaceInfo* panel = getCurrentInfoPanel(); + if (panel && panel->getVisible()) + { + LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance(); + if(!worldmap_instance) + return; + + if (mPlaceInfoType == AGENT_INFO_TYPE || + mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE || + mPlaceInfoType == REMOTE_PLACE_INFO_TYPE || + mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE) + { + if (!mPosGlobal.isExactlyZero()) + { + worldmap_instance->trackLocation(mPosGlobal); + LLFloaterReg::showInstance("world_map", "center"); + } + } + else if (mPlaceInfoType == LANDMARK_INFO_TYPE) + { + if (mItem.isNull()) + { + LL_WARNS() << "NULL landmark item" << LL_ENDL; + llassert(mItem.notNull()); + return; + } + LLLandmark* landmark = gLandmarkList.getAsset(mItem->getAssetUUID()); + if (!landmark) + return; + + LLVector3d landmark_global_pos; + if (!landmark->getGlobalPos(landmark_global_pos)) + return; + + if (!landmark_global_pos.isExactlyZero()) + { + worldmap_instance->trackLocation(landmark_global_pos); + LLFloaterReg::showInstance("world_map", "center"); + } + } + } + else + { + if (mActivePanel && mActivePanel->isSingleItemSelected()) + { + mActivePanel->onShowOnMap(); + } + else + { + LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance(); + LLVector3d global_pos = gAgent.getPositionGlobal(); + + if (!global_pos.isExactlyZero() && worldmap_instance) + { + worldmap_instance->trackLocation(global_pos); + LLFloaterReg::showInstance("world_map", "center"); + } + } + } } void LLPanelPlaces::onEditButtonClicked() { - if (!mLandmarkInfo || isLandmarkEditModeOn) - return; + if (!mLandmarkInfo || isLandmarkEditModeOn) + return; - isLandmarkEditModeOn = true; + isLandmarkEditModeOn = true; - mLandmarkInfo->toggleLandmarkEditMode(TRUE); + mLandmarkInfo->toggleLandmarkEditMode(TRUE); - updateVerbs(); + updateVerbs(); } void LLPanelPlaces::onSaveButtonClicked() { - if (!mLandmarkInfo || mItem.isNull()) - return; - - std::string current_title_value = mLandmarkInfo->getLandmarkTitle(); - std::string item_title_value = mItem->getName(); - std::string current_notes_value = mLandmarkInfo->getLandmarkNotes(); - std::string item_notes_value = mItem->getDescription(); - - LLStringUtil::trim(current_title_value); - LLStringUtil::trim(current_notes_value); - - LLUUID folder_id = mLandmarkInfo->getLandmarkFolder(); - bool change_parent = folder_id != mItem->getParentUUID(); - - LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(mItem); - - if (!current_title_value.empty() && - (item_title_value != current_title_value || item_notes_value != current_notes_value)) - { - new_item->rename(current_title_value); - new_item->setDescription(current_notes_value); - LLPointer<LLInventoryCallback> cb; - if (change_parent) - { - cb = new LLUpdateLandmarkParent(new_item, folder_id); - } - LLInventoryModel::LLCategoryUpdate up(mItem->getParentUUID(), 0); - gInventory.accountForUpdate(up); - update_inventory_item(new_item, cb); - } - else if (change_parent) - { - LLInventoryModel::update_list_t update; - LLInventoryModel::LLCategoryUpdate old_folder(mItem->getParentUUID(),-1); - update.push_back(old_folder); - LLInventoryModel::LLCategoryUpdate new_folder(folder_id, 1); - update.push_back(new_folder); - gInventory.accountForUpdate(update); - - new_item->setParent(folder_id); - new_item->updateParentOnServer(FALSE); - } - - gInventory.updateItem(new_item); - gInventory.notifyObservers(); - - onCancelButtonClicked(); + if (!mLandmarkInfo || mItem.isNull()) + return; + + std::string current_title_value = mLandmarkInfo->getLandmarkTitle(); + std::string item_title_value = mItem->getName(); + std::string current_notes_value = mLandmarkInfo->getLandmarkNotes(); + std::string item_notes_value = mItem->getDescription(); + + LLStringUtil::trim(current_title_value); + LLStringUtil::trim(current_notes_value); + + LLUUID folder_id = mLandmarkInfo->getLandmarkFolder(); + bool change_parent = folder_id != mItem->getParentUUID(); + + LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(mItem); + + if (!current_title_value.empty() && + (item_title_value != current_title_value || item_notes_value != current_notes_value)) + { + new_item->rename(current_title_value); + new_item->setDescription(current_notes_value); + LLPointer<LLInventoryCallback> cb; + if (change_parent) + { + cb = new LLUpdateLandmarkParent(new_item, folder_id); + } + LLInventoryModel::LLCategoryUpdate up(mItem->getParentUUID(), 0); + gInventory.accountForUpdate(up); + update_inventory_item(new_item, cb); + } + else if (change_parent) + { + LLInventoryModel::update_list_t update; + LLInventoryModel::LLCategoryUpdate old_folder(mItem->getParentUUID(),-1); + update.push_back(old_folder); + LLInventoryModel::LLCategoryUpdate new_folder(folder_id, 1); + update.push_back(new_folder); + gInventory.accountForUpdate(update); + + new_item->setParent(folder_id); + new_item->updateParentOnServer(FALSE); + } + + gInventory.updateItem(new_item); + gInventory.notifyObservers(); + + onCancelButtonClicked(); } void LLPanelPlaces::onCancelButtonClicked() { - if (!mLandmarkInfo) - return; - - if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE) - { - onBackButtonClicked(); - } - else - { - mLandmarkInfo->toggleLandmarkEditMode(FALSE); - isLandmarkEditModeOn = false; - - updateVerbs(); - - // Reload the landmark properties. - mLandmarkInfo->displayItemInfo(mItem); - } + if (!mLandmarkInfo) + return; + + if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE) + { + onBackButtonClicked(); + } + else + { + mLandmarkInfo->toggleLandmarkEditMode(FALSE); + isLandmarkEditModeOn = false; + + updateVerbs(); + + // Reload the landmark properties. + mLandmarkInfo->displayItemInfo(mItem); + } } void LLPanelPlaces::onOverflowButtonClicked() { - LLToggleableMenu* menu; - - bool is_agent_place_info_visible = mPlaceInfoType == AGENT_INFO_TYPE; - - if ((is_agent_place_info_visible || - mPlaceInfoType == REMOTE_PLACE_INFO_TYPE || - mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE) && mPlaceMenu != NULL) - { - menu = mPlaceMenu; - - bool landmark_item_enabled = false; - LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance(); - if (is_agent_place_info_visible - && gAgent.getRegion() - && mRegionId == gAgent.getRegion()->getRegionID() - && parcel_mgr - && parcel_mgr->getAgentParcel()->getLocalID() == mParcelLocalId) - { - // Floater still shows location identical to agent's position - landmark_item_enabled = !LLLandmarkActions::landmarkAlreadyExists(); - } - - // Enable adding a landmark only for agent current parcel and if - // there is no landmark already pointing to that parcel in agent's inventory. - menu->getChild<LLMenuItemCallGL>("landmark")->setEnabled(landmark_item_enabled); - // STORM-411 - // Creating landmarks for remote locations is impossible. - // So hide menu item "Make a Landmark" in "Teleport History Profile" panel. - menu->setItemVisible("landmark", mPlaceInfoType != TELEPORT_HISTORY_INFO_TYPE); - menu->arrangeAndClear(); - } - else if (mPlaceInfoType == LANDMARK_INFO_TYPE && mLandmarkMenu != NULL) - { - menu = mLandmarkMenu; - - BOOL is_landmark_removable = FALSE; - if (mItem.notNull()) - { - const LLUUID& item_id = mItem->getUUID(); - const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); - is_landmark_removable = gInventory.isObjectDescendentOf(item_id, gInventory.getRootFolderID()) && - !gInventory.isObjectDescendentOf(item_id, trash_id); - } - - menu->getChild<LLMenuItemCallGL>("delete")->setEnabled(is_landmark_removable); - } - else - { - return; - } - - mOverflowBtn->setMenu(menu, LLMenuButton::MP_TOP_RIGHT); + LLToggleableMenu* menu; + + bool is_agent_place_info_visible = mPlaceInfoType == AGENT_INFO_TYPE; + + if ((is_agent_place_info_visible || + mPlaceInfoType == REMOTE_PLACE_INFO_TYPE || + mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE) && mPlaceMenu != NULL) + { + menu = mPlaceMenu; + + bool landmark_item_enabled = false; + LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance(); + if (is_agent_place_info_visible + && gAgent.getRegion() + && mRegionId == gAgent.getRegion()->getRegionID() + && parcel_mgr + && parcel_mgr->getAgentParcel()->getLocalID() == mParcelLocalId) + { + // Floater still shows location identical to agent's position + landmark_item_enabled = !LLLandmarkActions::landmarkAlreadyExists(); + } + + // Enable adding a landmark only for agent current parcel and if + // there is no landmark already pointing to that parcel in agent's inventory. + menu->getChild<LLMenuItemCallGL>("landmark")->setEnabled(landmark_item_enabled); + // STORM-411 + // Creating landmarks for remote locations is impossible. + // So hide menu item "Make a Landmark" in "Teleport History Profile" panel. + menu->setItemVisible("landmark", mPlaceInfoType != TELEPORT_HISTORY_INFO_TYPE); + menu->arrangeAndClear(); + } + else if (mPlaceInfoType == LANDMARK_INFO_TYPE && mLandmarkMenu != NULL) + { + menu = mLandmarkMenu; + + BOOL is_landmark_removable = FALSE; + if (mItem.notNull()) + { + const LLUUID& item_id = mItem->getUUID(); + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); + is_landmark_removable = gInventory.isObjectDescendentOf(item_id, gInventory.getRootFolderID()) && + !gInventory.isObjectDescendentOf(item_id, trash_id); + } + + menu->getChild<LLMenuItemCallGL>("delete")->setEnabled(is_landmark_removable); + } + else + { + return; + } + + mOverflowBtn->setMenu(menu, LLMenuButton::MP_TOP_RIGHT); } bool LLPanelPlaces::onOverflowMenuItemEnable(const LLSD& param) { - std::string value = param.asString(); - if("can_create_pick" == value) - { - return !LLAgentPicksInfo::getInstance()->isPickLimitReached(); - } - return true; + std::string value = param.asString(); + if("can_create_pick" == value) + { + return !LLAgentPicksInfo::getInstance()->isPickLimitReached(); + } + return true; } void LLPanelPlaces::onOverflowMenuItemClicked(const LLSD& param) { - std::string item = param.asString(); - if (item == "landmark") - { - LLSD key; - key["type"] = CREATE_LANDMARK_INFO_TYPE; - key["x"] = mPosGlobal.mdV[VX]; - key["y"] = mPosGlobal.mdV[VY]; - key["z"] = mPosGlobal.mdV[VZ]; - onOpen(key); - } - else if (item == "copy") - { - LLLandmarkActions::getSLURLfromPosGlobal(mPosGlobal, boost::bind(&onSLURLBuilt, _1)); - } - else if (item == "delete") - { - gInventory.removeItem(mItem->getUUID()); - - onBackButtonClicked(); - } - else if (item == "pick") - { - LLPanelPlaceInfo* panel = getCurrentInfoPanel(); - if (panel) - { - panel->createPick(mPosGlobal); - } - } - else if (item == "add_to_favbar") - { - if ( mItem.notNull() ) - { - const LLUUID& favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); - if ( favorites_id.notNull() ) - { - copy_inventory_item(gAgent.getID(), - mItem->getPermissions().getOwner(), - mItem->getUUID(), - favorites_id, - std::string(), - LLPointer<LLInventoryCallback>(NULL)); - LL_INFOS() << "Copied inventory item #" << mItem->getUUID() << " to favorites." << LL_ENDL; - } - } - } + std::string item = param.asString(); + if (item == "landmark") + { + LLSD key; + key["type"] = CREATE_LANDMARK_INFO_TYPE; + key["x"] = mPosGlobal.mdV[VX]; + key["y"] = mPosGlobal.mdV[VY]; + key["z"] = mPosGlobal.mdV[VZ]; + onOpen(key); + } + else if (item == "copy") + { + LLLandmarkActions::getSLURLfromPosGlobal(mPosGlobal, boost::bind(&onSLURLBuilt, _1)); + } + else if (item == "delete") + { + gInventory.removeItem(mItem->getUUID()); + + onBackButtonClicked(); + } + else if (item == "pick") + { + LLPanelPlaceInfo* panel = getCurrentInfoPanel(); + if (panel) + { + panel->createPick(mPosGlobal); + } + } + else if (item == "add_to_favbar") + { + if ( mItem.notNull() ) + { + const LLUUID& favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); + if ( favorites_id.notNull() ) + { + copy_inventory_item(gAgent.getID(), + mItem->getPermissions().getOwner(), + mItem->getUUID(), + favorites_id, + std::string(), + LLPointer<LLInventoryCallback>(NULL)); + LL_INFOS() << "Copied inventory item #" << mItem->getUUID() << " to favorites." << LL_ENDL; + } + } + } } void LLPanelPlaces::onBackButtonClicked() { - togglePlaceInfoPanel(FALSE); + togglePlaceInfoPanel(FALSE); - // Resetting mPlaceInfoType when Place Info panel is closed. - mPlaceInfoType = LLStringUtil::null; + // Resetting mPlaceInfoType when Place Info panel is closed. + mPlaceInfoType = LLStringUtil::null; - isLandmarkEditModeOn = false; + isLandmarkEditModeOn = false; - updateVerbs(); + updateVerbs(); } void LLPanelPlaces::onGearMenuClick() @@ -1034,173 +1034,173 @@ bool LLPanelPlaces::handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_t void LLPanelPlaces::togglePlaceInfoPanel(BOOL visible) { - if (!mPlaceProfile || !mLandmarkInfo) - return; - - mTabContainer->setVisible(!visible); - mButtonsContainer->setVisible(visible); - mFilterContainer->setVisible(!visible); - - if (mPlaceInfoType == AGENT_INFO_TYPE || - mPlaceInfoType == REMOTE_PLACE_INFO_TYPE || - mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE) - { - mPlaceProfile->setVisible(visible); - - if (visible) - { - mPlaceProfile->resetLocation(); - - // Do not reset location info until mResetInfoTimer has expired - // to avoid text blinking. - mResetInfoTimer.setTimerExpirySec(PLACE_INFO_UPDATE_INTERVAL); - - mLandmarkInfo->setVisible(FALSE); - } - else if (mPlaceInfoType == AGENT_INFO_TYPE) - { - LLViewerParcelMgr::getInstance()->removeObserver(mParcelObserver); - - // Clear reference to parcel selection when closing place profile panel. - // LLViewerParcelMgr removes the selection if it has 1 reference to it. - mParcel.clear(); - } - } - else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE || - mPlaceInfoType == LANDMARK_INFO_TYPE || - mPlaceInfoType == LANDMARK_TAB_INFO_TYPE) - { - mLandmarkInfo->setVisible(visible); - mPlaceProfile->setVisible(FALSE); - if (visible) - { - mLandmarkInfo->resetLocation(); - } - else - { - std::string tab_panel_name("Landmarks"); - if (mItem.notNull()) - { - if (gInventory.isObjectDescendentOf(mItem->getUUID(), gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE))) - { - tab_panel_name = "Favorites"; - } - } - - LLLandmarksPanel* landmarks_panel = dynamic_cast<LLLandmarksPanel*>(mTabContainer->getPanelByName(tab_panel_name)); - if (landmarks_panel) - { - // If a landmark info is being closed we open the landmarks tab - // and set this landmark selected. - mTabContainer->selectTabPanel(landmarks_panel); - if (mItem.notNull()) - { - landmarks_panel->setItemSelected(mItem->getUUID(), TRUE); - } - else - { - landmarks_panel->resetSelection(); - } - } - } - } + if (!mPlaceProfile || !mLandmarkInfo) + return; + + mTabContainer->setVisible(!visible); + mButtonsContainer->setVisible(visible); + mFilterContainer->setVisible(!visible); + + if (mPlaceInfoType == AGENT_INFO_TYPE || + mPlaceInfoType == REMOTE_PLACE_INFO_TYPE || + mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE) + { + mPlaceProfile->setVisible(visible); + + if (visible) + { + mPlaceProfile->resetLocation(); + + // Do not reset location info until mResetInfoTimer has expired + // to avoid text blinking. + mResetInfoTimer.setTimerExpirySec(PLACE_INFO_UPDATE_INTERVAL); + + mLandmarkInfo->setVisible(FALSE); + } + else if (mPlaceInfoType == AGENT_INFO_TYPE) + { + LLViewerParcelMgr::getInstance()->removeObserver(mParcelObserver); + + // Clear reference to parcel selection when closing place profile panel. + // LLViewerParcelMgr removes the selection if it has 1 reference to it. + mParcel.clear(); + } + } + else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE || + mPlaceInfoType == LANDMARK_INFO_TYPE || + mPlaceInfoType == LANDMARK_TAB_INFO_TYPE) + { + mLandmarkInfo->setVisible(visible); + mPlaceProfile->setVisible(FALSE); + if (visible) + { + mLandmarkInfo->resetLocation(); + } + else + { + std::string tab_panel_name("Landmarks"); + if (mItem.notNull()) + { + if (gInventory.isObjectDescendentOf(mItem->getUUID(), gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE))) + { + tab_panel_name = "Favorites"; + } + } + + LLLandmarksPanel* landmarks_panel = dynamic_cast<LLLandmarksPanel*>(mTabContainer->getPanelByName(tab_panel_name)); + if (landmarks_panel) + { + // If a landmark info is being closed we open the landmarks tab + // and set this landmark selected. + mTabContainer->selectTabPanel(landmarks_panel); + if (mItem.notNull()) + { + landmarks_panel->setItemSelected(mItem->getUUID(), TRUE); + } + else + { + landmarks_panel->resetSelection(); + } + } + } + } } // virtual void LLPanelPlaces::onVisibilityChange(BOOL new_visibility) { - LLPanel::onVisibilityChange(new_visibility); + LLPanel::onVisibilityChange(new_visibility); - if (!new_visibility && mPlaceInfoType == AGENT_INFO_TYPE) - { - LLViewerParcelMgr::getInstance()->removeObserver(mParcelObserver); + if (!new_visibility && mPlaceInfoType == AGENT_INFO_TYPE) + { + LLViewerParcelMgr::getInstance()->removeObserver(mParcelObserver); - // Clear reference to parcel selection when closing places panel. - mParcel.clear(); - } + // Clear reference to parcel selection when closing places panel. + mParcel.clear(); + } } void LLPanelPlaces::changedParcelSelection() { - if (!mPlaceProfile) - return; - - LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance(); - mParcel = parcel_mgr->getFloatingParcelSelection(); - LLParcel* parcel = mParcel->getParcel(); - LLViewerRegion* region = parcel_mgr->getSelectionRegion(); - if (!region || !parcel) - return; - - LLVector3d prev_pos_global = mPosGlobal; - - // If agent is inside the selected parcel show agent's region<X, Y, Z>, - // otherwise show region<X, Y, Z> of agent's selection point. - bool is_current_parcel = is_agent_in_selected_parcel(parcel); - if (is_current_parcel) - { - mPosGlobal = gAgent.getPositionGlobal(); - } - else - { - LLVector3d pos_global = gViewerWindow->getLastPick().mPosGlobal; - if (!pos_global.isExactlyZero()) - { - mPosGlobal = pos_global; - } - } - - // Reset location info only if global position has changed - // and update timer has expired to reduce unnecessary text and icons updates. - if (prev_pos_global != mPosGlobal && mResetInfoTimer.hasExpired()) - { - mPlaceProfile->resetLocation(); - mResetInfoTimer.setTimerExpirySec(PLACE_INFO_UPDATE_INTERVAL); - } - - mPlaceProfile->displaySelectedParcelInfo(parcel, region, mPosGlobal, is_current_parcel); - - updateVerbs(); + if (!mPlaceProfile) + return; + + LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance(); + mParcel = parcel_mgr->getFloatingParcelSelection(); + LLParcel* parcel = mParcel->getParcel(); + LLViewerRegion* region = parcel_mgr->getSelectionRegion(); + if (!region || !parcel) + return; + + LLVector3d prev_pos_global = mPosGlobal; + + // If agent is inside the selected parcel show agent's region<X, Y, Z>, + // otherwise show region<X, Y, Z> of agent's selection point. + bool is_current_parcel = is_agent_in_selected_parcel(parcel); + if (is_current_parcel) + { + mPosGlobal = gAgent.getPositionGlobal(); + } + else + { + LLVector3d pos_global = gViewerWindow->getLastPick().mPosGlobal; + if (!pos_global.isExactlyZero()) + { + mPosGlobal = pos_global; + } + } + + // Reset location info only if global position has changed + // and update timer has expired to reduce unnecessary text and icons updates. + if (prev_pos_global != mPosGlobal && mResetInfoTimer.hasExpired()) + { + mPlaceProfile->resetLocation(); + mResetInfoTimer.setTimerExpirySec(PLACE_INFO_UPDATE_INTERVAL); + } + + mPlaceProfile->displaySelectedParcelInfo(parcel, region, mPosGlobal, is_current_parcel); + + updateVerbs(); } void LLPanelPlaces::createTabs() { - if (!(gInventory.isInventoryUsable() && LLTeleportHistory::getInstance() && !mTabsCreated)) - return; - - LLFavoritesPanel* favorites_panel = new LLFavoritesPanel(); - if (favorites_panel) - { - mTabContainer->addTabPanel( - LLTabContainer::TabPanelParams(). - panel(favorites_panel). - label(getString("favorites_tab_title")). - insert_at(LLTabContainer::END)); - } - - LLLandmarksPanel* landmarks_panel = new LLLandmarksPanel(); - if (landmarks_panel) - { - mTabContainer->addTabPanel( - LLTabContainer::TabPanelParams(). - panel(landmarks_panel). - label(getString("landmarks_tab_title")). - insert_at(LLTabContainer::END)); - } - - LLTeleportHistoryPanel* teleport_history_panel = new LLTeleportHistoryPanel(); - if (teleport_history_panel) - { - mTabContainer->addTabPanel( - LLTabContainer::TabPanelParams(). - panel(teleport_history_panel). - label(getString("teleport_history_tab_title")). - insert_at(LLTabContainer::END)); - } - - mTabContainer->selectFirstTab(); - - mActivePanel = dynamic_cast<LLPanelPlacesTab*>(mTabContainer->getCurrentPanel()); + if (!(gInventory.isInventoryUsable() && LLTeleportHistory::getInstance() && !mTabsCreated)) + return; + + LLFavoritesPanel* favorites_panel = new LLFavoritesPanel(); + if (favorites_panel) + { + mTabContainer->addTabPanel( + LLTabContainer::TabPanelParams(). + panel(favorites_panel). + label(getString("favorites_tab_title")). + insert_at(LLTabContainer::END)); + } + + LLLandmarksPanel* landmarks_panel = new LLLandmarksPanel(); + if (landmarks_panel) + { + mTabContainer->addTabPanel( + LLTabContainer::TabPanelParams(). + panel(landmarks_panel). + label(getString("landmarks_tab_title")). + insert_at(LLTabContainer::END)); + } + + LLTeleportHistoryPanel* teleport_history_panel = new LLTeleportHistoryPanel(); + if (teleport_history_panel) + { + mTabContainer->addTabPanel( + LLTabContainer::TabPanelParams(). + panel(teleport_history_panel). + label(getString("teleport_history_tab_title")). + insert_at(LLTabContainer::END)); + } + + mTabContainer->selectFirstTab(); + + mActivePanel = dynamic_cast<LLPanelPlacesTab*>(mTabContainer->getCurrentPanel()); if (mActivePanel) { @@ -1225,134 +1225,134 @@ void LLPanelPlaces::createTabs() } mActivePanel->setRemoveBtn(mRemoveSelectedBtn); - mActivePanel->updateVerbs(); + mActivePanel->updateVerbs(); } - mTabsCreated = true; + mTabsCreated = true; } void LLPanelPlaces::changedGlobalPos(const LLVector3d &global_pos) { - mPosGlobal = global_pos; - updateVerbs(); + mPosGlobal = global_pos; + updateVerbs(); } void LLPanelPlaces::showAddedLandmarkInfo(const uuid_set_t& items) { - for (uuid_set_t::const_iterator item_iter = items.begin(); - item_iter != items.end(); - ++item_iter) - { - const LLUUID& item_id = (*item_iter); - if(!highlight_offered_object(item_id)) - { - continue; - } - - LLInventoryItem* item = gInventory.getItem(item_id); - - llassert(item); - if (item && (LLAssetType::AT_LANDMARK == item->getType()) ) - { - // Created landmark is passed to Places panel to allow its editing. - // If the panel is closed we don't reopen it until created landmark is loaded. - if("create_landmark" == getPlaceInfoType() && !getItem()) - { - setItem(item); - } - } - } + for (uuid_set_t::const_iterator item_iter = items.begin(); + item_iter != items.end(); + ++item_iter) + { + const LLUUID& item_id = (*item_iter); + if(!highlight_offered_object(item_id)) + { + continue; + } + + LLInventoryItem* item = gInventory.getItem(item_id); + + llassert(item); + if (item && (LLAssetType::AT_LANDMARK == item->getType()) ) + { + // Created landmark is passed to Places panel to allow its editing. + // If the panel is closed we don't reopen it until created landmark is loaded. + if("create_landmark" == getPlaceInfoType() && !getItem()) + { + setItem(item); + } + } + } } void LLPanelPlaces::updateVerbs() { - bool is_place_info_visible; - - LLPanelPlaceInfo* panel = getCurrentInfoPanel(); - if (panel) - { - is_place_info_visible = panel->getVisible(); - } - else - { - is_place_info_visible = false; - } - - bool is_agent_place_info_visible = mPlaceInfoType == AGENT_INFO_TYPE; - bool is_create_landmark_visible = mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE; - - bool have_3d_pos = ! mPosGlobal.isExactlyZero(); - - mTeleportBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn); - mShowOnMapBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn); - mSaveBtn->setVisible(isLandmarkEditModeOn); - mCancelBtn->setVisible(isLandmarkEditModeOn); - mCloseBtn->setVisible(is_create_landmark_visible && !isLandmarkEditModeOn); - - bool show_options_btn = is_place_info_visible && !is_create_landmark_visible && !isLandmarkEditModeOn; - mOverflowBtn->setVisible(show_options_btn); - getChild<LLLayoutPanel>("lp_options")->setVisible(show_options_btn); - getChild<LLLayoutPanel>("lp2")->setVisible(!show_options_btn); - - if (is_place_info_visible) - { - mShowOnMapBtn->setEnabled(have_3d_pos); - - if (is_agent_place_info_visible) - { - // We don't need to teleport to the current location - // so check if the location is not within the current parcel. - mTeleportBtn->setEnabled(have_3d_pos && - !LLViewerParcelMgr::getInstance()->inAgentParcel(mPosGlobal)); - } - else if (mPlaceInfoType == LANDMARK_INFO_TYPE || mPlaceInfoType == REMOTE_PLACE_INFO_TYPE) - { - mTeleportBtn->setEnabled(have_3d_pos); - } - } - else - { - if (mActivePanel) - mActivePanel->updateVerbs(); - } + bool is_place_info_visible; + + LLPanelPlaceInfo* panel = getCurrentInfoPanel(); + if (panel) + { + is_place_info_visible = panel->getVisible(); + } + else + { + is_place_info_visible = false; + } + + bool is_agent_place_info_visible = mPlaceInfoType == AGENT_INFO_TYPE; + bool is_create_landmark_visible = mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE; + + bool have_3d_pos = ! mPosGlobal.isExactlyZero(); + + mTeleportBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn); + mShowOnMapBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn); + mSaveBtn->setVisible(isLandmarkEditModeOn); + mCancelBtn->setVisible(isLandmarkEditModeOn); + mCloseBtn->setVisible(is_create_landmark_visible && !isLandmarkEditModeOn); + + bool show_options_btn = is_place_info_visible && !is_create_landmark_visible && !isLandmarkEditModeOn; + mOverflowBtn->setVisible(show_options_btn); + getChild<LLLayoutPanel>("lp_options")->setVisible(show_options_btn); + getChild<LLLayoutPanel>("lp2")->setVisible(!show_options_btn); + + if (is_place_info_visible) + { + mShowOnMapBtn->setEnabled(have_3d_pos); + + if (is_agent_place_info_visible) + { + // We don't need to teleport to the current location + // so check if the location is not within the current parcel. + mTeleportBtn->setEnabled(have_3d_pos && + !LLViewerParcelMgr::getInstance()->inAgentParcel(mPosGlobal)); + } + else if (mPlaceInfoType == LANDMARK_INFO_TYPE || mPlaceInfoType == REMOTE_PLACE_INFO_TYPE) + { + mTeleportBtn->setEnabled(have_3d_pos); + } + } + else + { + if (mActivePanel) + mActivePanel->updateVerbs(); + } } LLPanelPlaceInfo* LLPanelPlaces::getCurrentInfoPanel() { - if (mPlaceInfoType == AGENT_INFO_TYPE || - mPlaceInfoType == REMOTE_PLACE_INFO_TYPE || - mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE) - { - return mPlaceProfile; - } - else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE || - mPlaceInfoType == LANDMARK_INFO_TYPE || - mPlaceInfoType == LANDMARK_TAB_INFO_TYPE) - { - return mLandmarkInfo; - } - - return NULL; + if (mPlaceInfoType == AGENT_INFO_TYPE || + mPlaceInfoType == REMOTE_PLACE_INFO_TYPE || + mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE) + { + return mPlaceProfile; + } + else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE || + mPlaceInfoType == LANDMARK_INFO_TYPE || + mPlaceInfoType == LANDMARK_TAB_INFO_TYPE) + { + return mLandmarkInfo; + } + + return NULL; } static bool is_agent_in_selected_parcel(LLParcel* parcel) { - LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance(); + LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance(); - LLViewerRegion* region = parcel_mgr->getSelectionRegion(); - if (!region || !parcel) - return false; + LLViewerRegion* region = parcel_mgr->getSelectionRegion(); + if (!region || !parcel) + return false; - return region == gAgent.getRegion() && - parcel->getLocalID() == parcel_mgr->getAgentParcel()->getLocalID(); + return region == gAgent.getRegion() && + parcel->getLocalID() == parcel_mgr->getAgentParcel()->getLocalID(); } static void onSLURLBuilt(std::string& slurl) { - LLView::getWindow()->copyTextToClipboard(utf8str_to_wstring(slurl)); - - LLSD args; - args["SLURL"] = slurl; + LLView::getWindow()->copyTextToClipboard(utf8str_to_wstring(slurl)); + + LLSD args; + args["SLURL"] = slurl; - LLNotificationsUtil::add("CopySLURL", args); + LLNotificationsUtil::add("CopySLURL", args); } |