com.bdaum.zoom.ai.clarifai.internal.preference.PagePart.java Source code

Java tutorial

Introduction

Here is the source code for com.bdaum.zoom.ai.clarifai.internal.preference.PagePart.java

Source

/*
 * This file is part of the ZoRa project: http://www.photozora.org.
 *
 * ZoRa is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * ZoRa is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with ZoRa; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * (c) 2016 Berthold Daum  
 */
package com.bdaum.zoom.ai.clarifai.internal.preference;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.Locale;
import java.util.Timer;
import java.util.TimerTask;

import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;

import com.bdaum.zoom.ai.clarifai.internal.ClarifaiActivator;
import com.bdaum.zoom.ai.internal.preference.AiPreferencePage;
import com.bdaum.zoom.core.internal.CoreActivator;
import com.bdaum.zoom.core.internal.Theme;
import com.bdaum.zoom.ui.internal.UiUtilities;
import com.bdaum.zoom.ui.internal.ZViewerComparator;
import com.bdaum.zoom.ui.internal.widgets.CheckboxButton;
import com.bdaum.zoom.ui.internal.widgets.WidgetFactory;
import com.bdaum.zoom.ui.preferences.AbstractPreferencePage;
import com.bdaum.zoom.ui.preferences.AbstractPreferencePagePart;
import com.bdaum.zoom.ui.widgets.CGroup;
import com.bdaum.zoom.ui.widgets.CLink;
import com.bdaum.zoom.ui.widgets.NumericControl;

import clarifai2.api.ClarifaiClient;

@SuppressWarnings("restriction")
public class PagePart extends AbstractPreferencePagePart implements ModifyListener {

    private Text clientIdField;
    private Text clientSecretField;
    private NumericControl conceptField;
    private NumericControl confidenceField;
    private ComboViewer modelCombo;
    private Timer timer;
    private AiPreferencePage parentPage;
    private CheckboxButton adultButton;
    private CheckboxButton translateButton;
    private NumericControl aboveField;
    private CheckboxButton knownButton;
    private CheckboxButton faceButton;
    private ComboViewer languageCombo;
    private CheckboxButton celebrityButton;
    private String currentLanguage = "en"; //$NON-NLS-1$
    private boolean updating;

    @SuppressWarnings("unused")
    @Override
    public Control createPageContents(Composite parent, AbstractPreferencePage parentPage) {
        this.parentPage = (AiPreferencePage) parentPage;
        Composite composite = new Composite(parent, SWT.NONE);
        composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        composite.setLayout(new GridLayout(1, false));
        ((GridLayout) composite.getLayout()).verticalSpacing = 0;
        new Label(composite, SWT.NONE).setText(Messages.PagePart_manage_clarifai_account);
        new Label(composite, SWT.NONE);
        CGroup eGroup = UiUtilities.createGroup(composite, 2, Messages.PagePart_credentials);
        new Label(eGroup, SWT.NONE).setText(Messages.PagePart_client_id);
        clientIdField = new Text(eGroup, SWT.SINGLE | SWT.LEAD | SWT.BORDER);
        clientIdField.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
        new Label(eGroup, SWT.NONE).setText(Messages.PagePart_secret);
        clientSecretField = new Text(eGroup, SWT.SINGLE | SWT.LEAD | SWT.BORDER);
        clientSecretField.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
        clientIdField.addModifyListener(this);
        clientSecretField.addModifyListener(this);
        new Label(eGroup, SWT.NONE).setText(Messages.PagePart_access_token);
        statusField = new Label(eGroup, SWT.NONE);
        statusField.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
        CLink link = new CLink(eGroup, SWT.NONE);
        link.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
        link.setText(Messages.PagePart_visit_account_page);
        link.addListener(new Listener() {
            @Override
            public void handleEvent(Event event) {
                String vlcDownload = System.getProperty("com.bdaum.zoom.clarifai"); //$NON-NLS-1$
                try {
                    PlatformUI.getWorkbench().getBrowserSupport().getExternalBrowser()
                            .openURL(new URL(vlcDownload));
                } catch (PartInitException e1) {
                    // do nothing
                } catch (MalformedURLException e1) {
                    // should never happen
                }
            }
        });
        CGroup tGroup = CGroup.create(composite, 1, Messages.PagePart_limits);
        new Label(tGroup, SWT.NONE).setText(Messages.PagePart_model);
        modelCombo = new ComboViewer(tGroup, SWT.READ_ONLY);
        modelCombo.getControl().setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
        modelCombo.setContentProvider(ArrayContentProvider.getInstance());
        modelCombo.setLabelProvider(new LabelProvider());
        modelCombo.setComparator(ZViewerComparator.INSTANCE);
        modelCombo.setInput(CoreActivator.getDefault().getThemes().values());
        ISelectionChangedListener listener = new ISelectionChangedListener() {
            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                if (!updating)
                    updateButtons();
            }
        };
        modelCombo.addSelectionChangedListener(listener);
        new Label(tGroup, SWT.NONE).setText(Messages.PagePart_language);
        languageCombo = new ComboViewer(tGroup, SWT.READ_ONLY);
        languageCombo.getControl().setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
        languageCombo.setContentProvider(ArrayContentProvider.getInstance());
        languageCombo.setLabelProvider(new LabelProvider() {
            @Override
            public String getText(Object element) {
                if (element instanceof String) {
                    Locale loc = new Locale((String) element);
                    return loc.getDisplayLanguage(loc);
                }
                return super.getText(element);
            }
        });
        languageCombo.addSelectionChangedListener(listener);
        languageCombo.setInput(ClarifaiActivator.LANGUAGES);
        new Label(tGroup, SWT.NONE).setText(Messages.PagePart_max_concepts);
        conceptField = new NumericControl(tGroup, SWT.BORDER);
        conceptField.setLayoutData(new GridData(SWT.END, SWT.CENTER, true, false));
        conceptField.setMaximum(20);
        conceptField.setMinimum(1);
        new Label(tGroup, SWT.NONE).setText(Messages.PagePart_min_confidence);
        confidenceField = new NumericControl(tGroup, SWT.BORDER);
        confidenceField.setLayoutData(new GridData(SWT.END, SWT.CENTER, true, false));
        confidenceField.setMaximum(99);
        confidenceField.setMinimum(0);
        new Label(tGroup, SWT.NONE).setText(Messages.PagePart_mark_above);
        aboveField = new NumericControl(tGroup, SWT.BORDER);
        aboveField.setLayoutData(new GridData(SWT.END, SWT.CENTER, true, false));
        aboveField.setMaximum(100);
        aboveField.setMinimum(0);
        knownButton = WidgetFactory.createCheckButton(tGroup, Messages.PagePart_mark_known,
                new GridData(SWT.END, SWT.CENTER, false, false, 2, 1), Messages.PagePart_mark_known_tooltip);
        Composite buttonArea1 = new Composite(tGroup, SWT.NONE);
        buttonArea1.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));
        buttonArea1.setLayout(new GridLayout(3, false));
        adultButton = WidgetFactory.createCheckButton(buttonArea1, Messages.PagePart_check_adult,
                new GridData(SWT.BEGINNING, SWT.CENTER, false, false), Messages.PagePart_porno);
        faceButton = WidgetFactory.createCheckButton(buttonArea1, Messages.PagePart_detect_faces, null,
                Messages.PagePart_detect_faces_tooltip);
        celebrityButton = WidgetFactory.createCheckButton(buttonArea1, Messages.PagePart_detect_celebrities, null,
                Messages.PagePart_detect_celebrities_tooltip);
        Label sep = new Label(tGroup, SWT.SEPARATOR | SWT.HORIZONTAL);
        sep.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
        translateButton = WidgetFactory.createCheckButton(tGroup, Messages.PagePart_translate,
                new GridData(SWT.BEGINNING, SWT.CENTER, false, false, 2, 1), Messages.PagePart_translate_tooltip);
        return composite;
    }

    protected void verifyAccountCredenials(int time) {
        disposeResources();
        timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                String msg;
                boolean error;
                ClarifaiClient client = ClarifaiActivator.getDefault().getClient();
                if (client != null) {
                    error = !client.hasValidToken();
                    msg = error ? Messages.PagePart_access_failed : Messages.PagePart_verified;
                } else {
                    msg = Messages.PagePart_check_credentials;
                    error = true;
                }
                if (!statusField.isDisposed())
                    statusField.getDisplay().asyncExec(new Runnable() {
                        @Override
                        public void run() {
                            if (!statusField.isDisposed())
                                showStatus(msg, error);
                        }
                    });
            }
        }, time);
    }

    private void disposeResources() {
        if (timer != null) {
            timer.cancel();
            timer = null;
        }
        // ClarifaiActivator.getDefault().disposeClient();
    }

    @Override
    public void fillValues() {
        clientIdField.removeModifyListener(this);
        clientSecretField.removeModifyListener(this);
        IPreferenceStore preferenceStore = getPreferenceStore();
        clientIdField.setText(preferenceStore.getString(PreferenceConstants.CLIENTID));
        clientSecretField.setText(preferenceStore.getString(PreferenceConstants.CLIENTSECRET));
        conceptField.setSelection(preferenceStore.getInt(PreferenceConstants.MAXCONCEPTS));
        confidenceField.setSelection(preferenceStore.getInt(PreferenceConstants.MINCONFIDENCE));
        aboveField.setSelection(preferenceStore.getInt(PreferenceConstants.MARKABOVE));
        knownButton.setSelection(preferenceStore.getBoolean(PreferenceConstants.MARKKNOWNONLY));
        adultButton.setSelection(preferenceStore.getBoolean(PreferenceConstants.ADULTCONTENTS));
        faceButton.setSelection(preferenceStore.getBoolean(PreferenceConstants.FACES));
        celebrityButton.setSelection(preferenceStore.getBoolean(PreferenceConstants.CELEBRITIES));
        translateButton.setSelection(preferenceStore.getBoolean(PreferenceConstants.TRANSLATE));
        ClarifaiActivator activator = ClarifaiActivator.getDefault();
        activator.setAccountCredentials(clientIdField.getText().trim(), clientSecretField.getText().trim());
        verifyAccountCredenials(100);
        modelCombo.setSelection(new StructuredSelection(ClarifaiActivator.getDefault().getTheme()));
        currentLanguage = preferenceStore.getString(PreferenceConstants.LANGUAGE);
        languageCombo.setSelection(new StructuredSelection(currentLanguage));
        clientIdField.addModifyListener(this);
        clientSecretField.addModifyListener(this);
    }

    @Override
    public void setEnabled(boolean enabled) {
        boolean wasEnabled = enabled;
        super.setEnabled(enabled);
        clientIdField.setEnabled(enabled);
        clientSecretField.setEnabled(enabled);
        conceptField.setEnabled(enabled);
        confidenceField.setEnabled(enabled);
        aboveField.setEnabled(enabled);
        modelCombo.getCombo().setEnabled(enabled);
        languageCombo.getCombo().setEnabled(enabled);
        knownButton.setEnabled(enabled);
        adultButton.setEnabled(enabled);
        faceButton.setEnabled(enabled);
        celebrityButton.setEnabled(enabled);
        translateButton.setEnabled(enabled);
        if (enabled && !wasEnabled) {
            validate();
            checkCredentials(parentPage);
        }
    }

    @Override
    public void performOk() {
        disposeResources();
        IPreferenceStore preferenceStore = getPreferenceStore();
        preferenceStore.setValue(PreferenceConstants.CLIENTID, clientIdField.getText());
        preferenceStore.setValue(PreferenceConstants.CLIENTSECRET, clientSecretField.getText());
        preferenceStore.setValue(PreferenceConstants.MAXCONCEPTS, conceptField.getSelection());
        preferenceStore.setValue(PreferenceConstants.MINCONFIDENCE, confidenceField.getSelection());
        preferenceStore.setValue(PreferenceConstants.MARKABOVE, aboveField.getSelection());
        preferenceStore.setValue(PreferenceConstants.MARKKNOWNONLY, knownButton.getSelection());
        preferenceStore.setValue(PreferenceConstants.ADULTCONTENTS, adultButton.getSelection());
        preferenceStore.setValue(PreferenceConstants.FACES, faceButton.getSelection());
        preferenceStore.setValue(PreferenceConstants.CELEBRITIES, celebrityButton.getSelection());
        preferenceStore.setValue(PreferenceConstants.TRANSLATE,
                translateButton.isEnabled() && translateButton.getSelection());
        Theme theme = (Theme) modelCombo.getStructuredSelection().getFirstElement();
        if (theme != null)
            preferenceStore.setValue(PreferenceConstants.THEME, theme.getId());
        String lang = null;
        if (languageCombo.getControl().isEnabled())
            lang = (String) languageCombo.getStructuredSelection().getFirstElement();
        preferenceStore.setValue(PreferenceConstants.LANGUAGE, lang != null ? lang : "en"); //$NON-NLS-1$
    }

    @Override
    public void performDefaults() {
        IPreferenceStore preferenceStore = getPreferenceStore();
        preferenceStore.setValue(PreferenceConstants.MAXCONCEPTS,
                preferenceStore.getDefaultInt(PreferenceConstants.MAXCONCEPTS));
        preferenceStore.setValue(PreferenceConstants.MINCONFIDENCE,
                preferenceStore.getDefaultInt(PreferenceConstants.MINCONFIDENCE));
        preferenceStore.setValue(PreferenceConstants.MARKABOVE,
                preferenceStore.getDefaultInt(PreferenceConstants.MARKABOVE));
        preferenceStore.setValue(PreferenceConstants.MARKKNOWNONLY,
                preferenceStore.getDefaultBoolean(PreferenceConstants.MARKKNOWNONLY));
        preferenceStore.setValue(PreferenceConstants.ADULTCONTENTS,
                preferenceStore.getDefaultBoolean(PreferenceConstants.ADULTCONTENTS));
        preferenceStore.setValue(PreferenceConstants.FACES,
                preferenceStore.getDefaultBoolean(PreferenceConstants.FACES));
        preferenceStore.setValue(PreferenceConstants.CELEBRITIES,
                preferenceStore.getDefaultBoolean(PreferenceConstants.CELEBRITIES));
        preferenceStore.setValue(PreferenceConstants.TRANSLATE,
                preferenceStore.getDefaultBoolean(PreferenceConstants.TRANSLATE));
        preferenceStore.setValue(PreferenceConstants.THEME,
                preferenceStore.getDefaultString(PreferenceConstants.THEME));
        preferenceStore.setValue(PreferenceConstants.LANGUAGE,
                preferenceStore.getDefaultString(PreferenceConstants.LANGUAGE));
        fillValues();
    }

    private static IPreferenceStore getPreferenceStore() {
        return ClarifaiActivator.getDefault().getPreferenceStore();
    }

    @Override
    public String getLabel() {
        return "&Clarifai"; //$NON-NLS-1$
    }

    @Override
    public void performCancel() {
        disposeResources();
    }

    @Override
    public String validate() {
        if (parentPage.isEnabled()) {
            if (clientIdField.getText().isEmpty() || clientSecretField.getText().isEmpty())
                return Messages.PagePart_both_must_be_set;
        }
        return super.validate();
    }

    protected void checkCredentials(AbstractPreferencePage parentPage) {
        parentPage.validate();
        if (validate() == null) {
            ClarifaiActivator.getDefault().setAccountCredentials(clientIdField.getText().trim(),
                    clientSecretField.getText().trim());
            verifyAccountCredenials(500);
        }
    }

    @Override
    public void modifyText(ModifyEvent e) {
        if (enabled)
            checkCredentials(parentPage);
    }

    @Override
    public void updateButtons() {
        updating = true;
        try {
            if (languageCombo.getControl().isEnabled()) {
                String lang = (String) languageCombo.getStructuredSelection().getFirstElement();
                if (lang != null)
                    currentLanguage = lang;
            }
            Theme theme = (Theme) modelCombo.getStructuredSelection().getFirstElement();
            boolean multilingual = true;
            boolean maytranslate = true;
            if (theme != null)
                multilingual = ClarifaiActivator.getDefault().isMultilingual(theme.getId());
            if (multilingual) {
                if (!languageCombo.getControl().isEnabled()) {
                    languageCombo.getControl().setEnabled(true);
                    languageCombo.setSelection(new StructuredSelection(currentLanguage));
                }
                String lang = (String) languageCombo.getStructuredSelection().getFirstElement();
                maytranslate = (lang == null || "en".equals(lang)); //$NON-NLS-1$
            } else if (languageCombo.getControl().isEnabled()) {
                languageCombo.setSelection(new StructuredSelection("en")); //$NON-NLS-1$
                languageCombo.getControl().setEnabled(false);
            }
            translateButton.setEnabled(enabled && maytranslate && parentPage.canTranslate());
        } finally {
            updating = false;
        }
    }

}