com.aptana.ide.intro.IntroStartup.java Source code

Java tutorial

Introduction

Here is the source code for com.aptana.ide.intro.IntroStartup.java

Source

/**
 * Copyright (c) 2005-2010 Aptana, Inc.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html. If redistributing this code,
 * this entire header must remain intact.
 */
package com.aptana.ide.intro;

import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.MessageDialogWithToggle;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.progress.UIJob;

import com.aptana.ide.core.IdeLog;
import com.aptana.ide.core.MutexJobRule;
import com.aptana.ide.core.ui.BaseTimingStartup;
import com.aptana.ide.core.ui.CoreUIUtils;
import com.aptana.ide.core.ui.DialogUtils;
import com.aptana.ide.intro.preferences.FeatureDescriptor;
import com.aptana.ide.intro.preferences.FeatureRegistry;
import com.aptana.ide.intro.preferences.IPreferenceConstants;
import com.aptana.ide.server.portal.PortalPlugin;
import com.aptana.ide.update.FeatureUtil;
import com.aptana.ide.update.manager.IPlugin;

/**
 * @author Kevin Sawicki (ksawicki@aptana.com)
 */
public class IntroStartup extends BaseTimingStartup {

    /**
     * IGNORE
     */
    public static final String IGNORE = "ignore.initial.my.aptana"; //$NON-NLS-1$

    @Override
    public String getStartupName() {
        return Messages.IntroStartup_Name;
    }

    /**
     * @see org.eclipse.ui.IStartup#earlyStartup()
     */
    public void startup() {
        showMyAptana();
        installFeatures();
        startupDone();
    }

    /**
     * Show the My Aptana start page.
     */
    protected void showMyAptana() {
        IPreferenceStore store = IntroPlugin.getDefault().getPreferenceStore();

        boolean shownPreviously = store.getBoolean(IPreferenceConstants.SHOWN_PREVIOUSLY)
                || "true".equals(System.getProperty(IGNORE)); //$NON-NLS-1$
        if (!shownPreviously) {
            store.setValue(IPreferenceConstants.SHOWN_PREVIOUSLY, true);
            showStartupPage();
            return;
        }

        String showStartPage = store.getString(IPreferenceConstants.SHOW_STARTPAGE_ON_STARTUP);
        boolean portalPreviouslyOpened = PortalPlugin.getDefault().getPreferenceStore().getBoolean(
                com.aptana.ide.server.portal.preferences.IPreferenceConstants.MY_APTANA_PREVIOUSLY_OPENED);
        if (showStartPage.equals(IPreferenceConstants.ALWAYS_SHOW) || portalPreviouslyOpened) {
            showStartupPage();
            return;
        }
        if (showStartPage.equals(IPreferenceConstants.NEVER_SHOW)) {
            return;
        }
        // this has a side effect of updating the feature change list store
        boolean changed = FeatureChangeManager.getManager().areFeaturesChanged();
        if (changed) {
            IdeLog.logInfo(IntroPlugin.getDefault(), "Features Changed"); //$NON-NLS-1$
            List<FeatureChange> changeList = FeatureChangeManager.getManager().getFeatureChangeList();
            if (changeList != null && changeList.size() > 0) {
                showStartupPage();
            }
        } else {
            IdeLog.logInfo(IntroPlugin.getDefault(), "Unchanged feature store"); //$NON-NLS-1$
        }
    }

    private void showStartupPage() {
        UIJob job = new UIJob("Showing Startup Page") { //$NON-NLS-1$

            public IStatus runInUIThread(IProgressMonitor monitor) {
                IWorkbenchPart activePart = null;
                IWorkbenchPage page = null;
                IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
                if (window != null) {
                    page = window.getActivePage();
                    activePart = page.getActivePart();
                }
                IPreferenceStore prefs = IntroPlugin.getDefault().getPreferenceStore();
                String editorId = prefs.getString(IPreferenceConstants.INTRO_EDITOR_ID);
                IEditorPart editorPart = CoreUIUtils.openEditor(editorId, false);
                if (editorPart == null) {
                    // falls back to the default
                    editorId = prefs.getDefaultString(IPreferenceConstants.INTRO_EDITOR_ID);
                    prefs.setValue(IPreferenceConstants.INTRO_EDITOR_ID, editorId);
                    CoreUIUtils.openEditor(editorId, false);
                }
                // makes the active part re-grab the focus
                if (activePart != null) {
                    page.activate(activePart);
                }
                return Status.OK_STATUS;
            }

        };
        job.schedule(1000);
    }

    /**
     * Install any missing features
     */
    protected void installFeatures() {
        final IPreferenceStore store = IntroPlugin.getDefault().getPreferenceStore();
        boolean check = store.getBoolean(IPreferenceConstants.INSTALL_PRO_AND_REQUIRED_FEATURES);
        if (!check) {
            return;
        }

        List<FeatureDescriptor> features = new ArrayList<FeatureDescriptor>();
        List<IPlugin> installedFeatures = FeatureUtil.getInstalledFeatures();
        String[] installedFeatureIds = new String[installedFeatures.size()];
        int index = 0;
        for (IPlugin feature : installedFeatures) {
            installedFeatureIds[index++] = feature.getId();
        }

        // Using the list of installed and ignored features, filter out
        // possible install items that were previously ignored, or would
        // conflict with currently installed items.
        String[] ignored = store.getString(IPreferenceConstants.IGNORE_INSTALL_FEATURES).split(","); //$NON-NLS-1$
        final List<FeatureDescriptor> featuresToInstall = new ArrayList<FeatureDescriptor>();
        for (Iterator<FeatureDescriptor> iterator = features.iterator(); iterator.hasNext();) {
            FeatureDescriptor featureDescriptor = iterator.next();
            if (!FeatureRegistry.isFeatureIgnored(featureDescriptor.getId(), ignored)
                    && !FeatureRegistry.doesFeatureConflict(featureDescriptor, installedFeatureIds)) {
                featuresToInstall.add(featureDescriptor);
            }
        }

        // Don't show dialog if user has previously opted not to see if
        // again
        if (featuresToInstall.size() > 0 && !store.getString(IPreferenceConstants.HIDE_DIALOG_INSTALL_PROMPT)
                .equals(MessageDialogWithToggle.NEVER)) {
            String tmp_str = ""; //$NON-NLS-1$
            for (FeatureDescriptor featureDesc : featuresToInstall) {
                tmp_str += "\n\t" + featureDesc.getName(); //$NON-NLS-1$
            }
            final String str_features = tmp_str;
            UIJob job = new UIJob(Messages.IntroStartup_Job_InstallFeatures) {
                public IStatus runInUIThread(IProgressMonitor monitor) {
                    int returnCode = DialogUtils.openIgnoreMessageDialogConfirm(
                            Display.getCurrent().getActiveShell(), Messages.IntroStartup_InstallTitle,
                            MessageFormat.format(Messages.IntroStartup_InstallMessage, str_features), store,
                            IPreferenceConstants.HIDE_DIALOG_INSTALL_PROMPT);

                    if (returnCode == MessageDialog.CANCEL) {
                        return Status.OK_STATUS;
                    }
                    new FeatureInstallJob(featuresToInstall).schedule(0);
                    return Status.OK_STATUS;
                }
            };
            job.setRule(MutexJobRule.getInstance());
            job.schedule(20000);
        }

        final List<FeatureDescriptor> featuresToUpdate = FeatureRegistry.gatherInstalledRequiredFeatures();
        if (featuresToUpdate.size() > 0) {
            final StringBuilder featureToUpdateStr = new StringBuilder();
            for (FeatureDescriptor featureDesc : featuresToUpdate) {
                featureToUpdateStr.append("\n\t" + featureDesc.getName()); //$NON-NLS-1$
            }
            UIJob job = new UIJob(Messages.IntroStartup_Job_UpdateFeatures) {
                public IStatus runInUIThread(IProgressMonitor monitor) {
                    boolean returnCode = MessageDialog.openConfirm(Display.getCurrent().getActiveShell(),
                            Messages.IntroStartup_UpdateTitle, MessageFormat
                                    .format(Messages.IntroStartup_UpdateMessage, featureToUpdateStr.toString()));
                    if (!returnCode) {
                        return Status.OK_STATUS;
                    }

                    new FeatureInstallJob(featuresToUpdate).schedule(0);
                    return Status.OK_STATUS;
                }
            };
            job.setRule(MutexJobRule.getInstance());
            job.schedule(20000);
        }
    }
}