/**
* Copyright (c) 2013-2016 Angelo ZERR.
* 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:
* Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation
*/
package tern.eclipse.ide.tools.internal.ui.wizards.webbrowser;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
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 tern.eclipse.ide.core.TernCorePlugin;
import tern.eclipse.ide.tools.core.webbrowser.EditorOptions;
import tern.eclipse.ide.tools.internal.ui.TernToolsUIMessages;
import tern.eclipse.ide.tools.internal.ui.wizards.TernWizardPage;
import tern.eclipse.ide.ui.controls.TernModulesBlock;
import tern.metadata.TernModuleMetadata;
import tern.repository.ITernRepository;
import tern.server.ITernDef;
import tern.server.ITernModule;
import tern.server.ITernPlugin;
import tern.utils.TernModuleHelper;
/**
* Wizard page to select tern modules (JSON type definition or Server plugins).
*
*/
public class TernModulesSelectionWizardPage extends
TernWizardPage<EditorOptions> {
private static final String PAGE = "TernModulesSelectionWizardPage";
private TernModulesBlock modulesBlock;
protected TernModulesSelectionWizardPage() {
super(PAGE);
setTitle(TernToolsUIMessages.TernModulesSelectionWizardPage_title);
setDescription(TernToolsUIMessages.TernModulesSelectionWizardPage_description);
}
@Override
protected Composite createUI(Composite parent) {
Composite container = new Composite(parent, SWT.NULL);
GridLayout layout = new GridLayout();
layout.numColumns = 1;
layout.marginHeight = 0;
layout.marginWidth = 0;
container.setLayout(layout);
IResource resource = super.getResource();
IProject project = resource != null ? resource.getProject() : null;
modulesBlock = new TernModulesBlock(project, null);
Control control = modulesBlock.createControl(container);
modulesBlock.addCheckStateListener(new ICheckStateListener() {
@Override
public void checkStateChanged(CheckStateChangedEvent arg0) {
TernModulesSelectionWizardPage.this.dialogChanged();
}
});
GridData data = new GridData(GridData.FILL_BOTH);
data.horizontalSpan = 1;
control.setLayoutData(data);
return container;
}
@Override
protected void initialize() {
modulesBlock.loadModules();
}
@Override
protected String validate() {
return null;
}
@Override
protected void updateModel(EditorOptions model) {
ITernRepository repository = TernCorePlugin.getTernRepositoryManager()
.getRepository(modulesBlock.getProject());
Collection<ITernModule> modules = modulesBlock.getCheckedModules();
List<ITernDef> defs = new ArrayList<ITernDef>();
List<ITernPlugin> plugins = new ArrayList<ITernPlugin>();
ITernModule dependencyModule = null;
TernModuleMetadata metadata = null;
Collection<String> requiredDependencies = null;
for (ITernModule module : modules) {
// add required dependencies (ex : if ecma6 is checked, ecma5 must
// be added too).
metadata = module.getMetadata();
if (metadata != null) {
requiredDependencies = metadata.getRequiredDependencies(module
.getVersion());
for (String dependency : requiredDependencies) {
dependencyModule = repository.getModule(dependency);
if (dependencyModule != null) {
TernModuleHelper
.update(defs, plugins, dependencyModule);
}
}
}
// add module
TernModuleHelper.update(defs, plugins, module);
}
model.setTernDefs(defs.toArray(ITernDef.EMPTY_DEF));
model.setTernPlugins(plugins.toArray(ITernPlugin.EMPTY_PLUGIN));
model.setRepository(repository);
model.setProject(modulesBlock.getProject());
}
}