Ejemplo n.º 1
0
        /// <summary>
        /// Creates a square image and attaches an event handler to the layout changed event that
        /// adds the the square in the upper right-hand corner of the TextView via the adornment layer
        /// </summary>
        /// <param name="view">The <see cref="IWpfTextView"/> upon which the adornment will be drawn</param>
        public SaveAllTheTimeAdornment(IWpfTextView view, IVisualStudioOps vsOps)
        {
            _view           = view;
            _adornmentLayer = view.GetAdornmentLayer("SaveAllTheTimeAdornment");

            var filePath = getFilePathFromView(_view);

            if (shouldSuppressAdornment(filePath))
            {
                _inner = Disposable.Empty;
                return;
            }

            var commitControl = new CommitHintView()
            {
                ViewModel = new CommitHintViewModel(filePath, vsOps, settings),
            };

            var disp = new CompositeDisposable();

            var sizeChanged = Observable.Merge(
                Observable.FromEventPattern <EventHandler, EventArgs>(x => _view.ViewportHeightChanged += x, x => _view.ViewportHeightChanged -= x),
                Observable.FromEventPattern <EventHandler, EventArgs>(x => _view.ViewportWidthChanged  += x, x => _view.ViewportWidthChanged -= x));

            var hasAdded = false;

            disp.Add(sizeChanged.Subscribe(__ => {
                if (!hasAdded)
                {
                    _adornmentLayer.AddAdornment(AdornmentPositioningBehavior.ViewportRelative, null, null, commitControl, null);
                    hasAdded = true;
                }

                // NB: The scheduling is to get around initialization where ActualXXX is zero
                var action = new Action <double>(_ => {
                    Canvas.SetLeft(commitControl, _view.ViewportRight - commitControl.ActualWidth);
                    Canvas.SetTop(commitControl, _view.ViewportBottom - commitControl.ActualHeight);
                });

                if (commitControl.ActualWidth > 1)
                {
                    action(commitControl.ActualWidth);
                }
                else
                {
                    commitControl.WhenAny(x => x.ActualWidth, x => x.Value)
                    .Where(x => x > 1)
                    .Take(1)
                    .Subscribe(action);
                }
            }));

            disp.Add(Disposable.Create(() => _adornmentLayer.RemoveAllAdornments()));

            disp.Add(Observable.FromEventPattern <EventHandler, EventArgs>(x => _view.Closed += x, x => _view.Closed -= x)
                     .Subscribe(_ => Dispose()));

            _inner = disp;
            disp.Add(commitControl.ViewModel);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Creates a square image and attaches an event handler to the layout changed event that
        /// adds the the square in the upper right-hand corner of the TextView via the adornment layer
        /// </summary>
        /// <param name="view">The <see cref="IWpfTextView"/> upon which the adornment will be drawn</param>
        public SaveAllTheTimeAdornment(IWpfTextView view, IVisualStudioOps vsOps)
        {
            _view = view;
            _adornmentLayer = view.GetAdornmentLayer("SaveAllTheTimeAdornment");

            var filePath = getFilePathFromView(_view);
            if (shouldSuppressAdornment(filePath)) {
                _inner = Disposable.Empty;
                return;
            }

            var commitControl = new CommitHintView() {
                ViewModel = new CommitHintViewModel(filePath, vsOps, settings),
            };

            var disp = new CompositeDisposable();

            var sizeChanged = Observable.Merge(
                Observable.FromEventPattern<EventHandler, EventArgs>(x => _view.ViewportHeightChanged += x, x => _view.ViewportHeightChanged -= x),
                Observable.FromEventPattern<EventHandler, EventArgs>(x => _view.ViewportWidthChanged += x, x => _view.ViewportWidthChanged -= x));

            var hasAdded = false;
            disp.Add(sizeChanged.Subscribe(__ => {
                if (!hasAdded) {
                    _adornmentLayer.AddAdornment(AdornmentPositioningBehavior.ViewportRelative, null, null, commitControl, null);
                    hasAdded = true;
                }

                // NB: The scheduling is to get around initialization where ActualXXX is zero
                var action = new Action<double>(_ => {
                    Canvas.SetLeft(commitControl, _view.ViewportRight - commitControl.ActualWidth);
                    Canvas.SetTop(commitControl, _view.ViewportBottom - commitControl.ActualHeight);
                });

                if (commitControl.ActualWidth > 1) {
                    action(commitControl.ActualWidth);
                } else {
                    commitControl.WhenAny(x => x.ActualWidth, x => x.Value)
                        .Where(x => x > 1)
                        .Take(1)
                        .Subscribe(action);
                }
            }));

            disp.Add(Disposable.Create(() => _adornmentLayer.RemoveAllAdornments()));

            disp.Add(Observable.FromEventPattern<EventHandler, EventArgs>(x => _view.Closed += x, x => _view.Closed -= x)
                .Subscribe(_ => Dispose()));

            _inner = disp;
            disp.Add(commitControl.ViewModel);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Creates a square image and attaches an event handler to the layout changed event that
        /// adds the the square in the upper right-hand corner of the TextView via the adornment layer
        /// </summary>
        /// <param name="view">The <see cref="IWpfTextView"/> upon which the adornment will be drawn</param>
        public SaveAllTheTimeAdornment(IWpfTextView view, IVisualStudioOps vsOps)
        {
            _view = view;
            _adornmentLayer = view.GetAdornmentLayer("SaveAllTheTimeAdornment");

            var commitControl = new CommitHintView() {
                ViewModel = new CommitHintViewModel(getFilePathFromView(_view), vsOps, settings),
            };

            var disp = new CompositeDisposable();

            var sizeChanged = Observable.Merge(
                Observable.FromEventPattern<EventHandler, EventArgs>(x => _view.ViewportHeightChanged += x, x => _view.ViewportHeightChanged -= x),
                Observable.FromEventPattern<EventHandler, EventArgs>(x => _view.ViewportWidthChanged += x, x => _view.ViewportWidthChanged -= x));

            var hasAdded = false;
            disp.Add(sizeChanged.Subscribe(x => {
                if (!hasAdded) {
                    _adornmentLayer.AddAdornment(AdornmentPositioningBehavior.ViewportRelative, null, null, commitControl, null);
                    hasAdded = true;
                }

                // NB: The scheduling is to get around initialization where ActualXXX is zero
                var sched = (commitControl.ActualWidth > 0 ? ImmediateScheduler.Instance : RxApp.MainThreadScheduler);
                sched.Schedule(() => {
                    Canvas.SetLeft(commitControl, _view.ViewportRight - commitControl.ActualWidth);
                    Canvas.SetTop(commitControl, _view.ViewportBottom - commitControl.ActualHeight);
                });
            }));

            disp.Add(Disposable.Create(() => _adornmentLayer.RemoveAllAdornments()));

            disp.Add(Observable.FromEventPattern<EventHandler, EventArgs>(x => _view.Closed += x, x => _view.Closed -= x)
                .Subscribe(_ => Dispose()));

            disp.Add(commitControl.ViewModel);
            _inner = disp;
        }