OSDN Git Service

Work on group management
authorLatif Khalifa <latifer@streamgrid.net>
Wed, 1 Jul 2009 00:33:01 +0000 (00:33 +0000)
committerLatif Khalifa <latifer@streamgrid.net>
Wed, 1 Jul 2009 00:33:01 +0000 (00:33 +0000)
git-svn-id: https://radegast.googlecode.com/svn/trunk@83 f7a694da-4d33-11de-9ad6-1127a62b9fcd

Radegast/GUI/Consoles/GroupDetails.Designer.cs
Radegast/GUI/Consoles/GroupDetails.cs

index 899f70e..deff127 100644 (file)
@@ -60,9 +60,38 @@ namespace Radegast
         {\r
             this.tcGroupDetails = new System.Windows.Forms.TabControl();\r
             this.tpGeneral = new System.Windows.Forms.TabPage();\r
+            this.lvwGeneralMembers = new System.Windows.Forms.ListView();\r
+            this.chGenMemberName = new System.Windows.Forms.ColumnHeader();\r
+            this.chGenTitle = new System.Windows.Forms.ColumnHeader();\r
+            this.chGenLastOn = new System.Windows.Forms.ColumnHeader();\r
+            this.lblOwners = new System.Windows.Forms.Label();\r
+            this.tbxCharter = new System.Windows.Forms.TextBox();\r
+            this.lblCharter = new System.Windows.Forms.Label();\r
+            this.gbPreferences = new System.Windows.Forms.GroupBox();\r
+            this.cbxShowGroupInList = new System.Windows.Forms.CheckBox();\r
+            this.cbxReceiveNotices = new System.Windows.Forms.CheckBox();\r
+            this.cbxActiveTitle = new System.Windows.Forms.ComboBox();\r
+            this.lblActiveTitle = new System.Windows.Forms.Label();\r
+            this.nudEnrollmentFee = new System.Windows.Forms.NumericUpDown();\r
+            this.cbxMaturity = new System.Windows.Forms.ComboBox();\r
+            this.cbxEnrollmentFee = new System.Windows.Forms.CheckBox();\r
+            this.cbxOpenEnrollment = new System.Windows.Forms.CheckBox();\r
+            this.cbxShowInSearch = new System.Windows.Forms.CheckBox();\r
+            this.lblInsignia = new System.Windows.Forms.Label();\r
+            this.pnlInsignia = new System.Windows.Forms.Panel();\r
+            this.lblFounded = new System.Windows.Forms.Label();\r
+            this.lblGroupName = new System.Windows.Forms.Label();\r
             this.tpMembersRoles = new System.Windows.Forms.TabPage();\r
             this.tpNotices = new System.Windows.Forms.TabPage();\r
+            this.pnlBottomControls = new System.Windows.Forms.Panel();\r
+            this.btnClose = new System.Windows.Forms.Button();\r
+            this.btnApply = new System.Windows.Forms.Button();\r
+            this.btnRefresh = new System.Windows.Forms.Button();\r
             this.tcGroupDetails.SuspendLayout();\r
+            this.tpGeneral.SuspendLayout();\r
+            this.gbPreferences.SuspendLayout();\r
+            ((System.ComponentModel.ISupportInitialize)(this.nudEnrollmentFee)).BeginInit();\r
+            this.pnlBottomControls.SuspendLayout();\r
             this.SuspendLayout();\r
             // \r
             // tcGroupDetails\r
@@ -74,47 +103,322 @@ namespace Radegast
             this.tcGroupDetails.Location = new System.Drawing.Point(0, 0);\r
             this.tcGroupDetails.Name = "tcGroupDetails";\r
             this.tcGroupDetails.SelectedIndex = 0;\r
-            this.tcGroupDetails.Size = new System.Drawing.Size(418, 405);\r
+            this.tcGroupDetails.Size = new System.Drawing.Size(408, 500);\r
             this.tcGroupDetails.TabIndex = 0;\r
             // \r
             // tpGeneral\r
             // \r
+            this.tpGeneral.BackColor = System.Drawing.SystemColors.Control;\r
+            this.tpGeneral.Controls.Add(this.lvwGeneralMembers);\r
+            this.tpGeneral.Controls.Add(this.lblOwners);\r
+            this.tpGeneral.Controls.Add(this.tbxCharter);\r
+            this.tpGeneral.Controls.Add(this.lblCharter);\r
+            this.tpGeneral.Controls.Add(this.gbPreferences);\r
+            this.tpGeneral.Controls.Add(this.lblInsignia);\r
+            this.tpGeneral.Controls.Add(this.pnlInsignia);\r
+            this.tpGeneral.Controls.Add(this.lblFounded);\r
+            this.tpGeneral.Controls.Add(this.lblGroupName);\r
             this.tpGeneral.Location = new System.Drawing.Point(4, 22);\r
             this.tpGeneral.Name = "tpGeneral";\r
             this.tpGeneral.Padding = new System.Windows.Forms.Padding(3);\r
-            this.tpGeneral.Size = new System.Drawing.Size(410, 379);\r
+            this.tpGeneral.Size = new System.Drawing.Size(400, 474);\r
             this.tpGeneral.TabIndex = 0;\r
             this.tpGeneral.Text = "General";\r
-            this.tpGeneral.UseVisualStyleBackColor = true;\r
+            // \r
+            // lvwGeneralMembers\r
+            // \r
+            this.lvwGeneralMembers.AllowColumnReorder = true;\r
+            this.lvwGeneralMembers.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)\r
+                        | System.Windows.Forms.AnchorStyles.Left)\r
+                        | System.Windows.Forms.AnchorStyles.Right)));\r
+            this.lvwGeneralMembers.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\r
+            this.chGenMemberName,\r
+            this.chGenTitle,\r
+            this.chGenLastOn});\r
+            this.lvwGeneralMembers.GridLines = true;\r
+            this.lvwGeneralMembers.HideSelection = false;\r
+            this.lvwGeneralMembers.Location = new System.Drawing.Point(9, 232);\r
+            this.lvwGeneralMembers.MultiSelect = false;\r
+            this.lvwGeneralMembers.Name = "lvwGeneralMembers";\r
+            this.lvwGeneralMembers.ShowGroups = false;\r
+            this.lvwGeneralMembers.Size = new System.Drawing.Size(385, 131);\r
+            this.lvwGeneralMembers.Sorting = System.Windows.Forms.SortOrder.Ascending;\r
+            this.lvwGeneralMembers.TabIndex = 8;\r
+            this.lvwGeneralMembers.UseCompatibleStateImageBehavior = false;\r
+            this.lvwGeneralMembers.View = System.Windows.Forms.View.Details;\r
+            this.lvwGeneralMembers.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.lvwGeneralMembers_ColumnClick);\r
+            // \r
+            // chGenMemberName\r
+            // \r
+            this.chGenMemberName.Text = "Member name";\r
+            this.chGenMemberName.Width = 130;\r
+            // \r
+            // chGenTitle\r
+            // \r
+            this.chGenTitle.Text = "Title";\r
+            this.chGenTitle.Width = 130;\r
+            // \r
+            // chGenLastOn\r
+            // \r
+            this.chGenLastOn.Text = "Last login";\r
+            this.chGenLastOn.Width = 90;\r
+            // \r
+            // lblOwners\r
+            // \r
+            this.lblOwners.AutoSize = true;\r
+            this.lblOwners.Location = new System.Drawing.Point(6, 213);\r
+            this.lblOwners.Name = "lblOwners";\r
+            this.lblOwners.Size = new System.Drawing.Size(141, 13);\r
+            this.lblOwners.TabIndex = 7;\r
+            this.lblOwners.Text = "Owners and visible members";\r
+            // \r
+            // tbxCharter\r
+            // \r
+            this.tbxCharter.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)\r
+                        | System.Windows.Forms.AnchorStyles.Right)));\r
+            this.tbxCharter.Location = new System.Drawing.Point(155, 36);\r
+            this.tbxCharter.Multiline = true;\r
+            this.tbxCharter.Name = "tbxCharter";\r
+            this.tbxCharter.Size = new System.Drawing.Size(239, 190);\r
+            this.tbxCharter.TabIndex = 6;\r
+            // \r
+            // lblCharter\r
+            // \r
+            this.lblCharter.AutoSize = true;\r
+            this.lblCharter.Location = new System.Drawing.Point(152, 20);\r
+            this.lblCharter.Name = "lblCharter";\r
+            this.lblCharter.Size = new System.Drawing.Size(72, 13);\r
+            this.lblCharter.TabIndex = 5;\r
+            this.lblCharter.Text = "Group charter";\r
+            // \r
+            // gbPreferences\r
+            // \r
+            this.gbPreferences.Controls.Add(this.cbxShowGroupInList);\r
+            this.gbPreferences.Controls.Add(this.cbxReceiveNotices);\r
+            this.gbPreferences.Controls.Add(this.cbxActiveTitle);\r
+            this.gbPreferences.Controls.Add(this.lblActiveTitle);\r
+            this.gbPreferences.Controls.Add(this.nudEnrollmentFee);\r
+            this.gbPreferences.Controls.Add(this.cbxMaturity);\r
+            this.gbPreferences.Controls.Add(this.cbxEnrollmentFee);\r
+            this.gbPreferences.Controls.Add(this.cbxOpenEnrollment);\r
+            this.gbPreferences.Controls.Add(this.cbxShowInSearch);\r
+            this.gbPreferences.Dock = System.Windows.Forms.DockStyle.Bottom;\r
+            this.gbPreferences.Location = new System.Drawing.Point(3, 369);\r
+            this.gbPreferences.Name = "gbPreferences";\r
+            this.gbPreferences.Size = new System.Drawing.Size(394, 102);\r
+            this.gbPreferences.TabIndex = 4;\r
+            this.gbPreferences.TabStop = false;\r
+            this.gbPreferences.Text = "Group Preferences";\r
+            // \r
+            // cbxShowGroupInList\r
+            // \r
+            this.cbxShowGroupInList.AutoSize = true;\r
+            this.cbxShowGroupInList.Location = new System.Drawing.Point(211, 82);\r
+            this.cbxShowGroupInList.Name = "cbxShowGroupInList";\r
+            this.cbxShowGroupInList.Size = new System.Drawing.Size(130, 17);\r
+            this.cbxShowGroupInList.TabIndex = 8;\r
+            this.cbxShowGroupInList.Text = "List group in my profile";\r
+            this.cbxShowGroupInList.UseVisualStyleBackColor = true;\r
+            // \r
+            // cbxReceiveNotices\r
+            // \r
+            this.cbxReceiveNotices.AutoSize = true;\r
+            this.cbxReceiveNotices.Location = new System.Drawing.Point(211, 59);\r
+            this.cbxReceiveNotices.Name = "cbxReceiveNotices";\r
+            this.cbxReceiveNotices.Size = new System.Drawing.Size(133, 17);\r
+            this.cbxReceiveNotices.TabIndex = 7;\r
+            this.cbxReceiveNotices.Text = "Receive group notices";\r
+            this.cbxReceiveNotices.UseVisualStyleBackColor = true;\r
+            // \r
+            // cbxActiveTitle\r
+            // \r
+            this.cbxActiveTitle.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r
+            this.cbxActiveTitle.FormattingEnabled = true;\r
+            this.cbxActiveTitle.Location = new System.Drawing.Point(211, 32);\r
+            this.cbxActiveTitle.Name = "cbxActiveTitle";\r
+            this.cbxActiveTitle.Size = new System.Drawing.Size(151, 21);\r
+            this.cbxActiveTitle.TabIndex = 6;\r
+            // \r
+            // lblActiveTitle\r
+            // \r
+            this.lblActiveTitle.AutoSize = true;\r
+            this.lblActiveTitle.Location = new System.Drawing.Point(208, 16);\r
+            this.lblActiveTitle.Name = "lblActiveTitle";\r
+            this.lblActiveTitle.Size = new System.Drawing.Size(72, 13);\r
+            this.lblActiveTitle.TabIndex = 5;\r
+            this.lblActiveTitle.Text = "My active title";\r
+            // \r
+            // nudEnrollmentFee\r
+            // \r
+            this.nudEnrollmentFee.Increment = new decimal(new int[] {\r
+            10,\r
+            0,\r
+            0,\r
+            0});\r
+            this.nudEnrollmentFee.Location = new System.Drawing.Point(114, 55);\r
+            this.nudEnrollmentFee.Maximum = new decimal(new int[] {\r
+            1410065408,\r
+            2,\r
+            0,\r
+            0});\r
+            this.nudEnrollmentFee.Name = "nudEnrollmentFee";\r
+            this.nudEnrollmentFee.Size = new System.Drawing.Size(53, 20);\r
+            this.nudEnrollmentFee.TabIndex = 4;\r
+            // \r
+            // cbxMaturity\r
+            // \r
+            this.cbxMaturity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r
+            this.cbxMaturity.FormattingEnabled = true;\r
+            this.cbxMaturity.Items.AddRange(new object[] {\r
+            "PG Content",\r
+            "Mature Content",\r
+            "Adult Content"});\r
+            this.cbxMaturity.Location = new System.Drawing.Point(6, 77);\r
+            this.cbxMaturity.Name = "cbxMaturity";\r
+            this.cbxMaturity.Size = new System.Drawing.Size(121, 21);\r
+            this.cbxMaturity.TabIndex = 3;\r
+            // \r
+            // cbxEnrollmentFee\r
+            // \r
+            this.cbxEnrollmentFee.AutoSize = true;\r
+            this.cbxEnrollmentFee.Location = new System.Drawing.Point(15, 56);\r
+            this.cbxEnrollmentFee.Name = "cbxEnrollmentFee";\r
+            this.cbxEnrollmentFee.Size = new System.Drawing.Size(93, 17);\r
+            this.cbxEnrollmentFee.TabIndex = 2;\r
+            this.cbxEnrollmentFee.Text = "Enrollment fee";\r
+            this.cbxEnrollmentFee.UseVisualStyleBackColor = true;\r
+            // \r
+            // cbxOpenEnrollment\r
+            // \r
+            this.cbxOpenEnrollment.AutoSize = true;\r
+            this.cbxOpenEnrollment.Location = new System.Drawing.Point(6, 38);\r
+            this.cbxOpenEnrollment.Name = "cbxOpenEnrollment";\r
+            this.cbxOpenEnrollment.Size = new System.Drawing.Size(103, 17);\r
+            this.cbxOpenEnrollment.TabIndex = 1;\r
+            this.cbxOpenEnrollment.Text = "Open enrollment";\r
+            this.cbxOpenEnrollment.UseVisualStyleBackColor = true;\r
+            // \r
+            // cbxShowInSearch\r
+            // \r
+            this.cbxShowInSearch.AutoSize = true;\r
+            this.cbxShowInSearch.Location = new System.Drawing.Point(6, 19);\r
+            this.cbxShowInSearch.Name = "cbxShowInSearch";\r
+            this.cbxShowInSearch.Size = new System.Drawing.Size(99, 17);\r
+            this.cbxShowInSearch.TabIndex = 0;\r
+            this.cbxShowInSearch.Text = "Show in search";\r
+            this.cbxShowInSearch.UseVisualStyleBackColor = true;\r
+            // \r
+            // lblInsignia\r
+            // \r
+            this.lblInsignia.AutoSize = true;\r
+            this.lblInsignia.Location = new System.Drawing.Point(6, 179);\r
+            this.lblInsignia.Name = "lblInsignia";\r
+            this.lblInsignia.Size = new System.Drawing.Size(75, 13);\r
+            this.lblInsignia.TabIndex = 3;\r
+            this.lblInsignia.Text = "Group Insignia";\r
+            // \r
+            // pnlInsignia\r
+            // \r
+            this.pnlInsignia.Location = new System.Drawing.Point(9, 36);\r
+            this.pnlInsignia.Name = "pnlInsignia";\r
+            this.pnlInsignia.Size = new System.Drawing.Size(140, 140);\r
+            this.pnlInsignia.TabIndex = 2;\r
+            // \r
+            // lblFounded\r
+            // \r
+            this.lblFounded.AutoSize = true;\r
+            this.lblFounded.Location = new System.Drawing.Point(6, 20);\r
+            this.lblFounded.Name = "lblFounded";\r
+            this.lblFounded.Size = new System.Drawing.Size(115, 13);\r
+            this.lblFounded.TabIndex = 1;\r
+            this.lblFounded.Text = "Founded by: Test User";\r
+            // \r
+            // lblGroupName\r
+            // \r
+            this.lblGroupName.AutoSize = true;\r
+            this.lblGroupName.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
+            this.lblGroupName.Location = new System.Drawing.Point(6, 3);\r
+            this.lblGroupName.Name = "lblGroupName";\r
+            this.lblGroupName.Size = new System.Drawing.Size(89, 17);\r
+            this.lblGroupName.TabIndex = 0;\r
+            this.lblGroupName.Text = "Group Name";\r
             // \r
             // tpMembersRoles\r
             // \r
+            this.tpMembersRoles.BackColor = System.Drawing.SystemColors.Control;\r
             this.tpMembersRoles.Location = new System.Drawing.Point(4, 22);\r
             this.tpMembersRoles.Name = "tpMembersRoles";\r
             this.tpMembersRoles.Padding = new System.Windows.Forms.Padding(3);\r
-            this.tpMembersRoles.Size = new System.Drawing.Size(410, 379);\r
+            this.tpMembersRoles.Size = new System.Drawing.Size(400, 474);\r
             this.tpMembersRoles.TabIndex = 1;\r
             this.tpMembersRoles.Text = "Members & Roles";\r
-            this.tpMembersRoles.UseVisualStyleBackColor = true;\r
             // \r
             // tpNotices\r
             // \r
+            this.tpNotices.BackColor = System.Drawing.SystemColors.Control;\r
             this.tpNotices.Location = new System.Drawing.Point(4, 22);\r
             this.tpNotices.Name = "tpNotices";\r
             this.tpNotices.Padding = new System.Windows.Forms.Padding(3);\r
-            this.tpNotices.Size = new System.Drawing.Size(410, 379);\r
+            this.tpNotices.Size = new System.Drawing.Size(400, 474);\r
             this.tpNotices.TabIndex = 2;\r
             this.tpNotices.Text = "Notices";\r
-            this.tpNotices.UseVisualStyleBackColor = true;\r
+            // \r
+            // pnlBottomControls\r
+            // \r
+            this.pnlBottomControls.Controls.Add(this.btnClose);\r
+            this.pnlBottomControls.Controls.Add(this.btnApply);\r
+            this.pnlBottomControls.Controls.Add(this.btnRefresh);\r
+            this.pnlBottomControls.Dock = System.Windows.Forms.DockStyle.Bottom;\r
+            this.pnlBottomControls.Location = new System.Drawing.Point(0, 500);\r
+            this.pnlBottomControls.Name = "pnlBottomControls";\r
+            this.pnlBottomControls.Size = new System.Drawing.Size(408, 34);\r
+            this.pnlBottomControls.TabIndex = 6;\r
+            // \r
+            // btnClose\r
+            // \r
+            this.btnClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r
+            this.btnClose.Location = new System.Drawing.Point(329, 6);\r
+            this.btnClose.Name = "btnClose";\r
+            this.btnClose.Size = new System.Drawing.Size(75, 23);\r
+            this.btnClose.TabIndex = 0;\r
+            this.btnClose.Text = "Close";\r
+            this.btnClose.UseVisualStyleBackColor = true;\r
+            // \r
+            // btnApply\r
+            // \r
+            this.btnApply.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r
+            this.btnApply.Location = new System.Drawing.Point(248, 6);\r
+            this.btnApply.Name = "btnApply";\r
+            this.btnApply.Size = new System.Drawing.Size(75, 23);\r
+            this.btnApply.TabIndex = 0;\r
+            this.btnApply.Text = "Apply";\r
+            this.btnApply.UseVisualStyleBackColor = true;\r
+            // \r
+            // btnRefresh\r
+            // \r
+            this.btnRefresh.Location = new System.Drawing.Point(13, 6);\r
+            this.btnRefresh.Name = "btnRefresh";\r
+            this.btnRefresh.Size = new System.Drawing.Size(75, 23);\r
+            this.btnRefresh.TabIndex = 0;\r
+            this.btnRefresh.Text = "Refresh";\r
+            this.btnRefresh.UseVisualStyleBackColor = true;\r
+            this.btnRefresh.Click += new System.EventHandler(this.btnRefresh_Click);\r
             // \r
             // GroupDetails\r
             // \r
             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\r
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r
             this.Controls.Add(this.tcGroupDetails);\r
+            this.Controls.Add(this.pnlBottomControls);\r
             this.Name = "GroupDetails";\r
-            this.Size = new System.Drawing.Size(418, 405);\r
+            this.Size = new System.Drawing.Size(408, 534);\r
             this.tcGroupDetails.ResumeLayout(false);\r
+            this.tpGeneral.ResumeLayout(false);\r
+            this.tpGeneral.PerformLayout();\r
+            this.gbPreferences.ResumeLayout(false);\r
+            this.gbPreferences.PerformLayout();\r
+            ((System.ComponentModel.ISupportInitialize)(this.nudEnrollmentFee)).EndInit();\r
+            this.pnlBottomControls.ResumeLayout(false);\r
             this.ResumeLayout(false);\r
 \r
         }\r
@@ -125,5 +429,30 @@ namespace Radegast
         private System.Windows.Forms.TabPage tpGeneral;\r
         private System.Windows.Forms.TabPage tpMembersRoles;\r
         private System.Windows.Forms.TabPage tpNotices;\r
+        private System.Windows.Forms.Panel pnlInsignia;\r
+        private System.Windows.Forms.Label lblFounded;\r
+        private System.Windows.Forms.Label lblGroupName;\r
+        private System.Windows.Forms.Label lblInsignia;\r
+        private System.Windows.Forms.GroupBox gbPreferences;\r
+        private System.Windows.Forms.Panel pnlBottomControls;\r
+        private System.Windows.Forms.Button btnClose;\r
+        private System.Windows.Forms.Button btnApply;\r
+        private System.Windows.Forms.Button btnRefresh;\r
+        private System.Windows.Forms.CheckBox cbxEnrollmentFee;\r
+        private System.Windows.Forms.CheckBox cbxOpenEnrollment;\r
+        private System.Windows.Forms.CheckBox cbxShowInSearch;\r
+        private System.Windows.Forms.ComboBox cbxMaturity;\r
+        private System.Windows.Forms.ComboBox cbxActiveTitle;\r
+        private System.Windows.Forms.Label lblActiveTitle;\r
+        private System.Windows.Forms.NumericUpDown nudEnrollmentFee;\r
+        private System.Windows.Forms.CheckBox cbxShowGroupInList;\r
+        private System.Windows.Forms.CheckBox cbxReceiveNotices;\r
+        private System.Windows.Forms.Label lblCharter;\r
+        private System.Windows.Forms.ListView lvwGeneralMembers;\r
+        private System.Windows.Forms.Label lblOwners;\r
+        private System.Windows.Forms.TextBox tbxCharter;\r
+        private System.Windows.Forms.ColumnHeader chGenMemberName;\r
+        private System.Windows.Forms.ColumnHeader chGenTitle;\r
+        private System.Windows.Forms.ColumnHeader chGenLastOn;\r
     }\r
 }\r
index 94ecea5..e0d1521 100644 (file)
@@ -29,6 +29,7 @@
 // $Id$\r
 //\r
 using System;\r
+using System.Collections;\r
 using System.Collections.Generic;\r
 using System.ComponentModel;\r
 using System.Drawing;\r
@@ -42,9 +43,273 @@ namespace Radegast
 {\r
     public partial class GroupDetails : UserControl\r
     {\r
+        private Group group;\r
+        private RadegastInstance instance;\r
+        private GridClient client { get { return instance.Client; } }\r
+\r
+        private UUID groupTitlesRequest;\r
+        private UUID groupMembersRequest;\r
+\r
         public GroupDetails(RadegastInstance instance, Group group)\r
         {\r
             InitializeComponent();\r
+            Disposed += new EventHandler(GroupDetails_Disposed);\r
+            \r
+            this.instance = instance;\r
+            this.group = group;\r
+\r
+            if (group.InsigniaID != UUID.Zero)\r
+            {\r
+                SLImageHandler insignia = new SLImageHandler(instance, group.InsigniaID, string.Empty);\r
+                insignia.Dock = DockStyle.Fill;\r
+                pnlInsignia.Controls.Add(insignia);\r
+            }\r
+\r
+            lblGroupName.Text = group.Name;\r
+            lvwGeneralMembers.ListViewItemSorter = new GroupMemberSorter();\r
+\r
+            // Callbacks\r
+            client.Groups.OnGroupTitles += new GroupManager.GroupTitlesCallback(Groups_OnGroupTitles);\r
+            client.Groups.OnGroupMembers += new GroupManager.GroupMembersCallback(Groups_OnGroupMembers);\r
+            client.Groups.OnGroupProfile += new GroupManager.GroupProfileCallback(Groups_OnGroupProfile);\r
+            client.Avatars.OnAvatarNames += new AvatarManager.AvatarNamesCallback(Avatars_OnAvatarNames);\r
+\r
+            RefreshGroupInfo();\r
+        }\r
+\r
+        void GroupDetails_Disposed(object sender, EventArgs e)\r
+        {\r
+            client.Groups.OnGroupTitles -= new GroupManager.GroupTitlesCallback(Groups_OnGroupTitles);\r
+            client.Groups.OnGroupMembers -= new GroupManager.GroupMembersCallback(Groups_OnGroupMembers);\r
+            client.Groups.OnGroupProfile -= new GroupManager.GroupProfileCallback(Groups_OnGroupProfile);\r
+            client.Avatars.OnAvatarNames -= new AvatarManager.AvatarNamesCallback(Avatars_OnAvatarNames);\r
+        }\r
+\r
+        private void RefreshGroupInfo()\r
+        {\r
+            lvwGeneralMembers.Items.Clear();\r
+            cbxActiveTitle.Items.Clear();\r
+\r
+            // Request group info\r
+            client.Groups.RequestGroupProfile(group.ID);\r
+            groupTitlesRequest = client.Groups.RequestGroupTitles(group.ID);\r
+            groupMembersRequest = client.Groups.RequestGroupMembers(group.ID);\r
+        }\r
+\r
+        #region Network callbacks\r
+        void Groups_OnGroupProfile(Group group)\r
+        {\r
+            if (group.ID != this.group.ID) return;\r
+\r
+            if (InvokeRequired)\r
+            {\r
+                BeginInvoke(new MethodInvoker(delegate()\r
+                    {\r
+                        Groups_OnGroupProfile(group);\r
+                    }\r
+                ));\r
+                return;\r
+            }\r
+\r
+            this.group = group;\r
+\r
+            tbxCharter.Text = group.Charter;\r
+            lblFounded.Text = "Founded by: " + instance.getAvatarName(group.FounderID);\r
+        }\r
+\r
+        void Avatars_OnAvatarNames(Dictionary<UUID, string> names)\r
+        {\r
+            if (InvokeRequired)\r
+            {\r
+                BeginInvoke(new MethodInvoker(delegate()\r
+                    {\r
+                        Avatars_OnAvatarNames(names);\r
+                    }\r
+                ));\r
+                return;\r
+            }\r
+\r
+            if (names.ContainsKey(group.FounderID))\r
+            {\r
+                lblFounded.Text = "Founded by: " + names[group.FounderID];\r
+            }\r
+\r
+            lvwGeneralMembers.BeginUpdate();\r
+            bool modified = false;\r
+            foreach (KeyValuePair<UUID, string> name in names)\r
+            {\r
+                if (lvwGeneralMembers.Items.ContainsKey(name.Key.ToString()))\r
+                {\r
+                    lvwGeneralMembers.Items[name.Key.ToString()].Text = name.Value;\r
+                    modified = true;\r
+                }\r
+            }\r
+            if (modified)\r
+                lvwGeneralMembers.Sort();\r
+            lvwGeneralMembers.EndUpdate();\r
+        }\r
+\r
+        void Groups_OnGroupTitles(UUID requestID, UUID groupID, Dictionary<UUID, GroupTitle> titles)\r
+        {\r
+            if (groupTitlesRequest != requestID) return;\r
+            Dictionary<UUID, GroupTitle> t = titles;\r
+        }\r
+\r
+        void Groups_OnGroupMembers(UUID requestID, UUID groupID, Dictionary<UUID, GroupMember> members)\r
+        {\r
+            if (groupMembersRequest != requestID) return;\r
+\r
+            if (InvokeRequired)\r
+            {\r
+                BeginInvoke(new MethodInvoker(delegate()\r
+                    {\r
+                        Groups_OnGroupMembers(requestID, groupID, members);\r
+                    }\r
+                ));\r
+                return;\r
+            }\r
+\r
+            lvwGeneralMembers.BeginUpdate();\r
+            List<ListViewItem> newItems = new List<ListViewItem>();\r
+            List<UUID> unknownNames = new List<UUID>();\r
+\r
+            foreach (GroupMember member in members.Values)\r
+            {\r
+                string name;\r
+                \r
+                if (instance.haveAvatarName(member.ID))\r
+                {\r
+                    name = instance.getAvatarName(member.ID);\r
+                }\r
+                else\r
+                {\r
+                    name = "Loading...";\r
+                    unknownNames.Add(member.ID);\r
+                }\r
+\r
+                ListViewItem item = new ListViewItem(name);\r
+                item.Tag = member;\r
+                item.Name = member.ID.ToString();\r
+                item.SubItems.Add(new ListViewItem.ListViewSubItem(item, member.Title));\r
+                item.SubItems.Add(new ListViewItem.ListViewSubItem(item, member.OnlineStatus));\r
+\r
+                newItems.Add(item);\r
+            }\r
+\r
+            if (unknownNames.Count > 0)\r
+            {\r
+                instance.getAvatarNames(unknownNames);\r
+            }\r
+\r
+            lvwGeneralMembers.Items.AddRange(newItems.ToArray());\r
+            lvwGeneralMembers.Sort();\r
+            lvwGeneralMembers.EndUpdate();\r
+        }\r
+        #endregion\r
+\r
+        private void btnRefresh_Click(object sender, EventArgs e)\r
+        {\r
+            RefreshGroupInfo();\r
+        }\r
+\r
+        void lvwGeneralMembers_ColumnClick(object sender, ColumnClickEventArgs e)\r
+        {\r
+            GroupMemberSorter sorter = (GroupMemberSorter)lvwGeneralMembers.ListViewItemSorter;\r
+            switch (e.Column)\r
+            {\r
+                case 0:\r
+                    sorter.SortBy = GroupMemberSorter.SortByColumn.Name;\r
+                    break;\r
+\r
+                case 1:\r
+                    sorter.SortBy = GroupMemberSorter.SortByColumn.Title;\r
+                    break;\r
+\r
+                case 2:\r
+                    sorter.SortBy = GroupMemberSorter.SortByColumn.LastOnline;\r
+                    break;\r
+            }\r
+\r
+            if (sorter.CurrentOrder == GroupMemberSorter.SortOrder.Ascending)\r
+                sorter.CurrentOrder = GroupMemberSorter.SortOrder.Descending;\r
+            else\r
+                sorter.CurrentOrder = GroupMemberSorter.SortOrder.Ascending;\r
+\r
+            lvwGeneralMembers.Sort();\r
+        }\r
+    }\r
+\r
+    public class GroupMemberSorter : IComparer\r
+    {\r
+        public enum SortByColumn\r
+        {\r
+            Name,\r
+            Title,\r
+            LastOnline\r
+        }\r
+\r
+        public enum SortOrder\r
+        {\r
+            Ascending,\r
+            Descending\r
+        }\r
+\r
+        public SortOrder CurrentOrder = SortOrder.Ascending;\r
+        public SortByColumn SortBy = SortByColumn.Name;\r
+\r
+        public GroupMemberSorter()\r
+        {\r
+        }\r
+\r
+        public int Compare(object x, object y)\r
+        {\r
+            ListViewItem item1 = (ListViewItem)x;\r
+            ListViewItem item2 = (ListViewItem)y;\r
+            GroupMember member1 = (GroupMember)item1.Tag;\r
+            GroupMember member2 = (GroupMember)item2.Tag;\r
+\r
+            switch (SortBy)\r
+            {\r
+                case SortByColumn.Name:\r
+                    if (CurrentOrder == SortOrder.Ascending)\r
+                        return string.Compare(item1.Text, item2.Text);\r
+                    else\r
+                        return string.Compare(item2.Text, item1.Text);\r
+\r
+                case SortByColumn.Title:\r
+                    if (CurrentOrder == SortOrder.Ascending)\r
+                        return string.Compare(member1.Title, member2.Title);\r
+                    else\r
+                        return string.Compare(member2.Title, member1.Title);\r
+\r
+                case SortByColumn.LastOnline:\r
+                    DateTime t1;\r
+                    if (member1.OnlineStatus == "Online")\r
+                    {\r
+                        t1 = DateTime.Now;\r
+                    }\r
+                    else\r
+                    {\r
+                        t1 = Convert.ToDateTime(member1.OnlineStatus, Utils.EnUsCulture);\r
+                    }\r
+\r
+                    DateTime t2;\r
+                    if (member2.OnlineStatus == "Online")\r
+                    {\r
+                        t2 = DateTime.Now;\r
+                    }\r
+                    else\r
+                    {\r
+                        t2 = Convert.ToDateTime(member2.OnlineStatus, Utils.EnUsCulture);\r
+                    }\r
+\r
+                    if (CurrentOrder == SortOrder.Ascending)\r
+                        return DateTime.Compare(t1, t2);\r
+                    else\r
+                        return DateTime.Compare(t2, t1);\r
+            }\r
+\r
+            return 0;\r
         }\r
     }\r
 }\r