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