OSDN Git Service

Added URI settings and updated URI name resolution.
[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("resolve_uri_time")) s["resolve_uri_time"] = 100;
105
106             if (!s.ContainsKey("resolve_uris")) s["resolve_uris"] = true;
107
108             if (!s.ContainsKey("transaction_notification_chat")) s["transaction_notification_chat"] = true;
109
110             if (!s.ContainsKey("transaction_notification_dialog")) s["transaction_notification_dialog"] = true;
111
112             if (!s.ContainsKey("minimize_to_tray")) s["minimize_to_tray"] = false;
113
114             if (!s.ContainsKey("scene_window_docked")) s["scene_window_docked"] = true;
115
116             if (!s.ContainsKey("taskbar_highlight")) s["taskbar_highlight"] = true;
117
118             if (!s.ContainsKey("rendering_occlusion_culling_enabled2")) s["rendering_occlusion_culling_enabled2"] = false;
119
120             if (!s.ContainsKey("rendering_use_vbo")) s["rendering_use_vbo"] = true;
121
122             if (!s.ContainsKey("send_rad_client_tag")) s["send_rad_client_tag"] = true;
123
124             if (!s.ContainsKey("log_to_file")) s["log_to_file"] = true;
125
126             if (!s.ContainsKey("disable_chat_im_log")) s["disable_chat_im_log"] = false;
127
128             if (!s.ContainsKey("disable_look_at")) s["disable_look_at"] = false;
129
130             if (!s.ContainsKey("highlight_on_chat")) s["highlight_on_chat"] = true;
131
132             if (!s.ContainsKey("highlight_on_im")) s["highlight_on_im"] = true;
133
134             if (!s.ContainsKey("highlight_on_group_im")) s["highlight_on_group_im"] = true;
135
136             if (!s.ContainsKey("av_name_link")) s["av_name_link"] = false;
137
138             if (!s.ContainsKey("disable_http_inventory"))
139             {
140                 s["disable_http_inventory"] = mono;
141             }
142
143             if (!s.ContainsKey("on_script_question"))
144             {
145                 s["on_script_question"] = "Ask";
146             }
147             
148         }
149
150         public frmSettings(RadegastInstance instance)
151             : base(instance)
152         {
153             if (settingInitialized)
154             {
155                 frmSettings.InitSettigs(instance.GlobalSettings, instance.MonoRuntime);
156             }
157
158             InitializeComponent();
159             AutoSavePosition = true;
160
161             s = instance.GlobalSettings;
162             tbpGraphics.Controls.Add(new Radegast.Rendering.GraphicsPreferences(instance));
163             cbChatTimestamps.Checked = s["chat_timestamps"].AsBoolean();
164
165             cbIMTimeStamps.Checked = s["im_timestamps"].AsBoolean();
166
167             cbChatTimestamps.CheckedChanged += new EventHandler(cbChatTimestamps_CheckedChanged);
168             cbIMTimeStamps.CheckedChanged += new EventHandler(cbIMTimeStamps_CheckedChanged);
169
170             cbTrasactDialog.Checked = s["transaction_notification_dialog"].AsBoolean();
171             cbTrasactChat.Checked = s["transaction_notification_chat"].AsBoolean();
172
173             cbFriendsNotifications.Checked = s["show_friends_online_notifications"].AsBoolean();
174             cbFriendsNotifications.CheckedChanged += new EventHandler(cbFriendsNotifications_CheckedChanged);
175
176             cbAutoReconnect.Checked = s["auto_reconnect"].AsBoolean();
177             cbAutoReconnect.CheckedChanged += new EventHandler(cbAutoReconnect_CheckedChanged);
178
179             cbResolveURIs.Checked = s["resolve_uris"].AsBoolean();
180             cbResolveURIs.CheckedChanged += new EventHandler(cbResolveURIs_CheckedChanged); ;
181
182             cbHideLoginGraphics.Checked = s["hide_login_graphics"].AsBoolean();
183             cbHideLoginGraphics.CheckedChanged += new EventHandler(cbHideLoginGraphics_CheckedChanged);
184
185             cbRLV.Checked = s["rlv_enabled"].AsBoolean();
186             cbRLV.CheckedChanged += (object sender, EventArgs e) =>
187             {
188                 s["rlv_enabled"] = new OSDBoolean(cbRLV.Checked);
189             };
190
191             cbMUEmotes.Checked = s["mu_emotes"].AsBoolean();
192             cbMUEmotes.CheckedChanged += (object sender, EventArgs e) =>
193             {
194                 s["mu_emotes"] = new OSDBoolean(cbMUEmotes.Checked);
195             };
196
197             if (s["chat_font_size"].Type != OSDType.Real)
198             {
199                 s["chat_font_size"] = OSD.FromReal(((ChatConsole)instance.TabConsole.Tabs["chat"].Control).cbxInput.Font.Size);
200             }
201
202             cbFontSize.Text = s["chat_font_size"].AsReal().ToString(System.Globalization.CultureInfo.InvariantCulture);
203
204             if (!s.ContainsKey("minimize_to_tray")) s["minimize_to_tray"] = OSD.FromBoolean(false);
205             cbMinToTrey.Checked = s["minimize_to_tray"].AsBoolean();
206             cbMinToTrey.CheckedChanged += (object sender, EventArgs e) =>
207             {
208                 s["minimize_to_tray"] = OSD.FromBoolean(cbMinToTrey.Checked);
209             };
210
211
212             cbNoTyping.Checked = s["no_typing_anim"].AsBoolean();
213             cbNoTyping.CheckedChanged += (object sender, EventArgs e) =>
214             {
215                 s["no_typing_anim"] = OSD.FromBoolean(cbNoTyping.Checked);
216             };
217
218             txtAutoResponse.Text = s["auto_response_text"];
219             txtAutoResponse.TextChanged += (object sender, EventArgs e) =>
220             {
221                 s["auto_response_text"] = txtAutoResponse.Text;
222             };
223             AutoResponseType art = (AutoResponseType)s["auto_response_type"].AsInteger();
224             switch (art)
225             {
226                 case AutoResponseType.WhenBusy: rbAutobusy.Checked = true; break;
227                 case AutoResponseType.WhenFromNonFriend: rbAutoNonFriend.Checked = true; break;
228                 case AutoResponseType.Always: rbAutoAlways.Checked = true; break;
229             }
230
231             cbSyntaxHighlight.Checked = s["script_syntax_highlight"].AsBoolean();
232             cbSyntaxHighlight.CheckedChanged += (object sender, EventArgs e) =>
233             {
234                 s["script_syntax_highlight"] = OSD.FromBoolean(cbSyntaxHighlight.Checked);
235             };
236
237             switch ((NameMode)s["display_name_mode"].AsInteger())
238             {
239                 case NameMode.Standard: rbDNOff.Checked = true; break;
240                 case NameMode.Smart: rbDNSmart.Checked = true; break;
241                 case NameMode.DisplayNameAndUserName: rbDNDandUsernme.Checked = true; break;
242                 case NameMode.OnlyDisplayName: rbDNOnlyDN.Checked = true; break;
243             }
244
245             txtReconnectTime.Text = s["reconnect_time"].AsInteger().ToString();
246
247             txtResolveURITime.Text = s["resolve_uri_time"].AsInteger().ToString();
248
249             cbRadegastClientTag.Checked = s["send_rad_client_tag"];
250             cbRadegastClientTag.CheckedChanged += (sender, e) =>
251             {
252                 s["send_rad_client_tag"] = cbRadegastClientTag.Checked;
253                 instance.SetClientTag();
254             };
255
256             cbOnInvOffer.SelectedIndex = s["inv_auto_accept_mode"].AsInteger();
257             cbOnInvOffer.SelectedIndexChanged += (sender, e) =>
258             {
259                 s["inv_auto_accept_mode"] = cbOnInvOffer.SelectedIndex;
260             };
261
262             cbRadegastLogToFile.Checked = s["log_to_file"];
263
264             cbDisableChatIMLog.Checked = s["disable_chat_im_log"];
265             cbDisableChatIMLog.CheckedChanged += (sender, e) =>
266             {
267                 s["disable_chat_im_log"] = cbDisableChatIMLog.Checked;
268             };
269
270             cbDisableLookAt.Checked = s["disable_look_at"];
271             cbDisableLookAt.CheckedChanged += (sender, e) =>
272             {
273                 s["disable_look_at"] = cbDisableLookAt.Checked;
274             };
275
276             cbTaskBarHighLight.Checked = s["taskbar_highlight"];
277             cbTaskBarHighLight.CheckedChanged += (sender, e) =>
278             {
279                 s["taskbar_highlight"] = cbTaskBarHighLight.Checked;
280                 UpdateEnabled();
281             };
282
283             cbFriendsHighlight.Checked = s["friends_notification_highlight"].AsBoolean();
284             cbFriendsHighlight.CheckedChanged += (object sender, EventArgs e) =>
285             {
286                 s["friends_notification_highlight"] = new OSDBoolean(cbFriendsHighlight.Checked);
287             };
288
289             cbHighlightChat.Checked = s["highlight_on_chat"];
290             cbHighlightChat.CheckedChanged += (sender, e) =>
291             {
292                 s["highlight_on_chat"] = cbHighlightChat.Checked;
293             };
294
295             cbHighlightIM.Checked = s["highlight_on_im"];
296             cbHighlightIM.CheckedChanged += (sender, e) =>
297             {
298                 s["highlight_on_im"] = cbHighlightIM.Checked;
299             };
300
301             cbHighlightGroupIM.Checked = s["highlight_on_group_im"];
302             cbHighlightGroupIM.CheckedChanged += (sender, e) =>
303             {
304                 s["highlight_on_group_im"] = cbHighlightGroupIM.Checked;
305             };
306
307             // disable_av_name_link
308             if (instance.MonoRuntime)
309             {
310                 cbNameLinks.Visible = false;
311             }
312             else
313             {
314                 cbNameLinks.Checked = s["av_name_link"];
315                 cbNameLinks.CheckedChanged += (sender, e) =>
316                 {
317                     s["av_name_link"] = cbNameLinks.Checked;
318                 };
319             }
320
321             cbDisableHTTPInventory.Checked = s["disable_http_inventory"];
322             cbDisableHTTPInventory.CheckedChanged += (sender, e) =>
323             {
324                 s["disable_http_inventory"] = cbDisableHTTPInventory.Checked;
325             };
326
327             cbShowScriptErrors.Checked = s["show_script_errors"];
328             cbShowScriptErrors.CheckedChanged += (sender, e) =>
329             {
330                 s["show_script_errors"] = cbShowScriptErrors.Checked;
331             };
332
333             autoSitPrefsUpdate();
334             pseudoHomePrefsUpdated();
335             LSLHelperPrefsUpdate();
336
337             cbAutoScriptPermission.Text = s["on_script_question"];
338
339             UpdateEnabled();
340         }
341
342         void UpdateEnabled()
343         {
344             if (cbTaskBarHighLight.Checked)
345             {
346                 cbFriendsHighlight.Enabled = cbHighlightChat.Enabled = cbHighlightGroupIM.Enabled = cbHighlightIM.Enabled = true;
347             }
348             else
349             {
350                 cbFriendsHighlight.Enabled = cbHighlightChat.Enabled = cbHighlightGroupIM.Enabled = cbHighlightIM.Enabled = false;
351             }
352         }
353
354         void cbHideLoginGraphics_CheckedChanged(object sender, EventArgs e)
355         {
356             s["hide_login_graphics"] = OSD.FromBoolean(cbHideLoginGraphics.Checked);
357         }
358
359         void cbAutoReconnect_CheckedChanged(object sender, EventArgs e)
360         {
361             s["auto_reconnect"] = OSD.FromBoolean(cbAutoReconnect.Checked);
362         }
363
364         private void cbResolveURIs_CheckedChanged(object sender, EventArgs e)
365         {
366             s["resolve_uris"] = OSD.FromBoolean(cbResolveURIs.Checked);
367         }
368
369         void cbFriendsNotifications_CheckedChanged(object sender, EventArgs e)
370         {
371             s["show_friends_online_notifications"] = OSD.FromBoolean(cbFriendsNotifications.Checked);
372         }
373
374         void cbChatTimestamps_CheckedChanged(object sender, EventArgs e)
375         {
376             s["chat_timestamps"] = OSD.FromBoolean(cbChatTimestamps.Checked);
377         }
378
379         void cbIMTimeStamps_CheckedChanged(object sender, EventArgs e)
380         {
381             s["im_timestamps"] = OSD.FromBoolean(cbIMTimeStamps.Checked);
382         }
383
384         private void cbTrasactDialog_CheckedChanged(object sender, EventArgs e)
385         {
386             s["transaction_notification_dialog"] = OSD.FromBoolean(cbTrasactDialog.Checked);
387         }
388
389         private void cbTrasactChat_CheckedChanged(object sender, EventArgs e)
390         {
391             s["transaction_notification_chat"] = OSD.FromBoolean(cbTrasactChat.Checked);
392         }
393
394         private void UpdateFontSize()
395         {
396             double f = 8.25;
397             double existing = s["chat_font_size"].AsReal();
398
399             if (!double.TryParse(cbFontSize.Text, out f))
400             {
401                 cbFontSize.Text = s["chat_font_size"].AsReal().ToString(System.Globalization.CultureInfo.InvariantCulture);
402                 return;
403             }
404
405             if (Math.Abs(existing - f) > 0.0001f)
406                 s["chat_font_size"] = OSD.FromReal(f);
407
408         }
409
410         private void cbFontSize_SelectedIndexChanged(object sender, EventArgs e)
411         {
412             UpdateFontSize();
413         }
414
415         private void cbFontSize_KeyDown(object sender, KeyEventArgs e)
416         {
417             if (e.KeyCode == Keys.Enter)
418             {
419                 UpdateFontSize();
420                 e.Handled = e.SuppressKeyPress = true;
421             }
422         }
423
424         private void cbFontSize_Leave(object sender, EventArgs e)
425         {
426             UpdateFontSize();
427         }
428
429         private void rbAutobusy_CheckedChanged(object sender, EventArgs e)
430         {
431             s["auto_response_type"] = (int)AutoResponseType.WhenBusy;
432         }
433
434         private void rbAutoNonFriend_CheckedChanged(object sender, EventArgs e)
435         {
436             s["auto_response_type"] = (int)AutoResponseType.WhenFromNonFriend;
437         }
438
439         private void rbAutoAlways_CheckedChanged(object sender, EventArgs e)
440         {
441             s["auto_response_type"] = (int)AutoResponseType.Always;
442         }
443
444         private void rbDNOff_CheckedChanged(object sender, EventArgs e)
445         {
446             if (rbDNOff.Checked)
447             {
448                 Instance.Names.CleanCache();
449                 s["display_name_mode"] = (int)NameMode.Standard;
450             }
451         }
452
453         private void rbDNSmart_CheckedChanged(object sender, EventArgs e)
454         {
455             if (rbDNSmart.Checked)
456             {
457                 Instance.Names.CleanCache();
458                 s["display_name_mode"] = (int)NameMode.Smart;
459             }
460         }
461
462         private void rbDNDandUsernme_CheckedChanged(object sender, EventArgs e)
463         {
464             if (rbDNDandUsernme.Checked)
465             {
466                 Instance.Names.CleanCache();
467                 s["display_name_mode"] = (int)NameMode.DisplayNameAndUserName;
468             }
469         }
470
471         private void rbDNOnlyDN_CheckedChanged(object sender, EventArgs e)
472         {
473             if (rbDNOnlyDN.Checked)
474             {
475                 Instance.Names.CleanCache();
476                 s["display_name_mode"] = (int)NameMode.OnlyDisplayName;
477             }
478         }
479
480         private void txtReconnectTime_TextChanged(object sender, EventArgs e)
481         {
482             string input = System.Text.RegularExpressions.Regex.Replace(txtReconnectTime.Text, @"[^\d]", "");
483             int t = 120;
484             int.TryParse(input, out t);
485
486             if (txtReconnectTime.Text != t.ToString())
487             {
488                 txtReconnectTime.Text = t.ToString();
489                 txtReconnectTime.Select(txtReconnectTime.Text.Length, 0);
490             }
491
492             s["reconnect_time"] = t;
493         }
494
495         private void txtResolveURITime_TextChanged(object sender, EventArgs e)
496         {
497             string input = System.Text.RegularExpressions.Regex.Replace(txtResolveURITime.Text, @"[^\d]", "");
498             int t = 100;
499             int.TryParse(input, out t);
500
501             if (txtResolveURITime.Text != t.ToString())
502             {
503                 txtResolveURITime.Text = t.ToString();
504                 txtResolveURITime.Select(txtResolveURITime.Text.Length, 0);
505             }
506
507             s["resolve_uri_time"] = t;
508         }
509
510         private void cbRadegastLogToFile_CheckedChanged(object sender, EventArgs e)
511         {
512             s["log_to_file"] = OSD.FromBoolean(cbRadegastLogToFile.Checked);
513         }
514
515         #region Auto-Sit
516
517         private void autoSitPrefsUpdate()
518         {
519             autoSit.Enabled = (Instance.Client.Network.Connected && Instance.ClientSettings != null);
520             if (!autoSit.Enabled)
521             {
522                 return;
523             }
524             AutoSitPreferences prefs = Instance.State.AutoSit.Preferences;
525             autoSitName.Text = prefs.PrimitiveName;
526             autoSitUUID.Text = prefs.Primitive.ToString();
527             autoSitSit.Enabled = prefs.Primitive != UUID.Zero;
528             autoSitEnabled.Checked = prefs.Enabled;
529         }
530
531         private void autoSitClear_Click(object sender, EventArgs e)
532         {
533             Instance.State.AutoSit.Preferences = new AutoSitPreferences();
534             autoSitPrefsUpdate();
535         }
536
537         private void autoSitNameLabel_Click(object sender, EventArgs e)
538         {
539             autoSitName.SelectAll();
540         }
541
542         private void autoSitUUIDLabel_Click(object sender, EventArgs e)
543         {
544             autoSitUUID.SelectAll();
545         }
546
547         private void autoSitSit_Click(object sender, EventArgs e)
548         {
549             Instance.State.AutoSit.TrySit();
550         }
551
552         private void autoSitEnabled_CheckedChanged(object sender, EventArgs e)
553         {
554             Instance.State.AutoSit.Preferences = new AutoSitPreferences
555             {
556                 Primitive = Instance.State.AutoSit.Preferences.Primitive,
557                 PrimitiveName = Instance.State.AutoSit.Preferences.PrimitiveName,
558                 Enabled = autoSitEnabled.Checked
559             };
560
561             if (Instance.State.AutoSit.Preferences.Enabled)
562             {
563                 Instance.State.AutoSit.TrySit();
564             }
565         }
566
567         private void autoSitUUID_Leave(object sender, EventArgs e)
568         {
569             UUID primID = UUID.Zero;
570             if (UUID.TryParse(autoSitUUID.Text, out primID))
571             {
572                 Instance.State.AutoSit.Preferences = new AutoSitPreferences
573                 {
574                     Primitive = primID,
575                     PrimitiveName = autoSitName.Text,
576                     Enabled = autoSitEnabled.Checked
577                 };
578
579                 if (Instance.State.AutoSit.Preferences.Enabled)
580                 {
581                     Instance.State.AutoSit.TrySit();
582                 }
583             }
584             else
585             {
586                 autoSitUUID.Text = UUID.Zero.ToString();
587             }
588         }
589         #endregion
590
591         #region Pseudo Home
592
593         private void pseudoHomePrefsUpdated()
594         {
595             pseudoHome.Enabled = (Instance.Client.Network.Connected && Instance.ClientSettings != null);
596             if (!pseudoHome.Enabled)
597             {
598                 return;
599             }
600             PseudoHomePreferences prefs = Instance.State.PseudoHome.Preferences;
601             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) : "";
602             pseudoHomeEnabled.Checked = prefs.Enabled;
603             pseudoHomeTP.Enabled = (prefs.Region.Trim() != string.Empty);
604             pseudoHomeTolerance.Value = Math.Max(pseudoHomeTolerance.Minimum, Math.Min(pseudoHomeTolerance.Maximum, prefs.Tolerance));
605         }
606
607         private void pseudoHomeLabel_Click(object sender, EventArgs e)
608         {
609             pseudoHomeLocation.SelectAll();
610         }
611
612         private void pseudoHomeEnabled_CheckedChanged(object sender, EventArgs e)
613         {
614             Instance.State.PseudoHome.Preferences = new PseudoHomePreferences
615             {
616                 Enabled = pseudoHomeEnabled.Checked,
617                 Region = Instance.State.PseudoHome.Preferences.Region,
618                 Position = Instance.State.PseudoHome.Preferences.Position,
619                 Tolerance = Instance.State.PseudoHome.Preferences.Tolerance
620             };
621         }
622
623         private void pseudoHomeTP_Click(object sender, EventArgs e)
624         {
625             Instance.State.PseudoHome.ETGoHome();
626         }
627
628         private void pseudoHomeSet_Click(object sender, EventArgs e)
629         {
630             Instance.State.PseudoHome.Preferences = new PseudoHomePreferences
631             {
632                 Enabled = Instance.State.PseudoHome.Preferences.Enabled,
633                 Region = Instance.Client.Network.CurrentSim.Name,
634                 Position = Instance.Client.Self.SimPosition,
635                 Tolerance = Instance.State.PseudoHome.Preferences.Tolerance
636             };
637             pseudoHomePrefsUpdated();
638         }
639
640         private void pseudoHomeTolerance_ValueChanged(object sender, EventArgs e)
641         {
642             Instance.State.PseudoHome.Preferences = new PseudoHomePreferences
643             {
644                 Enabled = Instance.State.PseudoHome.Preferences.Enabled,
645                 Region = Instance.State.PseudoHome.Preferences.Region,
646                 Position = Instance.State.PseudoHome.Preferences.Position,
647                 Tolerance = (uint)pseudoHomeTolerance.Value
648             };
649         }
650
651         private void pseudoHomeClear_Click(object sender, EventArgs e)
652         {
653             Instance.State.PseudoHome.Preferences = new PseudoHomePreferences();
654             pseudoHomePrefsUpdated();
655         }
656         #endregion
657
658         #region LSL Helper
659         private void LSLHelperPrefsUpdate()
660         {
661             gbLSLHelper.Enabled = (Instance.Client.Network.Connected && Instance.ClientSettings != null);
662
663             if (!gbLSLHelper.Enabled)
664             {
665                 return;
666             }
667
668             Instance.State.LSLHelper.LoadSettings();
669             tbLSLAllowedOwner.Text = Instance.State.LSLHelper.AllowedOwner.ToString();
670             cbLSLHelperEnabled.CheckedChanged -=new EventHandler(cbLSLHelperEnabled_CheckedChanged);
671             cbLSLHelperEnabled.Checked = Instance.State.LSLHelper.Enabled;
672             cbLSLHelperEnabled.CheckedChanged += new EventHandler(cbLSLHelperEnabled_CheckedChanged);
673         }
674
675         private void LSLHelperPrefsSave()
676         {
677             if (Instance.ClientSettings == null)
678             {
679                 return;
680             }
681
682             Instance.State.LSLHelper.Enabled = cbLSLHelperEnabled.Checked;
683             UUID allowedOwnner = UUID.Zero;
684             UUID.TryParse(tbLSLAllowedOwner.Text, out allowedOwnner);
685             Instance.State.LSLHelper.AllowedOwner = allowedOwnner;
686             Instance.State.LSLHelper.SaveSettings();
687         }
688
689         private void llLSLHelperInstructios_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
690         {
691             Instance.MainForm.ProcessLink("http://radegast.org/wiki/LSL_Helper", false);
692         }
693
694         private void tbLSLAllowedOwner_Leave(object sender, EventArgs e)
695         {
696             UUID allowedOwner = UUID.Zero;
697             if (UUID.TryParse(tbLSLAllowedOwner.Text, out allowedOwner))
698             {
699             }
700             else
701             {
702                 tbLSLAllowedOwner.Text = UUID.Zero.ToString();
703             }
704             LSLHelperPrefsSave();
705         }
706
707         private void lblLSLUUID_Click(object sender, EventArgs e)
708         {
709             tbLSLAllowedOwner.SelectAll();
710         }
711
712         private void cbLSLHelperEnabled_CheckedChanged(object sender, EventArgs e)
713         {
714             LSLHelperPrefsSave();
715         }
716         #endregion LSL Helper
717
718         private void cbAutoScriptPermission_SelectedIndexChanged(object sender, EventArgs e)
719         {
720             s["on_script_question"] = cbAutoScriptPermission.Text;
721         }
722
723     }
724 }