com.motorola.studio.android.common.preferences.DialogWithToggleUtils.java Source code

Java tutorial

Introduction

Here is the source code for com.motorola.studio.android.common.preferences.DialogWithToggleUtils.java

Source

/*
* 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 dialogs 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 dialogs 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 dialogs 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 dialogs 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;
    }
}