package com.mobilesorcery.sdk.ui.internal.preferences;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.viewers.AbstractListViewer;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import com.mobilesorcery.sdk.core.CoreMoSyncPlugin;
import com.mobilesorcery.sdk.core.IPackager;
import com.mobilesorcery.sdk.core.launch.IEmulatorLauncher;
import com.mobilesorcery.sdk.ui.UIUtils;
import com.mobilesorcery.sdk.ui.UpdateListener.IUpdatableControl;
public class EmulatorLauncherPreferences extends PreferencePage implements IWorkbenchPreferencePage, IUpdatableControl {
public final static Object ASK_ME = new Object();
class LauncherLabelProvider extends LabelProvider {
@Override
public String getText(Object element) {
if (ASK_ME == element) {
return "Ask every time";
} else if (element instanceof IEmulatorLauncher) {
IEmulatorLauncher launcher = (IEmulatorLauncher) element;
return launcher.getName();
}
return element.toString();
}
}
class PlatformLauncherUI extends Composite {
private final Label name;
private final ComboViewer preferredLauncher;
private IPackager packager;
public PlatformLauncherUI(Composite parent, int style) {
super(parent, style);
setLayout(UIUtils.newPrefsLayout(2));
name = new Label(this, SWT.NONE);
name.setLayoutData(new GridData(UIUtils.getDefaultFieldSize(), SWT.DEFAULT));
preferredLauncher = new ComboViewer(this);
preferredLauncher.setContentProvider(new ArrayContentProvider());
preferredLauncher.setLabelProvider(new LauncherLabelProvider());
preferredLauncher.getControl().setLayoutData(new GridData(UIUtils.getDefaultFieldSize(), SWT.DEFAULT));
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public void setPackager(IPackager packager) {
this.packager = packager;
String platform = packager.getPlatform();
String packagerId = packager.getId();
name.setText(platform);
ArrayList launchers = new ArrayList();
launchers.add(ASK_ME);
launchers.addAll(getAvailableLaunchers(packager));
preferredLauncher.setInput(launchers.toArray());
IEmulatorLauncher preferred = CoreMoSyncPlugin.getDefault().getPreferredLauncher(packagerId);
StructuredSelection selection = new StructuredSelection(preferred == null ? ASK_ME : preferred);
preferredLauncher.setSelection(selection);
}
public IPackager getPackager() {
return packager;
}
public IEmulatorLauncher getPreferredLauncher() {
IStructuredSelection selection = (IStructuredSelection) preferredLauncher.getSelection();
Object selectedElement = selection.getFirstElement();
if (selectedElement == ASK_ME) {
return null;
} else {
return (IEmulatorLauncher) selectedElement;
}
}
}
private final ArrayList<PlatformLauncherUI> platformUIs = new ArrayList<EmulatorLauncherPreferences.PlatformLauncherUI>();
@Override
public void init(IWorkbench workbench) {
}
public Collection<IEmulatorLauncher> getAvailableLaunchers(IPackager packager) {
ArrayList<IEmulatorLauncher> result = new ArrayList<IEmulatorLauncher>();
for (String launcherId : CoreMoSyncPlugin.getDefault().getEmulatorLauncherIds()) {
// TODO: FILTER!
IEmulatorLauncher launcher = CoreMoSyncPlugin.getDefault().getEmulatorLauncher(launcherId);
int launchType = launcher.getLaunchType(packager);
if (launchType >= IEmulatorLauncher.LAUNCH_TYPE_DEFAULT) {
result.add(launcher);
}
}
return result;
}
@Override
protected Control createContents(Composite parent) {
Composite main = new Composite(parent, SWT.NONE);
main.setLayout(UIUtils.newPrefsLayout(1));
Label info = new Label(main, SWT.WRAP);
info.setText("Select which emulator to use for which platform.\n" +
"Please note that this only applies to launch configurations " +
"that has automatic emulator selection enabled.");
info.setLayoutData(new GridData(2 * UIUtils.getDefaultFieldSize(), SWT.DEFAULT));
List<IPackager> packagers = CoreMoSyncPlugin.getDefault().getPackagers();
for (IPackager packager : packagers) {
if (packager.getId() != null && packager.getPlatform() != null && getAvailableLaunchers(packager).size() > 1) {
PlatformLauncherUI platformUI = new PlatformLauncherUI(main, SWT.NONE);
platformUI.setPackager(packager);
platformUIs.add(platformUI);
}
}
return main;
}
@Override
public boolean performOk() {
for (PlatformLauncherUI platformUI : platformUIs) {
IPackager packager = platformUI.getPackager();
IEmulatorLauncher launcher = platformUI.getPreferredLauncher();
CoreMoSyncPlugin.getDefault().setPreferredLauncher(packager.getId(), launcher == null ? null : launcher.getId());
}
return super.performOk();
}
@Override
public void performDefaults() {
// TBD.
}
@Override
public void updateUI() {
// TODO Auto-generated method stub
}
}