Merge branch 'develop' into bulkEditorE4
[taxeditor.git] / eu.etaxonomy.taxeditor.bulkeditor / src / main / java / eu / etaxonomy / taxeditor / bulkeditor / e4 / BulkEditorE4.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
10 package eu.etaxonomy.taxeditor.bulkeditor.e4;
11
12 import java.util.ArrayList;
13 import java.util.List;
14
15 import javax.annotation.PostConstruct;
16 import javax.inject.Inject;
17
18 import org.eclipse.e4.ui.di.Persist;
19 import org.eclipse.e4.ui.model.application.ui.MDirtyable;
20 import org.eclipse.e4.ui.services.EMenuService;
21 import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
22 import org.eclipse.jface.dialogs.MessageDialog;
23 import org.eclipse.jface.viewers.ArrayContentProvider;
24 import org.eclipse.jface.viewers.ISelectionChangedListener;
25 import org.eclipse.jface.viewers.TableViewer;
26 import org.eclipse.swt.SWT;
27 import org.eclipse.swt.layout.FillLayout;
28 import org.eclipse.swt.layout.GridData;
29 import org.eclipse.swt.layout.GridLayout;
30 import org.eclipse.swt.widgets.Composite;
31
32 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
33 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
34 import eu.etaxonomy.cdm.model.common.CdmBase;
35 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
36 import eu.etaxonomy.taxeditor.bulkeditor.BulkEditorQuery;
37 import eu.etaxonomy.taxeditor.bulkeditor.input.AbstractBulkEditorInput;
38 import eu.etaxonomy.taxeditor.model.AbstractUtility;
39 import eu.etaxonomy.taxeditor.model.IDerivedUnitFacadePart;
40 import eu.etaxonomy.taxeditor.model.IDirtyMarkable;
41 import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
42 import eu.etaxonomy.taxeditor.model.IPartContentHasFactualData;
43 import eu.etaxonomy.taxeditor.model.IPartContentHasMedia;
44 import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
45 import eu.etaxonomy.taxeditor.store.CdmStore;
46
47 /**
48 *
49 * @author pplitzner
50 * @since Sep 8, 2017
51 *
52 */
53 public class BulkEditorE4 implements IPartContentHasDetails, IConversationEnabled, IPostOperationEnabled,
54 IDirtyMarkable, IDerivedUnitFacadePart, IPartContentHasFactualData, IPartContentHasMedia {
55
56 private BulkEditorSearchE4 searchBar = null;
57
58 @Inject
59 private MDirtyable dirty;
60
61 private AbstractBulkEditorInput<?> input;
62
63 private Composite topComposite;
64
65 private TableViewer viewer;
66
67 private ConversationHolder conversation;
68
69 @Inject
70 private ESelectionService selService;
71
72 private ISelectionChangedListener selectionChangedListener;
73
74 @Inject
75 public BulkEditorE4() {
76 }
77
78 public void init(AbstractBulkEditorInput<?> input){
79 this.input = input;
80 AbstractBulkEditorInput<?> bulkEditorInput = input;
81 if(bulkEditorInput.getEntityUuid()!=null){
82 bulkEditorInput.performSearch(new BulkEditorQuery(bulkEditorInput.getEntityUuid().toString(), null));
83 }
84 searchBar = new BulkEditorSearchE4(this, topComposite, SWT.NONE);
85
86 }
87
88 /** {@inheritDoc} */
89 @PostConstruct
90 public void createPartControl(Composite parent, EMenuService menuService) {
91 if (CdmStore.isActive()){
92 if(conversation == null){
93 conversation = CdmStore.createConversation();
94 }
95 }
96 else{
97 return;
98 }
99
100 parent.setLayout(new GridLayout());
101
102 topComposite = new Composite(parent, SWT.NONE);
103 topComposite.setLayout(new GridLayout());
104
105 GridData gridData = new GridData(SWT.FILL, SWT.TOP, true, false);
106 topComposite.setLayoutData(gridData);
107
108 Composite bottomComposite = new Composite(parent, SWT.NONE);
109 bottomComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
110 bottomComposite.setLayout(new FillLayout());
111 viewer = new TableViewer(bottomComposite);
112 viewer.setContentProvider(new ArrayContentProvider());
113 viewer.setLabelProvider(new BulkEditorLabelProvider());
114
115
116 //propagate selection
117 selectionChangedListener = (event -> selService.setSelection(AbstractUtility.getElementsFromSelectionChangedEvent(event)));
118 viewer.addSelectionChangedListener(selectionChangedListener);
119
120 //create context menu
121 menuService.registerContextMenu(viewer.getControl(), "eu.etaxonomy.taxeditor.bulkeditor.popupmenu.bulkeditor");
122
123 }
124
125 @Persist
126 public void save() {
127 dirty.setDirty(false);
128
129 this.searchBar.updateEditorInput();
130
131 }
132
133 /** {@inheritDoc} */
134 public void performSearch(BulkEditorQuery query) {
135 if (query != null) {
136
137 // TODO check if dirty, prompt save
138 if (isDirty()) {
139 String[] labels = {"Save (and Search)", "Don't save (and Search)","Cancel"};
140 MessageDialog dialog =new MessageDialog(topComposite.getShell(), "Save changes", null, "You have made changes that must be saved before this query can be executed. Would you like to proceed?", MessageDialog.QUESTION,labels, 0);
141 int result = dialog.open();
142 if (result == 0) {
143 save();
144 } else if (result == 2){
145 return;
146 }
147 }
148
149 getEditorInput().performSearch(query);
150
151 viewer.setInput(getEditorInput().getWrappedModel());
152 refresh();
153 }
154 }
155
156 public void refresh() {
157 viewer.refresh();
158 }
159
160 public boolean isDirty() {
161 return dirty.isDirty();
162 }
163
164 public AbstractBulkEditorInput getEditorInput() {
165 return input;
166 }
167
168 public List<AnnotatedTableItem> getMergeCandidates(){
169 List<AnnotatedTableItem> mergeCandidates = new ArrayList<>();
170 for(AnnotatedTableItem item: (List<AnnotatedTableItem>)viewer.getInput()){
171 if(item.isMergeCandidate()){
172 mergeCandidates.add(item);
173 }
174 }
175 return mergeCandidates;
176 }
177
178 public AnnotatedTableItem getMergeTarget(){
179 for(AnnotatedTableItem item: (List<AnnotatedTableItem>)viewer.getInput()){
180 if(item.isMergeTarget()){
181 return item;
182 }
183 }
184 return null;
185 }
186
187 public void removeAllAnnotations(){
188 for(AnnotatedTableItem item: (List<AnnotatedTableItem>)viewer.getInput()){
189 item.setMergeCandidate(false);
190 item.setMergeTarget(false);
191 }
192 }
193
194 /**
195 * {@inheritDoc}
196 */
197 @Override
198 public void update(CdmDataChangeMap arg0) {
199 }
200
201 /**
202 * {@inheritDoc}
203 */
204 @Override
205 public boolean canAttachMedia() {
206 return true;
207 }
208
209 /**
210 * {@inheritDoc}
211 */
212 @Override
213 public void changed(Object element) {
214 }
215
216 /**
217 * {@inheritDoc}
218 */
219 @Override
220 public void forceDirty() {
221 dirty.setDirty(true);
222 }
223
224 /**
225 * {@inheritDoc}
226 */
227 @Override
228 public boolean postOperation(CdmBase objectAffectedByOperation) {
229 return false;
230 }
231
232 /**
233 * {@inheritDoc}
234 */
235 @Override
236 public boolean onComplete() {
237 return false;
238 }
239
240 /**
241 * {@inheritDoc}
242 */
243 @Override
244 public ConversationHolder getConversationHolder() {
245 return conversation;
246 }
247
248 }