]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.charts/src/org/simantics/charts/editor/ChartPasteHandler2.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.charts / src / org / simantics / charts / editor / ChartPasteHandler2.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2012 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.editor;\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.List;\r
18 import java.util.Set;\r
19 \r
20 import org.eclipse.core.runtime.IStatus;\r
21 import org.eclipse.core.runtime.Status;\r
22 import org.simantics.Simantics;\r
23 import org.simantics.charts.Activator;\r
24 import org.simantics.charts.query.AddChartItem;\r
25 import org.simantics.charts.query.ChartItemDescriptor;\r
26 import org.simantics.databoard.util.ObjectUtils;\r
27 import org.simantics.db.Resource;\r
28 import org.simantics.db.WriteGraph;\r
29 import org.simantics.db.common.request.WriteRequest;\r
30 import org.simantics.db.exception.DatabaseException;\r
31 import org.simantics.db.layer0.request.PossibleModel;\r
32 import org.simantics.db.layer0.util.ClipboardUtils;\r
33 import org.simantics.db.layer0.util.SimanticsClipboard.Representation;\r
34 import org.simantics.db.layer0.util.SimanticsKeys;\r
35 import org.simantics.g2d.canvas.ICanvasParticipant;\r
36 import org.simantics.g2d.canvas.impl.AbstractCanvasParticipant;\r
37 import org.simantics.modeling.ModelingResources;\r
38 import org.simantics.scenegraph.g2d.events.EventHandlerReflection.EventHandler;\r
39 import org.simantics.scenegraph.g2d.events.command.CommandEvent;\r
40 import org.simantics.scenegraph.g2d.events.command.Commands;\r
41 \r
42 /**\r
43  * Handles paste to TimeSeriesEditor\r
44  * \r
45  * @author toni.kalajainen\r
46  */\r
47 public class ChartPasteHandler2 extends AbstractCanvasParticipant implements ICanvasParticipant {\r
48 \r
49     private Resource chart;\r
50 \r
51     public ChartPasteHandler2(Resource chart) {\r
52         this.chart = chart;\r
53     }\r
54 \r
55     @EventHandler(priority = 0)\r
56     public boolean handleCommandEvent(CommandEvent e) {\r
57 \r
58         if (e.command == Commands.PASTE) {\r
59 \r
60             final List<Resource> resources = new ArrayList<Resource>();\r
61             for (Set<Representation> object : Simantics.getClipboard().getContents()) {\r
62                 Collection<Resource> rs;\r
63                 try {\r
64                     rs = ClipboardUtils.accept(object, SimanticsKeys.KEY_COPY_RESOURCES);\r
65                     if (rs != null)\r
66                         resources.addAll(rs);\r
67                 } catch (DatabaseException ex) {\r
68                     Activator.getDefault().getLog().log(new Status(IStatus.ERROR, Activator.PLUGIN_ID,\r
69                             "Failed to retrieve clipboard contents.", ex));\r
70                 }\r
71             }\r
72 \r
73             if (resources.isEmpty())\r
74                 return true;\r
75 \r
76             Simantics.getSession().asyncRequest(new WriteRequest() {\r
77                 @Override\r
78                 public void perform(WriteGraph graph) throws DatabaseException {\r
79                     Resource expectedModel = graph.syncRequest(new PossibleModel(chart));\r
80                     if (expectedModel == null || chart == null)\r
81                         return;\r
82                     ModelingResources MOD = ModelingResources.getInstance(graph);\r
83                     List<ChartItemDescriptor> refs = new ArrayList<ChartItemDescriptor>();\r
84                     for (Resource r : resources) {\r
85                         if (graph.isInstanceOf(r, MOD.Subscription_Item)) {\r
86                             Resource model = graph.syncRequest(new PossibleModel(r));\r
87                             if (ObjectUtils.objectEquals(expectedModel, model))\r
88                                 refs.add(AddChartItem.createDescriptor(graph, r));\r
89                         }\r
90                     }\r
91 \r
92                     if (!refs.isEmpty()) {\r
93                         AddChartItem.addAndMoveChartItems(chart, refs, Collections.<Resource> emptySet())\r
94                                 .perform(graph);\r
95                     }\r
96                 }\r
97             });\r
98             return true;\r
99         }\r
100 \r
101         return false;\r
102 \r
103     }\r
104 \r
105 }\r