2 * Copyright (C) 2017 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
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.
9 package eu
.etaxonomy
.taxeditor
.preference
;
12 import java
.awt
.Toolkit
;
15 import javax
.swing
.event
.DocumentEvent
;
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
;
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
;
45 public class ListComponent
implements ModifyListener
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
;
61 public CdmPreference
getProviderListPreference() {
62 return providerListPreference
;
66 public void setProviderListPreference(CdmPreference providerListPreference
) {
67 this.providerListPreference
= providerListPreference
;
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
!= null && !providerListPreference
.isAllowOverride()){
76 Label editingNotAllowed
= new Label(parent
, style
);
77 editingNotAllowed
.setText(Messages
.AbcdImportProvider_description_not_available
);
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
);
87 Rectangle clientArea
= parent
.getShell().getClientArea ();
88 list
.setBounds (clientArea
.x
, clientArea
.y
, 50, 500);
91 String allProviderString
= ""; //$NON-NLS-1$
92 String allProviderStringDB
= "";
94 if (!isAdmin
&& (providerListPreference
!= null && providerListPreference
.isAllowOverride())){
95 allProviderString
= PreferencesUtil
.getStringValue(PreferencePredicate
.BioCaseProvider
.getKey(), true);
98 if (providerListPreference
!= null){
99 allProviderString
= providerListPreference
.getValue();
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
);
112 if (list
.getItemCount() == 0){
113 list
.add(noProvider
);
115 list
.add(""); //$NON-NLS-1$
117 // list.setSelection(0);
118 GridData dataList
= new GridData();
119 dataList
.horizontalAlignment
= GridData
.FILL
;
120 dataList
.horizontalSpan
= 3;
123 // dataList.grabExcessVerticalSpace = true;
125 list
.setLayoutData(dataList
);
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("");
138 labelException
.setLayoutData(dataProviderUri
);
140 Button addButton
= new Button(parent
, SWT
.NULL
);
141 AddListener addListener
= new AddListener(addButton
);
142 addButton
.setText(addString
);
143 addButton
.addMouseListener(addListener
);
145 removeButton
= new Button(parent
, SWT
.NULL
);
146 removeButton
.setText(removeString
);
147 removeButton
.addMouseListener(new RemoveListener());
151 public boolean isAdmin() {
155 public void setAdmin(boolean isAdmin
) {
156 this.isAdmin
= isAdmin
;
159 class RemoveListener
implements MouseListener
{
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();
167 String item
= list
.getItem(index
);
168 if (item
.equals(serverSidePreference
)) {
174 int size
= list
.getItemCount();
176 if (size
== 0) { //Nothing's left, disable removing.
177 removeButton
.setEnabled(false);
179 } else { //Select an index.
181 //removed item in last position
185 list
.setSelection(index
-1);
186 preferencePage
.setApply(true);
189 }catch(IllegalArgumentException iae
){
190 //nothing was selected
199 public void mouseDoubleClick(MouseEvent e
) {
200 // TODO Auto-generated method stub
209 public void mouseDown(MouseEvent e
) {
210 // TODO Auto-generated method stub
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
;
220 public AddListener(Button button
) {
221 this.button
= button
;
225 protected boolean alreadyInList(String name
) {
226 return list
.getData(name
) != null;
230 private void enableButton() {
231 if (!alreadyEnabled
) {
232 button
.setEnabled(true);
236 private boolean handleEmptyTextField(DocumentEvent e
) {
237 if (e
.getDocument().getLength() <= 0) {
238 button
.setEnabled(false);
239 alreadyEnabled
= false;
251 public void mouseDoubleClick(MouseEvent e
) {
252 // TODO Auto-generated method stub
260 public void mouseDown(MouseEvent e
) {
261 // TODO Auto-generated method stub
269 public void mouseUp(MouseEvent event
) {
270 String name
= providerURI
.getText();
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();
279 int index
= list
.getSelectionIndex(); //get selected index
280 if (index
== -1) { //no selection, so insert at beginning
282 } else { //add after the selected item
285 if(list
.getItemCount() == 0){
287 }else if (list
.getItem(0).equals(noProvider
)){
288 list
.remove(noProvider
);
290 int itemCount
= list
.getItemCount();
293 list
.add(providerURI
.getText(), index
);
294 list
.setSelection(index
);
298 //Select the new item
300 providerURI
.setText(""); //$NON-NLS-1$
301 preferencePage
.setApply(true);
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
)){
311 }else if (first
|| allProviderString
== null || allProviderString
== ""){ //$NON-NLS-1$
312 allProviderString
= item
.trim();
315 allProviderString
+=";"+ item
.trim(); //$NON-NLS-1$
319 return allProviderString
;
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;
338 //remove control character such as line breaks etc.
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());
355 protected URL
getParsedText() throws Exception
{
356 String uriText
= providerURI
.getText();
357 if(!StringUtils
.isBlank(uriText
)){
358 return new URL(providerURI
.getText());