/// <summary> /// Clear the contents of the tool window associated with this <see cref="T:ToolWindowActivationHelper"/> /// </summary> protected virtual void ClearContents() { FrameVisibilityFlags flags = myFrameVisibility; switch (flags & FrameVisibilityFlags.FrameVisibilityMask) { case FrameVisibilityFlags.Covered: case FrameVisibilityFlags.Visible: IMonitorSelectionService monitor = myMonitorSelectionService; monitor.SelectionChanged -= new EventHandler <MonitorSelectionEventArgs>(MonitorSelectionChanged); monitor.DocumentWindowChanged -= new EventHandler <MonitorSelectionEventArgs>(DocumentWindowChanged); myFrameVisibility = FrameVisibilityFlags.Hidden | (flags & FrameVisibilityFlags.PersistentFlagsMask); SetCurrentDocument(null, null); break; } }
private void HandlePossibleFrameModeChange() { object frameModeObj; VSFRAMEMODE frameMode; if (VSConstants.S_OK == myFrame.GetProperty((int)__VSFPROPID.VSFPROPID_FrameMode, out frameModeObj) && myLastFrameMode != (frameMode = (VSFRAMEMODE)frameModeObj)) { myLastFrameMode = frameMode; FrameVisibilityFlags flags = myFrameVisibility; if ((flags & FrameVisibilityFlags.FrameVisibilityMask) == FrameVisibilityFlags.Covered && 0 != (flags & FrameVisibilityFlags.HasBeenVisible)) { OnShow((int)__FRAMESHOW.FRAMESHOW_WinShown); } } }
private void ShowContents() { FrameVisibilityFlags flags = myFrameVisibility; switch (flags & FrameVisibilityFlags.FrameVisibilityMask) { case FrameVisibilityFlags.Covered: myFrameVisibility = FrameVisibilityFlags.Visible | (flags & FrameVisibilityFlags.PersistentFlagsMask) | FrameVisibilityFlags.HasBeenVisible; break; case FrameVisibilityFlags.Hidden: IMonitorSelectionService monitor = myMonitorSelectionService; monitor.SelectionChanged += new EventHandler <MonitorSelectionEventArgs>(MonitorSelectionChanged); monitor.DocumentWindowChanged += new EventHandler <MonitorSelectionEventArgs>(DocumentWindowChanged); myNotifyCallback.ActivatorVisibleWindowSessionBeginning(this); SetCurrentDocument(SafeGetCurrentDocument(monitor) as DocDataType, monitor.CurrentDocumentView as DocViewType); myFrameVisibility = FrameVisibilityFlags.Visible | (flags & FrameVisibilityFlags.PersistentFlagsMask) | FrameVisibilityFlags.HasBeenVisible; CurrentSelectionContainer = monitor.CurrentSelectionContainer as SelectionContainerType ?? monitor.CurrentDocumentView as SelectionContainerType; break; } }
/// <summary> /// Implements <see cref="IVsWindowFrameNotify3.OnShow"/> /// </summary> protected int OnShow(int fShow) { FrameVisibilityFlags flags = myFrameVisibility; FrameVisibilityFlags startFlags = flags & ~(FrameVisibilityFlags.FrameVisibilityMask | FrameVisibilityFlags.PersistentFlagsMask); myFrameVisibility &= FrameVisibilityFlags.FrameVisibilityMask | FrameVisibilityFlags.PersistentFlagsMask; switch ((__FRAMESHOW)fShow) { case (__FRAMESHOW)__FRAMESHOW2.FRAMESHOW_BeforeWinHidden: myFrameVisibility |= FrameVisibilityFlags.PendingHiddenMeansClosed; break; case __FRAMESHOW.FRAMESHOW_WinMinimized: case __FRAMESHOW.FRAMESHOW_TabDeactivated: // VS2010 is sending a BeforeWinHidden/TabDeactivated/Hidden, which results in a covered state // with a closed window. If closed is already pending, don't degrade to cover pending instead. myFrameVisibility |= 0 != (startFlags & FrameVisibilityFlags.PendingHiddenMeansClosed) ? FrameVisibilityFlags.PendingHiddenMeansClosed : FrameVisibilityFlags.PendingHiddenMeansCovered; break; case __FRAMESHOW.FRAMESHOW_DestroyMultInst: case __FRAMESHOW.FRAMESHOW_WinClosed: ClearContents(); break; case __FRAMESHOW.FRAMESHOW_WinHidden: bool cover = false; object frameModeObj; VSFRAMEMODE frameMode = (VSFRAMEMODE)(-1); IVsWindowFrame frame = myFrame; if (frame != null && VSConstants.S_OK == frame.GetProperty((int)__VSFPROPID.VSFPROPID_FrameMode, out frameModeObj)) { // VS is changing the framemode during a hide request without telling us, always check and reset // at this point so that a move on a hidden window does not reshow it. myLastFrameMode = frameMode = (VSFRAMEMODE)frameModeObj; } if (0 != (startFlags & FrameVisibilityFlags.PendingHiddenMeansCovered)) { cover = true; } else if (0 == (startFlags & FrameVisibilityFlags.PendingHiddenMeansClosed)) { cover = frameMode == VSFRAMEMODE.VSFM_MdiChild; } if (cover) { myFrameVisibility = FrameVisibilityFlags.Covered | (flags & FrameVisibilityFlags.PersistentFlagsMask); } else { ClearContents(); } break; case __FRAMESHOW.FRAMESHOW_AutoHideSlideBegin: case __FRAMESHOW.FRAMESHOW_WinMaximized: case __FRAMESHOW.FRAMESHOW_WinRestored: case __FRAMESHOW.FRAMESHOW_WinShown: ShowContents(); break; } return(VSConstants.S_OK); }