/******************************************************************************* * 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(); } }