public LinkedDeckTraversalModel(EventQueue dispatcher, Guid id, PresenterModel model, DeckTraversalModel linked) : base(id, linked.Deck) { this.m_EventQueue = dispatcher; this.m_Model = model; this.m_Linked = linked; // TODO: Evaluate whether we need to support other types of DeckTraversalModels. this.m_Unlinked = new SlideDeckTraversalModel(Guid.NewGuid(), linked.Deck); this.m_CurrentChangedDispatcher = new EventQueue.PropertyEventDispatcher(this.m_EventQueue, new PropertyEventHandler(this.HandleCurrentChanged)); this.m_NextChangedDispatcher = new EventQueue.PropertyEventDispatcher(this.m_EventQueue, new PropertyEventHandler(this.HandleNextChanged)); this.m_PreviousChangedDispatcher = new EventQueue.PropertyEventDispatcher(this.m_EventQueue, new PropertyEventHandler(this.HandlePreviousChanged)); this.m_AbsoluteCurrentSlideIndexChangedDispatcher = new EventQueue.PropertyEventDispatcher(this.m_EventQueue, new PropertyEventHandler(this.HandleAbsoluteCurrentSlideIndexChanged)); // Set this.m_Active and register event listeners via UpdateMode. this.m_Mode = DeckTraversalSelector.Linked; this.UpdateMode(DeckTraversalSelector.Linked); // Since UpdateMode doesn't initialize the event listeners like the Mode setter does, we must do this. this.m_CurrentChangedDispatcher.Dispatcher(this, null); this.m_NextChangedDispatcher.Dispatcher(this, null); this.m_PreviousChangedDispatcher.Dispatcher(this, null); this.m_AbsoluteCurrentSlideIndexChangedDispatcher.Dispatcher(this, null); // Watch for changes to the current network association. // When we're associated with an Instructor, we must obey its ForcingStudentNavigationLock policy. this.m_NetworkAssociationChangedDispatcher = new EventQueue.PropertyEventDispatcher(this.m_EventQueue, new PropertyEventHandler(this.HandleNetworkAssociationChanged)); this.m_NetworkAssociationRoleChangedDispatcher = new EventQueue.PropertyEventDispatcher(this.m_EventQueue, new PropertyEventHandler(this.HandleNetworkAssociationRoleChanged)); this.m_ForcingStudentNavigationLockChangedDispatcher = new EventQueue.PropertyEventDispatcher(this.m_EventQueue, new PropertyEventHandler(this.HandleForcingStudentNavigationLockChanged)); this.m_Model.Network.Changed["Association"].Add(this.m_NetworkAssociationChangedDispatcher.Dispatcher); this.m_NetworkAssociationChangedDispatcher.Dispatcher(this, null); }
/// <summary> /// Constructs a listener for changes to the deck traversal /// </summary> /// <param name="sender">The event queue for handling updates</param> /// <param name="presentation">The presentation</param> /// <param name="traversal">The deck traversal we care about </param> public DeckTraversalWebService(SendingQueue sender, PresentationModel presentation, DeckTraversalModel traversal) { this.m_Sender = sender; this.m_Presentation = presentation; this.m_DeckTraversal = traversal; // Create the deck object string deckName = "Untitled Deck"; using (Synchronizer.Lock(this.m_DeckTraversal.SyncRoot)) { using (Synchronizer.Lock(this.m_DeckTraversal.Deck)) { deckName = this.m_DeckTraversal.Deck.HumanName; } } SimpleWebDeck deck = new SimpleWebDeck(); deck.Name = deckName; lock (WebService.Instance.GlobalModel) { WebService.Instance.GlobalModel.Decks.Add(deck); } WebService.Instance.UpdateModel(); this.m_DeckWebService = new DeckWebService(this.m_Sender, this.m_Presentation, this.m_DeckTraversal.Deck); this.m_CurrentChangedDispatcher = new EventQueue.PropertyEventDispatcher(this.m_Sender, new PropertyEventHandler(this.HandleCurrentChanged)); this.m_DeckTraversal.Changed["Current"].Add(this.m_CurrentChangedDispatcher.Dispatcher); }
public SSDeckTraversalNetworkService(SendingQueue sender, PresentationModel presentation, DeckTraversalModel traversal) { this.m_Sender = sender; this.m_Presentation = presentation; this.m_DeckTraversal = traversal; this.m_SSDeckNetworkService = new SSDeckNetworkService(this.m_Sender, this.m_Presentation, this.m_DeckTraversal.Deck); }
private bool m_ForcingStudentNavigationLock; // bool #endregion Fields #region Constructors public InstructorModel(Guid id) : base(id) { this.m_CurrentPresentation = null; this.m_CurrentDeckTraversal = null; this.m_CurrentQuickPoll = null; this.m_AcceptingStudentSubmissions = true; this.m_AcceptingQuickPollSubmissions = false; this.m_ForcingStudentNavigationLock = false; }
public FilmStripContextMenu(DeckTraversalModel traversal, PresenterModel model) { this.m_Model = model; this.m_DeckTraversal = traversal; this.MenuItems.Add(new InsertSlideMenuItem(m_DeckTraversal, this.m_Model)); this.MenuItems.Add(new DuplicateSlideMenuItem(m_DeckTraversal, this.m_Model)); this.MenuItems.Add(new PublicSlideMenuItem(m_DeckTraversal, this.m_Model)); this.MenuItems.Add(new InsertSlidesFromFileMenuItem(m_DeckTraversal, this.m_Model)); this.MenuItems.Add(new RemoveSlideMenuItem(m_DeckTraversal, this.m_Model)); }
public DeckTraversalMessage(DeckTraversalModel traversal, bool addLocalRef) : base(traversal.Id) { if (addLocalRef) this.AddLocalRef( traversal ); using( Synchronizer.Lock( traversal.SyncRoot ) ) { this.Group = traversal.Deck.Group; this.DeckId = traversal.Deck.Id; this.Dispositon = traversal.Deck.Disposition; } }
public DeckTraversalNetworkService(SendingQueue sender, PresentationModel presentation, DeckTraversalModel traversal) { this.m_Sender = sender; this.m_Presentation = presentation; this.m_DeckTraversal = traversal; this.m_DeckNetworkService = new DeckNetworkService(this.m_Sender, this.m_Presentation, this.m_DeckTraversal.Deck); this.m_CurrentChangedDispatcher = new EventQueue.PropertyEventDispatcher(this.m_Sender, new PropertyEventHandler(this.HandleCurrentChanged)); this.m_DeckTraversal.Changed["Current"].Add(this.m_CurrentChangedDispatcher.Dispatcher); }
public DeckTraversalModelAdapter(EventQueue dispatcher, IAdaptee viewer, DeckTraversalModel traversal) { this.m_EventQueue = dispatcher; this.m_DeckTraversal = traversal; this.m_Viewer = viewer; this.m_CurrentEntryChangedDispatcher = new EventQueue.PropertyEventDispatcher(this.m_EventQueue, new PropertyEventHandler(this.HandleCurrentEntryChanged)); this.m_DeckBGColorChangedDispatcher = new EventQueue.PropertyEventDispatcher( this.m_EventQueue, new PropertyEventHandler( this.HandleDeckBGColorChanged ) ); this.m_DeckTraversal.Changed["Current"].Add( this.m_CurrentEntryChangedDispatcher.Dispatcher ); using (Synchronizer.Lock(this.m_DeckTraversal.Deck.SyncRoot)) { this.m_DeckTraversal.Deck.Changed["DeckBackgroundColor"].Add( this.m_DeckBGColorChangedDispatcher.Dispatcher ); } this.m_CurrentEntryChangedDispatcher.Dispatcher(this.m_DeckTraversal, null); this.m_CurrentEntryChangedDispatcher.Dispatcher(this.m_DeckTraversal, null); }
//Another version of the function that will work for the SaveAll menu items //(and any other case where we need to save a deck that isn't the current deck.) public void SaveDeck(IWin32Window window, DeckTraversalModel deck) { SaveFileDialog save = new SaveFileDialog(); save = new SaveFileDialog(); using (Synchronizer.Lock(deck.Deck.SyncRoot)) { //Set the default name save.FileName = deck.Deck.HumanName; save.Filter = "CP3 files (*.cp3)|*.cp3|All Files (*.*)|*.*"; if (save.ShowDialog() == DialogResult.OK) { Decks.PPTDeckIO.SaveAsCP3(new FileInfo(save.FileName), deck.Deck); } } }
public FilmStripSlideViewer(MultiColumnFilmStrip parent, PresenterModel model, DeckTraversalModel traversal, DeckTraversalModel previewTraversal, TableOfContentsModel.Entry entry) { this.m_Model = model; this.m_Parent = parent; this.m_DeckTraversal = traversal; this.m_Entry = entry; this.m_PreviewDeckTraversal = previewTraversal; this.BorderStyle = BorderStyle.FixedSingle; this.m_CurrentEntryChangedDispatcher = new EventQueue.PropertyEventDispatcher(this.SlideDisplay.EventQueue, new PropertyEventHandler(this.HandleCurrentEntryChanged)); this.m_EntriesChangedDispatcher = new EventQueue.PropertyEventDispatcher(this.SlideDisplay.EventQueue, new PropertyEventHandler(this.HandleEntriesChanged)); this.m_DeckBackgroundColorChangedDispatcher = new EventQueue.PropertyEventDispatcher(this.SlideDisplay.EventQueue, new PropertyEventHandler(this.HandleDeckBackgroundColorChanged)); this.m_DeckBackgroundTemplateChangedDispatcher = new EventQueue.PropertyEventDispatcher(this.SlideDisplay.EventQueue, new PropertyEventHandler(this.HandleDeckBackgroundTemplateChanged)); this.m_DeckTraversal.Changed["Current"].Add(this.m_CurrentEntryChangedDispatcher.Dispatcher); this.m_Entry.TableOfContents.Changed["Entries"].Add(this.m_EntriesChangedDispatcher.Dispatcher); using (Synchronizer.Lock(this.m_DeckTraversal.Deck.SyncRoot)) { this.m_DeckTraversal.Deck.Changed["DeckBackgroundColor"].Add(this.m_DeckBackgroundColorChangedDispatcher.Dispatcher); this.m_DeckTraversal.Deck.Changed["DeckBackgroundTemplate"].Add(this.m_DeckBackgroundTemplateChangedDispatcher.Dispatcher); this.DefaultDeckBGColor = this.m_DeckTraversal.Deck.DeckBackgroundColor; this.DefaultDeckBGTemplate = this.m_DeckTraversal.Deck.DeckBackgroundTemplate; } this.m_EntriesChangedDispatcher.Dispatcher(this.m_Entry, null); this.m_CurrentEntryChangedDispatcher.Dispatcher(this.m_DeckTraversal, null); this.m_CurrentDeckTraversalChangedDispatcher = this.m_Model.Workspace.CurrentDeckTraversal.ListenAndInitialize(this.SlideDisplay.EventQueue, delegate(Property<DeckTraversalModel>.EventArgs args) { bool old = this.m_IsCurrentDeckTraversal; using (this.m_Model.Workspace.Lock()) { this.m_IsCurrentDeckTraversal = (~this.m_Model.Workspace.CurrentDeckTraversal == this.m_DeckTraversal); } if (old != this.m_IsCurrentDeckTraversal) { // Invalidate the display to draw the new selection border. this.UpdateSelection(); } }); }
public DecksMenu(ControlEventQueue dispatcher, PresenterModel model) { this.m_Model = model; this.Text = Strings.Decks; queue_ = dispatcher; using (Synchronizer.Lock(this.m_Model.Workspace.CurrentDeckTraversal.SyncRoot)) { this.current_deck_traversal_listener_ = this.m_Model.Workspace.CurrentDeckTraversal.ListenAndInitialize(queue_, delegate(Property<DeckTraversalModel>.EventArgs args) { ///remove all the current slide menu items for (int i = this.MenuItems.Count; --i >= 0; ) { if ((this.MenuItems[i] is UW.ClassroomPresenter.Viewer.FilmStrips.FilmStripContextMenu.InsertSlideMenuItem) || (this.MenuItems[i] is UW.ClassroomPresenter.Viewer.FilmStrips.FilmStripContextMenu.InsertSlidesFromFileMenuItem) || (this.MenuItems[i] is UW.ClassroomPresenter.Viewer.FilmStrips.FilmStripContextMenu.RemoveSlideMenuItem)) this.MenuItems.RemoveAt(i); } current_deck_ = args.New; if (current_deck_ != null) { ///add the new, fresh items with the correct deck on. /// this.MenuItems.Add(new UW.ClassroomPresenter.Viewer.FilmStrips.FilmStripContextMenu.InsertSlideMenuItem(current_deck_, this.m_Model)); this.MenuItems.Add(new UW.ClassroomPresenter.Viewer.FilmStrips.FilmStripContextMenu.InsertSlidesFromFileMenuItem(current_deck_, this.m_Model)); this.MenuItems.Add(new UW.ClassroomPresenter.Viewer.FilmStrips.FilmStripContextMenu.RemoveSlideMenuItem(current_deck_, this.m_Model)); } }); } this.MenuItems.Add(new CreateBlankWhiteboardDeckMenuItem(this.m_Model)); this.MenuItems.Add(new MenuItem("-")); // Text of "-" signifies a separator bar. // Note: These used to be in the "Slides" menu (see Bug 988). this.MenuItems.Add(new SetDeckBkgColorMenuItem(model)); this.MenuItems.Add(new SetSlideBkgColorMenuItem(model)); this.MenuItems.Add(new MenuItem("-")); // Text of "-" signifies a separator bar. // this.MenuItems.Add(new DeckMatcherMenuItem(model)); // this.MenuItems.Add(new MenuItem("-")); // Text of "-" signifies a separator bar. }
/// <summary> /// Constructs a new <see cref="TouchGestureHandler"/> instance, which will /// keep track of the touch input and convert it into a gesture. /// </summary> public TouchGestureHandler(PresenterModel m, EventQueue q ) { this.model = m; this.currentDeckTraversal = null; // Listen for model changes this.eventQueue = q; this.currentDeckTraversalDispatcher = this.model.Workspace.CurrentDeckTraversal.ListenAndInitialize(this.eventQueue, delegate(Property<DeckTraversalModel>.EventArgs args) { this.currentDeckTraversal = args.New; }); // Keep track of the various touch strokes this.collectedPacketsTable = new Dictionary<int, List<int>>(); this.tabletPropertiesTable = new Dictionary<int, TabletPropertyDescriptionCollection>(); // Create a helper ink object this.ink = new Ink(); }
public static DeckTraversalMessage ForDeckTraversal(DeckTraversalModel traversal) { DeckTraversalMessage message; if(traversal is SlideDeckTraversalModel) message = new SlideDeckTraversalMessage((SlideDeckTraversalModel) traversal); else if(traversal == null) throw new ArgumentNullException("traversal"); else throw new ArgumentException("Unknown deck traversal type: " + traversal.ToString()); // Set the message's predecessor to the current TableOfContents.Entry. using(Synchronizer.Lock(traversal.SyncRoot)) { if( traversal.Current != null ) { Message predecessor = message.Predecessor; message.Predecessor = new SlideInformationMessage( traversal.Current.Slide ); message.Predecessor.InsertChild( new TableOfContentsEntryMessage( traversal.Current ) ); message.Predecessor.AddOldestPredecessor( predecessor ); } return message; } }
//Another version of the function that will work for the SaveAll menu items //(and any other case where we need to save a deck that isn't the current deck.) public void SaveDeck(IWin32Window window, DeckTraversalModel deck) { SaveFileDialog save = new SaveFileDialog(); save = new SaveFileDialog(); using (Synchronizer.Lock(deck.Deck.SyncRoot)) { //Set the default name save.FileName = deck.Deck.HumanName; } save.Filter = "CP3 files (*.cp3)|*.cp3|All Files (*.*)|*.*"; if (save.ShowDialog() == DialogResult.OK) { //If filter ("*.cp3") is chosen, then make sure the File Name End with ".cp3" if (save.FilterIndex == 1 && !save.FileName.EndsWith(".cp3")) save.FileName = save.FileName + ".cp3"; using (Synchronizer.Lock(deck.Deck.SyncRoot)) { Decks.PPTDeckIO.SaveAsCP3(new FileInfo(save.FileName), deck.Deck); deck.Deck.Dirty = false; } } }
/// <summary> /// Constructs a new matching between the two given DeckTraversalModels /// </summary> /// <param name="srcTraversal">The DeckTraversal to marshal changes from</param> /// <param name="destTraversal">The DeckTraversal to marshal changes to</param> public DeckTraversalMatch( EventQueue sender, DeckTraversalModel srcTraversal, DeckTraversalModel destTraversal ) { // Set the members this.m_Sender = sender; this.m_SourceDeckTraversal = srcTraversal; this.m_DestDeckTraversal = destTraversal; this.m_CurrentChangedDispatcher = new EventQueue.PropertyEventDispatcher(this.m_Sender, new PropertyEventHandler(this.HandleCurrentChanged)); if( !this.IsSameTarget() ) { // Recursively Create all the child matchings this.m_DeckMatch = new DeckMatch( this.m_Sender, this.m_SourceDeckTraversal.Deck, this.m_DestDeckTraversal.Deck ); // Setup the listeners this.m_SourceDeckTraversal.Changed["Current"].Add(this.m_CurrentChangedDispatcher.Dispatcher); // Update the initial values this.m_Sender.Post(delegate() { this.m_CurrentChangedDispatcher.Dispatcher(this, null); }); } }
public DeckListBoxItem( DeckTraversalModel model ) { this.m_ModelId = model.Id; this.m_Title = "[null]"; using( Synchronizer.Lock( model.Deck.SyncRoot ) ) { this.m_Title = model.Deck.HumanName; } }
/// <summary> /// Add a new DeckTraversalModel to the collection /// </summary> /// <param name="value">The DeckTraversalModel to add</param> /// <returns>Returns the index at which the object was added</returns> public int Add(DeckTraversalModel value) { return(List.Add(value)); }
private void UpdateMode(DeckTraversalSelector value) { if (this.m_Active != null) { this.UnregisterActiveEventListeners(); } switch (value) { case DeckTraversalSelector.Linked: this.m_Active = this.m_Linked; break; case DeckTraversalSelector.Unlinked: this.m_Active = this.m_Unlinked; break; default: throw new ArgumentException("Unknown enumeration value for DeckTraversalSelector: " + value.ToString()); } this.RegisterActiveEventListeners(); }
public DecksListBoxItem( DeckTraversalModel localModel, DeckTraversalModel remoteModel ) { this.m_LocalId = localModel.Id; this.m_RemoteId = remoteModel.Id; this.m_LocalTitle = "<null>"; this.m_RemoteTitle = "<null>"; if( remoteModel.Id == localModel.Id ) { this.m_LocalId = Guid.Empty; this.m_LocalTitle = "[self]"; } else { using( Synchronizer.Lock( localModel.Deck.SyncRoot ) ) { this.m_LocalTitle = localModel.Deck.HumanName; } } using( Synchronizer.Lock( remoteModel.Deck.SyncRoot ) ) { this.m_RemoteTitle = remoteModel.Deck.HumanName; } }
/// <summary> /// Inserts a DeckTraversalModel into the given index in the collection /// </summary> /// <param name="index">The index to insert into</param> /// <param name="value">The DeckTraversalModel to insert</param> public void Insert(int index, DeckTraversalModel value) { List.Insert(index, value); }
public InstructorCurrentDeckTraversalChangedMessage(DeckTraversalModel traversal) : this(traversal,true) { }
private void SendTraversalInformation(DeckTraversalModel traversal, Group receivers) { Message message, deck; message = new PresentationInformationMessage(this.m_Service.m_Presentation); message.Group = receivers; message.InsertChild(deck = new DeckInformationMessage(traversal.Deck)); deck.InsertChild(DeckTraversalMessage.ForDeckTraversal(traversal)); this.m_Service.m_Sender.Send(message); }
public RemoveSlideMenuItem(DeckTraversalModel traversal, PresenterModel model) : base(Strings.DeleteSlide) { this.m_Deck = traversal.Deck; this.m_WhereTheEntriesGo = traversal.Deck.TableOfContents.Entries; traversal_ = traversal; this.m_Model = model; }
/// <summary> /// Remove the given DeckTraversalModel /// </summary> /// <param name="value">The DeckTraversalModel to remove</param> public void Remove(DeckTraversalModel value) { List.Remove(value); }
/// <summary> /// Add a deck traversal to the local deck list /// </summary> /// <param name="toAdd">The deck traversal model to add</param> public void AddLocal( DeckTraversalModel toAdd ) { this.m_Local.Items.Add( new DeckListBoxItem( toAdd ) ); }
/// <summary> /// Add a deck traversal to the remote deck list /// </summary> /// <param name="toAdd">The deck traversal model to add</param> public void AddRemote( DeckTraversalModel toAdd ) { this.m_Remote.Items.Add( new DeckListBoxItem( toAdd ) ); }
public DeckTraversalRemovedFromPresentationMessage(DeckTraversalModel traversal) : base(traversal) { }
/// <summary> /// Add a deck traversal to the match list /// </summary> /// <param name="localDeck">The deck traversal model to add</param> /// <param name="remoteDeck">The deck traversal model to add</param> public void AddMatch( DeckTraversalModel localDeck, DeckTraversalModel remoteDeck ) { this.m_MatchedListBox.Items.Add( new DecksListBoxItem( localDeck, remoteDeck ) ); }
public DeckTraversalMessage(DeckTraversalModel traversal) : this(traversal,true) { }
/// <summary> /// Returns the index of the given object /// </summary> /// <param name="value">The DeckTraversalModel to find the index of</param> /// <returns>The index of the object, or -1 otherwise</returns> public int IndexOf(DeckTraversalModel value) { return(List.IndexOf(value)); }
/// <summary> /// Check to see if the given DeckTraversalModel is contained in the collection /// </summary> /// <param name="value">The DeckTraversalModel to check for</param> /// <returns>Returns true if the collection contains the /// DeckTraversalModel, false otherwise</returns> public bool Contains(DeckTraversalModel value) { return(List.Contains(value)); }
public InstructorCurrentDeckTraversalChangedMessage(DeckTraversalModel traversal, bool addLocalRef) : base(traversal, addLocalRef) { }
private bool m_UseLightColorSet; // Use light color set as the pen color set #endregion Fields #region Constructors /// <summary> /// Instantiates a new <see cref="ViewerStateModel"/>. /// </summary> public ViewerStateModel() { this.m_PollStyle = QuickPollModel.QuickPollStyle.ABCD; this.m_Document = new PrintDocument(); this.m_PrintableDeck = null; this.m_SlidesPerPage = 6; this.m_LoggingEnabled = true; this.m_LoggingPath = ".\\Logs"; this.m_SecondMonitorEnabled = true; this.m_SecondMonitorWindowsAPIsEnabled = true; this.m_SecondMonitorCustomCommandsEnabled = false; this.m_SecondMonitorCustomCommandType = ""; this.m_SecondMonitorCloneCommand = ""; this.m_SecondMonitorExtendCommand = ""; this.m_NumberOfScreens = System.Windows.Forms.Screen.AllScreens.Length; this.m_SlidePreviewEnabled = true; this.m_SlidePreviewVisible = false; this.m_SlidePreviewWidth = 400; this.m_SlidePreviewHeight = 300; this.m_AutoScrollEnabled = true; this.m_FilmStripEnabled = true; this.m_PrimaryMonitorFullScreen = false; this.m_FEC = 0; this.m_InterPacketDelay = 0; this.m_BeaconInterval = 5; this.m_FilmStripAlignment = DockStyle.Right; this.m_SaveOnClose = true; this.m_BroadcastDisabled = false; this.m_UseLightColorSet = false; this.m_ClassmateMode = false; this.m_DefaultPenWidth = 53; this.m_DefaultHLWidth = 318; this.m_Language = "en"; this.m_FilmStripWidth = 1; this.m_SSFilmStripWidth = 3; this.m_iRole = 0;//0-disconnected, 1-Viewer, 2-Presenter, 3-Public this.m_Advanced = false; this.m_ManualConnectionButtonName = ""; this.m_TCPaddress = ""; this.m_ShowIP = true; this.m_Diagnostic = new DiagnosticModel(); }
protected virtual void Dispose(bool disposing) { if(this.m_Disposed) return; if(disposing) { this.m_CurrentSlidePreviewDeckTraversalChangedDispatcher.Dispose(); // Unregister event listeners via the CurrentSlidePreviewDeckTraversal setter. this.CurrentSlidePreviewDeckTraversal = null; } this.m_Disposed = true; }
public void OnCurrentDeckTraversalChanged(object sender, PropertyEventArgs pea) { PropertyChangeEventArgs args = (PropertyChangeEventArgs)pea; if (m_DeckTraversal != null) { m_DeckTraversal.Changed["Current"].Remove(new PropertyEventHandler(OnTableOfContentsEntryChanged)); } m_DeckTraversal = (DeckTraversalModel)args.NewValue; if (m_DeckTraversal != null) { using (Synchronizer.Lock(m_DeckTraversal.SyncRoot)) { TableOfContentsModel.Entry e = m_DeckTraversal.Current; using (Synchronizer.Lock(e.SyncRoot)) { SlideModel s = e.Slide; using (Synchronizer.Lock(s.SyncRoot)) { m_CurrentSlideID = s.Id; } } } m_DeckTraversal.Changed["Current"].Add(new PropertyEventHandler(OnTableOfContentsEntryChanged)); } }