public void OnMessageEvent(ServerEventMessage msg)
        {
            if (msg.Channel == typeof(JarsDefaultAppointment).Name)
            {
                // throw new NotImplementedException();
                ServerEventMessageData msgData = msg.Json.FromJson <ServerEventMessageData>();
                switch (msg.Selector)
                {
                case SelectorTypes.store:

                    List <JarsDefaultAppointment> appts = msgData.jsonDataString.ConvertTo <List <JarsDefaultAppointment> >();
                    foreach (var item in appts)
                    {
                        //first see if the appt is already in the list, if it is then update it, otherwise add it.
                        var findItm = ((List <JarsDefaultAppointment>)standardAppointmentDefaultBindingSource.List).FirstOrDefault(x => x.Id == item.Id);
                        if (findItm != null)
                        {
                            findItm.PopulateWith(item);
                        }
                        else
                        {
                            standardAppointmentDefaultBindingSource.List.Add(item.ConvertTo <JarsDefaultAppointment>());
                        }
                    }

                    this.BeginInvokeIfRequired(c =>
                    {
                        c.Refresh();
                    });
                    break;

                case SelectorTypes.delete:

                    List <int> ids      = msgData.jsonDataString.ConvertTo <List <int> >();
                    var        findList = ((List <JarsDefaultAppointment>)standardAppointmentDefaultBindingSource.List).Where(j => ids.Contains(j.Id));//.CreateCopy();
                    this.BeginInvokeIfRequired(c =>
                    {
                        int[] idx = new int[findList.Count()];
                        int x     = 0;
                        foreach (var item in findList)
                        {
                            idx[x] = standardAppointmentDefaultBindingSource.IndexOf(item);
                            x++;
                        }
                        for (int i = 0; i < idx.Length; i++)
                        {
                            standardAppointmentDefaultBindingSource.RemoveAt(idx[i]);
                        }
                        c.Refresh();
                    });
                    break;

                default:
                    break;
                }
            }
        }
        public bool OnDeleteCommandReceived(Control control, ServerEventMessage seMsg)
        {
            try
            {
                if (control is SchedulerControl schedulerControl)
                {
                    //EntityIdComparer idComparer = new EntityIdComparer();
                    ServerEventMessageData msgData = seMsg.Json.FromJson <ServerEventMessageData>();
                    // if (msgJson.FromClientGuid == Context.ClientInstanceGuid)
                    if (msgData.From == Context.LoggedInUser.UserName)
                    {
                        return(true);
                    }

                    List <int>          ids   = msgData.jsonDataString.FromJson <List <int> >();
                    IList <Appointment> appts = schedulerControl.DataStorage.Appointments.Items
                                                .Where(a => a.CustomFields["ENTITY"] is StandardAppointment &&
                                                       ids.Contains((a.CustomFields["ENTITY"] as StandardAppointment).Id)).ToList();//, idComparer));

                    if (appts.Any())
                    {
                        schedulerControl.BeginInvokeIfRequired(sc =>
                        {
                            AllowServerPost = false;
                            foreach (Appointment appt in appts)
                            {
                                appt.CustomFields["STATE"] = "DELETED";
                                sc.DataStorage.Appointments.Remove(appt);
                            }
                            sc.Refresh();
                            AllowServerPost = true;
                        });
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Error(ex.Message, ex);
#if DEBUG
                throw ex;
#endif
            }
            return(true);
        }
        public bool OnStoreCommandReceived(Control control, ServerEventMessage seMsg)
        {
            if (control is SchedulerControl schedulerControl)
            {
                try
                {
                    ServerEventMessageData msgJson = seMsg.Json.FromJson <ServerEventMessageData>();
                    // if (msgJson.FromClientGuid == Context.ClientInstanceGuid)
                    if (msgJson.From == Context.LoggedInUser.UserName)
                    {
                        return(true);
                    }

                    IList <StandardAppointment> sAppts = msgJson.jsonDataString.FromJson <List <StandardAppointment> >();
                    schedulerControl.BeginUpdate();
                    if (sAppts.Any())
                    {
                        foreach (StandardAppointment sAppt in sAppts)
                        {
                            Appointment appt = null;

                            AppointmentType apptType = (AppointmentType)Enum.Parse(typeof(AppointmentType), sAppt.ApptTypeCode);
                            if (new[] { AppointmentType.ChangedOccurrence, AppointmentType.DeletedOccurrence, AppointmentType.Occurrence }.Contains(apptType))
                            {
                                //get the main pattern appt
                                appt = schedulerControl.DataStorage.Appointments.Items
                                       .FirstOrDefault(a => a.CustomFields["ENTITY"] is StandardAppointment &&
                                                       a.Type == AppointmentType.Pattern &&
                                                       a.RecurrenceInfo.Id.ToString() == sAppt.RecurrenceId.ToString());
                            }
                            else
                            {
                                appt = schedulerControl.DataStorage.Appointments.Items
                                       .FirstOrDefault(a => a.CustomFields["ENTITY"] is StandardAppointment &&
                                                       (a.CustomFields["ENTITY"] as StandardAppointment).Id == sAppt.Id);
                            }
                            //this appointment is most likely received from a server event so no need to post it back and forth.
                            AllowServerPost = false;
                            schedulerControl.InvokeIfRequired(sc =>
                            {
                                appt = CreateOrUpdateAppointmentFromEntity(schedulerControl, sAppt, appt);
                            });
                            AllowServerPost = true;//enable server posting again.
                        }
                    }
                }
                catch (Exception ex)
                {
                    schedulerControl.InvokeIfRequired(sc =>
                    {
                        sc.EndUpdate();
                        sc.Refresh();
                    });

                    Logger.Error(ex.Message, ex);
#if DEBUG
                    throw ex;
#endif
                }
                finally
                {
                    AllowServerPost = true;//enable server posting again.
                    //schedulerControl.EndUpdate();
                    schedulerControl.InvokeIfRequired(sc =>
                    {
                        sc.EndUpdate();
                        sc.Refresh();
                    });
                }
            }
            return(true);
        }