class LocationControlImpl extends AbstractCanvasHandlerRegistrationControl<AbstractCanvasHandler> implements LocationControl<AbstractCanvasHandler, Element>,
                   CanvasControl.SessionAware<EditorSession> {

    @Override
    @SuppressWarnings("unchecked")
    public void register(final Element element) {
        if (null != element.asNode() && checkNotRegistered(element)) {
            final AbstractCanvas<?> canvas = canvasHandler.getAbstractCanvas();
            final Shape<?> shape = canvas.getShape(element.getUUID());
            final ShapeView shapeView = shape.getShapeView();

            // Enable drag & ensure location constraints are set, if any.
            shapeView.setDragEnabled(true);
            ensureDragConstraints(canvas, shapeView);

            // Register handlers.
            if (shape.getShapeView() instanceof HasEventHandlers) {
                final HasEventHandlers hasEventHandlers = (HasEventHandlers) shapeView;

                // Change mouse cursor, if shape supports it.
                if (supportsMouseEnter(hasEventHandlers) &&
                        supportsMouseExit(hasEventHandlers)) {
                    final MouseEnterHandler overHandler = new MouseEnterHandler() {
                        @Override
                        public void handle(MouseEnterEvent event) {
                            canvasHandler.getAbstractCanvas().getView().setCursor(AbstractCanvas.Cursors.MOVE);
                        }
                    };
                    hasEventHandlers.addHandler(ViewEventType.MOUSE_ENTER,
                                                overHandler);
                    registerHandler(shape.getUUID(),
                                    overHandler);
                    final MouseExitHandler outHandler = new MouseExitHandler() {
                        @Override
                        public void handle(MouseExitEvent event) {
                            canvasHandler.getAbstractCanvas().getView().setCursor(AbstractCanvas.Cursors.DEFAULT);
                        }
                    };
                    hasEventHandlers.addHandler(ViewEventType.MOUSE_EXIT,
                                                outHandler);
                    registerHandler(shape.getUUID(),
                                    outHandler);

                    //Adding DragHandler on the shape to check whether the moving shape is not selected, th
                    final DragHandler dragHandler = new DragHandler() {
                        @Override
                        public void start(DragEvent event) {
                            // Instead of firing the event on Drag start, now will be fired at the end, hence improving performance
                        }

                        @Override
                        public void end(DragEvent event) {
                            selectionEvent.fire(new CanvasSelectionEvent(canvasHandler, shape.getUUID()));
                        }

                        @Override
                        public void handle(DragEvent event) {
                        }
                    };

                    hasEventHandlers.addHandler(ViewEventType.DRAG, dragHandler);
                    registerHandler(shape.getUUID(), dragHandler);
                }
            }
        }
    }

    protected  LocationControlImpl();
    @Inject public  LocationControlImpl(final CanvasCommandFactory<AbstractCanvasHandler> canvasCommandFactory,
                               final Event<ShapeLocationsChangedEvent> shapeLocationsChangedEvent,
                               final Event<CanvasSelectionEvent> selectionEvent);

}