Merge branch 'release/5.19.0'
[taxeditor.git] / eu.etaxonomy.taxeditor.printpublisher / src / main / java / eu / etaxonomy / taxeditor / printpublisher / wizard / SelectServiceWizardPage.java
1 /**
2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
8 */
9 package eu.etaxonomy.taxeditor.printpublisher.wizard;
10
11 import java.lang.reflect.InvocationTargetException;
12 import java.net.MalformedURLException;
13 import java.net.URL;
14 import java.util.List;
15
16 import org.eclipse.core.runtime.IProgressMonitor;
17 import org.eclipse.jface.operation.IRunnableWithProgress;
18 import org.eclipse.jface.viewers.ColumnLabelProvider;
19 import org.eclipse.jface.viewers.ILabelProvider;
20 import org.eclipse.jface.viewers.ISelectionChangedListener;
21 import org.eclipse.jface.viewers.ITreeContentProvider;
22 import org.eclipse.jface.viewers.SelectionChangedEvent;
23 import org.eclipse.jface.viewers.StructuredSelection;
24 import org.eclipse.jface.viewers.TreeViewer;
25 import org.eclipse.jface.viewers.Viewer;
26 import org.eclipse.swt.SWT;
27 import org.eclipse.swt.events.ModifyEvent;
28 import org.eclipse.swt.events.ModifyListener;
29 import org.eclipse.swt.events.SelectionAdapter;
30 import org.eclipse.swt.events.SelectionEvent;
31 import org.eclipse.swt.layout.GridData;
32 import org.eclipse.swt.layout.GridLayout;
33 import org.eclipse.swt.widgets.Button;
34 import org.eclipse.swt.widgets.Composite;
35 import org.eclipse.swt.widgets.Display;
36 import org.eclipse.swt.widgets.Group;
37 import org.eclipse.swt.widgets.Text;
38 import org.jdom.Element;
39
40 import eu.etaxonomy.cdm.api.application.ICdmRepository;
41 import eu.etaxonomy.cdm.print.IXMLEntityFactory;
42 import eu.etaxonomy.cdm.print.PublishConfigurator;
43 import eu.etaxonomy.cdm.print.XMLHelper;
44 import eu.etaxonomy.cdm.print.XMLHelper.EntityType;
45 import eu.etaxonomy.taxeditor.model.CdmProgressMonitorAdapter;
46 import eu.etaxonomy.taxeditor.model.MessagingUtils;
47 import eu.etaxonomy.taxeditor.printpublisher.PrintUtil;
48 import eu.etaxonomy.taxeditor.store.CdmStore;
49
50 /**
51 * <p>SelectServiceWizardPage class.</p>
52 *
53 * @author n.hoffmann
54 * @created Apr 6, 2010
55 */
56 public class SelectServiceWizardPage extends AbstractPublishWizardPage {
57
58 private Composite composite;
59 private Button button_local;
60 private Button button_remote;
61 private Text text_serviceUrl;
62
63 private TreeViewer treeViewer;
64
65 protected SelectServiceWizardPage(String pageName) {
66 super(pageName);
67 setTitle("Select a Service");
68 }
69
70 public void createControl(Composite parent) {
71
72 composite = new Composite(parent, SWT.NULL);
73 composite.setLayout(new GridLayout());
74
75 RadioSelectionListener listener = new RadioSelectionListener();
76
77 Group radioGroup = new Group(composite, SWT.SHADOW_ETCHED_IN);
78 radioGroup.setLayout(new GridLayout());
79
80 button_local = new Button(radioGroup, SWT.RADIO);
81
82 button_local.setText("Local (By selecting this option the database you are currently " +
83 "connected to will be used to gather data.)");
84
85 button_local.addSelectionListener(listener);
86
87 button_remote = new Button(radioGroup, SWT.RADIO);
88 button_remote.setText("Remote");
89 button_remote.addSelectionListener(listener);
90
91 text_serviceUrl = new Text(radioGroup, SWT.BORDER);
92 text_serviceUrl.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
93 text_serviceUrl.setText("http://");
94 text_serviceUrl.addModifyListener(new ModifyListener() {
95
96 public void modifyText(ModifyEvent e) {
97 String text = text_serviceUrl.getText();
98
99 if(!text.endsWith("/")){
100 SelectServiceWizardPage.this.setErrorMessage("Webservice URL has to end with \"/\"");
101 setPageComplete(false);
102 return;
103 }
104
105 URL url = null;
106 try {
107 url = new URL(text);
108 } catch (MalformedURLException e1) {
109 SelectServiceWizardPage.this.setErrorMessage("Webservice URL is malformed.");
110 setPageComplete(false);
111 return;
112 }
113
114 getConfigurator().setWebserviceUrl(url);
115
116 SelectServiceWizardPage.this.setErrorMessage(null);
117
118 }
119 });
120
121 treeViewer = new TreeViewer(composite);
122
123 treeViewer.setContentProvider(new ContentProvider());
124 treeViewer.setLabelProvider(new LabelProvider());
125
126 treeViewer.addSelectionChangedListener(new SelectionChangedListener());
127
128 treeViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
129
130 if(CdmStore.isActive()){
131 enableLocal();
132 }else{
133 enableRemote();
134 button_local.setEnabled(false);
135 }
136
137 setControl(composite);
138 }
139
140 private class RadioSelectionListener extends SelectionAdapter{
141 @Override
142 public void widgetSelected(SelectionEvent e) {
143 if(button_local.getSelection()){
144 enableLocal();
145 }else if(button_remote.getSelection()){
146 enableRemote();
147 }
148 }
149 }
150
151 private void enableRemote() {
152 button_local.setSelection(false);
153 button_remote.setSelection(true);
154
155 text_serviceUrl.setEnabled(true);
156
157 setConfigurator(PublishConfigurator.NewRemoteInstance());
158 getConfigurator().addOutputModule(getOutputModule());
159 }
160
161 private void enableLocal() {
162 button_remote.setSelection(false);
163 button_local.setSelection(true);
164
165 text_serviceUrl.setEnabled(false);
166
167 setConfigurator(PublishConfigurator.NewLocalInstance((ICdmRepository) CdmStore.getCurrentApplicationConfiguration()));
168 getConfigurator().addOutputModule(getOutputModule());
169 refresh();
170 }
171
172 @Override
173 public boolean canFlipToNextPage() {
174 return isPageComplete();
175 }
176
177 public void refresh(){
178
179 if(getConfigurator() != null){
180
181 IRunnableWithProgress runnable = new IRunnableWithProgress(){
182
183 @Override
184 public void run(IProgressMonitor monitor) {
185 monitor.beginTask("Loading classifications", IProgressMonitor.UNKNOWN);
186 IXMLEntityFactory factory = getConfigurator().getFactory();
187 final List<Element> classifications = factory.getClassifications();
188
189 Display.getDefault().asyncExec(new Runnable(){
190
191 @Override
192 public void run() {
193 treeViewer.setInput(classifications);
194 }
195
196 });
197 monitor.done();
198 }
199
200 };
201 try {
202 getContainer().run(true, false, runnable);
203 } catch (InvocationTargetException e) {
204 MessagingUtils.error(this.getClass(), e);
205 } catch (InterruptedException e) {
206 MessagingUtils.error(this.getClass(), e);
207 }
208 }
209 }
210
211 @Override
212 public boolean isPageComplete() {
213 boolean complete = true;
214 if(getConfigurator().isLocal()){
215 complete &= true;
216 }else if(getConfigurator().isRemote()
217 && getConfigurator().getWebserviceUrl() != null
218 && getConfigurator().getWebserviceUrl().toString().endsWith("/")){
219 complete &= true;
220 }else{
221 return false;
222 }
223
224 List<Element> selectedTaxonNodes = getConfigurator().getSelectedTaxonNodeElements();
225
226 complete &= !selectedTaxonNodes.isEmpty();
227
228 return complete;
229 }
230
231 private class SelectionChangedListener implements ISelectionChangedListener {
232
233 public void selectionChanged(SelectionChangedEvent event) {
234 StructuredSelection selection = (StructuredSelection) treeViewer.getSelection();
235
236 List<Element> selectedElements = selection.toList();
237 if(selectedElements.size() > 0){
238 getConfigurator().setSelectedTaxonNodeElements(selectedElements);
239 setPageComplete(true);
240 }
241 }
242
243 }
244
245 private class ContentProvider implements ITreeContentProvider{
246
247 public Object[] getChildren(Object parentElement) {
248 if(parentElement instanceof List){
249 return ((List)parentElement).toArray();
250 }
251 else if(parentElement instanceof Element){
252 Element element = (Element) parentElement;
253
254 IXMLEntityFactory factory = getConfigurator().getFactory();
255
256 return factory != null ? factory.getChildNodes(element).toArray() : new Object[]{};
257
258 }
259
260 return new Object[]{};
261 }
262
263 public Object getParent(Object element) {
264 return null;
265 }
266
267 public boolean hasChildren(Object element) {
268 return getChildren(element).length > 0;
269 }
270
271 public Object[] getElements(Object inputElement) {
272 return getChildren(inputElement);
273 }
274
275 public void dispose() {
276
277 }
278
279 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
280
281 }
282 }
283
284 private class LabelProvider extends ColumnLabelProvider
285 implements ILabelProvider{
286
287 @Override
288 public String getText(Object element) {
289 if(element instanceof Element){
290 Element xmlElement = (Element) element;
291 EntityType entityType = XMLHelper.getEntityType(xmlElement);
292 if(EntityType.TAXON_NODE.equals(entityType)){
293 xmlElement = getConfigurator().getFactory().getTaxonForTaxonNode(xmlElement);
294 }
295 return XMLHelper.getTitleCache(xmlElement);
296 }
297 return "no title cache";
298 }
299 }
300 }