/// <summary>
 /// Releases the viewmodel instance and gives the factory the chance to clean up any related services
 /// </summary>
 /// <param name="viewModelInstance"></param>
 public void Release(IRibbonViewModel viewModelInstance)
 {
     // ReSharper disable once SuspiciousTypeConversion.Global
     var disposable = viewModelInstance as IDisposable;
     if (disposable != null)
         disposable.Dispose();
 }
        public void RegisterCustomTaskPanes(IRibbonViewModel ribbonViewModel, object view, object viewContext)
        {
            var registersCustomTaskPanes = ribbonViewModel as IRegisterCustomTaskPane;
            if (registersCustomTaskPanes == null) return;

            if (!registrationInfo.ContainsKey(ribbonViewModel))
            {
                registersCustomTaskPanes.RegisterTaskPanes((controlFactory, title, initiallyVisible) =>
                {
                    var taskPaneRegistrationInfo = new TaskPaneRegistrationInfo(controlFactory, title);
                    if (!registrationInfo.ContainsKey(ribbonViewModel))
                        registrationInfo.Add(ribbonViewModel, new List<TaskPaneRegistrationInfo>());
                    registrationInfo[ribbonViewModel].Add(taskPaneRegistrationInfo);

                    var taskPane = Register(view, taskPaneRegistrationInfo);
                    var taskPaneAdapter = new OneToManyCustomTaskPaneAdapter(taskPane, viewContext)
                    {
                        Visible = initiallyVisible
                    };

                    if (!ribbonTaskPanes.ContainsKey(ribbonViewModel))
                        ribbonTaskPanes.Add(ribbonViewModel, new List<OneToManyCustomTaskPaneAdapter>());

                    if (!windowToTaskPaneLookup.ContainsKey(view))
                        windowToTaskPaneLookup.Add(view, new List<IRibbonViewModel>());

                    ribbonTaskPanes[ribbonViewModel].Add(taskPaneAdapter);
                    windowToTaskPaneLookup[view].Add(ribbonViewModel);
                    return taskPaneAdapter;
                });
            }
            else
            {
                var adapters = ribbonTaskPanes[ribbonViewModel];
                foreach (var taskPaneAdapter in adapters)
                {
                    if (!taskPaneAdapter.ViewRegistered(view))
                    {
                        foreach (var taskPaneRegistrationInfo in registrationInfo[ribbonViewModel])
                        {
                            taskPaneAdapter.Add(Register(view, taskPaneRegistrationInfo));
                        }
                    }
                    else
                        taskPaneAdapter.Refresh(view);
                }
            }

            foreach (var oneToManyCustomTaskPaneAdapter in windowToTaskPaneLookup[view]
                .Except(new[] { ribbonViewModel })
                .SelectMany(viewModelToHide => ribbonTaskPanes[viewModelToHide]))
            {
                oneToManyCustomTaskPaneAdapter.HideIfVisible();
            }

            foreach (var toRestore in ribbonTaskPanes[ribbonViewModel])
            {
                toRestore.RestoreIfNeeded();
            }
        }
        /// <summary>
        /// Releases the viewmodel instance and gives the factory the chance to clean up any related services
        /// </summary>
        /// <param name="viewModelInstance"></param>
        public void Release(IRibbonViewModel viewModelInstance)
        {
            var lifetimeScope = lifetimeScopeLookups[viewModelInstance];

            lifetimeScopeLookups.Remove(viewModelInstance);
            lifetimeScope.Dispose();
        }
예제 #4
0
 void InvalidateRibbonForViewModel(IRibbonViewModel viewModel)
 {
     if (viewModel.RibbonUi == null) return;
     foreach (var targets in notifyChangeTargetLookup[viewModel.GetType()])
     {
         viewModel.RibbonUi.InvalidateControl(targets.Value);
     }
 }
        public void Invoke(IRibbonControl control, Expression <Action> caller, params object[] parameters)
        {
            try
            {
                var            methodName     = caller.GetMethodName();
                CallbackTarget callbackTarget =
                    vstoContribContext.TagToCallbackTargetLookup[control.Tag + methodName];

                var view = (object)control.Context;
                IRibbonViewModel viewModelInstance = ribbonViewModelResolver.ResolveInstanceFor(view);
                VstoContribLog.Debug(l => l("Ribbon callback {0} being invoked on {1} (View: {2}, ViewModel: {3})",
                                            methodName, control.Id, view.ToLogFormat(), viewModelInstance.ToLogFormat()));

                Type         type     = viewModelInstance.GetType();
                PropertyInfo property = type.GetProperty(callbackTarget.Method);

                if (property != null)
                {
                    type.InvokeMember(callbackTarget.Method,
                                      BindingFlags.SetProperty,
                                      null,
                                      viewModelInstance,
                                      new[]
                    {
                        parameters.Single()
                    });
                }
                else
                {
                    type.InvokeMember(callbackTarget.Method,
                                      BindingFlags.InvokeMethod,
                                      null,
                                      viewModelInstance,
                                      new[]
                    {
                        control
                    }
                                      .Concat(parameters)
                                      .ToArray());
                }
            }
            catch (TargetInvocationException e)
            {
                var innerEx = e.InnerException;
                PreserveStackTrace(innerEx);
                if (vstoContribContext.ErrorHandlers.Count == 0)
                {
                    Trace.TraceError(innerEx.ToString());
                }

                var handled = vstoContribContext.ErrorHandlers.Any(errorHandler => errorHandler.Handle(innerEx));

                if (!handled)
                {
                    throw innerEx;
                }
            }
        }
예제 #6
0
        internal RibbonView(IRibbonViewModel ribbonViewModel)
        {
            InitializeComponent();

            if (!DesignerProperties.GetIsInDesignMode(this))
            {
                DataContext = ribbonViewModel ?? ServiceLocator.Current.GetInstance<IRibbonViewModel>();
            }
        }
        private void ListenForINotifyPropertyChanged(IRibbonViewModel ribbonViewModel)
        {
            var notifiesOfPropertyChanged = ribbonViewModel as INotifyPropertyChanged;

            if (notifiesOfPropertyChanged != null)
            {
                notifiesOfPropertyChanged.PropertyChanged += NotifiesOfPropertyChangedPropertyChanged;
            }
        }
예제 #8
0
        /// <summary>
        /// Releases the viewmodel instance and gives the factory the chance to clean up any related services
        /// </summary>
        /// <param name="viewModelInstance"></param>
        public void Release(IRibbonViewModel viewModelInstance)
        {
            // ReSharper disable once SuspiciousTypeConversion.Global
            var disposable = viewModelInstance as IDisposable;

            if (disposable != null)
            {
                disposable.Dispose();
            }
        }
예제 #9
0
        public void Invoke(IRibbonControl control, Expression <Action> caller, params object[] parameters)
        {
            try
            {
                CallbackTarget callbackTarget =
                    vstoContribContext.TagToCallbackTargetLookup[control.Tag + caller.GetMethodName()];

                IRibbonViewModel viewModelInstance = ribbonViewModelResolver.ResolveInstanceFor(control.Context);

                Type         type     = viewModelInstance.GetType();
                PropertyInfo property = type.GetProperty(callbackTarget.Method);

                if (property != null)
                {
                    type.InvokeMember(callbackTarget.Method,
                                      BindingFlags.SetProperty,
                                      null,
                                      viewModelInstance,
                                      new[]
                    {
                        parameters.Single()
                    });
                }
                else
                {
                    type.InvokeMember(callbackTarget.Method,
                                      BindingFlags.InvokeMethod,
                                      null,
                                      viewModelInstance,
                                      new[]
                    {
                        control
                    }
                                      .Concat(parameters)
                                      .ToArray());
                }
            }
            catch (TargetInvocationException e)
            {
                var innerEx = e.InnerException;
                PreserveStackTrace(innerEx);
                if (vstoContribContext.ErrorHandlers.Count == 0)
                {
                    Trace.TraceError(innerEx.ToString());
                }

                var handled = vstoContribContext.ErrorHandlers.Any(errorHandler => errorHandler.Handle(innerEx));

                if (!handled)
                {
                    throw innerEx;
                }
            }
        }
        public void RegisterCustomTaskPanes(IRibbonViewModel ribbonViewModel, object view, object viewContext)
        {
            var registersCustomTaskPanes = ribbonViewModel as IRegisterCustomTaskPane;

            if (registersCustomTaskPanes == null)
            {
                return;
            }

            if (!registrationInfo.ContainsKey(ribbonViewModel))
            {
                registersCustomTaskPanes.RegisterTaskPanes((controlFactory, title, initiallyVisible) =>
                {
                    var taskPaneRegistrationInfo = new TaskPaneRegistrationInfo(controlFactory, title);
                    if (!registrationInfo.ContainsKey(ribbonViewModel))
                    {
                        registrationInfo.Add(ribbonViewModel, new List <TaskPaneRegistrationInfo>());
                    }
                    registrationInfo[ribbonViewModel].Add(taskPaneRegistrationInfo);

                    var taskPane        = Register(view, taskPaneRegistrationInfo);
                    var taskPaneAdapter = new OneToManyCustomTaskPaneAdapter(taskPane, viewContext)
                    {
                        Visible = initiallyVisible
                    };

                    if (!ribbonTaskPanes.ContainsKey(ribbonViewModel))
                    {
                        ribbonTaskPanes.Add(ribbonViewModel, new List <OneToManyCustomTaskPaneAdapter>());
                    }

                    ribbonTaskPanes[ribbonViewModel].Add(taskPaneAdapter);
                    return(taskPaneAdapter);
                });
            }
            else
            {
                var adapters = ribbonTaskPanes[ribbonViewModel];
                foreach (var taskPaneAdapter in adapters)
                {
                    if (!taskPaneAdapter.ViewRegistered(view))
                    {
                        foreach (var taskPaneRegistrationInfo in registrationInfo[ribbonViewModel])
                        {
                            taskPaneAdapter.Add(Register(view, taskPaneRegistrationInfo));
                        }
                    }
                    else
                    {
                        taskPaneAdapter.Refresh(view);
                    }
                }
            }
        }
 void InvalidateRibbonForViewModel(IRibbonViewModel viewModel)
 {
     if (viewModel.RibbonUi == null)
     {
         return;
     }
     foreach (var targets in notifyChangeTargetLookup[viewModel.GetType()])
     {
         viewModel.RibbonUi.InvalidateControl(targets.Value);
     }
 }
예제 #12
0
        public void CleanupViewModel(IRibbonViewModel viewModelInstance)
        {
            if (!ribbonTaskPanes.ContainsKey(viewModelInstance))
            {
                return;
            }
            var adaptersForViewModel = ribbonTaskPanes[viewModelInstance];

            ribbonTaskPanes.Remove(viewModelInstance);
            foreach (var oneToManyCustomTaskPaneAdapter in adaptersForViewModel)
            {
                oneToManyCustomTaskPaneAdapter.Dispose();
            }
        }
        public DefaultRibbonView(IRibbonViewModel viewModel)
        {
            Helpers.NullCheck(viewModel);

            this.viewModel   = viewModel;
            this.DataContext = viewModel;
            viewModel.RibbonTabs.CollectionChanged          += RibbonTabs_CollectionChanged;
            viewModel.SelectionRibbonTabs.CollectionChanged += SelectionRibbonTabs_CollectionChanged;
            viewModel.PropertyChanged += viewModel_PropertyChanged;

            ribbonTabsCollectionChanged();

            InitializeComponent();
        }
        public object InvokeGet(IRibbonControl control, Expression <Action> caller, params object[] parameters)
        {
            if (control.Context == null)
            {
                return(null);
            }

            var            methodName     = caller.GetMethodName();
            CallbackTarget callbackTarget = vstoContribContext.TagToCallbackTargetLookup[control.Tag + methodName];

            var view = (object)control.Context;
            IRibbonViewModel viewModelInstance = ribbonViewModelResolver.ResolveInstanceFor(view);

            VstoContribLog.Debug(l => l("Ribbon callback {0} being invoked on {1} (View: {2}, ViewModel: {3})",
                                        methodName, control.Id, view.ToLogFormat(), viewModelInstance.ToLogFormat()));

            Type         type     = viewModelInstance.GetType();
            PropertyInfo property = type.GetProperty(callbackTarget.Method);

            if (property != null)
            {
                return(type.InvokeMember(callbackTarget.Method,
                                         BindingFlags.GetProperty,
                                         null,
                                         viewModelInstance,
                                         null));
            }

            try
            {
                return(type.InvokeMember(callbackTarget.Method,
                                         BindingFlags.InvokeMethod,
                                         null,
                                         viewModelInstance,
                                         new[]
                {
                    control
                }
                                         .Concat(parameters)
                                         .ToArray()));
            }
            catch (MissingMethodException)
            {
                throw new InvalidOperationException(
                          string.Format("Expecting method with signature: {0}.{1}(IRibbonControl control)",
                                        type.Name,
                                        callbackTarget.Method));
            }
        }
예제 #15
0
        public MainViewModel(INavigationViewModel navigationViewModel, IProjectDetailViewModel projectDetailViewModel, IRibbonViewModel ribbonViewModel, IEventAggregator eventAggregator, IMessageDialogService messageDialogService)
        {
            _navigationViewModel  = navigationViewModel;
            _ribbonViewModel      = ribbonViewModel;
            _messageDialogService = messageDialogService;
            _eventAggregator      = eventAggregator;

            ProjectDetailViewModel = projectDetailViewModel;

            _eventAggregator.GetEvent <AddDetailEvent>().Subscribe(OnAddDetailExecute);
            _eventAggregator.GetEvent <CancelDetailEvent>().Subscribe(OnCancelAddDetail);
            _eventAggregator.GetEvent <EditDetailEvent>().Subscribe(OnEditDetailExecute);

            _eventAggregator.GetEvent <AfterDetailSavedEvent>().Subscribe(OnAfterDetailSaved);
        }
예제 #16
0
        public void RegisterCustomTaskPanes(IRibbonViewModel ribbonViewModel, object view, object viewContext)
        {
            var registersCustomTaskPanes = ribbonViewModel as IRegisterCustomTaskPane;
            if (registersCustomTaskPanes == null) return;

            if (!registrationInfo.ContainsKey(ribbonViewModel))
            {
                registersCustomTaskPanes.RegisterTaskPanes(
                    (controlFactory, title, initiallyVisible) =>
                        {
                            var taskPaneRegistrationInfo = new TaskPaneRegistrationInfo(controlFactory, title);
                            if (!registrationInfo.ContainsKey(ribbonViewModel))
                                registrationInfo.Add(ribbonViewModel, new List<TaskPaneRegistrationInfo>());
                            registrationInfo[ribbonViewModel].Add(taskPaneRegistrationInfo);

                            var taskPane = Register(view, taskPaneRegistrationInfo);
                            var taskPaneAdapter = new OneToManyCustomTaskPaneAdapter(taskPane, viewContext)
                            {
                                Visible = initiallyVisible
                            };

                            if (!ribbonTaskPanes.ContainsKey(ribbonViewModel))
                                ribbonTaskPanes.Add(ribbonViewModel, new List<OneToManyCustomTaskPaneAdapter>());

                            ribbonTaskPanes[ribbonViewModel].Add(taskPaneAdapter);
                            return taskPaneAdapter;
                        });
            }
            else
            {
                var adapters = ribbonTaskPanes[ribbonViewModel];
                foreach (var taskPaneAdapter in adapters)
                {
                    if (!taskPaneAdapter.ViewRegistered(view))
                    {
                        foreach (var taskPaneRegistrationInfo in registrationInfo[ribbonViewModel])
                        {
                            taskPaneAdapter.Add(Register(view, taskPaneRegistrationInfo));
                        }
                    }
                    else
                        taskPaneAdapter.Refresh(view);
                }
            }
        }
예제 #17
0
        IRibbonViewModel GetOrCreateViewModel(NewViewEventArgs e)
        {
            if (!ribbonTypeLookup.ContainsKey(e.RibbonType))
            {
                return(null);
            }
            if (contextToViewModelLookup.ContainsKey(e.ViewContext))
            {
                //Tell viewmodel there is a new view active
                var ribbonViewModel = contextToViewModelLookup[e.ViewContext];
                ribbonViewModel.CurrentView = e.ViewInstance;
                return(ribbonViewModel);
            }

            currentlyLoadingRibbon = e.RibbonType;
            IRibbonViewModel buildViewModel = BuildViewModel(e.RibbonType, e.ViewInstance, e.ViewContext);

            contextToViewModelLookup.Add(e.ViewContext, buildViewModel);
            return(buildViewModel);
        }
        IRibbonViewModel GetOrCreateViewModel(string ribbonType, object viewContext, object viewInstance)
        {
            if (!ribbonTypeLookup.ContainsKey(ribbonType))
            {
                return(null);
            }
            if (contextToViewModelLookup.ContainsKey(viewContext))
            {
                //Tell viewmodel there is a new view active
                var ribbonViewModel = contextToViewModelLookup[viewContext];
                VstoContribLog.Debug(_ => _("ViewModel {0} found for context {1}", ribbonViewModel.ToLogFormat(), viewContext.ToLogFormat()));
                ribbonViewModel.CurrentView = viewInstance;
                return(ribbonViewModel);
            }

            currentlyLoadingRibbon = ribbonType;
            IRibbonViewModel buildViewModel = BuildViewModel(ribbonType, viewInstance, viewContext);

            contextToViewModelLookup.Add(viewContext, buildViewModel);
            return(buildViewModel);
        }
예제 #19
0
        public object InvokeGet(IRibbonControl control, Expression <Action> caller, params object[] parameters)
        {
            CallbackTarget callbackTarget = vstoContribContext.TagToCallbackTargetLookup[control.Tag + caller.GetMethodName()];

            IRibbonViewModel viewModelInstance = ribbonViewModelResolver.ResolveInstanceFor(control.Context);

            Type         type     = viewModelInstance.GetType();
            PropertyInfo property = type.GetProperty(callbackTarget.Method);

            if (property != null)
            {
                return(type.InvokeMember(callbackTarget.Method,
                                         BindingFlags.GetProperty,
                                         null,
                                         viewModelInstance,
                                         null));
            }

            try
            {
                return(type.InvokeMember(callbackTarget.Method,
                                         BindingFlags.InvokeMethod,
                                         null,
                                         viewModelInstance,
                                         new[]
                {
                    control
                }
                                         .Concat(parameters)
                                         .ToArray()));
            }
            catch (MissingMethodException)
            {
                throw new InvalidOperationException(
                          string.Format("Expecting method with signature: {0}.{1}(IRibbonControl control)",
                                        type.Name,
                                        callbackTarget.Method));
            }
        }
예제 #20
0
 public RibbonView(IRibbonViewModel viewModel)
 {
     DataContext = viewModel;
     InitializeComponent();
 }
 protected AbstractRibbonTabModel(IRibbonViewModel viewModel, IReadOnlyList <ICanInvalidate> models)
 {
     ViewModel = viewModel;
     Models    = models;
 }
 public void CleanupViewModel(IRibbonViewModel viewModelInstance)
 {
     if (!ribbonTaskPanes.ContainsKey(viewModelInstance)) return;
     var adaptersForViewModel = ribbonTaskPanes[viewModelInstance];
     ribbonTaskPanes.Remove(viewModelInstance);
     foreach (var oneToManyCustomTaskPaneAdapter in adaptersForViewModel)
     {
         oneToManyCustomTaskPaneAdapter.Dispose();
     }
 }
 /// <summary>
 /// Releases the viewmodel instance and gives the factory the chance to clean up any related services
 /// </summary>
 /// <param name="viewModelInstance"></param>
 public void Release(IRibbonViewModel viewModelInstance)
 {
     var lifetimeScope = lifetimeScopeLookups[viewModelInstance];
     lifetimeScopeLookups.Remove(viewModelInstance);
     lifetimeScope.Dispose();
 }
예제 #24
0
 public void Release(IRibbonViewModel viewModelInstance)
 {
 }
예제 #25
0
 protected AbstractRibbonGroupModel(IRibbonViewModel viewModel, string viewModelName, IStrings strings)
     : this(viewModel?.GetControl <GroupVM>(viewModelName), strings)
 {
 }
예제 #26
0
 private void ListenForINotifyPropertyChanged(IRibbonViewModel ribbonViewModel)
 {
     var notifiesOfPropertyChanged = ribbonViewModel as INotifyPropertyChanged;
     if (notifiesOfPropertyChanged != null)
     {
         notifiesOfPropertyChanged.PropertyChanged += NotifiesOfPropertyChangedPropertyChanged;
     }
 }
 public void Release(IRibbonViewModel viewModelInstance)
 {
 }
예제 #28
0
        public void RegisterCustomTaskPanes(IRibbonViewModel ribbonViewModel, object view, object viewContext)
        {
            var registersCustomTaskPanes = ribbonViewModel as IRegisterCustomTaskPane;

            if (registersCustomTaskPanes == null)
            {
                return;
            }

            if (!registrationInfo.ContainsKey(ribbonViewModel))
            {
                registersCustomTaskPanes.RegisterTaskPanes((controlFactory, title, initiallyVisible) =>
                {
                    var taskPaneRegistrationInfo = new TaskPaneRegistrationInfo(controlFactory, title);
                    if (!registrationInfo.ContainsKey(ribbonViewModel))
                    {
                        registrationInfo.Add(ribbonViewModel, new List <TaskPaneRegistrationInfo>());
                    }
                    registrationInfo[ribbonViewModel].Add(taskPaneRegistrationInfo);

                    var taskPane        = Register(view, taskPaneRegistrationInfo);
                    var taskPaneAdapter = new OneToManyCustomTaskPaneAdapter(taskPane, viewContext)
                    {
                        Visible = initiallyVisible
                    };

                    if (!ribbonTaskPanes.ContainsKey(ribbonViewModel))
                    {
                        ribbonTaskPanes.Add(ribbonViewModel, new List <OneToManyCustomTaskPaneAdapter>());
                    }

                    if (!windowToTaskPaneLookup.ContainsKey(view))
                    {
                        windowToTaskPaneLookup.Add(view, new List <IRibbonViewModel>());
                    }

                    ribbonTaskPanes[ribbonViewModel].Add(taskPaneAdapter);
                    windowToTaskPaneLookup[view].Add(ribbonViewModel);
                    return(taskPaneAdapter);
                });
            }
            else
            {
                var adapters = ribbonTaskPanes[ribbonViewModel];
                foreach (var taskPaneAdapter in adapters)
                {
                    if (!taskPaneAdapter.ViewRegistered(view))
                    {
                        foreach (var taskPaneRegistrationInfo in registrationInfo[ribbonViewModel])
                        {
                            taskPaneAdapter.Add(Register(view, taskPaneRegistrationInfo));
                        }
                    }
                    else
                    {
                        taskPaneAdapter.Refresh(view);
                    }
                }
            }

            foreach (var oneToManyCustomTaskPaneAdapter in windowToTaskPaneLookup[view]
                     .Except(new[] { ribbonViewModel })
                     .SelectMany(viewModelToHide => ribbonTaskPanes[viewModelToHide]))
            {
                oneToManyCustomTaskPaneAdapter.HideIfVisible();
            }

            foreach (var toRestore in ribbonTaskPanes[ribbonViewModel])
            {
                toRestore.RestoreIfNeeded();
            }
        }
 public CrudGroupControllerDependencies(IRibbonControlFactory ribbonControlFactory, IRibbonViewModel ribbonViewModel, IRibbonTabFactory ribbonTabFactory)
 {
     RibbonControlFactory = ribbonControlFactory;
     RibbonViewModel = ribbonViewModel;
     RibbonTabFactory = ribbonTabFactory;
 }