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

org.geomajas.graphics.client.service.AbstractGraphicsObjectContainer Maven / Gradle / Ivy

/*
 * This is part of Geomajas, a GIS framework, http://www.geomajas.org/.
 *
 * Copyright 2008-2013 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.service;

import java.util.ArrayList;
import java.util.List;

import org.geomajas.graphics.client.event.AddAnchoredLinesEvent;
import org.geomajas.graphics.client.event.GraphicsObjectContainerEvent;
import org.geomajas.graphics.client.event.GraphicsObjectSelectedEvent;
import org.geomajas.graphics.client.event.GraphicsObjectContainerEvent.ActionType;
import org.geomajas.graphics.client.event.GraphicsObjectContainerEvent.Handler;
import org.geomajas.graphics.client.event.GraphicsOperationEvent;
import org.geomajas.graphics.client.object.GraphicsObject;
import org.geomajas.graphics.client.object.anchor.AnchoredTo;
import org.geomajas.graphics.client.shape.CoordinatePath;
import org.vaadin.gwtgraphics.client.Group;
import org.vaadin.gwtgraphics.client.Shape;
import org.vaadin.gwtgraphics.client.VectorObject;
import org.vaadin.gwtgraphics.client.VectorObjectContainer;
import org.vaadin.gwtgraphics.client.shape.Rectangle;

import com.google.gwt.dom.client.Style.Cursor;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.DomEvent.Type;
import com.google.gwt.event.dom.client.DoubleClickHandler;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.event.dom.client.HasDoubleClickHandlers;
import com.google.gwt.event.dom.client.HasMouseDownHandlers;
import com.google.gwt.event.dom.client.HasMouseMoveHandlers;
import com.google.gwt.event.dom.client.HasMouseOutHandlers;
import com.google.gwt.event.dom.client.HasMouseOverHandlers;
import com.google.gwt.event.dom.client.HasMouseUpHandlers;
import com.google.gwt.event.dom.client.HasMouseWheelHandlers;
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.MouseOutEvent;
import com.google.gwt.event.dom.client.MouseOutHandler;
import com.google.gwt.event.dom.client.MouseOverEvent;
import com.google.gwt.event.dom.client.MouseOverHandler;
import com.google.gwt.event.dom.client.MouseUpEvent;
import com.google.gwt.event.dom.client.MouseUpHandler;
import com.google.gwt.event.dom.client.MouseWheelEvent;
import com.google.gwt.event.dom.client.MouseWheelHandler;
import com.google.gwt.event.shared.EventHandler;
import com.google.gwt.event.shared.GwtEvent;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.event.shared.HasHandlers;
import com.google.web.bindery.event.shared.EventBus;

/**
 * 
 * Implementation of {@link GraphicsObjectContainer} that is backed by a root {@link VectorObjectContainer}. The
 * implementation provides catch-all mouse event handlers by adding a large background rectangle as the first child of
 * the container. All objects are added to a {@link Group}.
 * 
 * @author Jan De Moerloose
 * 
 */
public abstract class AbstractGraphicsObjectContainer implements GraphicsObjectContainer {

	private VectorObjectContainer rootGroup;

	private BackGround backGround = new BackGround();

	private ObjectGroup objectGroup = new ObjectGroup();

	private EventBus eventBus;

	private List objects = new ArrayList();

	protected AbstractGraphicsObjectContainer(EventBus eventBus) {
		this.eventBus = eventBus;
	}

	protected AbstractGraphicsObjectContainer(EventBus eventBus, VectorObjectContainer rootGroup) {
		this.eventBus = eventBus;
		setRootContainer(rootGroup);
	}

	public void setRootContainer(VectorObjectContainer rootGroup) {
		this.rootGroup = rootGroup;
		rootGroup.add(backGround);
		rootGroup.add(objectGroup);
	}

	public VectorObjectContainer getRootContainer() {
		return rootGroup;
	}

	@Override
	public HasAllMouseAndClickHandlers getObjectGroup() {
		return objectGroup;
	}

	@Override
	public HasAllMouseAndClickHandlers getBackGround() {
		return backGround;
	}

	@Override
	public void fireEvent(GwtEvent event) {
		backGround.fireEvent(event);
	}

	@Override
	public HandlerRegistration addMouseDownHandler(final MouseDownHandler handler) {
		return registerHandler((HasHandlers) rootGroup, handler, MouseDownEvent.getType());
	}

	@Override
	public HandlerRegistration addMouseUpHandler(MouseUpHandler handler) {
		return registerHandler((HasHandlers) rootGroup, handler, MouseUpEvent.getType());
	}

	@Override
	public HandlerRegistration addMouseOutHandler(MouseOutHandler handler) {
		return registerHandler((HasHandlers) rootGroup, handler, MouseOutEvent.getType());
	}

	@Override
	public HandlerRegistration addMouseOverHandler(MouseOverHandler handler) {
		return registerHandler((HasHandlers) rootGroup, handler, MouseOverEvent.getType());
	}

	@Override
	public HandlerRegistration addMouseMoveHandler(MouseMoveHandler handler) {
		return registerHandler((HasHandlers) rootGroup, handler, MouseMoveEvent.getType());
	}

	@Override
	public HandlerRegistration addMouseWheelHandler(MouseWheelHandler handler) {
		return registerHandler((HasHandlers) rootGroup, handler, MouseWheelEvent.getType());
	}

	@Override
	public HandlerRegistration addClickHandler(ClickHandler handler) {
		return ((HasClickHandlers) rootGroup).addClickHandler(handler);
	}

	@Override
	public HandlerRegistration addDoubleClickHandler(DoubleClickHandler handler) {
		return ((HasDoubleClickHandlers) rootGroup).addDoubleClickHandler(handler);
	}

	@Override
	public VectorObjectContainer createContainer() {
		Group group = new Group();
		objectGroup.add(group);
		return group;
	}

	@Override
	public void removeContainer(VectorObjectContainer container) {
		objectGroup.remove((Group) container);
	}

	@Override
	public List getObjects() {
		return objects;
	}

	@Override
	public void add(GraphicsObject object) {
		objectGroup.add(object.asObject());
		objects.add(object);
		eventBus.fireEvent(new GraphicsObjectContainerEvent(object, ActionType.ADD));
	}

	@Override
	public void remove(GraphicsObject object) {
		objectGroup.remove(object.asObject());
		objects.remove(object);
		eventBus.fireEvent(new GraphicsObjectContainerEvent(object, ActionType.REMOVE));
	}

	@Override
	public void clear() {
		objectGroup.clear();
		objects.clear();
		eventBus.fireEvent(new GraphicsObjectContainerEvent(ActionType.CLEAR));
	}

	@Override
	public void update(GraphicsObject object) {
		eventBus.fireEvent(new GraphicsObjectContainerEvent(object, ActionType.UPDATE));
	}

	@Override
	public void setSelected(GraphicsObject object, boolean selected) {
		eventBus.fireEvent(new GraphicsObjectSelectedEvent(object, selected));
	}

	@Override
	public void deselectAll() {
		eventBus.fireEvent(new GraphicsObjectSelectedEvent(null, false));
	}

	@Override
	public com.google.web.bindery.event.shared.HandlerRegistration addGraphicsObjectContainerHandler(Handler handler) {
		return eventBus.addHandler(GraphicsObjectContainerEvent.getType(), handler);
	}
	
	@Override
	public com.google.web.bindery.event.shared.HandlerRegistration addGraphicsOperationEventHandler(
			org.geomajas.graphics.client.event.GraphicsOperationEvent.Handler handler) {
		return eventBus.addHandler(GraphicsOperationEvent.getType(), handler);
	}	

	private  HandlerRegistration registerHandler(HasHandlers o, H handler, Type type) {
		if (type == MouseDownEvent.getType()) {
			return ((HasMouseDownHandlers) o).addMouseDownHandler((MouseDownHandler) handler);
		}
		if (type == MouseUpEvent.getType()) {
			return ((HasMouseUpHandlers) o).addMouseUpHandler((MouseUpHandler) handler);
		}
		if (type == MouseMoveEvent.getType()) {
			return ((HasMouseMoveHandlers) o).addMouseMoveHandler((MouseMoveHandler) handler);
		}
		if (type == MouseOverEvent.getType()) {
			return ((HasMouseOverHandlers) o).addMouseOverHandler((MouseOverHandler) handler);
		}
		if (type == MouseOutEvent.getType()) {
			return ((HasMouseOutHandlers) o).addMouseOutHandler((MouseOutHandler) handler);
		}
		if (type == MouseWheelEvent.getType()) {
			return ((HasMouseWheelHandlers) o).addMouseWheelHandler((MouseWheelHandler) handler);
		} else {
			throw new IllegalArgumentException("Unsupported type " + type.getName());
		}
	}

	/**
	 * Invisible background to capture all events. This is necessary to capture events outside the {@link ObjectGroup},
	 * e.g. clicking on background to deactivate all objects.
	 * 
	 */
	class BackGround extends Shape implements HasAllMouseAndClickHandlers {

		public BackGround() {
			setFillOpacity(0);
			setStrokeOpacity(0);
			getElement().getStyle().setCursor(Cursor.DEFAULT);
			drawTransformed();
		}

		@Override
		protected Class getType() {
			return Rectangle.class;
		}

		@Override
		protected void drawTransformed() {
			getImpl().setX(getElement(), Integer.MIN_VALUE / 200, isAttached());
			getImpl().setY(getElement(), Integer.MIN_VALUE / 200, isAttached());
			getImpl().setWidth(getElement(), Integer.MAX_VALUE / 100);
			getImpl().setHeight(getElement(), Integer.MAX_VALUE / 100);
		}

	}

	/**
	 * The {@link Group} that contains all {@link GraphicsObject}s of this container.
	 * 
	 * @author Jan De Moerloose
	 * 
	 */
	class ObjectGroup extends Group implements HasAllMouseAndClickHandlers {

	}
	
	@Override
	public com.google.web.bindery.event.shared.HandlerRegistration addAddAnchoredLinesHandler(
			org.geomajas.graphics.client.event.AddAnchoredLinesEvent.Handler handler) {
		return eventBus.addHandler(AddAnchoredLinesEvent.getType(), handler);
	}


	@Override
	public void findObjectsAnchoredTo(GraphicsObject object) {
		List coordinatePaths = new ArrayList();
		for (GraphicsObject go : objects) {
			if (go.hasRole(AnchoredTo.TYPE) && go.getRole(AnchoredTo.TYPE).getMasterObject() == object) {
				coordinatePaths.add(go.getRole(AnchoredTo.TYPE).getAnchorLineClone());
			}
		}
		eventBus.fireEvent(new AddAnchoredLinesEvent(object, coordinatePaths));
	}	

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy