SandboxCodeTabPage.java

/*******************************************************************************
 * Copyright (c) 2021 Carsten Hammer.
 *
 * 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:
 *     Carsten Hammer
 *******************************************************************************/
package org.sandbox.jdt.internal.ui.preferences.cleanup;

/*-
 * #%L
 * Sandbox junit cleanup
 * %%
 * Copyright (C) 2024 hammer
 * %%
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 * 
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the Eclipse
 * Public License, v. 2.0 are satisfied: GNU General Public License, version 2
 * with the GNU Classpath Exception which is
 * available at https://www.gnu.org/software/classpath/license.html.
 * 
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 * #L%
 */

import java.util.Map;

import org.eclipse.jdt.internal.ui.fix.AbstractCleanUp;
import org.eclipse.jdt.internal.ui.preferences.cleanup.AbstractCleanUpTabPage;
import org.eclipse.jdt.ui.cleanup.CleanUpOptions;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.sandbox.jdt.internal.corext.fix2.MYCleanUpConstants;
import org.sandbox.jdt.internal.ui.fix.JUnitCleanUp;

public class SandboxCodeTabPage extends AbstractCleanUpTabPage {

	/**
	 * Constant array for boolean selection
	 */
	static final String[] FALSE_TRUE= { CleanUpOptions.FALSE, CleanUpOptions.TRUE };

	public static final String ID= "org.eclipse.jdt.ui.cleanup.tabpage.sandbox"; //$NON-NLS-1$

	@Override
	protected AbstractCleanUp[] createPreviewCleanUps(Map<String, String> values) {
		return new AbstractCleanUp[] { new JUnitCleanUp(values) };
	}

	@Override
	protected void doCreatePreferences(Composite composite, int numColumns) {
		Group junitGroup= createGroup(numColumns, composite, CleanUpMessages.JavaFeatureTabPage_GroupName_JUnit);
		final CheckboxPreference junitcb= createCheckboxPref(junitGroup, numColumns,
				CleanUpMessages.JavaFeatureTabPage_CheckboxName_JUNIT_CLEANUP, MYCleanUpConstants.JUNIT_CLEANUP,
				FALSE_TRUE);
		
		// Add Quick Select combo box
		intent(junitGroup);
		Label quickSelectLabel = new Label(junitGroup, SWT.NONE);
		quickSelectLabel.setText(CleanUpMessages.JavaFeatureTabPage_QuickSelect_Label);
		
		intent(junitGroup);
		final Combo quickSelectCombo = new Combo(junitGroup, SWT.READ_ONLY | SWT.DROP_DOWN);
		quickSelectCombo.setItems(new String[] {
				CleanUpMessages.JavaFeatureTabPage_QuickSelect_Empty,
				CleanUpMessages.JavaFeatureTabPage_QuickSelect_FullMigration,
				CleanUpMessages.JavaFeatureTabPage_QuickSelect_AnnotationsOnly,
				CleanUpMessages.JavaFeatureTabPage_QuickSelect_LifecycleOnly,
				CleanUpMessages.JavaFeatureTabPage_QuickSelect_AssertionsOnly,
				CleanUpMessages.JavaFeatureTabPage_QuickSelect_RulesOnly
		});
		quickSelectCombo.select(0); // Default to "(Custom)"
		GridData comboGridData = new GridData(SWT.FILL, SWT.CENTER, true, false);
		comboGridData.horizontalSpan = numColumns - 2;
		quickSelectCombo.setLayoutData(comboGridData);
		
		intent(junitGroup);
		final CheckboxPreference junit_assert= createCheckboxPref(junitGroup, numColumns-1,
				CleanUpMessages.JavaFeatureTabPage_CheckboxName_JUNIT_CLEANUP_ASSERT, MYCleanUpConstants.JUNIT_CLEANUP_4_ASSERT,
				FALSE_TRUE);
		intent(junitGroup);
		intent(junitGroup);
		final CheckboxPreference junit_assert_optimization= createCheckboxPref(junitGroup, numColumns-2,
				CleanUpMessages.JavaFeatureTabPage_CheckboxName_JUNIT_CLEANUP_ASSERT_OPTIMIZATION, MYCleanUpConstants.JUNIT_CLEANUP_4_ASSERT_OPTIMIZATION,
				FALSE_TRUE);
		intent(junitGroup);
		final CheckboxPreference junit_assume= createCheckboxPref(junitGroup, numColumns-1,
				CleanUpMessages.JavaFeatureTabPage_CheckboxName_JUNIT_CLEANUP_ASSUME, MYCleanUpConstants.JUNIT_CLEANUP_4_ASSUME,
				FALSE_TRUE);
		intent(junitGroup);
		intent(junitGroup);
		final CheckboxPreference junit_assume_optimization= createCheckboxPref(junitGroup, numColumns-2,
				CleanUpMessages.JavaFeatureTabPage_CheckboxName_JUNIT_CLEANUP_ASSUME_OPTIMIZATION, MYCleanUpConstants.JUNIT_CLEANUP_4_ASSUME_OPTIMIZATION,
				FALSE_TRUE);
		intent(junitGroup);
		final CheckboxPreference junit_ignore= createCheckboxPref(junitGroup, numColumns-1,
				CleanUpMessages.JavaFeatureTabPage_CheckboxName_JUNIT_CLEANUP_IGNORE, MYCleanUpConstants.JUNIT_CLEANUP_4_IGNORE,
				FALSE_TRUE);
		intent(junitGroup);
		final CheckboxPreference junit_test= createCheckboxPref(junitGroup, numColumns-1,
				CleanUpMessages.JavaFeatureTabPage_CheckboxName_JUNIT_CLEANUP_TEST, MYCleanUpConstants.JUNIT_CLEANUP_4_TEST,
				FALSE_TRUE);
		
		// Add Test timeout checkbox (depends on junit_test)
		intent(junitGroup);
		intent(junitGroup);
		final CheckboxPreference junit_test_timeout= createCheckboxPref(junitGroup, numColumns-2,
				CleanUpMessages.JavaFeatureTabPage_CheckboxName_JUNIT_CLEANUP_TEST_TIMEOUT, MYCleanUpConstants.JUNIT_CLEANUP_4_TEST_TIMEOUT,
				FALSE_TRUE);
		
		// Add Test expected checkbox (depends on junit_test)
		intent(junitGroup);
		intent(junitGroup);
		final CheckboxPreference junit_test_expected= createCheckboxPref(junitGroup, numColumns-2,
				CleanUpMessages.JavaFeatureTabPage_CheckboxName_JUNIT_CLEANUP_TEST_EXPECTED, MYCleanUpConstants.JUNIT_CLEANUP_4_TEST_EXPECTED,
				FALSE_TRUE);
		
		intent(junitGroup);
		final CheckboxPreference junit_before= createCheckboxPref(junitGroup, numColumns-1,
				CleanUpMessages.JavaFeatureTabPage_CheckboxName_JUNIT_CLEANUP_BEFORE, MYCleanUpConstants.JUNIT_CLEANUP_4_BEFORE,
				FALSE_TRUE);
		intent(junitGroup);
		final CheckboxPreference junit_after= createCheckboxPref(junitGroup, numColumns-1,
				CleanUpMessages.JavaFeatureTabPage_CheckboxName_JUNIT_CLEANUP_AFTER, MYCleanUpConstants.JUNIT_CLEANUP_4_AFTER,
				FALSE_TRUE);
		intent(junitGroup);
		final CheckboxPreference junit_beforeclass= createCheckboxPref(junitGroup, numColumns-1,
				CleanUpMessages.JavaFeatureTabPage_CheckboxName_JUNIT_CLEANUP_BEFORECLASS, MYCleanUpConstants.JUNIT_CLEANUP_4_BEFORECLASS,
				FALSE_TRUE);
		intent(junitGroup);
		final CheckboxPreference junit_afterclass= createCheckboxPref(junitGroup, numColumns-1,
				CleanUpMessages.JavaFeatureTabPage_CheckboxName_JUNIT_CLEANUP_AFTERCLASS, MYCleanUpConstants.JUNIT_CLEANUP_4_AFTERCLASS,
				FALSE_TRUE);
		intent(junitGroup);
		final CheckboxPreference junit_ruletempfolder= createCheckboxPref(junitGroup, numColumns-1,
				CleanUpMessages.JavaFeatureTabPage_CheckboxName_JUNIT_CLEANUP_RULETEMPORARYFOLDER, MYCleanUpConstants.JUNIT_CLEANUP_4_RULETEMPORARYFOLDER,
				FALSE_TRUE);
		intent(junitGroup);
		final CheckboxPreference junit_ruletestname= createCheckboxPref(junitGroup, numColumns-1,
				CleanUpMessages.JavaFeatureTabPage_CheckboxName_JUNIT_CLEANUP_RULETESTNAME, MYCleanUpConstants.JUNIT_CLEANUP_4_RULETESTNAME,
				FALSE_TRUE);
		intent(junitGroup);
		final CheckboxPreference junit_externalresource= createCheckboxPref(junitGroup, numColumns-1,
				CleanUpMessages.JavaFeatureTabPage_CheckboxName_JUNIT_CLEANUP_EXTERNALRESOURCE, MYCleanUpConstants.JUNIT_CLEANUP_4_EXTERNALRESOURCE,
				FALSE_TRUE);
		intent(junitGroup);
		final CheckboxPreference junit_ruleexternalresource= createCheckboxPref(junitGroup, numColumns-1,
				CleanUpMessages.JavaFeatureTabPage_CheckboxName_JUNIT_CLEANUP_RULEEXTERNALRESOURCE, MYCleanUpConstants.JUNIT_CLEANUP_4_RULEEXTERNALRESOURCE,
				FALSE_TRUE);
		intent(junitGroup);
		final CheckboxPreference junit_runwith= createCheckboxPref(junitGroup, numColumns-1,
				CleanUpMessages.JavaFeatureTabPage_CheckboxName_JUNIT_CLEANUP_RUNWITH, MYCleanUpConstants.JUNIT_CLEANUP_4_RUNWITH,
				FALSE_TRUE);
		
		// Add Suite checkbox (depends on junit_runwith)
		intent(junitGroup);
		intent(junitGroup);
		final CheckboxPreference junit_suite= createCheckboxPref(junitGroup, numColumns-2,
				CleanUpMessages.JavaFeatureTabPage_CheckboxName_JUNIT_CLEANUP_SUITE, MYCleanUpConstants.JUNIT_CLEANUP_4_SUITE,
				FALSE_TRUE);
		
		// Add Parameterized checkbox (depends on junit_runwith)
		intent(junitGroup);
		intent(junitGroup);
		final CheckboxPreference junit_parameterized= createCheckboxPref(junitGroup, numColumns-2,
				CleanUpMessages.JavaFeatureTabPage_CheckboxName_JUNIT_CLEANUP_PARAMETERIZED, MYCleanUpConstants.JUNIT_CLEANUP_4_PARAMETERIZED,
				FALSE_TRUE);
		
		// Add Category checkbox
		intent(junitGroup);
		final CheckboxPreference junit_category= createCheckboxPref(junitGroup, numColumns-1,
				CleanUpMessages.JavaFeatureTabPage_CheckboxName_JUNIT_CLEANUP_CATEGORY, MYCleanUpConstants.JUNIT_CLEANUP_4_CATEGORY,
				FALSE_TRUE);
		
		// Add FixMethodOrder checkbox
		intent(junitGroup);
		final CheckboxPreference junit_fixmethodorder= createCheckboxPref(junitGroup, numColumns-1,
				CleanUpMessages.JavaFeatureTabPage_CheckboxName_JUNIT_CLEANUP_FIX_METHOD_ORDER, MYCleanUpConstants.JUNIT_CLEANUP_4_FIX_METHOD_ORDER,
				FALSE_TRUE);
		
		// Add Rule Timeout checkbox
		intent(junitGroup);
		final CheckboxPreference junit_ruletimeout= createCheckboxPref(junitGroup, numColumns-1,
				CleanUpMessages.JavaFeatureTabPage_CheckboxName_JUNIT_CLEANUP_RULETIMEOUT, MYCleanUpConstants.JUNIT_CLEANUP_4_RULETIMEOUT,
				FALSE_TRUE);
		
		// Add Lost Tests checkbox
		intent(junitGroup);
		final CheckboxPreference junit_lost_tests= createCheckboxPref(junitGroup, numColumns-1,
				CleanUpMessages.JavaFeatureTabPage_CheckboxName_JUNIT_CLEANUP_LOST_TESTS, MYCleanUpConstants.JUNIT_CLEANUP_4_LOST_TESTS,
				FALSE_TRUE);
		
		registerSlavePreference(junitcb, new CheckboxPreference[] {
				junit_assert,
				junit_assume,
				junit_ignore,
				junit_test,
				junit_before,
				junit_after,
				junit_beforeclass,
				junit_afterclass,
				junit_ruletempfolder,
				junit_ruletestname,
				junit_ruleexternalresource,
				junit_externalresource,
				junit_ruletimeout,
				junit_runwith,
				junit_category,
				junit_fixmethodorder,
				junit_lost_tests});
		
		// Add nested dependencies for @Test parameters
		registerSlavePreference(junit_test, new CheckboxPreference[] {
				junit_test_timeout,
				junit_test_expected
		});
		
		// Add nested dependencies for assert/assume optimizations
		registerSlavePreference(junit_assert, new CheckboxPreference[] {
				junit_assert_optimization
		});
		registerSlavePreference(junit_assume, new CheckboxPreference[] {
				junit_assume_optimization
		});
		
		// Add nested dependencies for @RunWith variants
		registerSlavePreference(junit_runwith, new CheckboxPreference[] {
				junit_suite,
				junit_parameterized
		});
		
		// Add Quick Select combo selection listener
		quickSelectCombo.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				int index = quickSelectCombo.getSelectionIndex();
				applyQuickSelection(index, junitcb, junit_assert, junit_assume, junit_ignore, junit_test,
						junit_test_timeout, junit_test_expected, junit_before, junit_after, 
						junit_beforeclass, junit_afterclass, junit_ruletempfolder, junit_ruletestname,
						junit_ruleexternalresource, junit_externalresource, junit_runwith, 
						junit_suite, junit_category, junit_ruletimeout);
			}
		});
		
		intent(junitGroup);
		registerPreference(junitcb);
		
		Group junit3Group= createGroup(numColumns, composite, CleanUpMessages.JavaFeatureTabPage_GroupName_JUnit3);
		final CheckboxPreference junit3cb= createCheckboxPref(junit3Group, numColumns,
				CleanUpMessages.JavaFeatureTabPage_CheckboxName_JUNIT3_CLEANUP, MYCleanUpConstants.JUNIT3_CLEANUP,
				FALSE_TRUE);
		intent(junit3Group);
		
		final CheckboxPreference junit3_test= createCheckboxPref(junit3Group, numColumns-1,
				CleanUpMessages.JavaFeatureTabPage_CheckboxName_JUNIT3_CLEANUP_TEST, MYCleanUpConstants.JUNIT_CLEANUP_3_TEST,
				FALSE_TRUE);
		
		intent(junit3Group);
		
		
		registerSlavePreference(junit3cb, new CheckboxPreference[] {
				junit3_test
				});
		intent(junit3Group);
		registerPreference(junit3cb);
	}
	
	/**
	 * Apply a quick selection preset to the JUnit cleanup checkboxes.
	 * 
	 * @param selectionIndex The index of the selected preset (0=Custom, 1=Full Migration, 2=Annotations Only, etc.)
	 * @param junitcb Main JUnit cleanup checkbox
	 * @param junit_assert Assert checkbox
	 * @param junit_assume Assume checkbox
	 * @param junit_ignore Ignore checkbox
	 * @param junit_test Test checkbox
	 * @param junit_test_timeout Test timeout checkbox
	 * @param junit_test_expected Test expected checkbox
	 * @param junit_before Before checkbox
	 * @param junit_after After checkbox
	 * @param junit_beforeclass BeforeClass checkbox
	 * @param junit_afterclass AfterClass checkbox
	 * @param junit_ruletempfolder Rule TemporaryFolder checkbox
	 * @param junit_ruletestname Rule TestName checkbox
	 * @param junit_ruleexternalresource Rule ExternalResource checkbox
	 * @param junit_externalresource ExternalResource checkbox
	 * @param junit_runwith RunWith checkbox
	 * @param junit_suite Suite checkbox
	 * @param junit_category Category checkbox
	 * @param junit_ruletimeout Rule Timeout checkbox
	 */
	private void applyQuickSelection(int selectionIndex, CheckboxPreference junitcb,
			CheckboxPreference junit_assert, CheckboxPreference junit_assume, 
			CheckboxPreference junit_ignore, CheckboxPreference junit_test,
			CheckboxPreference junit_test_timeout, CheckboxPreference junit_test_expected,
			CheckboxPreference junit_before, CheckboxPreference junit_after,
			CheckboxPreference junit_beforeclass, CheckboxPreference junit_afterclass,
			CheckboxPreference junit_ruletempfolder, CheckboxPreference junit_ruletestname,
			CheckboxPreference junit_ruleexternalresource, CheckboxPreference junit_externalresource,
			CheckboxPreference junit_runwith, CheckboxPreference junit_suite,
			CheckboxPreference junit_category, CheckboxPreference junit_ruletimeout) {
		
		// Reset all checkboxes to unchecked first
		if (selectionIndex > 0) {
			// Enable main checkbox when any preset is selected
			junitcb.setChecked(true);
			
			// Reset all sub-options
			junit_assert.setChecked(false);
			junit_assume.setChecked(false);
			junit_ignore.setChecked(false);
			junit_test.setChecked(false);
			junit_test_timeout.setChecked(false);
			junit_test_expected.setChecked(false);
			junit_before.setChecked(false);
			junit_after.setChecked(false);
			junit_beforeclass.setChecked(false);
			junit_afterclass.setChecked(false);
			junit_ruletempfolder.setChecked(false);
			junit_ruletestname.setChecked(false);
			junit_ruleexternalresource.setChecked(false);
			junit_externalresource.setChecked(false);
			junit_runwith.setChecked(false);
			junit_suite.setChecked(false);
			junit_category.setChecked(false);
			junit_ruletimeout.setChecked(false);
		}
		
		switch (selectionIndex) {
			case 0: // Custom - do nothing
				break;
				
			case 1: // Full Migration
				junit_assert.setChecked(true);
				junit_assume.setChecked(true);
				junit_ignore.setChecked(true);
				junit_test.setChecked(true);
				junit_test_timeout.setChecked(true);
				junit_test_expected.setChecked(true);
				junit_before.setChecked(true);
				junit_after.setChecked(true);
				junit_beforeclass.setChecked(true);
				junit_afterclass.setChecked(true);
				junit_ruletempfolder.setChecked(true);
				junit_ruletestname.setChecked(true);
				junit_ruleexternalresource.setChecked(true);
				junit_externalresource.setChecked(true);
				junit_runwith.setChecked(true);
				junit_suite.setChecked(true);
				junit_category.setChecked(true);
				junit_ruletimeout.setChecked(true);
				break;
				
			case 2: // Annotations Only
				junit_test.setChecked(true);
				junit_before.setChecked(true);
				junit_after.setChecked(true);
				junit_beforeclass.setChecked(true);
				junit_afterclass.setChecked(true);
				junit_ignore.setChecked(true);
				break;
				
			case 3: // Lifecycle Only
				junit_before.setChecked(true);
				junit_after.setChecked(true);
				junit_beforeclass.setChecked(true);
				junit_afterclass.setChecked(true);
				break;
				
			case 4: // Assertions Only
				junit_assert.setChecked(true);
				break;
				
			case 5: // Rules Only
				junit_ruletempfolder.setChecked(true);
				junit_ruletestname.setChecked(true);
				junit_ruleexternalresource.setChecked(true);
				junit_externalresource.setChecked(true);
				junit_ruletimeout.setChecked(true);
				break;
				
			default:
				// Unknown selection, do nothing
				break;
		}
	}
}