예제 #1
0
        public void LogNavigationPoint(NavigationPoint point, bool transient = false)
        {
            if (point == null)
            {
                throw new ArgumentNullException(nameof(point));
            }

            var item = new NavigationHistoryItem(point);

            //if the current node's transient but has been around for a while, consider making it permanent
            if (Current == null ||
                (currentIsTransient && DateTime.Now.Subtract(Current.Created).TotalMilliseconds > TRANSIENT_TIMEOUT))
            {
                currentIsTransient = false;
            }

            //if the current point's transient, always replace it
            if (currentIsTransient)
            {
                //collapse down possible extra point in history
                var backOne = history[-1];
                if (backOne != null && point.ShouldReplace(backOne.NavigationPoint))
                {
                    // The new node is the same as the last permanent, so we can discard it
                    history.RemoveCurrent();
                    currentIsTransient = false;
                    item.Dispose();
                }
                else
                {
                    currentIsTransient = transient;
                    history.ReplaceCurrent(item);
                }
            }
            //if the new point wants to replace the old one, let it
            else if (Current != null && !transient && point.ShouldReplace(Current.NavigationPoint))
            {
                history.ReplaceCurrent(item);

                //but in this case, the point should not be transient -- unless the old point was,
                //but that's handled earlier
                currentIsTransient = false;
            }
            //final choice: append the the node
            //BUT only if the existing current node would not want to replace the new node
            else if (Current == null || !Current.NavigationPoint.ShouldReplace(point))
            {
                history.AddPoint(item);
                currentIsTransient = transient;
            }
            else
            {
                item.Dispose();
            }

            OnHistoryChanged();
        }
예제 #2
0
        static NavigationHistoryService()
        {
            IdeApp.Workspace.LastWorkspaceItemClosed += delegate {
                history.Clear();
                OnHistoryChanged();
            };

            IdeApp.Workbench.DocumentClosed += delegate(object sender, DocumentEventArgs e) {
                ClosedDocumentNavigationPoint point = new ClosedDocumentNavigationPoint(
                    e.Document.FileName, IdeApp.Workbench.Documents.IndexOf(IdeApp.Workbench.ActiveDocument)
                    );
                NavigationHistoryItem item = new NavigationHistoryItem(point);
                closedHistory.AddPoint(item);
                OnClosedHistoryChanged();
            };

            //keep nav points up to date
            TextEditorService.LineCountChanged          += LineCountChanged;
            TextEditorService.LineCountChangesCommitted += CommitCountChanges;
            TextEditorService.LineCountChangesReset     += ResetCountChanges;
            IdeApp.Workspace.FileRenamedInProject       += FileRenamed;

            IdeApp.Workbench.ActiveDocumentChanged += ActiveDocChanged;
        }