/*
* This is part of Geomajas, a GIS framework, http://www.geomajas.org/.
*
* Copyright 2008-2015 Geosparc nv, http://www.geosparc.com/, Belgium.
*
* The program is available in open source according to the GNU Affero
* General Public License. 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.gwt2.plugin.editing.client.gfx;
import org.geomajas.gwt2.client.gfx.ShapeStyle;
import org.geomajas.plugin.editing.client.service.GeometryEditService;
import org.geomajas.plugin.editing.client.service.GeometryIndex;
import org.geomajas.plugin.editing.client.service.GeometryIndexNotFoundException;
/**
* Default implementation for the {@link GeometryIndexStyleFactory}.
*
* @author Pieter De Graef
*/
public class DefaultGeometryIndexStyleFactory implements GeometryIndexStyleFactory {
private final StyleProvider styleProvider;
// ------------------------------------------------------------------------
// Constructors:
// ------------------------------------------------------------------------
/**
* Create a {@link GeometryIndexStyleFactory} with the given {@link StyleProvider}. This service will be used for
* getting the correct styles.
*
* @param styleProvider The style service that will provide styles for states.
*/
public DefaultGeometryIndexStyleFactory(StyleProvider styleProvider) {
this.styleProvider = styleProvider;
}
// ------------------------------------------------------------------------
// GeometryIndexStyleFactory implementation:
// ------------------------------------------------------------------------
@Override
public ShapeStyle create(GeometryEditService editService, GeometryIndex index)
throws GeometryIndexNotFoundException {
if (index == null) {
return findGeometryStyle(editService, index);
}
switch (editService.getIndexService().getType(index)) {
case TYPE_VERTEX:
return findVertexStyle(editService, index);
case TYPE_EDGE:
return findEdgeStyle(editService, index);
default:
return findGeometryStyle(editService, index);
}
}
// ------------------------------------------------------------------------
// Public methods:
// ------------------------------------------------------------------------
/**
* Get the service that provides styles for states.
*/
public StyleProvider getStyleService() {
return styleProvider;
}
// ------------------------------------------------------------------------
// Private methods:
// ------------------------------------------------------------------------
private ShapeStyle findVertexStyle(GeometryEditService editService, GeometryIndex index) {
if (editService.getIndexStateService().isMarkedForDeletion(index)) {
return styleProvider.getVertexMarkForDeletionStyle();
} else if (!editService.getIndexStateService().isEnabled(index)) {
return styleProvider.getVertexDisabledStyle();
} else if (editService.getIndexStateService().isSnapped(index)) {
return styleProvider.getVertexSnappedStyle();
}
boolean selected = editService.getIndexStateService().isSelected(index);
boolean highlighted = editService.getIndexStateService().isHightlighted(index);
if (selected && highlighted) {
return styleProvider.getVertexSelectHoverStyle();
} else if (selected) {
return styleProvider.getVertexSelectStyle();
} else if (highlighted) {
return styleProvider.getVertexHoverStyle();
}
return styleProvider.getVertexStyle();
}
private ShapeStyle findEdgeStyle(GeometryEditService editService, GeometryIndex index) {
if (editService.getIndexStateService().isMarkedForDeletion(index)) {
return styleProvider.getEdgeMarkForDeletionStyle();
} else if (!editService.getIndexStateService().isEnabled(index)) {
return styleProvider.getEdgeDisabledStyle();
}
boolean selected = editService.getIndexStateService().isSelected(index);
boolean highlighted = editService.getIndexStateService().isHightlighted(index);
if (selected && highlighted) {
return styleProvider.getEdgeSelectHoverStyle();
} else if (selected) {
return styleProvider.getEdgeSelectStyle();
} else if (highlighted) {
return styleProvider.getEdgeHoverStyle();
}
return styleProvider.getEdgeStyle();
}
private ShapeStyle findGeometryStyle(GeometryEditService editService, GeometryIndex index) {
if (index != null) {
if (!editService.getIndexStateService().isEnabled(index)) {
return styleProvider.getBackgroundDisabledStyle();
} else if (editService.getIndexStateService().isMarkedForDeletion(index)) {
return styleProvider.getBackgroundMarkedForDeletionStyle();
}
}
return styleProvider.getBackgroundStyle();
}
}