Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
ModelNodeCommandWrapper.cs
Go to the documentation of this file.
1 // Copyright (c) 2014 Silicon Studio Corp. (http://siliconstudio.co.jp)
2 // This file is distributed under GPL v3. See LICENSE.md for details.
3 using System;
4 using System.Collections.Generic;
5 
6 using SiliconStudio.ActionStack;
7 using SiliconStudio.Presentation.ViewModel;
8 using SiliconStudio.Quantum;
10 
11 namespace SiliconStudio.Presentation.Quantum
12 {
14  {
15  private readonly INodeCommand nodeCommand;
16  private readonly ObservableViewModelService service;
17  private readonly ObservableViewModelIdentifier identifier;
18  private readonly ModelNodePath nodePath;
19  private readonly ModelContainer modelContainer;
20 
21  public override string Name { get { return nodeCommand.Name; } }
22 
23  public override CombineMode CombineMode { get { return nodeCommand.CombineMode; } }
24 
25  public ModelNodeCommandWrapper(IViewModelServiceProvider serviceProvider, INodeCommand nodeCommand, string observableNodePath, ObservableViewModelIdentifier identifier, ModelNodePath nodePath, ModelContainer modelContainer, IEnumerable<IDirtiableViewModel> dirtiables)
26  : base(serviceProvider, dirtiables)
27  {
28  if (nodeCommand == null) throw new ArgumentNullException("nodeCommand");
29  if (modelContainer == null) throw new ArgumentNullException("modelContainer");
30  this.identifier = identifier;
31  this.nodePath = nodePath;
32  this.modelContainer = modelContainer;
33  this.nodeCommand = nodeCommand;
34  service = serviceProvider.Get<ObservableViewModelService>();
35  ObservableNodePath = observableNodePath;
36  }
37 
38  internal IModelNode GetCommandRootNode()
39  {
40  return nodePath.RootNode;
41  }
42 
43  protected override UndoToken Redo(object parameter, bool creatingActionItem)
44  {
45  UndoToken token;
46  var viewModelNode = nodePath.GetNode();
47  if (viewModelNode == null)
48  throw new InvalidOperationException("Unable to retrieve the node on which to apply the redo operation.");
49 
50  var newValue = nodeCommand.Invoke(viewModelNode.Content.Value, viewModelNode.Content.Descriptor, parameter, out token);
51  Refresh(viewModelNode, newValue);
52  return token;
53  }
54 
55  protected override void Undo(object parameter, UndoToken token)
56  {
57  var viewModelNode = nodePath.GetNode();
58  if (viewModelNode == null)
59  throw new InvalidOperationException("Unable to retrieve the node on which to apply the redo operation.");
60 
61  var newValue = nodeCommand.Undo(viewModelNode.Content.Value, viewModelNode.Content.Descriptor, token);
62  Refresh(viewModelNode, newValue);
63  }
64 
65  private void Refresh(IModelNode modelNode, object newValue)
66  {
67  var observableViewModel = service.ViewModelProvider(identifier);
68 
69  if (modelNode == null) throw new ArgumentNullException("modelNode");
70  var observableNode = observableViewModel != null ? observableViewModel.ResolveObservableModelNode(ObservableNodePath, nodePath.RootNode) : null;
71 
72  // If we have an observable node, we use it to set the new value so the UI can be notified at the same time.
73  if (observableNode != null)
74  {
75  observableNode.Value = newValue;
76  observableNode.Owner.NotifyNodeChanged(observableNode.Path);
77  }
78  else
79  {
80  modelNode.Content.Value = newValue;
81  modelContainer.UpdateReferences(modelNode);
82  }
83  }
84  }
85 }
A container used to store models and resolve references between them.
ModelNodeCommandWrapper(IViewModelServiceProvider serviceProvider, INodeCommand nodeCommand, string observableNodePath, ObservableViewModelIdentifier identifier, ModelNodePath nodePath, ModelContainer modelContainer, IEnumerable< IDirtiableViewModel > dirtiables)
CombineMode
An enum that describes what to do with a node or a command when combining view models.
Definition: CombineMode.cs:8
A class that provides various services to ObservableViewModel objects
Base interface for node commands.
Definition: INodeCommand.cs:11
A base class to wrap one or multiple INodeCommand instances into a CancellableCommand.
override UndoToken Redo(object parameter, bool creatingActionItem)
Does or redoes the execution of the command.
The IModelNode interface represents a node in a model object. A model object is represented by a grap...
Definition: IModelNode.cs:16
override void Undo(object parameter, UndoToken token)
Undoes the execution of the command.
Represents a token that stores an unique identifier and an object. This token should be generated by ...
Definition: UndoToken.cs:12
A class describing the path of a node, relative to a root node. The path can cross references...