| /********************************************************************* |
| * Copyright (c) 2010 Sony Ericsson/ST Ericsson and others. |
| * 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: |
| * Sony Ericsson/ST Ericsson - initial API and implementation |
| * Tasktop Technologies - improvements |
| * GitHub, Inc. - fixes for bug 354753 |
| *********************************************************************/ |
| package org.eclipse.mylyn.internal.gerrit.ui; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.jface.dialogs.IMessageProvider; |
| import org.eclipse.jface.layout.GridDataFactory; |
| import org.eclipse.mylyn.commons.workbench.forms.CommonFormUtil; |
| import org.eclipse.mylyn.internal.gerrit.core.GerritConnector; |
| import org.eclipse.mylyn.internal.gerrit.core.client.GerritSystemInfo; |
| import org.eclipse.mylyn.internal.tasks.core.IRepositoryConstants; |
| import org.eclipse.mylyn.tasks.core.RepositoryTemplate; |
| import org.eclipse.mylyn.tasks.core.TaskRepository; |
| import org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositorySettingsPage; |
| 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.widgets.Button; |
| import org.eclipse.swt.widgets.Combo; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Label; |
| import org.eclipse.ui.forms.widgets.ExpandableComposite; |
| |
| /** |
| * Wizard page to specify Gerrit connection details. |
| * |
| * @author Mikael Kober |
| * @author Thomas Westling |
| * @author Steffen Pingel |
| */ |
| public class GerritRepositorySettingsPage extends AbstractRepositorySettingsPage { |
| |
| public class GerritValidator extends Validator { |
| |
| private GerritSystemInfo info; |
| |
| final TaskRepository repository; |
| |
| public GerritValidator(TaskRepository repository) { |
| this.repository = repository; |
| } |
| |
| public GerritSystemInfo getInfo() { |
| return info; |
| } |
| |
| @Override |
| public void run(IProgressMonitor monitor) throws CoreException { |
| GerritConnector connector = (GerritConnector) getConnector(); |
| info = connector.validate(repository, monitor); |
| } |
| |
| private boolean isSupportedVersion() { |
| return info.getCapabilities().isSupported(); |
| } |
| |
| } |
| |
| private class OpenIdProvider { |
| |
| private final String name; |
| |
| private final String url; |
| |
| public OpenIdProvider(String name, String url) { |
| this.name = name; |
| this.url = url; |
| } |
| |
| public String getName() { |
| return name; |
| } |
| |
| public String getUrl() { |
| return url; |
| } |
| |
| } |
| |
| private Button openIdButton; |
| |
| private Combo openIdCombo; |
| |
| private final List<OpenIdProvider> openIdProviders = new ArrayList<OpenIdProvider>(); |
| |
| public GerritRepositorySettingsPage(TaskRepository taskRepository) { |
| super(Messages.GerritRepositorySettingsPage_Gerrit_Repository_Settings, |
| Messages.GerritRepositorySettingsPage_Gerrit_Repository_Settings_description, taskRepository); |
| setNeedsAnonymousLogin(true); |
| setNeedsHttpAuth(true); |
| setNeedsAdvanced(true); |
| setNeedsEncoding(false); |
| setNeedsTimeZone(false); |
| setNeedsValidation(true); |
| |
| openIdProviders.add(new OpenIdProvider(Messages.GerritRepositorySettingsPage_Google_Account, |
| "https://www.google.com/accounts/o8/id")); //$NON-NLS-1$ |
| openIdProviders.add(new OpenIdProvider(Messages.GerritRepositorySettingsPage_Yahoo_Account, |
| "https://me.yahoo.com")); //$NON-NLS-1$ |
| } |
| |
| @SuppressWarnings("restriction") |
| @Override |
| public void applyTo(TaskRepository repository) { |
| super.applyTo(repository); |
| repository.setProperty(GerritConnector.KEY_REPOSITORY_OPEN_ID_ENABLED, |
| Boolean.toString(openIdButton.getSelection())); |
| repository.setProperty(GerritConnector.KEY_REPOSITORY_OPEN_ID_PROVIDER, openIdCombo.getText()); |
| repository.setProperty(IRepositoryConstants.PROPERTY_CATEGORY, TaskRepository.CATEGORY_REVIEW); |
| repository.removeProperty(GerritConnector.KEY_REPOSITORY_ACCOUNT_ID); |
| repository.removeProperty(GerritConnector.KEY_REPOSITORY_AUTH); |
| } |
| |
| @Override |
| public void createControl(Composite parent) { |
| super.createControl(parent); |
| addRepositoryTemplatesToServerUrlCombo(); |
| } |
| |
| @Override |
| public String getConnectorKind() { |
| return GerritConnector.CONNECTOR_KIND; |
| } |
| |
| private void updateButtons() { |
| openIdCombo.setEnabled(openIdButton.getSelection()); |
| } |
| |
| @Override |
| protected void applyValidatorResult(Validator validator) { |
| super.applyValidatorResult(validator); |
| if (validator.getStatus() != null && validator.getStatus().isOK()) { |
| GerritValidator gerritValidator = (GerritValidator) validator; |
| |
| String warning = ""; //$NON-NLS-1$ |
| if (!gerritValidator.isSupportedVersion()) { |
| warning = NLS.bind( |
| Messages.GerritRepositorySettingsPage_Gerrit_may_not_be_supported, |
| gerritValidator.getInfo().getVersion()); |
| } |
| |
| setMessage(NLS.bind(Messages.GerritRepositorySettingsPage_X_Logged_in_as_Y_dot_Z, new String[] { getMessage(), |
| gerritValidator.getInfo().getFullName(), warning }), warning.isEmpty() |
| ? IMessageProvider.INFORMATION |
| : IMessageProvider.WARNING); |
| } |
| } |
| |
| @Override |
| protected void createAdditionalControls(Composite parent) { |
| openIdButton = new Button(parent, SWT.CHECK); |
| openIdButton.setText(Messages.GerritRepositorySettingsPage_OpenID_Authentication); |
| openIdButton.addSelectionListener(new SelectionAdapter() { |
| @Override |
| public void widgetSelected(SelectionEvent e) { |
| updateButtons(); |
| } |
| }); |
| GridDataFactory.fillDefaults().span(2, 1).applyTo(openIdButton); |
| |
| Label providerLabel = new Label(parent, SWT.NONE); |
| providerLabel.setText(Messages.GerritRepositorySettingsPage_Provider); |
| |
| openIdCombo = new Combo(parent, SWT.NONE); |
| GridDataFactory.fillDefaults().grab(true, false).applyTo(openIdCombo); |
| for (OpenIdProvider provider : openIdProviders) { |
| openIdCombo.add(provider.getName()); |
| } |
| openIdCombo.addSelectionListener(new SelectionAdapter() { |
| @Override |
| public void widgetSelected(SelectionEvent e) { |
| if (openIdCombo.getSelectionIndex() >= 0) { |
| openIdCombo.setText(openIdProviders.get(openIdCombo.getSelectionIndex()).getUrl()); |
| } |
| } |
| }); |
| |
| if (repository != null) { |
| openIdButton.setSelection(Boolean.parseBoolean(repository.getProperty(GerritConnector.KEY_REPOSITORY_OPEN_ID_ENABLED))); |
| String value = repository.getProperty(GerritConnector.KEY_REPOSITORY_OPEN_ID_PROVIDER); |
| openIdCombo.setText((value != null) ? value : ""); //$NON-NLS-1$ |
| |
| if (openIdButton.getSelection()) { |
| if (parent.getParent() instanceof ExpandableComposite) { |
| CommonFormUtil.setExpanded((ExpandableComposite) parent.getParent(), true); |
| } |
| } |
| } |
| |
| updateButtons(); |
| } |
| |
| @Override |
| protected Validator getValidator(TaskRepository repository) { |
| return new GerritValidator(repository); |
| } |
| |
| @Override |
| protected void repositoryTemplateSelected(RepositoryTemplate template) { |
| repositoryLabelEditor.setStringValue(template.label); |
| setUrl(template.repositoryUrl); |
| getContainer().updateButtons(); |
| } |
| |
| } |