OSDN Git Service

Moved libopenmetavrse outside the radegast folder, now we expected it to be in ....
[radegast/radegast.git] / Radegast / GUI / Consoles / Assets / Notecard.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.ComponentModel;\r
34 using System.Drawing;\r
35 using System.Data;\r
36 using System.Linq;\r
37 using System.Text;\r
38 using System.Windows.Forms;\r
39 using OpenMetaverse;\r
40 using OpenMetaverse.Assets;\r
41 \r
42 namespace Radegast\r
43 {\r
44     public partial class Notecard : DettachableControl\r
45     {\r
46         private RadegastInstance instance;\r
47         private GridClient client { get { return instance.Client; } }\r
48         private InventoryNotecard notecard;\r
49         private AssetNotecard recievedNotecard;\r
50 \r
51         public Notecard(RadegastInstance instance, InventoryNotecard notecard)\r
52         {\r
53             InitializeComponent();\r
54             Disposed += new EventHandler(Notecard_Disposed);\r
55 \r
56             this.instance = instance;\r
57             this.notecard = notecard;\r
58             Text = notecard.Name;\r
59 \r
60             rtbContent.DetectUrls = false;\r
61 \r
62             rtbContent.Text = " ";\r
63             UpdateStatus("Loading...");\r
64             client.Assets.RequestInventoryAsset(notecard, true, Assets_OnAssetReceived);\r
65         }\r
66 \r
67         void Notecard_Disposed(object sender, EventArgs e)\r
68         {\r
69         }\r
70 \r
71         void Assets_OnAssetReceived(AssetDownload transfer, Asset asset)\r
72         {\r
73             if (InvokeRequired)\r
74             {\r
75                 BeginInvoke(new MethodInvoker(delegate()\r
76                     {\r
77                         Assets_OnAssetReceived(transfer, asset);\r
78                     }\r
79                 ));\r
80                 return;\r
81             }\r
82 \r
83             if (transfer.Success)\r
84             {\r
85                 AssetNotecard n = (AssetNotecard)asset;\r
86                 n.Decode();\r
87                 recievedNotecard = n;\r
88 \r
89                 string noteText = string.Empty;\r
90                 rtbContent.Clear();\r
91 \r
92                 for (int i = 0; i < n.BodyText.Length; i++)\r
93                 {\r
94                     char c = n.BodyText[i];\r
95 \r
96                     if ((int)c == 0xdbc0)\r
97                     {\r
98                         int index = (int)n.BodyText[++i] - 0xdc00;\r
99                         InventoryItem e = n.EmbeddedItems[index];\r
100                         rtbContent.AppendText(noteText);\r
101                         rtbContent.InsertLink(e.Name, string.Format("radegast://embeddedasset/{0}", index));\r
102                         noteText = string.Empty;\r
103                     }\r
104                     else\r
105                     {\r
106                         noteText += c;\r
107                     }\r
108                 }\r
109 \r
110                 rtbContent.Text += noteText;\r
111 \r
112                 if (n.EmbeddedItems != null && n.EmbeddedItems.Count > 0)\r
113                 {\r
114                     tbtnAttachments.Enabled = true;\r
115                     tbtnAttachments.Visible = true;\r
116                     foreach (InventoryItem item in n.EmbeddedItems)\r
117                     {\r
118                         int ix = InventoryConsole.GetItemImageIndex(item.AssetType.ToString().ToLower());\r
119                         ToolStripMenuItem titem = new ToolStripMenuItem(item.Name);\r
120 \r
121                         if (ix != -1)\r
122                         {\r
123                             titem.Image = frmMain.ResourceImages.Images[ix];\r
124                             titem.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;\r
125                         }\r
126                         else\r
127                         {\r
128                             titem.DisplayStyle = ToolStripItemDisplayStyle.Text;\r
129                         }\r
130 \r
131                         titem.Name = item.UUID.ToString(); ;\r
132                         titem.Tag = item;\r
133                         titem.Click += new EventHandler(attachmentMenuItem_Click);\r
134                         tbtnAttachments.DropDownItems.Add(titem);\r
135                     }\r
136                 }\r
137                 UpdateStatus("OK");\r
138             }\r
139             else\r
140             {\r
141                 UpdateStatus("Failed");\r
142                 rtbContent.Text = "Failed to download notecard.";\r
143             }\r
144         }\r
145 \r
146         void attachmentMenuItem_Click(object sender, EventArgs e)\r
147         {\r
148             if (sender is ToolStripMenuItem)\r
149             {\r
150                 ToolStripMenuItem titem = (ToolStripMenuItem)sender;\r
151                 InventoryItem item = (InventoryItem)titem.Tag;\r
152 \r
153                 switch (item.AssetType)\r
154                 {\r
155                     case AssetType.Texture:\r
156                         SLImageHandler ih = new SLImageHandler(instance, item.AssetUUID, string.Empty);\r
157                         ih.Text = item.Name;\r
158                         ih.ShowDetached();\r
159                         break;\r
160 \r
161                     case AssetType.Landmark:\r
162                         Landmark ln = new Landmark(instance, (InventoryLandmark)item);\r
163                         ln.ShowDetached();\r
164                         break;\r
165                 }\r
166             }\r
167         }\r
168 \r
169         private void btnRefresh_Click(object sender, EventArgs e)\r
170         {\r
171             rtbContent.Text = "Loading...";\r
172             client.Assets.RequestInventoryAsset(notecard, true, Assets_OnAssetReceived);\r
173         }\r
174 \r
175         private void rtbContent_LinkClicked(object sender, LinkClickedEventArgs e)\r
176         {\r
177             //instance.MainForm.processLink(e.LinkText);\r
178         }\r
179 \r
180 \r
181         #region Detach/Attach\r
182         protected override void ControlIsNotRetachable()\r
183         {\r
184             tbtnAttach.Visible = false;\r
185         }\r
186 \r
187         protected override void Detach()\r
188         {\r
189             base.Detach();\r
190             tbtnAttach.Text = "Attach";\r
191             tbtnExit.Enabled = true;\r
192         }\r
193 \r
194         protected override void Retach()\r
195         {\r
196             base.Retach();\r
197             tbtnAttach.Text = "Detach";\r
198             tbtnExit.Enabled = false;\r
199         }\r
200 \r
201         private void tbtnAttach_Click(object sender, EventArgs e)\r
202         {\r
203             if (Detached)\r
204             {\r
205                 Retach();\r
206             }\r
207             else\r
208             {\r
209                 Detach();\r
210             }\r
211         }\r
212         #endregion\r
213 \r
214         private void tbtnExit_Click(object sender, EventArgs e)\r
215         {\r
216             if (Detached)\r
217             {\r
218                 FindForm().Close();\r
219             }\r
220         }\r
221 \r
222         private void tbtnSave_Click(object sender, EventArgs e)\r
223         {\r
224             bool success = false;\r
225             string message = "";\r
226             AssetNotecard n = new AssetNotecard();\r
227             n.BodyText = rtbContent.Text;\r
228             n.EmbeddedItems = new List<InventoryItem>();\r
229 \r
230             for (int i = 0; i < recievedNotecard.EmbeddedItems.Count; i++)\r
231             {\r
232                 n.EmbeddedItems.Add(recievedNotecard.EmbeddedItems[i]);\r
233                 int indexChar = 0xdc00 + i;\r
234                 n.BodyText += (char)0xdbc0;\r
235                 n.BodyText += (char)indexChar;\r
236             }\r
237 \r
238             n.Encode();\r
239 \r
240             UpdateStatus("Saving...");\r
241 \r
242 \r
243             client.Inventory.RequestUploadNotecardAsset(n.AssetData, notecard.UUID,\r
244                 delegate(bool uploadSuccess, string status, UUID itemID, UUID assetID)\r
245                 {\r
246                     success = uploadSuccess;\r
247                     if (itemID == notecard.UUID)\r
248                     {\r
249                         if (success)\r
250                         {\r
251                             UpdateStatus("OK");\r
252                             notecard.AssetUUID = assetID;\r
253                         }\r
254                         else\r
255                         {\r
256                             UpdateStatus("Failed");\r
257                         }\r
258 \r
259                     }\r
260                     message = status ?? "Unknown error uploading notecard asset";\r
261                 }\r
262             );\r
263         }\r
264 \r
265         void UpdateStatus(string status)\r
266         {\r
267             if (InvokeRequired)\r
268             {\r
269                 BeginInvoke(new MethodInvoker(delegate() { UpdateStatus(status); }));\r
270                 return;\r
271             }\r
272 \r
273             tlblStatus.Text = status;\r
274         }\r
275 \r
276     }\r
277 }\r