#region Imports using DPumpHydr.WinFrmUI.RLT.Controls; using DPumpHydr.WinFrmUI.RLT.Native; using System; using System.Collections; using System.ComponentModel; using System.ComponentModel.Design; using System.Windows.Forms; using System.Windows.Forms.Design; #endregion namespace DPumpHydr.WinFrmUI.RLT.Design.Poison { #region PoisonTabControlDesignerDesign internal class PoisonTabControlDesigner : ParentControlDesigner { #region Fields private readonly DesignerVerbCollection designerVerbs = new(); private IDesignerHost designerHost; private ISelectionService selectionService; public override SelectionRules SelectionRules => Control.Dock == DockStyle.Fill ? SelectionRules.Visible : base.SelectionRules; public override DesignerVerbCollection Verbs { get { if (designerVerbs.Count == 2) { PoisonTabControl myControl = (PoisonTabControl)Control; designerVerbs[1].Enabled = myControl.TabCount != 0; } return designerVerbs; } } public IDesignerHost DesignerHost => designerHost ??= (IDesignerHost)GetService(typeof(IDesignerHost)); public ISelectionService SelectionService => selectionService ??= (ISelectionService)GetService(typeof(ISelectionService)); #endregion #region Constructor public PoisonTabControlDesigner() { DesignerVerb verb1 = new("Add Tab", OnAddPage); DesignerVerb verb2 = new("Remove Tab", OnRemovePage); designerVerbs.AddRange ( new[] { verb1, verb2 } ); } #endregion #region Private Methods private void OnAddPage(object sender, EventArgs e) { PoisonTabControl parentControl = (PoisonTabControl)Control; Control.ControlCollection oldTabs = parentControl.Controls; RaiseComponentChanging(TypeDescriptor.GetProperties(parentControl)["TabPages"]); PoisonTabPage p = (PoisonTabPage)DesignerHost.CreateComponent(typeof(PoisonTabPage)); p.Text = p.Name; parentControl.TabPages.Add(p); RaiseComponentChanged(TypeDescriptor.GetProperties(parentControl)["TabPages"], oldTabs, parentControl.TabPages); parentControl.SelectedTab = p; SetVerbs(); } private void OnRemovePage(object sender, EventArgs e) { PoisonTabControl parentControl = (PoisonTabControl)Control; Control.ControlCollection oldTabs = parentControl.Controls; if (parentControl.SelectedIndex < 0) { return; } RaiseComponentChanging(TypeDescriptor.GetProperties(parentControl)["TabPages"]); DesignerHost.DestroyComponent(parentControl.TabPages[parentControl.SelectedIndex]); RaiseComponentChanged(TypeDescriptor.GetProperties(parentControl)["TabPages"], oldTabs, parentControl.TabPages); SelectionService.SetSelectedComponents ( new IComponent[] { parentControl }, SelectionTypes.Auto ); SetVerbs(); } private void SetVerbs() { PoisonTabControl parentControl = (PoisonTabControl)Control; Verbs[1].Enabled = parentControl.TabPages.Count switch { 0 => false, _ => true, }; } #endregion #region Overrides protected override void WndProc(ref Message m) { base.WndProc(ref m); switch (m.Msg) { case (int)WinApi.Messages.WM_NCHITTEST: if (m.Result.ToInt32() == (int)WinApi.HitTest.HTTRANSPARENT) { m.Result = (IntPtr)WinApi.HitTest.HTCLIENT; } break; } } protected override bool GetHitTest(System.Drawing.Point point) { if (SelectionService.PrimarySelection == Control) { WinApi.TCHITTESTINFO hti = new() { pt = Control.PointToClient(point), flags = 0 }; Message m = new() { HWnd = Control.Handle, Msg = WinApi.TCM_HITTEST }; IntPtr lparam = System.Runtime.InteropServices.Marshal.AllocHGlobal(System.Runtime.InteropServices.Marshal.SizeOf(hti)); System.Runtime.InteropServices.Marshal.StructureToPtr(hti, lparam, false); m.LParam = lparam; base.WndProc(ref m); System.Runtime.InteropServices.Marshal.FreeHGlobal(lparam); if (m.Result.ToInt32() != -1) { return hti.flags != (int)WinApi.TabControlHitTest.TCHT_NOWHERE; } } return false; } protected override void PreFilterProperties(IDictionary properties) { properties.Remove("ImeMode"); properties.Remove("Padding"); properties.Remove("FlatAppearance"); properties.Remove("FlatStyle"); properties.Remove("AutoEllipsis"); properties.Remove("UseCompatibleTextRendering"); properties.Remove("Image"); properties.Remove("ImageAlign"); properties.Remove("ImageIndex"); properties.Remove("ImageKey"); properties.Remove("ImageList"); properties.Remove("TextImageRelation"); properties.Remove("BackgroundImage"); properties.Remove("BackgroundImageLayout"); properties.Remove("UseVisualStyleBackColor"); properties.Remove("Font"); properties.Remove("RightToLeft"); base.PreFilterProperties(properties); } #endregion } #endregion }