Java tutorial
/******************************************************************************* * 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.push; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; import java.util.Set; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.egit.core.op.PushOperationResult; import org.eclipse.egit.ui.Activator; import org.eclipse.egit.ui.UIPreferences; import org.eclipse.egit.ui.internal.UIText; import org.eclipse.egit.ui.internal.repository.SelectUriWizard; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.window.Window; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.ConfigConstants; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.transport.RefSpec; 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.dnd.Clipboard; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.events.KeyAdapter; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.forms.events.ExpansionAdapter; import org.eclipse.ui.forms.events.ExpansionEvent; import org.eclipse.ui.forms.widgets.ExpandableComposite; /** * A simplified wizard for configuring push */ public class SimpleConfigurePushDialog extends TitleAreaDialog { private static final int DRY_RUN = 98; private static final int SAVE_ONLY = 97; private static final int REVERT = 96; private static final String ADVANCED_MODE_PREFERENCE = SimpleConfigurePushDialog.class.getName() + "_ADVANCED_MODE"; //$NON-NLS-1$ private final Repository repository; private RemoteConfig config; private final boolean showBranchInfo; private Text commonUriText; private TableViewer uriViewer; private TableViewer specViewer; private Button changeCommonUri; private Button deleteCommonUri; private Button addRefSpec; private Button changeRefSpec; private Button addRefSpecAdvanced; /** * @param shell * @param repository * @return the dialog to open, or null */ public static Dialog getDialog(Shell shell, Repository repository) { RemoteConfig configToUse = getConfiguredRemote(repository); return new SimpleConfigurePushDialog(shell, repository, configToUse, true); } /** * @param shell * @param repository * @param remoteName * the remote to use * @return the dialog to open, or null */ public static Dialog getDialog(Shell shell, Repository repository, String remoteName) { RemoteConfig configToUse; try { configToUse = new RemoteConfig(repository.getConfig(), remoteName); } catch (URISyntaxException e) { Activator.handleError(e.getMessage(), e, true); return null; } return new SimpleConfigurePushDialog(shell, repository, configToUse, false); } /** * @param repository * @return the configured remote for the current branch if any, or null */ public static RemoteConfig getConfiguredRemote(Repository repository) { String branch; try { branch = repository.getBranch(); } catch (IOException e) { Activator.handleError(e.getMessage(), e, true); return null; } if (branch == null) return null; String remoteName; if (ObjectId.isId(branch)) remoteName = Constants.DEFAULT_REMOTE_NAME; else remoteName = repository.getConfig().getString(ConfigConstants.CONFIG_BRANCH_SECTION, branch, ConfigConstants.CONFIG_REMOTE_SECTION); // check if we find the configured and default Remotes List<RemoteConfig> allRemotes; try { allRemotes = RemoteConfig.getAllRemoteConfigs(repository.getConfig()); } catch (URISyntaxException e) { allRemotes = new ArrayList<RemoteConfig>(); } RemoteConfig defaultConfig = null; RemoteConfig configuredConfig = null; for (RemoteConfig config : allRemotes) { if (config.getName().equals(Constants.DEFAULT_REMOTE_NAME)) defaultConfig = config; if (remoteName != null && config.getName().equals(remoteName)) configuredConfig = config; } RemoteConfig configToUse = configuredConfig != null ? configuredConfig : defaultConfig; return configToUse; } /** * * @param shell * @param repository * @param config * @param showBranchInfo * should be true if this is used for upstream configuration; if * false, branch information will be hidden in the dialog */ private SimpleConfigurePushDialog(Shell shell, Repository repository, RemoteConfig config, boolean showBranchInfo) { super(shell); setHelpAvailable(false); setShellStyle(getShellStyle() | SWT.SHELL_TRIM); this.repository = repository; this.config = config; this.showBranchInfo = showBranchInfo; } @Override protected Control createDialogArea(Composite parent) { boolean advancedMode = Activator.getDefault().getPreferenceStore().getBoolean(ADVANCED_MODE_PREFERENCE); final Composite main = new Composite(parent, SWT.NONE); main.setLayout(new GridLayout(1, false)); GridDataFactory.fillDefaults().grab(true, true).minSize(SWT.DEFAULT, SWT.DEFAULT).applyTo(main); if (showBranchInfo) { Composite branchArea = new Composite(main, SWT.NONE); GridLayoutFactory.swtDefaults().numColumns(2).equalWidth(false).applyTo(branchArea); GridDataFactory.fillDefaults().grab(true, false).applyTo(branchArea); Label branchLabel = new Label(branchArea, SWT.NONE); branchLabel.setText(UIText.SimpleConfigurePushDialog_BranchLabel); String branch; try { branch = repository.getBranch(); } catch (IOException e2) { branch = null; } if (branch == null || ObjectId.isId(branch)) branch = UIText.SimpleConfigurePushDialog_DetachedHeadMessage; Text branchText = new Text(branchArea, SWT.BORDER | SWT.READ_ONLY); GridDataFactory.fillDefaults().grab(true, false).applyTo(branchText); branchText.setText(branch); } addDefaultOriginWarningIfNeeded(main); final Composite sameUriDetails = new Composite(main, SWT.NONE); sameUriDetails.setLayout(new GridLayout(4, false)); GridDataFactory.fillDefaults().grab(true, false).applyTo(sameUriDetails); Label commonUriLabel = new Label(sameUriDetails, SWT.NONE); commonUriLabel.setText(UIText.SimpleConfigurePushDialog_URILabel); commonUriText = new Text(sameUriDetails, SWT.BORDER | SWT.READ_ONLY); GridDataFactory.fillDefaults().grab(true, false).applyTo(commonUriText); changeCommonUri = new Button(sameUriDetails, SWT.PUSH); changeCommonUri.setText(UIText.SimpleConfigurePushDialog_ChangeUriButton); changeCommonUri.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { SelectUriWizard wiz; if (commonUriText.getText().length() > 0) wiz = new SelectUriWizard(false, commonUriText.getText()); else wiz = new SelectUriWizard(false); if (new WizardDialog(getShell(), wiz).open() == Window.OK) { if (commonUriText.getText().length() > 0) try { config.removeURI(new URIish(commonUriText.getText())); } catch (URISyntaxException ex) { Activator.handleError(ex.getMessage(), ex, true); } config.addURI(wiz.getUri()); updateControls(); } } }); deleteCommonUri = new Button(sameUriDetails, SWT.PUSH); deleteCommonUri.setText(UIText.SimpleConfigurePushDialog_DeleteUriButton); deleteCommonUri.setEnabled(false); deleteCommonUri.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { config.removeURI(config.getURIs().get(0)); updateControls(); } }); commonUriText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { deleteCommonUri.setEnabled(commonUriText.getText().length() > 0); } }); ExpandableComposite pushUriArea = new ExpandableComposite(main, ExpandableComposite.TREE_NODE | ExpandableComposite.CLIENT_INDENT); GridDataFactory.fillDefaults().grab(true, false).applyTo(pushUriArea); pushUriArea.setExpanded(!config.getPushURIs().isEmpty()); pushUriArea.addExpansionListener(new ExpansionAdapter() { public void expansionStateChanged(ExpansionEvent e) { main.layout(true, true); main.getShell().pack(); } }); pushUriArea.setText(UIText.SimpleConfigurePushDialog_PushUrisLabel); final Composite pushUriDetails = new Composite(pushUriArea, SWT.NONE); pushUriArea.setClient(pushUriDetails); pushUriDetails.setLayout(new GridLayout(2, false)); GridDataFactory.fillDefaults().grab(true, true).applyTo(pushUriDetails); uriViewer = new TableViewer(pushUriDetails, SWT.BORDER | SWT.MULTI); GridDataFactory.fillDefaults().grab(true, true).minSize(SWT.DEFAULT, 30).applyTo(uriViewer.getTable()); uriViewer.setContentProvider(ArrayContentProvider.getInstance()); final Composite uriButtonArea = new Composite(pushUriDetails, SWT.NONE); GridLayoutFactory.fillDefaults().applyTo(uriButtonArea); GridDataFactory.fillDefaults().grab(false, true).applyTo(uriButtonArea); Button addUri = new Button(uriButtonArea, SWT.PUSH); addUri.setText(UIText.SimpleConfigurePushDialog_AddPushUriButton); GridDataFactory.fillDefaults().applyTo(addUri); addUri.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { SelectUriWizard wiz = new SelectUriWizard(false); if (new WizardDialog(getShell(), wiz).open() == Window.OK) { config.addPushURI(wiz.getUri()); updateControls(); } } }); final Button changeUri = new Button(uriButtonArea, SWT.PUSH); changeUri.setText(UIText.SimpleConfigurePushDialog_ChangePushUriButton); GridDataFactory.fillDefaults().applyTo(changeUri); changeUri.setEnabled(false); changeUri.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { URIish uri = (URIish) ((IStructuredSelection) uriViewer.getSelection()).getFirstElement(); SelectUriWizard wiz = new SelectUriWizard(false, uri.toPrivateString()); if (new WizardDialog(getShell(), wiz).open() == Window.OK) { config.removePushURI(uri); config.addPushURI(wiz.getUri()); updateControls(); } } }); final Button deleteUri = new Button(uriButtonArea, SWT.PUSH); deleteUri.setText(UIText.SimpleConfigurePushDialog_DeletePushUriButton); GridDataFactory.fillDefaults().applyTo(deleteUri); deleteUri.setEnabled(false); deleteUri.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { URIish uri = (URIish) ((IStructuredSelection) uriViewer.getSelection()).getFirstElement(); config.removePushURI(uri); updateControls(); } }); uriViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { deleteUri.setEnabled(!uriViewer.getSelection().isEmpty()); changeUri.setEnabled(((IStructuredSelection) uriViewer.getSelection()).size() == 1); } }); final Group refSpecGroup = new Group(main, SWT.SHADOW_ETCHED_IN); GridDataFactory.fillDefaults().grab(true, true).minSize(SWT.DEFAULT, SWT.DEFAULT).applyTo(refSpecGroup); refSpecGroup.setText(UIText.SimpleConfigurePushDialog_RefMappingGroup); refSpecGroup.setLayout(new GridLayout(2, false)); specViewer = new TableViewer(refSpecGroup, SWT.BORDER | SWT.MULTI); specViewer.setContentProvider(ArrayContentProvider.getInstance()); GridDataFactory.fillDefaults().grab(true, true).minSize(SWT.DEFAULT, 30).applyTo(specViewer.getTable()); specViewer.getTable().addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { if (e.stateMask == SWT.MOD1 && e.keyCode == 'v') doPaste(); } }); final Composite refButtonArea = new Composite(refSpecGroup, SWT.NONE); GridLayoutFactory.fillDefaults().applyTo(refButtonArea); GridDataFactory.fillDefaults().grab(false, true).minSize(SWT.DEFAULT, SWT.DEFAULT).applyTo(refButtonArea); addRefSpec = new Button(refButtonArea, SWT.PUSH); addRefSpec.setText(UIText.SimpleConfigurePushDialog_AddRefSpecButton); GridDataFactory.fillDefaults().applyTo(addRefSpec); addRefSpec.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { RefSpecDialog dlg = new RefSpecDialog(getShell(), repository, config, true); if (dlg.open() == Window.OK) config.addPushRefSpec(dlg.getSpec()); updateControls(); } }); changeRefSpec = new Button(refButtonArea, SWT.PUSH); changeRefSpec.setText(UIText.SimpleConfigurePushDialog_ChangeRefSpecButton); GridDataFactory.fillDefaults().applyTo(changeRefSpec); changeRefSpec.setEnabled(false); GridDataFactory.fillDefaults().exclude(!advancedMode).applyTo(changeRefSpec); changeRefSpec.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { RefSpec oldSpec = (RefSpec) ((IStructuredSelection) specViewer.getSelection()).getFirstElement(); RefSpecDialog dlg = new RefSpecDialog(getShell(), repository, config, oldSpec, true); if (dlg.open() == Window.OK) { config.removePushRefSpec(oldSpec); config.addPushRefSpec(dlg.getSpec()); } updateControls(); } }); final Button deleteRefSpec = new Button(refButtonArea, SWT.PUSH); deleteRefSpec.setText(UIText.SimpleConfigurePushDialog_DeleteRefSpecButton); GridDataFactory.fillDefaults().applyTo(deleteRefSpec); deleteRefSpec.setEnabled(false); deleteRefSpec.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { for (Object spec : ((IStructuredSelection) specViewer.getSelection()).toArray()) config.removePushRefSpec((RefSpec) spec); updateControls(); } }); final Button copySpec = new Button(refButtonArea, SWT.PUSH); copySpec.setText(UIText.SimpleConfigurePushDialog_CopyRefSpecButton); GridDataFactory.fillDefaults().applyTo(copySpec); copySpec.setEnabled(false); copySpec.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { String toCopy = ((IStructuredSelection) specViewer.getSelection()).getFirstElement().toString(); Clipboard clipboard = new Clipboard(getShell().getDisplay()); try { clipboard.setContents(new String[] { toCopy }, new TextTransfer[] { TextTransfer.getInstance() }); } finally { clipboard.dispose(); } } }); final Button pasteSpec = new Button(refButtonArea, SWT.PUSH); pasteSpec.setText(UIText.SimpleConfigurePushDialog_PasteRefSpecButton); GridDataFactory.fillDefaults().applyTo(pasteSpec); pasteSpec.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { doPaste(); } }); addRefSpecAdvanced = new Button(refButtonArea, SWT.PUSH); addRefSpecAdvanced.setText(UIText.SimpleConfigurePushDialog_EditAdvancedButton); GridDataFactory.fillDefaults().applyTo(addRefSpecAdvanced); addRefSpecAdvanced.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (new WizardDialog(getShell(), new RefSpecWizard(repository, config, true)).open() == Window.OK) updateControls(); } }); specViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { IStructuredSelection sel = (IStructuredSelection) specViewer.getSelection(); copySpec.setEnabled(sel.size() == 1); changeRefSpec.setEnabled(sel.size() == 1); deleteRefSpec.setEnabled(!sel.isEmpty()); } }); applyDialogFont(main); return main; } @Override protected void createButtonsForButtonBar(Composite parent) { createButton(parent, IDialogConstants.OK_ID, UIText.SimpleConfigurePushDialog_SaveAndPushButton, true); createButton(parent, SAVE_ONLY, UIText.SimpleConfigurePushDialog_SaveButton, false); createButton(parent, DRY_RUN, UIText.SimpleConfigurePushDialog_DryRunButton, false); createButton(parent, REVERT, UIText.SimpleConfigurePushDialog_RevertButton, false); createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); } @Override public void create() { super.create(); setTitle(NLS.bind(UIText.SimpleConfigurePushDialog_DialogTitle, config.getName())); setMessage(UIText.SimpleConfigurePushDialog_DialogMessage); updateControls(); } private void updateControls() { boolean anyFetchUri = !config.getURIs().isEmpty(); boolean anyPushUri = !config.getPushURIs().isEmpty(); boolean anyUri = anyFetchUri || anyPushUri; setErrorMessage(null); if (!anyUri) setErrorMessage(UIText.SimpleConfigurePushDialog_MissingUriMessage); if (anyFetchUri) commonUriText.setText(config.getURIs().get(0).toPrivateString()); else commonUriText.setText(""); //$NON-NLS-1$ uriViewer.getTable().setEnabled(anyPushUri); if (anyPushUri) uriViewer.setInput(config.getPushURIs()); else if (anyFetchUri) uriViewer.setInput(new String[] { NLS.bind(UIText.SimpleConfigurePushDialog_UseUriForPushUriMessage, commonUriText.getText()) }); else uriViewer.setInput(null); if (config.getPushRefSpecs().isEmpty()) specViewer.setInput(new String[] { UIText.SimpleConfigurePushDialog_DefaultPushNoRefspec }); else specViewer.setInput(config.getPushRefSpecs()); specViewer.getTable().setEnabled(!config.getPushRefSpecs().isEmpty()); addRefSpec.setEnabled(anyUri); addRefSpecAdvanced.setEnabled(anyUri); changeCommonUri.setEnabled(!anyPushUri); deleteCommonUri.setEnabled(!anyPushUri && anyUri); commonUriText.setEnabled(!anyPushUri); getButton(OK).setEnabled(anyUri); getButton(DRY_RUN).setEnabled(anyUri); getButton(SAVE_ONLY).setEnabled(anyUri); } @Override protected void configureShell(Shell newShell) { super.configureShell(newShell); newShell.setText(UIText.SimpleConfigurePushDialog_WindowTitle); } @Override public void buttonPressed(int buttonId) { if (buttonId == DRY_RUN) { try { new ProgressMonitorDialog(getShell()).run(false, true, new IRunnableWithProgress() { public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { int timeout = Activator.getDefault().getPreferenceStore() .getInt(UIPreferences.REMOTE_CONNECTION_TIMEOUT); PushOperationUI op = new PushOperationUI(repository, config, timeout, true); try { PushOperationResult result = op.execute(monitor); PushResultDialog dlg = new PushResultDialog(getShell(), repository, result, op.getDestinationString()); dlg.showConfigureButton(false); dlg.open(); } catch (CoreException e) { Activator.handleError(e.getMessage(), e, true); } } }); } catch (InvocationTargetException e1) { Activator.handleError(e1.getMessage(), e1, true); } catch (InterruptedException e1) { // ignore here } return; } if (buttonId == REVERT) { try { config = new RemoteConfig(repository.getConfig(), config.getName()); updateControls(); } catch (URISyntaxException e) { Activator.handleError(e.getMessage(), e, true); } return; } if (buttonId == OK || buttonId == SAVE_ONLY) { config.update(repository.getConfig()); try { repository.getConfig().save(); } catch (IOException e) { Activator.handleError(e.getMessage(), e, true); } if (buttonId == OK) try { new ProgressMonitorDialog(getShell()).run(false, true, new IRunnableWithProgress() { public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { int timeout = Activator.getDefault().getPreferenceStore() .getInt(UIPreferences.REMOTE_CONNECTION_TIMEOUT); PushOperationUI op = new PushOperationUI(repository, config.getName(), timeout, false); op.start(); } }); } catch (InvocationTargetException e) { Activator.handleError(e.getMessage(), e, true); } catch (InterruptedException e) { Activator.handleError(e.getMessage(), e, true); } okPressed(); return; } super.buttonPressed(buttonId); } private void doPaste() { Clipboard clipboard = new Clipboard(getShell().getDisplay()); try { String content = (String) clipboard.getContents(TextTransfer.getInstance()); if (content == null) MessageDialog.openConfirm(getShell(), UIText.SimpleConfigurePushDialog_EmptyClipboardDialogTitle, UIText.SimpleConfigurePushDialog_EmptyClipboardDialogMessage); try { RefSpec spec = new RefSpec(content); Ref source; try { // TODO better checks for wild-cards and such source = repository.getRef(spec.getSource()); } catch (IOException e1) { source = null; } if (source != null || MessageDialog.openQuestion(getShell(), UIText.SimpleConfigurePushDialog_InvalidRefDialogTitle, NLS.bind(UIText.SimpleConfigurePushDialog_InvalidRefDialogMessage, spec.toString()))) config.addPushRefSpec(spec); updateControls(); } catch (IllegalArgumentException ex) { MessageDialog.openError(getShell(), UIText.SimpleConfigurePushDialog_NoRefSpecDialogTitle, UIText.SimpleConfigurePushDialog_NoRefSpecDialogMessage); } } finally { clipboard.dispose(); } } /** * Add a warning about this remote being used by other branches * * @param parent */ private void addDefaultOriginWarningIfNeeded(Composite parent) { if (!showBranchInfo) return; List<String> otherBranches = new ArrayList<String>(); String currentBranch; try { currentBranch = repository.getBranch(); } catch (IOException e) { // just don't show this warning return; } String currentRemote = config.getName(); Config repositoryConfig = repository.getConfig(); Set<String> branches = repositoryConfig.getSubsections(ConfigConstants.CONFIG_BRANCH_SECTION); for (String branch : branches) { if (branch.equals(currentBranch)) continue; String remote = repositoryConfig.getString(ConfigConstants.CONFIG_BRANCH_SECTION, branch, ConfigConstants.CONFIG_KEY_REMOTE); if ((remote == null && currentRemote.equals(Constants.DEFAULT_REMOTE_NAME)) || (remote != null && remote.equals(currentRemote))) otherBranches.add(branch); } if (otherBranches.isEmpty()) return; Composite warningAboutOrigin = new Composite(parent, SWT.NONE); warningAboutOrigin.setLayout(new GridLayout(2, false)); Label warningLabel = new Label(warningAboutOrigin, SWT.NONE); warningLabel .setImage(PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_WARN_TSK)); Text warningText = new Text(warningAboutOrigin, SWT.READ_ONLY); warningText.setText(NLS.bind(UIText.SimpleConfigurePushDialog_ReusedOriginWarning, config.getName(), Integer.valueOf(otherBranches.size()))); warningText.setToolTipText(otherBranches.toString()); GridDataFactory.fillDefaults().grab(true, false).applyTo(warningLabel); } }