📄 dockcontenthandler.cs
字号:
#region Fireball License
// Copyright (C) 2005 Sebastian Faltoni sebastian{at}dotnetfireball{dot}net
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#endregion
#region Original License
// *****************************************************************************
//
// Copyright 2004, Weifen Luo
// All rights reserved. The software and associated documentation
// supplied hereunder are the proprietary information of Weifen Luo
// and are supplied subject to licence terms.
//
// WinFormsUI Library Version 1.0
// *****************************************************************************
#endregion
using System;
using System.Windows.Forms;
using System.Drawing;
using System.ComponentModel;
namespace Fireball.Docking
{
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Delegate[@name="GetPersistStringDelegate"]/*'/>
public delegate string GetPersistStringDelegate();
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/ClassDef/*'/>
public class DockContentHandler : IDisposable
{
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Constructor[@name="Overloads"]/*'/>
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Constructor[@name="(Form)"]/*'/>
public DockContentHandler(Form form) : this(form, null)
{
}
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Constructor[@name="(Form, GetPersistStringDelegate)"]/*'/>
public DockContentHandler(Form form, GetPersistStringDelegate getPersistStringDelegate)
{
if (!(form is IDockableWindow))
throw new ArgumentException();
m_form = form;
m_getPersistStringDelegate = getPersistStringDelegate;
m_events = new EventHandlerList();
Form.Disposed +=new EventHandler(Form_Disposed);
Form.TextChanged += new EventHandler(Form_TextChanged);
}
/// <exclude />
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
/// <exclude />
protected virtual void Dispose(bool disposing)
{
if(disposing)
{
lock(this)
{
DockPanel = null;
if (AutoHideTab != null)
AutoHideTab.Dispose();
if (DockPaneTab != null)
DockPaneTab.Dispose();
Form.Disposed -= new EventHandler(Form_Disposed);
Form.TextChanged -= new EventHandler(Form_TextChanged);
Events.Dispose();
}
}
}
private Form m_form;
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Property[@name="Form"]/*'/>
public Form Form
{
get { return m_form; }
}
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Property[@name="Form"]/*'/>
public IDockableWindow Content
{
get { return Form as IDockableWindow; }
}
private EventHandlerList m_events;
private EventHandlerList Events
{
get { return m_events; }
}
private bool m_allowRedocking = true;
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Property[@name="AllowRedocking"]/*'/>
public bool AllowRedocking
{
get { return m_allowRedocking; }
set { m_allowRedocking = value; }
}
private double m_autoHidePortion = 0.25;
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Property[@name="AutoHidePortion"]/*'/>
public double AutoHidePortion
{
get { return m_autoHidePortion; }
set
{
if (value <= 0 || value > 1)
throw(new ArgumentOutOfRangeException(ResourceHelper.GetString("IDockContent.AutoHidePortion.OutOfRange")));
if (m_autoHidePortion == value)
return;
m_autoHidePortion = value;
if (DockPanel == null)
return;
if (DockPanel.ActiveAutoHideContent == this.Form as IDockableWindow)
DockPanel.PerformLayout();
}
}
private bool m_closeButton = true;
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Property[@name="CloseButton"]/*'/>
public bool CloseButton
{
get { return m_closeButton; }
set
{
if (m_closeButton == value)
return;
m_closeButton = value;
if (Pane != null)
if (Pane.ActiveContent == this)
Pane.RefreshChanges();
}
}
private DockState DefaultDockState
{
get
{
if (ShowHint != DockState.Unknown && ShowHint != DockState.Hidden)
return ShowHint;
if ((DockableAreas & DockAreas.Document) != 0)
return DockState.Document;
if ((DockableAreas & DockAreas.DockRight) != 0)
return DockState.DockRight;
if ((DockableAreas & DockAreas.DockLeft) != 0)
return DockState.DockLeft;
if ((DockableAreas & DockAreas.DockBottom) != 0)
return DockState.DockBottom;
if ((DockableAreas & DockAreas.DockTop) != 0)
return DockState.DockTop;
return DockState.Unknown;
}
}
private DockState DefaultShowState
{
get
{
if (ShowHint != DockState.Unknown)
return ShowHint;
if ((DockableAreas & DockAreas.Document) != 0)
return DockState.Document;
if ((DockableAreas & DockAreas.DockRight) != 0)
return DockState.DockRight;
if ((DockableAreas & DockAreas.DockLeft) != 0)
return DockState.DockLeft;
if ((DockableAreas & DockAreas.DockBottom) != 0)
return DockState.DockBottom;
if ((DockableAreas & DockAreas.DockTop) != 0)
return DockState.DockTop;
if ((DockableAreas & DockAreas.Float) != 0)
return DockState.Float;
return DockState.Unknown;
}
}
private DockAreas m_allowedAreas = DockAreas.DockLeft | DockAreas.DockRight | DockAreas.DockTop | DockAreas.DockBottom | DockAreas.Document | DockAreas.Float;
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Property[@name="DockableAreas"]/*'/>
public DockAreas DockableAreas
{
get { return m_allowedAreas; }
set
{
if (m_allowedAreas == value)
return;
if (!DockHelper.IsDockStateValid(DockState, value))
throw(new InvalidOperationException(ResourceHelper.GetString("IDockContent.DockableAreas.InvalidValue")));
m_allowedAreas = value;
if (!DockHelper.IsDockStateValid(ShowHint, m_allowedAreas))
ShowHint = DockState.Unknown;
}
}
private DockState m_dockState = DockState.Unknown;
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Property[@name="DockState"]/*'/>
public DockState DockState
{
get { return m_dockState; }
set
{
if (m_dockState == value)
return;
if (value == DockState.Hidden)
IsHidden = true;
else
SetDockState(false, value, Pane);
}
}
private DockContainer m_dockPanel = null;
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Property[@name="DockPanel"]/*'/>
public DockContainer DockPanel
{
get { return m_dockPanel; }
set
{
if (m_dockPanel == value)
return;
Pane = null;
if (m_dockPanel != null)
m_dockPanel.RemoveContent(Content);
if (m_dockPaneTab != null)
{
m_dockPaneTab.Dispose();
m_dockPaneTab = null;
}
if (m_autoHideTab != null)
{
m_autoHideTab.Dispose();
m_autoHideTab = null;
}
m_dockPanel = value;
if (m_dockPanel != null)
{
m_dockPanel.AddContent(Content);
Form.TopLevel = false;
Form.FormBorderStyle = FormBorderStyle.None;
Form.ShowInTaskbar = false;
User32.SetWindowPos(Form.Handle, IntPtr.Zero, 0, 0, 0, 0,
Win32.FlagsSetWindowPos.SWP_NOACTIVATE |
Win32.FlagsSetWindowPos.SWP_NOMOVE |
Win32.FlagsSetWindowPos.SWP_NOSIZE |
Win32.FlagsSetWindowPos.SWP_NOZORDER |
Win32.FlagsSetWindowPos.SWP_NOOWNERZORDER |
Win32.FlagsSetWindowPos.SWP_FRAMECHANGED);
m_dockPaneTab = DockPanel.DockPaneTabFactory.CreateDockPaneTab(Content);
m_autoHideTab = DockPanel.AutoHideTabFactory.CreateAutoHideTab(Content);
}
}
}
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Property[@name="Icon"]/*'/>
public Icon Icon
{
get { return Form.Icon; }
}
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Property[@name="Pane"]/*'/>
public DockPane Pane
{
get { return IsFloat ? FloatPane : PanelPane; }
set
{
if (Pane == value)
return;
DockPane oldPane = Pane;
SuspendSetDockState();
FloatPane = (value == null ? null : (value.IsFloat ? value : FloatPane));
PanelPane = (value == null ? null : (value.IsFloat ? PanelPane : value));
ResumeSetDockState(IsHidden, value != null ? value.DockState : DockState.Unknown, oldPane);
}
}
private bool m_isHidden = true;
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Property[@name="IsHidden"]/*'/>
public bool IsHidden
{
get { return m_isHidden; }
set
{
if (m_isHidden == value)
return;
SetDockState(value, VisibleState, Pane);
}
}
private string m_tabText = null;
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Property[@name="TabText"]/*'/>
public string TabText
{
get { return m_tabText==null ? Form.Text : m_tabText; }
set
{
if (m_tabText == value)
return;
m_tabText = value;
if (Pane != null)
Pane.RefreshChanges();
}
}
private DockState m_visibleState = DockState.Unknown;
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Property[@name="VisibleState"]/*'/>
public DockState VisibleState
{
get { return m_visibleState; }
set
{
if (m_visibleState == value)
return;
SetDockState(IsHidden, value, Pane);
}
}
private bool m_isFloat = false;
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Property[@name="IsFloat"]/*'/>
public bool IsFloat
{
get { return m_isFloat; }
set
{
DockState visibleState;
if (m_isFloat == value)
return;
DockPane oldPane = Pane;
if (value)
{
if (!IsDockStateValid(DockState.Float))
throw new InvalidOperationException(ResourceHelper.GetString("IDockContent.IsFloat.InvalidValue"));
visibleState = DockState.Float;
}
else
visibleState = (PanelPane != null) ? PanelPane.DockState : DefaultDockState;
if (visibleState == DockState.Unknown)
throw new InvalidOperationException(ResourceHelper.GetString("IDockContent.IsFloat.InvalidValue"));
SetDockState(IsHidden, visibleState, oldPane);
}
}
private DockPane m_panelPane = null;
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Property[@name="PanelPane"]/*'/>
public DockPane PanelPane
{
get { return m_panelPane; }
set
{
if (m_panelPane == value)
return;
if (value != null)
{
if (value.IsFloat || value.DockPanel != DockPanel)
throw new InvalidOperationException(ResourceHelper.GetString("IDockContent.DockPane.InvalidValue"));
}
DockPane oldPane = Pane;
if (m_panelPane != null)
m_panelPane.RemoveContent(Content);
m_panelPane = value;
if (m_panelPane != null)
{
m_panelPane.AddContent(Content);
SetDockState(IsHidden, IsFloat ? DockState.Float : m_panelPane.DockState, oldPane);
}
else
SetDockState(IsHidden, DockState.Unknown, oldPane);
}
}
private DockPane m_floatPane = null;
/// <include file='CodeDoc\DockContentHandler.xml' path='//CodeDoc/Class[@name="DockContentHandler"]/Property[@name="FloatPane"]/*'/>
public DockPane FloatPane
{
get { return m_floatPane; }
set
{
if (m_floatPane == value)
return;
if (value != null)
{
if (!value.IsFloat || value.DockPanel != DockPanel)
throw new InvalidOperationException(ResourceHelper.GetString("IDockContent.FloatPane.InvalidValue"));
}
DockPane oldPane = Pane;
if (m_floatPane != null)
m_floatPane.RemoveContent(Content);
m_floatPane = value;
if (m_floatPane != null)
{
m_floatPane.AddContent(Content);
SetDockState(IsHidden, IsFloat ? DockState.Float : VisibleState, oldPane);
}
else
SetDockState(IsHidden, DockState.Unknown, oldPane);
}
}
private int m_countSetDockState = 0;
private void SuspendSetDockState()
{
m_countSetDockState ++;
}
private void ResumeSetDockState()
{
m_countSetDockState --;
if (m_countSetDockState < 0)
m_countSetDockState = 0;
}
internal bool IsSuspendSetDockState
{
get { return m_countSetDockState != 0; }
}
private void ResumeSetDockState(bool isHidden, DockState visibleState, DockPane oldPane)
{
ResumeSetDockState();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -