public void RegisterDocument(Document document)
        {
            try
            {
                document.ContentChanged += document_ContentChanged;
                document.SegmentsConfirmationLevelChanged += document_SegmentsConfirmationLevelChanged;
                var projectInfo = document.Project.GetProjectInfo();

                var trackInfo = _trackingInfos.FirstOrDefault(x => x.FileId == document.ActiveFile.Id);
                if (trackInfo == null)
                {
                    trackInfo = new TrackInfo
                    {
                        FileId = document.ActiveFile.Id,
                        FileName = document.ActiveFile.Name,
                        ProjectId = projectInfo.Id,
                        ProjectName = projectInfo.Name,
                        Language = document.ActiveFile.Language.CultureInfo.Name,
                        FileType = document.ActiveFile.FileTypeId,
                        SegmentTrackInfos = new List<SegmentTrackInfo>()
                    };
                    _trackingInfos.Add(trackInfo);
                }
                ActiveDocument = document;

                _persistance.Save(_trackingInfos);
            }
            catch (Exception exception)
            {
                _logger.Debug(exception, @"Error appeared when UnregisterDocument");
            }
        }
        public void RegisterDocument(Document document)
        {
            try
            {
                document.ContentChanged += document_ContentChanged;
                document.SegmentsConfirmationLevelChanged += document_SegmentsConfirmationLevelChanged;
                var projectInfo = document.Project.GetProjectInfo();

                foreach (var file in document.Files)
                {
                    _logger.Info(string.Format("Registered file: {0}", file.Name));

                    var trackInfo = _trackingInfos.FirstOrDefault(x => x.FileId == file.Id);
                    if (trackInfo == null)
                    {
                        trackInfo = new TrackInfo
                        {
                            FileId = file.Id,
                            FileName = file.Name,
                            ProjectId = projectInfo.Id,
                            ProjectName = projectInfo.Name,
                            Language = file.Language.CultureInfo.Name,
                            FileType = file.FileTypeId
                        };
                        _trackingInfos.Add(trackInfo);
                    }
                }

                ActiveDocument = document;

                _persistance.Save(_trackingInfos);
            }
            catch (Exception exception)
            {
                _logger.Debug(exception, @"Error appeared when RegisterDocument");
                _emailService.SendLogFile();
            }
        }
        private SegmentTrackInfo GetOrCreateSegmentTrackInfo(TrackInfo trackInfo, ISegment targetSegment)
        {
            if (trackInfo.SegmentTrackInfos == null)
            {
                var exceptionMessage =
                    string.Format("SegmentTrackInfos is null for project {0}  and segment {1}!",
                        trackInfo.ProjectName, targetSegment);
                throw new ArgumentNullException(exceptionMessage);
            }

            if (targetSegment == null)
            {
                var exceptionMessage =
                    string.Format("Segment is null for {0}!",
                        trackInfo.ProjectName);
                throw new ArgumentNullException(exceptionMessage);
            }

            if (targetSegment.Properties == null)
            {
                var exceptionMessage =
                    string.Format("Segment properties are null for {0}!",
                        trackInfo.ProjectName);
                throw new ArgumentNullException(exceptionMessage);
            }

            var segment = trackInfo.SegmentTrackInfos.Find(x => x.SegmentId == targetSegment.Properties.Id.Id);

            if (segment == null)
            {
                var segmentId = targetSegment.Properties.Id.Id;

                segment = new SegmentTrackInfo {SegmentId = segmentId};
                trackInfo.SegmentTrackInfos.Add(segment);
            }
            return segment;
        }
        private void CreateUpdateTrackInfo(TrackInfo trackInfo, ISegment targetSegment)
        {
            if (targetSegment == null) return;
            var keyStrokes = KeyboardTracking.Instance.GetCount();
            var segmentText = targetSegment.ToString();

            if (keyStrokes == 0 && segmentText.Length == 0) return;

            var segment = GetOrCreateSegmentTrackInfo(trackInfo, targetSegment);
            var translated = targetSegment.Properties.ConfirmationLevel ==
                                                  ConfirmationLevel.Translated;
            segment.SetTrackInfo(keyStrokes, targetSegment.ToString(), translated);
        }
        private SegmentTrackInfo GetOrCreateSegmentTrackInfo(TrackInfo trackInfo, ISegment targetSegment)
        {
            var segment = trackInfo.SegmentTrackInfos.Find(x => x.SegmentId == targetSegment.Properties.Id.Id);

            if (segment == null)
            {
                var segmentId = targetSegment.Properties.Id.Id;

                segment = new SegmentTrackInfo {SegmentId = segmentId};
                trackInfo.SegmentTrackInfos.Add(segment);
            }
            return segment;
        }