llpanelpermissions.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:34k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llpanelpermissions.cpp
  3.  * @brief LLPanelPermissions class implementation
  4.  * This class represents the panel in the build view for
  5.  * viewing/editing object names, owners, permissions, etc.
  6.  *
  7.  * $LicenseInfo:firstyear=2002&license=viewergpl$
  8.  * 
  9.  * Copyright (c) 2002-2010, Linden Research, Inc.
  10.  * 
  11.  * Second Life Viewer Source Code
  12.  * The source code in this file ("Source Code") is provided by Linden Lab
  13.  * to you under the terms of the GNU General Public License, version 2.0
  14.  * ("GPL"), unless you have obtained a separate licensing agreement
  15.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  16.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  17.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  18.  * 
  19.  * There are special exceptions to the terms and conditions of the GPL as
  20.  * it is applied to this Source Code. View the full text of the exception
  21.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  22.  * online at
  23.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  24.  * 
  25.  * By copying, modifying or distributing this software, you acknowledge
  26.  * that you have read and understood your obligations described above,
  27.  * and agree to abide by those obligations.
  28.  * 
  29.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  30.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  31.  * COMPLETENESS OR PERFORMANCE.
  32.  * $/LicenseInfo$
  33.  */
  34. #include "llviewerprecompiledheaders.h"
  35. #include "llpanelpermissions.h"
  36. // library includes
  37. #include "lluuid.h"
  38. #include "llpermissions.h"
  39. #include "llcategory.h"
  40. #include "llclickaction.h"
  41. #include "llfocusmgr.h"
  42. #include "llnotificationsutil.h"
  43. #include "llstring.h"
  44. // project includes
  45. #include "llviewerwindow.h"
  46. #include "llresmgr.h"
  47. #include "lltextbox.h"
  48. #include "llbutton.h"
  49. #include "llcheckboxctrl.h"
  50. #include "llviewerobject.h"
  51. #include "llselectmgr.h"
  52. #include "llagent.h"
  53. #include "llstatusbar.h" // for getBalance()
  54. #include "lllineeditor.h"
  55. #include "llcombobox.h"
  56. #include "lluiconstants.h"
  57. #include "lldbstrings.h"
  58. #include "llfloatergroups.h"
  59. #include "llfloaterreg.h"
  60. #include "llavataractions.h"
  61. #include "llnamebox.h"
  62. #include "llviewercontrol.h"
  63. #include "lluictrlfactory.h"
  64. #include "llspinctrl.h"
  65. #include "roles_constants.h"
  66. #include "llgroupactions.h"
  67. U8 string_value_to_click_action(std::string p_value);
  68. std::string click_action_to_string_value( U8 action);
  69. U8 string_value_to_click_action(std::string p_value)
  70. {
  71. if(p_value == "Touch")
  72. {
  73. return CLICK_ACTION_TOUCH;
  74. }
  75. if(p_value == "Sit")
  76. {
  77. return CLICK_ACTION_SIT;
  78. }
  79. if(p_value == "Buy")
  80. {
  81. return CLICK_ACTION_BUY;
  82. }
  83. if(p_value == "Pay")
  84. {
  85. return CLICK_ACTION_PAY;
  86. }
  87. if(p_value == "Open")
  88. {
  89. return CLICK_ACTION_OPEN;
  90. }
  91. if(p_value == "Zoom")
  92. {
  93. return CLICK_ACTION_ZOOM;
  94. }
  95. return CLICK_ACTION_TOUCH;
  96. }
  97. std::string click_action_to_string_value( U8 action)
  98. {
  99. switch (action) 
  100. {
  101. case CLICK_ACTION_TOUCH:
  102. default:
  103. return "Touch";
  104. break;
  105. case CLICK_ACTION_SIT:
  106. return "Sit";
  107. break;
  108. case CLICK_ACTION_BUY:
  109. return "Buy";
  110. break;
  111. case CLICK_ACTION_PAY:
  112. return "Pay";
  113. break;
  114. case CLICK_ACTION_OPEN:
  115. return "Open";
  116. break;
  117. case CLICK_ACTION_ZOOM:
  118. return "Zoom";
  119. break;
  120. }
  121. }
  122. ///----------------------------------------------------------------------------
  123. /// Class llpanelpermissions
  124. ///----------------------------------------------------------------------------
  125. // Default constructor
  126. LLPanelPermissions::LLPanelPermissions() :
  127. LLPanel()
  128. {
  129. setMouseOpaque(FALSE);
  130. }
  131. BOOL LLPanelPermissions::postBuild()
  132. {
  133. childSetCommitCallback("Object Name",LLPanelPermissions::onCommitName,this);
  134. childSetPrevalidate("Object Name",LLTextValidate::validateASCIIPrintableNoPipe);
  135. childSetCommitCallback("Object Description",LLPanelPermissions::onCommitDesc,this);
  136. childSetPrevalidate("Object Description",LLTextValidate::validateASCIIPrintableNoPipe);
  137. getChild<LLUICtrl>("button set group")->setCommitCallback(boost::bind(&LLPanelPermissions::onClickGroup,this));
  138. childSetCommitCallback("checkbox share with group",LLPanelPermissions::onCommitGroupShare,this);
  139. childSetAction("button deed",LLPanelPermissions::onClickDeedToGroup,this);
  140. childSetCommitCallback("checkbox allow everyone move",LLPanelPermissions::onCommitEveryoneMove,this);
  141. childSetCommitCallback("checkbox allow everyone copy",LLPanelPermissions::onCommitEveryoneCopy,this);
  142. childSetCommitCallback("checkbox for sale",LLPanelPermissions::onCommitSaleInfo,this);
  143. childSetCommitCallback("sale type",LLPanelPermissions::onCommitSaleType,this);
  144. childSetCommitCallback("Edit Cost", LLPanelPermissions::onCommitSaleInfo, this);
  145. childSetCommitCallback("checkbox next owner can modify",LLPanelPermissions::onCommitNextOwnerModify,this);
  146. childSetCommitCallback("checkbox next owner can copy",LLPanelPermissions::onCommitNextOwnerCopy,this);
  147. childSetCommitCallback("checkbox next owner can transfer",LLPanelPermissions::onCommitNextOwnerTransfer,this);
  148. childSetCommitCallback("clickaction",LLPanelPermissions::onCommitClickAction,this);
  149. childSetCommitCallback("search_check",LLPanelPermissions::onCommitIncludeInSearch,this);
  150. mLabelGroupName = getChild<LLNameBox>("Group Name Proxy");
  151. return TRUE;
  152. }
  153. LLPanelPermissions::~LLPanelPermissions()
  154. {
  155. // base class will take care of everything
  156. }
  157. void LLPanelPermissions::disableAll()
  158. {
  159. childSetEnabled("perm_modify", FALSE);
  160. childSetText("perm_modify", LLStringUtil::null);
  161. childSetEnabled("Creator:",     FALSE);
  162. childSetText("Creator Name", LLStringUtil::null);
  163. childSetEnabled("Creator Name", FALSE);
  164. childSetEnabled("Owner:", FALSE);
  165. childSetText("Owner Name", LLStringUtil::null);
  166. childSetEnabled("Owner Name", FALSE);
  167. childSetEnabled("Group:", FALSE);
  168. childSetText("Group Name", LLStringUtil::null);
  169. childSetEnabled("Group Name", FALSE);
  170. childSetEnabled("button set group", FALSE);
  171. childSetText("Object Name", LLStringUtil::null);
  172. childSetEnabled("Object Name", FALSE);
  173. childSetEnabled("Name:",     FALSE);
  174. childSetText("Group Name", LLStringUtil::null);
  175. childSetEnabled("Group Name", FALSE);
  176. childSetEnabled("Description:", FALSE);
  177. childSetText("Object Description", LLStringUtil::null);
  178. childSetEnabled("Object Description", FALSE);
  179. childSetEnabled("Permissions:", FALSE);
  180. childSetValue("checkbox share with group", FALSE);
  181. childSetEnabled("checkbox share with group",     FALSE);
  182. childSetEnabled("button deed", FALSE);
  183. childSetValue("checkbox allow everyone move",     FALSE);
  184. childSetEnabled("checkbox allow everyone move",     FALSE);
  185. childSetValue("checkbox allow everyone copy",     FALSE);
  186. childSetEnabled("checkbox allow everyone copy",     FALSE);
  187. //Next owner can:
  188. childSetEnabled("Next owner can:", FALSE);
  189. childSetValue("checkbox next owner can modify", FALSE);
  190. childSetEnabled("checkbox next owner can modify",   FALSE);
  191. childSetValue("checkbox next owner can copy",     FALSE);
  192. childSetEnabled("checkbox next owner can copy",     FALSE);
  193. childSetValue("checkbox next owner can transfer",   FALSE);
  194. childSetEnabled("checkbox next owner can transfer", FALSE);
  195. //checkbox for sale
  196. childSetValue("checkbox for sale", FALSE);
  197. childSetEnabled("checkbox for sale",     FALSE);
  198. //checkbox include in search
  199. childSetValue("search_check",   FALSE);
  200. childSetEnabled("search_check",   FALSE);
  201. LLComboBox* combo_sale_type = getChild<LLComboBox>("sale type");
  202. combo_sale_type->setValue(LLSaleInfo::FS_COPY);
  203. combo_sale_type->setEnabled(FALSE);
  204. childSetEnabled("Cost", FALSE);
  205. childSetText("Cost",     getString("Cost Default"));
  206. childSetText("Edit Cost", LLStringUtil::null);
  207. childSetEnabled("Edit Cost",     FALSE);
  208. childSetEnabled("label click action", FALSE);
  209. LLComboBox* combo_click_action = getChild<LLComboBox>("clickaction");
  210. if (combo_click_action)
  211. {
  212. combo_click_action->setEnabled(FALSE);
  213. combo_click_action->clear();
  214. }
  215. childSetVisible("B:", FALSE);
  216. childSetVisible("O:", FALSE);
  217. childSetVisible("G:", FALSE);
  218. childSetVisible("E:", FALSE);
  219. childSetVisible("N:", FALSE);
  220. childSetVisible("F:", FALSE);
  221. }
  222. void LLPanelPermissions::refresh()
  223. {
  224. LLButton* BtnDeedToGroup = getChild<LLButton>("button deed");
  225. if(BtnDeedToGroup)
  226. {
  227. std::string deedText;
  228. if (gWarningSettings.getBOOL("DeedObject"))
  229. {
  230. deedText = getString("text deed continued");
  231. }
  232. else
  233. {
  234. deedText = getString("text deed");
  235. }
  236. BtnDeedToGroup->setLabelSelected(deedText);
  237. BtnDeedToGroup->setLabelUnselected(deedText);
  238. }
  239. BOOL root_selected = TRUE;
  240. LLSelectNode* nodep = LLSelectMgr::getInstance()->getSelection()->getFirstRootNode();
  241. S32 object_count = LLSelectMgr::getInstance()->getSelection()->getRootObjectCount();
  242. if(!nodep || 0 == object_count)
  243. {
  244. nodep = LLSelectMgr::getInstance()->getSelection()->getFirstNode();
  245. object_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount();
  246. root_selected = FALSE;
  247. }
  248. //BOOL attachment_selected = LLSelectMgr::getInstance()->getSelection()->isAttachment();
  249. //attachment_selected = false;
  250. LLViewerObject* objectp = NULL;
  251. if(nodep) objectp = nodep->getObject();
  252. if(!nodep || !objectp)// || attachment_selected)
  253. {
  254. // ...nothing selected
  255. disableAll();
  256. return;
  257. }
  258. // figure out a few variables
  259. const BOOL is_one_object = (object_count == 1);
  260. // BUG: fails if a root and non-root are both single-selected.
  261. BOOL is_perm_modify = (LLSelectMgr::getInstance()->getSelection()->getFirstRootNode() 
  262.    && LLSelectMgr::getInstance()->selectGetRootsModify())
  263. || LLSelectMgr::getInstance()->selectGetModify();
  264. const LLFocusableElement* keyboard_focus_view = gFocusMgr.getKeyboardFocus();
  265. S32 string_index = 0;
  266. std::string MODIFY_INFO_STRINGS[] =
  267. {
  268. getString("text modify info 1"),
  269. getString("text modify info 2"),
  270. getString("text modify info 3"),
  271. getString("text modify info 4")
  272. };
  273. if (!is_perm_modify)
  274. {
  275. string_index += 2;
  276. }
  277. if (!is_one_object)
  278. {
  279. ++string_index;
  280. }
  281. childSetEnabled("perm_modify",      TRUE);
  282. childSetText("perm_modify", MODIFY_INFO_STRINGS[string_index]);
  283. childSetEnabled("Permissions:",  TRUE);
  284. // Update creator text field
  285. childSetEnabled("Creator:",  TRUE);
  286. BOOL creators_identical;
  287. std::string creator_name;
  288. creators_identical = LLSelectMgr::getInstance()->selectGetCreator(mCreatorID,
  289.   creator_name);
  290. childSetText("Creator Name", creator_name);
  291. childSetEnabled("Creator Name",  TRUE);
  292. // Update owner text field
  293. childSetEnabled("Owner:",  TRUE);
  294. std::string owner_name;
  295. const BOOL owners_identical = LLSelectMgr::getInstance()->selectGetOwner(mOwnerID, owner_name);
  296. if (mOwnerID.isNull())
  297. {
  298. if (LLSelectMgr::getInstance()->selectIsGroupOwned())
  299. {
  300. // Group owned already displayed by selectGetOwner
  301. }
  302. else
  303. {
  304. // Display last owner if public
  305. std::string last_owner_name;
  306. LLSelectMgr::getInstance()->selectGetLastOwner(mLastOwnerID, last_owner_name);
  307. // It should never happen that the last owner is null and the owner
  308. // is null, but it seems to be a bug in the simulator right now. JC
  309. if (!mLastOwnerID.isNull() && !last_owner_name.empty())
  310. {
  311. owner_name.append(", last ");
  312. owner_name.append(last_owner_name);
  313. }
  314. }
  315. }
  316. childSetText("Owner Name", owner_name);
  317. childSetEnabled("Owner Name",  TRUE);
  318. // update group text field
  319. childSetEnabled("Group:",  TRUE);
  320. childSetText("Group Name",  LLStringUtil::null);
  321. LLUUID group_id;
  322. BOOL groups_identical = LLSelectMgr::getInstance()->selectGetGroup(group_id);
  323. if (groups_identical)
  324. {
  325. if (mLabelGroupName)
  326. {
  327. mLabelGroupName->setNameID(group_id,TRUE);
  328. mLabelGroupName->setEnabled(TRUE);
  329. }
  330. }
  331. else
  332. {
  333. if (mLabelGroupName)
  334. {
  335. mLabelGroupName->setNameID(LLUUID::null, TRUE);
  336. mLabelGroupName->refresh(LLUUID::null,LLStringUtil::null, LLStringUtil::null, TRUE);
  337. mLabelGroupName->setEnabled(FALSE);
  338. }
  339. }
  340. childSetEnabled("button set group", owners_identical && (mOwnerID == gAgent.getID()));
  341. childSetEnabled("Name:",  TRUE);
  342. LLLineEditor* LineEditorObjectName = getChild<LLLineEditor>("Object Name");
  343. childSetEnabled("Description:",  TRUE);
  344. LLLineEditor* LineEditorObjectDesc = getChild<LLLineEditor>("Object Description");
  345. if (is_one_object)
  346. {
  347. if (keyboard_focus_view != LineEditorObjectName)
  348. {
  349. childSetText("Object Name",nodep->mName);
  350. }
  351. if (LineEditorObjectDesc)
  352. {
  353. if (keyboard_focus_view != LineEditorObjectDesc)
  354. {
  355. LineEditorObjectDesc->setText(nodep->mDescription);
  356. }
  357. }
  358. }
  359. else
  360. {
  361. childSetText("Object Name", LLStringUtil::null);
  362. LineEditorObjectDesc->setText(LLStringUtil::null);
  363. }
  364. // figure out the contents of the name, description, & category
  365. BOOL edit_name_desc = FALSE;
  366. if (is_one_object && objectp->permModify())
  367. {
  368. edit_name_desc = TRUE;
  369. }
  370. if (edit_name_desc)
  371. {
  372. childSetEnabled("Object Name",  TRUE);
  373. childSetEnabled("Object Description",  TRUE);
  374. }
  375. else
  376. {
  377. childSetEnabled("Object Name",  FALSE);
  378. childSetEnabled("Object Description",  FALSE);
  379. }
  380. S32 total_sale_price = 0;
  381. S32 individual_sale_price = 0;
  382. BOOL is_for_sale_mixed = FALSE;
  383. BOOL is_sale_price_mixed = FALSE;
  384. U32 num_for_sale = FALSE;
  385.     LLSelectMgr::getInstance()->selectGetAggregateSaleInfo(num_for_sale,
  386.    is_for_sale_mixed,
  387.    is_sale_price_mixed,
  388.    total_sale_price,
  389.    individual_sale_price);
  390. const BOOL self_owned = (gAgent.getID() == mOwnerID);
  391. const BOOL group_owned = LLSelectMgr::getInstance()->selectIsGroupOwned() ;
  392. const BOOL public_owned = (mOwnerID.isNull() && !LLSelectMgr::getInstance()->selectIsGroupOwned());
  393. const BOOL can_transfer = LLSelectMgr::getInstance()->selectGetRootsTransfer();
  394. const BOOL can_copy = LLSelectMgr::getInstance()->selectGetRootsCopy();
  395. if (!owners_identical)
  396. {
  397. childSetEnabled("Cost",  FALSE);
  398. childSetText("Edit Cost", LLStringUtil::null);
  399. childSetEnabled("Edit Cost",  FALSE);
  400. }
  401. // You own these objects.
  402. else if (self_owned || (group_owned && gAgent.hasPowerInGroup(group_id,GP_OBJECT_SET_SALE)))
  403. {
  404. // If there are multiple items for sale then set text to PRICE PER UNIT.
  405. if (num_for_sale > 1)
  406. {
  407. childSetText("Cost", getString("Cost Per Unit"));
  408. }
  409. else
  410. {
  411. childSetText("Cost", getString("Cost Default"));
  412. }
  413. LLSpinCtrl *edit_price = getChild<LLSpinCtrl>("Edit Cost");
  414. if (!edit_price->hasFocus())
  415. {
  416. // If the sale price is mixed then set the cost to MIXED, otherwise
  417. // set to the actual cost.
  418. if ((num_for_sale > 0) && is_for_sale_mixed)
  419. {
  420. edit_price->setTentative(TRUE);
  421. }
  422. else if ((num_for_sale > 0) && is_sale_price_mixed)
  423. {
  424. edit_price->setTentative(TRUE);
  425. }
  426. else 
  427. {
  428. edit_price->setValue(individual_sale_price);
  429. }
  430. }
  431. // The edit fields are only enabled if you can sell this object
  432. // and the sale price is not mixed.
  433. BOOL enable_edit = (num_for_sale && can_transfer) ? !is_for_sale_mixed : FALSE;
  434. childSetEnabled("Cost", enable_edit);
  435. childSetEnabled("Edit Cost", enable_edit);
  436. }
  437. // Someone, not you, owns these objects.
  438. else if (!public_owned)
  439. {
  440. childSetEnabled("Cost", FALSE);
  441. childSetEnabled("Edit Cost", FALSE);
  442. // Don't show a price if none of the items are for sale.
  443. if (num_for_sale)
  444. childSetText("Edit Cost", llformat("%d",total_sale_price));
  445. else
  446. childSetText("Edit Cost", LLStringUtil::null);
  447. // If multiple items are for sale, set text to TOTAL PRICE.
  448. if (num_for_sale > 1)
  449. childSetText("Cost", getString("Cost Total"));
  450. else
  451. childSetText("Cost", getString("Cost Default"));
  452. }
  453. // This is a public object.
  454. else
  455. {
  456. childSetEnabled("Cost", FALSE);
  457. childSetText("Cost", getString("Cost Default"));
  458. childSetText("Edit Cost", LLStringUtil::null);
  459. childSetEnabled("Edit Cost", FALSE);
  460. }
  461. // Enable and disable the permissions checkboxes
  462. // based on who owns the object.
  463. // TODO: Creator permissions
  464. U32 base_mask_on  = 0;
  465. U32 base_mask_off   = 0;
  466. U32 owner_mask_off = 0;
  467. U32 owner_mask_on  = 0;
  468. U32 group_mask_on  = 0;
  469. U32 group_mask_off  = 0;
  470. U32 everyone_mask_on  = 0;
  471. U32 everyone_mask_off  = 0;
  472. U32 next_owner_mask_on  = 0;
  473. U32 next_owner_mask_off = 0;
  474. BOOL valid_base_perms  = LLSelectMgr::getInstance()->selectGetPerm(PERM_BASE,
  475. &base_mask_on,
  476. &base_mask_off);
  477. //BOOL valid_owner_perms =//
  478. LLSelectMgr::getInstance()->selectGetPerm(PERM_OWNER,
  479.   &owner_mask_on,
  480.   &owner_mask_off);
  481. BOOL valid_group_perms  = LLSelectMgr::getInstance()->selectGetPerm(PERM_GROUP,
  482. &group_mask_on,
  483. &group_mask_off);
  484. BOOL valid_everyone_perms  = LLSelectMgr::getInstance()->selectGetPerm(PERM_EVERYONE,
  485. &everyone_mask_on,
  486. &everyone_mask_off);
  487. BOOL valid_next_perms  = LLSelectMgr::getInstance()->selectGetPerm(PERM_NEXT_OWNER,
  488. &next_owner_mask_on,
  489. &next_owner_mask_off);
  490. if (gSavedSettings.getBOOL("DebugPermissions") )
  491. {
  492. if (valid_base_perms)
  493. {
  494. childSetText("B:", "B: " + mask_to_string(base_mask_on));
  495. childSetVisible("B:", TRUE);
  496. childSetText("O:", "O: " + mask_to_string(owner_mask_on));
  497. childSetVisible("O:", TRUE);
  498. childSetText("G:", "G: " + mask_to_string(group_mask_on));
  499. childSetVisible("G:", TRUE);
  500. childSetText("E:", "E: " + mask_to_string(everyone_mask_on));
  501. childSetVisible("E:", TRUE);
  502. childSetText("N:", "N: " + mask_to_string(next_owner_mask_on));
  503. childSetVisible("N:", TRUE);
  504. }
  505. U32 flag_mask = 0x0;
  506. if (objectp->permMove())  flag_mask |= PERM_MOVE;
  507. if (objectp->permModify())  flag_mask |= PERM_MODIFY;
  508. if (objectp->permCopy())  flag_mask |= PERM_COPY;
  509. if (objectp->permTransfer())  flag_mask |= PERM_TRANSFER;
  510. childSetText("F:", "F:" + mask_to_string(flag_mask));
  511. childSetVisible("F:", TRUE);
  512. }
  513. else
  514. {
  515. childSetVisible("B:", FALSE);
  516. childSetVisible("O:", FALSE);
  517. childSetVisible("G:", FALSE);
  518. childSetVisible("E:", FALSE);
  519. childSetVisible("N:", FALSE);
  520. childSetVisible("F:", FALSE);
  521. }
  522. BOOL has_change_perm_ability = FALSE;
  523. BOOL has_change_sale_ability = FALSE;
  524. if (valid_base_perms &&
  525. (self_owned || (group_owned && gAgent.hasPowerInGroup(group_id, GP_OBJECT_MANIPULATE))))
  526. {
  527. has_change_perm_ability = TRUE;
  528. }
  529. if (valid_base_perms &&
  530.    (self_owned || (group_owned && gAgent.hasPowerInGroup(group_id, GP_OBJECT_SET_SALE))))
  531. {
  532. has_change_sale_ability = TRUE;
  533. }
  534. if (!has_change_perm_ability && !has_change_sale_ability && !root_selected)
  535. {
  536. // ...must select root to choose permissions
  537. childSetValue("perm_modify",  getString("text modify warning"));
  538. }
  539. if (has_change_perm_ability)
  540. {
  541. childSetEnabled("checkbox share with group", TRUE);
  542. childSetEnabled("checkbox allow everyone move", owner_mask_on & PERM_MOVE);
  543. childSetEnabled("checkbox allow everyone copy", owner_mask_on & PERM_COPY && owner_mask_on & PERM_TRANSFER);
  544. }
  545. else
  546. {
  547. childSetEnabled("checkbox share with group",  FALSE);
  548. childSetEnabled("checkbox allow everyone move",  FALSE);
  549. childSetEnabled("checkbox allow everyone copy",  FALSE);
  550. }
  551. if (has_change_sale_ability && (owner_mask_on & PERM_TRANSFER))
  552. {
  553. childSetEnabled("checkbox for sale",  can_transfer || (!can_transfer && num_for_sale));
  554. // Set the checkbox to tentative if the prices of each object selected
  555. // are not the same.
  556. childSetTentative("checkbox for sale",  is_for_sale_mixed);
  557. childSetEnabled("sale type",  num_for_sale && can_transfer && !is_sale_price_mixed);
  558. childSetEnabled("Next owner can:",  TRUE);
  559. childSetEnabled("checkbox next owner can modify",  base_mask_on & PERM_MODIFY);
  560. childSetEnabled("checkbox next owner can copy",  base_mask_on & PERM_COPY);
  561. childSetEnabled("checkbox next owner can transfer", next_owner_mask_on & PERM_COPY);
  562. }
  563. else 
  564. {
  565. childSetEnabled("checkbox for sale", FALSE);
  566. childSetEnabled("sale type", FALSE);
  567. childSetEnabled("Next owner can:", FALSE);
  568. childSetEnabled("checkbox next owner can modify", FALSE);
  569. childSetEnabled("checkbox next owner can copy", FALSE);
  570. childSetEnabled("checkbox next owner can transfer", FALSE);
  571. }
  572. if (valid_group_perms)
  573. {
  574. if ((group_mask_on & PERM_COPY) && (group_mask_on & PERM_MODIFY) && (group_mask_on & PERM_MOVE))
  575. {
  576. childSetValue("checkbox share with group", TRUE);
  577. childSetTentative("checkbox share with group", FALSE);
  578. childSetEnabled("button deed", gAgent.hasPowerInGroup(group_id, GP_OBJECT_DEED) && (owner_mask_on & PERM_TRANSFER) && !group_owned && can_transfer);
  579. }
  580. else if ((group_mask_off & PERM_COPY) && (group_mask_off & PERM_MODIFY) && (group_mask_off & PERM_MOVE))
  581. {
  582. childSetValue("checkbox share with group", FALSE);
  583. childSetTentative("checkbox share with group", FALSE);
  584. childSetEnabled("button deed", FALSE);
  585. }
  586. else
  587. {
  588. childSetValue("checkbox share with group", TRUE);
  589. childSetTentative("checkbox share with group", TRUE);
  590. childSetEnabled("button deed", gAgent.hasPowerInGroup(group_id, GP_OBJECT_DEED) && (group_mask_on & PERM_MOVE) && (owner_mask_on & PERM_TRANSFER) && !group_owned && can_transfer);
  591. }
  592. }
  593. if (valid_everyone_perms)
  594. {
  595. // Move
  596. if (everyone_mask_on & PERM_MOVE)
  597. {
  598. childSetValue("checkbox allow everyone move", TRUE);
  599. childSetTentative("checkbox allow everyone move",  FALSE);
  600. }
  601. else if (everyone_mask_off & PERM_MOVE)
  602. {
  603. childSetValue("checkbox allow everyone move", FALSE);
  604. childSetTentative("checkbox allow everyone move",  FALSE);
  605. }
  606. else
  607. {
  608. childSetValue("checkbox allow everyone move", TRUE);
  609. childSetTentative("checkbox allow everyone move",  TRUE);
  610. }
  611. // Copy == everyone can't copy
  612. if (everyone_mask_on & PERM_COPY)
  613. {
  614. childSetValue("checkbox allow everyone copy", TRUE);
  615. childSetTentative("checkbox allow everyone copy",  !can_copy || !can_transfer);
  616. }
  617. else if (everyone_mask_off & PERM_COPY)
  618. {
  619. childSetValue("checkbox allow everyone copy", FALSE);
  620. childSetTentative("checkbox allow everyone copy", FALSE);
  621. }
  622. else
  623. {
  624. childSetValue("checkbox allow everyone copy", TRUE);
  625. childSetTentative("checkbox allow everyone copy", TRUE);
  626. }
  627. }
  628. if (valid_next_perms)
  629. {
  630. // Modify == next owner canot modify
  631. if (next_owner_mask_on & PERM_MODIFY)
  632. {
  633. childSetValue("checkbox next owner can modify", TRUE);
  634. childSetTentative("checkbox next owner can modify", FALSE);
  635. }
  636. else if (next_owner_mask_off & PERM_MODIFY)
  637. {
  638. childSetValue("checkbox next owner can modify", FALSE);
  639. childSetTentative("checkbox next owner can modify", FALSE);
  640. }
  641. else
  642. {
  643. childSetValue("checkbox next owner can modify", TRUE);
  644. childSetTentative("checkbox next owner can modify", TRUE);
  645. }
  646. // Copy == next owner cannot copy
  647. if (next_owner_mask_on & PERM_COPY)
  648. {
  649. childSetValue("checkbox next owner can copy", TRUE);
  650. childSetTentative("checkbox next owner can copy", !can_copy);
  651. }
  652. else if (next_owner_mask_off & PERM_COPY)
  653. {
  654. childSetValue("checkbox next owner can copy", FALSE);
  655. childSetTentative("checkbox next owner can copy", FALSE);
  656. }
  657. else
  658. {
  659. childSetValue("checkbox next owner can copy", TRUE);
  660. childSetTentative("checkbox next owner can copy", TRUE);
  661. }
  662. // Transfer == next owner cannot transfer
  663. if (next_owner_mask_on & PERM_TRANSFER)
  664. {
  665. childSetValue("checkbox next owner can transfer", TRUE);
  666. childSetTentative("checkbox next owner can transfer", !can_transfer);
  667. }
  668. else if (next_owner_mask_off & PERM_TRANSFER)
  669. {
  670. childSetValue("checkbox next owner can transfer", FALSE);
  671. childSetTentative("checkbox next owner can transfer", FALSE);
  672. }
  673. else
  674. {
  675. childSetValue("checkbox next owner can transfer", TRUE);
  676. childSetTentative("checkbox next owner can transfer", TRUE);
  677. }
  678. }
  679. // reflect sale information
  680. LLSaleInfo sale_info;
  681. BOOL valid_sale_info = LLSelectMgr::getInstance()->selectGetSaleInfo(sale_info);
  682. LLSaleInfo::EForSale sale_type = sale_info.getSaleType();
  683. LLComboBox* combo_sale_type = getChild<LLComboBox>("sale type");
  684. if (valid_sale_info)
  685. {
  686. combo_sale_type->setValue( sale_type == LLSaleInfo::FS_NOT ? LLSaleInfo::FS_COPY : sale_type);
  687. combo_sale_type->setTentative( FALSE); // unfortunately this doesn't do anything at the moment.
  688. }
  689. else
  690. {
  691. // default option is sell copy, determined to be safest
  692. combo_sale_type->setValue( LLSaleInfo::FS_COPY);
  693. combo_sale_type->setTentative( TRUE); // unfortunately this doesn't do anything at the moment.
  694. }
  695. childSetValue("checkbox for sale", (num_for_sale != 0));
  696. // HACK: There are some old objects in world that are set for sale,
  697. // but are no-transfer.  We need to let users turn for-sale off, but only
  698. // if for-sale is set.
  699. bool cannot_actually_sell = !can_transfer || (!can_copy && sale_type == LLSaleInfo::FS_COPY);
  700. if (cannot_actually_sell)
  701. {
  702. if (num_for_sale && has_change_sale_ability)
  703. {
  704. childSetEnabled("checkbox for sale", true);
  705. }
  706. }
  707. // Check search status of objects
  708. const BOOL all_volume = LLSelectMgr::getInstance()->selectionAllPCode( LL_PCODE_VOLUME );
  709. bool include_in_search;
  710. const BOOL all_include_in_search = LLSelectMgr::getInstance()->selectionGetIncludeInSearch(&include_in_search);
  711. childSetEnabled("search_check",  has_change_sale_ability && all_volume);
  712. childSetValue("search_check",  include_in_search);
  713. childSetTentative("search_check",  !all_include_in_search);
  714. // Click action (touch, sit, buy)
  715. U8 click_action = 0;
  716. if (LLSelectMgr::getInstance()->selectionGetClickAction(&click_action))
  717. {
  718. LLComboBox* combo_click_action = getChild<LLComboBox>("clickaction");
  719. if(combo_click_action)
  720. {
  721. const std::string combo_value = click_action_to_string_value(click_action);
  722. combo_click_action->setValue(LLSD(combo_value));
  723. }
  724. }
  725. childSetEnabled("label click action", is_perm_modify && all_volume);
  726. childSetEnabled("clickaction", is_perm_modify && all_volume);
  727. }
  728. // static
  729. void LLPanelPermissions::onClickClaim(void*)
  730. {
  731. // try to claim ownership
  732. LLSelectMgr::getInstance()->sendOwner(gAgent.getID(), gAgent.getGroupID());
  733. }
  734. // static
  735. void LLPanelPermissions::onClickRelease(void*)
  736. {
  737. // try to release ownership
  738. LLSelectMgr::getInstance()->sendOwner(LLUUID::null, LLUUID::null);
  739. }
  740. void LLPanelPermissions::onClickGroup()
  741. {
  742. LLUUID owner_id;
  743. std::string name;
  744. BOOL owners_identical = LLSelectMgr::getInstance()->selectGetOwner(owner_id, name);
  745. LLFloater* parent_floater = gFloaterView->getParentFloater(this);
  746. if(owners_identical && (owner_id == gAgent.getID()))
  747. {
  748. LLFloaterGroupPicker* fg =  LLFloaterReg::showTypedInstance<LLFloaterGroupPicker>("group_picker", LLSD(gAgent.getID()));
  749. if (fg)
  750. {
  751. fg->setSelectGroupCallback( boost::bind(&LLPanelPermissions::cbGroupID, this, _1) );
  752. if (parent_floater)
  753. {
  754. LLRect new_rect = gFloaterView->findNeighboringPosition(parent_floater, fg);
  755. fg->setOrigin(new_rect.mLeft, new_rect.mBottom);
  756. parent_floater->addDependentFloater(fg);
  757. }
  758. }
  759. }
  760. }
  761. void LLPanelPermissions::cbGroupID(LLUUID group_id)
  762. {
  763. if(mLabelGroupName)
  764. {
  765. mLabelGroupName->setNameID(group_id, TRUE);
  766. }
  767. LLSelectMgr::getInstance()->sendGroup(group_id);
  768. }
  769. bool callback_deed_to_group(const LLSD& notification, const LLSD& response)
  770. {
  771. S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
  772. if (0 == option)
  773. {
  774. LLUUID group_id;
  775. BOOL groups_identical = LLSelectMgr::getInstance()->selectGetGroup(group_id);
  776. if(group_id.notNull() && groups_identical && (gAgent.hasPowerInGroup(group_id, GP_OBJECT_DEED)))
  777. {
  778. LLSelectMgr::getInstance()->sendOwner(LLUUID::null, group_id, FALSE);
  779. // LLViewerStats::getInstance()->incStat(LLViewerStats::ST_RELEASE_COUNT);
  780. }
  781. }
  782. return false;
  783. }
  784. void LLPanelPermissions::onClickDeedToGroup(void* data)
  785. {
  786. LLNotificationsUtil::add( "DeedObjectToGroup", LLSD(), LLSD(), callback_deed_to_group);
  787. }
  788. ///----------------------------------------------------------------------------
  789. /// Permissions checkboxes
  790. ///----------------------------------------------------------------------------
  791. // static
  792. void LLPanelPermissions::onCommitPerm(LLUICtrl *ctrl, void *data, U8 field, U32 perm)
  793. {
  794. LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getFirstRootObject();
  795. if(!object) return;
  796. // Checkbox will have toggled itself
  797. // LLPanelPermissions* self = (LLPanelPermissions*)data;
  798. LLCheckBoxCtrl *check = (LLCheckBoxCtrl *)ctrl;
  799. BOOL new_state = check->get();
  800. LLSelectMgr::getInstance()->selectionSetObjectPermissions(field, new_state, perm);
  801. }
  802. // static
  803. void LLPanelPermissions::onCommitGroupShare(LLUICtrl *ctrl, void *data)
  804. {
  805. onCommitPerm(ctrl, data, PERM_GROUP, PERM_MODIFY | PERM_MOVE | PERM_COPY);
  806. }
  807. // static
  808. void LLPanelPermissions::onCommitEveryoneMove(LLUICtrl *ctrl, void *data)
  809. {
  810. onCommitPerm(ctrl, data, PERM_EVERYONE, PERM_MOVE);
  811. }
  812. // static
  813. void LLPanelPermissions::onCommitEveryoneCopy(LLUICtrl *ctrl, void *data)
  814. {
  815. onCommitPerm(ctrl, data, PERM_EVERYONE, PERM_COPY);
  816. }
  817. // static
  818. void LLPanelPermissions::onCommitNextOwnerModify(LLUICtrl* ctrl, void* data)
  819. {
  820. //llinfos << "LLPanelPermissions::onCommitNextOwnerModify" << llendl;
  821. onCommitPerm(ctrl, data, PERM_NEXT_OWNER, PERM_MODIFY);
  822. }
  823. // static
  824. void LLPanelPermissions::onCommitNextOwnerCopy(LLUICtrl* ctrl, void* data)
  825. {
  826. //llinfos << "LLPanelPermissions::onCommitNextOwnerCopy" << llendl;
  827. onCommitPerm(ctrl, data, PERM_NEXT_OWNER, PERM_COPY);
  828. }
  829. // static
  830. void LLPanelPermissions::onCommitNextOwnerTransfer(LLUICtrl* ctrl, void* data)
  831. {
  832. //llinfos << "LLPanelPermissions::onCommitNextOwnerTransfer" << llendl;
  833. onCommitPerm(ctrl, data, PERM_NEXT_OWNER, PERM_TRANSFER);
  834. }
  835. // static
  836. void LLPanelPermissions::onCommitName(LLUICtrl*, void* data)
  837. {
  838. //llinfos << "LLPanelPermissions::onCommitName()" << llendl;
  839. LLPanelPermissions* self = (LLPanelPermissions*)data;
  840. LLLineEditor* tb = self->getChild<LLLineEditor>("Object Name");
  841. if(tb)
  842. {
  843. LLSelectMgr::getInstance()->selectionSetObjectName(tb->getText());
  844. // LLSelectMgr::getInstance()->selectionSetObjectName(self->mLabelObjectName->getText());
  845. }
  846. }
  847. // static
  848. void LLPanelPermissions::onCommitDesc(LLUICtrl*, void* data)
  849. {
  850. //llinfos << "LLPanelPermissions::onCommitDesc()" << llendl;
  851. LLPanelPermissions* self = (LLPanelPermissions*)data;
  852. LLLineEditor* le = self->getChild<LLLineEditor>("Object Description");
  853. if(le)
  854. {
  855. LLSelectMgr::getInstance()->selectionSetObjectDescription(le->getText());
  856. }
  857. }
  858. // static
  859. void LLPanelPermissions::onCommitSaleInfo(LLUICtrl*, void* data)
  860. {
  861. LLPanelPermissions* self = (LLPanelPermissions*)data;
  862. self->setAllSaleInfo();
  863. }
  864. // static
  865. void LLPanelPermissions::onCommitSaleType(LLUICtrl*, void* data)
  866. {
  867. LLPanelPermissions* self = (LLPanelPermissions*)data;
  868. self->setAllSaleInfo();
  869. }
  870. void LLPanelPermissions::setAllSaleInfo()
  871. {
  872. llinfos << "LLPanelPermissions::setAllSaleInfo()" << llendl;
  873. LLSaleInfo::EForSale sale_type = LLSaleInfo::FS_NOT;
  874. LLCheckBoxCtrl *checkPurchase = getChild<LLCheckBoxCtrl>("checkbox for sale");
  875. // Set the sale type if the object(s) are for sale.
  876. if(checkPurchase && checkPurchase->get())
  877. {
  878. sale_type = static_cast<LLSaleInfo::EForSale>(getChild<LLComboBox>("sale type")->getValue().asInteger());
  879. }
  880. S32 price = -1;
  881. LLSpinCtrl *edit_price = getChild<LLSpinCtrl>("Edit Cost");
  882. price = (edit_price->getTentative()) ? DEFAULT_PRICE : edit_price->getValue().asInteger();
  883. // If somehow an invalid price, turn the sale off.
  884. if (price < 0)
  885. sale_type = LLSaleInfo::FS_NOT;
  886. LLSaleInfo old_sale_info;
  887. LLSelectMgr::getInstance()->selectGetSaleInfo(old_sale_info);
  888. LLSaleInfo new_sale_info(sale_type, price);
  889. LLSelectMgr::getInstance()->selectionSetObjectSaleInfo(new_sale_info);
  890. U8 old_click_action = 0;
  891. LLSelectMgr::getInstance()->selectionGetClickAction(&old_click_action);
  892. if (old_sale_info.isForSale()
  893. && !new_sale_info.isForSale()
  894. && old_click_action == CLICK_ACTION_BUY)
  895. {
  896. // If turned off for-sale, make sure click-action buy is turned
  897. // off as well
  898. LLSelectMgr::getInstance()->
  899. selectionSetClickAction(CLICK_ACTION_TOUCH);
  900. }
  901. else if (new_sale_info.isForSale()
  902. && !old_sale_info.isForSale()
  903. && old_click_action == CLICK_ACTION_TOUCH)
  904. {
  905. // If just turning on for-sale, preemptively turn on one-click buy
  906. // unless user have a different click action set
  907. LLSelectMgr::getInstance()->
  908. selectionSetClickAction(CLICK_ACTION_BUY);
  909. }
  910. }
  911. struct LLSelectionPayable : public LLSelectedObjectFunctor
  912. {
  913. virtual bool apply(LLViewerObject* obj)
  914. {
  915. // can pay if you or your parent has money() event in script
  916. LLViewerObject* parent = (LLViewerObject*)obj->getParent();
  917. return (obj->flagTakesMoney() 
  918.    || (parent && parent->flagTakesMoney()));
  919. }
  920. };
  921. // static
  922. void LLPanelPermissions::onCommitClickAction(LLUICtrl* ctrl, void*)
  923. {
  924. LLComboBox* box = (LLComboBox*)ctrl;
  925. if (!box) return;
  926. std::string value = box->getValue().asString();
  927. U8 click_action = string_value_to_click_action(value);
  928. if (click_action == CLICK_ACTION_BUY)
  929. {
  930. LLSaleInfo sale_info;
  931. LLSelectMgr::getInstance()->selectGetSaleInfo(sale_info);
  932. if (!sale_info.isForSale())
  933. {
  934. LLNotificationsUtil::add("CantSetBuyObject");
  935. // Set click action back to its old value
  936. U8 click_action = 0;
  937. LLSelectMgr::getInstance()->selectionGetClickAction(&click_action);
  938. std::string item_value = click_action_to_string_value(click_action);
  939. box->setValue(LLSD(item_value));
  940. return;
  941. }
  942. }
  943. else if (click_action == CLICK_ACTION_PAY)
  944. {
  945. // Verify object has script with money() handler
  946. LLSelectionPayable payable;
  947. bool can_pay = LLSelectMgr::getInstance()->getSelection()->applyToObjects(&payable);
  948. if (!can_pay)
  949. {
  950. // Warn, but do it anyway.
  951. LLNotificationsUtil::add("ClickActionNotPayable");
  952. }
  953. }
  954. LLSelectMgr::getInstance()->selectionSetClickAction(click_action);
  955. }
  956. // static
  957. void LLPanelPermissions::onCommitIncludeInSearch(LLUICtrl* ctrl, void*)
  958. {
  959. LLCheckBoxCtrl* box = (LLCheckBoxCtrl*)ctrl;
  960. llassert(box);
  961. LLSelectMgr::getInstance()->selectionSetIncludeInSearch(box->get());
  962. }