/* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.motorola.studio.android.common.preferences; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.eclipse.core.runtime.preferences.IScopeContext; import org.eclipse.core.runtime.preferences.InstanceScope; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialogWithToggle; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.plugin.AbstractUIPlugin; import org.osgi.service.prefs.BackingStoreException; import com.motorola.studio.android.common.CommonPlugin; import com.motorola.studio.android.common.utilities.i18n.UtilitiesNLS; /** * DESCRIPTION: * This class provides static methods to create toggle dialogs, storing the * user action into preference file. It allows resetting the preference to * their original status. * <br> * RESPONSIBILITY: * Provides the basic functionalities for questioning/informing user and * persisting the choice made * <br> * COLABORATORS: * none * <br> * USAGE: * - use showQuestion method to provide behavior for user choice between "yes" * and "no" option. * - use showInformation method to provide behavior for showing informational * dialog to user * - use resetAllDialogsConfiguration method to reset to initial dialog * configuration. */ public class DialogWithToggleUtils { // suffix of the preference key of the all toggle dialogs. private final static String TOGGLE_DIALOG = ".toggle.dialog"; private static IEclipsePreferences getPreferences() { IScopeContext scope = InstanceScope.INSTANCE; return scope.getNode(CommonPlugin.PLUGIN_ID); } /** * Shows a dialog with "Yes" and "No" buttons. * The dialog is opened only if it is the first time that the dialog is * shown or if the user did not check the option "Do not show this window * again" when the dialog had been opened previously. * * @param preferenceKey the key to use when persisting the user's preference. * @param title the dialog's title, or <code>null</code> if none. * @param message the dialog's message. * @return if the dialog was opened: true, if the user pressed "Yes". * if the dialog was not opened: true, if the option was set to "Always". */ public static boolean showQuestion(final String preferenceKey, final String title, final String message) { final Boolean[] reply = new Boolean[1]; final String prefKey = preferenceKey + TOGGLE_DIALOG; PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() { public void run() { AbstractUIPlugin plugin = CommonPlugin.getDefault(); IPreferenceStore store = plugin.getPreferenceStore(); String preferenceValue = store.getString(prefKey); if (MessageDialogWithToggle.PROMPT.equals(preferenceValue) || (preferenceValue.length() == 0)) { IWorkbench workbench = PlatformUI.getWorkbench(); IWorkbenchWindow ww = workbench.getActiveWorkbenchWindow(); Shell shell = ww.getShell(); MessageDialogWithToggle dialog = MessageDialogWithToggle.openYesNoQuestion(shell, title, message, UtilitiesNLS.UI_DoNotShowMEAgain, false, store, prefKey); reply[0] = (dialog.getReturnCode() == IDialogConstants.YES_ID); } else { reply[0] = preferenceValue.equals(MessageDialogWithToggle.ALWAYS); } } }); return reply[0]; } /** * Shows an information dialog to user. The dialog is opened * only if it is the first time that the dialog is shown or if the user did not checked * the option "Do not show this window again" when the dialog had been opened previously. * * @param preferenceKey the key to use when persisting the user's preference * @param title the dialog's title, or <code>null</code> if none * @param message the dialog�s message * */ public static void showInformation(final String preferenceKey, final String title, final String message) { final String prefKey = preferenceKey + TOGGLE_DIALOG; PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() { public void run() { AbstractUIPlugin plugin = CommonPlugin.getDefault(); IPreferenceStore store = plugin.getPreferenceStore(); String preferenceValue = store.getString(prefKey); if (MessageDialogWithToggle.PROMPT.equals(preferenceValue) || (preferenceValue.length() == 0)) { IWorkbench workbench = PlatformUI.getWorkbench(); IWorkbenchWindow ww = workbench.getActiveWorkbenchWindow(); Shell shell = ww.getShell(); MessageDialogWithToggle.openInformation(shell, title, message, UtilitiesNLS.UI_DoNotShowMEAgain, false, store, prefKey); } } }); } /** * Shown a warning dialog. The dialog is opened * only if it is the first time that the dialog is shown or if the user did not checked * the option "Do not show this window again" when the dialog had been opened previously. * * @param preferenceKey the key to use when persisting the user's preference * @param title the dialog's title, or <code>null</code> if none * @param message the dialog�s message * */ public static void showWarning(final String preferenceKey, final String title, final String message) { final String prefKey = preferenceKey + TOGGLE_DIALOG; PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() { public void run() { AbstractUIPlugin plugin = CommonPlugin.getDefault(); IPreferenceStore store = plugin.getPreferenceStore(); String preferenceValue = store.getString(prefKey); if (MessageDialogWithToggle.PROMPT.equals(preferenceValue) || (preferenceValue.length() == 0)) { IWorkbench workbench = PlatformUI.getWorkbench(); IWorkbenchWindow ww = workbench.getActiveWorkbenchWindow(); Shell shell = ww.getShell(); MessageDialogWithToggle.openWarning(shell, title, message, UtilitiesNLS.UI_DoNotShowMEAgain, false, store, prefKey); } } }); } /** * Show a confirmation message. * * @param preferenceKey the key to use when persisting the user's preference; * <code>null</code> if you don't want it persisted. * @param title the dialog's title, or <code>null</code> if none * @param message the dialog�s message */ public static boolean showConfirmation(final String preferenceKey, final String title, final String message) { final Boolean[] reply = new Boolean[1]; final String prefKey = preferenceKey + TOGGLE_DIALOG; PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() { public void run() { AbstractUIPlugin plugin = CommonPlugin.getDefault(); IPreferenceStore store = plugin.getPreferenceStore(); String preferenceValue = store.getString(prefKey); if (MessageDialogWithToggle.PROMPT.equals(preferenceValue) || (preferenceValue.length() == 0)) { IWorkbench workbench = PlatformUI.getWorkbench(); IWorkbenchWindow ww = workbench.getActiveWorkbenchWindow(); Shell shell = ww.getShell(); MessageDialogWithToggle dialog = MessageDialogWithToggle.openOkCancelConfirm(shell, title, message, UtilitiesNLS.UI_AlwaysProceed, false, store, prefKey); reply[0] = (dialog.getReturnCode() == IDialogConstants.OK_ID); } else { reply[0] = preferenceValue.equals(MessageDialogWithToggle.ALWAYS); } } }); return reply[0]; } /** * Shows an error dialog. The dialog is opened * only if it is the first time that the dialog is shown or if the user did not checked * the option "Do not show this window again" when the dialog had been opened previously. * * @param preferenceKey the key to use when persisting the user's preference * @param title the dialog's title, or <code>null</code> if none * @param message the dialog�s message * */ public static void showError(final String preferenceKey, final String title, final String message) { final String prefKey = preferenceKey + TOGGLE_DIALOG; PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() { public void run() { AbstractUIPlugin plugin = CommonPlugin.getDefault(); IPreferenceStore store = plugin.getPreferenceStore(); String preferenceValue = store.getString(prefKey); if (MessageDialogWithToggle.PROMPT.equals(preferenceValue) || (preferenceValue.length() == 0)) { IWorkbench workbench = PlatformUI.getWorkbench(); IWorkbenchWindow ww = workbench.getActiveWorkbenchWindow(); Shell shell = ww.getShell(); MessageDialogWithToggle.openError(shell, title, message, UtilitiesNLS.UI_DoNotShowMEAgain, false, store, prefKey); } } }); } /** * Resets all dialog configuration clearing all 'Do not show me again' * settings and showing all hidden dialogs again. */ public static void resetAllDialogsConfiguration() { IEclipsePreferences preferences = getPreferences(); String[] propertyNames; try { propertyNames = preferences.keys(); } catch (BackingStoreException e) { propertyNames = new String[0]; } for (String propertyName : propertyNames) { if (propertyName.contains(TOGGLE_DIALOG)) { preferences.put(propertyName, MessageDialogWithToggle.PROMPT); } } try { preferences.flush(); } catch (BackingStoreException e) { //do nothing } } /** * Set a preference key to a certain value * This key is used to toggle dialogs. Do not use it for general proposes * @param preferenceKey * @param value */ public static void setToggleDialogPreferenceKey(final String preferenceKey, final String value) { final String prefKey = preferenceKey + TOGGLE_DIALOG; AbstractUIPlugin plugin = CommonPlugin.getDefault(); IPreferenceStore store = plugin.getPreferenceStore(); store.setValue(prefKey, value); } /** * Get a preference toggle dialog preference key * This key is used to toggle dialogs. Do not use it for general proposes * @param preferenceKey * @return the key, or null if it is default (not set) */ public static String getToggleDialogPreferenceKey(final String preferenceKey) { final String prefKey = preferenceKey + TOGGLE_DIALOG; IPreferenceStore store = CommonPlugin.getDefault().getPreferenceStore(); String prefValue = null; if (!store.isDefault(prefKey)) { prefValue = store.getString(prefKey); } return prefValue; } }