OSDN Git Service

Add RadegastForm that can AutoSavePosition if you want it to.
authorLatif Khalifa <latifer@streamgrid.net>
Sat, 12 Sep 2009 04:33:49 +0000 (04:33 +0000)
committerLatif Khalifa <latifer@streamgrid.net>
Sat, 12 Sep 2009 04:33:49 +0000 (04:33 +0000)
Make main window and object window AutoSavePosition
RAD-9: Prevent double object windows

git-svn-id: https://radegast.googlecode.com/svn/trunk@223 f7a694da-4d33-11de-9ad6-1127a62b9fcd

Radegast/Core/Types/RadegastForm.cs [new file with mode: 0644]
Radegast/GUI/Dialogs/MainForm.Designer.cs
Radegast/GUI/Dialogs/MainForm.cs
Radegast/GUI/Dialogs/Objects.Designer.cs
Radegast/GUI/Dialogs/Objects.cs
Radegast/Radegast.csproj

diff --git a/Radegast/Core/Types/RadegastForm.cs b/Radegast/Core/Types/RadegastForm.cs
new file mode 100644 (file)
index 0000000..744812d
--- /dev/null
@@ -0,0 +1,202 @@
+// \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
index 5b7f3f2..503cb6d 100644 (file)
@@ -112,6 +112,7 @@ namespace Radegast
             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
@@ -126,7 +127,6 @@ namespace Radegast
             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
@@ -177,7 +177,7 @@ namespace Radegast
             // 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
@@ -185,38 +185,38 @@ namespace Radegast
             // \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
@@ -481,6 +481,17 @@ namespace Radegast
             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
@@ -637,19 +648,9 @@ namespace Radegast
             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
index 35ae526..7ca6c3f 100644 (file)
@@ -45,7 +45,7 @@ using OpenMetaverse.StructuredData;
 \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
@@ -93,6 +93,7 @@ namespace Radegast
 \r
         #region Constructor and disposal\r
         public frmMain(RadegastInstance instance)\r
+            : base(instance)\r
         {\r
             GetSLTimeZone();\r
             InitializeComponent();\r
@@ -791,9 +792,22 @@ namespace Radegast
             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
index d6a2032..fbcd5a8 100644 (file)
@@ -597,6 +597,7 @@ namespace Radegast
             // \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
index 96c1ff4..4f7bf8e 100644 (file)
@@ -38,7 +38,7 @@ using OpenMetaverse;
 \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
@@ -48,6 +48,7 @@ namespace Radegast
         PropertiesQueue propRequester;\r
 \r
         public frmObjects(RadegastInstance instance)\r
+            : base(instance)\r
         {\r
             InitializeComponent();\r
             Disposed += new EventHandler(frmObjects_Disposed);\r
index 4aa2077..a190e8f 100644 (file)
     <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