--- /dev/null
+// \r
+// Radegast Metaverse Client\r
+// Copyright (c) 2009, Radegast Development Team\r
+// All rights reserved.\r
+// \r
+// Redistribution and use in source and binary forms, with or without\r
+// modification, are permitted provided that the following conditions are met:\r
+// \r
+// * Redistributions of source code must retain the above copyright notice,\r
+// this list of conditions and the following disclaimer.\r
+// * Redistributions in binary form must reproduce the above copyright\r
+// notice, this list of conditions and the following disclaimer in the\r
+// documentation and/or other materials provided with the distribution.\r
+// * Neither the name of the application "Radegast", nor the names of its\r
+// contributors may be used to endorse or promote products derived from\r
+// this software without specific prior written permission.\r
+// \r
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"\r
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// $Id: DettachableControl.cs 211 2009-09-09 06:46:18Z latifer@gmail.com $\r
+//\r
+using System;\r
+using System.Threading;\r
+using System.Collections.Generic;\r
+using System.Windows.Forms;\r
+using System.Text;\r
+using System.ComponentModel;\r
+using OpenMetaverse;\r
+using OpenMetaverse.StructuredData;\r
+using Radegast.Netcom;\r
+\r
+namespace Radegast\r
+{\r
+ [Browsable(false)]\r
+ public class RadegastForm : Form\r
+ {\r
+ /// <summary>\r
+ /// Indicates if position and size of the form should be saved\r
+ /// </summary>\r
+ [Browsable(true),\r
+ Description("Indicates if position and size of the form should be saved"),\r
+ Category("Behavior"),\r
+ DefaultValue(false)\r
+ ]\r
+ public bool AutoSavePosition\r
+ {\r
+ get\r
+ {\r
+ return autoSavePosition;\r
+ }\r
+\r
+ set\r
+ {\r
+ if (value == false)\r
+ {\r
+ ClearSavedPosition();\r
+ }\r
+ autoSavePosition = value;\r
+ }\r
+ }\r
+ private bool autoSavePosition = false;\r
+\r
+ /// <summary>\r
+ /// Instance of Radegast\r
+ /// </summary>\r
+ protected RadegastInstance Instance { get { return instance; } }\r
+ private RadegastInstance instance;\r
+\r
+ /// <summary>\r
+ /// Instance of OpenMetaverse's GridClient\r
+ /// </summary>\r
+ protected GridClient Client { get { return instance.Client; } }\r
+\r
+ /// <summary>\r
+ /// Instance of RadegastNetcom\r
+ /// </summary>\r
+ protected RadegastNetcom Netcom { get { return instance.Netcom; } }\r
+\r
+ private System.Threading.Timer SettingsTimer;\r
+ private const int SettingsTimerTimeout = 3000;\r
+\r
+ public RadegastForm()\r
+ : base()\r
+ {\r
+ InitForm();\r
+ }\r
+\r
+ public RadegastForm(RadegastInstance instance)\r
+ : base()\r
+ {\r
+ this.instance = instance;\r
+ InitForm();\r
+ }\r
+\r
+ protected override void Dispose(bool disposing)\r
+ {\r
+ if (disposing)\r
+ {\r
+ if (SettingsTimer != null)\r
+ {\r
+ SettingsTimer.Dispose();\r
+ SettingsTimer = null;\r
+ }\r
+ }\r
+ base.Dispose(disposing);\r
+ }\r
+\r
+ private void InitForm()\r
+ {\r
+ SettingsTimer = new System.Threading.Timer(\r
+ SettingsTimer_Tick,\r
+ null,\r
+ System.Threading.Timeout.Infinite,\r
+ System.Threading.Timeout.Infinite);\r
+ }\r
+\r
+ protected void SavePosition()\r
+ {\r
+ Instance.GlobalSettings[GetSettingsKey("left")] = OSD.FromInteger(Left);\r
+ Instance.GlobalSettings[GetSettingsKey("top")] = OSD.FromInteger(Top);\r
+ Instance.GlobalSettings[GetSettingsKey("width")] = OSD.FromInteger(Width);\r
+ Instance.GlobalSettings[GetSettingsKey("height")] = OSD.FromInteger(Height);\r
+ }\r
+\r
+ protected void ClearSavedPosition()\r
+ {\r
+ Instance.GlobalSettings.Remove(GetSettingsKey("left"));\r
+ Instance.GlobalSettings.Remove(GetSettingsKey("top"));\r
+ Instance.GlobalSettings.Remove(GetSettingsKey("width"));\r
+ Instance.GlobalSettings.Remove(GetSettingsKey("height"));\r
+ }\r
+\r
+ protected void RestoreSavedPosition()\r
+ {\r
+ if (Instance.GlobalSettings[GetSettingsKey("left")].Type != OSDType.Unknown)\r
+ Left = Instance.GlobalSettings[GetSettingsKey("left")].AsInteger();\r
+\r
+ if (Instance.GlobalSettings[GetSettingsKey("top")].Type != OSDType.Unknown)\r
+ Top = Instance.GlobalSettings[GetSettingsKey("top")].AsInteger();\r
+\r
+ if (Instance.GlobalSettings[GetSettingsKey("width")].Type != OSDType.Unknown)\r
+ Width = Instance.GlobalSettings[GetSettingsKey("width")].AsInteger();\r
+\r
+ if (Instance.GlobalSettings[GetSettingsKey("height")].Type != OSDType.Unknown)\r
+ Height = Instance.GlobalSettings[GetSettingsKey("height")].AsInteger();\r
+ }\r
+ \r
+ protected virtual string SettingsKeyBase()\r
+ {\r
+ return GetType().ToString();\r
+ }\r
+\r
+ protected virtual string GetSettingsKey(string arg)\r
+ {\r
+ return SettingsKeyBase() + "." + arg;\r
+ }\r
+\r
+ protected override void OnLoad(EventArgs e)\r
+ {\r
+ base.OnLoad(e);\r
+ if (AutoSavePosition)\r
+ RestoreSavedPosition();\r
+ }\r
+ protected override void OnMove(EventArgs e)\r
+ {\r
+ base.OnMove(e);\r
+ if (AutoSavePosition)\r
+ TriggerSavePosition();\r
+ }\r
+\r
+ protected override void OnResizeEnd(EventArgs e)\r
+ {\r
+ base.OnResizeEnd(e);\r
+ if (AutoSavePosition)\r
+ TriggerSavePosition();\r
+ }\r
+\r
+ private void TriggerSavePosition()\r
+ {\r
+ if (SettingsTimer != null)\r
+ {\r
+ SettingsTimer.Change(\r
+ SettingsTimerTimeout,\r
+ System.Threading.Timeout.Infinite);\r
+ }\r
+ }\r
+\r
+ private void SettingsTimer_Tick(object e)\r
+ {\r
+ SavePosition();\r
+ }\r
+ }\r
+}\r
this.tbnObjects = new System.Windows.Forms.ToolStripButton();\r
this.tbtnGroups = new System.Windows.Forms.ToolStripButton();\r
this.lblTime = new System.Windows.Forms.ToolStripLabel();\r
+ this.tbtnMedia = new System.Windows.Forms.ToolStripButton();\r
this.statusStrip1 = new System.Windows.Forms.StatusStrip();\r
this.tlblLoginName = new System.Windows.Forms.ToolStripStatusLabel();\r
this.tlblMoneyBalance = new System.Windows.Forms.ToolStripStatusLabel();\r
this.toolStripContainer1 = new System.Windows.Forms.ToolStripContainer();\r
this.pnlDialog = new System.Windows.Forms.Panel();\r
this.timerWorldClock = new System.Windows.Forms.Timer(this.components);\r
- this.tbtnMedia = new System.Windows.Forms.ToolStripButton();\r
this.toolStrip1.SuspendLayout();\r
this.statusStrip1.SuspendLayout();\r
this.toolStripContainer1.TopToolStripPanel.SuspendLayout();\r
// newWindowToolStripMenuItem\r
// \r
this.newWindowToolStripMenuItem.Name = "newWindowToolStripMenuItem";\r
- this.newWindowToolStripMenuItem.Size = new System.Drawing.Size(162, 22);\r
+ this.newWindowToolStripMenuItem.Size = new System.Drawing.Size(155, 22);\r
this.newWindowToolStripMenuItem.Text = "&New window...";\r
this.newWindowToolStripMenuItem.Click += new System.EventHandler(this.newWindowToolStripMenuItem_Click);\r
// \r
// \r
this.tmnuImport.Enabled = false;\r
this.tmnuImport.Name = "tmnuImport";\r
- this.tmnuImport.Size = new System.Drawing.Size(162, 22);\r
+ this.tmnuImport.Size = new System.Drawing.Size(155, 22);\r
this.tmnuImport.Text = "Import object...";\r
this.tmnuImport.Click += new System.EventHandler(this.importObjectToolStripMenuItem_Click);\r
// \r
// scriptEditorToolStripMenuItem\r
// \r
this.scriptEditorToolStripMenuItem.Name = "scriptEditorToolStripMenuItem";\r
- this.scriptEditorToolStripMenuItem.Size = new System.Drawing.Size(162, 22);\r
+ this.scriptEditorToolStripMenuItem.Size = new System.Drawing.Size(155, 22);\r
this.scriptEditorToolStripMenuItem.Text = "Script editor...";\r
this.scriptEditorToolStripMenuItem.Click += new System.EventHandler(this.scriptEditorToolStripMenuItem_Click);\r
// \r
// toolStripMenuItem3\r
// \r
this.toolStripMenuItem3.Name = "toolStripMenuItem3";\r
- this.toolStripMenuItem3.Size = new System.Drawing.Size(159, 6);\r
+ this.toolStripMenuItem3.Size = new System.Drawing.Size(152, 6);\r
// \r
// tmnuPrefs\r
// \r
this.tmnuPrefs.Name = "tmnuPrefs";\r
- this.tmnuPrefs.Size = new System.Drawing.Size(162, 22);\r
+ this.tmnuPrefs.Size = new System.Drawing.Size(155, 22);\r
this.tmnuPrefs.Text = "Preferences...";\r
this.tmnuPrefs.Click += new System.EventHandler(this.tmnuPrefs_Click);\r
// \r
// toolStripMenuItem2\r
// \r
this.toolStripMenuItem2.Name = "toolStripMenuItem2";\r
- this.toolStripMenuItem2.Size = new System.Drawing.Size(159, 6);\r
+ this.toolStripMenuItem2.Size = new System.Drawing.Size(152, 6);\r
// \r
// tmnuExit\r
// \r
this.tmnuExit.Name = "tmnuExit";\r
- this.tmnuExit.Size = new System.Drawing.Size(162, 22);\r
+ this.tmnuExit.Size = new System.Drawing.Size(155, 22);\r
this.tmnuExit.Text = "E&xit";\r
this.tmnuExit.Click += new System.EventHandler(this.tmnuExit_Click);\r
// \r
this.lblTime.Size = new System.Drawing.Size(30, 22);\r
this.lblTime.Text = "--:--";\r
// \r
+ // tbtnMedia\r
+ // \r
+ this.tbtnMedia.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;\r
+ this.tbtnMedia.Image = ((System.Drawing.Image)(resources.GetObject("tbtnMedia.Image")));\r
+ this.tbtnMedia.ImageTransparentColor = System.Drawing.Color.Magenta;\r
+ this.tbtnMedia.Name = "tbtnMedia";\r
+ this.tbtnMedia.Size = new System.Drawing.Size(44, 22);\r
+ this.tbtnMedia.Text = "Media";\r
+ this.tbtnMedia.Visible = false;\r
+ this.tbtnMedia.Click += new System.EventHandler(this.tbtnMedia_Click);\r
+ // \r
// statusStrip1\r
// \r
this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r
this.timerWorldClock.Interval = 1000;\r
this.timerWorldClock.Tick += new System.EventHandler(this.timerWorldClock_Tick);\r
// \r
- // tbtnMedia\r
- // \r
- this.tbtnMedia.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;\r
- this.tbtnMedia.Image = ((System.Drawing.Image)(resources.GetObject("tbtnMedia.Image")));\r
- this.tbtnMedia.ImageTransparentColor = System.Drawing.Color.Magenta;\r
- this.tbtnMedia.Name = "tbtnMedia";\r
- this.tbtnMedia.Size = new System.Drawing.Size(44, 22);\r
- this.tbtnMedia.Text = "Media";\r
- this.tbtnMedia.Visible = false;\r
- this.tbtnMedia.Click += new System.EventHandler(this.tbtnMedia_Click);\r
- // \r
// frmMain\r
// \r
+ this.AutoSavePosition = true;\r
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\r
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r
this.ClientSize = new System.Drawing.Size(738, 505);\r
\r
namespace Radegast\r
{\r
- public partial class frmMain : Form\r
+ public partial class frmMain : RadegastForm\r
{\r
#region Public members\r
public static ImageList ResourceImages = new ImageList();\r
\r
#region Constructor and disposal\r
public frmMain(RadegastInstance instance)\r
+ : base(instance)\r
{\r
GetSLTimeZone();\r
InitializeComponent();\r
client.Self.SitOnGround();\r
}\r
\r
+ private frmObjects objectWindow;\r
+\r
private void tbnObjects_Click(object sender, EventArgs e)\r
{\r
- (new frmObjects(instance)).Show();\r
+ if (objectWindow == null)\r
+ {\r
+ objectWindow = new frmObjects(instance);\r
+ objectWindow.Disposed += new EventHandler(objectWindow_Disposed);\r
+ objectWindow.Show();\r
+ }\r
+ objectWindow.Focus();\r
+ }\r
+\r
+ void objectWindow_Disposed(object sender, EventArgs e)\r
+ {\r
+ objectWindow = null;\r
}\r
\r
private void newWindowToolStripMenuItem_Click(object sender, EventArgs e)\r
// \r
// frmObjects\r
// \r
+ this.AutoSavePosition = true;\r
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\r
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r
this.CancelButton = this.btnClose;\r
\r
namespace Radegast\r
{\r
- public partial class frmObjects : Form\r
+ public partial class frmObjects : RadegastForm\r
{\r
private RadegastInstance instance;\r
private GridClient client { get { return instance.Client;} }\r
PropertiesQueue propRequester;\r
\r
public frmObjects(RadegastInstance instance)\r
+ : base(instance)\r
{\r
InitializeComponent();\r
Disposed += new EventHandler(frmObjects_Disposed);\r
<Compile Include="Core\Types\ExtendedRichTextBox.cs">\r
<SubType>Component</SubType>\r
</Compile>\r
+ <Compile Include="Core\Types\RadegastForm.cs">\r
+ <SubType>Form</SubType>\r
+ </Compile>\r
<Compile Include="Core\Types\LineNumberPanel.cs">\r
<SubType>Component</SubType>\r
</Compile>\r