All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.geomajas.graphics.client.controller.CreateResizableController Maven / Gradle / Ivy

The newest version!
/*
 * This is part of Geomajas, a GIS framework, http://www.geomajas.org/.
 *
 * Copyright 2008-2014 Geosparc nv, http://www.geosparc.com/, Belgium.
 *
 * The program is available in open source according to the Apache
 * License, Version 2.0. All contributions in this program are covered
 * by the Geomajas Contributors License Agreement. For full licensing
 * details, see LICENSE.txt in the project root.
 */
package org.geomajas.graphics.client.controller;

import org.geomajas.geometry.Bbox;
import org.geomajas.geometry.Coordinate;
import org.geomajas.graphics.client.object.GraphicsObject;
import org.geomajas.graphics.client.object.Resizable;
import org.geomajas.graphics.client.object.anchor.Anchored;
import org.geomajas.graphics.client.operation.AddOperation;
import org.geomajas.graphics.client.service.GraphicsObjectContainer.Space;
import org.geomajas.graphics.client.service.GraphicsService;
import org.geomajas.graphics.client.util.BboxPosition;
import org.geomajas.graphics.client.util.GraphicsUtil;
import org.vaadin.gwtgraphics.client.VectorObjectContainer;

import com.google.gwt.event.dom.client.MouseDownEvent;
import com.google.gwt.event.dom.client.MouseDownHandler;
import com.google.gwt.event.dom.client.MouseMoveEvent;
import com.google.gwt.event.dom.client.MouseMoveHandler;
import com.google.gwt.event.dom.client.MouseUpEvent;
import com.google.gwt.event.dom.client.MouseUpHandler;
import com.google.gwt.user.client.DOM;
import com.google.web.bindery.event.shared.HandlerRegistration;

/**
 * Generic controller that creates a {@link Resizable}.
 * 
 * @author Jan De Moerloose
 * @param 
 * 
 */
public abstract class CreateResizableController
	extends CreateController implements MouseDownHandler,
		MouseMoveHandler, MouseUpHandler {

	private GraphicsObject dragResizable;

	private Coordinate begin;

	private boolean active;

	/**
	 * Our own container.
	 */
	private VectorObjectContainer container;

	private HandlerRegistration registration;

	/**
	 * Create the object. This object should support the {@link Resizable} role.
	 * 
	 * @return
	 */
	protected abstract GraphicsObject createObject();

	public CreateResizableController(GraphicsService graphicsService) {
		super(graphicsService);
		container = createContainer();
	}

	@Override
	public void setActive(boolean active) {
		this.active = active;
		if (active) {
			container = createContainer();
			registration = getObjectContainer().addMouseDownHandler(this);
		} else {
			if (container != null) {
				removeContainer(container);
			}
			container = null;
			if (registration != null) {
				registration.removeHandler();
				registration = null;
			}
		}
	}

	@Override
	public boolean isActive() {
		return active;
	}

	@Override
	public void destroy() {
	}

	@Override
	public void onMouseDown(MouseDownEvent event) {
		begin = getUserCoordinate(event);
		if (dragResizable == null) {
			dragResizable = createObject();
			dragResizable.getRole(Resizable.TYPE).setUserBounds(new Bbox(begin.getX(), begin.getY(), 0, 0));
			setAnchor(dragResizable);
			dragResizable.asObject().addMouseMoveHandler(this);
			dragResizable.asObject().addMouseUpHandler(this);
			container.add(dragResizable.asObject());
		}
		DOM.setCapture(dragResizable.asObject().getElement());
	}

	private void setAnchor(GraphicsObject object) {
		if (object.hasRole(Anchored.TYPE)) {
			Bbox userBounds = object.getRole(Resizable.TYPE).getUserBounds();
			Coordinate midLow = GraphicsUtil.getPosition(userBounds, BboxPosition.MIDDLE_LOW);
			Coordinate midLowScreen = getObjectContainer().transform(midLow, Space.USER, Space.SCREEN);
			Coordinate anchorPos = getObjectContainer().transform(
					new Coordinate(midLowScreen.getX(), midLowScreen.getY() + 20), Space.SCREEN, Space.USER);
			object.getRole(Anchored.TYPE).setAnchorPosition(anchorPos);
		}

	}

	@Override
	public void onMouseUp(MouseUpEvent event) {
		GraphicsObject result = createObject();
		result.getRole(Resizable.TYPE).setUserBounds(dragResizable.getRole(Resizable.TYPE).getUserBounds());
		setAnchor(result);
		DOM.releaseCapture(dragResizable.asObject().getElement());
		container.remove(dragResizable.asObject());
		dragResizable = null;
		execute(new AddOperation(result));
	}

	@Override
	public void onMouseMove(MouseMoveEvent event) {
		Coordinate end = getUserCoordinate(event);
		dragResizable.getRole(Resizable.TYPE).setUserBounds(
				new Bbox(Math.min(begin.getX(), end.getX()), Math.min(begin.getY(), end.getY()), Math.abs(begin.getX()
						- end.getX()), Math.abs(begin.getY() - end.getY())));
		setAnchor(dragResizable);
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy