private static void EditorController_Closing(object sender, CancelDocumentEventArgs e)
        {
            try
            {
                //stop timer for duration of processing
                //Timer4ProjectArea.Stop();

                if ((Tracked.TrackingState != Tracked.TimerState.Started &&
                     Tracked.TrackingState != Tracked.TimerState.Unpaused &&
                     Tracked.TrackingState != Tracked.TimerState.Paused) ||
                    e.Document.ActiveFile.Id.ToString() != Tracked.TrackerDocumentId)
                {
                    return;
                }
                try
                {
                    Tracked.TrackingTimer.Stop();

                    var trackerProject    = Helper.GetTrackerProjectFromDocument(e.Document);
                    var clientProfileInfo = Common.GetClientFromId(trackerProject.ClientId);

                    #region  |  add existing activity   |

                    var trackerProjectActivity = new TrackerProjectActivity
                    {
                        Id   = Guid.NewGuid().ToString(),
                        Name = e.Document.ActiveFile.Name
                    };


                    #region  |  get activity type  |

                    var activitiesType      = Tracked.Preferences.ActivitiesTypes[0];
                    ClientActivityType type = null;
                    foreach (var activityType in Tracked.Preferences.ActivitiesTypes)
                    {
                        if (string.Compare(activityType.Name, e.Document.Mode.ToString(),
                                           StringComparison.OrdinalIgnoreCase) != 0)
                        {
                            continue;
                        }
                        activitiesType = activityType;
                        if (clientProfileInfo != null)
                        {
                            foreach (var clientActivityType in clientProfileInfo.ClientActivities)
                            {
                                if (activitiesType.Id != clientActivityType.IdActivity)
                                {
                                    continue;
                                }
                                if (clientActivityType.Activated)
                                {
                                    type = clientActivityType;
                                }
                                break;
                            }
                        }
                        break;
                    }
                    #endregion
                    trackerProjectActivity.ActivityTypeId   = activitiesType.Id;
                    trackerProjectActivity.ActivityTypeName = activitiesType.Name;
                    if (type != null)
                    {
                        trackerProjectActivity.ActivityTypeClientId = type.Id;
                    }

                    trackerProjectActivity.Billable = activitiesType.Billable;
                    if (clientProfileInfo != null)
                    {
                        trackerProjectActivity.ClientId   = clientProfileInfo.Id;
                        trackerProjectActivity.ClientName = clientProfileInfo.ClientName;
                    }
                    trackerProjectActivity.Currency  = activitiesType.Currency;
                    trackerProjectActivity.DateStart = Tracked.TrackingStart;
                    Tracked.TrackingEnd            = DateTime.Now;
                    trackerProjectActivity.DateEnd = Tracked.TrackingEnd;

                    trackerProjectActivity.Description          = activitiesType.Description;
                    trackerProjectActivity.HourlyRate           = activitiesType.HourlyRate;
                    trackerProjectActivity.HourlyRateAdjustment = 0;
                    trackerProjectActivity.Invoiced             = false;
                    trackerProjectActivity.InvoicedDate         = Common.DateNull;


                    trackerProjectActivity.Quantity = Convert.ToDecimal(trackerProjectActivity.DateEnd.Subtract(trackerProjectActivity.DateStart).TotalHours);
                    var quantityElapsed = Convert.ToDecimal(Math.Round(Tracked.TrackingTimer.Elapsed.TotalHours, 3));//todo
                    if (quantityElapsed < trackerProjectActivity.Quantity)
                    {
                        trackerProjectActivity.Quantity = quantityElapsed;
                    }

                    trackerProjectActivity.Status               = @"New";
                    trackerProjectActivity.Total                = Math.Round(trackerProjectActivity.Quantity * trackerProjectActivity.HourlyRate, 2);
                    trackerProjectActivity.TrackerProjectId     = trackerProject.Id;
                    trackerProjectActivity.TrackerProjectName   = trackerProject.Name;
                    trackerProjectActivity.TrackerProjectStatus = trackerProject.ProjectStatus;

                    if (Tracked.Preferences.TrackerConfirmActivities)
                    {
                        var trackProjectActivity = new Dialogs.TrackProjectActivity();


                        var trackerProjects = new List <TrackerProject> {
                            trackerProject
                        };


                        trackerProjectActivity.TrackerProjectId     = trackerProject.Id;
                        trackerProjectActivity.TrackerProjectName   = trackerProject.Name;
                        trackerProjectActivity.TrackerProjectStatus = trackerProject.ProjectStatus;


                        trackProjectActivity.Project  = trackerProject;
                        trackProjectActivity.Projects = trackerProjects;
                        trackProjectActivity.Activity = trackerProjectActivity;


                        trackProjectActivity.IsEdit = true;
                        trackProjectActivity.ShowDialog();
                        if (!trackProjectActivity.Saved)
                        {
                            return;
                        }

                        trackerProjectActivity.ActivityTypeClientId = trackProjectActivity.Activity.ActivityTypeClientId;
                        trackerProjectActivity.ActivityTypeId       = trackProjectActivity.Activity.ActivityTypeId;
                        trackerProjectActivity.ActivityTypeName     = trackProjectActivity.Activity.ActivityTypeName;

                        trackerProjectActivity.Billable   = trackProjectActivity.Activity.Billable;
                        trackerProjectActivity.ClientId   = trackProjectActivity.Activity.ClientId;
                        trackerProjectActivity.ClientName = trackProjectActivity.Activity.ClientName;

                        trackerProjectActivity.Currency  = trackProjectActivity.Activity.Currency;
                        trackerProjectActivity.DateEnd   = trackProjectActivity.Activity.DateEnd;
                        trackerProjectActivity.DateStart = trackProjectActivity.Activity.DateStart;

                        trackerProjectActivity.Description = trackProjectActivity.Activity.Description;

                        trackerProjectActivity.HourlyRate           = trackProjectActivity.Activity.HourlyRate;
                        trackerProjectActivity.HourlyRateAdjustment = trackProjectActivity.Activity.HourlyRateAdjustment;

                        trackerProjectActivity.Invoiced     = trackProjectActivity.Activity.Invoiced;
                        trackerProjectActivity.InvoicedDate = trackProjectActivity.Activity.InvoicedDate;

                        trackerProjectActivity.Name     = trackProjectActivity.Activity.Name;
                        trackerProjectActivity.Quantity = trackProjectActivity.Activity.Quantity;

                        trackerProjectActivity.TrackerProjectId     = trackProjectActivity.Activity.TrackerProjectId;
                        trackerProjectActivity.TrackerProjectName   = trackProjectActivity.Activity.TrackerProjectName;
                        trackerProjectActivity.TrackerProjectStatus = trackProjectActivity.Activity.TrackerProjectStatus;

                        trackerProjectActivity.Total = trackProjectActivity.Activity.Total;

                        trackerProject.ProjectActivities.Add(trackerProjectActivity);

                        SettingsSerializer.SaveSettings(Tracked.Preferences);

                        Tracked.TarckerCheckNewActivityAdded = true;
                        Tracked.TarckerCheckNewActivityId    = trackerProjectActivity.Id;
                    }
                    else
                    {
                        trackerProject.ProjectActivities.Add(trackerProjectActivity);

                        SettingsSerializer.SaveSettings(Tracked.Preferences);

                        Tracked.TarckerCheckNewActivityAdded = true;
                        Tracked.TarckerCheckNewActivityId    = trackerProjectActivity.Id;
                    }

                    #endregion
                }
                finally
                {
                    #region  |  null tracker cache  |


                    Tracked.Reset();

                    Tracked.TrackingState = Tracked.TimerState.Started;

                    //ProjectActivityStartTrackerEnabled = false;
                    //ProjectActivityStopTrackerEnabled = true;

                    Tracked.TrackingIsDirtyC0 = true;
                    Tracked.TrackingIsDirtyC1 = true;
                    Tracked.TrackingIsDirtyC2 = true;



                    #endregion
                }
            }
            catch (Exception)
            {
                // ignored
            }
            finally
            {
                //restart timer
                //Timer4ProjectArea.Start();
            }
        }
        public static void stop_tracking(EditorController editorController, Timer timer)
        {
            try
            {
                timer.Stop();


                Tracked.TrackingState = Tracked.TimerState.Stopped;
                Tracked.TrackingTimer.Stop();
                Tracked.TrackingEnd = DateTime.Now;
                Tracked.TrackingPaused.Stop();

                try
                {
                    if (Tracked.TrackerActivityName.Trim() == string.Empty)
                    {
                        return;
                    }

                    var trackerProject    = Structures.Common.GetProjectFromId(Tracked.TrackerProjectId);
                    var clientProfileInfo = Structures.Common.GetClientFromId(trackerProject.ClientId);

                    #region  |  add existing activity   |

                    var trackerProjectActivity = new Structures.TrackerProjectActivity
                    {
                        Id   = Guid.NewGuid().ToString(),
                        Name = Tracked.TrackerActivityName
                    };


                    #region  |  get activity type  |
                    var activitiesType = Tracked.Preferences.ActivitiesTypes[0];
                    Structures.ClientActivityType clientActivityType = null;
                    foreach (var activityType in Tracked.Preferences.ActivitiesTypes)
                    {
                        if (string.Compare(activityType.Name, Tracked.TrackerActivityType,
                                           StringComparison.OrdinalIgnoreCase) != 0)
                        {
                            continue;
                        }
                        activitiesType = activityType;
                        if (clientProfileInfo != null)
                        {
                            foreach (var type in clientProfileInfo.ClientActivities)
                            {
                                if (activitiesType.Id != type.IdActivity)
                                {
                                    continue;
                                }

                                if (type.Activated)
                                {
                                    clientActivityType = type;
                                }
                                break;
                            }
                        }
                        break;
                    }
                    #endregion


                    trackerProjectActivity.ActivityTypeId   = activitiesType.Id;
                    trackerProjectActivity.ActivityTypeName = activitiesType.Name;
                    if (clientActivityType != null)
                    {
                        trackerProjectActivity.ActivityTypeClientId = clientActivityType.Id;
                    }

                    trackerProjectActivity.Billable = activitiesType.Billable;
                    if (clientProfileInfo != null)
                    {
                        trackerProjectActivity.ClientId   = clientProfileInfo.Id;
                        trackerProjectActivity.ClientName = clientProfileInfo.ClientName;
                    }
                    trackerProjectActivity.Currency  = activitiesType.Currency;
                    trackerProjectActivity.DateStart = Tracked.TrackingStart;
                    Tracked.TrackingEnd            = DateTime.Now;
                    trackerProjectActivity.DateEnd = Tracked.TrackingEnd;

                    trackerProjectActivity.Description          = activitiesType.Description;
                    trackerProjectActivity.HourlyRate           = activitiesType.HourlyRate;
                    trackerProjectActivity.HourlyRateAdjustment = 0;
                    trackerProjectActivity.Invoiced             = false;
                    trackerProjectActivity.InvoicedDate         = Structures.Common.DateNull;


                    trackerProjectActivity.Quantity = Convert.ToDecimal(trackerProjectActivity.DateEnd.Subtract(trackerProjectActivity.DateStart).TotalHours);
                    var quantityElapsed = Convert.ToDecimal(Math.Round(Tracked.TrackingTimer.Elapsed.TotalHours, 3));
                    if (quantityElapsed < trackerProjectActivity.Quantity)
                    {
                        trackerProjectActivity.Quantity = quantityElapsed;
                    }


                    trackerProjectActivity.Status               = @"New";
                    trackerProjectActivity.Total                = Math.Round(trackerProjectActivity.Quantity * trackerProjectActivity.HourlyRate, 2);
                    trackerProjectActivity.TrackerProjectId     = trackerProject.Id;
                    trackerProjectActivity.TrackerProjectName   = trackerProject.Name;
                    trackerProjectActivity.TrackerProjectStatus = trackerProject.ProjectStatus;

                    if (Tracked.Preferences.TrackerConfirmActivities)
                    {
                        var trackProjectActivity = new Dialogs.TrackProjectActivity();


                        var trackerProjects = new List <Structures.TrackerProject> {
                            trackerProject
                        };


                        trackerProjectActivity.TrackerProjectId     = trackerProject.Id;
                        trackerProjectActivity.TrackerProjectName   = trackerProject.Name;
                        trackerProjectActivity.TrackerProjectStatus = trackerProject.ProjectStatus;


                        trackProjectActivity.Project  = trackerProject;
                        trackProjectActivity.Projects = trackerProjects;
                        trackProjectActivity.Activity = trackerProjectActivity;


                        trackProjectActivity.IsEdit = true;
                        trackProjectActivity.ShowDialog();
                        if (!trackProjectActivity.Saved)
                        {
                            return;
                        }

                        trackerProjectActivity.ActivityTypeClientId = trackProjectActivity.Activity.ActivityTypeClientId;
                        trackerProjectActivity.ActivityTypeId       = trackProjectActivity.Activity.ActivityTypeId;
                        trackerProjectActivity.ActivityTypeName     = trackProjectActivity.Activity.ActivityTypeName;

                        trackerProjectActivity.Billable   = trackProjectActivity.Activity.Billable;
                        trackerProjectActivity.ClientId   = trackProjectActivity.Activity.ClientId;
                        trackerProjectActivity.ClientName = trackProjectActivity.Activity.ClientName;

                        trackerProjectActivity.Currency  = trackProjectActivity.Activity.Currency;
                        trackerProjectActivity.DateEnd   = trackProjectActivity.Activity.DateEnd;
                        trackerProjectActivity.DateStart = trackProjectActivity.Activity.DateStart;

                        trackerProjectActivity.Description = trackProjectActivity.Activity.Description;

                        trackerProjectActivity.HourlyRate           = trackProjectActivity.Activity.HourlyRate;
                        trackerProjectActivity.HourlyRateAdjustment = trackProjectActivity.Activity.HourlyRateAdjustment;

                        trackerProjectActivity.Invoiced     = trackProjectActivity.Activity.Invoiced;
                        trackerProjectActivity.InvoicedDate = trackProjectActivity.Activity.InvoicedDate;

                        trackerProjectActivity.Name     = trackProjectActivity.Activity.Name;
                        trackerProjectActivity.Quantity = trackProjectActivity.Activity.Quantity;

                        trackerProjectActivity.TrackerProjectId     = trackProjectActivity.Activity.TrackerProjectId;
                        trackerProjectActivity.TrackerProjectName   = trackProjectActivity.Activity.TrackerProjectName;
                        trackerProjectActivity.TrackerProjectStatus = trackProjectActivity.Activity.TrackerProjectStatus;

                        trackerProjectActivity.Total = trackProjectActivity.Activity.Total;

                        trackerProject.ProjectActivities.Add(trackerProjectActivity);

                        Structures.SettingsSerializer.SaveSettings(Tracked.Preferences);

                        Tracked.TarckerCheckNewActivityAdded = true;
                        Tracked.TarckerCheckNewActivityId    = trackerProjectActivity.Id;
                    }
                    else
                    {
                        trackerProject.ProjectActivities.Add(trackerProjectActivity);

                        Structures.SettingsSerializer.SaveSettings(Tracked.Preferences);

                        Tracked.TarckerCheckNewActivityAdded = true;
                        Tracked.TarckerCheckNewActivityId    = trackerProjectActivity.Id;
                    }

                    #endregion
                }
                finally
                {
                    Tracked.Reset();
                }
            }
            finally
            {
                Tracked.TrackingIsDirtyC0 = true;
                Tracked.TrackingIsDirtyC1 = true;
                Tracked.TrackingIsDirtyC2 = true;

                timer.Start();
            }
        }