com.liferay.ide.ui.util.UIUtil.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.ide.ui.util.UIUtil.java

Source

/*******************************************************************************
 * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library 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 Lesser General Public License for more
 * details.
 *
 *******************************************************************************/

package com.liferay.ide.ui.util;

import com.liferay.ide.ui.LiferayUIPlugin;

import java.io.IOException;
import java.net.URL;
import java.util.Collections;

import org.eclipse.core.commands.Command;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.NotEnabledException;
import org.eclipse.core.commands.NotHandledException;
import org.eclipse.core.commands.ParameterizedCommand;
import org.eclipse.core.commands.common.NotDefinedException;
import org.eclipse.core.expressions.EvaluationContext;
import org.eclipse.core.expressions.IEvaluationContext;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.MessageDialogWithToggle;
import org.eclipse.jface.preference.IPersistentPreferenceStore;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IPerspectiveDescriptor;
import org.eclipse.ui.IPerspectiveRegistry;
import org.eclipse.ui.ISources;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPreferenceConstants;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.commands.ICommandService;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.internal.ide.IDEInternalPreferences;
import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
import org.eclipse.ui.internal.navigator.NavigatorContentService;
import org.eclipse.ui.internal.util.PrefUtil;
import org.eclipse.ui.internal.wizards.newresource.ResourceMessages;
import org.eclipse.ui.navigator.CommonViewer;
import org.eclipse.ui.navigator.ICommonContentExtensionSite;
import org.osgi.framework.Bundle;

/**
 * @author Greg Amerson
 * @author Cindy Li
 * @author Simon Jiang
 */
@SuppressWarnings("restriction")
public class UIUtil {

    public static void async(Runnable runnable) {
        if (runnable != null) {
            try {
                Display.getDefault().asyncExec(runnable);
            } catch (Throwable t) {
                // ignore
            }
        }
    }

    public static void async(final Runnable runnable, final long delay) {
        final Runnable delayer = new Runnable() {
            public void run() {
                try {
                    Thread.sleep(delay);
                } catch (InterruptedException e) {
                }

                async(runnable);
            }
        };

        async(delayer);
    }

    private static boolean confirmPerspectiveSwitch(IWorkbenchWindow window, IPerspectiveDescriptor finalPersp) {
        IPreferenceStore store = IDEWorkbenchPlugin.getDefault().getPreferenceStore();

        String pspm = store.getString(IDEInternalPreferences.PROJECT_SWITCH_PERSP_MODE);

        if (!IDEInternalPreferences.PSPM_PROMPT.equals(pspm)) {
            // Return whether or not we should always switch
            return IDEInternalPreferences.PSPM_ALWAYS.equals(pspm);
        }

        String desc = finalPersp.getDescription();
        String message;

        if (desc == null || desc.length() == 0) {
            message = NLS.bind(ResourceMessages.NewProject_perspSwitchMessage, finalPersp.getLabel());
        } else {
            message = NLS.bind(ResourceMessages.NewProject_perspSwitchMessageWithDesc,
                    new String[] { finalPersp.getLabel(), desc });
        }

        MessageDialogWithToggle dialog = MessageDialogWithToggle.openYesNoQuestion(window.getShell(),
                ResourceMessages.NewProject_perspSwitchTitle, message, null, false, store,
                IDEInternalPreferences.PROJECT_SWITCH_PERSP_MODE);

        int result = dialog.getReturnCode();

        // If we are not going to prompt anymore propogate the choice.
        if (dialog.getToggleState()) {
            String preferenceValue;

            if (result == IDialogConstants.YES_ID) {
                // Doesn't matter if it is replace or new window
                // as we are going to use the open perspective setting
                preferenceValue = IWorkbenchPreferenceConstants.OPEN_PERSPECTIVE_REPLACE;
            } else {
                preferenceValue = IWorkbenchPreferenceConstants.NO_NEW_PERSPECTIVE;
            }

            // update PROJECT_OPEN_NEW_PERSPECTIVE to correspond
            PrefUtil.getAPIPreferenceStore().setValue(IDE.Preferences.PROJECT_OPEN_NEW_PERSPECTIVE,
                    preferenceValue);
        }

        return result == IDialogConstants.YES_ID;
    }

    public static void executeCommand(final String commandId, final ISelection selection)
            throws ExecutionException, NotDefinedException, NotEnabledException, NotHandledException {
        final IEvaluationContext evaluationContext = new EvaluationContext(null, Collections.EMPTY_LIST);
        evaluationContext.addVariable(ISources.ACTIVE_CURRENT_SELECTION_NAME, selection);

        final ICommandService commandService = (ICommandService) PlatformUI.getWorkbench()
                .getService(ICommandService.class);

        final Command migrate = commandService.getCommand(commandId);

        final IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench()
                .getService(IHandlerService.class);

        handlerService.executeCommandInContext(ParameterizedCommand.generateCommand(migrate, null), null,
                evaluationContext);
    }

    public static IViewPart findView(String viewId) {
        for (IWorkbenchWindow window : PlatformUI.getWorkbench().getWorkbenchWindows()) {
            for (IWorkbenchPage page : window.getPages()) {
                IViewPart view = page.findView(viewId);

                if (view != null) {
                    return view;
                }
            }
        }

        return null;
    }

    public static IWorkbenchPage getActivePage() {
        return PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
    }

    public static Shell getActiveShell() {
        final Shell[] retval = new Shell[1];

        Display.getDefault().syncExec(new Runnable() {

            public void run() {
                retval[0] = Display.getDefault().getActiveShell();
            }
        });

        return retval[0];
    }

    public static ImageDescriptor getPluginImageDescriptor(String symbolicName, String imagePath) {
        Bundle bundle = Platform.getBundle(symbolicName);

        if (bundle != null) {
            URL entry = bundle.getEntry(imagePath);

            if (entry != null) {
                return ImageDescriptor.createFromURL(entry);
            }
        }

        return null;
    }

    public static void postInfo(final String title, final String msg) {
        Display.getDefault().asyncExec(new Runnable() {

            public void run() {
                MessageDialog.openInformation(Display.getDefault().getActiveShell(), title, msg);
            }

        });
    }

    public static void postInfoWithToggle(final String title, final String msg, final String toggleMessage,
            final boolean toggleState, final IPersistentPreferenceStore store, final String key) {

        if (store == null || key == null || store.getString(key).equals(MessageDialogWithToggle.NEVER)) {
            return;
        }

        Display.getDefault().asyncExec(new Runnable() {

            public void run() {
                MessageDialogWithToggle dialog = MessageDialogWithToggle.openInformation(
                        Display.getDefault().getActiveShell(), title, msg, toggleMessage, toggleState, store, key);

                try {
                    if (dialog.getToggleState()) {
                        store.setValue(key, MessageDialogWithToggle.NEVER);
                        store.save();
                    }
                } catch (IOException e) {
                }
            }

        });
    }

    public static boolean promptQuestion(final String title, final String message) {
        final boolean[] retval = new boolean[1];

        Display.getDefault().syncExec(new Runnable() {

            public void run() {
                retval[0] = MessageDialog.openQuestion(getActiveShell(), title, message);
            }
        });

        return retval[0];
    }

    public static void refreshCommonView(final String viewId) {
        try {
            UIUtil.async(new Runnable() {
                public void run() {
                    IViewPart viewPart = showView(viewId);

                    if (viewPart != null) {
                        CommonViewer viewer = (CommonViewer) viewPart.getAdapter(CommonViewer.class);
                        viewer.refresh(true);
                    }
                }
            });
        } catch (Exception e) {
            LiferayUIPlugin.logError("Unable to refresh view " + viewId, e);
        }
    }

    public static void refreshContent(ICommonContentExtensionSite site, final Object elementOrTreePath) {
        final NavigatorContentService s = (NavigatorContentService) site.getService();

        sync(new Runnable() {
            public void run() {
                try {
                    final CommonViewer viewer = (CommonViewer) s.getViewer();
                    viewer.refresh(true);
                    viewer.setExpandedState(elementOrTreePath, true);
                } catch (Exception e) {
                }
            }
        });
    }

    private static void replaceCurrentPerspective(IPerspectiveDescriptor persp) {
        // Get the active page.
        IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();

        if (window != null) {
            IWorkbenchPage page = window.getActivePage();

            if (page != null) {
                // Set the perspective.
                page.setPerspective(persp);
            }
        }
    }

    public static IViewPart showView(String viewId) {
        try {
            return PlatformUI.getWorkbench().getWorkbenchWindows()[0].getActivePage().showView(viewId);
        } catch (PartInitException e) {
            LiferayUIPlugin.logError(e);
        }

        return null;
    }

    public static void switchToLiferayPerspective(String perspectiveId, boolean confirm) {
        // Retrieve the new project open perspective preference setting
        String perspSetting = PrefUtil.getAPIPreferenceStore()
                .getString(IDE.Preferences.PROJECT_OPEN_NEW_PERSPECTIVE);

        String promptSetting = IDEWorkbenchPlugin.getDefault().getPreferenceStore()
                .getString(IDEInternalPreferences.PROJECT_SWITCH_PERSP_MODE);

        // Return if do not switch perspective setting and are not prompting
        if (!(promptSetting.equals(MessageDialogWithToggle.PROMPT))
                && perspSetting.equals(IWorkbenchPreferenceConstants.NO_NEW_PERSPECTIVE)) {
            return;
        }

        // Map perspective id to descriptor.
        IPerspectiveRegistry reg = PlatformUI.getWorkbench().getPerspectiveRegistry();

        IPerspectiveDescriptor finalPersp = reg.findPerspectiveWithId(perspectiveId);

        IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();

        if (window != null) {
            IWorkbenchPage page = window.getActivePage();

            if (page != null) {
                IPerspectiveDescriptor currentPersp = page.getPerspective();

                // don't switch if the current perspective is the Liferay perspective
                if (finalPersp.equals(currentPersp)) {
                    return;
                }
            }

            // prompt the user to switch
            if (confirm && !confirmPerspectiveSwitch(window, finalPersp)) {
                return;
            }
        }

        // replace active perspective setting otherwise
        replaceCurrentPerspective(finalPersp);
    }

    public static void sync(Runnable runnable) {
        if (runnable != null) {
            try {
                Display.getDefault().syncExec(runnable);
            } catch (Throwable t) {
                // ignore
            }
        }
    }
}