/*******************************************************************************
* Copyright (c) 2013, 2014 Red Hat, 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
*
* Contributors:
* Red Hat Inc. - initial API and implementation and/or initial documentation
*******************************************************************************/
package org.eclipse.thym.ui.internal.preferences;
import java.util.List;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.thym.core.engine.HybridMobileEngine;
import org.eclipse.thym.core.engine.HybridMobileEngineManager;
import org.eclipse.thym.core.platform.PlatformConstants;
import org.eclipse.thym.ui.HybridUI;
import org.eclipse.thym.ui.internal.engine.AvailableCordovaEnginesSection;
import org.eclipse.thym.ui.internal.engine.AvailableCordovaEnginesSection.EngineListChangeListener;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
public class EnginePreferencesPage extends PreferencePage implements
IWorkbenchPreferencePage {
private AvailableCordovaEnginesSection engineSection;
public EnginePreferencesPage(){
super();
setDescription("Add or remove Hybrid Mobile Engines. By default, checked engine is used for the newly created Hybrid Mobile projects.");
}
@Override
public void init(IWorkbench workbench) {
}
@Override
protected Control createContents(Composite parent) {
Composite control = new Composite(parent, SWT.NONE);
GridLayoutFactory.fillDefaults().applyTo(control);
GridDataFactory.fillDefaults().grab(true, true).applyTo(control);
engineSection = new AvailableCordovaEnginesSection();
engineSection.createControl(control);
engineSection.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
setValid(validate());
}
});
engineSection.addEngineListChangeListener(new EngineListChangeListener() {
@Override
public void listChanged() {
initDefaultEngine();
}
});
noDefaultAndApplyButton();
initDefaultEngine();
setValid(validate());
return control;
}
private void initDefaultEngine() {
HybridMobileEngine[] defaultEngines = HybridMobileEngineManager.defaultEngines();
if(defaultEngines != null ){
engineSection.setSelection(new StructuredSelection(defaultEngines));
}else{
List<HybridMobileEngine> engines = engineSection.getListedEngines();
if(engines != null && engines.size() ==1){
engineSection.setSelection(new StructuredSelection(engines.get(0)));
}
}
}
private boolean validate() {
if(engineSection.getSelection().isEmpty()){
setErrorMessage("Default engine is not selected");
return false;
}
setMessage(null);
setErrorMessage(null);
return true;
}
@Override
public boolean performOk() {
IStructuredSelection sel = (IStructuredSelection) engineSection.getSelection();
if(sel.isEmpty()){
getPreferenceStore().setToDefault(PlatformConstants.PREF_DEFAULT_ENGINE);
}else{
StringBuilder prefVal = new StringBuilder();
Object[] selections = sel.toArray();
for(int i=0; i< selections.length; i++){
HybridMobileEngine engine =(HybridMobileEngine) selections[i];
prefVal.append(engine.getId());
prefVal.append(":");
if (engine.isManaged()) {
prefVal.append(engine.getVersion());
} else {
prefVal.append(engine.getLocation());
}
prefVal.append(",");
}
getPreferenceStore().setValue(PlatformConstants.PREF_DEFAULT_ENGINE, prefVal.toString());
}
return true;
}
@Override
protected IPreferenceStore doGetPreferenceStore() {
return HybridUI.getDefault().getPreferenceStore();
}
}