summaryrefslogtreecommitdiff
path: root/Client
diff options
context:
space:
mode:
authormarcinzelent <zelent.marcin@protonmail.com>2017-10-10 11:21:01 +0200
committermarcinzelent <zelent.marcin@protonmail.com>2017-10-10 11:21:01 +0200
commita7b4fc7be6dac8c4ff9ae7924eb499d7e2ac1453 (patch)
treea9a560ccfa0fb990ed766d1a1d225115c16ffa55 /Client
parent9ce162142924b6f3c8c977624ed2b2c1916f9be2 (diff)
Removed packages, added Client project properly.HEADmaster
Diffstat (limited to 'Client')
-rw-r--r--Client/Client.csproj61
-rw-r--r--Client/MainWindow.cs35
-rw-r--r--Client/Program.cs16
-rw-r--r--Client/Properties/AssemblyInfo.cs26
-rw-r--r--Client/TcpChatClient.cs69
-rw-r--r--Client/gtk-gui/MainWindow.cs179
-rw-r--r--Client/gtk-gui/generated.cs30
-rw-r--r--Client/gtk-gui/gui.stetic187
8 files changed, 603 insertions, 0 deletions
diff --git a/Client/Client.csproj b/Client/Client.csproj
new file mode 100644
index 0000000..f0d2993
--- /dev/null
+++ b/Client/Client.csproj
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <ProjectGuid>{73154F68-BBEB-48FC-86C4-BB4909C1C7B4}</ProjectGuid>
+ <OutputType>WinExe</OutputType>
+ <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+ <RootNamespace>Client</RootNamespace>
+ <AssemblyName>Client</AssemblyName>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\Debug</OutputPath>
+ <DefineConstants>DEBUG;</DefineConstants>
+ <WarningLevel>4</WarningLevel>
+ <PlatformTarget>x86</PlatformTarget>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release</OutputPath>
+ <WarningLevel>4</WarningLevel>
+ <PlatformTarget>x86</PlatformTarget>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="System" />
+ <Reference Include="gtk-sharp, Version=2.4.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">
+ <SpecificVersion>False</SpecificVersion>
+ </Reference>
+ <Reference Include="gdk-sharp, Version=2.4.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">
+ <SpecificVersion>False</SpecificVersion>
+ </Reference>
+ <Reference Include="glib-sharp, Version=2.4.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">
+ <SpecificVersion>False</SpecificVersion>
+ </Reference>
+ <Reference Include="glade-sharp, Version=2.4.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">
+ <SpecificVersion>False</SpecificVersion>
+ </Reference>
+ <Reference Include="pango-sharp, Version=2.4.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">
+ <SpecificVersion>False</SpecificVersion>
+ </Reference>
+ <Reference Include="atk-sharp, Version=2.4.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">
+ <SpecificVersion>False</SpecificVersion>
+ </Reference>
+ <Reference Include="Mono.Posix" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="gtk-gui\gui.stetic">
+ <LogicalName>gui.stetic</LogicalName>
+ </EmbeddedResource>
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="gtk-gui\generated.cs" />
+ <Compile Include="MainWindow.cs" />
+ <Compile Include="gtk-gui\MainWindow.cs" />
+ <Compile Include="Program.cs" />
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ <Compile Include="TcpChatClient.cs" />
+ </ItemGroup>
+ <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+</Project> \ No newline at end of file
diff --git a/Client/MainWindow.cs b/Client/MainWindow.cs
new file mode 100644
index 0000000..22564ac
--- /dev/null
+++ b/Client/MainWindow.cs
@@ -0,0 +1,35 @@
+using System;
+using Gtk;
+using Client;
+
+public partial class MainWindow : Gtk.Window
+{
+ TcpChatClient tcpChat;
+
+ public MainWindow() : base(Gtk.WindowType.Toplevel)
+ {
+ Build();
+ tcpChat = new TcpChatClient();
+ tcpChat.PropertyChanged += (sender, args) =>
+ outputTv.Buffer.Text = tcpChat.Log;
+ }
+
+ protected void OnDeleteEvent(object sender, DeleteEventArgs a)
+ {
+ Application.Quit();
+ a.RetVal = true;
+ }
+
+ protected async void Connect(object sender, EventArgs e)
+ {
+ await tcpChat.Connect(ipEntry.Text, Int32.Parse(portEntry.Text));
+ tcpChat.SendMessage($"{usernameEntry.Text} connected.");
+ }
+
+ protected void SendMessage(object sender, EventArgs e)
+ {
+ string message = $"{usernameEntry.Text}: {messageEntry.Text}";
+ tcpChat.SendMessage(message);
+ messageEntry.Text = "";
+ }
+}
diff --git a/Client/Program.cs b/Client/Program.cs
new file mode 100644
index 0000000..22bf2bb
--- /dev/null
+++ b/Client/Program.cs
@@ -0,0 +1,16 @@
+using System;
+using Gtk;
+
+namespace Client
+{
+ class MainClass
+ {
+ public static void Main(string[] args)
+ {
+ Application.Init();
+ MainWindow win = new MainWindow();
+ win.Show();
+ Application.Run();
+ }
+ }
+}
diff --git a/Client/Properties/AssemblyInfo.cs b/Client/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..7614f1a
--- /dev/null
+++ b/Client/Properties/AssemblyInfo.cs
@@ -0,0 +1,26 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+// Information about this assembly is defined by the following attributes.
+// Change them to the values specific to your project.
+
+[assembly: AssemblyTitle("Client")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("${AuthorCopyright}")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
+// The form "{Major}.{Minor}.*" will automatically update the build and revision,
+// and "{Major}.{Minor}.{Build}.*" will update just the revision.
+
+[assembly: AssemblyVersion("1.0.*")]
+
+// The following attributes are used to specify the signing key for the assembly,
+// if desired. See the Mono documentation for more information about signing.
+
+//[assembly: AssemblyDelaySign(false)]
+//[assembly: AssemblyKeyFile("")]
diff --git a/Client/TcpChatClient.cs b/Client/TcpChatClient.cs
new file mode 100644
index 0000000..e9d4b54
--- /dev/null
+++ b/Client/TcpChatClient.cs
@@ -0,0 +1,69 @@
+using System;
+using System.ComponentModel;
+using System.IO;
+using System.Net;
+using System.Net.Sockets;
+using System.Runtime.CompilerServices;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Client
+{
+ public class TcpChatClient : INotifyPropertyChanged
+ {
+ public int Port { get; set; }
+
+ private string log;
+ public string Log
+ {
+ get
+ {
+ return log;
+ }
+ set
+ {
+ log = value;
+ OnPropertyChanged();
+ }
+ }
+ public bool Status { get; set; }
+ private StreamReader sr;
+ private StreamWriter sw;
+
+ public TcpChatClient()
+ {
+ }
+
+ public async Task Connect(string ipAddress, int port)
+ {
+ TcpClient clientSocket = new TcpClient(ipAddress, port);
+ NetworkStream ns = clientSocket.GetStream();
+ sr = new StreamReader(ns);
+ sw = new StreamWriter(ns);
+ sw.AutoFlush = true;
+ Status = true;
+ await ReceiveMessageAsync();
+ }
+
+ public void SendMessage(string message)
+ {
+ sw.WriteLine(message);
+ }
+
+ private async Task ReceiveMessageAsync()
+ {
+ while (Status)
+ {
+ string message = await sr.ReadLineAsync();
+ Log += $"{message}\n";
+ }
+ }
+
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
+ {
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
+ }
+ }
+}
diff --git a/Client/gtk-gui/MainWindow.cs b/Client/gtk-gui/MainWindow.cs
new file mode 100644
index 0000000..f123796
--- /dev/null
+++ b/Client/gtk-gui/MainWindow.cs
@@ -0,0 +1,179 @@
+
+// This file has been generated by the GUI designer. Do not modify.
+
+public partial class MainWindow
+{
+ private global::Gtk.VBox vbox2;
+
+ private global::Gtk.HBox hbox2;
+
+ private global::Gtk.Label usernameLabel;
+
+ private global::Gtk.Entry usernameEntry;
+
+ private global::Gtk.Label ipLabel;
+
+ private global::Gtk.Entry ipEntry;
+
+ private global::Gtk.Label portLabel;
+
+ private global::Gtk.Entry portEntry;
+
+ private global::Gtk.Button connectButton;
+
+ private global::Gtk.ScrolledWindow GtkScrolledWindow;
+
+ private global::Gtk.TextView outputTv;
+
+ private global::Gtk.HBox hbox1;
+
+ private global::Gtk.Entry messageEntry;
+
+ private global::Gtk.Button sendButton;
+
+ protected virtual void Build()
+ {
+ global::Stetic.Gui.Initialize(this);
+ // Widget MainWindow
+ this.Name = "MainWindow";
+ this.Title = global::Mono.Unix.Catalog.GetString("TcpChat Client");
+ this.WindowPosition = ((global::Gtk.WindowPosition)(4));
+ this.BorderWidth = ((uint)(10));
+ // Container child MainWindow.Gtk.Container+ContainerChild
+ this.vbox2 = new global::Gtk.VBox();
+ this.vbox2.Name = "vbox2";
+ this.vbox2.Spacing = 6;
+ // Container child vbox2.Gtk.Box+BoxChild
+ this.hbox2 = new global::Gtk.HBox();
+ this.hbox2.Name = "hbox2";
+ this.hbox2.Spacing = 6;
+ // Container child hbox2.Gtk.Box+BoxChild
+ this.usernameLabel = new global::Gtk.Label();
+ this.usernameLabel.Name = "usernameLabel";
+ this.usernameLabel.LabelProp = global::Mono.Unix.Catalog.GetString("Username:");
+ this.hbox2.Add(this.usernameLabel);
+ global::Gtk.Box.BoxChild w1 = ((global::Gtk.Box.BoxChild)(this.hbox2[this.usernameLabel]));
+ w1.Position = 0;
+ w1.Expand = false;
+ w1.Fill = false;
+ // Container child hbox2.Gtk.Box+BoxChild
+ this.usernameEntry = new global::Gtk.Entry();
+ this.usernameEntry.CanFocus = true;
+ this.usernameEntry.Name = "usernameEntry";
+ this.usernameEntry.Text = global::Mono.Unix.Catalog.GetString("Marcin");
+ this.usernameEntry.IsEditable = true;
+ this.usernameEntry.InvisibleChar = '•';
+ this.hbox2.Add(this.usernameEntry);
+ global::Gtk.Box.BoxChild w2 = ((global::Gtk.Box.BoxChild)(this.hbox2[this.usernameEntry]));
+ w2.Position = 1;
+ // Container child hbox2.Gtk.Box+BoxChild
+ this.ipLabel = new global::Gtk.Label();
+ this.ipLabel.Name = "ipLabel";
+ this.ipLabel.LabelProp = global::Mono.Unix.Catalog.GetString("IP address:");
+ this.hbox2.Add(this.ipLabel);
+ global::Gtk.Box.BoxChild w3 = ((global::Gtk.Box.BoxChild)(this.hbox2[this.ipLabel]));
+ w3.Position = 2;
+ w3.Expand = false;
+ w3.Fill = false;
+ // Container child hbox2.Gtk.Box+BoxChild
+ this.ipEntry = new global::Gtk.Entry();
+ this.ipEntry.WidthRequest = 110;
+ this.ipEntry.CanFocus = true;
+ this.ipEntry.Name = "ipEntry";
+ this.ipEntry.Text = global::Mono.Unix.Catalog.GetString("127.0.0.1");
+ this.ipEntry.IsEditable = true;
+ this.ipEntry.InvisibleChar = '•';
+ this.hbox2.Add(this.ipEntry);
+ global::Gtk.Box.BoxChild w4 = ((global::Gtk.Box.BoxChild)(this.hbox2[this.ipEntry]));
+ w4.Position = 3;
+ // Container child hbox2.Gtk.Box+BoxChild
+ this.portLabel = new global::Gtk.Label();
+ this.portLabel.Name = "portLabel";
+ this.portLabel.LabelProp = global::Mono.Unix.Catalog.GetString("Port:");
+ this.hbox2.Add(this.portLabel);
+ global::Gtk.Box.BoxChild w5 = ((global::Gtk.Box.BoxChild)(this.hbox2[this.portLabel]));
+ w5.Position = 4;
+ w5.Expand = false;
+ w5.Fill = false;
+ // Container child hbox2.Gtk.Box+BoxChild
+ this.portEntry = new global::Gtk.Entry();
+ this.portEntry.WidthRequest = 50;
+ this.portEntry.CanFocus = true;
+ this.portEntry.Name = "portEntry";
+ this.portEntry.Text = global::Mono.Unix.Catalog.GetString("6789");
+ this.portEntry.IsEditable = true;
+ this.portEntry.InvisibleChar = '•';
+ this.hbox2.Add(this.portEntry);
+ global::Gtk.Box.BoxChild w6 = ((global::Gtk.Box.BoxChild)(this.hbox2[this.portEntry]));
+ w6.Position = 5;
+ // Container child hbox2.Gtk.Box+BoxChild
+ this.connectButton = new global::Gtk.Button();
+ this.connectButton.CanFocus = true;
+ this.connectButton.Name = "connectButton";
+ this.connectButton.UseUnderline = true;
+ this.connectButton.Label = global::Mono.Unix.Catalog.GetString("Connect");
+ this.hbox2.Add(this.connectButton);
+ global::Gtk.Box.BoxChild w7 = ((global::Gtk.Box.BoxChild)(this.hbox2[this.connectButton]));
+ w7.Position = 6;
+ w7.Expand = false;
+ w7.Fill = false;
+ this.vbox2.Add(this.hbox2);
+ global::Gtk.Box.BoxChild w8 = ((global::Gtk.Box.BoxChild)(this.vbox2[this.hbox2]));
+ w8.Position = 0;
+ w8.Expand = false;
+ w8.Fill = false;
+ // Container child vbox2.Gtk.Box+BoxChild
+ this.GtkScrolledWindow = new global::Gtk.ScrolledWindow();
+ this.GtkScrolledWindow.Name = "GtkScrolledWindow";
+ this.GtkScrolledWindow.ShadowType = ((global::Gtk.ShadowType)(1));
+ // Container child GtkScrolledWindow.Gtk.Container+ContainerChild
+ this.outputTv = new global::Gtk.TextView();
+ this.outputTv.CanFocus = true;
+ this.outputTv.Name = "outputTv";
+ this.outputTv.Editable = false;
+ this.GtkScrolledWindow.Add(this.outputTv);
+ this.vbox2.Add(this.GtkScrolledWindow);
+ global::Gtk.Box.BoxChild w10 = ((global::Gtk.Box.BoxChild)(this.vbox2[this.GtkScrolledWindow]));
+ w10.Position = 1;
+ // Container child vbox2.Gtk.Box+BoxChild
+ this.hbox1 = new global::Gtk.HBox();
+ this.hbox1.Name = "hbox1";
+ this.hbox1.Spacing = 6;
+ // Container child hbox1.Gtk.Box+BoxChild
+ this.messageEntry = new global::Gtk.Entry();
+ this.messageEntry.CanFocus = true;
+ this.messageEntry.Name = "messageEntry";
+ this.messageEntry.IsEditable = true;
+ this.messageEntry.InvisibleChar = '•';
+ this.hbox1.Add(this.messageEntry);
+ global::Gtk.Box.BoxChild w11 = ((global::Gtk.Box.BoxChild)(this.hbox1[this.messageEntry]));
+ w11.Position = 0;
+ // Container child hbox1.Gtk.Box+BoxChild
+ this.sendButton = new global::Gtk.Button();
+ this.sendButton.CanFocus = true;
+ this.sendButton.Name = "sendButton";
+ this.sendButton.UseUnderline = true;
+ this.sendButton.Label = global::Mono.Unix.Catalog.GetString("Send");
+ this.hbox1.Add(this.sendButton);
+ global::Gtk.Box.BoxChild w12 = ((global::Gtk.Box.BoxChild)(this.hbox1[this.sendButton]));
+ w12.Position = 1;
+ w12.Expand = false;
+ w12.Fill = false;
+ this.vbox2.Add(this.hbox1);
+ global::Gtk.Box.BoxChild w13 = ((global::Gtk.Box.BoxChild)(this.vbox2[this.hbox1]));
+ w13.Position = 2;
+ w13.Expand = false;
+ w13.Fill = false;
+ this.Add(this.vbox2);
+ if ((this.Child != null))
+ {
+ this.Child.ShowAll();
+ }
+ this.DefaultWidth = 594;
+ this.DefaultHeight = 412;
+ this.Show();
+ this.DeleteEvent += new global::Gtk.DeleteEventHandler(this.OnDeleteEvent);
+ this.connectButton.Clicked += new global::System.EventHandler(this.Connect);
+ this.sendButton.Clicked += new global::System.EventHandler(this.SendMessage);
+ }
+}
diff --git a/Client/gtk-gui/generated.cs b/Client/gtk-gui/generated.cs
new file mode 100644
index 0000000..4842e95
--- /dev/null
+++ b/Client/gtk-gui/generated.cs
@@ -0,0 +1,30 @@
+
+// This file has been generated by the GUI designer. Do not modify.
+namespace Stetic
+{
+ internal class Gui
+ {
+ private static bool initialized;
+
+ internal static void Initialize(Gtk.Widget iconRenderer)
+ {
+ if ((Stetic.Gui.initialized == false))
+ {
+ Stetic.Gui.initialized = true;
+ }
+ }
+ }
+
+ internal class ActionGroups
+ {
+ public static Gtk.ActionGroup GetActionGroup(System.Type type)
+ {
+ return Stetic.ActionGroups.GetActionGroup(type.FullName);
+ }
+
+ public static Gtk.ActionGroup GetActionGroup(string name)
+ {
+ return null;
+ }
+ }
+}
diff --git a/Client/gtk-gui/gui.stetic b/Client/gtk-gui/gui.stetic
new file mode 100644
index 0000000..204b8b1
--- /dev/null
+++ b/Client/gtk-gui/gui.stetic
@@ -0,0 +1,187 @@
+<?xml version="1.0" encoding="utf-8"?>
+<stetic-interface>
+ <configuration>
+ <images-root-path>..</images-root-path>
+ </configuration>
+ <import>
+ <widget-library name="glade-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
+ <widget-library name="../bin/Debug/Client.exe" internal="true" />
+ </import>
+ <widget class="Gtk.Window" id="MainWindow" design-size="594 412">
+ <property name="MemberName" />
+ <property name="Title" translatable="yes">TcpChat Client</property>
+ <property name="WindowPosition">CenterOnParent</property>
+ <property name="BorderWidth">10</property>
+ <signal name="DeleteEvent" handler="OnDeleteEvent" />
+ <child>
+ <widget class="Gtk.VBox" id="vbox2">
+ <property name="MemberName" />
+ <property name="Spacing">6</property>
+ <child>
+ <widget class="Gtk.HBox" id="hbox2">
+ <property name="MemberName" />
+ <property name="Spacing">6</property>
+ <child>
+ <widget class="Gtk.Label" id="usernameLabel">
+ <property name="MemberName" />
+ <property name="LabelProp" translatable="yes">Username:</property>
+ </widget>
+ <packing>
+ <property name="Position">0</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Entry" id="usernameEntry">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="Text" translatable="yes">Marcin</property>
+ <property name="IsEditable">True</property>
+ <property name="InvisibleChar">•</property>
+ </widget>
+ <packing>
+ <property name="Position">1</property>
+ <property name="AutoSize">True</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="ipLabel">
+ <property name="MemberName" />
+ <property name="LabelProp" translatable="yes">IP address:</property>
+ </widget>
+ <packing>
+ <property name="Position">2</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Entry" id="ipEntry">
+ <property name="MemberName" />
+ <property name="WidthRequest">110</property>
+ <property name="CanFocus">True</property>
+ <property name="Text" translatable="yes">127.0.0.1</property>
+ <property name="IsEditable">True</property>
+ <property name="InvisibleChar">•</property>
+ </widget>
+ <packing>
+ <property name="Position">3</property>
+ <property name="AutoSize">True</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="portLabel">
+ <property name="MemberName" />
+ <property name="LabelProp" translatable="yes">Port:</property>
+ </widget>
+ <packing>
+ <property name="Position">4</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Entry" id="portEntry">
+ <property name="MemberName" />
+ <property name="WidthRequest">50</property>
+ <property name="CanFocus">True</property>
+ <property name="Text" translatable="yes">6789</property>
+ <property name="IsEditable">True</property>
+ <property name="InvisibleChar">•</property>
+ </widget>
+ <packing>
+ <property name="Position">5</property>
+ <property name="AutoSize">True</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Button" id="connectButton">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="Type">TextOnly</property>
+ <property name="Label" translatable="yes">Connect</property>
+ <property name="UseUnderline">True</property>
+ <signal name="Clicked" handler="Connect" />
+ </widget>
+ <packing>
+ <property name="Position">6</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="Position">0</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.ScrolledWindow" id="GtkScrolledWindow">
+ <property name="MemberName" />
+ <property name="ShadowType">In</property>
+ <child>
+ <widget class="Gtk.TextView" id="outputTv">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="ShowScrollbars">True</property>
+ <property name="Editable">False</property>
+ <property name="Text" translatable="yes" />
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="Position">1</property>
+ <property name="AutoSize">True</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.HBox" id="hbox1">
+ <property name="MemberName" />
+ <property name="Spacing">6</property>
+ <child>
+ <widget class="Gtk.Entry" id="messageEntry">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="IsEditable">True</property>
+ <property name="InvisibleChar">•</property>
+ </widget>
+ <packing>
+ <property name="Position">0</property>
+ <property name="AutoSize">True</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Button" id="sendButton">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="Type">TextOnly</property>
+ <property name="Label" translatable="yes">Send</property>
+ <property name="UseUnderline">True</property>
+ <signal name="Clicked" handler="SendMessage" />
+ </widget>
+ <packing>
+ <property name="Position">1</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="Position">2</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+</stetic-interface> \ No newline at end of file