package com.mobilesorcery.sdk.builder.winmobilecs.launch;
import java.io.File;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.jface.util.Util;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import com.mobilesorcery.sdk.builder.winmobilecs.MSBuild;
import com.mobilesorcery.sdk.builder.winmobilecs.WinMobileCSPackager;
import com.mobilesorcery.sdk.builder.winmobilecs.WinMobileCSPlugin;
import com.mobilesorcery.sdk.builder.winmobilecs.WindowsPhoneEmulator;
import com.mobilesorcery.sdk.builder.winmobilecs.ui.dialogs.ConfigureWindowsPhoneEmulatorDialog;
import com.mobilesorcery.sdk.core.BuildVariant;
import com.mobilesorcery.sdk.core.CoreMoSyncPlugin;
import com.mobilesorcery.sdk.core.IBuildVariant;
import com.mobilesorcery.sdk.core.IPackager;
import com.mobilesorcery.sdk.core.launch.AbstractEmulatorLauncher;
import com.mobilesorcery.sdk.core.launch.IEmulatorLauncher;
public class WindowsPhoneEmulatorLauncher extends AbstractEmulatorLauncher {
public final static String SDK_ATTR = "iphone.sdk";
private static final String ID = "com.mobilesorcery.sdk.builder.winmobilecs.launcher";
public WindowsPhoneEmulatorLauncher() {
super("Windows Phone Emulator");
}
@Override
public int isLaunchable(ILaunchConfiguration launchConfiguration, String mode) {
if (!Util.isWindows()) {
return UNLAUNCHABLE;
} else if (!isCorrectPackager(launchConfiguration)) {
return IEmulatorLauncher.UNLAUNCHABLE;
} if (shouldAskUserForLauncher(launchConfiguration, mode)) {
return IEmulatorLauncher.REQUIRES_CONFIGURATION;
} else if (!isCorrectlyInstalled()) {
return IEmulatorLauncher.REQUIRES_CONFIGURATION;
} else {
return super.isLaunchable(launchConfiguration, mode);
}
}
private boolean shouldAskUserForLauncher(ILaunchConfiguration launchConfiguration, String mode) {
return isCorrectlyInstalled() && isAutoSelectLaunch(launchConfiguration, mode) && shouldAskUserForLauncher(WinMobileCSPackager.ID);
}
@Override
public void launch(ILaunchConfiguration launchConfig, String mode,
ILaunch launch, int emulatorId, IProgressMonitor monitor)
throws CoreException {
final File packageToInstall = getPackageToInstall(launchConfig, mode);
Process process = WindowsPhoneEmulator.getDefault().run(packageToInstall);
DebugPlugin.newProcess(launch, process, "Windows Phone Emulator");
}
@Override
public IBuildVariant getVariant(ILaunchConfiguration launchConfig, String mode) throws CoreException {
IBuildVariant prototype = super.getVariant(launchConfig, mode);
BuildVariant modified = new BuildVariant(prototype);
modified.setSpecifier(WinMobileCSPlugin.WP_EMULATOR_SPECIFIER, WinMobileCSPlugin.WP_EMULATOR_SPECIFIER);
return modified;
}
@Override
public IEmulatorLauncher configure(final ILaunchConfiguration config, final String mode) {
Display d = PlatformUI.getWorkbench().getDisplay();
// If we are not auto-select, don't fallback to MoRe.
final boolean isAutomaticSelection = isAutoSelectLaunch(config, mode);
// And if we are supposed to ask the user, we do not really need to configure anything.
final boolean needsConfig = !shouldAskUserForLauncher(config, mode);
final IEmulatorLauncher[] result = new IEmulatorLauncher[] { null };
d.syncExec(new Runnable() {
@Override
public void run() {
Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
result[0] = showConfigureDialog(shell, isAutomaticSelection, needsConfig);
}
});
return result[0];
}
protected IEmulatorLauncher showConfigureDialog(Shell shell, boolean isAutomaticSelection, boolean needsConfig) {
ConfigureWindowsPhoneEmulatorDialog dialog = new ConfigureWindowsPhoneEmulatorDialog(shell);
dialog.setIsAutomaticSelection(isAutomaticSelection);
dialog.setNeedsConfig(needsConfig);
dialog.open();
return dialog.getSelectedLauncher();
}
@Override
public int getLaunchType(IPackager packager) {
return Util.equals(packager.getId(), WinMobileCSPackager.ID) && Util.isWindows() ? LAUNCH_TYPE_NATIVE : LAUNCH_TYPE_NONE;
}
protected boolean isCorrectlyInstalled() {
return WindowsPhoneEmulator.getDefault().isValid() && MSBuild.getDefault().isValid();
}
}