/** * 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.repository; import java.util.Collection; import java.util.Collections; 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.core.runtime.jobs.Job; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ComboViewer; 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.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import tern.eclipse.ide.core.IIDETernRepository; import tern.eclipse.ide.core.ITernRepositoryManager; import tern.eclipse.ide.core.TernCorePlugin; import tern.eclipse.ide.tools.internal.ui.TernToolsUIMessages; import tern.eclipse.ide.tools.internal.ui.TernToolsUIPlugin; import tern.eclipse.ide.tools.internal.ui.wizards.TernWizardPage; import tern.eclipse.ide.ui.controls.TernModulesBlock; import tern.eclipse.ide.ui.viewers.TernRepositoryLabelProvider; import tern.repository.ITernRepository; import tern.repository.TernRepositoryHelper; import tern.server.ITernModule; /** * Wizard page used to load repository.json and select tern modules to download. * */ public class InstallTernModulesSelectionWizardPage extends TernWizardPage<InstallTernModulesOptions> { private static final String PAGE = "DownloadTernModulesSelectionWizardPage"; private TernModulesBlock modulesBlock; private Button refreshButton; private ComboViewer repositoryViewer; private Text repositoryURL; public InstallTernModulesSelectionWizardPage() { super(PAGE); setTitle(TernToolsUIMessages.InstallTernModulesSelectionWizardPage_title); setDescription(TernToolsUIMessages.InstallTernModulesSelectionWizardPage_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); // Local repository createLocalRepository(container); // Repository URL createRepositoryURL(container); // Tern Modules list createModules(container); return container; } protected void createModules(Composite container) { modulesBlock = new TernModulesBlock(null, null); Control control = modulesBlock.createControl(container); modulesBlock .addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { InstallTernModulesSelectionWizardPage.this .dialogChanged(); } }); GridData data = new GridData(GridData.FILL_BOTH); data.horizontalSpan = 1; control.setLayoutData(data); } /** * Create a combo which hosts local tern repository. * * @param parent */ private void createLocalRepository(Composite parent) { Composite container = new Composite(parent, SWT.NONE); container.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); GridLayout layout = new GridLayout(); layout.numColumns = 2; layout.marginHeight = 0; layout.marginWidth = 0; container.setLayout(layout); // Label Label repositoryNameLabel = new Label(container, SWT.NONE); repositoryNameLabel .setText(TernToolsUIMessages.InstallTernModulesSelectionWizardPage_localRespositoryName_text); // Combo repository repositoryViewer = new ComboViewer(container, SWT.DROP_DOWN | SWT.READ_ONLY); repositoryViewer.getControl().setLayoutData( new GridData(GridData.FILL_HORIZONTAL)); repositoryViewer.setLabelProvider(TernRepositoryLabelProvider .getInstance()); repositoryViewer.setContentProvider(ArrayContentProvider.getInstance()); Collection<IIDETernRepository> repositories = TernCorePlugin .getTernRepositoryManager().getRepositories(); repositoryViewer.setInput(repositories); final Text repositoryPath = new Text(container, SWT.WRAP | SWT.READ_ONLY); GridData data = new GridData(GridData.FILL_HORIZONTAL); data.horizontalSpan = 2; repositoryPath.setLayoutData(data); repositoryViewer .addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { ITernRepository repository = (ITernRepository) ((IStructuredSelection) event .getSelection()).getFirstElement(); repositoryPath.setText(repository .getTernBaseDirAsString()); InstallTernModulesSelectionWizardPage.this.getModel() .setRepository(repository); } }); // Select and display info about the default tern repository ITernRepository defaultRepository = TernCorePlugin .getTernRepositoryManager().getRepository( ITernRepositoryManager.DEFAULT_REPOSITORY_NAME); if (defaultRepository != null) { repositoryViewer.setSelection(new StructuredSelection( defaultRepository)); repositoryPath.setText(defaultRepository.getTernBaseDirAsString()); } } /** * Create the repository URL text field. * * @param parent */ protected void createRepositoryURL(Composite parent) { Composite container = new Composite(parent, SWT.NONE); container.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); GridLayout layout = new GridLayout(); layout.numColumns = 3; layout.marginHeight = 0; layout.marginWidth = 0; container.setLayout(layout); Label repositoryURLLabel = new Label(container, SWT.NONE); repositoryURLLabel .setText(TernToolsUIMessages.InstallTernModulesSelectionWizardPage_repositoryURL_text); repositoryURL = new Text(container, SWT.BORDER); repositoryURL.setText(TernRepositoryHelper.DEFAULT_TERN_REPOSITORY_URL); repositoryURL.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); refreshButton = new Button(container, SWT.PUSH); refreshButton.setText(TernToolsUIMessages.Button_refresh); repositoryURL.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); refreshButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { refreshButton.setEnabled(false); refreshModules(); } }); } private class RefreshRepositoryJob extends Job { private final String url; public RefreshRepositoryJob(String url) { super(TernToolsUIMessages.RefreshRepositoryJob_name); this.url = url; } @Override protected IStatus run(IProgressMonitor monitor) { if (monitor.isCanceled()) { return Status.CANCEL_STATUS; } monitor.beginTask(NLS.bind( TernToolsUIMessages.RefreshRepositoryJob_loading, url), 1); // load tern repository.json with HTTP client and refresh UI try { List<ITernModule> modules = TernRepositoryHelper .loadModules(url); monitor.worked(1); // repository is loaded correctly, refresh UI refreshModules(modules, null); } catch (Throwable e) { // error while loading repository.json refreshModules(Collections.EMPTY_LIST, e); } monitor.done(); return Status.OK_STATUS; } private void refreshModules(final List<ITernModule> modules, final Throwable e) { Display.getDefault().asyncExec(new Runnable() { public void run() { refreshButton.setEnabled(true); modulesBlock.setTernModules(modules .toArray(ITernModule.EMPTY_MODULE)); if (e != null) { IStatus status = new Status( IStatus.ERROR, TernToolsUIPlugin.PLUGIN_ID, IStatus.ERROR, NLS.bind( TernToolsUIMessages.InstallTernModulesSelectionWizardPage_errorMessage, url), e); ErrorDialog .openError( Display.getDefault().getActiveShell(), TernToolsUIMessages.InstallTernModulesSelectionWizardPage_errorTitle, NLS.bind( TernToolsUIMessages.InstallTernModulesSelectionWizardPage_errorMessage, url), status); } else { modulesBlock.setEnabled(true); } } }); } } @Override protected void initialize() { refreshModules(); } protected void refreshModules() { modulesBlock.setEnabled(false); modulesBlock.setTernModules(ITernModule.EMPTY_MODULE); Job refreshJob = new RefreshRepositoryJob(repositoryURL.getText()); refreshJob.schedule(); } @Override protected String validate() { Collection<ITernModule> objModules = modulesBlock.getCheckedModules(); if (objModules.size() == 0) { return TernToolsUIMessages.InstallTernModulesSelectionWizardPage_modules_selection_validation; } return null; } @Override protected void updateModel(InstallTernModulesOptions model) { ITernModule[] modules = modulesBlock.getCheckedModules().toArray( ITernModule.EMPTY_MODULE); model.setRepository((ITernRepository) ((IStructuredSelection) repositoryViewer .getSelection()).getFirstElement()); model.setTernModules(modules); } }