OSDN Git Service

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