OSDN Git Service

Update copyright year
[radegast/radegast.git] / Radegast / GUI / Dialogs / Settings.cs
1 
2 // 
3 // Radegast Metaverse Client
4 // Copyright (c) 2009-2014, Radegast Development Team
5 // All rights reserved.
6 // 
7 // Redistribution and use in source and binary forms, with or without
8 // modification, are permitted provided that the following conditions are met:
9 // 
10 //     * Redistributions of source code must retain the above copyright notice,
11 //       this list of conditions and the following disclaimer.
12 //     * Redistributions in binary form must reproduce the above copyright
13 //       notice, this list of conditions and the following disclaimer in the
14 //       documentation and/or other materials provided with the distribution.
15 //     * Neither the name of the application "Radegast", nor the names of its
16 //       contributors may be used to endorse or promote products derived from
17 //       this software without specific prior written permission.
18 // 
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27 // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 //
30 // $Id$
31 //
32 using System;
33 using System.Collections.Generic;
34 using System.ComponentModel;
35 using System.Data;
36 using System.Drawing;
37 using System.Linq;
38 using System.Text;
39 using System.Windows.Forms;
40
41 using OpenMetaverse;
42 using OpenMetaverse.StructuredData;
43
44 using Radegast.Automation;
45
46 namespace Radegast
47 {
48     public enum AutoResponseType : int
49     {
50         WhenBusy = 0,
51         WhenFromNonFriend = 1,
52         Always = 2
53     }
54
55     public partial class frmSettings : RadegastForm
56     {
57         private Settings s;
58         private static bool settingInitialized = false;
59
60         public static void InitSettigs(Settings s, bool mono)
61         {
62             if (s["im_timestamps"].Type == OSDType.Unknown)
63             {
64                 s["im_timestamps"] = OSD.FromBoolean(true);
65             }
66
67             if (s["rlv_enabled"].Type == OSDType.Unknown)
68             {
69                 s["rlv_enabled"] = new OSDBoolean(false);
70             }
71
72             if (s["mu_emotes"].Type == OSDType.Unknown)
73             {
74                 s["mu_emotes"] = new OSDBoolean(false);
75             }
76
77             if (s["friends_notification_highlight"].Type == OSDType.Unknown)
78             {
79                 s["friends_notification_highlight"] = new OSDBoolean(true);
80             }
81
82             if (!s.ContainsKey("no_typing_anim")) s["no_typing_anim"] = OSD.FromBoolean(false);
83
84             if (!s.ContainsKey("auto_response_type"))
85             {
86                 s["auto_response_type"] = (int)AutoResponseType.WhenBusy;
87                 s["auto_response_text"] = "The Resident you messaged is in 'busy mode' which means they have requested not to be disturbed.  Your message will still be shown in their IM panel for later viewing.";
88             }
89
90             if (!s.ContainsKey("script_syntax_highlight")) s["script_syntax_highlight"] = OSD.FromBoolean(true);
91
92             if (!s.ContainsKey("display_name_mode")) s["display_name_mode"] = (int)NameMode.Smart;
93
94             // Convert legacy settings from first last name to username
95             if (!s.ContainsKey("username") && (s.ContainsKey("first_name") && s.ContainsKey("last_name")))
96             {
97                 s["username"] = s["first_name"] + " " + s["last_name"];
98                 s.Remove("first_name");
99                 s.Remove("last_name");
100             }
101
102             if (!s.ContainsKey("reconnect_time")) s["reconnect_time"] = 120;
103
104             if (!s.ContainsKey("transaction_notification_chat")) s["transaction_notification_chat"] = true;
105
106             if (!s.ContainsKey("transaction_notification_dialog")) s["transaction_notification_dialog"] = true;
107
108             if (!s.ContainsKey("minimize_to_tray")) s["minimize_to_tray"] = false;
109
110             if (!s.ContainsKey("scene_window_docked")) s["scene_window_docked"] = true;
111
112             if (!s.ContainsKey("taskbar_highlight")) s["taskbar_highlight"] = true;
113
114             if (!s.ContainsKey("rendering_occlusion_culling_enabled2")) s["rendering_occlusion_culling_enabled2"] = false;
115
116             if (!s.ContainsKey("rendering_use_vbo")) s["rendering_use_vbo"] = true;
117
118             if (!s.ContainsKey("send_rad_client_tag")) s["send_rad_client_tag"] = true;
119
120             if (!s.ContainsKey("log_to_file")) s["log_to_file"] = true;
121
122             if (!s.ContainsKey("disable_chat_im_log")) s["disable_chat_im_log"] = false;
123
124             if (!s.ContainsKey("disable_look_at")) s["disable_look_at"] = false;
125
126             if (!s.ContainsKey("highlight_on_chat")) s["highlight_on_chat"] = true;
127
128             if (!s.ContainsKey("highlight_on_im")) s["highlight_on_im"] = true;
129
130             if (!s.ContainsKey("highlight_on_group_im")) s["highlight_on_group_im"] = true;
131
132             if (!s.ContainsKey("av_name_link")) s["av_name_link"] = false;
133
134             if (!s.ContainsKey("disable_http_inventory"))
135             {
136                 s["disable_http_inventory"] = mono;
137             }
138         }
139
140         public frmSettings(RadegastInstance instance)
141             : base(instance)
142         {
143             if (settingInitialized)
144             {
145                 frmSettings.InitSettigs(instance.GlobalSettings, instance.MonoRuntime);
146             }
147
148             InitializeComponent();
149             AutoSavePosition = true;
150
151             s = instance.GlobalSettings;
152             tbpGraphics.Controls.Add(new Radegast.Rendering.GraphicsPreferences(instance));
153             cbChatTimestamps.Checked = s["chat_timestamps"].AsBoolean();
154
155             cbIMTimeStamps.Checked = s["im_timestamps"].AsBoolean();
156
157             cbChatTimestamps.CheckedChanged += new EventHandler(cbChatTimestamps_CheckedChanged);
158             cbIMTimeStamps.CheckedChanged += new EventHandler(cbIMTimeStamps_CheckedChanged);
159
160             cbTrasactDialog.Checked = s["transaction_notification_dialog"].AsBoolean();
161             cbTrasactChat.Checked = s["transaction_notification_chat"].AsBoolean();
162
163             cbFriendsNotifications.Checked = s["show_friends_online_notifications"].AsBoolean();
164             cbFriendsNotifications.CheckedChanged += new EventHandler(cbFriendsNotifications_CheckedChanged);
165
166             cbAutoReconnect.Checked = s["auto_reconnect"].AsBoolean();
167             cbAutoReconnect.CheckedChanged += new EventHandler(cbAutoReconnect_CheckedChanged);
168
169             cbHideLoginGraphics.Checked = s["hide_login_graphics"].AsBoolean();
170             cbHideLoginGraphics.CheckedChanged += new EventHandler(cbHideLoginGraphics_CheckedChanged);
171
172             cbRLV.Checked = s["rlv_enabled"].AsBoolean();
173             cbRLV.CheckedChanged += (object sender, EventArgs e) =>
174             {
175                 s["rlv_enabled"] = new OSDBoolean(cbRLV.Checked);
176             };
177
178             cbMUEmotes.Checked = s["mu_emotes"].AsBoolean();
179             cbMUEmotes.CheckedChanged += (object sender, EventArgs e) =>
180             {
181                 s["mu_emotes"] = new OSDBoolean(cbMUEmotes.Checked);
182             };
183
184             if (s["chat_font_size"].Type != OSDType.Real)
185             {
186                 s["chat_font_size"] = OSD.FromReal(((ChatConsole)instance.TabConsole.Tabs["chat"].Control).cbxInput.Font.Size);
187             }
188
189             cbFontSize.Text = s["chat_font_size"].AsReal().ToString(System.Globalization.CultureInfo.InvariantCulture);
190
191             if (!s.ContainsKey("minimize_to_tray")) s["minimize_to_tray"] = OSD.FromBoolean(false);
192             cbMinToTrey.Checked = s["minimize_to_tray"].AsBoolean();
193             cbMinToTrey.CheckedChanged += (object sender, EventArgs e) =>
194             {
195                 s["minimize_to_tray"] = OSD.FromBoolean(cbMinToTrey.Checked);
196             };
197
198
199             cbNoTyping.Checked = s["no_typing_anim"].AsBoolean();
200             cbNoTyping.CheckedChanged += (object sender, EventArgs e) =>
201             {
202                 s["no_typing_anim"] = OSD.FromBoolean(cbNoTyping.Checked);
203             };
204
205             txtAutoResponse.Text = s["auto_response_text"];
206             txtAutoResponse.TextChanged += (object sender, EventArgs e) =>
207             {
208                 s["auto_response_text"] = txtAutoResponse.Text;
209             };
210             AutoResponseType art = (AutoResponseType)s["auto_response_type"].AsInteger();
211             switch (art)
212             {
213                 case AutoResponseType.WhenBusy: rbAutobusy.Checked = true; break;
214                 case AutoResponseType.WhenFromNonFriend: rbAutoNonFriend.Checked = true; break;
215                 case AutoResponseType.Always: rbAutoAlways.Checked = true; break;
216             }
217
218             cbSyntaxHighlight.Checked = s["script_syntax_highlight"].AsBoolean();
219             cbSyntaxHighlight.CheckedChanged += (object sender, EventArgs e) =>
220             {
221                 s["script_syntax_highlight"] = OSD.FromBoolean(cbSyntaxHighlight.Checked);
222             };
223
224             switch ((NameMode)s["display_name_mode"].AsInteger())
225             {
226                 case NameMode.Standard: rbDNOff.Checked = true; break;
227                 case NameMode.Smart: rbDNSmart.Checked = true; break;
228                 case NameMode.DisplayNameAndUserName: rbDNDandUsernme.Checked = true; break;
229                 case NameMode.OnlyDisplayName: rbDNOnlyDN.Checked = true; break;
230             }
231
232             txtReconnectTime.Text = s["reconnect_time"].AsInteger().ToString();
233
234             cbRadegastClientTag.Checked = s["send_rad_client_tag"];
235             cbRadegastClientTag.CheckedChanged += (sender, e) =>
236             {
237                 s["send_rad_client_tag"] = cbRadegastClientTag.Checked;
238                 instance.SetClientTag();
239             };
240
241             cbOnInvOffer.SelectedIndex = s["inv_auto_accept_mode"].AsInteger();
242             cbOnInvOffer.SelectedIndexChanged += (sender, e) =>
243             {
244                 s["inv_auto_accept_mode"] = cbOnInvOffer.SelectedIndex;
245             };
246
247             cbRadegastLogToFile.Checked = s["log_to_file"];
248
249             cbDisableChatIMLog.Checked = s["disable_chat_im_log"];
250             cbDisableChatIMLog.CheckedChanged += (sender, e) =>
251             {
252                 s["disable_chat_im_log"] = cbDisableChatIMLog.Checked;
253             };
254
255             cbDisableLookAt.Checked = s["disable_look_at"];
256             cbDisableLookAt.CheckedChanged += (sender, e) =>
257             {
258                 s["disable_look_at"] = cbDisableLookAt.Checked;
259             };
260
261             cbTaskBarHighLight.Checked = s["taskbar_highlight"];
262             cbTaskBarHighLight.CheckedChanged += (sender, e) =>
263             {
264                 s["taskbar_highlight"] = cbTaskBarHighLight.Checked;
265                 UpdateEnabled();
266             };
267
268             cbFriendsHighlight.Checked = s["friends_notification_highlight"].AsBoolean();
269             cbFriendsHighlight.CheckedChanged += (object sender, EventArgs e) =>
270             {
271                 s["friends_notification_highlight"] = new OSDBoolean(cbFriendsHighlight.Checked);
272             };
273
274             cbHighlightChat.Checked = s["highlight_on_chat"];
275             cbHighlightChat.CheckedChanged += (sender, e) =>
276             {
277                 s["highlight_on_chat"] = cbHighlightChat.Checked;
278             };
279
280             cbHighlightIM.Checked = s["highlight_on_im"];
281             cbHighlightIM.CheckedChanged += (sender, e) =>
282             {
283                 s["highlight_on_im"] = cbHighlightIM.Checked;
284             };
285
286             cbHighlightGroupIM.Checked = s["highlight_on_group_im"];
287             cbHighlightGroupIM.CheckedChanged += (sender, e) =>
288             {
289                 s["highlight_on_group_im"] = cbHighlightGroupIM.Checked;
290             };
291
292             // disable_av_name_link
293             if (instance.MonoRuntime)
294             {
295                 cbNameLinks.Visible = false;
296             }
297             else
298             {
299                 cbNameLinks.Checked = s["av_name_link"];
300                 cbNameLinks.CheckedChanged += (sender, e) =>
301                 {
302                     s["av_name_link"] = cbNameLinks.Checked;
303                 };
304             }
305
306             cbDisableHTTPInventory.Checked = s["disable_http_inventory"];
307             cbDisableHTTPInventory.CheckedChanged += (sender, e) =>
308             {
309                 s["disable_http_inventory"] = cbDisableHTTPInventory.Checked;
310             };
311
312             cbShowScriptErrors.Checked = s["show_script_errors"];
313             cbShowScriptErrors.CheckedChanged += (sender, e) =>
314             {
315                 s["show_script_errors"] = cbShowScriptErrors.Checked;
316             };
317
318             autoSitPrefsUpdate();
319             pseudoHomePrefsUpdated();
320             LSLHelperPrefsUpdate();
321
322             UpdateEnabled();
323         }
324
325         void UpdateEnabled()
326         {
327             if (cbTaskBarHighLight.Checked)
328             {
329                 cbFriendsHighlight.Enabled = cbHighlightChat.Enabled = cbHighlightGroupIM.Enabled = cbHighlightIM.Enabled = true;
330             }
331             else
332             {
333                 cbFriendsHighlight.Enabled = cbHighlightChat.Enabled = cbHighlightGroupIM.Enabled = cbHighlightIM.Enabled = false;
334             }
335         }
336
337         void cbHideLoginGraphics_CheckedChanged(object sender, EventArgs e)
338         {
339             s["hide_login_graphics"] = OSD.FromBoolean(cbHideLoginGraphics.Checked);
340         }
341
342         void cbAutoReconnect_CheckedChanged(object sender, EventArgs e)
343         {
344             s["auto_reconnect"] = OSD.FromBoolean(cbAutoReconnect.Checked);
345         }
346
347         void cbFriendsNotifications_CheckedChanged(object sender, EventArgs e)
348         {
349             s["show_friends_online_notifications"] = OSD.FromBoolean(cbFriendsNotifications.Checked);
350         }
351
352         void cbChatTimestamps_CheckedChanged(object sender, EventArgs e)
353         {
354             s["chat_timestamps"] = OSD.FromBoolean(cbChatTimestamps.Checked);
355         }
356
357         void cbIMTimeStamps_CheckedChanged(object sender, EventArgs e)
358         {
359             s["im_timestamps"] = OSD.FromBoolean(cbIMTimeStamps.Checked);
360         }
361
362         private void cbTrasactDialog_CheckedChanged(object sender, EventArgs e)
363         {
364             s["transaction_notification_dialog"] = OSD.FromBoolean(cbTrasactDialog.Checked);
365         }
366
367         private void cbTrasactChat_CheckedChanged(object sender, EventArgs e)
368         {
369             s["transaction_notification_chat"] = OSD.FromBoolean(cbTrasactChat.Checked);
370         }
371
372         private void UpdateFontSize()
373         {
374             double f = 8.25;
375             double existing = s["chat_font_size"].AsReal();
376
377             if (!double.TryParse(cbFontSize.Text, out f))
378             {
379                 cbFontSize.Text = s["chat_font_size"].AsReal().ToString(System.Globalization.CultureInfo.InvariantCulture);
380                 return;
381             }
382
383             if (Math.Abs(existing - f) > 0.0001f)
384                 s["chat_font_size"] = OSD.FromReal(f);
385
386         }
387
388         private void cbFontSize_SelectedIndexChanged(object sender, EventArgs e)
389         {
390             UpdateFontSize();
391         }
392
393         private void cbFontSize_KeyDown(object sender, KeyEventArgs e)
394         {
395             if (e.KeyCode == Keys.Enter)
396             {
397                 UpdateFontSize();
398                 e.Handled = e.SuppressKeyPress = true;
399             }
400         }
401
402         private void cbFontSize_Leave(object sender, EventArgs e)
403         {
404             UpdateFontSize();
405         }
406
407         private void rbAutobusy_CheckedChanged(object sender, EventArgs e)
408         {
409             s["auto_response_type"] = (int)AutoResponseType.WhenBusy;
410         }
411
412         private void rbAutoNonFriend_CheckedChanged(object sender, EventArgs e)
413         {
414             s["auto_response_type"] = (int)AutoResponseType.WhenFromNonFriend;
415         }
416
417         private void rbAutoAlways_CheckedChanged(object sender, EventArgs e)
418         {
419             s["auto_response_type"] = (int)AutoResponseType.Always;
420         }
421
422         private void rbDNOff_CheckedChanged(object sender, EventArgs e)
423         {
424             if (rbDNOff.Checked)
425             {
426                 Instance.Names.CleanCache();
427                 s["display_name_mode"] = (int)NameMode.Standard;
428             }
429         }
430
431         private void rbDNSmart_CheckedChanged(object sender, EventArgs e)
432         {
433             if (rbDNSmart.Checked)
434             {
435                 Instance.Names.CleanCache();
436                 s["display_name_mode"] = (int)NameMode.Smart;
437             }
438         }
439
440         private void rbDNDandUsernme_CheckedChanged(object sender, EventArgs e)
441         {
442             if (rbDNDandUsernme.Checked)
443             {
444                 Instance.Names.CleanCache();
445                 s["display_name_mode"] = (int)NameMode.DisplayNameAndUserName;
446             }
447         }
448
449         private void rbDNOnlyDN_CheckedChanged(object sender, EventArgs e)
450         {
451             if (rbDNOnlyDN.Checked)
452             {
453                 Instance.Names.CleanCache();
454                 s["display_name_mode"] = (int)NameMode.OnlyDisplayName;
455             }
456         }
457
458         private void txtReconnectTime_TextChanged(object sender, EventArgs e)
459         {
460             string input = System.Text.RegularExpressions.Regex.Replace(txtReconnectTime.Text, @"[^\d]", "");
461             int t = 120;
462             int.TryParse(input, out t);
463
464             if (txtReconnectTime.Text != t.ToString())
465             {
466                 txtReconnectTime.Text = t.ToString();
467                 txtReconnectTime.Select(txtReconnectTime.Text.Length, 0);
468             }
469
470             s["reconnect_time"] = t;
471         }
472
473         private void cbRadegastLogToFile_CheckedChanged(object sender, EventArgs e)
474         {
475             s["log_to_file"] = OSD.FromBoolean(cbRadegastLogToFile.Checked);
476         }
477
478         #region Auto-Sit
479
480         private void autoSitPrefsUpdate()
481         {
482             autoSit.Enabled = (Instance.Client.Network.Connected && Instance.ClientSettings != null);
483             if (!autoSit.Enabled)
484             {
485                 return;
486             }
487             AutoSitPreferences prefs = Instance.State.AutoSit.Preferences;
488             autoSitName.Text = prefs.PrimitiveName;
489             autoSitUUID.Text = prefs.Primitive.ToString();
490             autoSitSit.Enabled = prefs.Primitive != UUID.Zero;
491             autoSitEnabled.Checked = prefs.Enabled;
492         }
493
494         private void autoSitClear_Click(object sender, EventArgs e)
495         {
496             Instance.State.AutoSit.Preferences = new AutoSitPreferences();
497             autoSitPrefsUpdate();
498         }
499
500         private void autoSitNameLabel_Click(object sender, EventArgs e)
501         {
502             autoSitName.SelectAll();
503         }
504
505         private void autoSitUUIDLabel_Click(object sender, EventArgs e)
506         {
507             autoSitUUID.SelectAll();
508         }
509
510         private void autoSitSit_Click(object sender, EventArgs e)
511         {
512             Instance.State.AutoSit.TrySit();
513         }
514
515         private void autoSitEnabled_CheckedChanged(object sender, EventArgs e)
516         {
517             Instance.State.AutoSit.Preferences = new AutoSitPreferences
518             {
519                 Primitive = Instance.State.AutoSit.Preferences.Primitive,
520                 PrimitiveName = Instance.State.AutoSit.Preferences.PrimitiveName,
521                 Enabled = autoSitEnabled.Checked
522             };
523
524             if (Instance.State.AutoSit.Preferences.Enabled)
525             {
526                 Instance.State.AutoSit.TrySit();
527             }
528         }
529
530         private void autoSitUUID_Leave(object sender, EventArgs e)
531         {
532             UUID primID = UUID.Zero;
533             if (UUID.TryParse(autoSitUUID.Text, out primID))
534             {
535                 Instance.State.AutoSit.Preferences = new AutoSitPreferences
536                 {
537                     Primitive = primID,
538                     PrimitiveName = autoSitName.Text,
539                     Enabled = autoSitEnabled.Checked
540                 };
541
542                 if (Instance.State.AutoSit.Preferences.Enabled)
543                 {
544                     Instance.State.AutoSit.TrySit();
545                 }
546             }
547             else
548             {
549                 autoSitUUID.Text = UUID.Zero.ToString();
550             }
551         }
552         #endregion
553
554         #region Pseudo Home
555
556         private void pseudoHomePrefsUpdated()
557         {
558             pseudoHome.Enabled = (Instance.Client.Network.Connected && Instance.ClientSettings != null);
559             if (!pseudoHome.Enabled)
560             {
561                 return;
562             }
563             PseudoHomePreferences prefs = Instance.State.PseudoHome.Preferences;
564             pseudoHomeLocation.Text = (prefs.Region != string.Empty) ? string.Format("{0} <{1}, {2}, {3}>", prefs.Region, (int)prefs.Position.X, (int)prefs.Position.Y, (int)prefs.Position.Z) : "";
565             pseudoHomeEnabled.Checked = prefs.Enabled;
566             pseudoHomeTP.Enabled = (prefs.Region.Trim() != string.Empty);
567             pseudoHomeTolerance.Value = Math.Max(pseudoHomeTolerance.Minimum, Math.Min(pseudoHomeTolerance.Maximum, prefs.Tolerance));
568         }
569
570         private void pseudoHomeLabel_Click(object sender, EventArgs e)
571         {
572             pseudoHomeLocation.SelectAll();
573         }
574
575         private void pseudoHomeEnabled_CheckedChanged(object sender, EventArgs e)
576         {
577             Instance.State.PseudoHome.Preferences = new PseudoHomePreferences
578             {
579                 Enabled = pseudoHomeEnabled.Checked,
580                 Region = Instance.State.PseudoHome.Preferences.Region,
581                 Position = Instance.State.PseudoHome.Preferences.Position,
582                 Tolerance = Instance.State.PseudoHome.Preferences.Tolerance
583             };
584         }
585
586         private void pseudoHomeTP_Click(object sender, EventArgs e)
587         {
588             Instance.State.PseudoHome.ETGoHome();
589         }
590
591         private void pseudoHomeSet_Click(object sender, EventArgs e)
592         {
593             Instance.State.PseudoHome.Preferences = new PseudoHomePreferences
594             {
595                 Enabled = Instance.State.PseudoHome.Preferences.Enabled,
596                 Region = Instance.Client.Network.CurrentSim.Name,
597                 Position = Instance.Client.Self.SimPosition,
598                 Tolerance = Instance.State.PseudoHome.Preferences.Tolerance
599             };
600             pseudoHomePrefsUpdated();
601         }
602
603         private void pseudoHomeTolerance_ValueChanged(object sender, EventArgs e)
604         {
605             Instance.State.PseudoHome.Preferences = new PseudoHomePreferences
606             {
607                 Enabled = Instance.State.PseudoHome.Preferences.Enabled,
608                 Region = Instance.State.PseudoHome.Preferences.Region,
609                 Position = Instance.State.PseudoHome.Preferences.Position,
610                 Tolerance = (uint)pseudoHomeTolerance.Value
611             };
612         }
613
614         private void pseudoHomeClear_Click(object sender, EventArgs e)
615         {
616             Instance.State.PseudoHome.Preferences = new PseudoHomePreferences();
617             pseudoHomePrefsUpdated();
618         }
619         #endregion
620
621         #region LSL Helper
622         private void LSLHelperPrefsUpdate()
623         {
624             gbLSLHelper.Enabled = (Instance.Client.Network.Connected && Instance.ClientSettings != null);
625
626             if (!gbLSLHelper.Enabled)
627             {
628                 return;
629             }
630
631             Instance.State.LSLHelper.LoadSettings();
632             tbLSLAllowedOwner.Text = Instance.State.LSLHelper.AllowedOwner.ToString();
633             cbLSLHelperEnabled.CheckedChanged -=new EventHandler(cbLSLHelperEnabled_CheckedChanged);
634             cbLSLHelperEnabled.Checked = Instance.State.LSLHelper.Enabled;
635             cbLSLHelperEnabled.CheckedChanged += new EventHandler(cbLSLHelperEnabled_CheckedChanged);
636         }
637
638         private void LSLHelperPrefsSave()
639         {
640             if (Instance.ClientSettings == null)
641             {
642                 return;
643             }
644
645             Instance.State.LSLHelper.Enabled = cbLSLHelperEnabled.Checked;
646             UUID allowedOwnner = UUID.Zero;
647             UUID.TryParse(tbLSLAllowedOwner.Text, out allowedOwnner);
648             Instance.State.LSLHelper.AllowedOwner = allowedOwnner;
649             Instance.State.LSLHelper.SaveSettings();
650         }
651
652         private void llLSLHelperInstructios_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
653         {
654             Instance.MainForm.ProcessLink("http://radegast.org/wiki/LSL_Helper", false);
655         }
656
657         private void tbLSLAllowedOwner_Leave(object sender, EventArgs e)
658         {
659             UUID allowedOwner = UUID.Zero;
660             if (UUID.TryParse(tbLSLAllowedOwner.Text, out allowedOwner))
661             {
662             }
663             else
664             {
665                 tbLSLAllowedOwner.Text = UUID.Zero.ToString();
666             }
667             LSLHelperPrefsSave();
668         }
669
670         private void lblLSLUUID_Click(object sender, EventArgs e)
671         {
672             tbLSLAllowedOwner.SelectAll();
673         }
674
675         private void cbLSLHelperEnabled_CheckedChanged(object sender, EventArgs e)
676         {
677             LSLHelperPrefsSave();
678         }
679         #endregion LSL Helper
680
681     }
682 }