]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/actions/e4/ImportSVGPNG.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / actions / e4 / ImportSVGPNG.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.modeling.ui.actions.e4;\r
13 \r
14 import java.awt.geom.Point2D;\r
15 import java.io.File;\r
16 import java.io.FileNotFoundException;\r
17 import java.io.IOException;\r
18 \r
19 import javax.inject.Named;\r
20 \r
21 import org.eclipse.e4.core.di.annotations.Execute;\r
22 import org.eclipse.e4.ui.model.application.ui.basic.MPart;\r
23 import org.eclipse.e4.ui.services.IServiceConstants;\r
24 import org.eclipse.swt.widgets.FileDialog;\r
25 import org.eclipse.swt.widgets.Shell;\r
26 import org.eclipse.ui.IEditorPart;\r
27 import org.eclipse.ui.IWorkbenchPart;\r
28 import org.eclipse.ui.PlatformUI;\r
29 import org.eclipse.ui.internal.e4.compatibility.CompatibilityEditor;\r
30 import org.eclipse.ui.part.MultiPageEditorPart;\r
31 import org.simantics.db.ReadGraph;\r
32 import org.simantics.db.Resource;\r
33 import org.simantics.db.WriteGraph;\r
34 import org.simantics.db.common.ResourceArray;\r
35 import org.simantics.db.common.request.IndexRoot;\r
36 import org.simantics.db.common.request.WriteRequest;\r
37 import org.simantics.db.exception.DatabaseException;\r
38 import org.simantics.db.request.Read;\r
39 import org.simantics.g2d.canvas.ICanvasContext;\r
40 import org.simantics.g2d.participant.MouseUtil;\r
41 import org.simantics.g2d.participant.MouseUtil.MouseInfo;\r
42 import org.simantics.modeling.ModelingResources;\r
43 import org.simantics.scl.commands.Commands;\r
44 import org.simantics.structural.stubs.StructuralResource2;\r
45 import org.simantics.ui.SimanticsUI;\r
46 import org.simantics.ui.workbench.IResourceEditorInput;\r
47 import org.simantics.ui.workbench.ResourceEditorInput;\r
48 import org.simantics.utils.FileUtils;\r
49 import org.simantics.utils.ui.ErrorLogger;\r
50 import org.simantics.utils.ui.workbench.WorkbenchUtils;\r
51 \r
52 public class ImportSVGPNG {\r
53 \r
54     @Execute\r
55     public void execute(@Named(IServiceConstants.ACTIVE_PART) MPart part) {\r
56         if (part == null)\r
57             return;\r
58         \r
59         IWorkbenchPart ap;\r
60         Object possibleEditor = part.getObject();\r
61         if (possibleEditor != null && possibleEditor instanceof CompatibilityEditor) {\r
62             CompatibilityEditor editor = (CompatibilityEditor) possibleEditor;\r
63             ap = editor.getPart();\r
64         } else {\r
65             // Fallback for getting active editor part\r
66             ap = WorkbenchUtils.getActiveWorkbenchPart();\r
67         }\r
68         \r
69         IEditorPart viewer = null;\r
70         if (ap instanceof MultiPageEditorPart) {\r
71             MultiPageEditorPart rfe = (MultiPageEditorPart) ap;\r
72             IResourceEditorInput in = (ResourceEditorInput) rfe.getEditorInput();\r
73             final ResourceArray ra = in.getResourceArray();\r
74             ResourceArray symbolEditorInput;\r
75             try {\r
76                 symbolEditorInput = SimanticsUI.getSession().syncRequest(new Read<ResourceArray>() {\r
77                     @Override\r
78                     public ResourceArray perform(ReadGraph graph) throws DatabaseException {\r
79                         StructuralResource2 sr = StructuralResource2.getInstance(graph);\r
80                         ModelingResources mr = ModelingResources.getInstance(graph);\r
81                         Resource symbol = graph.getPossibleObject(ra.resources[0], mr.ComponentTypeToSymbol);\r
82                         Resource definedBy = symbol != null ? graph.getPossibleObject(symbol, sr.IsDefinedBy) : null;\r
83                         ResourceArray result = definedBy != null ? new ResourceArray(definedBy) : ResourceArray.EMPTY;\r
84                         return result;\r
85                     }\r
86                 });\r
87 \r
88                 IEditorPart[] eps = rfe.findEditors(new ResourceEditorInput("org.simantics.modeling.ui.symbolEditor", symbolEditorInput));\r
89                 if (eps.length == 0) {\r
90                     System.out.println("symbol editor part not found from multi page editor part: " + ap);\r
91                     return;\r
92                 }\r
93                 viewer = eps[0];\r
94             } catch (DatabaseException e) {\r
95                 e.printStackTrace();\r
96                 return;\r
97             }\r
98         } else if (ap instanceof IEditorPart) {\r
99             viewer = (IEditorPart) ap;\r
100         }\r
101         ICanvasContext ctx = (ICanvasContext) viewer.getAdapter(ICanvasContext.class);\r
102         if (ctx == null) {\r
103             System.out.println("No canvas context");\r
104             return;\r
105         }\r
106         MouseInfo minfo = ctx.getSingleItem(MouseUtil.class).getMousePressedInfo(0);\r
107         if(minfo == null) {\r
108             System.out.println("No mouse info");\r
109             return;\r
110         }\r
111         final Point2D mpos = minfo.canvasPosition;\r
112         IResourceEditorInput input = (IResourceEditorInput)viewer.getEditorInput();\r
113         Resource composite = input.getResource();\r
114 \r
115         addSVG(mpos.getX(), mpos.getY(), composite);\r
116     }\r
117 \r
118     public static void addSVG(final double mposX, final double mposY, final Resource composite) {\r
119 \r
120         Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();\r
121 \r
122         FileDialog dialog = new FileDialog(shell);\r
123         dialog.setText("Choose an image to be imported");\r
124         dialog.setFilterExtensions(new String[] {"*.svg", "*.png"});\r
125 \r
126         final String filename = dialog.open();\r
127         if(filename == null)\r
128             return;\r
129 \r
130         File file = new File(filename);\r
131         try {\r
132             final byte[] data = FileUtils.readFile(file);\r
133 \r
134             SimanticsUI.getSession().asyncRequest(new WriteRequest() {\r
135 \r
136                 @Override\r
137                 public void perform(WriteGraph g) throws DatabaseException {\r
138                     Commands.get(g, "Simantics/Diagram/createSVGElement")\r
139                             .execute(g, g.syncRequest(new IndexRoot(composite)),\r
140                                      composite, suffix(filename), data, mposX, mposY);\r
141                 }\r
142 \r
143             });\r
144         } catch (FileNotFoundException e) {\r
145             ErrorLogger.defaultLogError(e);\r
146         } catch (IOException e) {\r
147             ErrorLogger.defaultLogError(e);\r
148         }\r
149 \r
150         return;\r
151 \r
152     }\r
153 \r
154     private static String suffix(String fileName) {\r
155         int len = fileName.length();\r
156         if(len < 3) return null;\r
157         else return fileName.substring(len-3,len).toLowerCase();\r
158     }\r
159 \r
160 }\r