diff options
Diffstat (limited to 'indra/newview/llpanelpermissions.cpp')
-rw-r--r-- | indra/newview/llpanelpermissions.cpp | 1028 |
1 files changed, 1028 insertions, 0 deletions
diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp new file mode 100644 index 0000000000..9e23b977d9 --- /dev/null +++ b/indra/newview/llpanelpermissions.cpp @@ -0,0 +1,1028 @@ +/** + * @file llpanelpermissions.cpp + * @brief LLPanelPermissions class implementation + * + * Copyright (c) 2002-$CurrentYear$, Linden Research, Inc. + * $License$ + */ + +//***************************************************************************** +// +// This class represents the panel in the build view for +// viewing/editing object names, owners, permissions, etc. +// +//***************************************************************************** + +#include "llviewerprecompiledheaders.h" + +#include "llpanelpermissions.h" + +#include "lluuid.h" +#include "llpermissions.h" +#include "llcategory.h" +#include "llclickaction.h" +#include "llfocusmgr.h" +#include "llstring.h" + +#include "llviewerwindow.h" +#include "llresmgr.h" +#include "lltextbox.h" +#include "llbutton.h" +#include "llcheckboxctrl.h" +#include "llviewerobject.h" +#include "llselectmgr.h" +#include "llagent.h" +#include "llstatusbar.h" // for getBalance() +#include "lllineeditor.h" +#include "llradiogroup.h" +#include "llcombobox.h" +#include "llfloateravatarinfo.h" +#include "lluiconstants.h" +#include "lldbstrings.h" +#include "llfloatergroupinfo.h" +#include "llfloatergroups.h" +#include "llnamebox.h" +#include "llviewercontrol.h" +#include "llvieweruictrlfactory.h" +#include "roles_constants.h" + +///---------------------------------------------------------------------------- +/// Class llpanelpermissions +///---------------------------------------------------------------------------- + +// Default constructor + +BOOL LLPanelPermissions::postBuild() +{ + this->childSetCommitCallback("Object Name",LLPanelPermissions::onCommitName,this); + this->childSetPrevalidate("Object Name",LLLineEditor::prevalidatePrintableNotPipe); + this->childSetCommitCallback("Object Description",LLPanelPermissions::onCommitDesc,this); + this->childSetPrevalidate("Object Description",LLLineEditor::prevalidatePrintableNotPipe); + + + this->childSetAction("button owner profile",LLPanelPermissions::onClickOwner,this); + this->childSetAction("button creator profile",LLPanelPermissions::onClickCreator,this); + + this->childSetAction("button set group",LLPanelPermissions::onClickGroup,this); + + this->childSetCommitCallback("checkbox share with group",LLPanelPermissions::onCommitGroupShare,this); + + this->childSetAction("button deed",LLPanelPermissions::onClickDeedToGroup,this); + + this->childSetCommitCallback("checkbox allow everyone move",LLPanelPermissions::onCommitEveryoneMove,this); + + this->childSetCommitCallback("checkbox allow everyone copy",LLPanelPermissions::onCommitEveryoneCopy,this); + + this->childSetCommitCallback("checkbox for sale",LLPanelPermissions::onCommitSaleInfo,this); + + this->childSetCommitCallback("EdCost",LLPanelPermissions::onCommitSaleInfo,this); + this->childSetPrevalidate("EdCost",LLLineEditor::prevalidateNonNegativeS32); + + this->childSetCommitCallback("sale type",LLPanelPermissions::onCommitSaleType,this); + + this->childSetCommitCallback("checkbox next owner can modify",LLPanelPermissions::onCommitNextOwnerModify,this); + this->childSetCommitCallback("checkbox next owner can copy",LLPanelPermissions::onCommitNextOwnerCopy,this); + this->childSetCommitCallback("checkbox next owner can transfer",LLPanelPermissions::onCommitNextOwnerTransfer,this); + this->childSetCommitCallback("clickaction",LLPanelPermissions::onCommitClickAction,this); + + LLTextBox* LabelGroupNameRectProxy = gUICtrlFactory->getTextBoxByName(this,"Group Name Proxy"); + if(LabelGroupNameRectProxy ) + { + mLabelGroupName = new LLNameBox("Group Name",LabelGroupNameRectProxy->getRect()); + addChild(mLabelGroupName); + }else + mLabelGroupName = NULL; + + return TRUE; +} + +LLPanelPermissions::LLPanelPermissions(const std::string& title) : + LLPanel(title) +{ + setMouseOpaque(FALSE); +} + +// Destroys the object +LLPanelPermissions::~LLPanelPermissions() +{ + // base class will take care of everything +} + + +void LLPanelPermissions::refresh() +{ + + LLButton* BtnDeedToGroup = gUICtrlFactory->getButtonByName(this,"button deed"); + if(BtnDeedToGroup) + { + LLString deedText; + if (gSavedSettings.getWarning("DeedObject")) + { + deedText = this->childGetText("text deed continued"); + } + else + { + deedText = this->childGetText("text deed"); + } + BtnDeedToGroup->setLabelSelected(deedText); + BtnDeedToGroup->setLabelUnselected(deedText); + } + BOOL root_selected = TRUE; + LLSelectNode* nodep = gSelectMgr->getFirstRootNode(); + S32 object_count = gSelectMgr->getRootObjectCount(); + if(!nodep || 0 == object_count) + { + nodep = gSelectMgr->getFirstNode(); + object_count = gSelectMgr->getObjectCount(); + root_selected = FALSE; + } + + BOOL attachment_selected = gSelectMgr->selectionIsAttachment(); + + LLViewerObject* objectp = NULL; + if(nodep) objectp = nodep->getObject(); + if(!nodep || !objectp || attachment_selected) + { + // ...nothing selected + childSetEnabled("perm_modify",false); + childSetText("perm_modify",""); + + childSetEnabled("Creator:",false); + childSetText("Creator Name",""); + childSetEnabled("Creator Name",false); + childSetEnabled("button creator profile",false); + + childSetEnabled("Owner:",false); + childSetText("Owner Name",""); + childSetEnabled("Owner Name",false); + childSetEnabled("button owner profile",false); + + childSetEnabled("Group:",false); + childSetText("Group Name",""); + childSetEnabled("Group Name",false); + childSetEnabled("button set group",false); + + childSetText("Object Name",""); + childSetEnabled("Object Name",false); + childSetEnabled("Name:",false); + childSetText("Group Name",""); + childSetEnabled("Group Name",false); + childSetEnabled("Description:",false); + childSetText("Object Description",""); + childSetEnabled("Object Description",false); + + childSetText("prim info",""); + childSetEnabled("prim info",false); + + childSetEnabled("Permissions:",false); + + childSetValue("checkbox share with group",FALSE); + childSetEnabled("checkbox share with group",false); + childSetEnabled("button deed",false); + + childSetValue("checkbox allow everyone move",FALSE); + childSetEnabled("checkbox allow everyone move",false); + childSetValue("checkbox allow everyone copy",FALSE); + childSetEnabled("checkbox allow everyone copy",false); + + //Next owner can: + childSetEnabled("Next owner can:",false); + childSetValue("checkbox next owner can modify",FALSE); + childSetEnabled("checkbox next owner can modify",false); + childSetValue("checkbox next owner can copy",FALSE); + childSetEnabled("checkbox next owner can copy",false); + childSetValue("checkbox next owner can transfer",FALSE); + childSetEnabled("checkbox next owner can transfer",false); + + //checkbox for sale + childSetValue("checkbox for sale",FALSE); + childSetEnabled("checkbox for sale",false); + + LLRadioGroup* RadioSaleType = gUICtrlFactory->getRadioGroupByName(this,"sale type"); + if(RadioSaleType) + { + RadioSaleType->setSelectedIndex(-1); + RadioSaleType->setEnabled(FALSE); + } + + childSetEnabled("Price: L$",false); + childSetText("EdCost",false); + childSetEnabled("EdCost",false); + + childSetEnabled("label click action",false); + LLComboBox* ComboClickAction = gUICtrlFactory->getComboBoxByName(this,"clickaction"); + if(ComboClickAction) + { + ComboClickAction->setEnabled(FALSE); + ComboClickAction->clear(); + } + childSetVisible("B:",false); + childSetVisible("O:",false); + childSetVisible("G:",false); + childSetVisible("E:",false); + childSetVisible("N:",false); + childSetVisible("F:",false); + + return; + } + + // figure out a few variables + BOOL is_one_object = (object_count == 1); + + // BUG: fails if a root and non-root are both single-selected. + BOOL is_perm_modify = (gSelectMgr->getFirstRootNode() + && gSelectMgr->selectGetRootsModify()) + || gSelectMgr->selectGetModify(); + const LLView* keyboard_focus_view = gFocusMgr.getKeyboardFocus(); + S32 string_index = 0; + LLString MODIFY_INFO_STRINGS[] = + { + childGetText("text modify info 1"), + childGetText("text modify info 2"), + childGetText("text modify info 3"), + childGetText("text modify info 4") + }; + if(!is_perm_modify) + { + string_index += 2; + } + if(!is_one_object) + { + ++string_index; + } + childSetEnabled("perm_modify",true); + childSetText("perm_modify",MODIFY_INFO_STRINGS[string_index]); + + childSetEnabled("Permissions:",true); + + // Update creator text field + childSetEnabled("Creator:",true); + BOOL creators_identical; + LLString creator_name; + creators_identical = gSelectMgr->selectGetCreator(mCreatorID, + creator_name); + + childSetText("Creator Name",creator_name); + childSetEnabled("Creator Name",TRUE); + childSetEnabled("button creator profile", creators_identical && mCreatorID.notNull() ); + + // Update owner text field + childSetEnabled("Owner:",true); + + BOOL owners_identical; + LLString owner_name; + owners_identical = gSelectMgr->selectGetOwner(mOwnerID, owner_name); + +// llinfos << "owners_identical " << (owners_identical ? "TRUE": "FALSE") << llendl; + + if (mOwnerID.isNull()) + { + if(gSelectMgr->selectIsGroupOwned()) + { + // Group owned already displayed by selectGetOwner + } + else + { + // Display last owner if public + LLString last_owner_name; + gSelectMgr->selectGetLastOwner(mLastOwnerID, last_owner_name); + + // It should never happen that the last owner is null and the owner + // is null, but it seems to be a bug in the simulator right now. JC + if (!mLastOwnerID.isNull() && !last_owner_name.empty()) + { + owner_name.append(", last "); + owner_name.append( last_owner_name ); + } + } + } + + childSetText("Owner Name",owner_name); + childSetEnabled("Owner Name",TRUE); + childSetEnabled("button owner profile",owners_identical && (mOwnerID.notNull() || gSelectMgr->selectIsGroupOwned())); + + // update group text field + childSetEnabled("Group:",true); + LLUUID group_id; + BOOL groups_identical = gSelectMgr->selectGetGroup(group_id); + if (groups_identical) + { + if(mLabelGroupName) + { + mLabelGroupName->setNameID(group_id, TRUE); + mLabelGroupName->setEnabled(TRUE); + } + } + childSetEnabled("button set group",owners_identical && (mOwnerID == gAgent.getID())); + + // figure out the contents of the name, description, & category + BOOL edit_name_desc = FALSE; + if(is_one_object && objectp->permModify()) + { + edit_name_desc = TRUE; + } + if(is_one_object) + { + childSetEnabled("Name:",true); + LLLineEditor* LineEditorObjectName = gUICtrlFactory->getLineEditorByName(this,"Object Name"); + if(keyboard_focus_view != LineEditorObjectName) + { + childSetText("Object Name",nodep->mName); + } + + childSetEnabled("Description:",true); + LLLineEditor* LineEditorObjectDesc = gUICtrlFactory->getLineEditorByName(this,"Object Description"); + if(LineEditorObjectDesc) + { + if(keyboard_focus_view != LineEditorObjectDesc) + { + LineEditorObjectDesc->setText(nodep->mDescription); + } + } + } + + if(edit_name_desc) + { + childSetEnabled("Object Name",true); + childSetEnabled("Object Description",true); + } + else + { + childSetEnabled("Object Name",false); + childSetEnabled("Object Description",false); + } + + + // Pre-compute object info string + S32 prim_count = gSelectMgr->getObjectCount(); + S32 obj_count = gSelectMgr->getRootObjectCount(); + + LLString object_info_string; + if (1 == obj_count) + { + object_info_string.assign("1 Object, "); + } + else + { + char buffer[MAX_STRING]; + sprintf(buffer, "%d Objects, ", obj_count); + object_info_string.assign(buffer); + } + if (1 == prim_count) + { + object_info_string.append("1 Primitive"); + } + else + { + char buffer[MAX_STRING]; + sprintf(buffer, "%d Primitives", prim_count); + object_info_string.append(buffer); + } + childSetText("prim info",object_info_string); + childSetEnabled("prim info",true); + + S32 price; + BOOL is_for_sale = gSelectMgr->selectIsForSale(price); + if (!is_for_sale) + { + price = DEFAULT_PRICE; + } + + BOOL self_owned = (gAgent.getID() == mOwnerID); + BOOL group_owned = gSelectMgr->selectIsGroupOwned() ; + BOOL public_owned = (mOwnerID.isNull() && !gSelectMgr->selectIsGroupOwned()); + BOOL can_transfer = gSelectMgr->selectGetRootsTransfer(); + BOOL can_copy = gSelectMgr->selectGetRootsCopy(); + + if(!owners_identical) + { + childSetEnabled("Price: L$",false); + childSetText("EdCost",""); + childSetEnabled("EdCost",false); + } + else if(self_owned || (group_owned && gAgent.hasPowerInGroup(group_id,GP_OBJECT_SET_SALE))) + { + LLLineEditor* EditPrice = gUICtrlFactory->getLineEditorByName(this,"EdCost"); + if(keyboard_focus_view != EditPrice) + { + childSetText("EdCost",llformat("%d",price)); + } + if(is_for_sale && is_one_object && can_transfer) + { + childSetEnabled("Price: L$",true); + childSetEnabled("EdCost",true); + } + else + { + childSetEnabled("Price: L$",false); + childSetEnabled("EdCost",false); + } + } + else if(!public_owned) + { + // ...someone, not you, owns it + childSetEnabled("Price: L$",false); + childSetText("EdCost",llformat("%d",price)); + childSetEnabled("EdCost",false); + } + else + { + // ...public object + childSetEnabled("Price: L$",false); + childSetText("EdCost",""); + childSetEnabled("EdCost",false); + } + + // Enable and disable the permissions checkboxes + // based on who owns the object. + // TODO: Creator permissions + + BOOL valid_base_perms = FALSE; + BOOL valid_owner_perms = FALSE; + BOOL valid_group_perms = FALSE; + BOOL valid_everyone_perms = FALSE; + BOOL valid_next_perms = FALSE; + + U32 base_mask_on; + U32 base_mask_off; + U32 owner_mask_on; + U32 owner_mask_off; + U32 group_mask_on; + U32 group_mask_off; + U32 everyone_mask_on; + U32 everyone_mask_off; + U32 next_owner_mask_on = 0; + U32 next_owner_mask_off = 0; + + valid_base_perms = gSelectMgr->selectGetPerm(PERM_BASE, + &base_mask_on, + &base_mask_off); + + valid_owner_perms = gSelectMgr->selectGetPerm(PERM_OWNER, + &owner_mask_on, + &owner_mask_off); + + valid_group_perms = gSelectMgr->selectGetPerm(PERM_GROUP, + &group_mask_on, + &group_mask_off); + + valid_everyone_perms = gSelectMgr->selectGetPerm(PERM_EVERYONE, + &everyone_mask_on, + &everyone_mask_off); + + valid_next_perms = gSelectMgr->selectGetPerm(PERM_NEXT_OWNER, + &next_owner_mask_on, + &next_owner_mask_off); + + + if( gSavedSettings.getBOOL("DebugPermissions") ) + { + char perm_string[10]; + if (valid_base_perms) + { + + strcpy(perm_string, "B: "); + mask_to_string(base_mask_on, perm_string+3); + childSetText("B:",perm_string); + childSetVisible("B:",true); + + strcpy(perm_string, "O: "); + mask_to_string(owner_mask_on, perm_string+3); + childSetText("O:",perm_string); + childSetVisible("O:",true); + + strcpy(perm_string, "G: "); + mask_to_string(group_mask_on, perm_string+3); + childSetText("G:",perm_string); + childSetVisible("G:",true); + + strcpy(perm_string, "E: "); + mask_to_string(everyone_mask_on, perm_string+3); + childSetText("E:",perm_string); + childSetVisible("E:",true); + + strcpy(perm_string, "N: "); + mask_to_string(next_owner_mask_on, perm_string+3); + childSetText("N:",perm_string); + childSetVisible("N:",true); + } + strcpy(perm_string, "F: "); + U32 flag_mask = 0x0; + if (objectp->permMove()) + flag_mask |= PERM_MOVE; + if (objectp->permModify()) + flag_mask |= PERM_MODIFY; + if (objectp->permCopy()) + flag_mask |= PERM_COPY; + if (objectp->permTransfer()) + flag_mask |= PERM_TRANSFER; + mask_to_string(flag_mask, perm_string+3); + childSetText("F:",perm_string); + childSetVisible("F:",true); + } + else + { + childSetVisible("B:",false); + childSetVisible("O:",false); + childSetVisible("G:",false); + childSetVisible("E:",false); + childSetVisible("N:",false); + childSetVisible("F:",false); + } + + bool has_change_perm_ability = false; + bool has_change_sale_ability = false; + + if(valid_base_perms + && (self_owned + || (group_owned && gAgent.hasPowerInGroup(group_id, GP_OBJECT_MANIPULATE)))) + { + has_change_perm_ability = true; + } + if(valid_base_perms + && (self_owned + || (group_owned && gAgent.hasPowerInGroup(group_id, GP_OBJECT_SET_SALE)))) + { + has_change_sale_ability = true; + } + + if (!has_change_perm_ability && !has_change_sale_ability && !root_selected) + { + // XUI:translate + // ...must select root to choose permissions + childSetValue("perm_modify", "Must select entire object to set permissions."); + } + + if (has_change_perm_ability) + { + childSetEnabled("checkbox share with group",true); + childSetEnabled("checkbox allow everyone move",owner_mask_on & PERM_MOVE); + childSetEnabled("checkbox allow everyone copy",owner_mask_on & PERM_COPY && owner_mask_on & PERM_TRANSFER); + } + else + { + childSetEnabled("checkbox share with group", FALSE); + childSetEnabled("checkbox allow everyone move", FALSE); + childSetEnabled("checkbox allow everyone copy", FALSE); + } + + if (has_change_sale_ability && (owner_mask_on & PERM_TRANSFER)) + { + childSetEnabled("checkbox for sale", can_transfer || (!can_transfer && is_for_sale)); + childSetEnabled("sale type",is_for_sale && can_transfer); + + childSetEnabled("Next owner can:", TRUE); + childSetEnabled("checkbox next owner can modify",base_mask_on & PERM_MODIFY); + childSetEnabled("checkbox next owner can copy",base_mask_on & PERM_COPY); + childSetEnabled("checkbox next owner can transfer",next_owner_mask_on & PERM_COPY); + } + else + { + childSetEnabled("checkbox for sale",FALSE); + childSetEnabled("sale type",FALSE); + + childSetEnabled("Next owner can:",FALSE); + childSetEnabled("checkbox next owner can modify",FALSE); + childSetEnabled("checkbox next owner can copy",FALSE); + childSetEnabled("checkbox next owner can transfer",FALSE); + } + + if(valid_group_perms) + { + if((group_mask_on & PERM_COPY) && (group_mask_on & PERM_MODIFY) && (group_mask_on & PERM_MOVE)) + { + childSetValue("checkbox share with group",TRUE); + childSetTentative("checkbox share with group",FALSE); + childSetEnabled("button deed",gAgent.hasPowerInGroup(group_id, GP_OBJECT_DEED) && (owner_mask_on & PERM_TRANSFER) && !group_owned); + } + else if((group_mask_off & PERM_COPY) && (group_mask_off & PERM_MODIFY) && (group_mask_off & PERM_MOVE)) + { + childSetValue("checkbox share with group",FALSE); + childSetTentative("checkbox share with group",false); + childSetEnabled("button deed",false); + } + else + { + childSetValue("checkbox share with group",TRUE); + childSetTentative("checkbox share with group",true); + childSetEnabled("button deed",gAgent.hasPowerInGroup(group_id, GP_OBJECT_DEED) && (group_mask_on & PERM_MOVE) && (owner_mask_on & PERM_TRANSFER) && !group_owned); + } + } + + if(valid_everyone_perms) + { + // Move + if(everyone_mask_on & PERM_MOVE) + { + childSetValue("checkbox allow everyone move",TRUE); + childSetTentative("checkbox allow everyone move",false); + } + else if(everyone_mask_off & PERM_MOVE) + { + childSetValue("checkbox allow everyone move",FALSE); + childSetTentative("checkbox allow everyone move",false); + } + else + { + childSetValue("checkbox allow everyone move",TRUE); + childSetTentative("checkbox allow everyone move",true); + } + + // Copy == everyone can't copy + if(everyone_mask_on & PERM_COPY) + { + childSetValue("checkbox allow everyone copy",TRUE); + childSetTentative("checkbox allow everyone copy",!can_copy || !can_transfer); + } + else if(everyone_mask_off & PERM_COPY) + { + childSetValue("checkbox allow everyone copy",FALSE); + childSetTentative("checkbox allow everyone copy",false); + } + else + { + childSetValue("checkbox allow everyone copy",TRUE); + childSetTentative("checkbox allow everyone copy",true); + } + } + + if(valid_next_perms) + { + // Modify == next owner canot modify + if(next_owner_mask_on & PERM_MODIFY) + { + childSetValue("checkbox next owner can modify",TRUE); + childSetTentative("checkbox next owner can modify",false); + } + else if(next_owner_mask_off & PERM_MODIFY) + { + childSetValue("checkbox next owner can modify",FALSE); + childSetTentative("checkbox next owner can modify",false); + } + else + { + childSetValue("checkbox next owner can modify",TRUE); + childSetTentative("checkbox next owner can modify",true); + } + + // Copy == next owner cannot copy + if(next_owner_mask_on & PERM_COPY) + { + childSetValue("checkbox next owner can copy",TRUE); + childSetTentative("checkbox next owner can copy",!can_copy); + } + else if(next_owner_mask_off & PERM_COPY) + { + childSetValue("checkbox next owner can copy",FALSE); + childSetTentative("checkbox next owner can copy",FALSE); + } + else + { + childSetValue("checkbox next owner can copy",TRUE); + childSetTentative("checkbox next owner can copy",TRUE); + } + + // Transfer == next owner cannot transfer + if(next_owner_mask_on & PERM_TRANSFER) + { + childSetValue("checkbox next owner can transfer",TRUE); + childSetTentative("checkbox next owner can transfer",!can_transfer); + } + else if(next_owner_mask_off & PERM_TRANSFER) + { + childSetValue("checkbox next owner can transfer",FALSE); + childSetTentative("checkbox next owner can transfer",FALSE); + } + else + { + childSetValue("checkbox next owner can transfer",TRUE); + childSetTentative("checkbox next owner can transfer",TRUE); + } + } + + // reflect sale information + LLSaleInfo sale_info; + BOOL valid_sale_info = gSelectMgr->selectGetSaleInfo(sale_info); + LLSaleInfo::EForSale sale_type = sale_info.getSaleType(); + + LLRadioGroup* RadioSaleType = gUICtrlFactory->getRadioGroupByName(this,"sale type"); + if(RadioSaleType && valid_sale_info) + { + RadioSaleType->setSelectedIndex((S32)sale_type - 1); + } + + if (is_for_sale) + { + childSetValue("checkbox for sale",TRUE); + childSetTentative("checkbox for sale",!can_transfer || (!can_copy && sale_type == LLSaleInfo::FS_COPY)); + } + else + { + childSetValue("checkbox for sale",FALSE); + childSetTentative("checkbox for sale",false); + } + + // Click action (touch, sit, buy) + BOOL all_volume = gSelectMgr->selectionAllPCode( LL_PCODE_VOLUME ); + U8 click_action = 0; + if (gSelectMgr->selectionGetClickAction(&click_action)) + { + LLComboBox* ComboClickAction = gUICtrlFactory->getComboBoxByName(this,"clickaction"); + if(ComboClickAction) + { + ComboClickAction->setCurrentByIndex((S32)click_action); + } + } + childSetEnabled("label click action",is_perm_modify && all_volume); + childSetEnabled("clickaction",is_perm_modify && all_volume); +} + + +// static +void LLPanelPermissions::onClickClaim(void*) +{ + // try to claim ownership + gSelectMgr->sendOwner(gAgent.getID(), gAgent.getGroupID()); +} + +// static +void LLPanelPermissions::onClickRelease(void*) +{ + // try to release ownership + gSelectMgr->sendOwner(LLUUID::null, LLUUID::null); +} + +// static +void LLPanelPermissions::onClickCreator(void *data) +{ + LLPanelPermissions *self = (LLPanelPermissions *)data; + + LLFloaterAvatarInfo::showFromObject(self->mCreatorID); +} + +// static +void LLPanelPermissions::onClickOwner(void *data) +{ + LLPanelPermissions *self = (LLPanelPermissions *)data; + + if (gSelectMgr->selectIsGroupOwned()) + { + LLUUID group_id; + gSelectMgr->selectGetGroup(group_id); + LLFloaterGroupInfo::showFromUUID(group_id); + } + else + { + LLFloaterAvatarInfo::showFromObject(self->mOwnerID); + } +} + +void LLPanelPermissions::onClickGroup(void* data) +{ + LLUUID owner_id; + LLString name; + BOOL owners_identical = gSelectMgr->selectGetOwner(owner_id, name); + if(owners_identical && (owner_id == gAgent.getID())) + { + LLFloaterGroups* fg; + fg = LLFloaterGroups::show(gAgent.getID(), LLFloaterGroups::CHOOSE_ONE); + fg->setOkCallback( cbGroupID, data ); + } +} + +// static +void LLPanelPermissions::cbGroupID(LLUUID group_id, void* userdata) +{ + LLPanelPermissions* self = (LLPanelPermissions*)userdata; + if(self->mLabelGroupName) + { + self->mLabelGroupName->setNameID(group_id, TRUE); + } + gSelectMgr->sendGroup(group_id); +} + +void callback_deed_to_group(S32 option, void*) +{ + if (0 == option) + { + LLUUID group_id; + BOOL groups_identical = gSelectMgr->selectGetGroup(group_id); + if(groups_identical && (gAgent.hasPowerInGroup(group_id, GP_OBJECT_DEED))) + { + gSelectMgr->sendOwner(LLUUID::null, group_id, FALSE); +// gViewerStats->incStat(LLViewerStats::ST_RELEASE_COUNT); + } + } +} + +void LLPanelPermissions::onClickDeedToGroup(void* data) +{ + gViewerWindow->alertXml( "DeedObjectToGroup", + callback_deed_to_group, NULL); +} + +///---------------------------------------------------------------------------- +/// Permissions checkboxes +///---------------------------------------------------------------------------- + +// static +void LLPanelPermissions::onCommitPerm(LLUICtrl *ctrl, void *data, U8 field, U32 perm) +{ + LLViewerObject* object = gSelectMgr->getFirstRootObject(); + if(!object) return; + + // Checkbox will have toggled itself + // LLPanelPermissions* self = (LLPanelPermissions*)data; + LLCheckBoxCtrl *check = (LLCheckBoxCtrl *)ctrl; + BOOL new_state = check->get(); + + gSelectMgr->setObjectPermissions(field, new_state, perm); +} + +// static +void LLPanelPermissions::onCommitGroupShare(LLUICtrl *ctrl, void *data) +{ + onCommitPerm(ctrl, data, PERM_GROUP, PERM_MODIFY | PERM_MOVE | PERM_COPY); +} + +// static +void LLPanelPermissions::onCommitEveryoneMove(LLUICtrl *ctrl, void *data) +{ + onCommitPerm(ctrl, data, PERM_EVERYONE, PERM_MOVE); +} + + +// static +void LLPanelPermissions::onCommitEveryoneCopy(LLUICtrl *ctrl, void *data) +{ + onCommitPerm(ctrl, data, PERM_EVERYONE, PERM_COPY); +} + +// static +void LLPanelPermissions::onCommitNextOwnerModify(LLUICtrl* ctrl, void* data) +{ + //llinfos << "LLPanelPermissions::onCommitNextOwnerModify" << llendl; + onCommitPerm(ctrl, data, PERM_NEXT_OWNER, PERM_MODIFY); +} + +// static +void LLPanelPermissions::onCommitNextOwnerCopy(LLUICtrl* ctrl, void* data) +{ + //llinfos << "LLPanelPermissions::onCommitNextOwnerCopy" << llendl; + onCommitPerm(ctrl, data, PERM_NEXT_OWNER, PERM_COPY); +} + +// static +void LLPanelPermissions::onCommitNextOwnerTransfer(LLUICtrl* ctrl, void* data) +{ + //llinfos << "LLPanelPermissions::onCommitNextOwnerTransfer" << llendl; + onCommitPerm(ctrl, data, PERM_NEXT_OWNER, PERM_TRANSFER); +} + +// static +void LLPanelPermissions::onCommitName(LLUICtrl*, void* data) +{ + //llinfos << "LLPanelPermissions::onCommitName()" << llendl; + LLPanelPermissions* self = (LLPanelPermissions*)data; + LLLineEditor* tb = gUICtrlFactory->getLineEditorByName(self,"Object Name"); + if(tb) + { + gSelectMgr->setObjectName(tb->getText()); +// gSelectMgr->setObjectName(self->mLabelObjectName->getText()); + } +} + + +// static +void LLPanelPermissions::onCommitDesc(LLUICtrl*, void* data) +{ + //llinfos << "LLPanelPermissions::onCommitDesc()" << llendl; + LLPanelPermissions* self = (LLPanelPermissions*)data; + LLLineEditor* le = gUICtrlFactory->getLineEditorByName(self,"Object Description"); + if(le) + { + gSelectMgr->setObjectDescription(le->getText()); + } +} + +// static +void LLPanelPermissions::onCommitSaleInfo(LLUICtrl*, void* data) +{ + LLPanelPermissions* self = (LLPanelPermissions*)data; + self->setAllSaleInfo(); +} + +// static +void LLPanelPermissions::onCommitSaleType(LLUICtrl*, void* data) +{ + LLPanelPermissions* self = (LLPanelPermissions*)data; + self->setAllSaleInfo(); +} + +void LLPanelPermissions::setAllSaleInfo() +{ + llinfos << "LLPanelPermissions::setAllSaleInfo()" << llendl; + LLSaleInfo::EForSale sale_type = LLSaleInfo::FS_NOT; + + LLCheckBoxCtrl* mCheckPurchase = gUICtrlFactory->getCheckBoxByName(this,"checkbox for sale"); + + if(mCheckPurchase && mCheckPurchase->get()) + { + LLRadioGroup* RadioSaleType = gUICtrlFactory->getRadioGroupByName(this,"sale type"); + if(RadioSaleType) + { + switch(RadioSaleType->getSelectedIndex()) + { + case 0: + sale_type = LLSaleInfo::FS_ORIGINAL; + break; + case 1: + sale_type = LLSaleInfo::FS_COPY; + break; + case 2: + sale_type = LLSaleInfo::FS_CONTENTS; + break; + default: + sale_type = LLSaleInfo::FS_COPY; + break; + } + } + } + LLLineEditor* mEditPrice = gUICtrlFactory->getLineEditorByName(this,"EdCost"); + + S32 price = -1; + if(mEditPrice) + { + price = atoi(mEditPrice->getText().c_str()); + } + // Invalid data - turn off the sale + if (price < 0) + { + sale_type = LLSaleInfo::FS_NOT; + price = 0; + } + + LLSaleInfo sale_info(sale_type, price); + gSelectMgr->setObjectSaleInfo(sale_info); + + // If turned off for-sale, make sure click-action buy is turned + // off as well + if (sale_type == LLSaleInfo::FS_NOT) + { + U8 click_action = 0; + gSelectMgr->selectionGetClickAction(&click_action); + if (click_action == CLICK_ACTION_BUY) + { + gSelectMgr->selectionSetClickAction(CLICK_ACTION_TOUCH); + } + } +} + +class LLSelectionPayable : public LLSelectedObjectFunctor +{ +public: + virtual bool apply(LLViewerObject* obj) + { + // can pay if you or your parent has money() event in script + LLViewerObject* parent = (LLViewerObject*)obj->getParent(); + return (obj->flagTakesMoney() + || (parent && parent->flagTakesMoney())); + } +}; + +// static +void LLPanelPermissions::onCommitClickAction(LLUICtrl* ctrl, void*) +{ + LLComboBox* box = (LLComboBox*)ctrl; + if (!box) return; + + U8 click_action = (U8)box->getCurrentIndex(); + if (click_action == CLICK_ACTION_BUY) + { + LLSaleInfo sale_info; + gSelectMgr->selectGetSaleInfo(sale_info); + if (!sale_info.isForSale()) + { + gViewerWindow->alertXml("CantSetBuyObject"); + + // Set click action back to its old value + U8 click_action = 0; + gSelectMgr->selectionGetClickAction(&click_action); + box->setCurrentByIndex((S32)click_action); + + return; + } + } + else if (click_action == CLICK_ACTION_PAY) + { + // Verify object has script with money() handler + LLSelectionPayable payable; + bool can_pay = gSelectMgr->applyToObjects(&payable); + if (!can_pay) + { + // Warn, but do it anyway. + gViewerWindow->alertXml("ClickActionNotPayable"); + } + } + gSelectMgr->selectionSetClickAction(click_action); +} |