Package org.eclipse.egit.ui.internal.fetch

Source Code of org.eclipse.egit.ui.internal.fetch.FetchSourcePage

/*******************************************************************************
* 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.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.egit.core.op.ListRemoteOperation;
import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.UIPreferences;
import org.eclipse.egit.ui.UIUtils;
import org.eclipse.egit.ui.UIUtils.IRefListProvider;
import org.eclipse.egit.ui.internal.UIText;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.operation.IRunnableWithProgress;
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.jgit.transport.URIish;
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.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 FetchSourcePage extends WizardPage {
  private final Repository repository;

  private final RemoteConfig config;

  private Text sourceText;

  private List<Ref> remoteRefs;

  /**
   * Default constructor
   *
   * @param repository
   * @param config
   */
  public FetchSourcePage(Repository repository, RemoteConfig config) {
    super(FetchSourcePage.class.getName());
    this.repository = repository;
    this.config = config;
    setTitle(UIText.FetchSourcePage_PageTitle);
  }

  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.FetchSourcePage_RepositoryLabel);
    Text repositoryText = new Text(main, SWT.READ_ONLY | SWT.BORDER);
    repositoryText.setText(config.getURIs().get(0).toPrivateString());
    GridDataFactory.fillDefaults().grab(true, false)
        .applyTo(repositoryText);

    Label sourceLabel = new Label(main, SWT.NONE);
    sourceLabel.setText(UIText.FetchSourcePage_SourceLabel);
    sourceText = new Text(main, SWT.BORDER);
    sourceText.addModifyListener(new ModifyListener() {
      public void modifyText(ModifyEvent e) {
        checkPage();
      }
    });
    GridDataFactory.fillDefaults().grab(true, false).applyTo(sourceText);
    UIUtils.addRefContentProposalToText(sourceText, repository,
        new IRefListProvider() {
          public List<Ref> getRefList() {
            return getRemoteRefs();
          }
        });
    checkPage();
    setControl(main);
  }

  private void checkPage() {
    setMessage(null, IMessageProvider.WARNING);
    setErrorMessage(null);
    setMessage(UIText.FetchSourcePage_PageMessage);
    if (sourceText.getText().length() == 0) {
      setPageComplete(false);
      return;
    }
    boolean found = false;
    for (Ref ref : getRemoteRefs()) {
      if (ref.getName().equals(sourceText.getText()))
        found = true;
    }
    if (!found)
      setMessage(NLS.bind(UIText.FetchSourcePage_RefNotFoundMessage,
          sourceText.getText()), IMessageProvider.WARNING);
    setPageComplete(true);
  }

  @Override
  public void setVisible(boolean visible) {
    super.setVisible(visible);
    if (visible)
      sourceText.setFocus();
  }

  /**
   * @return the source
   */
  public String getSource() {
    return sourceText.getText();
  }

  private List<Ref> getRemoteRefs() {
    if (remoteRefs == null) {
      URIish uriToCheck;
      List<Ref> proposals = new ArrayList<Ref>();
      uriToCheck = config.getURIs().get(0);
      final ListRemoteOperation lop = new ListRemoteOperation(repository,
          uriToCheck, Activator.getDefault().getPreferenceStore()
              .getInt(UIPreferences.REMOTE_CONNECTION_TIMEOUT));
      try {
        new ProgressMonitorDialog(getShell()).run(false, true,
            new IRunnableWithProgress() {
              public void run(IProgressMonitor monitor)
                  throws InvocationTargetException,
                  InterruptedException {
                monitor
                    .beginTask(
                        UIText.FetchSourcePage_GettingRemoteRefsTaskname,
                        IProgressMonitor.UNKNOWN);
                lop.run(monitor);
                monitor.done();
              }
            });
        for (Ref ref : lop.getRemoteRefs()) {
          if (ref.getName().startsWith(Constants.R_HEADS)
              || ref.getName().startsWith(Constants.R_TAGS))
            proposals.add(ref);
        }
        Collections.sort(proposals, new Comparator<Ref>() {
          public int compare(Ref o1, Ref o2) {
            return o1.getName().compareTo(o2.getName());
          }
        });
        this.remoteRefs = proposals;
      } catch (IllegalStateException e) {
        setErrorMessage(e.getMessage());
      } catch (InvocationTargetException e) {
        setErrorMessage(e.getMessage());
      } catch (InterruptedException e) {
        setErrorMessage(e.getMessage());
      }
    }
    return remoteRefs;
  }
}
TOP

Related Classes of org.eclipse.egit.ui.internal.fetch.FetchSourcePage

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.