1 /*******************************************************************************
2 * Copyright (c) 2010, 2011 Association for Decentralized Information Management in
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * which accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * VTT Technical Research Centre of Finland - initial API and implementation
11 *******************************************************************************/
12 package org.simantics.browsing.ui.model.dnd;
14 import java.util.ArrayList;
15 import java.util.Collection;
16 import java.util.HashSet;
18 import org.eclipse.swt.dnd.DND;
19 import org.simantics.browsing.ui.BuiltinKeys;
20 import org.simantics.browsing.ui.NodeContext;
21 import org.simantics.browsing.ui.model.InvalidContribution;
22 import org.simantics.browsing.ui.model.nodetypes.EntityNodeType;
23 import org.simantics.browsing.ui.model.nodetypes.NodeType;
24 import org.simantics.browsing.ui.model.nodetypes.OrderedNodeTypeMultiMap;
25 import org.simantics.db.ReadGraph;
26 import org.simantics.db.Resource;
27 import org.simantics.db.exception.DatabaseException;
28 import org.simantics.viewpoint.ontology.ViewpointResource;
30 public class DndBrowseContext {
31 OrderedNodeTypeMultiMap<DropActionContribution> dropActionContributions = new OrderedNodeTypeMultiMap<DropActionContribution>();
33 private DndBrowseContext() {
36 public static DndBrowseContext create(ReadGraph g, Collection<Resource> browseContextResources) throws DatabaseException, InvalidContribution {
37 ViewpointResource vr = ViewpointResource.getInstance(g);
38 DndBrowseContext browseContext = new DndBrowseContext();
39 for(Resource browseContextResource : findSubcontexts(g, browseContextResources)) {
40 for(Resource actionContributionResource :
41 g.getObjects(browseContextResource, vr.BrowseContext_HasDropActionContribution)) {
42 DropActionContribution.load(g, actionContributionResource,
43 browseContext.dropActionContributions
50 private static Collection<Resource> findSubcontexts(ReadGraph g,
51 Collection<Resource> browseContexts) throws DatabaseException {
52 ViewpointResource vr = ViewpointResource.getInstance(g);
53 HashSet<Resource> result = new HashSet<Resource>(browseContexts);
54 ArrayList<Resource> stack = new ArrayList<Resource>(browseContexts);
55 while(!stack.isEmpty()) {
56 Resource cur = stack.remove(stack.size()-1);
57 for(Resource sc : g.getObjects(cur, vr.BrowseContext_Includes))
64 private static NodeType getNodeType(ReadGraph graph, NodeContext parent) throws DatabaseException {
65 NodeType nodeType = parent.getConstant(NodeType.TYPE);
66 if(nodeType == null) {
67 // TODO remove this code when root of model browser is fixed
68 Object input = parent.getConstant(BuiltinKeys.INPUT);
69 if(input instanceof Resource)
70 nodeType = EntityNodeType.getNodeTypeFor(graph, (Resource)input);
76 * Returns drop copy action.
78 public Runnable getAction(ReadGraph graph, NodeContext target, Object source) throws DatabaseException {
79 return getAction(graph, target, source, DND.DROP_COPY);
83 * Return drop operation for given operation. @See org.eclipse.swt.dnd.DND
85 public Runnable getAction(ReadGraph graph, NodeContext target, Object source, int operation) throws DatabaseException {
86 NodeType nodeType = getNodeType(graph, target);
89 for(DropActionContribution contribution : dropActionContributions.get(graph, nodeType)) {
90 Runnable action = contribution.getAction(graph, target, source, operation);