OSDN Git Service

Object window improvements
[radegast/radegast.git] / Radegast / Core / Types / AgentNameTextBox.cs
1 // \r
2 // Radegast Metaverse Client\r
3 // Copyright (c) 2009, Radegast Development Team\r
4 // All rights reserved.\r
5 // \r
6 // Redistribution and use in source and binary forms, with or without\r
7 // modification, are permitted provided that the following conditions are met:\r
8 // \r
9 //     * Redistributions of source code must retain the above copyright notice,\r
10 //       this list of conditions and the following disclaimer.\r
11 //     * Redistributions in binary form must reproduce the above copyright\r
12 //       notice, this list of conditions and the following disclaimer in the\r
13 //       documentation and/or other materials provided with the distribution.\r
14 //     * Neither the name of the application "Radegast", nor the names of its\r
15 //       contributors may be used to endorse or promote products derived from\r
16 //       this software without specific prior written permission.\r
17 // \r
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"\r
19 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
20 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r
21 // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r
22 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
23 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r
24 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r
25 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r
26 // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
27 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
28 //\r
29 // $Id$\r
30 //\r
31 using System;\r
32 using System.Collections.Generic;\r
33 using System.Windows.Forms;\r
34 using OpenMetaverse;\r
35 \r
36 namespace Radegast\r
37 {\r
38     public class AgentNameTextBox : System.Windows.Forms.TextBox\r
39     {\r
40         private UUID agentID;\r
41         private GridClient client { get { return RadegastInstance.GlobalInstance.Client; } }\r
42         private RadegastInstance instance { get { return RadegastInstance.GlobalInstance; } }\r
43 \r
44         public UUID AgentID\r
45         {\r
46             get { return agentID; }\r
47 \r
48             set\r
49             {\r
50                 agentID = value;\r
51                 string name = instance.getAvatarName(agentID);\r
52                 SetName(name);\r
53 \r
54                 // We got cached response, unhook event handlers\r
55                 if (name != RadegastInstance.INCOMPLETE_NAME)\r
56                 {\r
57                     CleanupHandlers(null, null);\r
58                 }\r
59             }\r
60         }\r
61 \r
62         public AgentNameTextBox()\r
63             : base()\r
64         {\r
65             SetStyle(ControlStyles.SupportsTransparentBackColor, true);\r
66 \r
67             Disposed += new EventHandler(CleanupHandlers);\r
68 \r
69             Text = RadegastInstance.INCOMPLETE_NAME;\r
70 \r
71             if (client != null)\r
72             {\r
73                 client.Avatars.OnAvatarNames += new AvatarManager.AvatarNamesCallback(Avatars_OnAvatarNames);\r
74             }\r
75         }\r
76 \r
77         void CleanupHandlers(object sender, EventArgs e)\r
78         {\r
79             if (client != null)\r
80             {\r
81                 client.Avatars.OnAvatarNames -= new AvatarManager.AvatarNamesCallback(Avatars_OnAvatarNames);\r
82             }\r
83         }\r
84 \r
85         void Avatars_OnAvatarNames(Dictionary<UUID, string> names)\r
86         {\r
87             if (names.ContainsKey(agentID))\r
88             {\r
89                 CleanupHandlers(null, null);\r
90                 SetName(names[agentID]);\r
91             }\r
92         }\r
93 \r
94         void SetName(string name)\r
95         {\r
96             if (InvokeRequired)\r
97             {\r
98                 BeginInvoke(new MethodInvoker(delegate() { SetName(name); }));\r
99                 return;\r
100             }\r
101 \r
102             base.Text = name;\r
103         }\r
104     }\r
105 }\r