Project

General

Profile

Download (6.94 KB) Statistics
| Branch: | Tag: | Revision:
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
}
(2-2/4)