Java tutorial
/* * 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.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.IStructuredSelection; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; 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.IWorkbench; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import com.bdaum.zoom.ai.internal.AiActivator; import com.bdaum.zoom.ai.internal.HelpContextIds; import com.bdaum.zoom.css.CSSProperties; import com.bdaum.zoom.css.internal.CssActivator; import com.bdaum.zoom.ui.internal.UiUtilities; 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.widgets.CGroup; import com.bdaum.zoom.ui.widgets.CLink; @SuppressWarnings("restriction") public class AiPreferencePage extends AbstractPreferencePage implements ModifyListener { public static final String ID = "com.bdaum.zoom.ai.aiPrefPage"; //$NON-NLS-1$ private CheckboxButton enableButton; private Text keyField; private Label statusField; private Timer timer; private ComboViewer languageViewer; private boolean enabled; public AiPreferencePage() { setDescription(Messages.AiPreferencePage_configure); } @Override public void init(IWorkbench aWorkbench) { this.workbench = aWorkbench; setPreferenceStore(AiActivator.getDefault().getPreferenceStore()); } @SuppressWarnings("unused") @Override protected void createPageContents(Composite composite) { setHelp(HelpContextIds.PREFERENCE_PAGE); enableButton = WidgetFactory.createCheckButton(composite, Messages.AiPreferencePage_enable, null); enableButton.addListener(new Listener() { @Override public void handleEvent(Event event) { setEnabled(enableButton.getSelection()); updateFields(); } }); // Tab folder createTabFolder(composite, "Services"); //$NON-NLS-1$ createExtensions(tabFolder, "com.bdaum.zoom.ai.aiPrefPage"); //$NON-NLS-1$ String label = getPreferenceStore().getString(PreferenceConstants.ACTIVEPROVIDER); boolean tabinit = false; if (label != null) { int i = 0; for (CTabItem item : tabFolder.getItems()) { if (label.equals(item.getText().trim())) { tabFolder.setSelection(i); tabinit = true; break; } ++i; } } new Label(composite, SWT.NONE); // Translator CGroup eGroup = UiUtilities.createGroup(composite, 3, Messages.AiPreferencePage_0); new Label(eGroup, SWT.NONE).setText(Messages.AiPreferencePage_key1_or_key2); keyField = new Text(eGroup, SWT.SINGLE | SWT.LEAD | SWT.BORDER); keyField.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1)); keyField.addModifyListener(this); new Label(eGroup, SWT.NONE).setText(Messages.AiPreferencePage_status); statusField = new Label(eGroup, SWT.WRAP); statusField.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1)); new Label(eGroup, SWT.NONE).setText(Messages.AiPreferencePage_translate_to); languageViewer = new ComboViewer(eGroup, SWT.READ_ONLY); GridData data = new GridData(SWT.BEGINNING, SWT.CENTER, false, false); data.widthHint = 120; languageViewer.getCombo().setLayoutData(data); languageViewer.setContentProvider(ArrayContentProvider.getInstance()); languageViewer.setLabelProvider(new LabelProvider() { @Override public String getText(Object element) { if (element instanceof Locale) return ((Locale) element).getDisplayLanguage(); return super.getText(element); } }); languageViewer.getCombo().setVisibleItemCount(20); CLink link = new CLink(eGroup, SWT.NONE); link.setLayoutData(new GridData(SWT.END, SWT.CENTER, true, false)); link.setText(Messages.AiPreferencePage_visit_account); link.addListener(new Listener() { @Override public void handleEvent(Event event) { String url = System.getProperty("com.bdaum.zoom.msTranslation"); //$NON-NLS-1$ try { PlatformUI.getWorkbench().getBrowserSupport().getExternalBrowser().openURL(new URL(url)); } catch (PartInitException e1) { // do nothing } catch (MalformedURLException e1) { // should never happen } } }); if (!tabinit) initTabFolder(0); fillValues(); setEnabled(enableButton.getSelection()); updateButtons(); } protected void updateFields() { keyField.setEnabled(enabled); languageViewer.getCombo().setEnabled(enabled && languageViewer.getCombo().getItemCount() > 1); } @Override protected void setEnabled(boolean b) { if (b && !enabled) checkCredentials(); super.setEnabled(b); enabled = b; } @Override protected void doFillValues() { IPreferenceStore preferenceStore = getPreferenceStore(); enableButton.setSelection(preferenceStore.getBoolean(PreferenceConstants.ENABLE)); keyField.setText(preferenceStore.getString(PreferenceConstants.TRANSLATORKEY)); } @Override protected void doPerformDefaults() { IPreferenceStore preferenceStore = getPreferenceStore(); preferenceStore.setValue(PreferenceConstants.ENABLE, preferenceStore.getDefaultBoolean(PreferenceConstants.ENABLE)); } @Override protected void doPerformOk() { disposeTimer(); IPreferenceStore preferenceStore = getPreferenceStore(); boolean enabled = enableButton.getSelection(); preferenceStore.setValue(PreferenceConstants.ENABLE, enabled); if (enabled) { preferenceStore.setValue(PreferenceConstants.TRANSLATORKEY, keyField.getText()); String selectedLanguage = getSelectedLanguage(); if (selectedLanguage != null) preferenceStore.setValue(PreferenceConstants.LANGUAGE, selectedLanguage); } CTabItem tabItem = tabFolder.getSelection(); if (tabItem != null) preferenceStore.setValue(PreferenceConstants.ACTIVEPROVIDER, tabItem.getText().trim()); } private String getSelectedLanguage() { Object element = languageViewer.getStructuredSelection().getFirstElement(); return element == null ? null : ((Locale) element).getLanguage(); } @Override protected void doPerformCancel() { disposeTimer(); } @Override public void modifyText(ModifyEvent e) { if (enabled) checkCredentials(); } private void checkCredentials() { String key = keyField.getText().trim(); if (key.isEmpty()) { showStatus(Messages.AiPreferencePage_no_app_key, true); updateButtons(); } else { showStatus("", false); //$NON-NLS-1$ AiActivator.getDefault().getClient().setKey(key); verifyAccountCredentials(500); } } protected void verifyAccountCredentials(int time) { disposeTimer(); timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { boolean error; String msg; AiActivator activator = AiActivator.getDefault(); String accessToken = activator.getClient().getAccessToken(); Locale[] languages = activator.getClient().getLanguages(); if (accessToken != null) { msg = Messages.AiPreferencePage_verified; activator.disposeClient(); error = false; } else { msg = Messages.AiPreferencePage_login_faild; error = true; } if (!statusField.isDisposed()) statusField.getDisplay().asyncExec(new Runnable() { @Override public void run() { if (!statusField.isDisposed()) { showStatus(msg, error); String selectedLanguage = getSelectedLanguage(); languageViewer.setInput(languages); if (selectedLanguage == null) selectedLanguage = AiActivator.getDefault().getPreferenceStore() .getString(PreferenceConstants.LANGUAGE); if (selectedLanguage != null) languageViewer.setSelection( new StructuredSelection(Locale.forLanguageTag(selectedLanguage))); else languageViewer.setSelection(new StructuredSelection(Locale.ENGLISH)); updateFields(); updateButtons(); } } }); } }, time); } private void showStatus(String msg, boolean error) { statusField.setText(msg); statusField.setData(CSSProperties.ID, error ? CSSProperties.ERRORS : null); CssActivator.getDefault().setColors(statusField); } private void disposeTimer() { if (timer != null) { timer.cancel(); timer = null; } } public boolean isEnabled() { return enabled; } public boolean canTranslate() { return enabled && statusField.getData(CSSProperties.ID) == null; } }