]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.browsing.ui.model/src/org/simantics/browsing/ui/model/dnd/DndBrowseContext.java
Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.browsing.ui.model / src / org / simantics / browsing / ui / model / dnd / DndBrowseContext.java
1 /*******************************************************************************
2  * Copyright (c) 2010, 2011 Association for Decentralized Information Management in
3  * Industry THTH ry.
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
8  *
9  * Contributors:
10  *     VTT Technical Research Centre of Finland - initial API and implementation
11  *******************************************************************************/
12 package org.simantics.browsing.ui.model.dnd;
13
14 import java.util.ArrayList;
15 import java.util.Collection;
16 import java.util.HashSet;
17
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;
29
30 public class DndBrowseContext {
31     OrderedNodeTypeMultiMap<DropActionContribution> dropActionContributions = new OrderedNodeTypeMultiMap<DropActionContribution>();
32     
33     private DndBrowseContext() {
34     }
35     
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
44                         );
45             }
46         }
47         return browseContext;
48     }
49     
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))
58                 if(result.add(sc))
59                     stack.add(sc);
60         }
61         return result;
62     }    
63     
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);
71         }
72         return nodeType;
73     }
74     
75     /**
76      * Returns drop copy action.
77      */
78     public Runnable getAction(ReadGraph graph, NodeContext target, Object source) throws DatabaseException {
79         return getAction(graph, target, source, DND.DROP_COPY);
80     }
81     
82     /**
83      * Return drop operation for given operation. @See org.eclipse.swt.dnd.DND
84      */
85     public Runnable getAction(ReadGraph graph, NodeContext target, Object source, int operation) throws DatabaseException {
86         NodeType nodeType = getNodeType(graph, target);
87         if(nodeType == null)
88             return null;
89         for(DropActionContribution contribution : dropActionContributions.get(graph, nodeType)) {
90             Runnable action = contribution.getAction(graph, target, source, operation);
91             if(action != null)
92                 return action;
93         }
94         return null;
95     }
96 }