private static void DisconnectFromBuffer(ITextBuffer buffer) { buffer.Changed -= new EventHandler <TextContentChangedEventArgs>(BufferIdleEventUtil.BufferChanged); BufferIdleEventUtil.ClearBufferListeners(buffer); BufferIdleEventUtil.ClearBufferTimer(buffer); buffer.Properties.RemoveProperty(BufferIdleEventUtil.bufferListenersKey); }
private static void RestartTimerForBuffer(ITextBuffer buffer) { DispatcherTimer timer; if (BufferIdleEventUtil.TryGetBufferTimer(buffer, out timer)) { timer.Stop(); } else { timer = new DispatcherTimer(DispatcherPriority.ApplicationIdle) { Interval = TimeSpan.FromMilliseconds(500.0) }; timer.Tick += (EventHandler)((s, e) => { BufferIdleEventUtil.ClearBufferTimer(buffer); HashSet <EventHandler> listeners; if (!BufferIdleEventUtil.TryGetBufferListeners(buffer, out listeners)) { return; } foreach (EventHandler eventHandler in listeners) { eventHandler((object)buffer, new EventArgs()); } }); buffer.Properties[BufferIdleEventUtil.bufferTimerKey] = (object)timer; } timer.Start(); }
private static HashSet <EventHandler> ConnectToBuffer(ITextBuffer buffer) { buffer.Changed += new EventHandler <TextContentChangedEventArgs>(BufferIdleEventUtil.BufferChanged); BufferIdleEventUtil.RestartTimerForBuffer(buffer); HashSet <EventHandler> eventHandlerSet = new HashSet <EventHandler>(); buffer.Properties[BufferIdleEventUtil.bufferListenersKey] = (object)eventHandlerSet; return(eventHandlerSet); }
private static void BufferChanged(object sender, TextContentChangedEventArgs e) { ITextBuffer buffer = sender as ITextBuffer; if (buffer == null) { return; } BufferIdleEventUtil.RestartTimerForBuffer(buffer); }
private static void ClearBufferTimer(ITextBuffer buffer) { DispatcherTimer timer; if (!BufferIdleEventUtil.TryGetBufferTimer(buffer, out timer)) { return; } if (timer != null) { timer.Stop(); } buffer.Properties.RemoveProperty(BufferIdleEventUtil.bufferTimerKey); }
public static bool RemoveBufferIdleEventListener(ITextBuffer buffer, EventHandler handler) { HashSet <EventHandler> listeners; if (!BufferIdleEventUtil.TryGetBufferListeners(buffer, out listeners) || !listeners.Contains(handler)) { return(false); } listeners.Remove(handler); if (listeners.Count == 0) { BufferIdleEventUtil.DisconnectFromBuffer(buffer); } return(true); }
public static bool AddBufferIdleEventListener(ITextBuffer buffer, EventHandler handler) { HashSet <EventHandler> listeners; if (!BufferIdleEventUtil.TryGetBufferListeners(buffer, out listeners)) { listeners = BufferIdleEventUtil.ConnectToBuffer(buffer); } if (listeners.Contains(handler)) { return(false); } listeners.Add(handler); return(true); }