using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
using FastReport.Design;
using FastReport.Design.PageDesigners.Dialog;
using FastReport.Utils;
namespace FastReport.Dialog
{
partial class DialogPage
{
#region Private Fields
private Bitmap formBitmap;
#endregion Private Fields
#region Public Properties
///
[Browsable(false)]
public override float Left
{
get { return base.Left; }
set { base.Left = value; }
}
///
[Browsable(false)]
public override float Top
{
get { return base.Top; }
set { base.Top = value; }
}
///
public override SizeF SnapSize
{
get { return new SizeF(DialogWorkspace.Grid.SnapSize, DialogWorkspace.Grid.SnapSize); }
}
#endregion Public Properties
#region Internal Properties
[Browsable(false)]
internal Bitmap FormBitmap
{
get
{
if (formBitmap == null)
ResetFormBitmap();
return formBitmap;
}
}
#endregion Internal Properties
#region Public Methods
///
public override void DrawSelection(FRPaintEventArgs e)
{
float m = Form.DpiMultiplier();
Pen pen = e.Cache.GetPen(Color.Gray, m, DashStyle.Dot);
e.Graphics.DrawRectangle(pen,
-Form.ClientAreaOffset().X - 2 * m,
-Form.ClientAreaOffset().Y - 2 * m,
Form.FrameSize().Width + 3.5f * m,
Form.FrameSize().Height + 3.5f * m);
base.DrawSelection(e);
}
///
public override Type GetPageDesignerType()
{
return typeof(DialogPageDesigner);
}
///
public override ContextMenuBase GetContextMenu()
{
return new DialogPageMenu(Report.Designer);
}
///
public override void HandleDoubleClick()
{
Report.Designer.ActiveReportTab.SwitchToCode();
if (String.IsNullOrEmpty(LoadEvent))
{
string newEventName = Name + "_Load";
if (Report.CodeHelper.AddHandler(typeof(EventHandler), newEventName))
{
LoadEvent = newEventName;
Report.Designer.SetModified(null, "Change");
}
}
else
{
Report.CodeHelper.LocateHandler(LoadEvent);
}
}
///
public override void HandleMouseDown(FRMouseEventArgs e)
{
e.handled = true;
e.mode = WorkspaceMode2.SelectionRect;
e.activeObject = this;
}
///
public override void HandleMouseHover(FRMouseEventArgs e)
{
base.HandleMouseHover(e);
if (e.handled)
e.cursor = Cursors.Default;
}
///
public override void HandleMouseUp(FRMouseEventArgs e)
{
base.HandleMouseUp(e);
if (e.mode == WorkspaceMode2.SelectionRect)
{
SelectedObjectCollection selection = Report.Designer.SelectedObjects;
selection.Clear();
// find objects inside the selection rect
foreach (DialogComponentBase c in Controls)
{
e.handled = false;
c.HandleMouseUp(e);
// object is inside
if (e.handled)
selection.Add(c);
}
if (selection.Count == 0)
selection.Add(this);
}
}
///
public override void SetDefaults()
{
ButtonControl btnOk = new ButtonControl();
btnOk.Parent = this;
btnOk.Name = CreateButtonName("btnOk");
btnOk.Text = Res.Get("Buttons,OK");
btnOk.Location = new Point((int)ClientSize.Width - 166, (int)ClientSize.Height - 31);
btnOk.Size = new Size(75, 23);
btnOk.DialogResult = DialogResult.OK;
btnOk.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
ButtonControl btnCancel = new ButtonControl();
btnCancel.Parent = this;
btnCancel.Name = CreateButtonName("btnCancel");
btnCancel.Text = Res.Get("Buttons,Cancel");
btnCancel.Location = new Point((int)ClientSize.Width - 83, (int)ClientSize.Height - 31);
btnCancel.Size = new Size(75, 23);
btnCancel.DialogResult = DialogResult.Cancel;
btnCancel.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
AcceptButton = btnOk;
CancelButton = btnCancel;
Form.AutoScaleDimensions = new SizeF(96f, 96f);
Form.AutoScaleMode = AutoScaleMode.Dpi;
base.SetDefaults();
}
#endregion Public Methods
#region Internal Methods
internal void ResetFormBitmap()
{
if (formBitmap != null)
{
formBitmap.Dispose();
formBitmap = null;
}
if (!IsDesigning)
return;
formBitmap = DrawUtils.DrawToBitmap(Form, false);
}
#endregion
#region Protected Methods
///
protected override SelectionPoint[] GetSelectionPoints()
{
return new SelectionPoint[]
{
new SelectionPoint(
Form.FrameSize().Width - Form.ClientAreaOffset().X + 1,
Form.FrameSize().Height - Form.ClientAreaOffset().Y + 1, SizingPoint.RightBottom),
new SelectionPoint(
Form.FrameSize().Width / 2 - Form.ClientAreaOffset().X,
Form.FrameSize().Height - Form.ClientAreaOffset().Y + 1, SizingPoint.BottomCenter),
new SelectionPoint(
Form.FrameSize().Width - Form.ClientAreaOffset().X + 1,
Form.FrameSize().Height / 2 - Form.ClientAreaOffset().Y, SizingPoint.RightCenter)
};
}
#endregion Protected Methods
#region Private Methods
private bool ShouldSerializeBackColor()
{
return BackColor != SystemColors.Control;
}
//private bool ShouldSerializeFont()
//{
// return Font.Name != "Tahoma" || Font.Size != 8 || Font.Style != FontStyle.Regular;
//}
#endregion Private Methods
}
internal static class DialogPageFormMixins
{
#if AVALONIA
public static Size FrameSize(this Form form) => new Size(form.Width + (int)(8 * form.DpiScale), form.Height + (int)(30 * form.DpiScale));
public static Point ClientAreaOffset(this Form form) => new Point((int)(4 * form.DpiScale), (int)(26 * form.DpiScale));
#else
public static Size FrameSize(this Form form) => new Size(form.Width, form.Height);
public static Point ClientAreaOffset(this Form form)
{
Point offset = new Point(0, 0);
try
{
offset = form.PointToScreen(offset);
}
catch (ObjectDisposedException)
{
return offset;
}
offset.X -= form.Left;
offset.Y -= form.Top;
return offset;
}
#endif
}
internal class DialogPageMenu : ComponentBaseMenu
{
#region Private Methods
private void miCopy_Click(object sender, EventArgs e)
{
Designer.cmdCopyPage.Invoke();
}
private void miDelete_Click(object sender, EventArgs e)
{
Designer.cmdDeletePage.Invoke();
}
#endregion // Private Methods
#region Constructors
public DialogPageMenu(Designer designer) : base(designer)
{
miEdit.Visible = Designer.cmdEdit.Enabled;
miCut.Visible = false;
miPaste.Visible = true;
miBringToFront.Visible = false;
miSendToBack.Visible = false;
miCopy.BeginGroup = true;
// remove from QAT. This menu is too short
miEdit.QatItem = miCopy.QatItem = miPaste.QatItem = miDelete.QatItem = false;
miCopy.Text = Res.Get("Designer,Menu,Edit,CopyPage");
miCopy.Enabled = Designer.cmdCopyPage.Enabled;
miPaste.Enabled = Designer.cmdPaste.Enabled;
miDelete.Enabled = Designer.cmdDeletePage.Enabled;
miCopy.Click += miCopy_Click;
miDelete.Click += miDelete_Click;
}
#endregion // Constructors
}
}