]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.g3d/src/org/simantics/g3d/wizard/ModelExportWizardPage.java
95e384b7e93b7fd4ada18a820e7c8101f9816ef2
[simantics/3d.git] / org.simantics.g3d / src / org / simantics / g3d / wizard / ModelExportWizardPage.java
1 package org.simantics.g3d.wizard;\r
2 \r
3 import java.io.File;\r
4 import java.util.ArrayList;\r
5 import java.util.Collections;\r
6 import java.util.List;\r
7 \r
8 import org.eclipse.jface.layout.GridDataFactory;\r
9 import org.eclipse.jface.resource.ImageDescriptor;\r
10 import org.eclipse.jface.wizard.WizardPage;\r
11 import org.eclipse.swt.SWT;\r
12 import org.eclipse.swt.custom.CCombo;\r
13 import org.eclipse.swt.events.ModifyEvent;\r
14 import org.eclipse.swt.events.ModifyListener;\r
15 import org.eclipse.swt.events.SelectionAdapter;\r
16 import org.eclipse.swt.events.SelectionEvent;\r
17 import org.eclipse.swt.layout.GridData;\r
18 import org.eclipse.swt.layout.GridLayout;\r
19 import org.eclipse.swt.widgets.Button;\r
20 import org.eclipse.swt.widgets.Composite;\r
21 import org.eclipse.swt.widgets.DirectoryDialog;\r
22 import org.eclipse.swt.widgets.FileDialog;\r
23 import org.eclipse.swt.widgets.Label;\r
24 import org.simantics.Simantics;\r
25 import org.simantics.db.ReadGraph;\r
26 import org.simantics.db.Resource;\r
27 import org.simantics.db.common.NamedResource;\r
28 import org.simantics.db.common.request.ReadRequest;\r
29 import org.simantics.db.exception.DatabaseException;\r
30 import org.simantics.layer0.Layer0;\r
31 import org.simantics.ui.utils.ResourceAdaptionUtils;\r
32 \r
33 \r
34 public abstract class ModelExportWizardPage<T extends IExportModel> extends WizardPage{\r
35         T exportData;\r
36 \r
37         CCombo model;\r
38         CCombo exportLocation;\r
39         \r
40         boolean exportToFile = true;\r
41 \r
42         private List<NamedResource> models = new ArrayList<NamedResource>();\r
43 \r
44         private Button overwrite;\r
45         \r
46         \r
47         \r
48         public ModelExportWizardPage(String pageName, String title, ImageDescriptor titleImage, T data) {\r
49                 super(pageName, title, titleImage);\r
50                 this.exportData = data;\r
51                 exportToFile = data.usesFile();\r
52         }\r
53         \r
54         protected abstract List<NamedResource> getSupportedModels(ReadGraph graph, Resource project) throws DatabaseException;\r
55         \r
56         public String[] getFilterExtensions() {\r
57                 return new String[0];\r
58         }\r
59         \r
60         public String[] getFilterNames() {\r
61                 return new String[0];\r
62         }\r
63 \r
64         @Override\r
65         public void createControl(Composite parent) {\r
66                 Composite container = new Composite(parent, SWT.NONE);\r
67                 {\r
68                         GridLayout layout = new GridLayout();\r
69                         layout.horizontalSpacing = 20;\r
70                         layout.verticalSpacing = 10;\r
71                         layout.numColumns = 3;\r
72                         container.setLayout(layout);\r
73                 }\r
74 \r
75                 new Label(container, SWT.NONE).setText("Exported &model:");\r
76                 model = new CCombo(container, SWT.BORDER);\r
77                 {\r
78                         model.setEditable(false);\r
79                         model.setText("");\r
80                         model.setToolTipText("Selects the model to export.");\r
81                         GridDataFactory.fillDefaults().grab(true, false).span(2, 1).applyTo(model);\r
82                         model.addSelectionListener(new SelectionAdapter() {\r
83                                 @Override\r
84                                 public void widgetSelected(SelectionEvent e) {\r
85                                         exportData.setModel(((NamedResource) model.getData(Integer.toString(model.getSelectionIndex()))));\r
86                                         validatePage();\r
87                                 }\r
88                         });\r
89 \r
90                 }\r
91                 if (exportToFile) {\r
92                          new Label(container, SWT.NONE).setText("&Target file:");\r
93                      exportLocation = new CCombo(container, SWT.BORDER);\r
94                      {\r
95                          exportLocation.setText("");\r
96                          GridDataFactory.fillDefaults().grab(true, false).span(1, 1).applyTo(exportLocation);\r
97                          exportLocation.addModifyListener(new ModifyListener(){\r
98                              @Override\r
99                              public void modifyText(ModifyEvent e) {\r
100                                  validatePage();\r
101                              }\r
102                          });\r
103                      }\r
104                      Button browseFileButton = new Button(container, SWT.PUSH);\r
105                      {\r
106                          browseFileButton.setText("Browse...");\r
107                          browseFileButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));\r
108                          browseFileButton.addSelectionListener(new SelectionAdapter() {\r
109                              @Override\r
110                              public void widgetSelected(SelectionEvent e) {\r
111                                  FileDialog dialog = new FileDialog(getShell(), SWT.SAVE);\r
112                                  dialog.setText("Choose Export Target File");\r
113                                  dialog.setFilterExtensions(getFilterExtensions());\r
114                                  dialog.setFilterNames(getFilterNames());\r
115                                  String loc = exportLocation.getText();\r
116                                  dialog.setFilterPath(loc);\r
117                                  String file = dialog.open();\r
118                                  if (file == null)\r
119                                      return;\r
120                                  exportLocation.setText(file);\r
121                                  validatePage();\r
122                              }\r
123                          });\r
124                      }\r
125 \r
126                     \r
127 \r
128                     \r
129                 } else {\r
130                      new Label(container, SWT.NONE).setText("&Target folder:");\r
131                      exportLocation = new CCombo(container, SWT.BORDER);\r
132                      {\r
133                          exportLocation.setText("");\r
134                          GridDataFactory.fillDefaults().grab(true, false).span(1, 1).applyTo(exportLocation);\r
135                          exportLocation.addModifyListener(new ModifyListener(){\r
136                              @Override\r
137                              public void modifyText(ModifyEvent e) {\r
138                                  validatePage();\r
139                              }\r
140                          });\r
141                      }\r
142                      Button browseFileButton = new Button(container, SWT.PUSH);\r
143                      {\r
144                          browseFileButton.setText("Browse...");\r
145                          browseFileButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));\r
146                          browseFileButton.addSelectionListener(new SelectionAdapter() {\r
147                              @Override\r
148                              public void widgetSelected(SelectionEvent e) {\r
149                                  DirectoryDialog dialog = new DirectoryDialog(getShell(), SWT.SAVE);\r
150                                  dialog.setText("Choose Export Target Folder");\r
151                                  String loc = exportLocation.getText();\r
152                                  dialog.setFilterPath(loc);\r
153                                  String file = dialog.open();\r
154                                  if (file == null)\r
155                                      return;\r
156                                  exportLocation.setText(file);\r
157                                  validatePage();\r
158                              }\r
159                          });\r
160                      }\r
161                 }\r
162                 \r
163                  Label horizRule = new Label(container, SWT.BORDER);\r
164              GridDataFactory.fillDefaults().hint(SWT.DEFAULT, 0).grab(true, false).span(3, 1).applyTo(horizRule);\r
165                 \r
166                  overwrite = new Button(container, SWT.CHECK);\r
167              overwrite.setText("&Overwrite existing files without warning");\r
168              overwrite.setSelection(exportData.isOverwrite());\r
169              GridDataFactory.fillDefaults().grab(true, false).span(3, 1).applyTo(overwrite);\r
170              overwrite.addSelectionListener(new SelectionAdapter() {\r
171                  @Override\r
172                  public void widgetSelected(SelectionEvent e) {\r
173                      validatePage();\r
174                  }\r
175              });\r
176 \r
177              try {\r
178                  initializeData();\r
179              } catch (DatabaseException e) {\r
180                  e.printStackTrace();\r
181              }\r
182 \r
183              setControl(container);\r
184              validatePage();\r
185                 \r
186         }\r
187         \r
188 \r
189         \r
190         \r
191         protected void initializeData() throws DatabaseException {\r
192                   final Resource selection = ResourceAdaptionUtils.toSingleResource(exportData.getSelection());\r
193 \r
194              Simantics.getSessionContext().getSession().syncRequest(\r
195                      new ReadRequest() {\r
196                          @Override\r
197                          public void run(ReadGraph graph) throws DatabaseException {\r
198                              Layer0 L0 = Layer0.getInstance(graph);\r
199                              models = getSupportedModels(graph, Simantics.getProject().get());\r
200                          }\r
201                      });\r
202 \r
203                      Collections.sort(models);\r
204 \r
205                      // Populate combo boxes\r
206                      int i = 0;\r
207                      boolean selected = false;\r
208                      for (NamedResource s : models) {\r
209                          model.add(s.getName());\r
210                          model.setData(String.valueOf(i), s);\r
211                          if (s.getResource().equals(selection)) {\r
212                              model.select(i);\r
213                              selected = true;\r
214                          }\r
215                          ++i;\r
216                      }\r
217                      if (!selected && i > 0)\r
218                          model.select(0);\r
219                      \r
220                      if (model.getSelectionIndex() >= 0) {\r
221                          exportData.setModel((NamedResource)model.getData(Integer.toString(model.getSelectionIndex())));\r
222                      }\r
223                      for (String path : exportData.getRecentLocations()) {\r
224                          exportLocation.add(path);\r
225                      }\r
226                      if (exportLocation.getItemCount() > 0)\r
227                          exportLocation.select(0);\r
228         }\r
229         \r
230         \r
231         \r
232         protected void validatePage() {\r
233                 if (exportData.getModel() == null) {\r
234                         setMessage("Select model to export.");\r
235                         setErrorMessage(null);\r
236                         setPageComplete(false);\r
237                         return;\r
238                 }\r
239                 String exportLoc = exportLocation.getText();\r
240                 File file;\r
241                 if (exportToFile) {\r
242 \r
243                         if (exportLoc.isEmpty()) {\r
244                                 setMessage("Select target file.");\r
245                                 setErrorMessage(null);\r
246                                 setPageComplete(false);\r
247                                 return;\r
248                         }\r
249                         file = new File(exportLoc);\r
250                         if (file.exists() && !file.isFile()) {\r
251                                 setErrorMessage("The target must be a file, an existing directory was given.");\r
252                                 setPageComplete(false);\r
253                                 return;\r
254                         }\r
255                         File parent = file.getParentFile();\r
256                         if (parent == null || !parent.isDirectory()) {\r
257                                 setErrorMessage("The target directory does not exist.");\r
258                                 setPageComplete(false);\r
259                                 return;\r
260                         }\r
261 \r
262                 } else {\r
263                         if (exportLoc.isEmpty()) {\r
264                                 setMessage("Select target directory.");\r
265                                 setErrorMessage(null);\r
266                                 setPageComplete(false);\r
267                                 return;\r
268                         }\r
269                         file = new File(exportLoc);\r
270                         if (file.exists() && !file.isDirectory()) {\r
271                                 setErrorMessage("The target must be a directory, an existing file was given.");\r
272                                 setPageComplete(false);\r
273                                 return;\r
274                         }\r
275 \r
276                 }\r
277 \r
278                 exportData.setExportLocation(file);\r
279                 exportData.setOverwrite(overwrite.getSelection());\r
280 \r
281                 setErrorMessage(null);\r
282                 setMessage("Export selected model.");\r
283                 setPageComplete(true);\r
284         }\r
285 }\r