StephaneLenclud@123: //
StephaneLenclud@123: // Copyright (C) 2014-2015 Stéphane Lenclud.
StephaneLenclud@123: //
StephaneLenclud@123: // This file is part of SharpDisplayManager.
StephaneLenclud@123: //
StephaneLenclud@123: // SharpDisplayManager is free software: you can redistribute it and/or modify
StephaneLenclud@123: // it under the terms of the GNU General Public License as published by
StephaneLenclud@123: // the Free Software Foundation, either version 3 of the License, or
StephaneLenclud@123: // (at your option) any later version.
StephaneLenclud@123: //
StephaneLenclud@123: // SharpDisplayManager is distributed in the hope that it will be useful,
StephaneLenclud@123: // but WITHOUT ANY WARRANTY; without even the implied warranty of
StephaneLenclud@123: // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
StephaneLenclud@123: // GNU General Public License for more details.
StephaneLenclud@123: //
StephaneLenclud@123: // You should have received a copy of the GNU General Public License
StephaneLenclud@123: // along with SharpDisplayManager. If not, see .
StephaneLenclud@123: //
StephaneLenclud@123:
StephaneLenclud@123: using System;
sl@18: using System.Collections.Generic;
sl@18: using System.ComponentModel;
sl@18: using System.Data;
sl@18: using System.Drawing;
sl@18: using System.Linq;
sl@18: using System.Text;
sl@18: using System.Threading.Tasks;
sl@18: using System.Windows.Forms;
sl@18: using System.ServiceModel;
sl@18: using System.ServiceModel.Channels;
sl@31: using System.Diagnostics;
StephaneLenclud@171: using SharpLib.Display;
sl@20:
sl@18:
sl@18: namespace SharpDisplayClient
sl@18: {
sl@18: public partial class MainForm : Form
sl@18: {
StephaneLenclud@106: public StartParams Params { get; set; }
StephaneLenclud@106:
StephaneLenclud@106: //
StephaneLenclud@171: Client iClient;
StephaneLenclud@106: //
sl@43: ContentAlignment Alignment;
StephaneLenclud@172: TextField iTextFieldTop;
sl@18:
StephaneLenclud@106:
StephaneLenclud@106: ///
StephaneLenclud@106: /// Constructor
StephaneLenclud@106: ///
sl@18: public MainForm()
sl@18: {
sl@18: InitializeComponent();
sl@43: Alignment = ContentAlignment.MiddleLeft;
StephaneLenclud@176: iTextFieldTop = new TextField();
sl@18: }
sl@18:
StephaneLenclud@171: public void OnCloseOrder()
StephaneLenclud@171: {
StephaneLenclud@171: CloseThreadSafe();
StephaneLenclud@171: }
StephaneLenclud@171:
StephaneLenclud@171: ///
StephaneLenclud@171: ///
StephaneLenclud@171: ///
StephaneLenclud@171: ///
StephaneLenclud@171: ///
sl@18: private void MainForm_Load(object sender, EventArgs e)
sl@18: {
StephaneLenclud@171: iClient = new Client();
StephaneLenclud@171: iClient.CloseOrderEvent += OnCloseOrder;
sl@73: iClient.Open();
sl@18:
sl@29: //Connect using unique name
sl@32: //string name = DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss.fff tt");
sl@32: string name = "Client-" + (iClient.ClientCount() - 1);
sl@32: iClient.SetName(name);
sl@30: //Text = Text + ": " + name;
sl@32: Text = "[[" + name + "]] " + iClient.SessionId;
sl@18:
sl@33: //
sl@33: textBoxTop.Text = iClient.Name;
sl@33: textBoxBottom.Text = iClient.SessionId;
sl@33:
StephaneLenclud@106: if (Params != null)
StephaneLenclud@106: {
StephaneLenclud@106: //Parameters where specified use them
StephaneLenclud@106: if (Params.TopText != "")
StephaneLenclud@106: {
StephaneLenclud@106: textBoxTop.Text = Params.TopText;
StephaneLenclud@106: }
StephaneLenclud@106:
StephaneLenclud@106: if (Params.BottomText != "")
StephaneLenclud@106: {
StephaneLenclud@106: textBoxBottom.Text = Params.BottomText;
StephaneLenclud@106: }
StephaneLenclud@106:
StephaneLenclud@106: Location = Params.Location;
StephaneLenclud@106: //
StephaneLenclud@106: SetBasicLayoutAndText();
StephaneLenclud@106: }
StephaneLenclud@106:
sl@18: }
sl@21:
sl@31:
sl@60:
sl@31: public delegate void CloseConnectionDelegate();
sl@31: public delegate void CloseDelegate();
sl@31:
sl@31: ///
sl@60: ///
sl@31: ///
sl@31: public void CloseConnectionThreadSafe()
sl@21: {
sl@31: if (this.InvokeRequired)
sl@29: {
sl@31: //Not in the proper thread, invoke ourselves
sl@31: CloseConnectionDelegate d = new CloseConnectionDelegate(CloseConnectionThreadSafe);
sl@31: this.Invoke(d, new object[] { });
sl@29: }
sl@31: else
sl@31: {
sl@31: //We are in the proper thread
sl@31: if (IsClientReady())
sl@31: {
sl@74: string sessionId = iClient.SessionId;
sl@74: Trace.TraceInformation("Closing client: " + sessionId);
sl@31: iClient.Close();
sl@74: Trace.TraceInformation("Closed client: " + sessionId);
sl@31: }
sl@29:
sl@31: iClient = null;
sl@31: }
sl@26: }
sl@26:
sl@31: ///
sl@60: ///
sl@31: ///
sl@31: public void CloseThreadSafe()
sl@31: {
sl@31: if (this.InvokeRequired)
sl@31: {
sl@31: //Not in the proper thread, invoke ourselves
sl@31: CloseDelegate d = new CloseDelegate(CloseThreadSafe);
sl@31: this.Invoke(d, new object[] { });
sl@31: }
sl@31: else
sl@31: {
sl@31: //We are in the proper thread
sl@31: Close();
sl@31: }
sl@31: }
sl@31:
sl@31:
sl@26: private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
sl@26: {
sl@31: CloseConnectionThreadSafe();
sl@29: }
sl@29:
sl@29: public bool IsClientReady()
sl@29: {
sl@73: return (iClient != null && iClient.IsReady());
sl@21: }
sl@43:
sl@43: private void buttonAlignLeft_Click(object sender, EventArgs e)
sl@43: {
sl@43: Alignment = ContentAlignment.MiddleLeft;
sl@43: textBoxTop.TextAlign = HorizontalAlignment.Left;
sl@43: textBoxBottom.TextAlign = HorizontalAlignment.Left;
sl@43: }
sl@43:
sl@43: private void buttonAlignCenter_Click(object sender, EventArgs e)
sl@43: {
sl@43: Alignment = ContentAlignment.MiddleCenter;
sl@43: textBoxTop.TextAlign = HorizontalAlignment.Center;
sl@43: textBoxBottom.TextAlign = HorizontalAlignment.Center;
sl@43: }
sl@43:
sl@43: private void buttonAlignRight_Click(object sender, EventArgs e)
sl@43: {
sl@43: Alignment = ContentAlignment.MiddleRight;
sl@43: textBoxTop.TextAlign = HorizontalAlignment.Right;
sl@43: textBoxBottom.TextAlign = HorizontalAlignment.Right;
sl@43: }
sl@43:
sl@43: private void buttonSetTopText_Click(object sender, EventArgs e)
sl@43: {
sl@43: //TextField top = new TextField(0, textBoxTop.Text, ContentAlignment.MiddleLeft);
sl@43: iTextFieldTop.Text = textBoxTop.Text;
sl@60: iTextFieldTop.Alignment = Alignment;
sl@81: bool res = iClient.SetField(iTextFieldTop);
sl@81:
sl@81: if (!res)
sl@81: {
sl@81: MessageBox.Show("Create you fields first", "Field update error", MessageBoxButtons.OK, MessageBoxIcon.Error);
sl@81: }
sl@81:
sl@81:
sl@43: }
sl@43:
sl@43: private void buttonSetText_Click(object sender, EventArgs e)
sl@43: {
StephaneLenclud@106: SetBasicLayoutAndText();
StephaneLenclud@106: }
sl@78:
StephaneLenclud@106: void SetBasicLayoutAndText()
StephaneLenclud@106: {
StephaneLenclud@106: //Set one column two lines layout
StephaneLenclud@106: TableLayout layout = new TableLayout(1, 2);
StephaneLenclud@106: iClient.SetLayout(layout);
StephaneLenclud@106:
StephaneLenclud@106: //Set our fields
StephaneLenclud@106: iClient.CreateFields(new DataField[]
sl@60: {
StephaneLenclud@176: new TextField(textBoxTop.Text, Alignment, 0, 0),
StephaneLenclud@176: new TextField(textBoxBottom.Text, Alignment, 0, 1)
sl@43: });
StephaneLenclud@106:
StephaneLenclud@106: }
sl@62:
sl@62: private void buttonLayoutUpdate_Click(object sender, EventArgs e)
sl@62: {
sl@65: //Define a 2 by 2 layout
sl@62: TableLayout layout = new TableLayout(2,2);
sl@65: //Second column only takes up 25%
sl@63: layout.Columns[1].Width = 25F;
sl@65: //Send layout to server
sl@62: iClient.SetLayout(layout);
StephaneLenclud@158:
StephaneLenclud@174: //
StephaneLenclud@174: RecordingField recording = new RecordingField();
StephaneLenclud@174: recording.IsActive = true;
StephaneLenclud@174:
StephaneLenclud@158: //Set texts
StephaneLenclud@158: iClient.CreateFields(new DataField[]
StephaneLenclud@158: {
StephaneLenclud@176: new TextField(textBoxTop.Text, Alignment, 0, 0),
StephaneLenclud@176: new TextField(textBoxBottom.Text, Alignment, 0, 1),
StephaneLenclud@176: new TextField("Third text field", Alignment, 1, 0),
StephaneLenclud@176: new TextField("Forth text field", Alignment, 1, 1),
StephaneLenclud@175: recording
StephaneLenclud@158: });
StephaneLenclud@158:
sl@62: }
sl@67:
sl@68: private void buttonSetBitmap_Click(object sender, EventArgs e)
sl@67: {
sl@68: int x1 = 0;
sl@68: int y1 = 0;
sl@68: int x2 = 256;
sl@68: int y2 = 32;
sl@68:
sl@68: Bitmap bitmap = new Bitmap(x2,y2);
sl@67: Pen blackPen = new Pen(Color.Black, 3);
sl@67:
sl@67: // Draw line to screen.
sl@67: using (var graphics = Graphics.FromImage(bitmap))
sl@67: {
sl@67: graphics.DrawLine(blackPen, x1, y1, x2, y2);
sl@68: graphics.DrawLine(blackPen, x1, y2, x2, y1);
sl@67: }
sl@67:
StephaneLenclud@176: DataField field = new BitmapField(bitmap);
sl@80: //field.ColumnSpan = 2;
sl@74: iClient.SetField(field);
sl@70: }
sl@70:
sl@71: private void buttonBitmapLayout_Click(object sender, EventArgs e)
sl@71: {
sl@71: SetLayoutWithBitmap();
sl@71: }
sl@71:
sl@71: ///
sl@71: /// Define a layout with a bitmap field on the left and two lines of text on the right.
sl@71: ///
sl@71: private void SetLayoutWithBitmap()
sl@70: {
sl@70: //Define a 2 by 2 layout
sl@70: TableLayout layout = new TableLayout(2, 2);
sl@71: //First column only takes 25%
sl@70: layout.Columns[0].Width = 25F;
sl@73: //Second column takes up 75%
sl@70: layout.Columns[1].Width = 75F;
sl@70: //Send layout to server
sl@70: iClient.SetLayout(layout);
sl@70:
sl@70: //Set a bitmap for our first field
sl@70: int x1 = 0;
sl@70: int y1 = 0;
sl@70: int x2 = 64;
sl@70: int y2 = 64;
sl@70:
sl@70: Bitmap bitmap = new Bitmap(x2, y2);
sl@70: Pen blackPen = new Pen(Color.Black, 3);
sl@70:
sl@70: // Draw line to screen.
sl@70: using (var graphics = Graphics.FromImage(bitmap))
sl@70: {
sl@70: graphics.DrawLine(blackPen, x1, y1, x2, y2);
sl@70: graphics.DrawLine(blackPen, x1, y2, x2, y1);
sl@70: }
sl@70:
sl@71: //Create a bitmap field from the bitmap we just created
sl@71: //We want our bitmap field to span across two rows
StephaneLenclud@176: BitmapField bitmapField = new BitmapField(bitmap, 0, 0, 1, 2);
StephaneLenclud@176:
sl@70: //Set texts
sl@80: iClient.CreateFields(new DataField[]
sl@70: {
StephaneLenclud@176: bitmapField,
StephaneLenclud@176: new TextField(textBoxTop.Text, Alignment, 1, 0),
StephaneLenclud@176: new TextField(textBoxBottom.Text, Alignment, 1, 1)
sl@70: });
sl@70:
sl@67: }
sl@79:
sl@79: private void buttonIndicatorsLayout_Click(object sender, EventArgs e)
sl@79: {
sl@79: //Define a 2 by 4 layout
sl@79: TableLayout layout = new TableLayout(2, 4);
sl@79: //First column
sl@79: layout.Columns[0].Width = 87.5F;
sl@79: //Second column
sl@79: layout.Columns[1].Width = 12.5F;
sl@79: //Send layout to server
sl@79: iClient.SetLayout(layout);
sl@79:
sl@79: //Create a bitmap for our indicators field
sl@79: int x1 = 0;
sl@79: int y1 = 0;
sl@79: int x2 = 32;
sl@79: int y2 = 16;
sl@79:
sl@79: Bitmap bitmap = new Bitmap(x2, y2);
sl@79: Pen blackPen = new Pen(Color.Black, 3);
sl@79:
sl@79: // Draw line to screen.
sl@79: using (var graphics = Graphics.FromImage(bitmap))
sl@79: {
sl@79: graphics.DrawLine(blackPen, x1, y1, x2, y2);
sl@79: graphics.DrawLine(blackPen, x1, y2, x2, y1);
sl@79: }
sl@79:
sl@79: //Create a bitmap field from the bitmap we just created
StephaneLenclud@176: DataField indicator1 = new BitmapField(bitmap, 1, 0);
sl@79: //Create a bitmap field from the bitmap we just created
StephaneLenclud@176: DataField indicator2 = new BitmapField(bitmap, 1, 1);
sl@79: //Create a bitmap field from the bitmap we just created
StephaneLenclud@176: DataField indicator3 = new BitmapField(bitmap, 1, 2);
sl@79: //Create a bitmap field from the bitmap we just created
StephaneLenclud@176: DataField indicator4 = new BitmapField(bitmap, 1, 3);
sl@79:
sl@79: //
StephaneLenclud@176: TextField textFieldTop = new TextField(textBoxTop.Text, Alignment, 0, 0, 1, 2);
StephaneLenclud@176: TextField textFieldBottom = new TextField(textBoxBottom.Text, Alignment, 0, 2, 1, 2);
sl@79:
sl@79: //Set texts
sl@80: iClient.CreateFields(new DataField[]
sl@79: {
sl@79: textFieldTop,
StephaneLenclud@175: textFieldBottom,
sl@79: indicator1,
StephaneLenclud@175: indicator2,
sl@79: indicator3,
sl@79: indicator4
sl@79: });
sl@79:
sl@79: }
sl@80:
sl@80: private void buttonUpdateTexts_Click(object sender, EventArgs e)
sl@80: {
sl@80:
sl@80: bool res = iClient.SetFields(new DataField[]
sl@80: {
StephaneLenclud@176: new TextField(textBoxTop.Text, Alignment,0,0),
StephaneLenclud@176: new TextField(textBoxBottom.Text, Alignment,0,1)
sl@80: });
sl@80:
sl@80: if (!res)
sl@80: {
sl@80: MessageBox.Show("Create you fields first", "Field update error", MessageBoxButtons.OK, MessageBoxIcon.Error);
sl@80: }
sl@80:
sl@80: }
StephaneLenclud@108:
StephaneLenclud@108: private void buttonLayoutOneTextField_Click(object sender, EventArgs e)
StephaneLenclud@108: {
StephaneLenclud@172: //Set one column one line layout
StephaneLenclud@108: TableLayout layout = new TableLayout(1, 1);
StephaneLenclud@108: iClient.SetLayout(layout);
StephaneLenclud@108:
StephaneLenclud@108: //Set our fields
StephaneLenclud@108: iClient.CreateFields(new DataField[]
StephaneLenclud@108: {
StephaneLenclud@176: new TextField(textBoxTop.Text, Alignment)
StephaneLenclud@108: });
StephaneLenclud@108: }
sl@18: }
sl@18: }