improve data import view
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / view / dataimport / e4 / DataImportViewE4.java
1 /**
2 * Copyright (C) 2013 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.view.dataimport.e4;
10
11 import java.util.ArrayList;
12 import java.util.Collection;
13
14 import javax.annotation.PostConstruct;
15 import javax.annotation.PreDestroy;
16
17 import org.apache.log4j.Logger;
18 import org.eclipse.core.runtime.IProgressMonitor;
19 import org.eclipse.e4.ui.di.Focus;
20 import org.eclipse.jface.viewers.CheckboxTableViewer;
21 import org.eclipse.jface.wizard.IWizard;
22 import org.eclipse.jface.wizard.WizardDialog;
23 import org.eclipse.swt.SWT;
24 import org.eclipse.swt.events.SelectionAdapter;
25 import org.eclipse.swt.events.SelectionEvent;
26 import org.eclipse.swt.layout.GridData;
27 import org.eclipse.swt.layout.GridLayout;
28 import org.eclipse.swt.widgets.Button;
29 import org.eclipse.swt.widgets.Composite;
30 import org.eclipse.swt.widgets.Display;
31 import org.eclipse.swt.widgets.Event;
32 import org.eclipse.swt.widgets.Label;
33 import org.eclipse.swt.widgets.Listener;
34 import org.eclipse.swt.widgets.Table;
35 import org.eclipse.swt.widgets.TableItem;
36 import org.eclipse.swt.widgets.Text;
37 import org.eclipse.ui.IMemento;
38 import org.eclipse.ui.forms.widgets.FormToolkit;
39 import org.eclipse.wb.swt.ResourceManager;
40
41 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
42 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
43 import eu.etaxonomy.cdm.ext.occurrence.OccurenceQuery;
44 import eu.etaxonomy.cdm.model.taxon.Classification;
45 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
46 import eu.etaxonomy.taxeditor.databaseAdmin.wizard.ImportPreferencesWizard;
47 import eu.etaxonomy.taxeditor.model.IContextListener;
48 import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
49 import eu.etaxonomy.taxeditor.model.IPartContentHasFactualData;
50 import eu.etaxonomy.taxeditor.model.IPartContentHasSupplementalData;
51 import eu.etaxonomy.taxeditor.store.CdmStore;
52 import eu.etaxonomy.taxeditor.ui.dialog.selection.SelectionDialogFactory;
53
54 /**
55 * View which shows a list of "data" that can be imported into the CDM
56 * @author pplitzner
57 * @date 22.08.2017
58 *
59 * @param <T> the CDM type that will be handled by this view
60 */
61 public abstract class DataImportViewE4<T> implements IPartContentHasFactualData,
62 IConversationEnabled, IPartContentHasDetails, IPartContentHasSupplementalData, IContextListener, Listener{
63
64 protected final Logger logger = Logger.getLogger(DataImportViewE4.class);
65
66 protected Collection<T> results = new ArrayList<T>();
67
68 protected boolean updated = false;
69
70 protected OccurenceQuery query;
71
72 private static ConversationHolder conversationHolder;
73
74 private SaveImportedSpecimenActionE4 saveImportedSpecimenAction;
75
76 private Text textClassification;
77
78 private Classification classification;
79
80 private Text textReferenceString;
81
82 private Button toggleButton;
83
84 private Button importButton;
85
86 private boolean state;
87
88 private Button openConfigurator;
89
90 public Classification getClassification() {
91 return classification;
92 }
93
94 public void setClassification(Classification classification) {
95 this.classification = classification;
96 }
97
98 private Button btnBrowseClassification;
99
100 private Button btnClear;
101
102 private final FormToolkit toolkit = new FormToolkit(Display.getCurrent());
103
104 private Table table;
105 private Composite composite_3;
106
107 /**
108 * Constructs a new DataImportEditor and registers it to listen to context changes
109 */
110 public DataImportViewE4() {
111 CdmStore.getContextManager().addContextListener(this);
112 }
113
114 /**
115 * Create contents of the view part.
116 * @param parent
117 */
118 @PostConstruct
119 public void createPartControl(Composite parent) {
120 if(CdmStore.isActive()){
121 initConversation();
122 }
123 else{
124 return;
125 }
126 parent.setLayout(new GridLayout(1, false));
127 Composite composite = new Composite(parent, SWT.NONE);
128 composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
129 // composite.setBounds(0, 0, 0, 298);
130 composite.setLayout(new GridLayout(2, false));
131
132 Composite composite_1 = new Composite(composite, SWT.NONE);
133 // gd_composite_1.widthHint = 280;
134 composite_1.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false, 1, 1));
135 composite_1.setLayout(new GridLayout(3, false));
136
137 Label label = new Label(composite_1, SWT.TOP);
138 label.setText("Classification");
139 label.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 3, 1));
140 textClassification = new Text(composite_1, SWT.BORDER);
141 textClassification.setEnabled(false);
142 GridData gd_textClassification = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
143 // gd_textClassification.widthHint = 118;
144 textClassification.setLayoutData(new GridData(SWT.FILL, SWT.LEFT, true, true));
145 btnBrowseClassification = new Button(composite_1, SWT.NONE);
146 btnBrowseClassification.setImage(ResourceManager.getPluginImage("eu.etaxonomy.taxeditor.store", "icons/open.gif"));
147 btnBrowseClassification.addListener(SWT.Selection, this);
148 btnClear = new Button(composite_1, SWT.NONE);
149 btnClear.setImage(ResourceManager.getPluginImage("eu.etaxonomy.taxeditor.store", "icons/trash.gif"));
150 btnClear.addListener(SWT.Selection, this);
151 //source reference
152
153 Label labelRef = new Label(composite_1, SWT.NONE);
154 labelRef.setText("Default import souce reference");
155 labelRef.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 3, 1));
156 textReferenceString = new Text(composite_1, SWT.NONE);
157 textReferenceString.setEnabled(true);
158 GridData gd_textReferenceString = new GridData(SWT.LEFT, SWT.CENTER, true, true, 3, 1);
159 gd_textReferenceString.widthHint = 229;
160 textReferenceString.setLayoutData(gd_textReferenceString);
161
162 //open configuration
163 openConfigurator = new Button(composite_1, SWT.PUSH);
164 openConfigurator.setText("Configuration");
165 new Label(composite_1, SWT.NONE);
166 new Label(composite_1, SWT.NONE);
167 openConfigurator.addSelectionListener(new SelectionAdapter(){
168 @Override
169 public void widgetSelected(SelectionEvent e) {
170
171 IWizard wizard = new ImportPreferencesWizard();
172 WizardDialog dialog = new WizardDialog(e.display.getActiveShell(), wizard);
173 dialog.open();
174 }
175 });
176
177 //checkbox table for result
178 Composite composite_2 = new Composite(composite, SWT.NONE);
179 composite_2.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
180 composite_2.setLayout(new GridLayout(2, false));
181
182
183 CheckboxTableViewer checkboxTableViewer = CheckboxTableViewer.newCheckList(composite_2, SWT.BORDER | SWT.FULL_SELECTION);
184
185
186 table = checkboxTableViewer.getTable();
187 table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
188 toolkit.paintBordersFor(table);
189
190 composite_3 = new Composite(composite_2, SWT.NONE);
191 // gd_composite_3.heightHint = 48;
192 composite_3.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1));
193 toolkit.paintBordersFor(composite_3);
194 composite_3.setLayout(new GridLayout(1, false));
195 //toggle button
196 toggleButton = new Button(composite_3, SWT.PUSH);
197 toggleButton.setText("Toggle");
198 new Label(composite_2, SWT.NONE);
199
200 Composite composite_4 = new Composite(composite_2, SWT.NONE);
201 composite_4.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1));
202 toolkit.adapt(composite_4);
203 toolkit.paintBordersFor(composite_4);
204
205 importButton = new Button(composite_4, SWT.PUSH);
206 importButton.setSize(48, 25);
207 importButton.setText("Import");
208 importButton.addSelectionListener(new SelectionAdapter(){
209 @Override
210 public void widgetSelected(SelectionEvent e) {
211 saveImportedSpecimenAction.run();
212 }
213 });
214 new Label(composite_2, SWT.NONE);
215 new Label(composite_2, SWT.NONE);
216 new Label(composite_2, SWT.NONE);
217 new Label(composite_2, SWT.NONE);
218 new Label(composite_2, SWT.NONE);
219 new Label(composite_2, SWT.NONE);
220 toggleButton.addSelectionListener(new SelectionAdapter(){
221 @Override
222 public void widgetSelected(SelectionEvent e) {
223 state = state ? false : true;
224 for (TableItem item: getTable().getItems()){
225 item.setChecked(state);
226 }
227
228 }
229 });
230 //import button
231 saveImportedSpecimenAction = new SaveImportedSpecimenActionE4(this);
232 initializeToolBar();
233 }
234
235 /**
236 * Initialize the toolbar.
237 */
238 private void initializeToolBar() {
239 //FIXME E4 migrate
240 // IToolBarManager tbm = getViewSite().getActionBars().getToolBarManager();
241 // tbm.add(saveImportedSpecimenAction);
242 }
243
244 public Table getTable() {
245 return table;
246 }
247
248 public void setQuery(OccurenceQuery query) {
249 this.query = query;
250 }
251
252 public void setResults(Collection<T> results) {
253 this.results = results;
254 updated=false;
255 }
256
257 @PreDestroy
258 public void dispose() {
259 CdmStore.getContextManager().removeContextListener(this);
260 }
261
262 @Override
263 public void contextRefresh(IProgressMonitor monitor) {
264 refresh();
265 }
266
267 protected void refresh(){
268 if (!updated){
269 if (getTable() != null){
270 getTable().removeAll();
271 }
272 if(results!=null){
273 for(T item:results){
274 TableItem tableItem = new TableItem(getTable(), SWT.NONE);
275 tableItem.setText(getTextForTableItem(item));
276 tableItem.setData(item);
277 }
278 }
279 updated = true;
280 }
281 }
282
283 public abstract void query();
284
285 @Override
286 public void update(CdmDataChangeMap changeEvents) {
287 //nothing
288 }
289
290 /**
291 * Returns the text label of the given item.
292 * @param item the item for which the label should be returns
293 * @return the label of the item
294 */
295 protected abstract String getTextForTableItem(T item);
296
297 @Focus
298 public void setFocus() {
299 if(getTable()!=null){
300 getTable().setFocus();
301 }
302 //make sure to bind again if maybe in another view the conversation was unbound
303 if(getConversationHolder()!=null && !getConversationHolder().isBound()){
304 getConversationHolder().bind();
305 }
306 }
307
308 @Override
309 public void contextAboutToStop(IMemento memento, IProgressMonitor monitor) {
310 }
311
312 @Override
313 public void contextStop(IMemento memento, IProgressMonitor monitor) {
314 }
315
316 @Override
317 public void contextStart(IMemento memento, IProgressMonitor monitor) {
318 initConversation();
319 }
320
321 private void initConversation(){
322 if(conversationHolder==null){
323 conversationHolder = CdmStore.createConversation();
324 }
325 }
326
327 @Override
328 public void workbenchShutdown(IMemento memento, IProgressMonitor monitor) {
329 if(getConversationHolder()!=null && getConversationHolder().isBound() && !getConversationHolder().isClosed()) {
330 getConversationHolder().close();
331 }
332 }
333
334 /**
335 * @return the conversationHolder
336 */
337 @Override
338 public ConversationHolder getConversationHolder() {
339 if(CdmStore.isActive() && conversationHolder==null){
340 initConversation();
341 }
342 return conversationHolder;
343 }
344
345 @Override
346 public void handleEvent(Event event) {
347 if(event.widget==btnBrowseClassification){
348 classification = SelectionDialogFactory.getSelectionFromDialog(Classification.class, event.widget.getDisplay().getActiveShell(), null, null);
349 if(classification!=null){
350 textClassification.setText(classification.getTitleCache());
351 }
352 }
353 else if(event.widget==btnClear){
354 classification = null;
355 textClassification.setText("");
356 }
357 }
358
359 public String getReferenceString() {
360 return textReferenceString.getText();
361 }
362 }