]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.charts/src/org/simantics/charts/ui/ChartGroupDropActionFactory.java
7f54ad981f82704e779a9b5f32facefa2f148e01
[simantics/platform.git] / bundles / org.simantics.charts / src / org / simantics / charts / ui / ChartGroupDropActionFactory.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2011 Association for Decentralized Information Management in\r
3  * Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.charts.ui;\r
13 \r
14 import java.util.ArrayList;\r
15 import java.util.Collection;\r
16 import java.util.Collections;\r
17 import java.util.HashSet;\r
18 import java.util.List;\r
19 import java.util.Set;\r
20 \r
21 import org.simantics.Simantics;\r
22 import org.simantics.charts.ontology.ChartResource;\r
23 import org.simantics.databoard.util.ObjectUtils;\r
24 import org.simantics.db.ReadGraph;\r
25 import org.simantics.db.Resource;\r
26 import org.simantics.db.WriteGraph;\r
27 import org.simantics.db.common.CommentMetadata;\r
28 import org.simantics.db.common.request.WriteRequest;\r
29 import org.simantics.db.common.request.WriteResultRequest;\r
30 import org.simantics.db.common.utils.NameUtils;\r
31 import org.simantics.db.exception.DatabaseException;\r
32 import org.simantics.db.layer0.SelectionHints;\r
33 import org.simantics.db.layer0.adapter.DropActionFactory;\r
34 import org.simantics.db.layer0.adapter.impl.DefaultPasteImportAdvisor;\r
35 import org.simantics.db.layer0.request.PossibleModel;\r
36 import org.simantics.db.layer0.util.ClipboardUtils;\r
37 import org.simantics.db.layer0.util.SimanticsClipboard.Representation;\r
38 import org.simantics.db.layer0.util.SimanticsKeys;\r
39 import org.simantics.graph.db.TransferableGraphs;\r
40 import org.simantics.graph.representation.TransferableGraph1;\r
41 import org.simantics.layer0.Layer0;\r
42 import org.simantics.utils.datastructures.Callback;\r
43 import org.simantics.utils.ui.ErrorLogger;\r
44 import org.simantics.utils.ui.ISelectionUtils;\r
45 import org.simantics.utils.ui.dialogs.ShowError;\r
46 \r
47 /**\r
48  * @author Tuukka Lehtonen\r
49  */\r
50 public class ChartGroupDropActionFactory implements DropActionFactory {\r
51 \r
52     @Override\r
53     public Runnable create(ReadGraph graph, Object target, Object source, int operation) throws DatabaseException {\r
54         final Resource chartGroup = ISelectionUtils.getSinglePossibleKey(target, SelectionHints.KEY_MAIN,\r
55                 Resource.class);\r
56         if (chartGroup == null)\r
57             return null;\r
58         Resource targetModel = graph.syncRequest(new PossibleModel(chartGroup));\r
59         if (targetModel == null)\r
60             return null;\r
61 \r
62         List<Resource> srcs = ISelectionUtils.getPossibleKeys(source, SelectionHints.KEY_MAIN, Resource.class);\r
63         Layer0 L0 = Layer0.getInstance(graph); \r
64         ChartResource CHART = ChartResource.getInstance(graph);\r
65         Set<Resource> chartsToMove= new HashSet<Resource>();\r
66         for (Resource res : srcs) {\r
67             if (graph.isInstanceOf(res, CHART.Chart)) {\r
68                 Resource model = graph.syncRequest(new PossibleModel(res));\r
69                 if (ObjectUtils.objectEquals(targetModel, model)) {\r
70                     Resource partOf = graph.getPossibleObject(res, L0.PartOf);\r
71                     if (!ObjectUtils.objectEquals(chartGroup, partOf)) {\r
72                         chartsToMove.add(res);\r
73                     }\r
74                 }\r
75             }\r
76         }\r
77         if (!chartsToMove.isEmpty()) {\r
78             String error = validateDrop(graph, chartGroup, chartsToMove);\r
79             if (error != null) {\r
80                 ShowError.showError("Chart Drop Failed", error, (Exception) null);\r
81                 return null;\r
82             }\r
83             // TODO: support for move & copy\r
84             return moveCharts(chartGroup, chartsToMove);\r
85         }\r
86 \r
87         return null;\r
88     }\r
89 \r
90     public static String validateDrop(ReadGraph graph, Resource chartGroup, Set<Resource> chartsToMove) throws DatabaseException {\r
91         StringBuilder sb = new StringBuilder();\r
92         String targetName = NameUtils.getSafeName(graph, chartGroup);\r
93         Layer0 L0 = Layer0.getInstance(graph);\r
94         // Verify that target doesn't contain charts names as in chartsToMove\r
95         Set<String> sourceNames = new HashSet<String>();\r
96         for (Resource chart : chartsToMove) {\r
97             String chartName = NameUtils.getSafeName(graph, chart);\r
98             if (!sourceNames.add(chartName)) {\r
99                 sb.append("Multiple charts with same '" + chartName + "' cannot be moved into the same chart group.\n");\r
100             }\r
101         }\r
102         Set<String> reservedNames = NameUtils.findReservedNames(graph, "", chartGroup, L0.ConsistsOf);\r
103         for (String sourceName : sourceNames) {\r
104             if (reservedNames.contains(sourceName)) {\r
105                 sb.append("Name '" + sourceName + "' already in use in target '" + targetName + "'.\n");\r
106             }\r
107         }\r
108 \r
109         return (sb.length() == 0) ? null : sb.toString();\r
110     }\r
111 \r
112     public static Runnable moveCharts(final Resource chartGroup, final Set<Resource> chartsToMove) {\r
113         return new Runnable() {\r
114             @Override\r
115             public void run() {\r
116                 Simantics.getSession().asyncRequest(new WriteRequest() {\r
117 \r
118                                         @Override\r
119                                         public void perform(WriteGraph graph)\r
120                                                         throws DatabaseException {\r
121                                 graph.syncRequest(moveChartsRequest(chartGroup, chartsToMove));\r
122                                         }\r
123                 }, new Callback<DatabaseException>() {\r
124                     @Override\r
125                     public void run(DatabaseException e) {\r
126                         if (e != null)\r
127                             ErrorLogger.defaultLogError(e);\r
128                     }\r
129                 });\r
130             }\r
131         };\r
132     }\r
133 \r
134     public static MoveCharts moveChartsRequest(Resource chartGroup, Set<Resource> chartsToMove) {\r
135         return new MoveCharts(chartGroup, chartsToMove);\r
136     }\r
137 \r
138     public static class MoveCharts extends WriteResultRequest<Collection<Resource>> {\r
139         private Resource chartGroup;\r
140         private Set<Resource> chartsToMove;\r
141 \r
142         public MoveCharts(Resource chartGroup, Set<Resource> chartsToMove) {\r
143             this.chartGroup = chartGroup;\r
144             this.chartsToMove = chartsToMove;\r
145         }\r
146         @Override\r
147         public Collection<Resource> perform(WriteGraph graph) throws DatabaseException {\r
148             if (chartsToMove.isEmpty())\r
149                 return Collections.emptyList();\r
150             CommentMetadata cm = graph.getMetadata(CommentMetadata.class);\r
151             String targetName = NameUtils.getSafeName(graph, chartGroup);\r
152             Layer0 L0 = Layer0.getInstance(graph);\r
153             List<Resource> result = new ArrayList<Resource>();\r
154             for (Resource chart : chartsToMove) {\r
155                 graph.deny(chart, L0.PartOf);\r
156                 graph.claim(chartGroup, L0.ConsistsOf, chart);\r
157                 cm.add("Moved chart '" + NameUtils.getSafeLabel(graph, chart) + "' to chart group '" + targetName + "'");\r
158                 result.add(chart);\r
159             }\r
160             graph.addMetadata(cm);\r
161             return result;\r
162         }\r
163     }\r
164 \r
165     public static CopyCharts copyChartsRequest(Resource chartGroup, Set<Set<Representation>> sources) {\r
166         return new CopyCharts(chartGroup, sources);\r
167     }\r
168 \r
169     public static class CopyCharts extends WriteResultRequest<Collection<Resource>> {\r
170         private Resource chartGroup;\r
171         private Set<Set<Representation>> sources;\r
172 \r
173         public CopyCharts(Resource chartGroup, Set<Set<Representation>> sources) {\r
174             this.chartGroup = chartGroup;\r
175             this.sources = sources;\r
176         }\r
177         @Override\r
178         public Collection<Resource> perform(WriteGraph graph) throws DatabaseException {\r
179             if (sources.isEmpty())\r
180                 return Collections.emptyList();\r
181             CommentMetadata cm = graph.getMetadata(CommentMetadata.class);\r
182             String targetName = NameUtils.getSafeName(graph, chartGroup);\r
183             List<Resource> result = new ArrayList<Resource>();\r
184             for (Set<Representation> r : sources) {\r
185                 Collection<Resource> srcs = ClipboardUtils.accept(graph, r, SimanticsKeys.KEY_COPY_RESOURCES);\r
186                 for(Resource src : srcs) {\r
187                     TransferableGraph1 tg = ClipboardUtils.accept(graph, r, SimanticsKeys.KEY_TRANSFERABLE_GRAPH);\r
188                     DefaultPasteImportAdvisor advisor = new DefaultPasteImportAdvisor(chartGroup); \r
189                     TransferableGraphs.importGraph1(graph, tg, advisor);\r
190                     cm.add("Copied chart '" + NameUtils.getSafeLabel(graph, src) + "' to chart group '" + targetName + "'");\r
191                     result.addAll(advisor.getRoots());\r
192                 }\r
193             }\r
194             graph.addMetadata(cm);\r
195             return result;\r
196         }\r
197     }\r
198 \r
199 }