/*
* Copyright (c) 2012 Data Harmonisation Panel
*
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution. If not, see <http://www.gnu.org/licenses/>.
*
* Contributors:
* HUMBOLDT EU Integrated Project #030962
* Data Harmonisation Panel <http://www.dhpanel.eu>
*/
package eu.esdihumboldt.hale.ui.style.handler;
import java.util.Map.Entry;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.IHandler;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.handlers.HandlerUtil;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.SetMultimap;
import eu.esdihumboldt.hale.common.align.model.EntityDefinition;
import eu.esdihumboldt.hale.common.instance.model.DataSet;
import eu.esdihumboldt.hale.common.instance.model.Instance;
import eu.esdihumboldt.hale.common.instance.model.InstanceReference;
import eu.esdihumboldt.hale.common.schema.SchemaSpaceID;
import eu.esdihumboldt.hale.common.schema.model.TypeDefinition;
import eu.esdihumboldt.hale.ui.service.instance.InstanceService;
import eu.esdihumboldt.hale.ui.service.schema.SchemaService;
import eu.esdihumboldt.hale.ui.style.DataSetTypeSelectionDialog;
import eu.esdihumboldt.hale.ui.style.dialog.FeatureStyleDialog;
import eu.esdihumboldt.util.Pair;
/**
* Shows a {@link FeatureStyleDialog} for a selected {@link TypeDefinition} or
* entity definition that represents a type.
*
* @author Simon Templer
*/
public class TypeStyleHandler extends AbstractHandler {
/**
* @see IHandler#execute(ExecutionEvent)
*/
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
// collect types and associated data sets
SetMultimap<DataSet, TypeDefinition> types = collectTypesFromSelection(event);
Pair<TypeDefinition, DataSet> typeInfo = null;
// select a type
if (types.size() == 1) {
Entry<DataSet, TypeDefinition> entry = types.entries().iterator().next();
typeInfo = new Pair<TypeDefinition, DataSet>(entry.getValue(), entry.getKey());
}
else if (!types.isEmpty()) {
// choose through dialog
DataSetTypeSelectionDialog dialog = new DataSetTypeSelectionDialog(
Display.getCurrent().getActiveShell(),
"Multiple types: select which to change the style for", null, types);
if (dialog.open() == DataSetTypeSelectionDialog.OK) {
typeInfo = dialog.getObject();
}
}
if (typeInfo != null) {
try {
FeatureStyleDialog dialog = new FeatureStyleDialog(typeInfo.getFirst(),
typeInfo.getSecond());
dialog.setBlockOnOpen(false);
dialog.open();
} catch (Exception e) {
throw new ExecutionException("Could not open style dialog", e);
}
}
return null;
}
/**
* Determine which data set a type represents.
*
* @param type the type definition
* @return the data set
*/
private static DataSet findDataSet(TypeDefinition type) {
SchemaService ss = PlatformUI.getWorkbench().getService(SchemaService.class);
if (ss.getSchemas(SchemaSpaceID.SOURCE).getMappingRelevantTypes().contains(type)) {
return DataSet.SOURCE;
}
if (ss.getSchemas(SchemaSpaceID.TARGET).getMappingRelevantTypes().contains(type)) {
return DataSet.TRANSFORMED;
}
// default to source
return DataSet.SOURCE;
}
/**
* Collect all type definitions and data sets from the current selection of
* {@link TypeDefinition}s, {@link EntityDefinition}s, {@link Instance}s and
* {@link InstanceReference}s.
*
* @param event the handler execution event
* @return the collected type definitions
*/
public static SetMultimap<DataSet, TypeDefinition> collectTypesFromSelection(
ExecutionEvent event) {
SetMultimap<DataSet, TypeDefinition> types = HashMultimap.create();
ISelection selection = HandlerUtil.getCurrentSelection(event);
if (selection instanceof IStructuredSelection && !selection.isEmpty()) {
for (Object object : ((IStructuredSelection) selection).toArray()) {
if (object instanceof TypeDefinition) {
TypeDefinition type = (TypeDefinition) object;
if (!types.containsValue(type)) {
DataSet dataSet = findDataSet(type);
types.put(dataSet, type);
}
}
if (object instanceof EntityDefinition) {
EntityDefinition entityDef = (EntityDefinition) object;
if (entityDef.getPropertyPath().isEmpty()) {
DataSet dataSet = (entityDef.getSchemaSpace() == SchemaSpaceID.SOURCE)
? (DataSet.SOURCE) : (DataSet.TRANSFORMED);
types.put(dataSet, entityDef.getType());
}
}
if (object instanceof InstanceReference) {
InstanceService is = HandlerUtil.getActiveWorkbenchWindow(event).getWorkbench()
.getService(InstanceService.class);
object = is.getInstance((InstanceReference) object);
}
if (object instanceof Instance) {
Instance instance = (Instance) object;
types.put(instance.getDataSet(), instance.getDefinition());
}
}
}
return types;
}
}