org.eclipse.egit.ui.internal.importing.GitScmUrlImportWizardPage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.egit.ui.internal.importing.GitScmUrlImportWizardPage.java

Source

/*******************************************************************************
 * Copyright (c) 2012 Tomasz Zarna 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:
 *    Tomasz Zarna <Tomasz.Zarna@pl.ibm.com> - initial implementation
 *******************************************************************************/
package org.eclipse.egit.ui.internal.importing;

import java.net.URI;

import org.eclipse.egit.core.internal.GitURI;
import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.internal.SWTUtils;
import org.eclipse.egit.ui.internal.UIText;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.StyledCellLabelProvider;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.wizard.WizardPage;
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.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.team.core.ScmUrlImportDescription;
import org.eclipse.team.ui.IScmUrlImportWizardPage;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;

/**
 * Wizard page that allows the user to import repositories with SCM URLs.
 */
public class GitScmUrlImportWizardPage extends WizardPage implements IScmUrlImportWizardPage {

    private ScmUrlImportDescription[] descriptions;
    private Label counterLabel;
    private TableViewer bundlesViewer;
    private Button useMaster;

    private static final String GIT_PAGE_USE_MASTER = "org.eclipse.team.egit.ui.import.page.master"; //$NON-NLS-1$

    static class GitLabelProvider extends StyledCellLabelProvider implements ILabelProvider {

        /* (non-Javadoc)
         * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
         */
        @Override
        public Image getImage(Object element) {
            return PlatformUI.getWorkbench().getSharedImages().getImage(IDE.SharedImages.IMG_OBJ_PROJECT);
        }

        /* (non-Javadoc)
         * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
         */
        @Override
        public String getText(Object element) {
            return getStyledText(element).getString();
        }

        /* (non-Javadoc)
         * @see org.eclipse.jface.viewers.StyledCellLabelProvider#update(org.eclipse.jface.viewers.ViewerCell)
         */
        @Override
        public void update(ViewerCell cell) {
            StyledString string = getStyledText(cell.getElement());
            cell.setText(string.getString());
            cell.setStyleRanges(string.getStyleRanges());
            cell.setImage(getImage(cell.getElement()));
            super.update(cell);
        }

        private StyledString getStyledText(Object element) {
            StyledString styledString = new StyledString();
            if (element instanceof ScmUrlImportDescription) {
                ScmUrlImportDescription description = (ScmUrlImportDescription) element;
                String project = description.getProject();
                URI scmUrl = description.getUri();
                try {
                    String version = getTag(scmUrl);
                    String host = getServer(scmUrl);
                    styledString.append(project);
                    if (version != null) {
                        styledString.append(' ');
                        styledString.append(version, StyledString.DECORATIONS_STYLER);
                    }
                    styledString.append(' ');
                    styledString.append('[', StyledString.DECORATIONS_STYLER);
                    styledString.append(host, StyledString.DECORATIONS_STYLER);
                    styledString.append(']', StyledString.DECORATIONS_STYLER);
                } catch (IllegalArgumentException e) {
                    styledString.append(e.getMessage());
                    Activator.logError(e.getMessage(), e);
                }
                return styledString;
            }
            styledString.append(element.toString());
            return styledString;
        }
    }

    /**
     * Constructs the page.
     */
    public GitScmUrlImportWizardPage() {
        super("git", UIText.GitScmUrlImportWizardPage_title, null); //$NON-NLS-1$
        setDescription(UIText.GitScmUrlImportWizardPage_description);
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
     */
    @Override
    public void createControl(Composite parent) {
        Composite comp = SWTUtils.createHVFillComposite(parent, SWTUtils.MARGINS_NONE, 1);
        Composite group = SWTUtils.createHFillComposite(comp, SWTUtils.MARGINS_NONE, 1);

        Button versions = SWTUtils.createRadioButton(group, UIText.GitScmUrlImportWizardPage_importVersion);
        useMaster = SWTUtils.createRadioButton(group, UIText.GitScmUrlImportWizardPage_importMaster);
        SelectionListener listener = new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                bundlesViewer.refresh(true);
            }
        };
        versions.addSelectionListener(listener);
        useMaster.addSelectionListener(listener);

        Table table = new Table(comp, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL);
        GridData gd = new GridData(GridData.FILL_BOTH);
        gd.heightHint = 200;
        gd.widthHint = 225;
        table.setLayoutData(gd);

        bundlesViewer = new TableViewer(table);
        bundlesViewer.setLabelProvider(new GitLabelProvider());
        bundlesViewer.setContentProvider(new ArrayContentProvider());
        bundlesViewer.setComparator(new ViewerComparator());
        counterLabel = new Label(comp, SWT.NONE);
        counterLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        setControl(comp);
        setPageComplete(true);

        // Initialize versions versus master
        IDialogSettings settings = getWizard().getDialogSettings();
        boolean useMasterSetting = settings != null && settings.getBoolean(GIT_PAGE_USE_MASTER);
        useMaster.setSelection(useMasterSetting);
        versions.setSelection(!useMasterSetting);

        if (descriptions != null) {
            bundlesViewer.setInput(descriptions);
            updateCount();
        }

    }

    @Override
    public boolean finish() {
        boolean head = false;
        if (getControl() != null) {
            head = useMaster.getSelection();
            // store settings
            IDialogSettings settings = getWizard().getDialogSettings();
            if (settings != null)
                settings.put(GIT_PAGE_USE_MASTER, head);
        } else {
            // use whatever was used last time
            IDialogSettings settings = getWizard().getDialogSettings();
            if (settings != null)
                head = settings.getBoolean(GIT_PAGE_USE_MASTER);
        }

        if (head && descriptions != null)
            // modify tags on bundle import descriptions
            for (int i = 0; i < descriptions.length; i++) {
                URI scmUri = descriptions[i].getUri();
                descriptions[i].setUrl(removeTag(scmUri));
            }

        return true;
    }

    /* (non-Javadoc)
     * @see org.eclipse.team.ui.IScmUrlImportWizardPage#getSelection()
     */
    @Override
    public ScmUrlImportDescription[] getSelection() {
        return descriptions;
    }

    @Override
    public void setSelection(ScmUrlImportDescription[] descriptions) {
        this.descriptions = descriptions;
        // fill viewer
        if (bundlesViewer != null) {
            bundlesViewer.setInput(descriptions);
            updateCount();
        }
    }

    /**
     * Updates the count of bundles that will be imported
     */
    private void updateCount() {
        counterLabel
                .setText(NLS.bind(UIText.GitScmUrlImportWizardPage_counter, Integer.valueOf(descriptions.length)));
        counterLabel.getParent().layout();
    }

    private static String getTag(URI scmUri) {
        GitURI gitURI = new GitURI(scmUri);
        return gitURI.getTag();
    }

    /**
     * Remove tag attributes from the given URI reference. Results in the URI
     * pointing to HEAD.
     *
     * @param scmUri
     *            a SCM URI reference to modify
     * @return Returns the content of the stripped URI as a string.
     */
    private static String removeTag(URI scmUri) {
        StringBuffer sb = new StringBuffer();
        sb.append(scmUri.getScheme()).append(':');
        String ssp = scmUri.getSchemeSpecificPart();
        int j = ssp.indexOf(';');
        if (j != -1) {
            sb.append(ssp.substring(0, j));
            String[] params = ssp.substring(j).split(";"); //$NON-NLS-1$
            for (int k = 0; k < params.length; k++)
                // PDE way of providing tags
                if (params[k].startsWith("tag=")) { //$NON-NLS-1$
                    // ignore
                } else if (params[k].startsWith("version=")) { //$NON-NLS-1$
                    // ignore
                } else if (params[k] != null && !params[k].equals("")) //$NON-NLS-1$
                    sb.append(";").append(params[k]); //$NON-NLS-1$
        } else
            sb.append(ssp);
        return sb.toString();
    }

    private static String getServer(URI scmUri) {
        GitURI gitURI = new GitURI(scmUri);
        return gitURI.getRepository().toString();
    }
}