Merge branch 'release/5.9.0'
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / preference / ListComponent.java
1 /**
2 * Copyright (C) 2017 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.preference;
10
11
12 import java.awt.Toolkit;
13 import java.net.URL;
14
15 import javax.swing.event.DocumentEvent;
16
17 import org.apache.commons.lang.StringUtils;
18 import org.eclipse.jface.resource.JFaceResources;
19 import org.eclipse.swt.SWT;
20 import org.eclipse.swt.custom.CLabel;
21 import org.eclipse.swt.events.ModifyEvent;
22 import org.eclipse.swt.events.ModifyListener;
23 import org.eclipse.swt.events.MouseEvent;
24 import org.eclipse.swt.events.MouseListener;
25 import org.eclipse.swt.graphics.Rectangle;
26 import org.eclipse.swt.layout.GridData;
27 import org.eclipse.swt.widgets.Button;
28 import org.eclipse.swt.widgets.Composite;
29 import org.eclipse.swt.widgets.Display;
30 import org.eclipse.swt.widgets.Label;
31 import org.eclipse.swt.widgets.List;
32 import org.eclipse.swt.widgets.Text;
33
34 import eu.etaxonomy.cdm.model.metadata.CdmPreference;
35 import eu.etaxonomy.cdm.model.metadata.PreferencePredicate;
36 import eu.etaxonomy.taxeditor.l10n.Messages;
37 import eu.etaxonomy.taxeditor.preference.menu.CdmPreferencePage;
38
39
40 /**
41 * @author k.luther
42 * @date 20.04.2017
43 *
44 */
45 public class ListComponent implements ModifyListener
46 {
47 private List list;
48
49 private static final String addString = Messages.ListComponent_ADD_PROVIDER;
50 private static final String removeString = Messages.ListComponent_REMOVE_PROVIDER;
51 private static final String noProvider = Messages.ListComponent_NO_PROVIDER_AVAILABLE;
52 private static final String serverSidePreference = "Server Side Preference:";
53 private Button removeButton;
54 private Text providerURI;
55 protected Label labelException;
56 boolean isAdmin = false;
57 CdmPreferencePage preferencePage;
58 CdmPreference providerListPreference;
59
60
61 public CdmPreference getProviderListPreference() {
62 return providerListPreference;
63 }
64
65
66 public void setProviderListPreference(CdmPreference providerListPreference) {
67 this.providerListPreference = providerListPreference;
68 }
69
70
71 public ListComponent(Composite parent, int style, boolean isAdmin, CdmPreferencePage parentPage) {
72 this.isAdmin= isAdmin;
73 this.preferencePage = parentPage;
74 providerListPreference = PreferencesUtil.getPreferenceFromDB(PreferencePredicate.BioCaseProvider);
75 if (!isAdmin && !providerListPreference.isAllowOverride()){
76 Label editingNotAllowed = new Label(parent, style);
77 editingNotAllowed.setText(Messages.AbcdImportProvider_description_not_available);
78 return ;
79 }
80 final CLabel description = new CLabel(parent, SWT.NULL);
81 description.setText(Messages.AbcdImportProvider_description);
82 list = new List(parent, SWT.BORDER | SWT.V_SCROLL);
83 GridData gridData = new GridData(SWT.FILL, SWT.CENTER, true, true, 2, 3);
84 gridData.grabExcessHorizontalSpace = true;
85 list.setLayoutData(gridData);
86
87 Rectangle clientArea = parent.getShell().getClientArea ();
88 list.setBounds (clientArea.x, clientArea.y, 50, 500);
89
90
91 String allProviderString = ""; //$NON-NLS-1$
92 String allProviderStringDB = "";
93
94 if (!isAdmin && (providerListPreference != null && providerListPreference.isAllowOverride())){
95 allProviderString = PreferencesUtil.getStringValue(PreferencePredicate.BioCaseProvider.getKey(), true);
96
97 }else{
98 if (providerListPreference != null){
99 allProviderString = providerListPreference.getValue();
100 }
101 }
102
103 //the string is structured like this: http://ww3.bgbm.org/biocase/pywrapper.cgi?dsa=DNA_Bank;http:...;
104 String[] providerArray = allProviderString.split(";"); //$NON-NLS-1$
105 for (String providerString : providerArray){
106 if (!StringUtils.isBlank(providerString)){
107 list.add(providerString);
108
109 }
110 }
111
112 if (list.getItemCount() == 0){
113 list.add(noProvider);
114 }
115 list.add(""); //$NON-NLS-1$
116
117 // list.setSelection(0);
118 GridData dataList = new GridData();
119 dataList.horizontalAlignment = GridData.FILL;
120 dataList.horizontalSpan = 3;
121
122
123 // dataList.grabExcessVerticalSpace = true;
124
125 list.setLayoutData(dataList);
126
127
128 providerURI = new Text(parent, SWT.BORDER | SWT.SINGLE | SWT.FULL_SELECTION);
129 GridData dataProviderUri = new GridData();
130 dataProviderUri.horizontalAlignment = GridData.FILL;
131 dataProviderUri.horizontalSpan = 3;
132 providerURI.setLayoutData(dataProviderUri);
133 providerURI.addModifyListener(this);
134 labelException = new Label(parent, SWT.NULL);
135 labelException.setText("");
136
137
138 labelException.setLayoutData(dataProviderUri);
139
140 Button addButton = new Button(parent, SWT.NULL);
141 AddListener addListener = new AddListener(addButton);
142 addButton.setText(addString);
143 addButton.addMouseListener(addListener);
144
145 removeButton = new Button(parent, SWT.NULL);
146 removeButton.setText(removeString);
147 removeButton.addMouseListener(new RemoveListener());
148 }
149
150
151 public boolean isAdmin() {
152 return isAdmin;
153 }
154
155 public void setAdmin(boolean isAdmin) {
156 this.isAdmin = isAdmin;
157 }
158
159 class RemoveListener implements MouseListener {
160 @Override
161 public void mouseUp(MouseEvent e) {
162 //This method can be called only if
163 //there's a valid selection
164 //so go ahead and remove whatever's selected.
165 int index = list.getSelectionIndex();
166 try{
167 String item = list.getItem(index);
168 if (item.equals(serverSidePreference)) {
169 return;
170 }
171 list.remove(index);
172
173
174 int size = list.getItemCount();
175
176 if (size == 0) { //Nothing's left, disable removing.
177 removeButton.setEnabled(false);
178
179 } else { //Select an index.
180 if (index == size) {
181 //removed item in last position
182 index--;
183 }
184
185 list.setSelection(index-1);
186 preferencePage.setApply(true);
187
188 }
189 }catch(IllegalArgumentException iae){
190 //nothing was selected
191 return;
192 }
193
194 }
195 /**
196 * {@inheritDoc}
197 */
198 @Override
199 public void mouseDoubleClick(MouseEvent e) {
200 // TODO Auto-generated method stub
201
202 }
203
204
205 /**
206 * {@inheritDoc}
207 */
208 @Override
209 public void mouseDown(MouseEvent e) {
210 // TODO Auto-generated method stub
211
212 }
213 }
214
215 //This listener is shared by the text field and the add button.
216 class AddListener implements MouseListener {
217 private boolean alreadyEnabled = false;
218 private Button button;
219
220 public AddListener(Button button) {
221 this.button = button;
222 }
223
224
225 protected boolean alreadyInList(String name) {
226 return list.getData(name) != null;
227 }
228
229
230 private void enableButton() {
231 if (!alreadyEnabled) {
232 button.setEnabled(true);
233 }
234 }
235
236 private boolean handleEmptyTextField(DocumentEvent e) {
237 if (e.getDocument().getLength() <= 0) {
238 button.setEnabled(false);
239 alreadyEnabled = false;
240 return true;
241 }
242 return false;
243 }
244
245
246
247 /**
248 * {@inheritDoc}
249 */
250 @Override
251 public void mouseDoubleClick(MouseEvent e) {
252 // TODO Auto-generated method stub
253
254 }
255
256 /**
257 * {@inheritDoc}
258 */
259 @Override
260 public void mouseDown(MouseEvent e) {
261 // TODO Auto-generated method stub
262
263 }
264
265 /**
266 * {@inheritDoc}
267 */
268 @Override
269 public void mouseUp(MouseEvent event) {
270 String name = providerURI.getText();
271
272 //User didn't type in a unique name...
273 if (name.equals("") || alreadyInList(name) || !StringUtils.isBlank(labelException.getText())) { //$NON-NLS-1$
274 Toolkit.getDefaultToolkit().beep();
275 providerURI.selectAll();
276 return;
277 }
278
279 int index = list.getSelectionIndex(); //get selected index
280 if (index == -1) { //no selection, so insert at beginning
281 index = 0;
282 } else { //add after the selected item
283 index++;
284 }
285 if(list.getItemCount() == 0){
286 index = 0;
287 }else if (list.getItem(0).equals(noProvider)){
288 list.remove(noProvider);
289 }
290 int itemCount = list.getItemCount();
291
292
293 list.add(providerURI.getText(), index);
294 list.setSelection(index);
295 list.update();
296 list.redraw();
297
298 //Select the new item
299
300 providerURI.setText(""); //$NON-NLS-1$
301 preferencePage.setApply(true);
302 }
303 }
304
305 public String createAllProviderString(){
306 String allProviderString = null;
307 boolean first = true;
308 for (String item: list.getItems()){
309 if (item.equals(noProvider) || item.equals(serverSidePreference)){
310 //do nothing
311 }else if (first || allProviderString == null || allProviderString == ""){ //$NON-NLS-1$
312 allProviderString = item.trim();
313 first = false;
314 }else {
315 allProviderString +=";"+ item.trim(); //$NON-NLS-1$
316 }
317 }
318
319 return allProviderString;
320
321 }
322
323
324 @Override
325 public void modifyText(ModifyEvent e) {
326 if(e.widget==providerURI){
327 Text text = (Text) e.widget;
328 boolean hasControlCharacters = false;
329 String textString = text.getText();
330 int stringLength = textString.length();
331 for (int i = 0; i < stringLength; i++) {
332 if (Character.isISOControl(textString.charAt(i))) {
333 hasControlCharacters = true;
334 break;
335 }
336 }
337
338 //remove control character such as line breaks etc.
339 try {
340 getParsedText();
341 labelException.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT));
342 labelException.setForeground(Display.getCurrent().getSystemColor(SWT.NULL));
343 labelException.setText("");
344 } catch (Exception exception) {
345 labelException.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT));
346 labelException.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
347 labelException.setText(Messages.UriWithLabelElement_URL_NOT_SAVED+exception.getLocalizedMessage());
348 }
349 }
350
351
352 }
353
354
355 protected URL getParsedText() throws Exception {
356 String uriText = providerURI.getText();
357 if(!StringUtils.isBlank(uriText)){
358 return new URL(providerURI.getText());
359 }
360 return null;
361 }
362
363
364
365 }
366