*/
package eu.etaxonomy.taxeditor.preference;
-
import java.awt.Toolkit;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
import java.net.URL;
+import java.util.ArrayList;
+import java.util.Iterator;
import javax.swing.event.DocumentEvent;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.eclipse.equinox.internal.p2.ui.misc.StringMatcher;
+import org.eclipse.jface.fieldassist.ComboContentAdapter;
+import org.eclipse.jface.fieldassist.ContentProposalAdapter;
+import org.eclipse.jface.fieldassist.IContentProposal;
+import org.eclipse.jface.fieldassist.IContentProposalProvider;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Text;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
import eu.etaxonomy.cdm.model.metadata.CdmPreference;
import eu.etaxonomy.cdm.model.metadata.PreferencePredicate;
import eu.etaxonomy.taxeditor.l10n.Messages;
import eu.etaxonomy.taxeditor.preference.menu.CdmPreferencePage;
-
/**
* @author k.luther
* @date 20.04.2017
- *
*/
public class ListComponent implements ModifyListener
{
private static final String addString = Messages.ListComponent_ADD_PROVIDER;
private static final String removeString = Messages.ListComponent_REMOVE_PROVIDER;
private static final String noProvider = Messages.ListComponent_NO_PROVIDER_AVAILABLE;
+ private static final String serverSidePreference = "Server Side Preference:";
private Button removeButton;
- private Text providerURI;
+ private Combo providerURI;
protected Label labelException;
boolean isAdmin = false;
CdmPreferencePage preferencePage;
+ CdmPreference providerListPreference;
+ String providerList;
+ java.util.List<String> items;
+ public CdmPreference getProviderListPreference() {
+ return providerListPreference;
+ }
+
+ public void setProviderListPreference(CdmPreference providerListPreference) {
+ this.providerListPreference = providerListPreference;
+ }
public ListComponent(Composite parent, int style, boolean isAdmin, CdmPreferencePage parentPage) {
this.isAdmin= isAdmin;
this.preferencePage = parentPage;
+
+ providerListPreference = PreferencesUtil.getPreferenceFromDB(PreferencePredicate.BioCaseProvider);
+ if (!isAdmin && providerListPreference != null && !providerListPreference.isAllowOverride()){
+ Label editingNotAllowed = new Label(parent, style);
+ editingNotAllowed.setText(Messages.AbcdImportProvider_description_not_available);
+ return ;
+ }
+ final CLabel description = new CLabel(parent, SWT.NULL);
+ description.setText(Messages.AbcdImportProvider_description);
list = new List(parent, SWT.BORDER | SWT.V_SCROLL);
GridData gridData = new GridData(SWT.FILL, SWT.CENTER, true, true, 2, 3);
gridData.grabExcessHorizontalSpace = true;
Rectangle clientArea = parent.getShell().getClientArea ();
list.setBounds (clientArea.x, clientArea.y, 50, 500);
- CdmPreference providerListPreference = PreferencesUtil.getPreferenceFromDB(PreferencePredicate.BioCaseProvider);
- String allProviderString = ""; //$NON-NLS-1$
- if (!isAdmin && (providerListPreference != null && providerListPreference.isAllowOverride())){
- allProviderString = PreferencesUtil.getStringValue(PreferencePredicate.BioCaseProvider.getKey(), true);
+
+ providerList = null; //$NON-NLS-1$
+ String allProviderStringDB = "";
+
+ if (!isAdmin && ((providerListPreference != null && providerListPreference.isAllowOverride()) || providerListPreference == null)){
+ providerList = PreferencesUtil.getStringValue(PreferencePredicate.BioCaseProvider.getKey(), true);
+
}else{
if (providerListPreference != null){
- allProviderString = providerListPreference.getValue();
+ providerList = providerListPreference.getValue();
}
}
-// = PreferencesUtil.getPreferenceStore().getString(IPreferenceKeys.BIOCASE_PROVIDER_LIST);
+
//the string is structured like this: http://ww3.bgbm.org/biocase/pywrapper.cgi?dsa=DNA_Bank;http:...;
- String[] providerArray = allProviderString.split(";"); //$NON-NLS-1$
- for (String providerString : providerArray){
- if (!StringUtils.isBlank(providerString)){
- list.add(providerString);
+ if (providerList != null){
+ String[] providerArray = providerList.split(";"); //$NON-NLS-1$
+ for (String providerString : providerArray){
+ if (!StringUtils.isBlank(providerString)){
+ list.add(providerString);
+ }
}
}
+
if (list.getItemCount() == 0){
list.add(noProvider);
}
dataList.horizontalAlignment = GridData.FILL;
dataList.horizontalSpan = 3;
-
// dataList.grabExcessVerticalSpace = true;
list.setLayoutData(dataList);
+ providerURI = new Combo(parent, SWT.BORDER);
+
+ URL url;
+ String response = null;
+ try {
+ url = new URL("https://www.biocase.org/whats_biocase/gbif_biocase.cgi");
+
+ HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+ conn.setRequestProperty("Accept", "application/json");
+ // conn.setConnectTimeout(TIMEOUT*9);
+ // conn.setReadTimeout(TIMEOUT*9);
+
+ if (conn.getResponseCode() != 200) {
+ throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode());
+ }
+ BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
+
+ StringBuilder builder = new StringBuilder();
+ String line;
+ while ((line = br.readLine()) != null) {
+ builder.append(line);
+ }
+ conn.disconnect();
+ response = builder.toString();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ java.util.List<BiocaseProvideConfig> listProvider = null;
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ listProvider = mapper.readValue(response, new TypeReference<java.util.List<BiocaseProvideConfig>>(){});
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ items = new ArrayList<>();
+ for (BiocaseProvideConfig conf: listProvider) {
+ items.add(conf.getService_url());
+ providerURI.add(conf.getService_url());
+ }
- providerURI = new Text(parent, SWT.BORDER | SWT.SINGLE | SWT.FULL_SELECTION);
GridData dataProviderUri = new GridData();
dataProviderUri.horizontalAlignment = GridData.FILL;
dataProviderUri.horizontalSpan = 3;
providerURI.setLayoutData(dataProviderUri);
- providerURI.addModifyListener(this);
+ // providerURI.setVisible(false);
+
+ ContentProposalAdapter adapter = new ContentProposalAdapter(providerURI, new ComboContentAdapter(), getProposalProvider(), null, null);
+ adapter.setPropagateKeys(true);
+ adapter.setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_REPLACE);
+// String[] proposals = new String[providerURI.getItems().length];
+//
+// for (int i = 0; i < providerURI.getItems().length; i++) {
+// proposals[i] = providerURI.getItem(i);
+// }
+//
+// ComboViewer comboViewer = new ComboViewer(parent, SWT.NONE);
+// comboViewer.setContentProvider(new ArrayContentProvider());
+// comboViewer.setLabelProvider(new LabelProvider(){
+// @Override
+// public String getText(final Object element){
+// if(element instanceof String){
+// return (String) element;
+// }
+// return element.toString();
+// }
+// });
+// comboViewer.setInput(proposals);
+// // additionally, configure the comboViewer arbitrary
+// AutoCompleteField field = new AutoCompleteField(comboViewer.getCombo(), new ComboContentAdapter(), proposals);
+
+ //providerURI.addModifyListener(this);
labelException = new Label(parent, SWT.NULL);
labelException.setText("");
-
labelException.setLayoutData(dataProviderUri);
Button addButton = new Button(parent, SWT.NULL);
removeButton.addMouseListener(new RemoveListener());
}
+ IContentProposalProvider getProposalProvider() {
+ return new IContentProposalProvider() {
+ @Override
+ public IContentProposal[] getProposals(String contents, int position) {
+ //String[] items = getStringItems();
+ if (contents.length() == 0 || items.isEmpty()) {
+ return new IContentProposal[0];
+ }
+ StringMatcher matcher = new StringMatcher("*" + contents + "*", true, false); //$NON-NLS-1$ //$NON-NLS-2$
+ java.util.List<String> matches = new ArrayList<>();
+ Iterator<String> itemsIterator = items.iterator();
+ String nextItem = null;
+ while (itemsIterator.hasNext()) {
+ nextItem = itemsIterator.next();
+ if (matcher.match(nextItem) ) {
+ matches.add(nextItem);
+ }
+ }
+
+ // We don't want to autoactivate if the only proposal exactly matches
+ // what is in the combo. This prevents the popup from
+ // opening when the user is merely scrolling through the combo values or
+ // has accepted a combo value.
+ if (matches.size() == 1 && matches.get(0).equals(providerURI.getText())) {
+ return new IContentProposal[0];
+ }
+
+ if (matches.isEmpty()) {
+ return new IContentProposal[0];
+ }
+
+ // Make the proposals
+ IContentProposal[] proposals = new IContentProposal[matches.size()];
+ for (int i = 0; i < matches.size(); i++) {
+ final String proposal = matches.get(i);
+ proposals[i] = new IContentProposal() {
+
+ @Override
+ public String getContent() {
+ return proposal;
+ }
+
+ @Override
+ public int getCursorPosition() {
+ return proposal.length();
+ }
+
+ @Override
+ public String getDescription() {
+ return null;
+ }
+
+ @Override
+ public String getLabel() {
+ return null;
+ }
+ };
+ }
+ return proposals;
+ }
+ };
+ }
public boolean isAdmin() {
return isAdmin;
//there's a valid selection
//so go ahead and remove whatever's selected.
int index = list.getSelectionIndex();
- list.remove(index);
+ try{
+ String item = list.getItem(index);
+ if (item.equals(serverSidePreference)) {
+ return;
+ }
+ list.remove(index);
- int size = list.getItemCount();
- if (size == 0) { //Nothing's left, disable removing.
- removeButton.setEnabled(false);
+ int size = list.getItemCount();
- } else { //Select an index.
- if (index == size) {
- //removed item in last position
- index--;
- }
+ if (size == 0) { //Nothing's left, disable removing.
+ removeButton.setEnabled(false);
+
+ } else { //Select an index.
+ if (index == size) {
+ //removed item in last position
+ index--;
+ }
- list.setSelection(index-1);
- preferencePage.setApply(true);
+ list.setSelection(index-1);
+ preferencePage.setApply(true);
+ }
+ }catch(IllegalArgumentException iae){
+ //nothing was selected
+ return;
}
+
}
/**
* {@inheritDoc}
//User didn't type in a unique name...
if (name.equals("") || alreadyInList(name) || !StringUtils.isBlank(labelException.getText())) { //$NON-NLS-1$
Toolkit.getDefaultToolkit().beep();
- providerURI.selectAll();
+ //providerURI.selectAll();
return;
}
String allProviderString = null;
boolean first = true;
for (String item: list.getItems()){
- if (item.equals(noProvider)){
+ if (item.equals(noProvider) || item.equals(serverSidePreference)){
//do nothing
- }else if (first || allProviderString == null || allProviderString == ""){ //$NON-NLS-1$
+ }else if (first || StringUtils.isBlank(allProviderString)){ //$NON-NLS-1$
allProviderString = item.trim();
first = false;
}else {