From: Graham T. <ta...@us...> - 2005-12-19 15:07:49
|
Update of /cvsroot/ccnet/ccnet/project/CCTrayLib/Presentation In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27912/project/CCTrayLib/Presentation Modified Files: MainForm.cs Added Files: PersistWindowState.cs PersistWindowState.resx WindowStateEventArgs.cs Log Message: CCNET-633: CCTray: should remember screen location and list box widths between sessions Index: MainForm.cs =================================================================== RCS file: /cvsroot/ccnet/ccnet/project/CCTrayLib/Presentation/MainForm.cs,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** MainForm.cs 14 Sep 2005 15:44:55 -0000 1.15 --- MainForm.cs 19 Dec 2005 15:07:33 -0000 1.16 *************** *** 44,47 **** --- 44,48 ---- private ColumnHeader colLastBuildTime; private bool systemShutdownInProgress; + private PersistWindowState windowState; public MainForm(ICCTrayMultiConfiguration configuration) *************** *** 50,53 **** --- 51,55 ---- InitializeComponent(); + HookPersistentWindowState(); CreateController(); *************** *** 55,58 **** --- 57,90 ---- } + private void HookPersistentWindowState() + { + windowState = new PersistWindowState(); + windowState.Parent = this; + // set registry path in HKEY_CURRENT_USER + windowState.RegistryPath = @"Software\ThoughtWorks\CCTray"; + windowState.LoadState += new WindowStateEventHandler(OnLoadState); + windowState.SaveState += new WindowStateEventHandler(OnSaveState); + } + + private void OnLoadState(object sender, WindowStateEventArgs e) + { + // get additional state information from registry + colProject.Width = (int) e.Key.GetValue("ProjectColumnWidth", 160); + colActivity.Width = (int) e.Key.GetValue("ActivityColumnWidth", 132); + colDetail.Width = (int) e.Key.GetValue("DetailColumnWidth", 250); + colLastBuildLabel.Width = (int) e.Key.GetValue("LastBuildLabelColumnWidth", 120); + colLastBuildTime.Width = (int) e.Key.GetValue("LastBuildTimeColumnWidth", 130); + } + + private void OnSaveState(object sender, WindowStateEventArgs e) + { + // save additional state information to registry + e.Key.SetValue("ProjectColumnWidth", colProject.Width); + e.Key.SetValue("ActivityColumnWidth", colActivity.Width); + e.Key.SetValue("DetailColumnWidth", colDetail.Width); + e.Key.SetValue("LastBuildLabelColumnWidth", colLastBuildLabel.Width); + e.Key.SetValue("LastBuildTimeColumnWidth", colLastBuildTime.Width); + } + private void CreateController() { *************** *** 94,98 **** { this.components = new System.ComponentModel.Container(); ! System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(MainForm)); this.lvProjects = new System.Windows.Forms.ListView(); this.colProject = new System.Windows.Forms.ColumnHeader(); --- 126,130 ---- { this.components = new System.ComponentModel.Container(); ! System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof (MainForm)); this.lvProjects = new System.Windows.Forms.ListView(); this.colProject = new System.Windows.Forms.ColumnHeader(); *************** *** 128,139 **** // lvProjects // ! this.lvProjects.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { ! this.colProject, ! this.colActivity, ! this.colDetail, ! this.colLastBuildLabel, ! this.colLastBuildTime}); this.lvProjects.ContextMenu = this.projectContextMenu; this.lvProjects.Dock = System.Windows.Forms.DockStyle.Fill; this.lvProjects.LargeImageList = this.largeIconList; this.lvProjects.Location = new System.Drawing.Point(0, 0); --- 160,175 ---- // lvProjects // ! this.lvProjects.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] ! { ! this.colProject, ! this.colActivity, ! this.colDetail, ! this.colLastBuildLabel, ! this.colLastBuildTime ! }); this.lvProjects.ContextMenu = this.projectContextMenu; this.lvProjects.Dock = System.Windows.Forms.DockStyle.Fill; + this.lvProjects.FullRowSelect = true; + this.lvProjects.HideSelection = false; this.lvProjects.LargeImageList = this.largeIconList; this.lvProjects.Location = new System.Drawing.Point(0, 0); *************** *** 175,181 **** // projectContextMenu // ! this.projectContextMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { ! this.mnuForce, ! this.mnuWebPage}); // // mnuForce --- 211,219 ---- // projectContextMenu // ! this.projectContextMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] ! { ! this.mnuForce, ! this.mnuWebPage ! }); // // mnuForce *************** *** 203,217 **** // mainMenu // ! this.mainMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { ! this.menuFile, ! this.mnuView}); // // menuFile // this.menuFile.Index = 0; ! this.menuFile.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { ! this.mnuFilePreferences, ! this.menuItem3, ! this.menuFileExit}); this.menuFile.Text = "&File"; // --- 241,259 ---- // mainMenu // ! this.mainMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] ! { ! this.menuFile, ! this.mnuView ! }); // // menuFile // this.menuFile.Index = 0; ! this.menuFile.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] ! { ! this.mnuFilePreferences, ! this.menuItem3, ! this.menuFileExit ! }); this.menuFile.Text = "&File"; // *************** *** 236,243 **** // this.mnuView.Index = 1; ! this.mnuView.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { ! this.mnuViewIcons, ! this.mnuViewList, ! this.mnuViewDetails}); this.mnuView.Text = "&View"; this.mnuView.Popup += new System.EventHandler(this.mnuView_Popup); --- 278,287 ---- // this.mnuView.Index = 1; ! this.mnuView.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] ! { ! this.mnuViewIcons, ! this.mnuViewList, ! this.mnuViewDetails ! }); this.mnuView.Text = "&View"; this.mnuView.Popup += new System.EventHandler(this.mnuView_Popup); *************** *** 272,280 **** // mnuTrayContextMenu // ! this.mnuTrayContextMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { ! this.mnuTraySettings, ! this.mnuShow, ! this.menuItem5, ! this.mnuTrayExit}); // // mnuTraySettings --- 316,326 ---- // mnuTrayContextMenu // ! this.mnuTrayContextMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] ! { ! this.mnuTraySettings, ! this.mnuShow, ! this.menuItem5, ! this.mnuTrayExit ! }); // // mnuTraySettings *************** *** 328,332 **** this.Controls.Add(this.lvProjects); this.Controls.Add(this.panel1); ! this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.MaximizeBox = false; this.Menu = this.mainMenu; --- 374,378 ---- this.Controls.Add(this.lvProjects); this.Controls.Add(this.panel1); ! this.Icon = ((System.Drawing.Icon) (resources.GetObject("$this.Icon"))); this.MaximizeBox = false; this.Menu = this.mainMenu; *************** *** 334,342 **** this.Name = "MainForm"; this.ShowInTaskbar = false; this.Text = "CruiseControl.NET"; this.Closing += new System.ComponentModel.CancelEventHandler(this.MainForm_Closing); this.panel1.ResumeLayout(false); this.ResumeLayout(false); - } --- 380,388 ---- this.Name = "MainForm"; this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.Manual; this.Text = "CruiseControl.NET"; this.Closing += new System.ComponentModel.CancelEventHandler(this.MainForm_Closing); this.panel1.ResumeLayout(false); this.ResumeLayout(false); } *************** *** 412,416 **** CreateController(); } - } finally --- 458,461 ---- *************** *** 518,525 **** public ListViewItemComparer() : this(0, true) ! {} public ListViewItemComparer(int column) : this(column, true) ! {} public ListViewItemComparer(int column, bool ascending) --- 563,572 ---- public ListViewItemComparer() : this(0, true) ! { ! } public ListViewItemComparer(int column) : this(column, true) ! { ! } public ListViewItemComparer(int column, bool ascending) --- NEW FILE: PersistWindowState.cs --- using System; using System.ComponentModel; using System.Drawing; using System.Windows.Forms; using Microsoft.Win32; namespace ThoughtWorks.CruiseControl.CCTrayLib.Presentation { /// <summary> /// Class originally by Joel Matthias, and published into the public domain on /// CodeProject.com at: /// http://www.codeproject.com/csharp/restoreformstate.asp /// /// Adapted for use with ccnet-tray by Grant Drake. /// </summary> public class PersistWindowState : Component { public event WindowStateEventHandler LoadState; public event WindowStateEventHandler SaveState; private Form parent; private string regPath; private int normalLeft; private int normalTop; private int normalWidth; private int normalHeight; private FormWindowState windowState; private bool allowSaveMinimized = false; public PersistWindowState() { } public Form Parent { set { parent = value; // subscribe to parent form's events parent.Load += new EventHandler(OnLoad); parent.Closing += new CancelEventHandler(OnClosing); parent.Move += new EventHandler(OnMove); parent.Resize += new EventHandler(OnResize); // get initial width and height in case form is never resized normalWidth = parent.Width; normalHeight = parent.Height; } get { return parent; } } // registry key should be set in parent form's constructor public string RegistryPath { set { regPath = value; } get { return regPath; } } public bool AllowSaveMinimized { get { return allowSaveMinimized; } set { allowSaveMinimized = value; } } private void OnLoad(object sender, EventArgs e) { // attempt to read state from registry RegistryKey key = Registry.CurrentUser.OpenSubKey(regPath); if (key != null) { int left = (int) key.GetValue("Left", parent.Left); int top = (int) key.GetValue("Top", parent.Top); int width = (int) key.GetValue("Width", parent.Width); int height = (int) key.GetValue("Height", parent.Height); FormWindowState windowState = (FormWindowState) key.GetValue("WindowState", (int) parent.WindowState); parent.Location = new Point(left, top); parent.Size = new Size(width, height); parent.WindowState = windowState; // fire LoadState event if (LoadState != null) LoadState(this, new WindowStateEventArgs(key)); } } private void OnClosing(object sender, CancelEventArgs e) { // save position, size and state RegistryKey key = Registry.CurrentUser.CreateSubKey(regPath); key.SetValue("Left", normalLeft); key.SetValue("Top", normalTop); key.SetValue("Width", normalWidth); key.SetValue("Height", normalHeight); // check if we are allowed to save the state as minimized (not normally) if (!allowSaveMinimized) { if (windowState == FormWindowState.Minimized) windowState = FormWindowState.Normal; } key.SetValue("WindowState", (int) windowState); // fire SaveState event if (SaveState != null) SaveState(this, new WindowStateEventArgs(key)); } private void OnMove(object sender, EventArgs e) { // save position if (parent.WindowState == FormWindowState.Normal) { normalLeft = parent.Left; normalTop = parent.Top; } // save state windowState = parent.WindowState; } private void OnResize(object sender, EventArgs e) { // save width and height if (parent.WindowState == FormWindowState.Normal) { normalWidth = parent.Width; normalHeight = parent.Height; } } } } --- NEW FILE: WindowStateEventArgs.cs --- using System; using Microsoft.Win32; namespace ThoughtWorks.CruiseControl.CCTrayLib.Presentation { public class WindowStateEventArgs : EventArgs { public readonly RegistryKey Key; public WindowStateEventArgs( RegistryKey key ) { Key = key; } } // event info that allows form to persist extra window state data public delegate void WindowStateEventHandler(object sender, WindowStateEventArgs e); } --- NEW FILE: PersistWindowState.resx --- <?xml version="1.0" encoding="utf-8" ?> <root> <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xsd:element name="root" msdata:IsDataSet="true"> <xsd:complexType> <xsd:choice maxOccurs="unbounded"> <xsd:element name="data"> <xsd:complexType> <xsd:sequence> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> </xsd:sequence> <xsd:attribute name="name" type="xsd:string" /> <xsd:attribute name="type" type="xsd:string" /> <xsd:attribute name="mimetype" type="xsd:string" /> </xsd:complexType> </xsd:element> <xsd:element name="resheader"> <xsd:complexType> <xsd:sequence> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> </xsd:sequence> <xsd:attribute name="name" type="xsd:string" use="required" /> </xsd:complexType> </xsd:element> </xsd:choice> </xsd:complexType> </xsd:element> </xsd:schema> <resheader name="ResMimeType"> <value>text/microsoft-resx</value> </resheader> <resheader name="Version"> <value>1.0.0.0</value> </resheader> <resheader name="Reader"> <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> <resheader name="Writer"> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> </root> |