OSDN Git Service

RAD-79 (progress) Added resident picker for group invitations
authorLatif Khalifa <latifer@streamgrid.net>
Thu, 11 Mar 2010 14:29:38 +0000 (14:29 +0000)
committerLatif Khalifa <latifer@streamgrid.net>
Thu, 11 Mar 2010 14:29:38 +0000 (14:29 +0000)
git-svn-id: https://radegast.googlecode.com/svn/trunk@492 f7a694da-4d33-11de-9ad6-1127a62b9fcd

Radegast/GUI/Consoles/AvatarPicker.Designer.cs [new file with mode: 0644]
Radegast/GUI/Consoles/AvatarPicker.cs [new file with mode: 0644]
Radegast/GUI/Consoles/AvatarPicker.resx [new file with mode: 0644]
Radegast/GUI/Consoles/GroupDetails.Designer.cs
Radegast/GUI/Consoles/GroupDetails.cs
Radegast/GUI/Dialogs/GroupInfo.cs
Radegast/GUI/Dialogs/GroupInvite.Designer.cs [new file with mode: 0644]
Radegast/GUI/Dialogs/GroupInvite.cs [new file with mode: 0644]
Radegast/GUI/Dialogs/GroupInvite.resx [new file with mode: 0644]
Radegast/Radegast.csproj

diff --git a/Radegast/GUI/Consoles/AvatarPicker.Designer.cs b/Radegast/GUI/Consoles/AvatarPicker.Designer.cs
new file mode 100644 (file)
index 0000000..8fccb88
--- /dev/null
@@ -0,0 +1,220 @@
+// \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$\r
+//\r
+\r
+namespace Radegast\r
+{\r
+    partial class AvatarPicker\r
+    {\r
+        /// <summary> \r
+        /// Required designer variable.\r
+        /// </summary>\r
+        private System.ComponentModel.IContainer components = null;\r
+\r
+        /// <summary> \r
+        /// Clean up any resources being used.\r
+        /// </summary>\r
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>\r
+        protected override void Dispose(bool disposing)\r
+        {\r
+            if (disposing && (components != null))\r
+            {\r
+                components.Dispose();\r
+            }\r
+            base.Dispose(disposing);\r
+        }\r
+\r
+        #region Component Designer generated code\r
+\r
+        /// <summary> \r
+        /// Required method for Designer support - do not modify \r
+        /// the contents of this method with the code editor.\r
+        /// </summary>\r
+        private void InitializeComponent()\r
+        {\r
+            this.tcPicker = new System.Windows.Forms.TabControl();\r
+            this.tpSearch = new System.Windows.Forms.TabPage();\r
+            this.lvwSearch = new System.Windows.Forms.ListView();\r
+            this.pnlSearch = new System.Windows.Forms.Panel();\r
+            this.label1 = new System.Windows.Forms.Label();\r
+            this.btnSearch = new System.Windows.Forms.Button();\r
+            this.txtSearch = new System.Windows.Forms.TextBox();\r
+            this.tpNear = new System.Windows.Forms.TabPage();\r
+            this.lvwNear = new System.Windows.Forms.ListView();\r
+            this.columnHeader1 = new System.Windows.Forms.ColumnHeader();\r
+            this.columnHeader2 = new System.Windows.Forms.ColumnHeader();\r
+            this.tcPicker.SuspendLayout();\r
+            this.tpSearch.SuspendLayout();\r
+            this.pnlSearch.SuspendLayout();\r
+            this.tpNear.SuspendLayout();\r
+            this.SuspendLayout();\r
+            // \r
+            // tcPicker\r
+            // \r
+            this.tcPicker.Controls.Add(this.tpSearch);\r
+            this.tcPicker.Controls.Add(this.tpNear);\r
+            this.tcPicker.Dock = System.Windows.Forms.DockStyle.Fill;\r
+            this.tcPicker.Location = new System.Drawing.Point(0, 0);\r
+            this.tcPicker.Name = "tcPicker";\r
+            this.tcPicker.SelectedIndex = 0;\r
+            this.tcPicker.Size = new System.Drawing.Size(259, 296);\r
+            this.tcPicker.TabIndex = 0;\r
+            // \r
+            // tpSearch\r
+            // \r
+            this.tpSearch.Controls.Add(this.lvwSearch);\r
+            this.tpSearch.Controls.Add(this.pnlSearch);\r
+            this.tpSearch.Location = new System.Drawing.Point(4, 22);\r
+            this.tpSearch.Name = "tpSearch";\r
+            this.tpSearch.Padding = new System.Windows.Forms.Padding(3);\r
+            this.tpSearch.Size = new System.Drawing.Size(251, 270);\r
+            this.tpSearch.TabIndex = 0;\r
+            this.tpSearch.Text = "Search";\r
+            this.tpSearch.UseVisualStyleBackColor = true;\r
+            // \r
+            // lvwSearch\r
+            // \r
+            this.lvwSearch.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\r
+            this.columnHeader1});\r
+            this.lvwSearch.Dock = System.Windows.Forms.DockStyle.Fill;\r
+            this.lvwSearch.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;\r
+            this.lvwSearch.HideSelection = false;\r
+            this.lvwSearch.Location = new System.Drawing.Point(3, 57);\r
+            this.lvwSearch.Name = "lvwSearch";\r
+            this.lvwSearch.Size = new System.Drawing.Size(245, 210);\r
+            this.lvwSearch.TabIndex = 2;\r
+            this.lvwSearch.UseCompatibleStateImageBehavior = false;\r
+            this.lvwSearch.View = System.Windows.Forms.View.Details;\r
+            this.lvwSearch.SelectedIndexChanged += new System.EventHandler(this.lvwSearch_SelectedIndexChanged);\r
+            this.lvwSearch.SizeChanged += new System.EventHandler(this.lvwSearch_SizeChanged);\r
+            // \r
+            // pnlSearch\r
+            // \r
+            this.pnlSearch.Controls.Add(this.label1);\r
+            this.pnlSearch.Controls.Add(this.btnSearch);\r
+            this.pnlSearch.Controls.Add(this.txtSearch);\r
+            this.pnlSearch.Dock = System.Windows.Forms.DockStyle.Top;\r
+            this.pnlSearch.Location = new System.Drawing.Point(3, 3);\r
+            this.pnlSearch.Name = "pnlSearch";\r
+            this.pnlSearch.Size = new System.Drawing.Size(245, 54);\r
+            this.pnlSearch.TabIndex = 0;\r
+            // \r
+            // label1\r
+            // \r
+            this.label1.AutoSize = true;\r
+            this.label1.Location = new System.Drawing.Point(3, 6);\r
+            this.label1.Name = "label1";\r
+            this.label1.Size = new System.Drawing.Size(141, 13);\r
+            this.label1.TabIndex = 2;\r
+            this.label1.Text = "Type part of residents name:";\r
+            // \r
+            // btnSearch\r
+            // \r
+            this.btnSearch.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r
+            this.btnSearch.Enabled = false;\r
+            this.btnSearch.Location = new System.Drawing.Point(167, 25);\r
+            this.btnSearch.Name = "btnSearch";\r
+            this.btnSearch.Size = new System.Drawing.Size(75, 23);\r
+            this.btnSearch.TabIndex = 1;\r
+            this.btnSearch.Text = "&Search";\r
+            this.btnSearch.UseVisualStyleBackColor = true;\r
+            this.btnSearch.Click += new System.EventHandler(this.btnSearch_Click);\r
+            // \r
+            // txtSearch\r
+            // \r
+            this.txtSearch.AccessibleName = "Search";\r
+            this.txtSearch.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)\r
+                        | System.Windows.Forms.AnchorStyles.Right)));\r
+            this.txtSearch.Location = new System.Drawing.Point(3, 25);\r
+            this.txtSearch.Name = "txtSearch";\r
+            this.txtSearch.Size = new System.Drawing.Size(143, 20);\r
+            this.txtSearch.TabIndex = 0;\r
+            this.txtSearch.TextChanged += new System.EventHandler(this.txtSearch_TextChanged);\r
+            this.txtSearch.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtSearch_KeyDown);\r
+            // \r
+            // tpNear\r
+            // \r
+            this.tpNear.Controls.Add(this.lvwNear);\r
+            this.tpNear.Location = new System.Drawing.Point(4, 22);\r
+            this.tpNear.Name = "tpNear";\r
+            this.tpNear.Padding = new System.Windows.Forms.Padding(3);\r
+            this.tpNear.Size = new System.Drawing.Size(251, 270);\r
+            this.tpNear.TabIndex = 1;\r
+            this.tpNear.Text = "Near Me";\r
+            this.tpNear.UseVisualStyleBackColor = true;\r
+            // \r
+            // lvwNear\r
+            // \r
+            this.lvwNear.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\r
+            this.columnHeader2});\r
+            this.lvwNear.Dock = System.Windows.Forms.DockStyle.Fill;\r
+            this.lvwNear.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;\r
+            this.lvwNear.HideSelection = false;\r
+            this.lvwNear.Location = new System.Drawing.Point(3, 3);\r
+            this.lvwNear.Name = "lvwNear";\r
+            this.lvwNear.Size = new System.Drawing.Size(245, 264);\r
+            this.lvwNear.TabIndex = 1;\r
+            this.lvwNear.UseCompatibleStateImageBehavior = false;\r
+            this.lvwNear.View = System.Windows.Forms.View.Details;\r
+            this.lvwNear.SelectedIndexChanged += new System.EventHandler(this.lvwNear_SelectedIndexChanged);\r
+            this.lvwNear.SizeChanged += new System.EventHandler(this.lvwSearch_SizeChanged);\r
+            // \r
+            // AvatarPicker\r
+            // \r
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\r
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r
+            this.Controls.Add(this.tcPicker);\r
+            this.Name = "AvatarPicker";\r
+            this.Size = new System.Drawing.Size(259, 296);\r
+            this.tcPicker.ResumeLayout(false);\r
+            this.tpSearch.ResumeLayout(false);\r
+            this.pnlSearch.ResumeLayout(false);\r
+            this.pnlSearch.PerformLayout();\r
+            this.tpNear.ResumeLayout(false);\r
+            this.ResumeLayout(false);\r
+\r
+        }\r
+\r
+        #endregion\r
+\r
+        public System.Windows.Forms.TabControl tcPicker;\r
+        public System.Windows.Forms.TabPage tpSearch;\r
+        public System.Windows.Forms.TabPage tpNear;\r
+        public System.Windows.Forms.ListView lvwSearch;\r
+        public System.Windows.Forms.ListView lvwNear;\r
+        public System.Windows.Forms.Panel pnlSearch;\r
+        public System.Windows.Forms.Label label1;\r
+        public System.Windows.Forms.Button btnSearch;\r
+        public System.Windows.Forms.TextBox txtSearch;\r
+        private System.Windows.Forms.ColumnHeader columnHeader1;\r
+        private System.Windows.Forms.ColumnHeader columnHeader2;\r
+\r
+    }\r
+}\r
diff --git a/Radegast/GUI/Consoles/AvatarPicker.cs b/Radegast/GUI/Consoles/AvatarPicker.cs
new file mode 100644 (file)
index 0000000..beaacac
--- /dev/null
@@ -0,0 +1,149 @@
+// \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$\r
+//\r
+\r
+using System;\r
+using System.Collections.Generic;\r
+using System.ComponentModel;\r
+using System.Drawing;\r
+using System.Data;\r
+using System.Linq;\r
+using System.Text;\r
+using System.Windows.Forms;\r
+using OpenMetaverse;\r
+\r
+namespace Radegast\r
+{\r
+    public partial class AvatarPicker : UserControl\r
+    {\r
+        RadegastInstance instance;\r
+        GridClient client { get { return instance.Client; } }\r
+        UUID searchID;\r
+        public ListView currentList;\r
+\r
+        [Browsable(true)]\r
+        public event EventHandler SelectionChaged;\r
+\r
+        [Browsable(false)]\r
+        public Dictionary<UUID, string> SelectedAvatars\r
+        {\r
+            get\r
+            {\r
+                Dictionary<UUID, string> res = new Dictionary<UUID,string>();\r
+                if (currentList != null)\r
+                {\r
+                    foreach (ListViewItem item in currentList.SelectedItems)\r
+                    {\r
+                        res.Add((UUID)item.Tag, item.Text);\r
+                    }\r
+                }\r
+                return res;\r
+            }\r
+        }\r
+\r
+        public AvatarPicker() { }\r
+\r
+        public AvatarPicker(RadegastInstance instance)\r
+        {\r
+            InitializeComponent();\r
+            Disposed += new EventHandler(AvatarPicker_Disposed);\r
+            \r
+            this.instance = instance;\r
+\r
+            // events\r
+            client.Avatars.AvatarPickerReply += new EventHandler<AvatarPickerReplyEventArgs>(Avatars_AvatarPickerReply);\r
+        }\r
+\r
+        void AvatarPicker_Disposed(object sender, EventArgs e)\r
+        {\r
+            client.Avatars.AvatarPickerReply -= new EventHandler<AvatarPickerReplyEventArgs>(Avatars_AvatarPickerReply);\r
+        }\r
+\r
+        void Avatars_AvatarPickerReply(object sender, AvatarPickerReplyEventArgs e)\r
+        {\r
+            if (searchID == e.QueryID && e.Avatars.Count > 0)\r
+            {\r
+                BeginInvoke(new MethodInvoker(() =>\r
+                    {\r
+                        foreach (KeyValuePair<UUID, string> kvp in e.Avatars)\r
+                        {\r
+                            lvwSearch.Items.Add(new ListViewItem(kvp.Value) { Text = kvp.Value, Tag = kvp.Key });\r
+                        }\r
+                    }));\r
+            }\r
+        }\r
+\r
+        private void btnSearch_Click(object sender, EventArgs e)\r
+        {\r
+            if (txtSearch.Text.Length > 2)\r
+            {\r
+                searchID = UUID.Random();\r
+                lvwSearch.Items.Clear();\r
+                client.Avatars.RequestAvatarNameSearch(txtSearch.Text, searchID);\r
+            }\r
+        }\r
+\r
+        private void txtSearch_TextChanged(object sender, EventArgs e)\r
+        {\r
+            btnSearch.Enabled = txtSearch.Text.Length > 2;\r
+        }\r
+\r
+        private void lvwNear_SelectedIndexChanged(object sender, EventArgs e)\r
+        {\r
+            currentList = lvwNear;\r
+            if (SelectionChaged != null)\r
+                SelectionChaged(this, EventArgs.Empty);\r
+        }\r
+\r
+        private void lvwSearch_SelectedIndexChanged(object sender, EventArgs e)\r
+        {\r
+            currentList = lvwSearch;\r
+            if (SelectionChaged != null)\r
+                SelectionChaged(this, EventArgs.Empty);\r
+        }\r
+\r
+        private void lvwSearch_SizeChanged(object sender, EventArgs e)\r
+        {\r
+            ListView view = (ListView)sender;\r
+            view.Columns[0].Width = view.Width - 30;\r
+        }\r
+\r
+        private void txtSearch_KeyDown(object sender, KeyEventArgs e)\r
+        {\r
+            if (e.KeyCode == Keys.Enter)\r
+            {\r
+                e.SuppressKeyPress = e.Handled = true;\r
+                if (btnSearch.Enabled)\r
+                    btnSearch.PerformClick();\r
+            }\r
+        }\r
+\r
+    }\r
+}\r
diff --git a/Radegast/GUI/Consoles/AvatarPicker.resx b/Radegast/GUI/Consoles/AvatarPicker.resx
new file mode 100644 (file)
index 0000000..ff31a6d
--- /dev/null
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<root>\r
+  <!-- \r
+    Microsoft ResX Schema \r
+    \r
+    Version 2.0\r
+    \r
+    The primary goals of this format is to allow a simple XML format \r
+    that is mostly human readable. The generation and parsing of the \r
+    various data types are done through the TypeConverter classes \r
+    associated with the data types.\r
+    \r
+    Example:\r
+    \r
+    ... ado.net/XML headers & schema ...\r
+    <resheader name="resmimetype">text/microsoft-resx</resheader>\r
+    <resheader name="version">2.0</resheader>\r
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>\r
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>\r
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">\r
+        <value>[base64 mime encoded serialized .NET Framework object]</value>\r
+    </data>\r
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r
+        <comment>This is a comment</comment>\r
+    </data>\r
+                \r
+    There are any number of "resheader" rows that contain simple \r
+    name/value pairs.\r
+    \r
+    Each data row contains a name, and value. The row also contains a \r
+    type or mimetype. Type corresponds to a .NET class that support \r
+    text/value conversion through the TypeConverter architecture. \r
+    Classes that don't support this are serialized and stored with the \r
+    mimetype set.\r
+    \r
+    The mimetype is used for serialized objects, and tells the \r
+    ResXResourceReader how to depersist the object. This is currently not \r
+    extensible. For a given mimetype the value must be set accordingly:\r
+    \r
+    Note - application/x-microsoft.net.object.binary.base64 is the format \r
+    that the ResXResourceWriter will generate, however the reader can \r
+    read any of the formats listed below.\r
+    \r
+    mimetype: application/x-microsoft.net.object.binary.base64\r
+    value   : The object must be serialized with \r
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r
+            : and then encoded with base64 encoding.\r
+    \r
+    mimetype: application/x-microsoft.net.object.soap.base64\r
+    value   : The object must be serialized with \r
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r
+            : and then encoded with base64 encoding.\r
+\r
+    mimetype: application/x-microsoft.net.object.bytearray.base64\r
+    value   : The object must be serialized into a byte array \r
+            : using a System.ComponentModel.TypeConverter\r
+            : and then encoded with base64 encoding.\r
+    -->\r
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">\r
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />\r
+    <xsd:element name="root" msdata:IsDataSet="true">\r
+      <xsd:complexType>\r
+        <xsd:choice maxOccurs="unbounded">\r
+          <xsd:element name="metadata">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" use="required" type="xsd:string" />\r
+              <xsd:attribute name="type" type="xsd:string" />\r
+              <xsd:attribute name="mimetype" type="xsd:string" />\r
+              <xsd:attribute ref="xml:space" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="assembly">\r
+            <xsd:complexType>\r
+              <xsd:attribute name="alias" type="xsd:string" />\r
+              <xsd:attribute name="name" type="xsd:string" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="data">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />\r
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />\r
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />\r
+              <xsd:attribute ref="xml:space" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="resheader">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" type="xsd:string" use="required" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+        </xsd:choice>\r
+      </xsd:complexType>\r
+    </xsd:element>\r
+  </xsd:schema>\r
+  <resheader name="resmimetype">\r
+    <value>text/microsoft-resx</value>\r
+  </resheader>\r
+  <resheader name="version">\r
+    <value>2.0</value>\r
+  </resheader>\r
+  <resheader name="reader">\r
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </resheader>\r
+  <resheader name="writer">\r
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </resheader>\r
+</root>
\ No newline at end of file
index a3b0098..7b944da 100644 (file)
@@ -515,6 +515,7 @@ namespace Radegast
             this.btnInviteNewMember.TabIndex = 11;\r
             this.btnInviteNewMember.Text = "Invite New Member...";\r
             this.btnInviteNewMember.UseVisualStyleBackColor = true;\r
+            this.btnInviteNewMember.Click += new System.EventHandler(this.btnInviteNewMember_Click);\r
             // \r
             // btnEjectMember\r
             // \r
index 8dc8be2..a20911e 100644 (file)
@@ -829,6 +829,11 @@ namespace Radegast
                     break;\r
             }\r
         }\r
+\r
+        private void btnInviteNewMember_Click(object sender, EventArgs e)\r
+        {\r
+            (new GroupInvite(instance, group, roles)).Show();\r
+        }\r
     }\r
 \r
     public class EnhancedGroupMember\r
index 1bf86db..ca11b69 100644 (file)
@@ -68,12 +68,13 @@ namespace Radegast
         {\r
             ((Radegast.Netcom.RadegastNetcom)sender).ClientDisconnected -= new System.EventHandler<DisconnectedEventArgs>(Netcom_ClientDisconnected);\r
 \r
-            BeginInvoke(new MethodInvoker(() =>\r
-                {\r
-                    GroupDetails.Dispose();\r
-                    Close();\r
-                }\r
-            ));\r
+            if (IsHandleCreated)\r
+                BeginInvoke(new MethodInvoker(() =>\r
+                    {\r
+                        GroupDetails.Dispose();\r
+                        Close();\r
+                    }\r
+                ));\r
         }\r
     }\r
 }\r
diff --git a/Radegast/GUI/Dialogs/GroupInvite.Designer.cs b/Radegast/GUI/Dialogs/GroupInvite.Designer.cs
new file mode 100644 (file)
index 0000000..ac5bf08
--- /dev/null
@@ -0,0 +1,127 @@
+// \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$\r
+//\r
+namespace Radegast\r
+{\r
+    partial class GroupInvite\r
+    {\r
+        /// <summary>\r
+        /// Required designer variable.\r
+        /// </summary>\r
+        private System.ComponentModel.IContainer components = null;\r
+\r
+        /// <summary>\r
+        /// Clean up any resources being used.\r
+        /// </summary>\r
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>\r
+        protected override void Dispose(bool disposing)\r
+        {\r
+            if (disposing && (components != null))\r
+            {\r
+                components.Dispose();\r
+            }\r
+            base.Dispose(disposing);\r
+        }\r
+\r
+        #region Windows Form Designer generated code\r
+\r
+        /// <summary>\r
+        /// Required method for Designer support - do not modify\r
+        /// the contents of this method with the code editor.\r
+        /// </summary>\r
+        private void InitializeComponent()\r
+        {\r
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(GroupInvite));\r
+            this.pnlInvite = new System.Windows.Forms.Panel();\r
+            this.cmbRoles = new System.Windows.Forms.ComboBox();\r
+            this.btnIvite = new System.Windows.Forms.Button();\r
+            this.pnlInvite.SuspendLayout();\r
+            this.SuspendLayout();\r
+            // \r
+            // pnlInvite\r
+            // \r
+            this.pnlInvite.Controls.Add(this.btnIvite);\r
+            this.pnlInvite.Controls.Add(this.cmbRoles);\r
+            this.pnlInvite.Dock = System.Windows.Forms.DockStyle.Bottom;\r
+            this.pnlInvite.Location = new System.Drawing.Point(0, 338);\r
+            this.pnlInvite.Name = "pnlInvite";\r
+            this.pnlInvite.Size = new System.Drawing.Size(330, 31);\r
+            this.pnlInvite.TabIndex = 0;\r
+            // \r
+            // cmbRoles\r
+            // \r
+            this.cmbRoles.AccessibleName = "Roles";\r
+            this.cmbRoles.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)\r
+                        | System.Windows.Forms.AnchorStyles.Right)));\r
+            this.cmbRoles.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r
+            this.cmbRoles.FormattingEnabled = true;\r
+            this.cmbRoles.Location = new System.Drawing.Point(12, 5);\r
+            this.cmbRoles.Name = "cmbRoles";\r
+            this.cmbRoles.Size = new System.Drawing.Size(165, 21);\r
+            this.cmbRoles.TabIndex = 0;\r
+            // \r
+            // btnIvite\r
+            // \r
+            this.btnIvite.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r
+            this.btnIvite.Enabled = false;\r
+            this.btnIvite.Location = new System.Drawing.Point(201, 5);\r
+            this.btnIvite.Name = "btnIvite";\r
+            this.btnIvite.Size = new System.Drawing.Size(117, 23);\r
+            this.btnIvite.TabIndex = 1;\r
+            this.btnIvite.Text = "Send invtitations";\r
+            this.btnIvite.UseVisualStyleBackColor = true;\r
+            this.btnIvite.Click += new System.EventHandler(this.btnIvite_Click);\r
+            // \r
+            // GroupInvite\r
+            // \r
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\r
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r
+            this.ClientSize = new System.Drawing.Size(330, 369);\r
+            this.Controls.Add(this.pnlInvite);\r
+            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));\r
+            this.MaximizeBox = false;\r
+            this.MinimizeBox = false;\r
+            this.Name = "GroupInvite";\r
+            this.Text = "Select resident";\r
+            this.Load += new System.EventHandler(this.GroupInvite_Load);\r
+            this.pnlInvite.ResumeLayout(false);\r
+            this.ResumeLayout(false);\r
+\r
+        }\r
+\r
+        #endregion\r
+\r
+        private System.Windows.Forms.Panel pnlInvite;\r
+        private System.Windows.Forms.Button btnIvite;\r
+        private System.Windows.Forms.ComboBox cmbRoles;\r
+\r
+\r
+    }\r
+}
\ No newline at end of file
diff --git a/Radegast/GUI/Dialogs/GroupInvite.cs b/Radegast/GUI/Dialogs/GroupInvite.cs
new file mode 100644 (file)
index 0000000..4afce7e
--- /dev/null
@@ -0,0 +1,123 @@
+// \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$\r
+//\r
+using System;\r
+using System.Collections.Generic;\r
+using System.ComponentModel;\r
+using System.Data;\r
+using System.Drawing;\r
+using System.Linq;\r
+using System.Text;\r
+using System.Windows.Forms;\r
+using OpenMetaverse;\r
+\r
+namespace Radegast\r
+{\r
+    public partial class GroupInvite : RadegastForm\r
+    {\r
+        AvatarPicker picker;\r
+        RadegastInstance instance;\r
+        Netcom.RadegastNetcom netcom;\r
+\r
+        Group group;\r
+        Dictionary<UUID, GroupRole> roles;\r
+\r
+        public GroupInvite(RadegastInstance instance, Group group, Dictionary<UUID, GroupRole> roles)\r
+            :base(instance)\r
+        {\r
+            InitializeComponent();\r
+            Disposed += new EventHandler(GroupInvite_Disposed);\r
+            AutoSavePosition = true;\r
+\r
+            this.instance = instance;\r
+            this.roles = roles;\r
+            this.group = group;\r
+            this.netcom = instance.Netcom;\r
+\r
+            picker = new AvatarPicker(instance) { Dock = DockStyle.Fill };\r
+            Controls.Add(picker);\r
+            picker.SelectionChaged += new EventHandler(picker_SelectionChaged);\r
+            picker.BringToFront();\r
+            \r
+            netcom.ClientDisconnected += new EventHandler<DisconnectedEventArgs>(Netcom_ClientDisconnected);\r
+\r
+            cmbRoles.Items.Add(roles[UUID.Zero]);\r
+            cmbRoles.SelectedIndex = 0;\r
+\r
+            foreach (KeyValuePair<UUID, GroupRole> role in roles)\r
+                if (role.Key != UUID.Zero)\r
+                    cmbRoles.Items.Add(role.Value);\r
+        }\r
+\r
+        void picker_SelectionChaged(object sender, EventArgs e)\r
+        {\r
+            btnIvite.Enabled = picker.SelectedAvatars.Count > 0;\r
+        }\r
+\r
+        void GroupInvite_Disposed(object sender, EventArgs e)\r
+        {\r
+            netcom.ClientDisconnected -= new EventHandler<DisconnectedEventArgs>(Netcom_ClientDisconnected);\r
+            netcom = null;\r
+            instance = null;\r
+            picker.Dispose();\r
+            Logger.DebugLog("Group picker disposed");\r
+        }\r
+\r
+        void Netcom_ClientDisconnected(object sender, OpenMetaverse.DisconnectedEventArgs e)\r
+        {\r
+            ((Radegast.Netcom.RadegastNetcom)sender).ClientDisconnected -= new EventHandler<DisconnectedEventArgs>(Netcom_ClientDisconnected);\r
+\r
+            if (IsHandleCreated)\r
+                BeginInvoke(new MethodInvoker(() =>\r
+                {\r
+                    Close();\r
+                }\r
+                ));\r
+        }\r
+\r
+\r
+        private void GroupInvite_Load(object sender, EventArgs e)\r
+        {\r
+            picker.txtSearch.Focus();\r
+        }\r
+\r
+        private void btnIvite_Click(object sender, EventArgs e)\r
+        {\r
+            List<UUID> roleID = new List<UUID>();\r
+            roleID.Add(((GroupRole)cmbRoles.SelectedItem).ID);\r
+\r
+            foreach (UUID key in picker.SelectedAvatars.Keys)\r
+            {\r
+                instance.Client.Groups.Invite(group.ID, roleID, key);\r
+            }\r
+            Close();\r
+        }\r
+    }\r
+}\r
diff --git a/Radegast/GUI/Dialogs/GroupInvite.resx b/Radegast/GUI/Dialogs/GroupInvite.resx
new file mode 100644 (file)
index 0000000..0e98e27
--- /dev/null
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<root>\r
+  <!-- \r
+    Microsoft ResX Schema \r
+    \r
+    Version 2.0\r
+    \r
+    The primary goals of this format is to allow a simple XML format \r
+    that is mostly human readable. The generation and parsing of the \r
+    various data types are done through the TypeConverter classes \r
+    associated with the data types.\r
+    \r
+    Example:\r
+    \r
+    ... ado.net/XML headers & schema ...\r
+    <resheader name="resmimetype">text/microsoft-resx</resheader>\r
+    <resheader name="version">2.0</resheader>\r
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>\r
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>\r
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">\r
+        <value>[base64 mime encoded serialized .NET Framework object]</value>\r
+    </data>\r
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r
+        <comment>This is a comment</comment>\r
+    </data>\r
+                \r
+    There are any number of "resheader" rows that contain simple \r
+    name/value pairs.\r
+    \r
+    Each data row contains a name, and value. The row also contains a \r
+    type or mimetype. Type corresponds to a .NET class that support \r
+    text/value conversion through the TypeConverter architecture. \r
+    Classes that don't support this are serialized and stored with the \r
+    mimetype set.\r
+    \r
+    The mimetype is used for serialized objects, and tells the \r
+    ResXResourceReader how to depersist the object. This is currently not \r
+    extensible. For a given mimetype the value must be set accordingly:\r
+    \r
+    Note - application/x-microsoft.net.object.binary.base64 is the format \r
+    that the ResXResourceWriter will generate, however the reader can \r
+    read any of the formats listed below.\r
+    \r
+    mimetype: application/x-microsoft.net.object.binary.base64\r
+    value   : The object must be serialized with \r
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r
+            : and then encoded with base64 encoding.\r
+    \r
+    mimetype: application/x-microsoft.net.object.soap.base64\r
+    value   : The object must be serialized with \r
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r
+            : and then encoded with base64 encoding.\r
+\r
+    mimetype: application/x-microsoft.net.object.bytearray.base64\r
+    value   : The object must be serialized into a byte array \r
+            : using a System.ComponentModel.TypeConverter\r
+            : and then encoded with base64 encoding.\r
+    -->\r
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">\r
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />\r
+    <xsd:element name="root" msdata:IsDataSet="true">\r
+      <xsd:complexType>\r
+        <xsd:choice maxOccurs="unbounded">\r
+          <xsd:element name="metadata">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" use="required" type="xsd:string" />\r
+              <xsd:attribute name="type" type="xsd:string" />\r
+              <xsd:attribute name="mimetype" type="xsd:string" />\r
+              <xsd:attribute ref="xml:space" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="assembly">\r
+            <xsd:complexType>\r
+              <xsd:attribute name="alias" type="xsd:string" />\r
+              <xsd:attribute name="name" type="xsd:string" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="data">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />\r
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />\r
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />\r
+              <xsd:attribute ref="xml:space" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="resheader">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" type="xsd:string" use="required" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+        </xsd:choice>\r
+      </xsd:complexType>\r
+    </xsd:element>\r
+  </xsd:schema>\r
+  <resheader name="resmimetype">\r
+    <value>text/microsoft-resx</value>\r
+  </resheader>\r
+  <resheader name="version">\r
+    <value>2.0</value>\r
+  </resheader>\r
+  <resheader name="reader">\r
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </resheader>\r
+  <resheader name="writer">\r
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </resheader>\r
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />\r
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+    <value>\r
+        AAABAAEAEBAAAAAAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA\r
+        AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA\r
+        AAEAAAABAAAAAQAAAAHCmW8HPUFD/ygrKwcAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAB/ceQ+f/I\r
+        kf89QUP9AAAAAQAAAAHuu4dX/8iR/z1BQ/89QUP/PUFD/z1BQ/84PD1BAAAAAeu5hkn/yJH//8iR///I\r
+        kf//yJH/PUFD/z1BQ/86PkCB/8iR///Ikf89QUP/PUFD/z1BQ/89QUP/PUFD/0VGRv//yJH//8iR///I\r
+        kf//yJH//8iR/z1BQ/89QUP/PUFD///Ikf//yJH/PUFD/z1BQ/89QUP/PUFD/z1BQ/9FRkb//8iR///I\r
+        kf//yJH//8iR///Ikf89QUP/PUFD/z1BQ///yJH//8iR/z1BQ/89QUP/PUFD/z1BQ/89QUP/RUZG///I\r
+        kf//yJH//8iR///Ikf//yJH/PUFD/z1BQ/89QUP//8iR///Ikf89QUP/PUFD/z1BQ/89QUP/PUFD/0VG\r
+        Rv//yJH//8iR///Ikf//yJH//8iR/z1BQ/89QUP/PUFD///Ikf//yJH/PUFD/z1BQ/89QUP/PUFD/z1B\r
+        Q/9FRkb//8iR///Ikf//yJH//8iR///Ikf89QUP/PUFD/z1BQ//3woyR98KMkTs/QZE7P0GROz9BkZF8\r
+        Zf+RfGX/knxl/6qNb/+qjW//qo1v//fCjJH3woyROz9BkTs/QZE7P0GRAAAAAQAAAAEAAAABAAAAAQAA\r
+        AAH/yJH//8iR//fCjv89QUP/PUFD/z1BQ/8AAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA\r
+        AAEAAAAB/8iR///Ikf/3wo7/PUFD/z1BQ/89QUP/AAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA\r
+        AAEAAAABAAAAAf/Ikf//yJH/98KO/z1BQ/89QUP/PUFD/wAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA\r
+        AAEAAAABAAAAAQAAAAH/yJH//8iR//fCjv89QUP/PUFD/z1BQ/8AAAABAAAAAQAAAAEAAAABAAAAAQAA\r
+        AAEAAAABAAAAAQAAAAEAAAABAAAAAf/Ikf/3wo7/PUFD/zs/Qa8AAAABAAAAAQAAAAEAAAABAAAAAQAA\r
+        AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA\r
+        AAEAAAABAAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA\r
+        //8AAP//AAD//w==\r
+</value>\r
+  </data>\r
+</root>
\ No newline at end of file
index 3a15387..207a6df 100644 (file)
     <Compile Include="GUI\Consoles\AttachmentTab.Designer.cs">\r
       <DependentUpon>AttachmentTab.cs</DependentUpon>\r
     </Compile>\r
+    <Compile Include="GUI\Consoles\AvatarPicker.cs">\r
+      <SubType>UserControl</SubType>\r
+    </Compile>\r
+    <Compile Include="GUI\Consoles\AvatarPicker.Designer.cs">\r
+      <DependentUpon>AvatarPicker.cs</DependentUpon>\r
+    </Compile>\r
     <Compile Include="GUI\Consoles\ConferenceIMTabWindow.cs">\r
       <SubType>UserControl</SubType>\r
     </Compile>\r
     <Compile Include="GUI\Dialogs\GroupInfo.Designer.cs">\r
       <DependentUpon>GroupInfo.cs</DependentUpon>\r
     </Compile>\r
+    <Compile Include="GUI\Dialogs\GroupInvite.cs">\r
+      <SubType>Form</SubType>\r
+    </Compile>\r
+    <Compile Include="GUI\Dialogs\GroupInvite.Designer.cs">\r
+      <DependentUpon>GroupInvite.cs</DependentUpon>\r
+    </Compile>\r
     <Compile Include="GUI\Dialogs\KeyboardShortcuts.cs">\r
       <SubType>Form</SubType>\r
     </Compile>\r
       <SubType>Designer</SubType>\r
       <DependentUpon>AttachmentTab.cs</DependentUpon>\r
     </EmbeddedResource>\r
+    <EmbeddedResource Include="GUI\Consoles\AvatarPicker.resx">\r
+      <DependentUpon>AvatarPicker.cs</DependentUpon>\r
+    </EmbeddedResource>\r
     <EmbeddedResource Include="GUI\Consoles\ChatConsole.resx">\r
       <SubType>Designer</SubType>\r
       <DependentUpon>ChatConsole.cs</DependentUpon>\r
       <DependentUpon>GroupInfo.cs</DependentUpon>\r
       <SubType>Designer</SubType>\r
     </EmbeddedResource>\r
+    <EmbeddedResource Include="GUI\Dialogs\GroupInvite.resx">\r
+      <DependentUpon>GroupInvite.cs</DependentUpon>\r
+    </EmbeddedResource>\r
     <EmbeddedResource Include="GUI\Dialogs\KeyboardShortcuts.resx">\r
       <DependentUpon>KeyboardShortcuts.cs</DependentUpon>\r
     </EmbeddedResource>\r