private GardenPoint SnapToGrid(int x, int y)
        {
            double      grid   = (GRID_SIZE / 4) * Zoom;
            GardenPoint result = new GardenPoint(-GRID_SIZE + (int)System.Math.Round((int)(System.Math.Round((double)(x / grid)) * grid) / Zoom), -GRID_SIZE + (int)System.Math.Round((int)(System.Math.Round((double)(y / grid)) * grid) / Zoom));

            return(result);
        }
        /// <summary>
        /// Checks if an area of the garden was selected by clicking the edge of that area.
        /// </summary>
        /// <returns><c>true</c>, if click selection was made, <c>false</c> otherwise.</returns>
        /// <param name="x">The x coordinate.</param>
        /// <param name="y">The y coordinate.</param>
        private bool CheckAreaClick(int x, int y)
        {
            GardenPoint clicked = new GardenPoint(x, y);
            int         year    = MainWindow.GetInstance().GetYear();
            int         month   = MainWindow.GetInstance().GetMonth();

            if (Garden.CheckDate(year, month))
            {
                foreach (GardenArea area in Garden.MethodAreas.Values)
                {
                    if (area.CheckDate(year, month) && area.ContainsPointOnEdge(clicked, XOffset(), YOffset(), Zoom))
                    {
                        if (SelectedArea != null)
                        {
                            SelectedPoint = SelectedArea.GetPointInRange(clicked, 10, XOffset(), YOffset(), Zoom);
                        }
                        else
                        {
                            SelectedPoint = area.GetPointInRange(clicked, 10, XOffset(), YOffset(), Zoom);
                        }
                        SelectedArea = area;
                        return(true);
                    }
                }

                foreach (GardenArea area in Garden.Plantings.Values)
                {
                    if (area.CheckDate(year, month) && area.ContainsPointOnEdge(clicked, XOffset(), YOffset(), Zoom))
                    {
                        if (SelectedArea != null)
                        {
                            SelectedPoint = SelectedArea.GetPointInRange(clicked, 10, XOffset(), YOffset(), Zoom);
                        }
                        else
                        {
                            SelectedPoint = area.GetPointInRange(clicked, 10, XOffset(), YOffset(), Zoom);
                        }
                        SelectedArea = area;
                        return(true);
                    }
                }
            }

            if (Garden.ContainsPointOnEdge(clicked, XOffset(), YOffset(), Zoom))
            {
                SelectedArea  = Garden;
                SelectedPoint = Garden.GetPointInRange(clicked, 10, XOffset(), YOffset(), Zoom);
                return(true);
            }

            return(false);
        }
        public GardenDrawingArea(Garden.Garden garden, SpinButton zoomButton, int width = 800, int height = 600)
        {
            this.Garden = garden;
            this.SetSizeRequest(width, height);
            this.AddEvents((int)(Gdk.EventMask.ButtonPressMask | Gdk.EventMask.ButtonReleaseMask | Gdk.EventMask.PointerMotionMask
                                 | Gdk.EventMask.KeyPressMask | Gdk.EventMask.KeyReleaseMask | Gdk.EventMask.AllEventsMask));


            this.ButtonPressEvent += delegate(object o, ButtonPressEventArgs args)
            {
                if (args.Event.Button == 1)
                {
                    if (MainWindow.GetInstance().AreaNewButton.Active)
                    {
                        UndoSelection();
                        GardenPoint gridPoint = SnapToGrid((int)(args.Event.X), (int)(args.Event.Y));
                        NewPoints.Add(gridPoint);
                        Draw();
                    }
                    else if (CheckAreaClick((int)args.Event.X, (int)args.Event.Y))
                    {
                        MakeSelection();
                    }
                    else
                    {
                        UndoSelection();
                    }
                }
                else if (args.Event.Button == 3 || args.Event.Button == 2)
                {
                    if (CheckAreaClick((int)args.Event.X, (int)args.Event.Y) && SelectedArea != null)
                    {
                        MakeSelection();

                        MenuItem item1 = new MenuItem("Set created date");
                        item1.Activated += (sender, e) => DateInputWindow.ShowWindow("Set created date", (int y, int m) => { SelectedArea.SetCreated(y, m); });
                        MenuItem item2 = new MenuItem("Set removed date");
                        item2.Activated += (sender, e) => DateInputWindow.ShowWindow("Set removed date", (int y, int m) => { SelectedArea.SetRemoved(y, m); });
                        MenuItem item3 = new MenuItem("Edit area");
                        item3.Activated += (sender, e) => MainWindow.GetInstance().AreaEditButton.Activate();
                        MenuItem item4 = new MenuItem("Remove area");
                        item4.Activated += (sender, e) => MainWindow.GetInstance().AreaDeleteButton.Activate();
                        MenuItem item5 = new MenuItem("Edit point");
                        item5.Sensitive  = SelectedPoint != null;
                        item5.Activated += (sender, e) => PointInputWindow.ShowWindow("Set new point", Math.Min(SelectedPoint.X, SelectedPoint.Y) - 100, Math.Max(SelectedPoint.X, SelectedPoint.Y) + 100, SelectedPoint.X, SelectedPoint.Y,
                                                                                      (int x, int y) => { SelectedArea.Shape.ModPoint(SelectedPoint, new GardenPoint(x, y), true); SelectedPoint = null; Draw(); });

                        Menu menu = new Menu()
                        {
                            item1, item2, item3, item4, item5
                        };

                        menu.AttachToWidget(this, null);
                        menu.ShowAll();
                        menu.Popup();
                    }
                }
            };

            zoomButton.ValueChanged += (object sender, System.EventArgs e) =>
            {
                Zoom = zoomButton.Value;
                if (IsDrawable)
                {
                    Draw();
                }
            };

            this.QueryTooltip += (object o, QueryTooltipArgs args) =>
            {
                System.Console.WriteLine("tooltip drawing area");
            };
            zoomButton.QueryTooltip += (object o, QueryTooltipArgs args) =>
            {
                System.Console.WriteLine("tooltip zoom button");
            };
        }