diff options
| author | Rider Linden <rider@lindenlab.com> | 2018-09-14 09:52:28 -0700 | 
|---|---|---|
| committer | Rider Linden <rider@lindenlab.com> | 2018-09-14 09:52:28 -0700 | 
| commit | 7c6ac0740dac946275ef3f904614688f4b73f850 (patch) | |
| tree | 18446d6a5346400ab2f6ac98fa394446b86156d3 | |
| parent | 3dd286064e253097af696068940afe009acc0b2e (diff) | |
SL-1556: Correctly identify when the selected parcel is in another region and display a message about cross region environments.
| -rw-r--r-- | indra/newview/llenvironment.cpp | 22 | ||||
| -rw-r--r-- | indra/newview/llfloaterland.cpp | 72 | ||||
| -rw-r--r-- | indra/newview/llfloaterregioninfo.cpp | 22 | ||||
| -rw-r--r-- | indra/newview/llpanelenvironment.cpp | 77 | ||||
| -rw-r--r-- | indra/newview/llpanelenvironment.h | 28 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/panel_region_environment.xml | 7 | 
6 files changed, 171 insertions, 57 deletions
| diff --git a/indra/newview/llenvironment.cpp b/indra/newview/llenvironment.cpp index 6981203e75..3b1990c850 100644 --- a/indra/newview/llenvironment.cpp +++ b/indra/newview/llenvironment.cpp @@ -1166,18 +1166,18 @@ void LLEnvironment::coroRequestEnvironment(S32 parcel_id, LLEnvironment::environ      LLSD result = httpAdapter->getAndSuspend(httpRequest, url);      // results that come back may contain the new settings -    LLSD notify; +//     LLSD notify;      LLSD httpResults = result["http_result"];      LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);      if (!status)      { -        LL_WARNS("WindlightCaps") << "Couldn't retrieve Windlight settings for " << ((parcel_id == INVALID_PARCEL_ID) ? ("region!") : ("parcel!")) << LL_ENDL; +        LL_WARNS("WindlightCaps") << "Couldn't retrieve environment settings for " << ((parcel_id == INVALID_PARCEL_ID) ? ("region!") : ("parcel!")) << LL_ENDL; -        std::stringstream msg; -        msg << status.toString() << " (Code " << status.toTerseString() << ")"; -        notify = LLSD::emptyMap(); -        notify["FAIL_REASON"] = msg.str(); +//         std::stringstream msg; +//         msg << status.toString() << " (Code " << status.toTerseString() << ")"; +//         notify = LLSD::emptyMap(); +//         notify["FAIL_REASON"] = msg.str();      }      else @@ -1190,11 +1190,11 @@ void LLEnvironment::coroRequestEnvironment(S32 parcel_id, LLEnvironment::environ          }      } -    if (!notify.isUndefined()) -    { -        LLNotificationsUtil::add("WLRegionApplyFail", notify); -        //LLEnvManagerNew::instance().onRegionSettingsApplyResponse(false); -    } +//     if (!notify.isUndefined()) +//     { +//         LLNotificationsUtil::add("WLRegionApplyFail", notify); +//         //LLEnvManagerNew::instance().onRegionSettingsApplyResponse(false); +//     }  }  void LLEnvironment::coroUpdateEnvironment(S32 parcel_id, S32 track_no, LLSettingsDay::ptr_t pday, LLUUID settings_asset, S32 day_length, S32 day_offset, LLEnvironment::environment_apply_fn apply) diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index a2886d5010..38ced18edf 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -155,10 +155,15 @@ public:      virtual LLParcel *  getParcel() override;      virtual bool        canEdit() override; +    virtual S32         getParcelId() override;  +  protected: +    virtual void        refreshFromSource() override; -    LLSafeHandle<LLParcelSelection>&	mParcel; +    bool                isSameRegion(); +    LLSafeHandle<LLParcelSelection> &   mParcel; +    S32                 mLastParcelId;  }; @@ -3248,9 +3253,10 @@ void LLPanelLandExperiences::refresh()  //========================================================================= -LLPanelLandEnvironment::LLPanelLandEnvironment(LLSafeHandle<LLParcelSelection>& parcelp): +LLPanelLandEnvironment::LLPanelLandEnvironment(LLParcelSelectionHandle& parcel) :      LLPanelEnvironmentInfo(), -    mParcel(parcelp) +    mParcel(parcel), +    mLastParcelId(INVALID_PARCEL_ID)  {  } @@ -3270,25 +3276,64 @@ void LLPanelLandEnvironment::refresh()      if (gDisconnected)          return; -    LLParcel *parcel = getParcel(); -    if (!parcel) +    if (!isSameRegion())      { -        LL_INFOS("ENVPANEL") << "No parcel selected." << LL_ENDL; +        setCrossRegion(true);          mCurrentEnvironment.reset(); -        mCurrentParcelId = INVALID_PARCEL_ID; +        mLastParcelId = INVALID_PARCEL_ID;          setControlsEnabled(false);          return;      } -    if (LLEnvironment::instance().isExtendedEnvironmentEnabled() && ((!mCurrentEnvironment) || (mCurrentEnvironment->mParcelId != parcel->getLocalID()))) +    if (mLastParcelId != getParcelId()) +    { +        mCurrentEnvironment.reset(); +    } + +    if (!mCurrentEnvironment)      { -        mCurrentParcelId = parcel->getLocalID();          refreshFromSource();          return;      }      LLPanelEnvironmentInfo::refresh(); +    getChild<LLUICtrl>(PNL_ENVIRONMENT_ALTITUDES)->setVisible(FALSE); +} + +void LLPanelLandEnvironment::refreshFromSource() +{ +    LLParcel *parcel = getParcel(); + +    if (!parcel) +    { +        setNoSelection(true); +        setControlsEnabled(false); +        return; +    } +    setNoSelection(false); +    if (isSameRegion()) +    { +        setCrossRegion(false); + +        LLEnvironment::instance().requestParcel(parcel->getLocalID(), +            [this](S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envifo) { mLastParcelId = parcel_id; onEnvironmentReceived(parcel_id, envifo); }); +    } +    else +    { +        setCrossRegion(true); +        mCurrentEnvironment.reset(); +        mLastParcelId = INVALID_PARCEL_ID; +        setControlsEnabled(false); +    } +} + + +bool LLPanelLandEnvironment::isSameRegion() +{ +    LLViewerRegion* regionp = LLViewerParcelMgr::instance().getSelectionRegion(); + +    return (!regionp || (regionp->getRegionID() == gAgent.getRegion()->getRegionID()));  }  LLParcel *LLPanelLandEnvironment::getParcel() @@ -3304,3 +3349,12 @@ bool LLPanelLandEnvironment::canEdit()          return false;      return LLEnvironment::instance().canAgentUpdateParcelEnvironment(parcel);  } + +S32 LLPanelLandEnvironment::getParcelId()  +{ +    LLParcel *parcel = getParcel(); +    if (!parcel) +        return INVALID_PARCEL_ID; + +    return parcel->getLocalID(); +} diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index d13190254f..6aa35b40b6 100644 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -192,11 +192,14 @@ public:      virtual BOOL        postBuild() override; +    virtual S32         getParcelId() override { return INVALID_PARCEL_ID; } +  protected:      static const U32    DIRTY_FLAG_OVERRIDE;      virtual void        doApply() override; +    virtual void        refreshFromSource() override;      bool                doUpdateEstate(const LLSD& notification, const LLSD& response); @@ -3418,6 +3421,19 @@ void LLPanelRegionEnvironment::refresh()  bool LLPanelRegionEnvironment::refreshFromRegion(LLViewerRegion* region)  { +    if (!region) +    { +        setNoSelection(true); +        setControlsEnabled(false); +    } +    setNoSelection(false); + +    if (gAgent.getRegion()->getRegionID() != region->getRegionID()) +    { +        setCrossRegion(true); +    } +    setCrossRegion(false); +              refreshFromSource();      return true;  } @@ -3429,6 +3445,12 @@ void LLPanelRegionEnvironment::refreshFromEstate()      mAllowOverride = estate_info.getAllowEnvironmentOverride();  } +void LLPanelRegionEnvironment::refreshFromSource() +{ +    LLEnvironment::instance().requestRegion( +        [this](S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envifo) {onEnvironmentReceived(parcel_id, envifo); }); +} +  void LLPanelRegionEnvironment::doApply()  {      LLPanelEnvironmentInfo::doApply(); diff --git a/indra/newview/llpanelenvironment.cpp b/indra/newview/llpanelenvironment.cpp index 5f4bb7ccb8..8d7ec48d63 100644 --- a/indra/newview/llpanelenvironment.cpp +++ b/indra/newview/llpanelenvironment.cpp @@ -46,6 +46,7 @@  #include "llappviewer.h"  #include "llcallbacklist.h" +#include "llviewerparcelmgr.h"  //=========================================================================  namespace  @@ -72,11 +73,15 @@ const std::string LLPanelEnvironmentInfo::PNL_SETTINGS("pnl_environment_config")  const std::string LLPanelEnvironmentInfo::PNL_ENVIRONMENT_ALTITUDES("pnl_environment_altitudes");  const std::string LLPanelEnvironmentInfo::PNL_BUTTONS("pnl_environment_buttons");  const std::string LLPanelEnvironmentInfo::PNL_DISABLED("pnl_environment_disabled"); +const std::string LLPanelEnvironmentInfo::TXT_DISABLED("txt_environment_disabled");  const std::string LLPanelEnvironmentInfo::STR_LABEL_USEDEFAULT("str_label_use_default");  const std::string LLPanelEnvironmentInfo::STR_LABEL_USEREGION("str_label_use_region");  const std::string LLPanelEnvironmentInfo::STR_LABEL_UNKNOWNINV("str_unknow_inventory");  const std::string LLPanelEnvironmentInfo::STR_ALTITUDE_DESCRIPTION("str_altitude_desription"); +const std::string LLPanelEnvironmentInfo::STR_NO_PARCEL("str_no_parcel"); +const std::string LLPanelEnvironmentInfo::STR_CROSS_REGION("str_cross_region"); +const std::string LLPanelEnvironmentInfo::STR_LEGACY("str_legacy");  const U32 LLPanelEnvironmentInfo::DIRTY_FLAG_DAYCYCLE(0x01 << 0);  const U32 LLPanelEnvironmentInfo::DIRTY_FLAG_DAYLENGTH(0x01 << 1); @@ -111,8 +116,9 @@ const std::string alt_labels[] = {  //=========================================================================  LLPanelEnvironmentInfo::LLPanelEnvironmentInfo():       mCurrentEnvironment(), -    mCurrentParcelId(INVALID_PARCEL_ID),      mDirtyFlag(0), +    mCrossRegion(false), +    mNoSelection(false),      mSettingsFloater(),      mEditFloater()  { @@ -173,7 +179,8 @@ void LLPanelEnvironmentInfo::refresh()      if (gDisconnected)          return; -    setControlsEnabled(canEdit()); +    if (!setControlsEnabled(canEdit())) +        return;      if (!mCurrentEnvironment)      { @@ -235,12 +242,6 @@ void LLPanelEnvironmentInfo::refresh()  } -void LLPanelEnvironmentInfo::refreshFromSource() -{ -    LLEnvironment::instance().requestParcel(mCurrentParcelId,  -        [this](S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envifo) {onEnvironmentReceived(parcel_id, envifo); }); -} -  std::string LLPanelEnvironmentInfo::getInventoryNameForAssetId(LLUUID asset_id)   {      LLFloaterSettingsPicker *picker = getSettingsPicker(); @@ -284,7 +285,7 @@ LLFloaterEditExtDayCycle * LLPanelEnvironmentInfo::getEditFloater(bool create)      // Show the dialog      if (!editor && create)      { -        LLSD params(LLSDMap(LLFloaterEditExtDayCycle::KEY_EDIT_CONTEXT, (mCurrentParcelId == INVALID_PARCEL_ID) ? LLFloaterEditExtDayCycle::CONTEXT_REGION : LLFloaterEditExtDayCycle::CONTEXT_PARCEL) +        LLSD params(LLSDMap(LLFloaterEditExtDayCycle::KEY_EDIT_CONTEXT, isRegion() ? LLFloaterEditExtDayCycle::CONTEXT_REGION : LLFloaterEditExtDayCycle::CONTEXT_PARCEL)              (LLFloaterEditExtDayCycle::KEY_DAY_LENGTH, mCurrentEnvironment ? (S32)(mCurrentEnvironment->mDayLength.value()) : FOURHOURS));          editor = (LLFloaterEditExtDayCycle *)LLFloaterReg::getInstance(FLOATER_DAY_CYCLE_EDIT, params); @@ -324,12 +325,42 @@ void LLPanelEnvironmentInfo::updateEditFloater(const LLEnvironment::EnvironmentI      }  } -void LLPanelEnvironmentInfo::setControlsEnabled(bool enabled) +bool LLPanelEnvironmentInfo::setControlsEnabled(bool enabled)  { -    S32 rdo_selection = getChild<LLRadioGroup>(RDG_ENVIRONMENT_SELECT)->getSelectedIndex(); +    bool is_unavailable(false);      bool is_legacy = (mCurrentEnvironment) ? mCurrentEnvironment->mIsLegacy : true; -    bool is_unavailable = (is_legacy && (!mCurrentEnvironment || (mCurrentEnvironment->mParcelId != INVALID_PARCEL_ID))); +    if (!LLEnvironment::instance().isExtendedEnvironmentEnabled() && !isRegion()) +    { +        is_unavailable = true; +        getChild<LLTextBox>(TXT_DISABLED)->setText(getString(STR_LEGACY)); +    } +    else if (mNoSelection) +    { +        is_unavailable = true; +        getChild<LLTextBox>(TXT_DISABLED)->setText(getString(STR_NO_PARCEL)); +    } +    else if (mCrossRegion) +    { +        is_unavailable = true; +        getChild<LLTextBox>(TXT_DISABLED)->setText(getString(STR_CROSS_REGION)); +    } + +    if (is_unavailable) +    { +        getChild<LLUICtrl>(PNL_SETTINGS)->setVisible(false); +        getChild<LLUICtrl>(PNL_BUTTONS)->setVisible(false); +        getChild<LLUICtrl>(PNL_DISABLED)->setVisible(true); + +        updateEditFloater(mCurrentEnvironment); + +        return false; +    } +    getChild<LLUICtrl>(PNL_SETTINGS)->setVisible(true); +    getChild<LLUICtrl>(PNL_BUTTONS)->setVisible(true); +    getChild<LLUICtrl>(PNL_DISABLED)->setVisible(false); + +    S32 rdo_selection = getChild<LLRadioGroup>(RDG_ENVIRONMENT_SELECT)->getSelectedIndex();      getChild<LLUICtrl>(RDG_ENVIRONMENT_SELECT)->setEnabled(enabled);      getChild<LLUICtrl>(RDO_USEDEFAULT)->setEnabled(enabled && !is_legacy); @@ -340,15 +371,11 @@ void LLPanelEnvironmentInfo::setControlsEnabled(bool enabled)      getChild<LLUICtrl>(BTN_EDIT)->setEnabled(enabled);      getChild<LLUICtrl>(SLD_DAYLENGTH)->setEnabled(enabled && (rdo_selection != 0) && !is_legacy);      getChild<LLUICtrl>(SLD_DAYOFFSET)->setEnabled(enabled && (rdo_selection != 0) && !is_legacy); -    getChild<LLUICtrl>(CHK_ALLOWOVERRIDE)->setEnabled(enabled && (mCurrentParcelId == INVALID_PARCEL_ID) && !is_legacy); +    getChild<LLUICtrl>(CHK_ALLOWOVERRIDE)->setEnabled(enabled && isRegion() && !is_legacy);      getChild<LLUICtrl>(BTN_APPLY)->setEnabled(enabled && (mDirtyFlag != 0));      getChild<LLUICtrl>(BTN_CANCEL)->setEnabled(enabled && (mDirtyFlag != 0)); -    getChild<LLUICtrl>(PNL_SETTINGS)->setVisible(!is_unavailable); -    getChild<LLUICtrl>(PNL_BUTTONS)->setVisible(!is_unavailable); -    getChild<LLUICtrl>(PNL_DISABLED)->setVisible(is_unavailable); - -    updateEditFloater(mCurrentEnvironment); +    return true;  }  void LLPanelEnvironmentInfo::setApplyProgress(bool started) @@ -517,7 +544,7 @@ void LLPanelEnvironmentInfo::onBtnEdit()      LLFloaterEditExtDayCycle *dayeditor = getEditFloater(); -    LLSD params(LLSDMap(LLFloaterEditExtDayCycle::KEY_EDIT_CONTEXT, (mCurrentParcelId == INVALID_PARCEL_ID) ? LLFloaterEditExtDayCycle::VALUE_CONTEXT_REGION : LLFloaterEditExtDayCycle::VALUE_CONTEXT_REGION) +    LLSD params(LLSDMap(LLFloaterEditExtDayCycle::KEY_EDIT_CONTEXT, isRegion() ? LLFloaterEditExtDayCycle::VALUE_CONTEXT_REGION : LLFloaterEditExtDayCycle::VALUE_CONTEXT_REGION)              (LLFloaterEditExtDayCycle::KEY_DAY_LENGTH,  mCurrentEnvironment ? (S32)(mCurrentEnvironment->mDayLength.value()) : FOURHOURS)              (LLFloaterEditExtDayCycle::KEY_CANMOD,      LLSD::Boolean(true))); @@ -543,24 +570,26 @@ void LLPanelEnvironmentInfo::onBtnSelect()  void LLPanelEnvironmentInfo::doApply()  { +    S32 parcel_id = getParcelId(); +      if (getIsDirtyFlag(DIRTY_FLAG_MASK))      {          S32 rdo_selection = getChild<LLRadioGroup>(RDG_ENVIRONMENT_SELECT)->getSelectedIndex();          if (rdo_selection == 0)          { -            LLEnvironment::instance().resetParcel(mCurrentParcelId, +            LLEnvironment::instance().resetParcel(parcel_id,                  [this](S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envifo) {onEnvironmentReceived(parcel_id, envifo); });          }          else if (rdo_selection == 1)          { -            LLEnvironment::instance().updateParcel(mCurrentParcelId,  +            LLEnvironment::instance().updateParcel(parcel_id,                  mCurrentEnvironment->mDayCycle->getAssetId(), mCurrentEnvironment->mDayLength.value(), mCurrentEnvironment->mDayOffset.value(),                  [this](S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envifo) {onEnvironmentReceived(parcel_id, envifo); });          }          else          { -            LLEnvironment::instance().updateParcel(mCurrentParcelId,  +            LLEnvironment::instance().updateParcel(parcel_id,                  mCurrentEnvironment->mDayCycle, mCurrentEnvironment->mDayLength.value(), mCurrentEnvironment->mDayOffset.value(),                   [this](S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envifo) {onEnvironmentReceived(parcel_id, envifo); });          } @@ -657,9 +686,9 @@ void LLPanelEnvironmentInfo::onPickerAssetDownloaded(LLSettingsBase::ptr_t setti  void LLPanelEnvironmentInfo::onEnvironmentReceived(S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envifo)  {   -    if (parcel_id != mCurrentParcelId) +    if (parcel_id != getParcelId())      { -        LL_WARNS("ENVPANEL") << "Have environment for parcel " << parcel_id << " expecting " << mCurrentParcelId << ". Discarding." << LL_ENDL; +        LL_WARNS("ENVPANEL") << "Have environment for parcel " << parcel_id << " expecting " << getParcelId() << ". Discarding." << LL_ENDL;          return;      }      mCurrentEnvironment = envifo; diff --git a/indra/newview/llpanelenvironment.h b/indra/newview/llpanelenvironment.h index c18092e2e5..fdf0fe46a7 100644 --- a/indra/newview/llpanelenvironment.h +++ b/indra/newview/llpanelenvironment.h @@ -52,12 +52,10 @@ public:      virtual void                refresh() override; -    S32                         getCurrentParcelId() const          { return mCurrentParcelId; } -    void                        setCurrentParcelId(S32 parcel_id)   { mCurrentParcelId = parcel_id; } -      virtual bool                isRegion() const = 0;      virtual LLParcel *          getParcel() = 0;      virtual bool                canEdit() = 0; +    virtual S32                 getParcelId() = 0;  protected:      LOG_CLASS(LLPanelEnvironmentInfo); @@ -80,12 +78,15 @@ protected:      static const std::string    PNL_ENVIRONMENT_ALTITUDES;      static const std::string    PNL_BUTTONS;      static const std::string    PNL_DISABLED; - +    static const std::string    TXT_DISABLED;      static const std::string    STR_LABEL_USEDEFAULT;      static const std::string    STR_LABEL_USEREGION;      static const std::string    STR_LABEL_UNKNOWNINV;      static const std::string    STR_ALTITUDE_DESCRIPTION; +    static const std::string    STR_NO_PARCEL; +    static const std::string    STR_CROSS_REGION; +    static const std::string    STR_LEGACY;      static const U32            DIRTY_FLAG_DAYCYCLE;      static const U32            DIRTY_FLAG_DAYLENGTH; @@ -94,7 +95,7 @@ protected:      static const U32            DIRTY_FLAG_MASK; -    void                        setControlsEnabled(bool enabled); +    bool setControlsEnabled(bool enabled);      void                        setApplyProgress(bool started);      void                        setDirtyFlag(U32 flag);      void                        clearDirtyFlag(U32 flag); @@ -121,7 +122,7 @@ protected:      void                        onPickerAssetDownloaded(LLSettingsBase::ptr_t settings);      void                        onEnvironmentReceived(S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envifo); -    void                        refreshFromSource(); +    virtual void                refreshFromSource() = 0;      std::string                 getInventoryNameForAssetId(LLUUID asset_id); @@ -129,8 +130,10 @@ protected:      LLFloaterEditExtDayCycle *  getEditFloater(bool create = true);      void                        updateEditFloater(const LLEnvironment::EnvironmentInfo::ptr_t &nextenv); +    void                        setCrossRegion(bool val) { mCrossRegion = val; } +    void                        setNoSelection(bool val) { mNoSelection = val; } +      LLEnvironment::EnvironmentInfo::ptr_t   mCurrentEnvironment; -    S32                                     mCurrentParcelId;      class AltitudeData      { @@ -156,9 +159,12 @@ private:      typedef boost::signals2::connection connection_t; -    connection_t                mCommitConnection; -    LLHandle<LLFloater>         mSettingsFloater; -    LLHandle<LLFloater>         mEditFloater; -    S32                         mDirtyFlag; +    connection_t                    mCommitConnection; +    LLHandle<LLFloater>             mSettingsFloater; +    LLHandle<LLFloater>             mEditFloater; +    S32                             mDirtyFlag; +    bool                            mCrossRegion; +    bool                            mNoSelection; +  };  #endif // LL_LLPANELEXPERIENCES_H diff --git a/indra/newview/skins/default/xui/en/panel_region_environment.xml b/indra/newview/skins/default/xui/en/panel_region_environment.xml index 3b77744f1b..3ce0d7a2ef 100644 --- a/indra/newview/skins/default/xui/en/panel_region_environment.xml +++ b/indra/newview/skins/default/xui/en/panel_region_environment.xml @@ -13,7 +13,9 @@      <string name="str_label_use_region">Use Region Settings</string>      <string name="str_unknow_inventory">Unknown</string>      <string name="str_altitude_desription">Sky [INDEX]([ALTITUDE]m)</string> - +    <string name="str_no_parcel">No parcel is selected. Environmental settings are disabled.</string> +    <string name="str_cross_region">Environmental settings are not available across region boundries.</string> +    <string name="str_legacy">Environmental settings are not available on this region.</string>      <layout_stack               width="530"              height="367" @@ -29,8 +31,9 @@                              halign="center"                              valign="top"                              top_pad="40" +                            name="txt_environment_disabled"                              text_color="white"> -No parcel is selected. Environmental settings are disabled. +            ...              </text>          </layout_panel>          <layout_panel  | 
