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; } /// /// 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 /// 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; } } } /// /// Update all UI elements with the ones received in gridData object /// /// Object containing all infos for the UI elements 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; } } } /// /// Get the bullet image for the current state of the unit /// based on its position time, speed and status /// /// Time of the position /// Unit status as decided bt the system /// Speed of the unit /// Image representing the state of the unit 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; } } }