/******************************************************************************* * Copyright (c) 2010 György Orosz. * 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: * György Orosz - initial API and implementation ******************************************************************************/ package org.erlide.wrangler.refactoring.duplicatedcode.ui; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; 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.erlide.wrangler.refactoring.ui.AbstractInputDialog; /** * Input dialog for getting input for the similar code detection refactorings * * @author Gyorgy Orosz * */ public class SimilarCodeDetectionInputDialog extends AbstractInputDialog { private Button onlyInFileCheckBoxButton; private Text minLenText; private Text minFreqText; private Text minToksText; private Text maxNewVarsText; private int minLen; private int minFreq; private int minToks; private int maxNewVars; private float simScore; private boolean workOnlyInCurrentFile = true; private Text simScoreText; /** * Constructor * * @param parentShell * SWT shell * @param title * dialog title */ public SimilarCodeDetectionInputDialog(final Shell parentShell, final String title) { super(parentShell, title); } @Override protected void validateInput() { String errorMsg = null; workOnlyInCurrentFile = !onlyInFileCheckBoxButton.getSelection(); try { simScore = Float.parseFloat(simScoreText.getText()); minLen = Integer.parseInt(minLenText.getText()); minFreq = Integer.parseInt(minFreqText.getText()); minToks = Integer.parseInt(minToksText.getText()); maxNewVars = Integer.parseInt(maxNewVarsText.getText()); setErrorMessage(null); } catch (final Exception e) { errorMsg = "Please type correct values!"; setErrorMessage(errorMsg); } } @Override protected Control createDialogArea(final Composite parent) { final Composite composite = (Composite) super.createDialogArea(parent); final Label minLenlabel = new Label(composite, SWT.WRAP); minLenlabel.setText("Minimum lenght of an expression sequence:"); final GridData minLenData = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_CENTER); minLenData.widthHint = convertHorizontalDLUsToPixels( IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH); minLenlabel.setLayoutData(minLenData); minLenlabel.setFont(parent.getFont()); minLenText = new Text(composite, getInputTextStyle()); minLenText.setLayoutData( new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL)); minLenText.setText("5"); minLenText.addModifyListener(new ModifyListener() { @Override public void modifyText(final ModifyEvent e) { validateInput(); } }); final Label minTokslabel = new Label(composite, SWT.WRAP); minTokslabel.setText("Minimum number of tokens a clone should have:"); final GridData minToksData = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_CENTER); minToksData.widthHint = convertHorizontalDLUsToPixels( IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH); minTokslabel.setLayoutData(minToksData); minTokslabel.setFont(parent.getFont()); minToksText = new Text(composite, getInputTextStyle()); minToksText.setLayoutData( new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL)); minToksText.setText("40"); minToksText.addModifyListener(new ModifyListener() { @Override public void modifyText(final ModifyEvent e) { validateInput(); } }); final Label minFreqLabel = new Label(composite, SWT.WRAP); minFreqLabel.setText("Minimum number appearance times:"); final GridData minFreqData = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_CENTER); minFreqData.widthHint = convertHorizontalDLUsToPixels( IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH); minFreqLabel.setLayoutData(minFreqData); minFreqLabel.setFont(parent.getFont()); minFreqText = new Text(composite, getInputTextStyle()); minFreqText.setLayoutData( new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL)); minFreqText.setText("2"); minFreqText.addModifyListener(new ModifyListener() { @Override public void modifyText(final ModifyEvent e) { validateInput(); } }); final Label maxNewVarsLabel = new Label(composite, SWT.WRAP); maxNewVarsLabel.setText( "Maximum number of new parameters of the least-general abstraction:"); final GridData maxNewVarsData = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_CENTER); maxNewVarsData.widthHint = convertHorizontalDLUsToPixels( IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH); maxNewVarsLabel.setLayoutData(maxNewVarsData); maxNewVarsLabel.setFont(parent.getFont()); maxNewVarsText = new Text(composite, getInputTextStyle()); maxNewVarsText.setLayoutData( new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL)); maxNewVarsText.setText("4"); maxNewVarsText.addModifyListener(new ModifyListener() { @Override public void modifyText(final ModifyEvent e) { validateInput(); } }); final Label simScoreLabel = new Label(composite, SWT.WRAP); simScoreLabel.setText("Similarity score (between 0.1 and 1.0):"); final GridData simScoreData = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_CENTER); simScoreData.widthHint = convertHorizontalDLUsToPixels( IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH); simScoreLabel.setLayoutData(simScoreData); simScoreLabel.setFont(parent.getFont()); simScoreText = new Text(composite, getInputTextStyle()); simScoreText.setLayoutData( new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL)); simScoreText.setText("0.8"); simScoreText.addModifyListener(new ModifyListener() { @Override public void modifyText(final ModifyEvent e) { validateInput(); } }); onlyInFileCheckBoxButton = new Button(composite, SWT.CHECK); onlyInFileCheckBoxButton.setText("Detect similar code snippets in the project"); onlyInFileCheckBoxButton.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_CENTER)); onlyInFileCheckBoxButton.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(final SelectionEvent e) { validateInput(); } @Override public void widgetDefaultSelected(final SelectionEvent e) { validateInput(); } }); 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)); setErrorMessage(""); applyDialogFont(composite); validateInput(); return composite; } /* * protected Spinner createValueSpinner(Composite parent, int min, int max, * int digits, int value) { Spinner ret = new Spinner(parent, SWT.BORDER); * ret.setMinimum(min); ret.setMaximum(max); ret.setDigits(digits); * ret.setSelection(value); * * GridData gd = new GridData(); gd.verticalIndent = 2; * gd.horizontalAlignment = SWT.RIGHT; gd.grabExcessHorizontalSpace = true; * ret.setLayoutData(gd); * * return ret; } */ /** * Returns the user typed similarity score. * * @return similarity scores */ public double getSimScore() { return simScore; } /** * Returns the user typed minimal length * * @return minimal length */ public int getMinLen() { return minLen; } /** * * @return minimal number of tokens */ public int getMinToks() { return minToks; } /** * * @return maximal number of new variables */ public int getMaxNewVars() { return maxNewVars; } /** * Returns the user types minimal frequency value * * @return minimal frequency value */ public int getMinFreq() { return minFreq; } /** * Returns the value of the checkbox 'run refactoring in only current * module' * * @return true if the refactoring should run only in the current module */ public boolean onlyinFile() { return workOnlyInCurrentFile; } }