private void Gizmo_TransformationChanged(object sender, TransformationEvent transformationEvent)
        {
            switch (transformationEvent)
            {
            case TransformationEvent.TranslationStarted:
                TranslateAction translation = new TranslateAction(_vm.SelectedEntities, _vm);
                translation.TransformStartPoint         = _vm.SelectionLocation;
                GlobalManagement.Instance.CurrentAction = translation;
                break;

            case TransformationEvent.TranslationEnded:
                GlobalManagement.Instance.UndoStack.Push(GlobalManagement.Instance.CurrentAction);
                GlobalManagement.Instance.CurrentAction = null;
                break;

            case TransformationEvent.RotationStarted:
                RotateAction rotation = new RotateAction(_vm.SelectedEntities, _vm);
                mouseHandlingMode      = MouseHandlingMode.RotateObject;
                rotation.StartRotation = _vm.GizmoOrientation;
                rotation.PivotPoint    = _vm.SelectionLocation;
                GlobalManagement.Instance.CurrentAction = rotation;
                break;

            case TransformationEvent.RotationEnded:
                mouseHandlingMode = MouseHandlingMode.None;
                GlobalManagement.Instance.UndoStack.Push(GlobalManagement.Instance.CurrentAction);
                GlobalManagement.Instance.CurrentAction = null;
                break;
            }
        }
 public void Reset()
 {
     Action = new TranslateAction();
     Action.Transform = this.transform;
 }
        private void Instance_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            if ((e.PropertyName == "GizmoDragX" && _vm.GizmoDragX) ||
                (e.PropertyName == "GizmoDragY" && _vm.GizmoDragY))
            {
                mouseHandlingMode = MouseHandlingMode.DragObject;
            }

            if (e.PropertyName == "IsCreatingRectangularBuilding" && GlobalManagement.Instance.IsCreatingRectangularBuilding)
            {
                mouseHandlingMode = MouseHandlingMode.CreateRectangle;
            }

            if (e.PropertyName == "IsCreatingPolygonalBuilding" && GlobalManagement.Instance.IsCreatingPolygonalBuilding)
            {
                mouseHandlingMode = MouseHandlingMode.CreatePolygon;
            }

            if (e.PropertyName == "IsCreatingTextMarker" && _vm.IsCreatingTextMarker)
            {
                mouseHandlingMode        = MouseHandlingMode.CreateTextMarker;
                zoomAndPanControl.Cursor = Cursors.Pen;
            }

            if (e.PropertyName == nameof(_vm.IsCreatingWallAttachement) && _vm.IsCreatingWallAttachement)
            {
                mouseHandlingMode = MouseHandlingMode.CreateWallAttachable;
            }

            if (e.PropertyName == nameof(_vm.IsCreatingWall) && _vm.IsCreatingWall)
            {
                mouseHandlingMode = MouseHandlingMode.CreateWall;
            }

            if (e.PropertyName == "SelectionLocation" && mouseHandlingMode != MouseHandlingMode.DragObject)
            {
                Point canvasPoint = FromZoomControlToCanvasCoordinates(_vm.SelectionLocation.MeterToPx());
                _vm.GizmoX = Utils.PxToMeter(canvasPoint.X - Gizmo.Width / 2);
                _vm.GizmoY = Utils.PxToMeter(canvasPoint.Y - Gizmo.Height / 2);
            }

            // update selected entities postion
            if ((e.PropertyName == "GizmoX" || e.PropertyName == "GizmoY") && mouseHandlingMode == MouseHandlingMode.DragObject)
            {
                if (GlobalManagement.Instance.CurrentAction != null && GlobalManagement.Instance.CurrentAction is TranslateAction)
                {
                    TranslateAction translation = (TranslateAction)GlobalManagement.Instance.CurrentAction;
                    Point           pxPoint     = FromCanvasToZoomControlCoordinates(new Point(Utils.MeterToPx(_vm.GizmoX) + Gizmo.Width / 2,
                                                                                               Utils.MeterToPx(_vm.GizmoY) + Gizmo.Height / 2));
                    translation.TransformEndPoint = pxPoint.PxToMeter();
                    translation.Do();
                }
                else
                {
                    mouseHandlingMode = MouseHandlingMode.None;
                }
            }

            // update selected entities rotation
            if (e.PropertyName == "GizmoOrientation" && mouseHandlingMode == MouseHandlingMode.RotateObject)
            {
                RotateAction rotation = (RotateAction)GlobalManagement.Instance.CurrentAction;
                rotation.EndRotation = _vm.GizmoOrientation;
                rotation.Do();
            }

            if (e.PropertyName == nameof(_vm.LastSelected) && !_vm.SelectedEntities.Contains(_vm.CurrentlyManipulatedObject) && !(_vm.LastSelected is VisualCornerManipulator))
            {
                // remove corner manipulators on changing selection
                var items = _vm.MapEntities.Where(item => item is VisualCornerManipulator).ToList();
                for (int i = 0; i < items.Count; i++)
                {
                    _vm.MapEntities.Remove(items[i]);
                }
                if (_vm is DataModel)
                {
                    ((DataModel)_vm).CurrentCorners = null;
                }
            }

            #region terrain
            if (e.PropertyName == "CurrentMap" || e.PropertyName == "MapWidth" || e.PropertyName == "MapHeight")
            {
                ExpandContent();
            }

            if (e.PropertyName == "ContentScale" && _vm is DataModel)
            {
                foreach (VisualCornerManipulator manipulator in _vm.MapEntities.Where(item => item is VisualCornerManipulator))
                {
                    manipulator.Width  = Constants.ManipulatorDiameter / _vm.ContentScale;
                    manipulator.Height = Constants.ManipulatorDiameter / _vm.ContentScale;
                }
            }

            if (e.PropertyName == "TerrainBrushSize" || e.PropertyName == "ContentScale")
            {
                TerrainMap.DefaultDrawingAttributes.Width  = Utils.MeterToPx(GlobalManagement.Instance.TerrainBrushSize);
                TerrainMap.DefaultDrawingAttributes.Height = Utils.MeterToPx(GlobalManagement.Instance.TerrainBrushSize);

                TerrainEllipse.Width    = Utils.MeterToPx(GlobalManagement.Instance.TerrainBrushSize) * _vm.ContentScale;
                TerrainEllipse.Height   = Utils.MeterToPx(GlobalManagement.Instance.TerrainBrushSize) * _vm.ContentScale;
                TerrainEllipse.Margin   = new Thickness(-TerrainEllipse.Width / 2, -TerrainEllipse.Height / 2, 0, 0);
                TerrainRectangle.Width  = Utils.MeterToPx(GlobalManagement.Instance.TerrainBrushSize) * _vm.ContentScale;
                TerrainRectangle.Height = Utils.MeterToPx(GlobalManagement.Instance.TerrainBrushSize) * _vm.ContentScale;
                TerrainRectangle.Margin = new Thickness(-TerrainRectangle.Width / 2, -TerrainRectangle.Height / 2, 0, 0);
            }
            else if (e.PropertyName == "TerrainBrush")
            {
                switch (GlobalManagement.Instance.TerrainBrush)
                {
                case TerrainBrush.Circle:
                    TerrainMap.DefaultDrawingAttributes.StylusTip = System.Windows.Ink.StylusTip.Ellipse;
                    break;

                case TerrainBrush.Rectangle:
                    TerrainMap.DefaultDrawingAttributes.StylusTip = System.Windows.Ink.StylusTip.Rectangle;
                    break;
                }
            }
            else if (e.PropertyName == "Terrain")
            {
                switch (GlobalManagement.Instance.Terrain)
                {
                case FloorMaterial.Asphalt:
                    TerrainMap.DefaultDrawingAttributes.Color = Colors.LightGray;
                    break;

                case FloorMaterial.Grass:
                    TerrainMap.DefaultDrawingAttributes.Color = Colors.OliveDrab;
                    break;

                case FloorMaterial.Stone:
                    TerrainMap.DefaultDrawingAttributes.Color = Colors.Gray;
                    break;

                case FloorMaterial.Water:
                    TerrainMap.DefaultDrawingAttributes.Color = Colors.CornflowerBlue;
                    break;

                case FloorMaterial.Wood:
                    TerrainMap.DefaultDrawingAttributes.Color = Colors.DarkGoldenrod;
                    break;

                case FloorMaterial.Sand:
                    TerrainMap.DefaultDrawingAttributes.Color = Colors.PaleGoldenrod;
                    break;

                default:
                    TerrainMap.DefaultDrawingAttributes.Color = Colors.White;
                    break;
                }
            }
            #endregion
        }