📄 dockcontenthandler.cs
字号:
SetDockState(isHidden, visibleState, oldPane);
}
internal void SetDockState(bool isHidden, DockState visibleState, DockPane oldPane)
{
if (IsSuspendSetDockState)
return;
if (DockPanel == null && visibleState != DockState.Unknown)
throw new InvalidOperationException(ResourceHelper.GetString("IDockContent.SetDockState.NullPanel"));
if (visibleState == DockState.Hidden || (visibleState != DockState.Unknown && !IsDockStateValid(visibleState)))
throw new InvalidOperationException(ResourceHelper.GetString("IDockContent.SetDockState.InvalidState"));
SuspendSetDockState();
DockState oldDockState = DockState;
if (m_isHidden != isHidden || oldDockState == DockState.Unknown)
{
m_isHidden = isHidden;
}
m_visibleState = visibleState;
m_dockState = isHidden ? DockState.Hidden : visibleState;
if (visibleState == DockState.Unknown)
Pane = null;
else
{
m_isFloat = (m_visibleState == DockState.Float);
if (Pane == null)
Pane = DockPanel.DockPaneFactory.CreateDockPane(Content, visibleState, true);
else if (Pane.DockState != visibleState)
{
if (Pane.Contents.Count == 1)
Pane.SetDockState(visibleState);
else
Pane = DockPanel.DockPaneFactory.CreateDockPane(Content, visibleState, true);
}
}
SetPane(Pane);
SetVisible();
if (oldPane != null && !oldPane.IsDisposed && oldDockState == oldPane.DockState)
RefreshDockPane(oldPane);
if (Pane != null && DockState == Pane.DockState)
{
if ((Pane != oldPane) ||
(Pane == oldPane && oldDockState != oldPane.DockState))
RefreshDockPane(Pane);
}
if (oldDockState != DockState)
OnDockStateChanged(EventArgs.Empty);
ResumeSetDockState();
}
private void RefreshDockPane(DockPane pane)
{
pane.RefreshChanges();
pane.ValidateActiveContent();
}
internal string PersistString
{
get { return GetPersistStringDelegate == null ? Form.GetType().ToString() : GetPersistStringDelegate(); }
}
private GetPersistStringDelegate m_getPersistStringDelegate = null;
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Property[@name="GetPersistStringDelegate"]/*'/>
public GetPersistStringDelegate GetPersistStringDelegate
{
get { return m_getPersistStringDelegate; }
set { m_getPersistStringDelegate = value; }
}
private bool m_hideOnClose = false;
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Property[@name="HideOnClose"]/*'/>
public bool HideOnClose
{
get { return m_hideOnClose; }
set { m_hideOnClose = value; }
}
private DockState m_showHint = DockState.Unknown;
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Property[@name="ShowHint"]/*'/>
public DockState ShowHint
{
get { return m_showHint; }
set
{
if (!DockHelper.IsDockStateValid(value, DockableAreas))
throw (new InvalidOperationException(ResourceHelper.GetString("IDockContent.ShowHint.InvalidValue")));
if (m_showHint == value)
return;
m_showHint = value;
}
}
private bool m_isActivated = false;
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Property[@name="IsActivated"]/*'/>
public bool IsActivated
{
get { return m_isActivated; }
}
internal void SetIsActivated(bool value)
{
if (m_isActivated == value)
return;
m_isActivated = value;
}
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Method[@name="IsDockStateValid(DockState)"]/*'/>
public bool IsDockStateValid(DockState dockState)
{
if (DockPanel != null && dockState == DockState.Document && DockPanel.DocumentStyle == DocumentStyles.SystemMdi)
return false;
else
return DockHelper.IsDockStateValid(dockState, DockableAreas);
}
private ContextMenu m_tabPageContextMenu = null;
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Property[@name="TabPageContextMenu"]/*'/>
public ContextMenu TabPageContextMenu
{
get { return m_tabPageContextMenu; }
set { m_tabPageContextMenu = value; }
}
private string m_toolTipText = null;
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Property[@name="ToolTipText"]/*'/>
public string ToolTipText
{
get { return m_toolTipText; }
set { m_toolTipText = value; }
}
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Method[@name="Activate()"]/*'/>
public void Activate()
{
if (DockPanel == null)
Form.Activate();
else if (Pane == null)
Show(DockPanel);
else
{
IsHidden = false;
Pane.ActiveContent = Content;
if (DockState == DockState.Document && DockPanel.DocumentStyle == DocumentStyles.DockingMdi)
Form.Activate();
else if (!Form.ContainsFocus)
{
if (Contains(ActiveWindowHandle))
User32.SetFocus(ActiveWindowHandle);
if (!Form.ContainsFocus)
{
if (!Form.SelectNextControl(Form.ActiveControl, true, true, true, true))
// Since DockContent Form is not selectalbe, use Win32 SetFocus instead
User32.SetFocus(Form.Handle);
}
}
}
}
private bool Contains(IntPtr hWnd)
{
Control control = Control.FromChildHandle(hWnd);
for (Control parent=control; parent!=null; parent=parent.Parent)
if (parent == Form)
return true;
return false;
}
private IntPtr m_activeWindowHandle = IntPtr.Zero;
internal IntPtr ActiveWindowHandle
{
get { return m_activeWindowHandle; }
set { m_activeWindowHandle = value; }
}
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Method[@name="Hide()"]/*'/>
public void Hide()
{
IsHidden = true;
}
internal void SetPane(DockPane pane)
{
if (pane != null && pane.DockState == DockState.Document && DockPanel.DocumentStyle == DocumentStyles.DockingMdi)
{
if (Form.Parent is DockPane)
SetParent(null);
if (Form.MdiParent != DockPanel.ParentForm)
{
FlagClipWindow = true;
Form.MdiParent = DockPanel.ParentForm;
}
}
else
{
FlagClipWindow = true;
if (Form.MdiParent != null)
Form.MdiParent = null;
if (Form.TopLevel)
Form.TopLevel = false;
SetParent(pane);
}
}
internal void SetVisible()
{
bool visible;
if (IsHidden)
visible = false;
else if (Pane != null && Pane.DockState == DockState.Document && DockPanel.DocumentStyle == DocumentStyles.DockingMdi)
visible = true;
else if (Pane != null && Pane.ActiveContent == Form as IDockableWindow)
visible = true;
else if (Pane != null && Pane.ActiveContent != Form as IDockableWindow)
visible = false;
else
visible = Form.Visible;
Form.Visible = visible;
}
private void SetParent(Control value)
{
if (Form.Parent == value)
return;
if (Environment.Version.Major > 1)
{
Form.Parent = value;
return;
}
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// Workaround for .Net Framework bug: removing control from Form may cause form
// unclosable. Set focus to another dummy control.
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Control oldParent = Form.Parent;
Form form = null;
if (Form.Parent is DockPane)
form = ((DockPane)Form.Parent).FindForm();
if (Form.ContainsFocus)
{
if (form is FloatWindow)
{
((FloatWindow)form).DummyControl.Focus();
form.ActiveControl = ((FloatWindow)form).DummyControl;
}
else if (DockPanel != null)
{
DockPanel.DummyControl.Focus();
if (form != null)
form.ActiveControl = DockPanel.DummyControl;
}
}
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Form.Parent = value;
}
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Method[@name="Show"]/*'/>
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Method[@name="Show()"]/*'/>
public void Show()
{
if (DockPanel == null)
Form.Show();
else
Show(DockPanel);
}
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Method[@name="Show(DockPanel)"]/*'/>
public void Show(DockContainer dockPanel)
{
if (dockPanel == null)
throw(new ArgumentNullException(ResourceHelper.GetString("IDockContent.Show.NullDockPanel")));
if (DockState == DockState.Unknown)
Show(dockPanel, DefaultShowState);
else
Activate();
}
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Method[@name="Show(DockPanel, DockState)"]/*'/>
public void Show(DockContainer dockPanel, DockState dockState)
{
if (dockPanel == null)
throw(new ArgumentNullException(ResourceHelper.GetString("IDockContent.Show.NullDockPanel")));
if (dockState == DockState.Unknown || dockState == DockState.Hidden)
throw(new ArgumentException(ResourceHelper.GetString("IDockContent.Show.InvalidDockState")));
DockPanel = dockPanel;
if (dockState == DockState.Float && FloatPane == null)
Pane = DockPanel.DockPaneFactory.CreateDockPane(Content, DockState.Float, true);
else if (PanelPane == null)
{
DockPane paneExisting = null;
foreach (DockPane pane in DockPanel.Panes)
if (pane.DockState == dockState)
{
paneExisting = pane;
break;
}
if (paneExisting == null)
Pane = DockPanel.DockPaneFactory.CreateDockPane(Content, dockState, true);
else
Pane = paneExisting;
}
DockState = dockState;
Activate();
}
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Method[@name="Show(DockPanel, Rectangle)"]/*'/>
public void Show(DockContainer dockPanel, Rectangle floatWindowBounds)
{
if (dockPanel == null)
throw(new ArgumentNullException(ResourceHelper.GetString("IDockContent.Show.NullDockPanel")));
DockPanel = dockPanel;
if (FloatPane == null)
{
IsHidden = true; // to reduce the screen flicker
FloatPane = DockPanel.DockPaneFactory.CreateDockPane(Content, DockState.Float, false);
FloatPane.FloatWindow.StartPosition = FormStartPosition.Manual;
}
FloatPane.FloatWindow.Bounds = floatWindowBounds;
Show(dockPanel, DockState.Float);
Activate();
}
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Method[@name="Show(DockPane, IDockContent)"]/*'/>
public void Show(DockPane pane, IDockableWindow beforeContent)
{
if (pane == null)
throw(new ArgumentNullException(ResourceHelper.GetString("IDockContent.Show.NullPane")));
if (beforeContent != null && pane.Contents.IndexOf(beforeContent) == -1)
throw(new ArgumentException(ResourceHelper.GetString("IDockContent.Show.InvalidBeforeContent")));
DockPanel = pane.DockPanel;
Pane = pane;
pane.SetContentIndex(Content, pane.Contents.IndexOf(beforeContent));
Show();
}
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Method[@name="Show(DockPane, DockAlignment, double)"]/*'/>
public void Show(DockPane prevPane, DockAlignment alignment, double proportion)
{
if (prevPane == null)
throw(new ArgumentException(ResourceHelper.GetString("IDockContent.Show.InvalidPrevPane")));
if (DockHelper.IsDockStateAutoHide(prevPane.DockState))
throw(new ArgumentException(ResourceHelper.GetString("IDockContent.Show.InvalidPrevPane")));
DockPanel = prevPane.DockPanel;
DockPanel.DockPaneFactory.CreateDockPane(Content, prevPane, alignment, proportion, true);
Show();
}
internal void SetBounds(Rectangle bounds)
{
Form.Bounds = bounds;
}
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Method[@name="Close()"]/*'/>
public void Close()
{
DockContainer dockPanel = DockPanel;
if (dockPanel != null)
dockPanel.SuspendLayout(true);
Form.Close();
if (dockPanel != null)
dockPanel.ResumeLayout(true, true);
}
private DockPaneTab m_dockPaneTab = null;
internal DockPaneTab DockPaneTab
{
get { return m_dockPaneTab; }
}
private AutoHideTab m_autoHideTab = null;
internal AutoHideTab AutoHideTab
{
get { return m_autoHideTab; }
}
#region Events
private static readonly object DockStateChangedEvent = new object();
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Event[@name="DockStateChanged"]/*'/>
public event EventHandler DockStateChanged
{
add { Events.AddHandler(DockStateChangedEvent, value); }
remove { Events.RemoveHandler(DockStateChangedEvent, value); }
}
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Method[@name="OnDockStateChanged(EventArgs)"]/*'/>
protected virtual void OnDockStateChanged(EventArgs e)
{
EventHandler handler = (EventHandler)Events[DockStateChangedEvent];
if (handler != null)
handler(this, e);
}
#endregion
private void Form_Disposed(object sender, EventArgs e)
{
Dispose();
}
private void Form_TextChanged(object sender, EventArgs e)
{
if (DockHelper.IsDockStateAutoHide(DockState))
DockPanel.RefreshAutoHideStrip();
else if (Pane != null)
{
if (Pane.FloatWindow != null)
Pane.FloatWindow.SetText();
Pane.RefreshChanges();
}
}
private bool m_flagClipWindow = false;
internal bool FlagClipWindow
{
get { return m_flagClipWindow; }
set
{
if (m_flagClipWindow == value)
return;
m_flagClipWindow = value;
if (m_flagClipWindow)
Form.Region = new Region(Rectangle.Empty);
else
Form.Region = null;
}
}
#if FRAMEWORK_VER_2x
private ContextMenuStrip m_tabPageContextMenuStrip = null;
public ContextMenuStrip TabPageContextMenuStrip
{
get { return m_tabPageContextMenuStrip; }
set { m_tabPageContextMenuStrip = value; }
}
#endif
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -