Project

General

Profile

Download (10.2 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2018 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.webimport.termimport;
10

    
11
import java.util.ArrayList;
12
import java.util.Collection;
13
import java.util.Collections;
14
import java.util.Comparator;
15
import java.util.Iterator;
16
import java.util.List;
17
import java.util.stream.Collectors;
18

    
19
import org.eclipse.jface.util.LocalSelectionTransfer;
20
import org.eclipse.jface.viewers.ISelection;
21
import org.eclipse.jface.viewers.IStructuredSelection;
22
import org.eclipse.jface.viewers.StructuredSelection;
23
import org.eclipse.jface.window.Window;
24
import org.eclipse.swt.SWT;
25
import org.eclipse.swt.dnd.DND;
26
import org.eclipse.swt.dnd.DragSourceAdapter;
27
import org.eclipse.swt.dnd.DragSourceEvent;
28
import org.eclipse.swt.dnd.Transfer;
29
import org.eclipse.swt.events.FocusEvent;
30
import org.eclipse.swt.events.FocusListener;
31
import org.eclipse.swt.events.KeyAdapter;
32
import org.eclipse.swt.events.KeyEvent;
33
import org.eclipse.swt.events.SelectionAdapter;
34
import org.eclipse.swt.events.SelectionEvent;
35

    
36
import eu.etaxonomy.cdm.common.CdmUtils;
37
import eu.etaxonomy.taxeditor.l10n.Messages;
38
import eu.etaxonomy.taxeditor.model.ColorResources;
39
import eu.etaxonomy.taxeditor.model.MessagingUtils;
40
import eu.etaxonomy.taxeditor.preference.Resources;
41
import eu.etaxonomy.taxeditor.view.webimport.termimport.parser.TermParser;
42
import eu.etaxonomy.taxeditor.view.webimport.termimport.requests.RequestSearch;
43
import eu.etaxonomy.taxeditor.view.webimport.termimport.wrapper.OntologyTermWrapper;
44
import eu.etaxonomy.taxeditor.view.webimport.termimport.wrapper.TerminologyWrapper;
45

    
46
/**
47
 * @author pplitzner
48
 * @since Apr 23, 2018
49
 *
50
 */
51
public class GfBioTerminologyImportPresenter {
52

    
53
    public static final String NO_CONNECTION_TITLE = Messages.GfBioTerminologyImportPresenter_NO_CONNECTION_TITLE;
54
    public static final String NO_CONNECTION_MESSAGE = Messages.GfBioTerminologyImportPresenter_NO_CONNECTION_MESSAGE;
55
    private static final String TXT_SEARCH_DEFAULT = Messages.GfBioTerminologyImportPresenter_TEXT_SEARCH_DEFAULT;
56

    
57
    private GfBioTerminologyImportComposite composite;
58
    private Collection<TerminologyWrapper> selectedOntologies = new ArrayList<>();
59

    
60
    public GfBioTerminologyImportPresenter(GfBioTerminologyImportComposite composite) {
61
        super();
62
        this.composite = composite;
63
        composite.getBtnSearch().addSelectionListener(new SelectionAdapter() {
64
            @Override
65
            public void widgetSelected(SelectionEvent e) {
66
                if(e.widget==composite.getBtnSearch()){
67
                    search();
68
                }
69
            }
70
        });
71

    
72
        //text search
73
        composite.getTxtSearch().addKeyListener(new KeyAdapter() {
74
            @Override
75
            public void keyPressed(KeyEvent e) {
76
                if(e.keyCode==SWT.CR){
77
                    search();
78
                }
79
            }
80
        });
81
        composite.getTxtSearch().setText(TXT_SEARCH_DEFAULT);
82
        composite.getTxtSearch().setForeground(ColorResources.getColor(Resources.SEARCH_VIEW_FOREGROUND));
83
        composite.getTxtSearch().addFocusListener(new FocusListener() {
84

    
85
            @Override
86
            public void focusGained(FocusEvent e) {
87
                composite.getTxtSearch().setForeground(ColorResources.getColor(Resources.SEARCH_VIEW_FOCUS));
88
                if (TXT_SEARCH_DEFAULT.equals(composite.getTxtSearch().getText())) {
89
                    composite.getTxtSearch().setText(""); //$NON-NLS-1$
90
                }
91
            }
92

    
93
            @Override
94
            public void focusLost(FocusEvent e) {
95
                if (CdmUtils.isBlank(composite.getTxtSearch().getText())) {
96
                    composite.getTxtSearch().setForeground(ColorResources.getColor(Resources.SEARCH_VIEW_FOREGROUND));
97
                    composite.getTxtSearch().setText(TXT_SEARCH_DEFAULT);
98
                }
99
            }
100
        });
101

    
102
        composite.getBtnChooseOntology().addSelectionListener(new SelectionAdapter() {
103
            @Override
104
            public void widgetSelected(SelectionEvent e) {
105
                OntologySelectionDialog dialog = new OntologySelectionDialog(composite.getShell(), selectedOntologies);
106
                if(dialog.open()==Window.OK){
107
                    selectedOntologies = dialog.getOntologies();
108
                    composite.getTextOntologies().setText(selectedOntologies.stream()
109
                            .map(wrapper->wrapper.getAcronym())
110
                            .collect(Collectors.joining(", ")));
111
                }
112
            }
113
        });
114

    
115
        //vocabulary combo
116
        composite.getBtnRemoveVocabulary().addSelectionListener(new SelectionAdapter() {
117
            @Override
118
            public void widgetSelected(SelectionEvent e) {
119
                composite.getTermVocabularyComboViewer().setElement(null);
120
            }
121
        });
122

    
123
        composite.getTreeTermHierarchy().setContentProvider(new OntologyTermContentProvider());
124
        composite.getTreeTermHierarchy().setLabelProvider(new OntologyTermLabelProvider());
125

    
126
        //tree results
127
        composite.getTreeTermHierarchy().addSelectionChangedListener(e->updateDetails(e.getSelection()));
128
        composite.getTreeTermHierarchy().setContentProvider(new OntologyTermContentProvider());
129
        composite.getTreeTermHierarchy().setLabelProvider(new OntologyTermLabelProvider());
130
        Transfer[] transfers = new Transfer[] {LocalSelectionTransfer.getTransfer(),};
131
        composite.getTreeTermHierarchy().addDragSupport(DND.DROP_MOVE,
132
                transfers, new DragSourceAdapter() {
133

    
134
            @Override
135
            public void dragSetData(DragSourceEvent event) {
136
                if (LocalSelectionTransfer.getTransfer().isSupportedType(event.dataType)) {
137
                    IStructuredSelection selection = (IStructuredSelection) composite.getTreeTermHierarchy().getSelection();
138
                    selection.toList().stream()
139
                    .filter(item->item instanceof OntologyTermWrapper)
140
                    .forEach(wrapper->((OntologyTermWrapper)wrapper).setTermVocabulary(composite.getTermVocabularyComboViewer().getSelection()));
141
                    LocalSelectionTransfer.getTransfer().setSelection(selection);
142
                }
143
            }
144
            @Override
145
            public void dragStart(DragSourceEvent event) {
146
                event.doit = !composite.getTreeTermHierarchy().getSelection().isEmpty();
147
            }
148
        });
149
    }
150

    
151
    private OntologyTermWrapper getSelectedTerm(IStructuredSelection selection){
152
        Iterator iterator = selection.iterator();
153
        if(iterator.hasNext()){
154
            Object next = iterator.next();
155
            if(next instanceof OntologyTermWrapper){
156
                return (OntologyTermWrapper) next;
157
            }
158
        }
159
        return null;
160
    }
161

    
162
    private void clearDetails(){
163
        composite.getLblLabel().setText(""); //$NON-NLS-1$
164
        composite.getLblUri().setText(""); //$NON-NLS-1$
165
        composite.getLblDescription().setText(""); //$NON-NLS-1$
166
        composite.getListSynonyms().getList().removeAll();
167
    }
168

    
169
    private void updateDetails(ISelection s) {
170
        StructuredSelection selection = (StructuredSelection)s;
171
        if(selection.isEmpty()){
172
            clearDetails();
173
        }
174
        OntologyTermWrapper wrapper = getSelectedTerm(selection);
175
        if(wrapper!=null){
176
            String label = wrapper.getLabel();
177
            String uri = wrapper.getUri();
178
            String description = wrapper.getDescription();
179
            composite.getLblLabel().setText(label!=null?label:""); //$NON-NLS-1$
180
            composite.getLblUri().setText(uri!=null?uri:""); //$NON-NLS-1$
181
            composite.getLblDescription().setText(description!=null?description:""); //$NON-NLS-1$
182
            composite.getListSynonyms().getList().removeAll();
183
            if(wrapper.getSynonyms()!=null){
184
                wrapper.getSynonyms().forEach(syn->composite.getListSynonyms().add(syn));
185
            }
186
        }
187
    }
188

    
189
    private void search(){
190
        //clear result count
191
        composite.getLblResultCount().setText("");
192

    
193
        String searchString = composite.getTxtSearch().getText();
194
        if(searchString.equals(TXT_SEARCH_DEFAULT)){
195
            return;
196
        }
197
        String response = new RequestSearch(searchString, selectedOntologies).request();
198
        if(response==null){
199
            MessagingUtils.informationDialog(NO_CONNECTION_TITLE, NO_CONNECTION_MESSAGE);
200
            return;
201
        }
202
        List<OntologyTermWrapper> wrapperList = new ArrayList<>();
203
        wrapperList = TermParser.parse(response);
204
        if(wrapperList.isEmpty()){
205
            MessagingUtils.informationDialog(Messages.GfBioTerminologyImportPresenter_NO_RESULTS_TITLE, Messages.GfBioTerminologyImportPresenter_NO_RESULTS_MESSAGE);
206
        }
207
        //sort list
208
        Collections.sort(wrapperList, new Comparator<OntologyTermWrapper>() {
209
            @Override
210
            public int compare(OntologyTermWrapper o1, OntologyTermWrapper o2) {
211
                //remove wildcards from search string
212
                String trimmedSearch = searchString.replace("*", "");
213
                String label1 = o1.getLabel();
214
                String label2 = o2.getLabel();
215
                //1. search string at the beginning
216
                if(label1.startsWith(trimmedSearch)){
217
                    if(!label2.startsWith(trimmedSearch)){
218
                        return -1;
219
                    }
220
                    else{
221
                        return label1.compareTo(label2);
222
                    }
223
                }
224
                else if(label2.startsWith(trimmedSearch)){
225
                    return 1;
226
                }
227
                //2. label that contains search string
228
                if(label1.contains(trimmedSearch)){
229
                    if(!label2.contains(trimmedSearch)){
230
                        return -1;
231
                    }
232
                }
233
                else if(label2.contains(trimmedSearch)){
234
                    return 1;
235
                }
236
                return label1.compareTo(label2);
237
            }
238
        });
239
        composite.getTreeTermHierarchy().setInput(wrapperList);
240

    
241
        composite.getLblResultCount().setText(Integer.toString(wrapperList.size()));
242
    }
243

    
244
}
(3-3/7)