Project

General

Profile

Download (10.5 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
 *
3
 */
4
package eu.etaxonomy.taxeditor.navigation.key.polytomous.e4;
5

    
6
import java.util.List;
7
import java.util.Map;
8

    
9
import javax.annotation.PostConstruct;
10
import javax.annotation.PreDestroy;
11
import javax.inject.Inject;
12

    
13
import org.eclipse.core.commands.Command;
14
import org.eclipse.core.commands.ParameterizedCommand;
15
import org.eclipse.core.runtime.IProgressMonitor;
16
import org.eclipse.e4.core.commands.ECommandService;
17
import org.eclipse.e4.core.commands.EHandlerService;
18
import org.eclipse.e4.ui.di.Focus;
19
import org.eclipse.e4.ui.model.application.ui.MDirtyable;
20
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
21
import org.eclipse.e4.ui.services.EMenuService;
22
import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
23
import org.eclipse.jface.viewers.ColumnLabelProvider;
24
import org.eclipse.jface.viewers.DoubleClickEvent;
25
import org.eclipse.jface.viewers.IDoubleClickListener;
26
import org.eclipse.jface.viewers.ISelection;
27
import org.eclipse.jface.viewers.ISelectionChangedListener;
28
import org.eclipse.jface.viewers.ListViewer;
29
import org.eclipse.jface.viewers.Viewer;
30
import org.eclipse.jface.viewers.ViewerFilter;
31
import org.eclipse.swt.SWT;
32
import org.eclipse.swt.events.ModifyEvent;
33
import org.eclipse.swt.events.ModifyListener;
34
import org.eclipse.swt.layout.GridData;
35
import org.eclipse.swt.layout.GridLayout;
36
import org.eclipse.swt.widgets.Composite;
37
import org.eclipse.swt.widgets.Display;
38
import org.eclipse.swt.widgets.Event;
39
import org.eclipse.swt.widgets.Text;
40
import org.eclipse.ui.IMemento;
41

    
42
import eu.etaxonomy.cdm.api.application.CdmApplicationState;
43
import eu.etaxonomy.cdm.api.application.CdmChangeEvent;
44
import eu.etaxonomy.cdm.api.application.CdmChangeEvent.Action;
45
import eu.etaxonomy.cdm.api.application.ICdmChangeListener;
46
import eu.etaxonomy.cdm.api.application.ICdmDataChangeService;
47
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
48
import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
49
import eu.etaxonomy.cdm.api.service.IPolytomousKeyService;
50
import eu.etaxonomy.cdm.model.description.PolytomousKey;
51
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
52
import eu.etaxonomy.taxeditor.model.ContextListenerAdapter;
53
import eu.etaxonomy.taxeditor.model.DataChangeBridge;
54
import eu.etaxonomy.taxeditor.model.IContextListener;
55
import eu.etaxonomy.taxeditor.model.MessagingUtils;
56
import eu.etaxonomy.taxeditor.navigation.key.polytomous.PolytomousKeyContentProvider;
57
import eu.etaxonomy.taxeditor.navigation.l10n.Messages;
58
import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
59
import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
60
import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
61
import eu.etaxonomy.taxeditor.store.CdmStore;
62
import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
63

    
64
/**
65
 *
66
 * @author pplitzner
67
 * @since Sep 28, 2017
68
 *
69
 */
70
public class PolytomousKeyViewPartE4 implements
71
IConversationEnabled, ICdmEntitySessionEnabled, IPostOperationEnabled,
72
ICdmChangeListener {
73

    
74
    private class FilterModifyListener implements ModifyListener{
75
        @Override
76
        public void modifyText(ModifyEvent e) {
77
            ViewerFilter filter = new ViewerFilter(){
78

    
79
                @Override
80
                public boolean select(Viewer viewer, Object parentElement,
81
                        Object element) {
82

    
83
                    if(element instanceof PolytomousKey){
84
                        PolytomousKey key = (PolytomousKey) element;
85
                        if(key.getTitleCache().contains(text_filter.getText())){
86
                            return true;
87
                        }
88
                    }
89

    
90
                    return false;
91
                }
92

    
93
            };
94

    
95
            viewer.setFilters(new ViewerFilter[]{filter});
96
        }
97
    }
98

    
99

    
100
    public static final String ID = "eu.etaxonomy.taxeditor.navigation.key.polytomous.polytomousKeyViewPart"; //$NON-NLS-1$
101

    
102
    public static final String OPEN_COMMAND_ID = "eu.etaxonomy.taxeditor.navigation.key.polytomous.editNodes"; //$NON-NLS-1$
103

    
104
    private class ContextListener extends ContextListenerAdapter{
105
        @Override
106
        public void contextStop(IMemento memento, IProgressMonitor monitor) {
107
            monitor.subTask(Messages.PolytomousKeyViewPart_SHUTDOWN);
108
            if(!viewer.getControl().isDisposed()){
109
                viewer.setInput(null);
110
            }
111
        }
112

    
113
        @Override
114
        public void contextStart(IMemento memento, IProgressMonitor monitor) {
115
            monitor.subTask(Messages.PolytomousKeyViewPart_INIT);
116
            setInput();
117
        }
118
    }
119

    
120
    private ListViewer viewer;
121
    private ConversationHolder conversation;
122
    private IContextListener contextListener;
123
    private final CdmFormFactory formFactory;
124
    private Text text_filter;
125
    private ICdmEntitySession cdmEntitySession;
126

    
127
    private PolytomousKeyViewPartDataChangeBehaviorE4 dataChangeBehavior;
128

    
129

    
130
    @Inject
131
    private EHandlerService handlerService;
132

    
133
    @Inject
134
    private ECommandService commandService;
135

    
136
    @Inject
137
    private ESelectionService selService;
138

    
139
    @Inject
140
    private MDirtyable dirty;
141

    
142
    private ISelectionChangedListener selectionChangedListener;
143

    
144
    @Inject
145
    private MPart thisPart;
146

    
147
    public PolytomousKeyViewPartE4(){
148
        formFactory = new CdmFormFactory(Display.getDefault());
149
    }
150

    
151
    @PostConstruct
152
    public void createPartControl(Composite parent, EMenuService menuService) {
153

    
154
        Composite container = new Composite(parent, SWT.NONE);
155
        container.setLayout(new GridLayout());
156

    
157
        contextListener = new ContextListener();
158
        CdmStore.getContextManager().addContextListener(contextListener);
159

    
160
        text_filter = formFactory.createText(container, ""); //$NON-NLS-1$
161
        text_filter.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
162
        text_filter.addModifyListener(new FilterModifyListener());
163

    
164
        viewer = new ListViewer(container, SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI);
165
        viewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
166

    
167
        viewer.setContentProvider(new PolytomousKeyContentProvider());
168
        viewer.setLabelProvider(new ColumnLabelProvider());
169

    
170
        viewer.addDoubleClickListener(new IDoubleClickListener() {
171

    
172
            @Override
173
            public void doubleClick(DoubleClickEvent event) {
174
                openSelectedKeyNodes();
175
            }
176
        });
177

    
178

    
179

    
180
        //propagate selection
181
        selectionChangedListener = (event -> selService.setSelection(event.getSelection()));
182
        viewer.addSelectionChangedListener(selectionChangedListener);
183

    
184
        //create context menu
185
        menuService.registerContextMenu(viewer.getControl(), "eu.etaxonomy.taxeditor.navigation.popupmenu.polytomouskeyview");
186

    
187
        if(CdmStore.isActive()){
188
            setInput();
189
        }
190
    }
191

    
192
    public void openSelectedKeyNodes() {
193
        Command command = commandService.getCommand(OPEN_COMMAND_ID);
194
        ParameterizedCommand parameterizedCommand = ParameterizedCommand.generateCommand(command, null);
195
        if(command.isEnabled()) {
196
            try {
197
                handlerService.executeHandler(parameterizedCommand);
198
            } catch (Exception e) {
199
                MessagingUtils.error(getClass(), Messages.PolytomousKeyViewPart_EXCEPTION, e);
200
            }
201
        }
202
    }
203

    
204
    public void setViewerSelection(ISelection selection, boolean reveal) {
205
        viewer.setSelection(selection,reveal);
206
        viewer.getList().notifyListeners(SWT.Selection,new Event());
207
    }
208

    
209
    private void setInput() {
210
        conversation = CdmStore.createConversation();
211
        conversation.registerForDataStoreChanges(this);
212
        cdmEntitySession = CdmStore.getCurrentSessionManager().newSession(this, true);
213
        CdmApplicationState.getCurrentDataChangeService().register(this);
214

    
215
        List<PolytomousKey> input = CdmStore.getService(IPolytomousKeyService.class).list(PolytomousKey.class, null, null, null, null);
216
        if(!viewer.getControl().isDisposed()){
217
            viewer.setInput(input);
218
        }
219
    }
220

    
221
    @Focus
222
    public void setFocus() {
223
        if(cdmEntitySession != null) {
224
            cdmEntitySession.bind();
225
        }
226
        if(viewer!=null && viewer.getControl()!=null && !viewer.getControl().isDisposed()) {
227
            viewer.getControl().setFocus();
228
        }
229
    }
230

    
231
    @Override
232
    public void update(CdmDataChangeMap changeEvents) {
233
        if (dataChangeBehavior == null) {
234
            dataChangeBehavior = new PolytomousKeyViewPartDataChangeBehaviorE4(this);
235
        }
236

    
237
        DataChangeBridge.handleDataChange(changeEvents, dataChangeBehavior);
238
    }
239

    
240
    @Override
241
    public ConversationHolder getConversationHolder() {
242
        return conversation;
243
    }
244

    
245
    @PreDestroy
246
    public void dispose() {
247
        if(conversation!=null){
248
            conversation.unregisterForDataStoreChanges(this);
249
            conversation.close();
250
            CdmStore.getContextManager().removeContextListener(contextListener);
251
            conversation = null;
252
        }
253
        if(cdmEntitySession != null) {
254
            cdmEntitySession.dispose();
255
            cdmEntitySession = null;
256
        }
257
        ICdmDataChangeService currentDataChangeService = CdmApplicationState.getCurrentDataChangeService();
258
        if(currentDataChangeService!=null){
259
            currentDataChangeService.unregister(this);
260
        }
261
    }
262

    
263
    @Override
264
    public boolean postOperation(Object objectAffectedByOperation) {
265
        getConversationHolder().bind();
266
        getConversationHolder().commit(true);
267
        viewer.refresh();
268
        return true;
269
    }
270

    
271
    @Override
272
    public boolean onComplete() {
273
        return true;
274
    }
275

    
276
    public void refresh() {
277
        getConversationHolder().bind();
278
        //FIXME : Need to make sure this is a stable fix (ticket 3822)
279
        getConversationHolder().commit();
280
        List<PolytomousKey> input = CdmStore.getService(IPolytomousKeyService.class).list(PolytomousKey.class, null, null, null, null);
281
        if(!viewer.getControl().isDisposed()){
282
            viewer.setInput(input);
283
        }
284
    }
285

    
286
    public List<PolytomousKey> getKeys() {
287
        return (List<PolytomousKey>)viewer.getInput();
288
    }
289

    
290
    @Override
291
    public ICdmEntitySession getCdmEntitySession() {
292
        return cdmEntitySession;
293
    }
294

    
295
    @Override
296
    public  List<PolytomousKey> getRootEntities() {
297
        return getKeys();
298
    }
299

    
300
    @Override
301
    public void onChange(CdmChangeEvent event) {
302
        if(event.getAction() == Action.Delete && PolytomousKey.class.equals(event.getEntityType())) {
303
            refresh();
304
        }
305

    
306
    }
307

    
308
    @Override
309
    public Map<Object, List<String>> getPropertyPathsMap() {
310
        return null;
311
    }
312

    
313
}
(2-2/2)