Project

General

Profile

Download (11.3 KB) Statistics
| Branch: | Tag: | Revision:
1
// $Id$
2
/**
3
* Copyright (C) 2017 EDIT
4
* European Distributed Institute of Taxonomy
5
* http://www.e-taxonomy.eu
6
*
7
* The contents of this file are subject to the Mozilla Public License Version 1.1
8
* See LICENSE.TXT at the top of this package for the full license terms.
9
*/
10
package eu.etaxonomy.taxeditor.editor.workingSet;
11

    
12
import java.util.UUID;
13

    
14
import javax.annotation.PostConstruct;
15
import javax.annotation.PreDestroy;
16
import javax.inject.Inject;
17
import javax.inject.Named;
18

    
19
import org.eclipse.e4.ui.di.Focus;
20
import org.eclipse.e4.ui.model.application.ui.MDirtyable;
21
import org.eclipse.e4.ui.services.IServiceConstants;
22
import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
23
import org.eclipse.jface.viewers.ISelection;
24
import org.eclipse.jface.viewers.ISelectionChangedListener;
25
import org.eclipse.jface.viewers.IStructuredSelection;
26
import org.eclipse.jface.viewers.SelectionChangedEvent;
27
import org.eclipse.jface.viewers.TreeSelection;
28
import org.eclipse.jface.viewers.TreeViewer;
29
import org.eclipse.swt.SWT;
30
import org.eclipse.swt.custom.SashForm;
31
import org.eclipse.swt.dnd.DND;
32
import org.eclipse.swt.dnd.Transfer;
33
import org.eclipse.swt.events.ModifyEvent;
34
import org.eclipse.swt.events.ModifyListener;
35
import org.eclipse.swt.events.SelectionAdapter;
36
import org.eclipse.swt.events.SelectionEvent;
37
import org.eclipse.swt.layout.GridData;
38
import org.eclipse.swt.layout.GridLayout;
39
import org.eclipse.swt.widgets.Button;
40
import org.eclipse.swt.widgets.Composite;
41
import org.eclipse.swt.widgets.Display;
42
import org.eclipse.swt.widgets.Label;
43
import org.eclipse.swt.widgets.Shell;
44
import org.eclipse.swt.widgets.Tree;
45
import org.eclipse.ui.forms.widgets.FormToolkit;
46

    
47
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
48
import eu.etaxonomy.cdm.api.service.IFeatureTreeService;
49
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
50
import eu.etaxonomy.cdm.model.description.Character;
51
import eu.etaxonomy.cdm.model.description.FeatureNode;
52
import eu.etaxonomy.cdm.model.description.FeatureTree;
53
import eu.etaxonomy.taxeditor.featuretree.FeatureNodeDragListener;
54
import eu.etaxonomy.taxeditor.featuretree.FeatureNodeDropAdapter;
55
import eu.etaxonomy.taxeditor.featuretree.FeatureNodeTransfer;
56
import eu.etaxonomy.taxeditor.featuretree.FeatureTreeContentProvider;
57
import eu.etaxonomy.taxeditor.featuretree.FeatureTreeLabelProvider;
58
import eu.etaxonomy.taxeditor.featuretree.e4.FeatureTreeEditorComposite;
59
import eu.etaxonomy.taxeditor.model.MessagingUtils;
60
import eu.etaxonomy.taxeditor.store.CdmStore;
61
import eu.etaxonomy.taxeditor.ui.dialog.selection.FeatureTreeSelectionDialog;
62

    
63
/**
64
 * @author pplitzner
65
 * @date 24.05.2017
66
 *
67
 */
68
public class CharacterEditor implements ISelectionChangedListener, ModifyListener{
69

    
70

    
71
    private FeatureTreeEditorComposite featureTreeEditorComposite;
72
    private TreeViewer treeViewerProperties;
73
    private TreeViewer treeViewerStructures;
74
    private final FormToolkit formToolkit = new FormToolkit(Display.getDefault());
75
    private Button btnAddCharacter;
76

    
77
    @Inject
78
    private ESelectionService selService;
79

    
80
    @Inject
81
    private MDirtyable dirty;
82

    
83
    private ConversationHolder conversation;
84
    private FeatureTree featureTree;
85

    
86
    public CharacterEditor() {
87
        conversation = CdmStore.createConversation();
88
    }
89

    
90
    /**
91
     * Create contents of the view part.
92
     */
93
    @PostConstruct
94
    public void createControls(Composite parent, @Named(IServiceConstants.ACTIVE_SHELL)Shell shell) {
95
        parent.setLayout(new GridLayout(1, false));
96

    
97
        SashForm sashForm = new SashForm(parent, SWT.NONE);
98
        sashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
99
        formToolkit.adapt(sashForm);
100
        formToolkit.paintBordersFor(sashForm);
101

    
102
        Composite composite = new Composite(sashForm, SWT.NONE);
103
        formToolkit.adapt(composite);
104
        formToolkit.paintBordersFor(composite);
105
        composite.setLayout(new GridLayout(1, false));
106

    
107
        Label lblNewLabel = new Label(composite, SWT.NONE);
108
        lblNewLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1));
109
        formToolkit.adapt(lblNewLabel, true, true);
110
        lblNewLabel.setText("Structures");
111

    
112
        treeViewerStructures = new TreeViewer(composite, SWT.BORDER);
113
        Tree tree = treeViewerStructures.getTree();
114
        tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
115

    
116
        Composite composite_1 = new Composite(sashForm, SWT.NONE);
117
        formToolkit.adapt(composite_1);
118
        formToolkit.paintBordersFor(composite_1);
119
        composite_1.setLayout(new GridLayout(1, false));
120

    
121
        Label lblNewLabel_1 = new Label(composite_1, SWT.NONE);
122
        lblNewLabel_1.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1));
123
        formToolkit.adapt(lblNewLabel_1, true, true);
124
        lblNewLabel_1.setText("Properties");
125

    
126
        treeViewerProperties = new TreeViewer(composite_1, SWT.BORDER);
127
        Tree tree_1 = treeViewerProperties.getTree();
128
        tree_1.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
129

    
130
        Composite composite_2 = new Composite(sashForm, SWT.NONE);
131
        formToolkit.adapt(composite_2);
132
        formToolkit.paintBordersFor(composite_2);
133
        composite_2.setLayout(new GridLayout(1, false));
134

    
135
        btnAddCharacter = new Button(composite_2, SWT.NONE);
136
        btnAddCharacter.setText(">>");
137
        btnAddCharacter.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, true, 1, 1));
138
        formToolkit.adapt(btnAddCharacter, true, true);
139

    
140
        Composite composite_3 = new Composite(sashForm, SWT.NONE);
141
        formToolkit.adapt(composite_3);
142
        formToolkit.paintBordersFor(composite_3);
143
        composite_3.setLayout(new GridLayout(1, false));
144

    
145
        featureTreeEditorComposite = new FeatureTreeEditorComposite(composite_3, SWT.BORDER);
146
        featureTreeEditorComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
147
        featureTreeEditorComposite.getButton_add().setVisible(false);
148
        featureTreeEditorComposite.getButton_remove().setVisible(false);
149
        featureTreeEditorComposite.init(new FeatureNodeDragListener(featureTreeEditorComposite.getViewer()), new FeatureNodeDropAdapter(featureTreeEditorComposite.getViewer()), this, new SelectionAdapter() {
150
            @Override
151
            public void widgetSelected(SelectionEvent e) {
152
                FeatureTree tree = FeatureTreeSelectionDialog.select(shell, conversation, null);
153
                if(tree!=null){
154
                    setSelectedTree(tree);
155
                }
156
            }
157
        }, new SelectionAdapter() {
158
        }, new SelectionAdapter() {
159
        });
160
        sashForm.setWeights(new int[] {3, 3, 1, 3});
161

    
162
        init();
163
    }
164

    
165
    public void setSelectedTree(FeatureTree featureTree) {
166
        this.featureTree = HibernateProxyHelper.deproxy(featureTree, FeatureTree.class);
167
        this.featureTree.setRoot(HibernateProxyHelper.deproxy(featureTree.getRoot(), FeatureNode.class));
168
        featureTreeEditorComposite.getViewer().setInput(featureTree);
169

    
170
        featureTreeEditorComposite.getText_title().removeModifyListener(this);
171
        featureTreeEditorComposite.getText_title().setText(featureTree.getTitleCache());
172
        featureTreeEditorComposite.getText_title().addModifyListener(this);
173
    }
174

    
175
    private void init(){
176
        int dndOperations = DND.DROP_COPY | DND.DROP_MOVE;
177
        Transfer[] transfers = new Transfer[] { FeatureNodeTransfer.getInstance() };
178

    
179
        FeatureTree structureFeatureTree = CdmStore.getService(IFeatureTreeService.class).load(UUID.fromString("3a953dd1-2b5f-482f-9a33-664ee7ef6c68"));
180
        treeViewerStructures.setContentProvider(new FeatureTreeContentProvider());
181
        treeViewerStructures.setLabelProvider(new FeatureTreeLabelProvider());
182
        treeViewerStructures.setInput(structureFeatureTree);
183

    
184
        FeatureTree propertiesFeatureTree = CdmStore.getService(IFeatureTreeService.class).load(UUID.fromString("e283bbf5-bda3-449d-98de-3601ac8a8bbd"));
185
        treeViewerProperties.setContentProvider(new FeatureTreeContentProvider());
186
        treeViewerProperties.setLabelProvider(new FeatureTreeLabelProvider());
187
        treeViewerProperties.addDragSupport(dndOperations, transfers, new CharacterDragListener(treeViewerStructures, treeViewerProperties));
188
        treeViewerProperties.setInput(propertiesFeatureTree);
189

    
190
        btnAddCharacter.addSelectionListener(new SelectionAdapter() {
191
            /**
192
             * {@inheritDoc}
193
             */
194
            @Override
195
            public void widgetSelected(SelectionEvent e) {
196
                ISelection structureTreeSelection = treeViewerStructures.getSelection();
197
                ISelection propertyTreeSelection = treeViewerProperties.getSelection();
198
                if(structureTreeSelection==null || propertyTreeSelection==null /*|| editor.getSelectedFeatureTree()==null*/){
199
                    MessagingUtils.warningDialog("Cannot perform action", CharacterEditor.this,
200
                            "You have to select a structure, a property and a feature tree to perform this action.");
201
                    return;
202
                }
203
                //get selected structure and property
204
                FeatureNode structureNode = (FeatureNode) ((TreeSelection)structureTreeSelection).getFirstElement();
205
                FeatureNode propertyNode = (FeatureNode) ((TreeSelection)propertyTreeSelection).getFirstElement();
206
                //create new Character
207
                String label = structureNode.getFeature().toString()+" "+propertyNode.getFeature().toString();
208
                Character character = Character.NewInstance(structureNode, propertyNode, null, label, label);
209
//                CdmStore.getService(ITermService.class).merge(character);
210

    
211
                //add new Character to feature tree
212
                IStructuredSelection selection = (IStructuredSelection) featureTreeEditorComposite.getViewer().getSelection();
213
                FeatureNode parent = (FeatureNode) (selection.getFirstElement() != null ? selection.getFirstElement()
214
                        : ((FeatureTree) featureTreeEditorComposite.getViewer().getInput()).getRoot());
215
                FeatureNode child = FeatureNode.NewInstance(character);
216
//                CdmStore.getService(IFeatureNodeService.class).merge(child, true);
217

    
218
                parent.addChild(child);
219
                setDirty(true);
220
                featureTreeEditorComposite.getViewer().refresh();
221
            }
222
        });
223
    }
224

    
225
    @PreDestroy
226
    public void dispose() {
227
    }
228

    
229
    @Focus
230
    public void setFocus() {
231
        if(conversation!=null && !conversation.isBound()){
232
            conversation.bind();
233
        }
234
    }
235

    
236
    public TreeViewer getTreeViewerProperties() {
237
        return treeViewerProperties;
238
    }
239
    public TreeViewer getTreeViewerStructures() {
240
        return treeViewerStructures;
241
    }
242

    
243
    /**
244
     * {@inheritDoc}
245
     */
246
    @Override
247
    public void selectionChanged(SelectionChangedEvent event) {
248
        //propagate selection
249
        IStructuredSelection isel = (IStructuredSelection) event.getSelection();
250
        selService.setSelection((isel.size() == 1 ? isel.getFirstElement() : isel.toArray()));
251
    }
252

    
253
    /**
254
     * {@inheritDoc}
255
     */
256
    @Override
257
    public void modifyText(ModifyEvent e) {
258
        featureTree.setTitleCache(featureTreeEditorComposite.getText_title().getText(), true);
259
        setDirty(true);
260
    }
261

    
262
    private void setDirty(boolean isDirty) {
263
        dirty.setDirty(isDirty);
264
    }
265
}
(3-3/3)