]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.ui/src/org/simantics/ui/dnd/ResourceReferenceTransfer.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.ui / src / org / simantics / ui / dnd / ResourceReferenceTransfer.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in 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.ui.dnd;\r
13 \r
14 import org.eclipse.swt.dnd.ByteArrayTransfer;\r
15 import org.eclipse.swt.dnd.DND;\r
16 import org.eclipse.swt.dnd.TextTransfer;\r
17 import org.eclipse.swt.dnd.TransferData;\r
18 import org.simantics.db.Resource;\r
19 import org.simantics.db.Session;\r
20 import org.simantics.db.common.ResourceArray;\r
21 import org.simantics.db.exception.DatabaseException;\r
22 import org.simantics.db.service.SerialisationSupport;\r
23 import org.simantics.ui.SimanticsUI;\r
24 \r
25 /**\r
26  * @author Tuukka Lehtonen\r
27  */\r
28 public class ResourceReferenceTransfer extends ByteArrayTransfer {\r
29 \r
30     private static final String                    TYPENAME = "ResourceReferenceTransfer";\r
31 \r
32     private static final int                       TYPEID   = registerType(TYPENAME);\r
33 \r
34     private static final ResourceReferenceTransfer INSTANCE = createInstance((String) null);\r
35 \r
36     private String                                 purpose;\r
37     private Session                                session;\r
38 \r
39     public static ResourceReferenceTransfer getInstance() {\r
40         return INSTANCE;\r
41     }\r
42 \r
43     public static ResourceReferenceTransfer createInstance(Session session) {\r
44         ResourceReferenceTransfer result = new ResourceReferenceTransfer(null);\r
45         result.session = session;\r
46         return result;\r
47     }\r
48 \r
49     public static ResourceReferenceTransfer createInstance(String purpose) {\r
50         ResourceReferenceTransfer result = new ResourceReferenceTransfer(purpose);\r
51         return result;\r
52     }\r
53 \r
54     ResourceReferenceTransfer(String purpose) {\r
55         this.purpose = purpose;\r
56     }\r
57 \r
58     private Session getSession() {\r
59         // NOTE return SimanticsUI is a big HAXXX\r
60         return session == null ? SimanticsUI.getSession() : session;\r
61     }\r
62 \r
63     public void javaToNative(Object object, TransferData transferData) {\r
64         if (!checkResourceReference(object) || !isSupportedType(transferData)) {\r
65             DND.error(DND.ERROR_INVALID_DATA);\r
66         }\r
67         ResourceArray[] resources = null;\r
68         if (object instanceof Resource)\r
69             resources = new ResourceArray[] {new ResourceArray((Resource) object)};\r
70         if (object instanceof Resource[])\r
71             resources = new ResourceArray[] {new ResourceArray((Resource[]) object)};\r
72         if (object instanceof ResourceArray)\r
73             resources = new ResourceArray[] {(ResourceArray) object};\r
74         if (object instanceof ResourceArray[])\r
75             resources = (ResourceArray[]) object;\r
76         if (resources==null)\r
77             DND.error(DND.ERROR_INVALID_DATA);\r
78         //throw new IllegalArgumentException();\r
79 \r
80         // write data to a byte array and then ask super to convert to\r
81         // pMedium\r
82         Session s = getSession();\r
83         SerialisationSupport support = s.getService(SerialisationSupport.class);\r
84         ResourceTransferData rtd = new ResourceTransferData(s, resources);\r
85         rtd.setPurpose(purpose);\r
86 \r
87         Object buffer;\r
88         try {\r
89             buffer = ResourceTransferUtils.createStringTransferable(support, rtd);\r
90         } catch (DatabaseException e) {\r
91             throw new RuntimeException(e);\r
92         }\r
93         TextTransfer.getInstance().javaToNative(buffer, transferData);\r
94     }\r
95 \r
96     public Object nativeToJava(TransferData transferData) {\r
97         if (isSupportedType(transferData)) {\r
98             String buffer = (String) TextTransfer.getInstance().nativeToJava(transferData);\r
99             if (buffer == null)\r
100                 return null;\r
101 \r
102             Session s = getSession();\r
103             SerialisationSupport support = s.getService(SerialisationSupport.class);\r
104             ResourceTransferData rtd;\r
105             try {\r
106                 rtd = ResourceTransferUtils.readStringTransferable(support, buffer);\r
107             } catch (IllegalArgumentException e) {\r
108                 throw new RuntimeException(e);\r
109             } catch (DatabaseException e) {\r
110                 throw new RuntimeException(e);\r
111             }\r
112             // FIXME: the transferred "purpose" data cannot be passed further\r
113             // because this method is currently assumed to return\r
114             // ResourceArray[] instead of ResourceTransferData\r
115             return rtd.toResourceArrayArray();\r
116         }\r
117         return null;\r
118     }\r
119 \r
120     protected String[] getTypeNames() {\r
121         return new String[] { TYPENAME };\r
122     }\r
123 \r
124     protected int[] getTypeIds() {\r
125         return new int[] { TYPEID };\r
126     }\r
127 \r
128     boolean checkResourceReference(Object object) {\r
129         System.out.println("o = " + object);\r
130         if (object == null) return false;\r
131         if ( !(object instanceof ResourceArray[]) || ((ResourceArray[]) object).length == 0) {\r
132             return false;\r
133         }\r
134 //        ResourceReference[] ResourceReferences = (ResourceReference[]) object;\r
135 //        for (int i = 0; i < ResourceReferences.length; i++) {\r
136 //            // Check each reference if there is something to check\r
137 //        }\r
138         return true;\r
139     }\r
140 \r
141     protected boolean validate(Object object) {\r
142         return checkResourceReference(object);\r
143     }\r
144 \r
145 }\r