/******************************************************************************* * Copyright (C) 2011, Mathias Kinzler <mathias.kinzler@sap.com> * * 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 *******************************************************************************/ package org.eclipse.egit.ui.internal.fetch; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.eclipse.egit.ui.Activator; import org.eclipse.egit.ui.UIUtils; import org.eclipse.egit.ui.internal.UIText; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.transport.RemoteConfig; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; /** * Obtain the Fetch Source, i.e. the {@link Ref} on the remote * {@link Repository} */ public class FetchDestinationPage extends WizardPage { private final Repository repository; private final RemoteConfig config; private Text sourceText; private Text destinationText; private Button force; private List<Ref> trackingBranches; /** * Default constructor * * @param repository * @param config */ public FetchDestinationPage(Repository repository, RemoteConfig config) { super(FetchDestinationPage.class.getName()); this.repository = repository; this.config = config; setTitle(UIText.FetchDestinationPage_PageTitle); } @Override public void createControl(Composite parent) { Composite main = new Composite(parent, SWT.NONE); main.setLayout(new GridLayout(2, false)); GridDataFactory.fillDefaults().grab(true, true).applyTo(main); Label repositoryLabel = new Label(main, SWT.NONE); repositoryLabel.setText(UIText.FetchDestinationPage_RepositoryLabel); Text repositoryText = new Text(main, SWT.READ_ONLY | SWT.BORDER); repositoryText.setText(Activator.getDefault().getRepositoryUtil() .getRepositoryName(repository)); GridDataFactory.fillDefaults().grab(true, false) .applyTo(repositoryText); Label sourceLabel = new Label(main, SWT.NONE); sourceLabel.setText(UIText.FetchDestinationPage_SourceLabel); sourceText = new Text(main, SWT.READ_ONLY | SWT.BORDER); GridDataFactory.fillDefaults().grab(true, false).applyTo(sourceText); Label destinationLabel = new Label(main, SWT.NONE); destinationLabel.setText(UIText.FetchDestinationPage_DestinationLabel); destinationText = new Text(main, SWT.BORDER); destinationText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { checkPage(); } }); GridDataFactory.fillDefaults().grab(true, false).applyTo( destinationText); UIUtils.addRefContentProposalToText(sourceText, repository, () -> getRemoteRefs()); force = new Button(main, SWT.CHECK); force.setText(UIText.FetchDestinationPage_ForceCheckbox); GridDataFactory.fillDefaults().grab(true, false).span(2, 1).applyTo( force); checkPage(); destinationText.setFocus(); setControl(main); } @Override public void setVisible(boolean visible) { super.setVisible(visible); if (visible) { FetchSourcePage fsp = (FetchSourcePage) getWizard() .getPreviousPage(this); String sourceString = fsp.getSource(); sourceText.setText(sourceString); if (sourceString.length() > 0) { destinationText.setText(Constants.R_REMOTES + config.getName() + '/' + Repository.shortenRefName(sourceString)); } destinationText.setFocus(); } } /** * @return the source */ public String getDestination() { return destinationText.getText(); } /** * @return if force is checked */ public boolean isForce() { return force.getSelection(); } private List<Ref> getRemoteRefs() { if (this.trackingBranches == null) { List<Ref> proposals = new ArrayList<>(); try { for (Ref ref : repository.getRefDatabase().getRefs( Constants.R_REMOTES).values()) { proposals.add(ref); } this.trackingBranches = proposals; } catch (IOException e) { setErrorMessage(UIText.FetchDestinationPage_CouldNotGetBranchesMessage); } } return this.trackingBranches; } private void checkPage() { setMessage(null, IMessageProvider.WARNING); setErrorMessage(null); setMessage(UIText.FetchDestinationPage_PageMessage); if (destinationText.getText().length() == 0) { setPageComplete(false); return; } boolean found = false; for (Ref ref : getRemoteRefs()) { if (ref.getName().equals(destinationText.getText())) found = true; } if (!found) setMessage(NLS.bind( UIText.FetchDestinationPage_TrackingBranchNotFoundMessage, destinationText.getText()), IMessageProvider.WARNING); setPageComplete(true); } }