SafeDispatch/Safedispatch_4_0/maptab/UIClasses/LiveAddressGridCellElement.cs
2024-02-22 18:43:59 +02:00

530 lines
23 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Safedispatch_4_0;
using SafeMobileLib;
using Telerik.WinControls.Layouts;
using Telerik.WinControls.UI;
namespace Dispatcher.maptab.UIClasses
{
public class LiveAddressGridCellElement : GridDataCellElement
{
private LightVisualElement unitNameElement;
private LightVisualElement coordinatesNameElement;
private LightVisualElement addressElement;
private LightVisualElement timeElement;
private LightVisualElement speedElement;
private LightVisualElement directionElement;
private StackLayoutElement stackH;
private StackLayoutElement stackTop;
private StackLayoutElement stackContainer;
private StackLayoutElement stackBottom;
private StackLayoutElement stackHTopAndBottom;
private StackLayoutElement stackRight;
private DockLayoutPanel dockLayout;
public LiveAddressGridCellElement(GridViewColumn column, GridRowElement row)
: base(column, row)
{
}
protected override void CreateChildElements()
{
base.CreateChildElements();
this.dockLayout = new DockLayoutPanel();
this.dockLayout.AutoSizeMode = Telerik.WinControls.RadAutoSizeMode.WrapAroundChildren;
this.dockLayout.StretchHorizontally = true;
this.dockLayout.StretchVertically = true;
this.dockLayout.AutoSize = true;
this.dockLayout.ShouldHandleMouseInput = false;
this.dockLayout.Padding = new Padding(0, 0, 0, 0);
this.AutoToolTip = true;
stackRight = new StackLayoutElement();
stackRight.ElementSpacing = 0;
stackRight.Orientation = Orientation.Vertical;
stackRight.TextAlignment = ContentAlignment.MiddleLeft;
stackRight.Alignment = ContentAlignment.MiddleLeft;
stackRight.StretchHorizontally = true;
stackRight.StretchVertically = false;
stackRight.Padding = new System.Windows.Forms.Padding(2, 2, 2, 2);
//stackRight.AutoSize = true;
//stackRight.AutoSizeMode = Telerik.WinControls.RadAutoSizeMode.WrapAroundChildren;
/*
stackRight.MinSize = new System.Drawing.Size(107, stackRight.Size.Height);
stackRight.MaxSize = new System.Drawing.Size(107, stackRight.Size.Height);
stackRight.Size = new System.Drawing.Size(107, stackRight.Size.Height);*/
stackTop = new StackLayoutElement();
stackTop.StretchHorizontally = false;
stackTop.StretchVertically = false;
stackTop.AutoSize = true;
stackTop.AutoSizeMode = Telerik.WinControls.RadAutoSizeMode.WrapAroundChildren;
stackTop.ElementSpacing = 0;
stackTop.Orientation = Orientation.Vertical;
stackTop.TextAlignment = ContentAlignment.MiddleLeft;
stackTop.Alignment = ContentAlignment.MiddleLeft;
stackTop.MaxSize = new System.Drawing.Size(225, 0);
stackTop.MinSize = new System.Drawing.Size(225, 0);
stackH = new StackLayoutElement();
stackH.StretchHorizontally = true;
stackH.StretchVertically = false;
stackH.AutoSize = true;
stackH.AutoSizeMode = Telerik.WinControls.RadAutoSizeMode.FitToAvailableSize;
stackH.ElementSpacing = 0;
stackH.Orientation = Orientation.Horizontal;
stackH.TextAlignment = ContentAlignment.MiddleLeft;
stackH.Alignment = ContentAlignment.MiddleLeft;
unitNameElement = new LightVisualElement();
Font font = new Font(
unitNameElement.Font.FontFamily,
11,
FontStyle.Bold,
GraphicsUnit.Pixel);
unitNameElement.Font = font;
unitNameElement.ForeColor = Color.FromArgb(0, 0, 0);
unitNameElement.StretchHorizontally = true;
unitNameElement.StretchVertically= false;
unitNameElement.AutoSize = true;
unitNameElement.AutoSizeMode = Telerik.WinControls.RadAutoSizeMode.WrapAroundChildren;
unitNameElement.Alignment = ContentAlignment.MiddleLeft;
unitNameElement.TextAlignment = ContentAlignment.MiddleLeft;
unitNameElement.MaxSize = new System.Drawing.Size(140, 15);
//unitNameElement.MinSize = new System.Drawing.Size(140, 12);
speedElement = new LightVisualElement();
speedElement.StretchHorizontally = true;
speedElement.StretchVertically = false;
speedElement.AutoSize = true;
//speedElement.AutoSizeMode = Telerik.WinControls.RadAutoSizeMode.FitToAvailableSize;
speedElement.Alignment = ContentAlignment.MiddleRight;
speedElement.TextAlignment = ContentAlignment.MiddleRight;
speedElement.Padding = new System.Windows.Forms.Padding(0, 0, 0, 0);
speedElement.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);
speedElement.ForeColor = Color.FromArgb(99, 99, 99);
speedElement.TextWrap = true;
addressElement = new LightVisualElement();
addressElement.StretchHorizontally = false;
addressElement.StretchVertically = false;
//addressElement.AutoSize = true;
//addressElement.AutoSizeMode = Telerik.WinControls.RadAutoSizeMode.WrapAroundChildren;
addressElement.Alignment = ContentAlignment.MiddleLeft;
addressElement.TextAlignment = ContentAlignment.MiddleLeft;
//addressElement.Padding = new System.Windows.Forms.Padding(0, 3, 3, 0);
addressElement.Margin = new System.Windows.Forms.Padding(0,0,0,0);
addressElement.ForeColor = Color.FromArgb(99, 99, 99);
addressElement.TextWrap = true;
//addressElement.MinSize = new System.Drawing.Size(dockLayout.MaxSize.Width - 30, 0);
stackH.Children.Add(unitNameElement);
stackH.Children.Add(speedElement);
// add crt number and address element to the top stack
stackTop.Children.Add(stackH);
stackTop.Children.Add(addressElement);
stackHTopAndBottom = new StackLayoutElement();
stackHTopAndBottom.StretchHorizontally = true;
stackHTopAndBottom.StretchVertically = true;
stackHTopAndBottom.AutoSize = true;
stackHTopAndBottom.AutoSizeMode = Telerik.WinControls.RadAutoSizeMode.FitToAvailableSize;
stackHTopAndBottom.ElementSpacing = 0;
stackHTopAndBottom.Orientation = Orientation.Horizontal;
stackHTopAndBottom.TextAlignment = ContentAlignment.TopLeft;
stackHTopAndBottom.Alignment = ContentAlignment.TopLeft;
directionElement = new LightVisualElement();
directionElement.StretchHorizontally = true;
directionElement.AutoSize = true;
//directionElement.AutoSizeMode = Telerik.WinControls.RadAutoSizeMode.WrapAroundChildren;
directionElement.Alignment = ContentAlignment.TopRight;
directionElement.TextAlignment = ContentAlignment.TopRight;
directionElement.Padding = new System.Windows.Forms.Padding(0, 0, 0, 0);
directionElement.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);
directionElement.MaxSize = new System.Drawing.Size(32, 0);
directionElement.MinSize = new System.Drawing.Size(32, 0);
/*
// add image to the dictionary if not exists
if (!MainForm2.imagesDictionary.ContainsKey("l_direction_u"))
MainForm2.imagesDictionary.Add("l_direction_u", global::Dispatcher.Properties.Resources.l_direction_u);
// set image for the list grid
directionElement.Image = MainForm2.imagesDictionary["l_direction_u"];*/
directionElement.ImageAlignment = ContentAlignment.MiddleLeft;
directionElement.ImageLayout = System.Windows.Forms.ImageLayout.Zoom;
directionElement.DrawText = false;
// add the top containers and the direction image
stackHTopAndBottom.Children.Add(stackTop);
stackHTopAndBottom.Children.Add(directionElement);
// create the middle stack
stackBottom = new StackLayoutElement();
stackBottom.StretchHorizontally = true;
stackBottom.StretchVertically = false;
//stackBottom.AutoSize = true;
//stackBottom.AutoSizeMode = Telerik.WinControls.RadAutoSizeMode.FitToAvailableSize;
stackBottom.ElementSpacing = 0;
stackBottom.Orientation = Orientation.Horizontal;
stackBottom.TextAlignment = ContentAlignment.MiddleLeft;
stackBottom.Alignment = ContentAlignment.MiddleLeft;
Font fontNumber3 = new Font(
addressElement.Font.FontFamily,
9,
FontStyle.Regular,
GraphicsUnit.Pixel);
coordinatesNameElement = new LightVisualElement();
coordinatesNameElement.Font = fontNumber3;
coordinatesNameElement.ForeColor = Color.FromArgb(0, 0, 0);
coordinatesNameElement.StretchHorizontally = false;
coordinatesNameElement.AutoSize = true;
coordinatesNameElement.AutoSizeMode = Telerik.WinControls.RadAutoSizeMode.FitToAvailableSize;
coordinatesNameElement.Alignment = ContentAlignment.MiddleLeft;
coordinatesNameElement.TextAlignment = ContentAlignment.MiddleLeft;
timeElement = new LightVisualElement();
timeElement.StretchHorizontally = true;
timeElement.AutoSize = true;
timeElement.Alignment = ContentAlignment.MiddleRight;
timeElement.TextAlignment = ContentAlignment.MiddleRight;
timeElement.MaxSize = new System.Drawing.Size(110, 12);
timeElement.Padding = new System.Windows.Forms.Padding(0, 0, 3, 0);
timeElement.Font = fontNumber3;
timeElement.ForeColor = Color.FromArgb(161, 161, 161);
// add coordinates and time to bottom stack
stackBottom.Children.Add(coordinatesNameElement);
stackBottom.Children.Add(timeElement);
// add top, middle and bottom stacks to the right stack
stackRight.Children.Add(stackHTopAndBottom);
stackRight.Children.Add(stackBottom);
// add stack to the dock
dockLayout.Children.Add(stackRight);
//DockLayoutPanel.SetDock(this.stackRight, Telerik.WinControls.Layouts.Dock.Right);
this.Children.Add(dockLayout);
}
protected override Type ThemeEffectiveType
{
get
{
return typeof(GridDataCellElement);
}
}
public override bool IsCompatible(GridViewColumn data, object context)
{
return data is HistoryGridColumn && context is GridDataRowElement;
}
private bool createdEventListener = false;
public override void SetContent()
{
GridViewDataRowInfo row = this.RowInfo as GridViewDataRowInfo;
if (row != null)
{
DataforGRID gridData = row.DataBoundItem as DataforGRID;
// create event listener for when something is changed
if (!createdEventListener)
{
gridData.PropertyChanged += gridData_PropertyChanged;
createdEventListener = true;
}
// update the ui elements
updateUIElements(gridData);
}
this.Text = string.Empty;
}
/// <summary>
/// Listener and event handler for when a property changes value in
/// the gridData object. This will cause the grid element to redraw
/// with new values
/// </summary>
void gridData_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case "nrOfUpdates":
{
// get row
GridViewDataRowInfo row = this.RowInfo as GridViewDataRowInfo;
if (row != null)
{
// get row data
DataforGRID gridData = row.DataBoundItem as DataforGRID;
// update the ui elements
updateUIElements(gridData);
}
break;
}
}
}
/// <summary>
/// Update all UI elements with the ones received in gridData object
/// </summary>
/// <param name="gridData">Object containing all infos for the UI elements</param>
private void updateUIElements(DataforGRID gridData)
{
if (gridData != null)
{
// set the vehicle name
unitNameElement.Text = gridData.VehName;
// set position time
if (gridData.Datatime.Year > 2000)
{
string timeAgo = LiveGridCellElement.GetDateTimeAgo(gridData.Datatime);
timeElement.Text = timeAgo.Equals(MainForm2.returnLNGString("scheduled")) ? MainForm2.returnLNGString("inTheFuture") : timeAgo;
}
if (gridData.Address.Length > 0 && !gridData.Address.Equals("N/A"))
{
// set the addres
addressElement.Text = gridData.Address;
// add speed to the addres field
speedElement.Text = gridData.Speed + (MainForm2.isInMile ? " " + MainForm2.milesh : " " + MainForm2.kmh);
// add coordinates if available
if (gridData.Lng.Length > 0 && !gridData.Lng.Equals("N/A"))
coordinatesNameElement.Text = "[" + gridData.Lat + "," + gridData.Lng + "]";
// set the tooltip text which will be displayed
this.ToolTipText = addressElement.Text;
directionElement.Image = GetDirectionImage(SafeMobileLib.Utils.Direction.GetDirection(gridData.Head));
}
else
{
addressElement.Text = MainForm2.returnLNGString("noAddress");
stackBottom.Visibility = Telerik.WinControls.ElementVisibility.Collapsed;
}
}
}
/// <summary>
/// Get the bullet image for the current state of the unit
/// based on its position time, speed and status
/// </summary>
/// <param name="positionTime">Time of the position</param>
/// <param name="status">Unit status as decided bt the system</param>
/// <param name="speed">Speed of the unit</param>
/// <returns>Image representing the state of the unit</returns>
public Image GetDirectionImage(SafeMobileLib.Utils.Direction direction)
{
if (direction == SafeMobileLib.Utils.Direction.E)
{
// add image to the dictionary if not exists
if (!MainForm2.imagesDictionary.ContainsKey("l_direction_e"))
MainForm2.imagesDictionary.Add("l_direction_e", global::Dispatcher.Properties.Resources.l_direction_e);
// return the desired image
return MainForm2.imagesDictionary["l_direction_e"];
}
else if (direction == SafeMobileLib.Utils.Direction.ENE)
{
// add image to the dictionary if not exists
if (!MainForm2.imagesDictionary.ContainsKey("l_direction_ene"))
MainForm2.imagesDictionary.Add("l_direction_ene", global::Dispatcher.Properties.Resources.l_direction_ene);
// return the desired image
return MainForm2.imagesDictionary["l_direction_ene"];
}
else if (direction == SafeMobileLib.Utils.Direction.ESE)
{
// add image to the dictionary if not exists
if (!MainForm2.imagesDictionary.ContainsKey("l_direction_ese"))
MainForm2.imagesDictionary.Add("l_direction_ese", global::Dispatcher.Properties.Resources.l_direction_ese);
// return the desired image
return MainForm2.imagesDictionary["l_direction_ese"];
}
else if (direction == SafeMobileLib.Utils.Direction.N)
{
// add image to the dictionary if not exists
if (!MainForm2.imagesDictionary.ContainsKey("l_direction_n"))
MainForm2.imagesDictionary.Add("l_direction_n", global::Dispatcher.Properties.Resources.l_direction_n);
// return the desired image
return MainForm2.imagesDictionary["l_direction_n"];
}
else if (direction == SafeMobileLib.Utils.Direction.NE)
{
// add image to the dictionary if not exists
if (!MainForm2.imagesDictionary.ContainsKey("l_direction_ne"))
MainForm2.imagesDictionary.Add("l_direction_ne", global::Dispatcher.Properties.Resources.l_direction_ne);
// return the desired image
return MainForm2.imagesDictionary["l_direction_ne"];
}
else if (direction == SafeMobileLib.Utils.Direction.NNE)
{
// add image to the dictionary if not exists
if (!MainForm2.imagesDictionary.ContainsKey("l_direction_nne"))
MainForm2.imagesDictionary.Add("l_direction_nne", global::Dispatcher.Properties.Resources.l_direction_nne);
// return the desired image
return MainForm2.imagesDictionary["l_direction_nne"];
}
else if (direction == SafeMobileLib.Utils.Direction.NNW)
{
// add image to the dictionary if not exists
if (!MainForm2.imagesDictionary.ContainsKey("l_direction_nnw"))
MainForm2.imagesDictionary.Add("l_direction_nnw", global::Dispatcher.Properties.Resources.l_direction_nnw);
// return the desired image
return MainForm2.imagesDictionary["l_direction_nnw"];
}
else if (direction == SafeMobileLib.Utils.Direction.NW)
{
// add image to the dictionary if not exists
if (!MainForm2.imagesDictionary.ContainsKey("l_direction_nw"))
MainForm2.imagesDictionary.Add("l_direction_nw", global::Dispatcher.Properties.Resources.l_direction_nw);
// return the desired image
return MainForm2.imagesDictionary["l_direction_nw"];
}
else if (direction == SafeMobileLib.Utils.Direction.S)
{
// add image to the dictionary if not exists
if (!MainForm2.imagesDictionary.ContainsKey("l_direction_s"))
MainForm2.imagesDictionary.Add("l_direction_s", global::Dispatcher.Properties.Resources.l_direction_s);
// return the desired image
return MainForm2.imagesDictionary["l_direction_s"];
}
else if (direction == SafeMobileLib.Utils.Direction.SE)
{
// add image to the dictionary if not exists
if (!MainForm2.imagesDictionary.ContainsKey("l_direction_se"))
MainForm2.imagesDictionary.Add("l_direction_se", global::Dispatcher.Properties.Resources.l_direction_se);
// return the desired image
return MainForm2.imagesDictionary["l_direction_se"];
}
else if (direction == SafeMobileLib.Utils.Direction.SSE)
{
// add image to the dictionary if not exists
if (!MainForm2.imagesDictionary.ContainsKey("l_direction_sse"))
MainForm2.imagesDictionary.Add("l_direction_sse", global::Dispatcher.Properties.Resources.l_direction_sse);
// return the desired image
return MainForm2.imagesDictionary["l_direction_sse"];
}
else if (direction == SafeMobileLib.Utils.Direction.SSW)
{
// add image to the dictionary if not exists
if (!MainForm2.imagesDictionary.ContainsKey("l_direction_ssw"))
MainForm2.imagesDictionary.Add("l_direction_ssw", global::Dispatcher.Properties.Resources.l_direction_ssw);
// return the desired image
return MainForm2.imagesDictionary["l_direction_ssw"];
}
else if (direction == SafeMobileLib.Utils.Direction.SW)
{
// add image to the dictionary if not exists
if (!MainForm2.imagesDictionary.ContainsKey("l_direction_sw"))
MainForm2.imagesDictionary.Add("l_direction_sw", global::Dispatcher.Properties.Resources.l_direction_sw);
// return the desired image
return MainForm2.imagesDictionary["l_direction_sw"];
}
else if (direction == SafeMobileLib.Utils.Direction.UNKNOWN)
{
// add image to the dictionary if not exists
if (!MainForm2.imagesDictionary.ContainsKey("l_direction_u"))
MainForm2.imagesDictionary.Add("l_direction_u", global::Dispatcher.Properties.Resources.l_direction_u);
// return the desired image
return MainForm2.imagesDictionary["l_direction_u"];
}
else if (direction == SafeMobileLib.Utils.Direction.W)
{
// add image to the dictionary if not exists
if (!MainForm2.imagesDictionary.ContainsKey("l_direction_w"))
MainForm2.imagesDictionary.Add("l_direction_w", global::Dispatcher.Properties.Resources.l_direction_w);
// return the desired image
return MainForm2.imagesDictionary["l_direction_w"];
}
else if (direction == SafeMobileLib.Utils.Direction.WNW)
{
// add image to the dictionary if not exists
if (!MainForm2.imagesDictionary.ContainsKey("l_direction_wnw"))
MainForm2.imagesDictionary.Add("l_direction_wnw", global::Dispatcher.Properties.Resources.l_direction_wnw);
// return the desired image
return MainForm2.imagesDictionary["l_direction_wnw"];
}
else if (direction == SafeMobileLib.Utils.Direction.WSW)
{
// add image to the dictionary if not exists
if (!MainForm2.imagesDictionary.ContainsKey("l_direction_wsw"))
MainForm2.imagesDictionary.Add("l_direction_wsw", global::Dispatcher.Properties.Resources.l_direction_wsw);
// return the desired image
return MainForm2.imagesDictionary["l_direction_wsw"];
}
return null;
}
}
}