blob: 8859663e017834070f05308eff072a5c5f4c9f17 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2017 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.team.internal.ui.mapping;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.compare.internal.patch.WorkspacePatcher;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.resource.StringConverter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
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.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.team.internal.ui.TeamUIMessages;
import org.eclipse.ui.PlatformUI;
public class FuzzFactorDialog extends Dialog {
private Text valueText;
private Text errorMessageText;
private WorkspacePatcher patcher;
private int fuzzFactor;
public FuzzFactorDialog(Shell parentShell, WorkspacePatcher patcher) {
super(parentShell);
this.patcher = patcher;
}
public int getFuzzFactor() {
return fuzzFactor;
}
@Override
protected Control createDialogArea(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(2, false);
layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
composite.setLayout(layout);
composite.setLayoutData(new GridData(GridData.FILL_BOTH));
applyDialogFont(composite);
Label label = new Label(composite, SWT.WRAP);
label.setText(TeamUIMessages.FuzzFactorDialog_message);
GridData data = new GridData();
data.horizontalSpan = 2;
label.setLayoutData(data);
label.setFont(parent.getFont());
valueText = new Text(composite, SWT.SINGLE | SWT.BORDER);
data = new GridData(GridData.GRAB_HORIZONTAL
| GridData.HORIZONTAL_ALIGN_FILL);
data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH);
valueText.setLayoutData(data);
valueText.addModifyListener(e -> validateInput());
fuzzFactor = patcher.getFuzz();
if (fuzzFactor >= 0)
valueText.setText(Integer.valueOf(fuzzFactor).toString());
Button guessButton = new Button(composite, SWT.NONE);
guessButton.setText(TeamUIMessages.FuzzFactorDialog_guess);
data = new GridData();
int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
Point minSize = guessButton.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
data.widthHint = Math.max(widthHint, minSize.x);
guessButton.setLayoutData(data);
guessButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
patcher.setFuzz(-1);
int fuzz = guessFuzzFactor();
if (fuzz >= 0) {
String value = Integer.valueOf(fuzz).toString();
valueText.setText(value);
}
}
});
errorMessageText = new Text(composite, SWT.READ_ONLY | SWT.WRAP);
errorMessageText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
| GridData.HORIZONTAL_ALIGN_FILL));
errorMessageText.setBackground(errorMessageText.getDisplay()
.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
validateInput();
applyDialogFont(composite);
return composite;
}
private void validateInput() {
String message = null;
String value = valueText.getText();
try {
fuzzFactor = Integer.parseInt(value);
if (fuzzFactor < 0)
message = TeamUIMessages.FuzzFactorDialog_numberOutOfRange;
} catch (NumberFormatException x) {
message = TeamUIMessages.FuzzFactorDialog_notANumber;
}
setErrorMessage(message);
}
private void setErrorMessage(String errorMessage) {
if (errorMessageText != null && !errorMessageText.isDisposed()) {
errorMessageText.setText(errorMessage == null ? " \n " //$NON-NLS-1$
: errorMessage);
boolean hasError = errorMessage != null
&& (StringConverter.removeWhiteSpaces(errorMessage))
.length() > 0;
errorMessageText.setEnabled(hasError);
errorMessageText.setVisible(hasError);
errorMessageText.getParent().update();
Control button = getButton(IDialogConstants.OK_ID);
if (button != null) {
button.setEnabled(errorMessage == null);
}
}
}
@Override
protected void configureShell(Shell shell) {
super.configureShell(shell);
shell.setText(TeamUIMessages.FuzzFactorDialog_title);
}
private int guessFuzzFactor() {
final int[] result = new int[] { -1 };
try {
PlatformUI.getWorkbench().getProgressService().run(true, true,
monitor -> result[0] = patcher.guessFuzzFactor(monitor));
} catch (InvocationTargetException ex) {
// NeedWork
} catch (InterruptedException ex) {
// NeedWork
}
return result[0];
}
}