using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Drawing;
using FastReport.Utils;
using FastReport.Map.Forms;
namespace FastReport.Map
{
partial class MapObject : IHasEditor
{
#region Fields
private bool needDesignerModify;
private int doubleClickTickCount;
private PointF doubleClickPos;
#endregion // Fields
#region Properties
///
/// This property is not relevant to this class.
///
[Browsable(false)]
public new bool CanGrow
{
get { return base.CanGrow; }
set { base.CanGrow = value; }
}
///
/// This property is not relevant to this class.
///
[Browsable(false)]
public new bool CanShrink
{
get { return base.CanShrink; }
set { base.CanShrink = value; }
}
///
/// This property is not relevant to this class.
///
[Browsable(false)]
public new string Style
{
get { return base.Style; }
set { base.Style = value; }
}
///
/// This property is not relevant to this class.
///
[Browsable(false)]
public new string EvenStyle
{
get { return base.EvenStyle; }
set { base.EvenStyle = value; }
}
///
/// This property is not relevant to this class.
///
[Browsable(false)]
public new StylePriority EvenStylePriority
{
get { return base.EvenStylePriority; }
set { base.EvenStylePriority = value; }
}
///
/// This property is not relevant to this class.
///
[Browsable(false)]
public new string HoverStyle
{
get { return base.HoverStyle; }
set { base.HoverStyle = value; }
}
///
public override bool IsSelected
{
get
{
if (Report == null)
return false;
return Report.Designer.SelectedObjects.IndexOf(this) != -1 || IsInternalSelected;
}
}
private bool IsInternalSelected
{
get
{
if (Report == null)
return false;
SelectedObjectCollection selection = Report.Designer.SelectedObjects;
return selection.Count > 0 && (
(selection[0] is MapLayer && (selection[0] as MapLayer).Map == this) ||
(selection[0] is ShapeBase && (selection[0] as ShapeBase).Map == this));
}
}
#endregion // Properties
#region Private Methods
internal void GenerateRandomData()
{
if (IsEmpty)
return;
foreach (MapLayer layer in Layers)
{
layer.InitializeData();
if (!String.IsNullOrEmpty(layer.SpatialColumn))
{
double value = 0;
foreach (ShapeBase shape in layer.Shapes)
{
layer.AddValue(shape.SpatialValue, value);
value += 50;
}
}
else
{
layer.AddValue("1", 0);
layer.AddValue("2", 1000);
}
layer.FinalizeData();
}
}
private Base HitTest(PointF point)
{
for (int i = Layers.Count - 1; i >= 0; i--)
{
ShapeBase shape = Layers[i].HitTest(point);
if (shape != null)
return shape;
}
return null;
}
#endregion // Private Methods
#region Public Methods
///
public override void Draw(FRPaintEventArgs e)
{
base.Draw(e);
if (IsDesigning)
{
if (IsEmpty)
{
string s = Res.Get("ComponentsMisc,Map,Hint");
Font font = new Font(DrawUtils.DefaultReportFont.Name, DrawUtils.DefaultFont.Size * e.ScaleX * 96f / DrawUtils.ScreenDpi, DrawUtils.DefaultFont.Style);
e.Graphics.DrawString(s, font, Brushes.Black,
new RectangleF(AbsLeft * e.ScaleX, AbsTop * e.ScaleY, Width * e.ScaleX, Height * e.ScaleY),
e.Cache.GetStringFormat(StringAlignment.Center, StringAlignment.Center, StringTrimming.None, StringFormatFlags.NoClip, 0, 0));
}
else
{
try
{
SaveState();
GenerateRandomData();
DrawMap(e);
}
finally
{
RestoreState();
}
}
}
else
try
{
SaveState();
DrawMap(e);
}
finally
{
RestoreState();
}
DrawMarkers(e);
Border.Draw(e, new RectangleF(AbsLeft, AbsTop, Width, Height));
if (IsDesigning && IsSelected)
{
float m = Report.Designer.DpiMultiplier();
e.Graphics.DrawImage(Report.Designer.GetImage(75), (int)(AbsLeft * e.ScaleX + 8 * m), (int)(AbsTop * e.ScaleY - 8 * m));
}
}
///
public override SizeF GetPreferredSize()
{
if ((Page as ReportPage).IsImperialUnitsUsed)
return new SizeF(Units.Inches * 4, Units.Inches * 4f);
return new SizeF(Units.Millimeters * 80, Units.Millimeters * 80);
}
///
public bool InvokeEditor()
{
using (MapEditorForm form = new MapEditorForm())
{
form.Map = this;
return form.ShowDialog() == DialogResult.OK;
}
}
///
public override void OnBeforeInsert(int flags)
{
base.OnBeforeInsert(flags);
// fill is reset by the designer's default formatting tool. Set it back.
Fill = new SolidFill(Color.Gainsboro);
}
#endregion // Public Methods
#region Designer mouse support
///
public override void HandleMouseHover(FRMouseEventArgs e)
{
if (IsSelected)
{
float m = 1 / Report.Designer.Zoom;
if (new RectangleF(AbsLeft + 8 * m, AbsTop - 8 * m, 16 * m, 16 * m).Contains(new PointF(e.x, e.y)))
{
e.handled = true;
e.cursor = Cursors.SizeAll;
}
}
}
///
public override void HandleMouseDown(FRMouseEventArgs e)
{
// allow doubleclick when polygon is selected
bool doubleClick = Environment.TickCount - doubleClickTickCount < SystemInformation.DoubleClickTime &&
new PointF(e.x, e.y).Equals(doubleClickPos);
doubleClickTickCount = Environment.TickCount;
doubleClickPos = new PointF(e.x, e.y);
if (e.mode != WorkspaceMode2.None)
return;
// check move handle
HandleMouseHover(e);
if (e.handled)
{
// do base logic such as selecting/deselecting
// and return with e.Mode = WorkspaceMode2.Move
base.HandleMouseDown(e);
e.handled = true;
e.mode = WorkspaceMode2.Move;
}
else if (PointInObject(new PointF(e.x, e.y)))
{
e.handled = true;
// hit test polygons
Base obj = HitTest(new PointF(e.x, e.y));
// pass rightclick and doubleclick to the map object
if (obj == null || doubleClick || e.button == MouseButtons.Right)
obj = this;
SelectedObjectCollection selection = Report.Designer.SelectedObjects;
if (e.modifierKeys == Keys.Shift)
{
// toggle selection
if (selection.IndexOf(obj) != -1)
{
if (selection.Count > 1)
selection.Remove(obj);
}
else
selection.Add(obj);
}
else
{
// select the object if not selected yet
if (selection.IndexOf(obj) == -1)
{
selection.Clear();
selection.Add(obj);
}
}
e.mode = WorkspaceMode2.Custom;
e.activeObject = this;
isPanning = true;
panned = false;
e.delta = new PointF(0, 0);
}
}
///
public override void HandleMouseMove(FRMouseEventArgs e)
{
base.HandleMouseMove(e);
if (!e.handled && e.button == MouseButtons.None)
{
// don't process if mouse is over move area
HandleMouseHover(e);
if (e.handled)
{
e.handled = false;
return;
}
if (PointInObject(new PointF(e.x, e.y)))
{
e.handled = true;
}
else
{
// mouse leave, save changes if any
if (needDesignerModify)
{
Report.Designer.SetModified(this, "Change", Name);
needDesignerModify = false;
}
}
}
if (isPanning && !IsEmpty)
{
OffsetX += e.delta.X / Zoom;
OffsetY += e.delta.Y / Zoom;
panned = true;
}
}
///
public override void HandleMouseUp(FRMouseEventArgs e)
{
base.HandleMouseUp(e);
if (isPanning)
{
if (panned)
needDesignerModify = true;
}
isPanning = false;
panned = false;
}
///
public override void HandleMouseWheel(FRMouseEventArgs e)
{
if (IsSelected && !IsEmpty)
{
if (e.wheelDelta < 0)
ZoomOut();
else
ZoomIn();
needDesignerModify = true;
e.handled = true;
}
}
#endregion
}
}