Merge branch 'release/5.0.0' into develop
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / view / webimport / termimport / GfBioTerminologyImportPresenter.java
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
14 import org.eclipse.jface.util.LocalSelectionTransfer;
15 import org.eclipse.jface.viewers.ArrayContentProvider;
16 import org.eclipse.jface.viewers.ComboViewer;
17 import org.eclipse.jface.viewers.ISelection;
18 import org.eclipse.jface.viewers.IStructuredSelection;
19 import org.eclipse.jface.viewers.StructuredSelection;
20 import org.eclipse.swt.SWT;
21 import org.eclipse.swt.dnd.DND;
22 import org.eclipse.swt.dnd.DragSourceAdapter;
23 import org.eclipse.swt.dnd.DragSourceEvent;
24 import org.eclipse.swt.dnd.Transfer;
25 import org.eclipse.swt.events.FocusEvent;
26 import org.eclipse.swt.events.FocusListener;
27 import org.eclipse.swt.events.KeyAdapter;
28 import org.eclipse.swt.events.KeyEvent;
29 import org.eclipse.swt.events.SelectionAdapter;
30 import org.eclipse.swt.events.SelectionEvent;
31
32 import eu.etaxonomy.cdm.common.CdmUtils;
33 import eu.etaxonomy.taxeditor.l10n.Messages;
34 import eu.etaxonomy.taxeditor.model.ColorResources;
35 import eu.etaxonomy.taxeditor.model.MessagingUtils;
36 import eu.etaxonomy.taxeditor.preference.Resources;
37 import eu.etaxonomy.taxeditor.view.webimport.termimport.parser.SuggestParser;
38 import eu.etaxonomy.taxeditor.view.webimport.termimport.parser.TerminologyParser;
39 import eu.etaxonomy.taxeditor.view.webimport.termimport.requests.RequestSearch;
40 import eu.etaxonomy.taxeditor.view.webimport.termimport.requests.RequestSuggest;
41 import eu.etaxonomy.taxeditor.view.webimport.termimport.requests.RequestTerminologies;
42 import eu.etaxonomy.taxeditor.view.webimport.termimport.wrapper.OntologyTermWrapper;
43 import eu.etaxonomy.taxeditor.view.webimport.termimport.wrapper.TerminologyWrapper;
44
45 /**
46 * @author pplitzner
47 * @since Apr 23, 2018
48 *
49 */
50 public class GfBioTerminologyImportPresenter {
51
52 private static final String NO_CONNECTION_TITLE = Messages.GfBioTerminologyImportPresenter_NO_CONNECTION_TITLE;
53 private static final String NO_CONNECTION_MESSAGE = Messages.GfBioTerminologyImportPresenter_NO_CONNECTION_MESSAGE;
54 private static final String TXT_SEARCH_DEFAULT = Messages.GfBioTerminologyImportPresenter_TEXT_SEARCH_DEFAULT;
55
56 private GfBioTerminologyImportComposite composite;
57
58 public GfBioTerminologyImportPresenter(GfBioTerminologyImportComposite composite) {
59 super();
60 this.composite = composite;
61 composite.getBtnSearch().addSelectionListener(new SelectionAdapter() {
62 @Override
63 public void widgetSelected(SelectionEvent e) {
64 if(e.widget==composite.getBtnSearch()){
65 search();
66 }
67 }
68 });
69
70 //text search
71 composite.getTxtSearch().addKeyListener(new KeyAdapter() {
72 @Override
73 public void keyPressed(KeyEvent e) {
74 if(e.keyCode==SWT.CR){
75 search();
76 }
77 }
78 });
79 composite.getTxtSearch().setText(TXT_SEARCH_DEFAULT);
80 composite.getTxtSearch().setForeground(ColorResources.getColor(Resources.SEARCH_VIEW_FOREGROUND));
81 composite.getTxtSearch().addFocusListener(new FocusListener() {
82
83 @Override
84 public void focusGained(FocusEvent e) {
85 composite.getTxtSearch().setForeground(ColorResources.getColor(Resources.SEARCH_VIEW_FOCUS));
86 if (TXT_SEARCH_DEFAULT.equals(composite.getTxtSearch().getText())) {
87 composite.getTxtSearch().setText(""); //$NON-NLS-1$
88 }
89 }
90
91 @Override
92 public void focusLost(FocusEvent e) {
93 if (CdmUtils.isBlank(composite.getTxtSearch().getText())) {
94 composite.getTxtSearch().setForeground(ColorResources.getColor(Resources.SEARCH_VIEW_FOREGROUND));
95 composite.getTxtSearch().setText(TXT_SEARCH_DEFAULT);
96 }
97 }
98 });
99
100 //combo
101 String response = new RequestTerminologies().request();
102 if(response==null){
103 MessagingUtils.informationDialog(NO_CONNECTION_TITLE, NO_CONNECTION_MESSAGE);
104 return;
105 }
106 Collection<TerminologyWrapper> terminologies = TerminologyParser.parse(response);
107 String comboDefaultText = Messages.GfBioTerminologyImportPresenter_COMBO_DEFAULT;
108 ComboViewer comboOntologies = composite.getComboTerminologies();
109 comboOntologies.setLabelProvider(new TerminologyLabelProvider());
110 comboOntologies.setContentProvider(new ArrayContentProvider());
111 comboOntologies.setInput(terminologies);
112 comboOntologies.getCombo().setText(comboDefaultText);
113
114 composite.getBtnRemoveTerminology().addSelectionListener(new SelectionAdapter() {
115 @Override
116 public void widgetSelected(SelectionEvent e) {
117 composite.getComboTerminologies().setSelection(null);
118 comboOntologies.getCombo().setText(comboDefaultText);
119 }
120 });
121
122 composite.getTreeTermHierarchy().setContentProvider(new OntologyTermContentProvider());
123 composite.getTreeTermHierarchy().setLabelProvider(new OntologyTermLabelProvider());
124
125 //tree results
126 composite.getTreeTermHierarchy().addSelectionChangedListener(e->updateDetails(e.getSelection()));
127 composite.getTreeTermHierarchy().setContentProvider(new OntologyTermContentProvider());
128 composite.getTreeTermHierarchy().setLabelProvider(new OntologyTermLabelProvider());
129 Transfer[] transfers = new Transfer[] {LocalSelectionTransfer.getTransfer(),};
130 composite.getTreeTermHierarchy().addDragSupport(DND.DROP_MOVE,
131 transfers, new DragSourceAdapter() {
132
133 @Override
134 public void dragSetData(DragSourceEvent event) {
135 if (LocalSelectionTransfer.getTransfer().isSupportedType(event.dataType)) {
136 LocalSelectionTransfer.getTransfer().setSelection(composite.getTreeTermHierarchy().getSelection());
137 }
138 }
139 @Override
140 public void dragStart(DragSourceEvent event) {
141 event.doit = !composite.getTreeTermHierarchy().getSelection().isEmpty();
142 }
143 });
144 }
145
146 private void clearDetails(){
147 composite.getLblLabel().setText("");
148 composite.getLblUri().setText("");
149 composite.getLblDescription().setText("");
150 }
151
152 private void updateDetails(ISelection s) {
153 StructuredSelection selection = (StructuredSelection)s;
154 if(selection.isEmpty()){
155 clearDetails();
156 }
157 Object next = selection.iterator().next();
158 if(next instanceof OntologyTermWrapper){
159 OntologyTermWrapper wrapper = (OntologyTermWrapper)next;
160 String label = wrapper.getLabel();
161 String uri = wrapper.getUri();
162 String description = wrapper.getDescription();
163 composite.getLblLabel().setText(label!=null?label:"");
164 composite.getLblUri().setText(uri!=null?uri:"");
165 composite.getLblDescription().setText(description!=null?description:"");
166 }
167 }
168
169 private void search(){
170 String searchString = composite.getTxtSearch().getText();
171 if(searchString.equals(TXT_SEARCH_DEFAULT)){
172 return;
173 }
174 ISelection selection = composite.getComboTerminologies().getSelection();
175 Collection<OntologyTermWrapper> wrapperList = new ArrayList<>();
176 if(selection instanceof IStructuredSelection && !selection.isEmpty()){
177 //TODO maybe add support for mutliple terminology selection
178 Object next = ((IStructuredSelection) selection).iterator().next();
179 if(next instanceof TerminologyWrapper){
180 String response = new RequestSearch(searchString, ((TerminologyWrapper) next).getAcronym()).request();
181 if(response==null){
182 MessagingUtils.informationDialog(NO_CONNECTION_TITLE, NO_CONNECTION_MESSAGE);
183 return;
184 }
185 wrapperList = SuggestParser.parse(response);
186 }
187 }
188 else{
189 String response = new RequestSuggest(searchString).request();
190 if(response==null){
191 MessagingUtils.informationDialog(NO_CONNECTION_TITLE, NO_CONNECTION_MESSAGE);
192 return;
193 }
194 wrapperList = SuggestParser.parse(response);
195 }
196 if(wrapperList.isEmpty()){
197 MessagingUtils.informationDialog(Messages.GfBioTerminologyImportPresenter_NO_RESULTS_TITLE, Messages.GfBioTerminologyImportPresenter_NO_RESULTS_MESSAGE);
198 }
199 composite.getTreeTermHierarchy().setInput(wrapperList);
200 }
201
202 }