kopia lustrzana https://github.com/dl2alf/AirScout
266 wiersze
8.3 KiB
C#
266 wiersze
8.3 KiB
C#
using System;
|
|
using System.ComponentModel.Design;
|
|
using System.Drawing;
|
|
using System.Windows.Forms;
|
|
using System.Windows.Forms.Design;
|
|
|
|
namespace AeroWizard.Design
|
|
{
|
|
internal class WizardPageDesigner : RichParentControlDesigner<WizardPage, WizardPageDesigner.WizardPageDesignerActionList>
|
|
{
|
|
private static readonly string[] propsToRemove = new string[] { "Anchor", "AutoScrollOffset", "AutoSize", "BackColor",
|
|
"BackgroundImage", "BackgroundImageLayout", "ContextMenuStrip", "Cursor", "Dock", "Enabled", "Font",
|
|
"ForeColor", "Location", "Margin", "MaximumSize", "MinimumSize", "Padding", "TabStop", "UseWaitCursor", "Visible" };
|
|
|
|
public override SelectionRules SelectionRules => SelectionRules.Visible | SelectionRules.Locked;
|
|
|
|
protected override bool EnableDragRect => false;
|
|
|
|
public override bool CanBeParentedTo(IDesigner parentDesigner) => parentDesigner?.Component is WizardPageContainer;
|
|
|
|
internal WizardBaseDesigner ContainerDesigner => GetService<IDesignerHost>()?.GetDesigner(Control.Owner) as WizardBaseDesigner;
|
|
|
|
public override void Initialize(System.ComponentModel.IComponent component)
|
|
{
|
|
base.Initialize(component);
|
|
//base.Glyphs.Add(new WizardPageDesignerGlyph(this));
|
|
GetService<DesignerActionService>()?.Remove(component);
|
|
}
|
|
|
|
internal void OnDragDropInternal(DragEventArgs de)
|
|
{
|
|
OnDragDrop(de);
|
|
}
|
|
|
|
internal void OnDragEnterInternal(DragEventArgs de)
|
|
{
|
|
OnDragEnter(de);
|
|
}
|
|
|
|
internal void OnDragLeaveInternal(EventArgs e)
|
|
{
|
|
OnDragLeave(e);
|
|
}
|
|
|
|
internal void OnDragOverInternal(DragEventArgs e)
|
|
{
|
|
OnDragOver(e);
|
|
}
|
|
|
|
internal void OnGiveFeedbackInternal(GiveFeedbackEventArgs e)
|
|
{
|
|
OnGiveFeedback(e);
|
|
}
|
|
|
|
protected override void OnPaintAdornments(PaintEventArgs pe)
|
|
{
|
|
var clientRectangle = Control.ClientRectangle;
|
|
clientRectangle.Width--;
|
|
clientRectangle.Height--;
|
|
ControlPaint.DrawFocusRectangle(pe.Graphics, clientRectangle);
|
|
base.OnPaintAdornments(pe);
|
|
}
|
|
|
|
protected override System.Collections.Generic.IEnumerable<string> PropertiesToRemove => propsToRemove;
|
|
|
|
internal class WizardPageDesignerActionList : RichDesignerActionList<WizardPageDesigner, WizardPage>
|
|
{
|
|
public WizardPageDesignerActionList(WizardPageDesigner pageDesigner, WizardPage page)
|
|
: base(pageDesigner, page)
|
|
{
|
|
}
|
|
|
|
[DesignerActionProperty("Back Button Enabled", 0, Category = "Buttons", Description = "Enables the Back button when this page is shown.")]
|
|
public bool AllowBack
|
|
{
|
|
get { return Component.AllowBack; }
|
|
set { Component.AllowBack = value; }
|
|
}
|
|
|
|
[DesignerActionProperty("Cancel Button Enabled", 1, Category = "Buttons", Description = "Enables the Cancel button when this page is shown.")]
|
|
public bool AllowCancel
|
|
{
|
|
get { return Component.AllowCancel; }
|
|
set { Component.AllowCancel = value; }
|
|
}
|
|
|
|
[DesignerActionProperty("Next Button Enabled", 3, Category = "Buttons")]
|
|
public bool AllowNext
|
|
{
|
|
get { return Component.AllowNext; }
|
|
set { Component.AllowNext = value; }
|
|
}
|
|
|
|
[DesignerActionProperty("Mark As Finish Page", 5, Category = "Behavior")]
|
|
public bool IsFinishPage
|
|
{
|
|
get { return Component.IsFinishPage; }
|
|
set { Component.IsFinishPage = value; }
|
|
}
|
|
|
|
[DesignerActionProperty("Set Next Page", 6, Category = "Behavior")]
|
|
public WizardPage NextPage
|
|
{
|
|
get { return Component.NextPage; }
|
|
set { Component.NextPage = value; }
|
|
}
|
|
|
|
[DesignerActionProperty("Cancel Button Visible", 2, Category = "Buttons")]
|
|
public bool ShowCancel
|
|
{
|
|
get { return Component.ShowCancel; }
|
|
set { Component.ShowCancel = value; }
|
|
}
|
|
|
|
[DesignerActionProperty("Next Button Visible", 4, Category = "Behavior")]
|
|
public bool ShowNext
|
|
{
|
|
get { return Component.ShowNext; }
|
|
set { Component.ShowNext = value; }
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
internal class WizardPageDesignerBehavior : RichBehavior<WizardPageDesigner>
|
|
{
|
|
public WizardPageDesignerBehavior(WizardPageDesigner designer)
|
|
: base(designer)
|
|
{
|
|
|
|
}
|
|
|
|
public override bool OnMouseDown(System.Windows.Forms.Design.Behavior.Glyph g, MouseButtons button, Point mouseLoc)
|
|
{
|
|
if (button == MouseButtons.Left)
|
|
{
|
|
switch (((WizardPageDesignerGlyph)g).LastHit)
|
|
{
|
|
case WizardPageDesignerGlyph.ClickState.FirstBtn:
|
|
Designer.Control.Owner.SelectedPage = Designer.Control.Owner.Pages[0];
|
|
break;
|
|
case WizardPageDesignerGlyph.ClickState.PrevBtn:
|
|
Designer.Control.Owner.PreviousPage();
|
|
break;
|
|
case WizardPageDesignerGlyph.ClickState.NextBtn:
|
|
Designer.Control.Owner.NextPage();
|
|
break;
|
|
case WizardPageDesignerGlyph.ClickState.LastBtn:
|
|
Designer.Control.Owner.SelectedPage = Designer.Control.Owner.Pages[Designer.Control.Owner.Pages.Count - 1];
|
|
break;
|
|
case WizardPageDesignerGlyph.ClickState.Control:
|
|
break;
|
|
default:
|
|
throw new ArgumentOutOfRangeException();
|
|
}
|
|
}
|
|
return base.OnMouseDown(g, button, mouseLoc);
|
|
}
|
|
}
|
|
|
|
internal class WizardPageDesignerGlyph : RichGlyph<WizardPageDesigner>
|
|
{
|
|
private const int btnCount = 4, btnSize = 16, navBoxWidth = btnSize*btnCount + (btnCount - 1)*2 + 4, navBoxHeight = btnSize + 4;
|
|
private Rectangle navBox;
|
|
|
|
public WizardPageDesignerGlyph(WizardPageDesigner designer) : base(designer, new WizardPageDesignerBehavior(designer))
|
|
{
|
|
Designer.SelectionService.SelectionChanged += selSvc_SelectionChanged;
|
|
Designer.Control.Move += control_Move;
|
|
Designer.Control.Resize += control_Move;
|
|
}
|
|
|
|
internal enum ClickState
|
|
{
|
|
Control,
|
|
FirstBtn,
|
|
PrevBtn,
|
|
NextBtn,
|
|
LastBtn
|
|
}
|
|
|
|
public override Rectangle Bounds => navBox;
|
|
|
|
internal ClickState LastHit { get; set; }
|
|
|
|
public override void Dispose()
|
|
{
|
|
Designer.SelectionService.SelectionChanged -= selSvc_SelectionChanged;
|
|
Designer.Control.Move -= control_Move;
|
|
Designer.Control.Resize -= control_Move;
|
|
base.Dispose();
|
|
}
|
|
|
|
public override Cursor GetHitTest(Point p)
|
|
{
|
|
var r1 = new Rectangle(navBox.X + 2, navBox.Y + 2, btnSize, btnSize);
|
|
for (var i = 0; i < btnCount; i++)
|
|
{
|
|
if (r1.Contains(p))
|
|
{
|
|
LastHit = (ClickState)(i + 1);
|
|
return Cursors.Arrow;
|
|
}
|
|
r1.Offset(btnSize + 2, 0);
|
|
}
|
|
LastHit = ClickState.Control;
|
|
return null;
|
|
}
|
|
|
|
public override void Paint(PaintEventArgs pe)
|
|
{
|
|
var isMin7 = Environment.OSVersion.Version >= new Version(6, 1);
|
|
var fn = isMin7 ? "Webdings" : "Arial Narrow";
|
|
var btnText = isMin7 ? new[] {"9", "3", "4", ":"} : new[] {"«", "<", ">", "»"};
|
|
using (var f = new Font(fn, btnSize - 2, isMin7 ? FontStyle.Regular : FontStyle.Bold, GraphicsUnit.Pixel))
|
|
{
|
|
pe.Graphics.FillRectangle(SystemBrushes.Control, new Rectangle(navBox.X, navBox.Y, navBox.Width + 1, navBox.Height + 1));
|
|
using (var pen = new Pen(SystemBrushes.ControlDark, 1f) {DashStyle = System.Drawing.Drawing2D.DashStyle.Dot})
|
|
{
|
|
pe.Graphics.DrawRectangle(pen, navBox);
|
|
var r1 = new Rectangle(navBox.X + 2, navBox.Y + 2, btnSize, btnSize);
|
|
pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid;
|
|
var sf = new StringFormat() {Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center};
|
|
for (var i = 0; i < btnCount; i++)
|
|
{
|
|
pe.Graphics.DrawRectangle(pen, r1);
|
|
r1.Offset(1, 1);
|
|
//TextRenderer.DrawText(pe.Graphics, btnText[i], f, r1, SystemColors.ControlDark, SystemColors.Window, TextFormatFlags.NoPadding | TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter);
|
|
pe.Graphics.DrawString(btnText[i], f, SystemBrushes.ControlDark, r1, sf);
|
|
r1.Offset(btnSize + 1, -1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void control_Move(object sender, EventArgs e)
|
|
{
|
|
if (ReferenceEquals(Designer.SelectionService.PrimarySelection, Designer.Control))
|
|
{
|
|
SetNavBoxes();
|
|
Designer.Adorner.Invalidate();
|
|
}
|
|
}
|
|
|
|
private void selSvc_SelectionChanged(object sender, EventArgs e)
|
|
{
|
|
if (ReferenceEquals(Designer.SelectionService.PrimarySelection, Designer.Control))
|
|
{
|
|
SetNavBoxes();
|
|
Designer.Adorner.Enabled = true;
|
|
Designer.Control.Owner.DesignerSelected = true;
|
|
}
|
|
else if (Designer.Control.Owner.DesignerSelected)
|
|
{
|
|
Designer.Adorner.Enabled = false;
|
|
Designer.Control.Owner.DesignerSelected = false;
|
|
}
|
|
}
|
|
|
|
private void SetNavBoxes()
|
|
{
|
|
var pt = Designer.BehaviorService.ControlToAdornerWindow(Designer.Control);
|
|
navBox = new Rectangle(pt.X + Designer.Control.Width - navBoxWidth - 17, pt.Y - navBoxHeight - 5, navBoxWidth, navBoxHeight);
|
|
}
|
|
}
|
|
} |