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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llchiclet.h
  3.  * @brief LLChiclet class header file
  4.  *
  5.  * $LicenseInfo:firstyear=2002&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2002-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #ifndef LL_LLCHICLET_H
  33. #define LL_LLCHICLET_H
  34. #include "llavatariconctrl.h"
  35. #include "llbutton.h"
  36. #include "llpanel.h"
  37. #include "lltextbox.h"
  38. #include "lloutputmonitorctrl.h"
  39. #include "llgroupmgr.h"
  40. #include "llimview.h"
  41. class LLMenuGL;
  42. class LLIMFloater;
  43. /**
  44.  * Class for displaying amount of messages/notifications(unread).
  45.  */
  46. class LLChicletNotificationCounterCtrl : public LLTextBox
  47. {
  48. public:
  49. struct Params : public LLInitParam::Block<Params, LLTextBox::Params>
  50. {
  51. /**
  52. * Contains maximum displayed count of unread messages. Default value is 9.
  53. *
  54. * If count is less than "max_unread_count" will be displayed as is.
  55. * Otherwise 9+ will be shown (for default value).
  56. */
  57. Optional<S32> max_displayed_count;
  58. Params();
  59. };
  60. /**
  61.  * Sets number of notifications
  62.  */
  63. virtual void setCounter(S32 counter);
  64. /**
  65.  * Returns number of notifications
  66.  */
  67. virtual S32 getCounter() const { return mCounter; }
  68. /**
  69.  * Returns width, required to display amount of notifications in text form.
  70.  * Width is the only valid value.
  71.  */
  72. /*virtual*/ LLRect getRequiredRect();
  73. /**
  74.  * Sets number of notifications using LLSD
  75.  */
  76. /*virtual*/ void setValue(const LLSD& value);
  77. /**
  78.  * Returns number of notifications wrapped in LLSD
  79.  */
  80. /*virtual*/ LLSD getValue() const;
  81. protected:
  82. LLChicletNotificationCounterCtrl(const Params& p);
  83. friend class LLUICtrlFactory;
  84. private:
  85. S32 mCounter;
  86. S32 mInitialWidth;
  87. S32 mMaxDisplayedCount;
  88. };
  89. /**
  90.  * Class for displaying avatar's icon in P2P chiclet.
  91.  */
  92. class LLChicletAvatarIconCtrl : public LLAvatarIconCtrl
  93. {
  94. public:
  95. struct Params : public LLInitParam::Block<Params, LLAvatarIconCtrl::Params>
  96. {
  97. Params()
  98. {
  99. draw_tooltip(FALSE);
  100. mouse_opaque(FALSE);
  101. default_icon_name("Generic_Person");
  102. };
  103. };
  104. protected:
  105. LLChicletAvatarIconCtrl(const Params& p);
  106. friend class LLUICtrlFactory;
  107. };
  108. /**
  109.  * Class for displaying group's icon in Group chiclet.
  110.  */
  111. class LLChicletGroupIconCtrl : public LLIconCtrl
  112. {
  113. public:
  114. struct Params : public LLInitParam::Block<Params, LLIconCtrl::Params>
  115. {
  116. Optional<std::string> default_icon;
  117. Params()
  118.  : default_icon("default_icon", "Generic_Group")
  119. {
  120. };
  121. };
  122. /**
  123.  * Sets icon, if value is LLUUID::null - default icon will be set.
  124.  */
  125. virtual void setValue(const LLSD& value );
  126. protected:
  127. LLChicletGroupIconCtrl(const Params& p);
  128. friend class LLUICtrlFactory;
  129. std::string mDefaultIcon;
  130. };
  131. /**
  132.  * Class for displaying icon in inventory offer chiclet.
  133.  */
  134. class LLChicletInvOfferIconCtrl : public LLChicletAvatarIconCtrl
  135. {
  136. public:
  137. struct Params :
  138. public LLInitParam::Block<Params, LLChicletAvatarIconCtrl::Params>
  139. {
  140. Optional<std::string> default_icon;
  141. Params()
  142.  : default_icon("default_icon", "Generic_Object_Small")
  143. {
  144. avatar_id = LLUUID::null;
  145. };
  146. };
  147. /**
  148.  * Sets icon, if value is LLUUID::null - default icon will be set.
  149.  */
  150. virtual void setValue(const LLSD& value );
  151. protected:
  152. LLChicletInvOfferIconCtrl(const Params& p);
  153. friend class LLUICtrlFactory;
  154. private:
  155. std::string mDefaultIcon;
  156. };
  157. /**
  158.  * Class for displaying of speaker's voice indicator 
  159.  */
  160. class LLChicletSpeakerCtrl : public LLOutputMonitorCtrl
  161. {
  162. public:
  163. struct Params : public LLInitParam::Block<Params, LLOutputMonitorCtrl::Params>
  164. {
  165. Params(){};
  166. };
  167. protected:
  168. LLChicletSpeakerCtrl(const Params&p);
  169. friend class LLUICtrlFactory;
  170. };
  171. /**
  172.  * Base class for all chiclets.
  173.  */
  174. class LLChiclet : public LLUICtrl
  175. {
  176. public:
  177. struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
  178. {
  179. Optional<bool> show_counter,
  180.    enable_counter;
  181. Params();
  182. };
  183. /*virtual*/ ~LLChiclet();
  184. /**
  185.  * Associates chat session id with chiclet.
  186.  */
  187. virtual void setSessionId(const LLUUID& session_id) { mSessionId = session_id; }
  188. /**
  189.  * Returns associated chat session.
  190.  */
  191. virtual const LLUUID& getSessionId() const { return mSessionId; }
  192. /**
  193.  * Sets number of unread notifications.
  194.  */
  195. virtual void setCounter(S32 counter) = 0;
  196. /**
  197.  * Returns number of unread notifications.
  198.  */
  199. virtual S32 getCounter() = 0;
  200. /**
  201.  * Sets show counter state.
  202.  */
  203. virtual void setShowCounter(bool show) { mShowCounter = show; }
  204. /**
  205.  * Returns show counter state.
  206.  */
  207. virtual bool getShowCounter() {return mShowCounter;};
  208. /**
  209.  * Connects chiclet clicked event with callback.
  210.  */
  211. /*virtual*/ boost::signals2::connection setLeftButtonClickCallback(
  212. const commit_callback_t& cb);
  213. typedef boost::function<void (LLChiclet* ctrl, const LLSD& param)> 
  214. chiclet_size_changed_callback_t;
  215. /**
  216.  * Connects chiclets size changed event with callback.
  217.  */
  218. virtual boost::signals2::connection setChicletSizeChangedCallback(
  219. const chiclet_size_changed_callback_t& cb);
  220. /**
  221.  * Sets IM Session id using LLSD
  222.  */
  223. /*virtual*/ LLSD getValue() const;
  224. /**
  225.  * Returns IM Session id using LLSD
  226.  */
  227. /*virtual*/ void setValue(const LLSD& value);
  228. protected:
  229. friend class LLUICtrlFactory;
  230. LLChiclet(const Params& p);
  231. /**
  232.  * Notifies subscribers about click on chiclet.
  233.  */
  234. /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
  235. /**
  236.  * Notifies subscribers about chiclet size changed event.
  237.  */
  238. virtual void onChicletSizeChanged();
  239. private:
  240. LLUUID mSessionId;
  241. bool mShowCounter;
  242. typedef boost::signals2::signal<void (LLChiclet* ctrl, const LLSD& param)> 
  243. chiclet_size_changed_signal_t;
  244. chiclet_size_changed_signal_t mChicletSizeChangedSignal;
  245. };
  246. /**
  247.  * Base class for Instant Message chiclets.
  248.  * IMChiclet displays icon, number of unread messages(optional)
  249.  * and voice chat status(optional).
  250.  */
  251. class LLIMChiclet : public LLChiclet
  252. {
  253. public:
  254. enum EType {
  255. TYPE_UNKNOWN,
  256. TYPE_IM,
  257. TYPE_GROUP,
  258. TYPE_AD_HOC
  259. };
  260. struct Params : public LLInitParam::Block<Params, LLChiclet::Params>
  261. {
  262. Params(){}
  263. };
  264. virtual ~LLIMChiclet() {};
  265. /**
  266.  * It is used for default setting up of chicklet:click handler, etc.  
  267.  */
  268. BOOL postBuild();
  269. /**
  270.  * Sets IM session name. This name will be displayed in chiclet tooltip.
  271.  */
  272. virtual void setIMSessionName(const std::string& name) { setToolTip(name); }
  273. /**
  274.  * Sets id of person/group user is chatting with.
  275.  * Session id should be set before calling this
  276.  */
  277. virtual void setOtherParticipantId(const LLUUID& other_participant_id) { mOtherParticipantId = other_participant_id; }
  278. /**
  279.  * Gets id of person/group user is chatting with.
  280.  */
  281. virtual LLUUID getOtherParticipantId() { return mOtherParticipantId; }
  282. /**
  283.  * Init Speaker Control with speaker's ID
  284.  */
  285. virtual void initSpeakerControl();
  286. /**
  287.  * set status (Shows/Hide) for voice control.
  288.  */
  289. virtual void setShowSpeaker(bool show);
  290. /**
  291.  * Returns voice chat status control visibility.
  292.  */
  293. virtual bool getShowSpeaker() {return mShowSpeaker;};
  294. /**
  295.  * Shows/Hides for voice control for a chiclet.
  296.  */
  297. virtual void toggleSpeakerControl();
  298. /**
  299. * Sets number of unread messages. Will update chiclet's width if number text 
  300. * exceeds size of counter and notify it's parent about size change.
  301. */
  302. virtual void setCounter(S32);
  303. /**
  304. * Enables/disables the counter control for a chiclet.
  305. */
  306. virtual void enableCounterControl(bool enable);
  307. /**
  308. * Sets show counter state.
  309. */
  310. virtual void setShowCounter(bool show);
  311. /**
  312. * Shows/Hides for counter control for a chiclet.
  313. */
  314. virtual void toggleCounterControl();
  315. /**
  316. * Sets required width for a chiclet according to visible controls.
  317. */
  318. virtual void setRequiredWidth();
  319. /**
  320.  * Shows/hides overlay icon concerning new unread messages.
  321.  */
  322. virtual void setShowNewMessagesIcon(bool show);
  323. /**
  324.  * Returns visibility of overlay icon concerning new unread messages.
  325.  */
  326. virtual bool getShowNewMessagesIcon();
  327. virtual void draw();
  328. /**
  329.  * Determine whether given ID refers to a group or an IM chat session.
  330.  * 
  331.  * This is used when we need to chose what IM chiclet (P2P/group)
  332.  * class to instantiate.
  333.  * 
  334.  * @param session_id session ID.
  335.  * @return TYPE_GROUP in case of group chat session,
  336.  *         TYPE_IM in case of P2P session,
  337.  *         TYPE_UNKNOWN otherwise.
  338.  */
  339. static EType getIMSessionType(const LLUUID& session_id);
  340. /**
  341.  * The action taken on mouse down event.
  342.  * 
  343.  * Made public so that it can be triggered from outside
  344.  * (more specifically, from the Active IM window).
  345.  */
  346. virtual void onMouseDown();
  347. virtual void setToggleState(bool toggle);
  348. protected:
  349. LLIMChiclet(const LLIMChiclet::Params& p);
  350. protected:
  351. bool mShowSpeaker;
  352. bool mCounterEnabled;
  353. /* initial width of chiclet, should not include counter or speaker width */
  354. S32 mDefaultWidth;
  355. LLIconCtrl* mNewMessagesIcon;
  356. LLChicletNotificationCounterCtrl* mCounterCtrl;
  357. LLChicletSpeakerCtrl* mSpeakerCtrl;
  358. LLButton* mChicletButton;
  359. /** the id of another participant, either an avatar id or a group id*/
  360. LLUUID mOtherParticipantId;
  361. template<typename Container>
  362. struct CollectChicletCombiner {
  363. typedef Container result_type;
  364. template<typename InputIterator>
  365. Container operator()(InputIterator first, InputIterator last) const {
  366. Container c = Container();
  367. for (InputIterator iter = first; iter != last; iter++) {
  368. if (*iter != NULL) {
  369. c.push_back(*iter);
  370. }
  371. }
  372. return c;
  373. }
  374. };
  375. public:
  376. static boost::signals2::signal<LLChiclet* (const LLUUID&),
  377. CollectChicletCombiner<std::list<LLChiclet*> > >
  378. sFindChicletsSignal;
  379. };
  380. /**
  381.  * Implements P2P chiclet.
  382.  */
  383. class LLIMP2PChiclet : public LLIMChiclet
  384. {
  385. public:
  386. struct Params : public LLInitParam::Block<Params, LLIMChiclet::Params>
  387. {
  388. Optional<LLButton::Params> chiclet_button;
  389. Optional<LLChicletAvatarIconCtrl::Params> avatar_icon;
  390. Optional<LLChicletNotificationCounterCtrl::Params> unread_notifications;
  391. Optional<LLChicletSpeakerCtrl::Params> speaker;
  392. Optional<LLIconCtrl::Params> new_message_icon;
  393. Optional<bool> show_speaker;
  394. Params();
  395. };
  396. /* virtual */ void setOtherParticipantId(const LLUUID& other_participant_id);
  397. /**
  398.  * Init Speaker Control with speaker's ID
  399.  */
  400. /*virtual*/ void initSpeakerControl();
  401. /**
  402.  * Returns number of unread messages.
  403.  */
  404. /*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); }
  405. protected:
  406. LLIMP2PChiclet(const Params& p);
  407. friend class LLUICtrlFactory;
  408. /**
  409.  * Creates chiclet popup menu. Will create P2P or Group IM Chat menu 
  410.  * based on other participant's id.
  411.  */
  412. virtual void createPopupMenu();
  413. /**
  414.  * Processes clicks on chiclet popup menu.
  415.  */
  416. virtual void onMenuItemClicked(const LLSD& user_data);
  417. /**
  418.  * Displays popup menu.
  419.  */
  420. /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
  421. /** 
  422.  * Enables/disables menus based on relationship with other participant.
  423.  * Enables/disables "show session" menu item depending on visible IM floater existence.
  424.  */
  425. virtual void updateMenuItems();
  426. private:
  427. LLChicletAvatarIconCtrl* mChicletIconCtrl;
  428. LLMenuGL* mPopupMenu;
  429. };
  430. /**
  431.  * Implements AD-HOC chiclet.
  432.  */
  433. class LLAdHocChiclet : public LLIMChiclet
  434. {
  435. public:
  436. struct Params : public LLInitParam::Block<Params, LLIMChiclet::Params>
  437. {
  438. Optional<LLButton::Params> chiclet_button;
  439. Optional<LLChicletAvatarIconCtrl::Params> avatar_icon;
  440. Optional<LLChicletNotificationCounterCtrl::Params> unread_notifications;
  441. Optional<LLChicletSpeakerCtrl::Params> speaker;
  442. Optional<LLIconCtrl::Params> new_message_icon;
  443. Optional<bool> show_speaker;
  444. Optional<LLColor4> avatar_icon_color;
  445. Params();
  446. };
  447. /**
  448.  * Sets session id.
  449.  * Session ID for group chat is actually Group ID.
  450.  */
  451. /*virtual*/ void setSessionId(const LLUUID& session_id);
  452. /**
  453.  * Keep Speaker Control with actual speaker's ID
  454.  */
  455. /*virtual*/ void draw();
  456. /**
  457.  * Init Speaker Control with speaker's ID
  458.  */
  459. /*virtual*/ void initSpeakerControl();
  460. /**
  461.  * Returns number of unread messages.
  462.  */
  463. /*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); }
  464. protected:
  465. LLAdHocChiclet(const Params& p);
  466. friend class LLUICtrlFactory;
  467. /**
  468.  * Creates chiclet popup menu. Will create AdHoc Chat menu 
  469.  * based on other participant's id.
  470.  */
  471. virtual void createPopupMenu();
  472. /**
  473.  * Processes clicks on chiclet popup menu.
  474.  */
  475. virtual void onMenuItemClicked(const LLSD& user_data);
  476. /**
  477.  * Displays popup menu.
  478.  */
  479. virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
  480. /**
  481.  * Finds a current speaker and resets the SpeakerControl with speaker's ID
  482.  */
  483. /*virtual*/ void switchToCurrentSpeaker();
  484. private:
  485. LLChicletAvatarIconCtrl* mChicletIconCtrl;
  486. LLMenuGL* mPopupMenu;
  487. };
  488. /**
  489.  * Chiclet for script floaters.
  490.  */
  491. class LLScriptChiclet : public LLIMChiclet
  492. {
  493. public:
  494. struct Params : public LLInitParam::Block<Params, LLIMChiclet::Params>
  495. {
  496. Optional<LLButton::Params> chiclet_button;
  497. Optional<LLIconCtrl::Params> icon;
  498. Optional<LLIconCtrl::Params> new_message_icon;
  499. Params();
  500. };
  501. /*virtual*/ void setSessionId(const LLUUID& session_id);
  502. /*virtual*/ void setCounter(S32 counter);
  503. /*virtual*/ S32 getCounter() { return 0; }
  504. /**
  505.  * Toggle script floater
  506.  */
  507. /*virtual*/ void onMouseDown();
  508. protected:
  509. LLScriptChiclet(const Params&);
  510. friend class LLUICtrlFactory;
  511. private:
  512. LLIconCtrl* mChicletIconCtrl;
  513. };
  514. /**
  515.  * Chiclet for inventory offer script floaters.
  516.  */
  517. class LLInvOfferChiclet: public LLIMChiclet
  518. {
  519. public:
  520. struct Params : public LLInitParam::Block<Params, LLIMChiclet::Params>
  521. {
  522. Optional<LLButton::Params> chiclet_button;
  523. Optional<LLChicletInvOfferIconCtrl::Params> icon;
  524. Optional<LLIconCtrl::Params> new_message_icon;
  525. Params();
  526. };
  527. /*virtual*/ void setSessionId(const LLUUID& session_id);
  528. /*virtual*/ void setCounter(S32 counter);
  529. /*virtual*/ S32 getCounter() { return 0; }
  530. /**
  531.  * Toggle script floater
  532.  */
  533. /*virtual*/ void onMouseDown();
  534. protected:
  535. LLInvOfferChiclet(const Params&);
  536. friend class LLUICtrlFactory;
  537. private:
  538. LLChicletInvOfferIconCtrl* mChicletIconCtrl;
  539. };
  540. /**
  541.  * Implements Group chat chiclet.
  542.  */
  543. class LLIMGroupChiclet : public LLIMChiclet, public LLGroupMgrObserver
  544. {
  545. public:
  546. struct Params : public LLInitParam::Block<Params, LLIMChiclet::Params>
  547. {
  548. Optional<LLButton::Params> chiclet_button;
  549. Optional<LLChicletGroupIconCtrl::Params> group_icon;
  550. Optional<LLChicletNotificationCounterCtrl::Params> unread_notifications;
  551. Optional<LLChicletSpeakerCtrl::Params> speaker;
  552. Optional<LLIconCtrl::Params> new_message_icon;
  553. Optional<bool> show_speaker;
  554. Params();
  555. };
  556. /**
  557.  * Sets session id.
  558.  * Session ID for group chat is actually Group ID.
  559.  */
  560. /*virtual*/ void setSessionId(const LLUUID& session_id);
  561. /**
  562.  * Keep Speaker Control with actual speaker's ID
  563.  */
  564. /*virtual*/ void draw();
  565. /**
  566.  * Callback for LLGroupMgrObserver, we get this when group data is available or changed.
  567.  * Sets group icon.
  568.  */
  569. /*virtual*/ void changed(LLGroupChange gc);
  570. /**
  571.  * Init Speaker Control with speaker's ID
  572.  */
  573. /*virtual*/ void initSpeakerControl();
  574. /**
  575.  * Returns number of unread messages.
  576.  */
  577. /*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); }
  578. ~LLIMGroupChiclet();
  579. protected:
  580. LLIMGroupChiclet(const Params& p);
  581. friend class LLUICtrlFactory;
  582. /**
  583.  * Finds a current speaker and resets the SpeakerControl with speaker's ID
  584.  */
  585. /*virtual*/ void switchToCurrentSpeaker();
  586. /**
  587.  * Creates chiclet popup menu. Will create P2P or Group IM Chat menu 
  588.  * based on other participant's id.
  589.  */
  590. virtual void createPopupMenu();
  591. /**
  592.  * Processes clicks on chiclet popup menu.
  593.  */
  594. virtual void onMenuItemClicked(const LLSD& user_data);
  595. /**
  596.  * Enables/disables "show session" menu item depending on visible IM floater existence.
  597.  */
  598. virtual void updateMenuItems();
  599. /**
  600.  * Displays popup menu.
  601.  */
  602. /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
  603. private:
  604. LLChicletGroupIconCtrl* mChicletIconCtrl;
  605. LLMenuGL* mPopupMenu;
  606. };
  607. /**
  608.  * Implements notification chiclet. Used to display total amount of unread messages 
  609.  * across all IM sessions, total amount of system notifications. See EXT-3147 for details
  610.  */
  611. class LLSysWellChiclet : public LLChiclet
  612. {
  613. public:
  614. struct Params : public LLInitParam::Block<Params, LLChiclet::Params>
  615. {
  616. Optional<LLButton::Params> button;
  617. Optional<LLChicletNotificationCounterCtrl::Params> unread_notifications;
  618. /**
  619.  * Contains maximum displayed count of unread messages. Default value is 9.
  620.  *
  621.  * If count is less than "max_unread_count" will be displayed as is.
  622.  * Otherwise 9+ will be shown (for default value).
  623.  */
  624. Optional<S32> max_displayed_count;
  625. /**
  626.  * How many time chiclet should flash before set "Lit" state. Default value is 3.
  627.  */
  628. Optional<S32> flash_to_lit_count;
  629. /**
  630.  * Period of flashing while setting "Lit" state, in seconds. Default value is 0.5.
  631.  */
  632. Optional<F32> flash_period;
  633. Params();
  634. };
  635. /*virtual*/ void setCounter(S32 counter);
  636. // *TODO: mantipov: seems getCounter is not necessary for LLNotificationChiclet
  637. // but inherited interface requires it to implement. 
  638. // Probably it can be safe removed.
  639. /*virtual*/S32 getCounter() { return mCounter; }
  640. boost::signals2::connection setClickCallback(const commit_callback_t& cb);
  641. /*virtual*/ ~LLSysWellChiclet();
  642. void setToggleState(BOOL toggled);
  643. void setNewMessagesState(bool new_messages);
  644. //this method should change a widget according to state of the SysWellWindow 
  645. virtual void updateWidget(bool is_window_empty);
  646. protected:
  647. LLSysWellChiclet(const Params& p);
  648. friend class LLUICtrlFactory;
  649. /**
  650.  * Change Well 'Lit' state from 'Lit' to 'Unlit' and vice-versa.
  651.  *
  652.  * There is an assumption that it will be called 2*N times to do not change its start state.
  653.  * @see FlashToLitTimer
  654.  */
  655. void changeLitState();
  656. /**
  657.  * Displays menu.
  658.  */
  659. virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
  660. virtual void createMenu() = 0;
  661. protected:
  662. class FlashToLitTimer;
  663. LLButton* mButton;
  664. S32 mCounter;
  665. S32 mMaxDisplayedCount;
  666. bool mIsNewMessagesState;
  667. FlashToLitTimer* mFlashToLitTimer;
  668. LLContextMenu* mContextMenu;
  669. };
  670. /**
  671.  * Class represented a chiclet for IM Well Icon.
  672.  *
  673.  * It displays a count of unread messages from other participants in all IM sessions.
  674.  */
  675. class LLIMWellChiclet : public LLSysWellChiclet, LLIMSessionObserver
  676. {
  677. friend class LLUICtrlFactory;
  678. public:
  679. virtual void sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id) {}
  680. virtual void sessionRemoved(const LLUUID& session_id) { messageCountChanged(LLSD()); }
  681. virtual void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id) {}
  682. ~LLIMWellChiclet();
  683. protected:
  684. LLIMWellChiclet(const Params& p);
  685. /**
  686.  * Processes clicks on chiclet popup menu.
  687.  */
  688. virtual void onMenuItemClicked(const LLSD& user_data);
  689. /**
  690.  * Enables chiclet menu items.
  691.  */
  692. bool enableMenuItem(const LLSD& user_data);
  693. /**
  694.  * Creates menu.
  695.  */
  696. /*virtual*/ void createMenu();
  697. /**
  698.  * Handles changes in a session (message was added, messages were read, etc.)
  699.  *
  700.  * It get total count of unread messages from a LLIMMgr in all opened sessions and display it.
  701.  *
  702.  * @param[in] session_data contains session related data, is not used now
  703.  * ["session_id"] - id of an appropriate session
  704.  * ["participant_unread"] - count of unread messages from "real" participants.
  705.  *
  706.  * @see LLIMMgr::getNumberOfUnreadParticipantMessages()
  707.  */
  708. void messageCountChanged(const LLSD& session_data);
  709. };
  710. class LLNotificationChiclet : public LLSysWellChiclet
  711. {
  712. friend class LLUICtrlFactory;
  713. protected:
  714. LLNotificationChiclet(const Params& p);
  715. /**
  716.  * Processes clicks on chiclet menu.
  717.  */
  718. void onMenuItemClicked(const LLSD& user_data);
  719. /**
  720.  * Enables chiclet menu items.
  721.  */
  722. bool enableMenuItem(const LLSD& user_data);
  723. /**
  724.  * Creates menu.
  725.  */
  726. /*virtual*/ void createMenu();
  727. // connect counter updaters to the corresponding signals
  728. void connectCounterUpdatersToSignal(const std::string& notification_type);
  729. // methods for updating a number of unread System notifications
  730. void incUreadSystemNotifications() { setCounter(++mUreadSystemNotifications); }
  731. void decUreadSystemNotifications() { setCounter(--mUreadSystemNotifications); }
  732. /*virtual*/ void setCounter(S32 counter);
  733. S32 mUreadSystemNotifications;
  734. };
  735. /**
  736.  * Storage class for all IM chiclets. Provides mechanism to display, 
  737.  * scroll, create, remove chiclets.
  738.  */
  739. class LLChicletPanel : public LLPanel
  740. {
  741. public:
  742. struct Params : public LLInitParam::Block<Params, LLPanel::Params>
  743. {
  744. Optional<S32> chiclet_padding,
  745.   scrolling_offset,
  746.   scroll_button_hpad,
  747.   scroll_ratio;
  748. Optional<S32> min_width;
  749. Params();
  750. };
  751. virtual ~LLChicletPanel();
  752. /**
  753.  * Creates chiclet and adds it to chiclet list at specified index.
  754.  */
  755. template<class T> T* createChiclet(const LLUUID& session_id, S32 index);
  756. /**
  757.  * Creates chiclet and adds it to chiclet list at right.
  758.  */
  759. template<class T> T* createChiclet(const LLUUID& session_id);
  760. /**
  761.  * Returns pointer to chiclet of specified type at specified index.
  762.  */
  763. template<class T> T* getChiclet(S32 index);
  764. /**
  765.  * Returns pointer to LLChiclet at specified index.
  766.  */
  767. LLChiclet* getChiclet(S32 index) { return getChiclet<LLChiclet>(index); }
  768. /**
  769.  * Searches a chiclet using IM session id.
  770.  */
  771. template<class T> T* findChiclet(const LLUUID& im_session_id);
  772. /**
  773.  * Returns number of hosted chiclets.
  774.  */
  775. S32 getChicletCount() {return mChicletList.size();};
  776. /**
  777.  * Returns index of chiclet in list.
  778.  */
  779. S32 getChicletIndex(const LLChiclet* chiclet);
  780. /**
  781.  * Removes chiclet by index.
  782.  */
  783. void removeChiclet(S32 index);
  784. /**
  785.  * Removes chiclet by pointer.
  786.  */
  787. void removeChiclet(LLChiclet* chiclet);
  788. /**
  789.  * Removes chiclet by IM session id.
  790.  */
  791. void removeChiclet(const LLUUID& im_session_id);
  792. /**
  793.  * Removes all chiclets.
  794.  */
  795. void removeAll();
  796. /**
  797.  * Scrolls the panel to the specified chiclet
  798.  */
  799. void scrollToChiclet(const LLChiclet* chiclet);
  800. boost::signals2::connection setChicletClickedCallback(
  801. const commit_callback_t& cb);
  802. /*virtual*/ BOOL postBuild();
  803. /**
  804.  * Handler for the Voice Client's signal. Finds a corresponding chiclet and toggles its SpeakerControl
  805.  */
  806. void onCurrentVoiceChannelChanged(const LLUUID& session_id);
  807. /**
  808.  * Reshapes controls and rearranges chiclets if needed.
  809.  */
  810. /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE );
  811. /*virtual*/ void draw();
  812. S32 getMinWidth() const { return mMinWidth; }
  813. S32 getTotalUnreadIMCount();
  814. S32 notifyParent(const LLSD& info);
  815. /**
  816.  * Toggle chiclet by session id ON and toggle OFF all other chiclets.
  817.  */
  818. void setChicletToggleState(const LLUUID& session_id, bool toggle);
  819. protected:
  820. LLChicletPanel(const Params&p);
  821. friend class LLUICtrlFactory;
  822. /**
  823.  * Adds chiclet to list and rearranges all chiclets. 
  824.  * They should be right aligned, most recent right. See EXT-1293
  825.  *
  826.  * It calculates position of the first chiclet in the list. Other chiclets are placed in arrange().
  827.  *
  828.  * @see arrange()
  829.  */
  830. bool addChiclet(LLChiclet*, S32 index);
  831. /**
  832.  * Arranges chiclets to have them in correct positions.
  833.  *
  834.  * Method bases on assumption that first chiclet has correct rect and starts from the its position.
  835.  *
  836.  * @see addChiclet()
  837.  */
  838. void arrange();
  839. /**
  840.  * Returns true if chiclets can be scrolled right.
  841.  */
  842. bool canScrollRight();
  843. /**
  844.  * Returns true if we need to show scroll buttons
  845.  */
  846. bool needShowScroll();
  847. /**
  848.  * Returns true if chiclets can be scrolled left.
  849.  */
  850. bool canScrollLeft();
  851. /**
  852.  * Shows or hides chiclet scroll buttons if chiclets can or can not be scrolled.
  853.  */
  854. void showScrollButtonsIfNeeded();
  855. /**
  856.  * Shifts chiclets left or right.
  857.  */
  858. void shiftChiclets(S32 offset, S32 start_index = 0);
  859. /**
  860.  * Removes gaps between first chiclet and scroll area left side,
  861.  * last chiclet and scroll area right side.
  862.  */
  863. void trimChiclets();
  864. /**
  865.  * Scrolls chiclets to right or left.
  866.  */
  867. void scroll(S32 offset);
  868. /**
  869.  * Verifies that chiclets can be scrolled left, then calls scroll()
  870.  */
  871. void scrollLeft();
  872. /**
  873.  * Verifies that chiclets can be scrolled right, then calls scroll()
  874.  */
  875. void scrollRight();
  876. /**
  877.  * Callback for left scroll button clicked
  878.  */
  879. void onLeftScrollClick();
  880. /**
  881.  * Callback for right scroll button clicked
  882.  */
  883. void onRightScrollClick();
  884. /**
  885.  * Callback for right scroll button held down event
  886.  */
  887. void onLeftScrollHeldDown();
  888. /**
  889.  * Callback for left scroll button held down event
  890.  */
  891. void onRightScrollHeldDown();
  892. /**
  893.  * Callback for mouse wheel scrolled, calls scrollRight() or scrollLeft()
  894.  */
  895. BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
  896. /**
  897.  * Notifies subscribers about click on chiclet.
  898.  * Do not place any code here, instead subscribe on event (see setChicletClickedCallback).
  899.  */
  900. void onChicletClick(LLUICtrl*ctrl,const LLSD&param);
  901. /**
  902.  * Callback for chiclet size changed event, rearranges chiclets.
  903.  */
  904. void onChicletSizeChanged(LLChiclet* ctrl, const LLSD& param);
  905. typedef std::vector<LLChiclet*> chiclet_list_t;
  906. /**
  907.  * Removes chiclet from scroll area and chiclet list.
  908.  */
  909. void removeChiclet(chiclet_list_t::iterator it);
  910. S32 getChicletPadding() { return mChicletPadding; }
  911. S32 getScrollingOffset() { return mScrollingOffset; }
  912. bool isAnyIMFloaterDoked();
  913. protected:
  914. chiclet_list_t mChicletList;
  915. LLButton* mLeftScrollButton;
  916. LLButton* mRightScrollButton;
  917. LLPanel* mScrollArea;
  918. S32 mChicletPadding;
  919. S32 mScrollingOffset;
  920. S32 mScrollButtonHPad;
  921. S32 mScrollRatio;
  922. S32 mMinWidth;
  923. bool mShowControls;
  924. static const S32 s_scroll_ratio;
  925. };
  926. template<class T> 
  927. T* LLChicletPanel::createChiclet(const LLUUID& session_id, S32 index)
  928. {
  929. typename T::Params params;
  930. T* chiclet = LLUICtrlFactory::create<T>(params);
  931. if(!chiclet)
  932. {
  933. llwarns << "Could not create chiclet" << llendl;
  934. return NULL;
  935. }
  936. if(!addChiclet(chiclet, index))
  937. {
  938. delete chiclet;
  939. llwarns << "Could not add chiclet to chiclet panel" << llendl;
  940. return NULL;
  941. }
  942. if (!isAnyIMFloaterDoked())
  943. {
  944. scrollToChiclet(chiclet);
  945. }
  946. chiclet->setSessionId(session_id);
  947. return chiclet;
  948. }
  949. template<class T>
  950. T* LLChicletPanel::createChiclet(const LLUUID& session_id)
  951. {
  952. return createChiclet<T>(session_id, mChicletList.size());
  953. }
  954. template<class T>
  955. T* LLChicletPanel::findChiclet(const LLUUID& im_session_id)
  956. {
  957. if(im_session_id.isNull())
  958. {
  959. return NULL;
  960. }
  961. chiclet_list_t::const_iterator it = mChicletList.begin();
  962. for( ; mChicletList.end() != it; ++it)
  963. {
  964. LLChiclet* chiclet = *it;
  965. llassert(chiclet);
  966. if (!chiclet) continue;
  967. if(chiclet->getSessionId() == im_session_id)
  968. {
  969. T* result = dynamic_cast<T*>(chiclet);
  970. if(!result)
  971. {
  972. llwarns << "Found chiclet but of wrong type " << llendl;
  973. continue;
  974. }
  975. return result;
  976. }
  977. }
  978. return NULL;
  979. }
  980. template<class T> T* LLChicletPanel::getChiclet(S32 index)
  981. {
  982. if(index < 0 || index >= getChicletCount())
  983. {
  984. return NULL;
  985. }
  986. LLChiclet* chiclet = mChicletList[index];
  987. T*result = dynamic_cast<T*>(chiclet);
  988. if(!result && chiclet)
  989. {
  990. llwarns << "Found chiclet but of wrong type " << llendl;
  991. }
  992. return result;
  993. }
  994. #endif // LL_LLCHICLET_H