SandboxCodeTabPage.java

/*******************************************************************************
 * Copyright (c) 2025 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 - initial API and implementation
 *******************************************************************************/
package org.sandbox.jdt.internal.ui.preferences.cleanup;

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.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.sandbox.jdt.internal.corext.fix2.MYCleanUpConstants;
import org.sandbox.jdt.internal.ui.fix.HintFileCleanUp;
import org.sandbox.jdt.internal.ui.fix.MissingHashCodeCleanUp;
import org.sandbox.jdt.internal.ui.fix.ObsoleteCollectionCleanUp;
import org.sandbox.jdt.internal.ui.fix.OverridableCallInConstructorCleanUp;
import org.sandbox.jdt.internal.ui.fix.PrintStackTraceCleanUp;
import org.sandbox.jdt.internal.ui.fix.ShiftOutOfRangeCleanUp;
import org.sandbox.jdt.internal.ui.fix.StringSimplificationCleanUp;
import org.sandbox.jdt.internal.ui.fix.SystemOutCleanUp;
import org.sandbox.jdt.internal.ui.fix.ThreadingCleanUp;
import org.sandbox.jdt.internal.ui.fix.WrongStringComparisonCleanUp;

/**
 * Preference tab page for TriggerPattern-based cleanup options
 * (string simplification, threading, etc.).
 * (string simplification, shift out of range, etc.).
 * 
 * @since 1.2.2
 */
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.trigger"; //$NON-NLS-1$
	
	@Override
	protected AbstractCleanUp[] createPreviewCleanUps(Map<String, String> values) {
		return new AbstractCleanUp[] {
				// Group 1: Code Transformations
				new StringSimplificationCleanUp(values),
				new WrongStringComparisonCleanUp(values),
				new ShiftOutOfRangeCleanUp(values),
				// Group 2: Threading
				new ThreadingCleanUp(values),
				// Group 3: Code Quality Hints
				new PrintStackTraceCleanUp(values),
				new SystemOutCleanUp(values),
				new ObsoleteCollectionCleanUp(values),
				new MissingHashCodeCleanUp(values),
				new OverridableCallInConstructorCleanUp(values),
				// Group 4: Declarative Transformations
				new HintFileCleanUp(values)
		};
	}
	
	@Override
	protected void doCreatePreferences(Composite composite, int numColumns) {
		// ── Group 1: Code Transformations ──
		Group transformGroup = createGroup(numColumns, composite, CleanUpMessages.StringSimplificationTabPage_GroupName);
		final CheckboxPreference stringSimplification = createCheckboxPref(transformGroup, numColumns,
				CleanUpMessages.StringSimplificationTabPage_CheckboxName_StringSimplification,
				MYCleanUpConstants.TRIGGERPATTERN_STRING_SIMPLIFICATION_CLEANUP, FALSE_TRUE);
		intent(transformGroup);
		final CheckboxPreference wrongStringComparison = createCheckboxPref(transformGroup, numColumns,
				CleanUpMessages.WrongStringComparisonTabPage_CheckboxName,
				MYCleanUpConstants.WRONG_STRING_COMPARISON_CLEANUP, FALSE_TRUE);
		intent(transformGroup);
		final CheckboxPreference shiftOutOfRange = createCheckboxPref(transformGroup, numColumns,
				CleanUpMessages.ShiftOutOfRangeTabPage_CheckboxName_ShiftOutOfRange,
				MYCleanUpConstants.SHIFT_OUT_OF_RANGE_CLEANUP, FALSE_TRUE);
		intent(transformGroup);
		registerPreference(stringSimplification);
		registerPreference(wrongStringComparison);
		registerPreference(shiftOutOfRange);

		// ── Group 2: Threading ──
		Group threadingGroup = createGroup(numColumns, composite, CleanUpMessages.ThreadingTabPage_GroupName);
		final CheckboxPreference threading = createCheckboxPref(threadingGroup, numColumns,
				CleanUpMessages.ThreadingTabPage_CheckboxName_Threading,
				MYCleanUpConstants.TRIGGERPATTERN_THREADING_CLEANUP, FALSE_TRUE);
		intent(threadingGroup);
		registerPreference(threading);

		// ── Group 3: Code Quality Hints (detection only, no code changes) ──
		Group hintsGroup = createGroup(numColumns, composite, CleanUpMessages.PrintStackTraceTabPage_GroupName);
		final CheckboxPreference printStackTrace = createCheckboxPref(hintsGroup, numColumns,
				CleanUpMessages.PrintStackTraceTabPage_CheckboxName,
				MYCleanUpConstants.PRINT_STACKTRACE_CLEANUP, FALSE_TRUE);
		intent(hintsGroup);
		final CheckboxPreference systemOut = createCheckboxPref(hintsGroup, numColumns,
				CleanUpMessages.SystemOutTabPage_CheckboxName,
				MYCleanUpConstants.SYSTEM_OUT_CLEANUP, FALSE_TRUE);
		intent(hintsGroup);
		final CheckboxPreference obsoleteCollection = createCheckboxPref(hintsGroup, numColumns,
				CleanUpMessages.ObsoleteCollectionTabPage_CheckboxName,
				MYCleanUpConstants.OBSOLETE_COLLECTION_CLEANUP, FALSE_TRUE);
		intent(hintsGroup);
		final CheckboxPreference missingHashCode = createCheckboxPref(hintsGroup, numColumns,
				CleanUpMessages.MissingHashCodeTabPage_CheckboxName,
				MYCleanUpConstants.MISSING_HASHCODE_CLEANUP, FALSE_TRUE);
		intent(hintsGroup);
		final CheckboxPreference overridableInConstructor = createCheckboxPref(hintsGroup, numColumns,
				CleanUpMessages.OverridableCallInConstructorTabPage_CheckboxName,
				MYCleanUpConstants.OVERRIDABLE_IN_CONSTRUCTOR_CLEANUP, FALSE_TRUE);
		intent(hintsGroup);
		registerPreference(printStackTrace);
		registerPreference(systemOut);
		registerPreference(obsoleteCollection);
		registerPreference(missingHashCode);
		registerPreference(overridableInConstructor);

		// ── Group 4: Declarative Transformations (.sandbox-hint files) ──
		Group hintFileGroup = createGroup(numColumns, composite, CleanUpMessages.HintFileTabPage_GroupName);
		final CheckboxPreference hintFile = createCheckboxPref(hintFileGroup, numColumns,
				CleanUpMessages.HintFileTabPage_CheckboxName_HintFile,
				MYCleanUpConstants.HINTFILE_CLEANUP, FALSE_TRUE);
		intent(hintFileGroup);
		final CheckboxPreference bundleCollections = createCheckboxPref(hintFileGroup, numColumns,
				CleanUpMessages.HintFileTabPage_CheckboxName_BundleCollections,
				MYCleanUpConstants.HINTFILE_BUNDLE_COLLECTIONS, FALSE_TRUE);
		intent(hintFileGroup);
		final CheckboxPreference bundlePerformance = createCheckboxPref(hintFileGroup, numColumns,
				CleanUpMessages.HintFileTabPage_CheckboxName_BundlePerformance,
				MYCleanUpConstants.HINTFILE_BUNDLE_PERFORMANCE, FALSE_TRUE);
		intent(hintFileGroup);
		final CheckboxPreference bundleModernizeJava9 = createCheckboxPref(hintFileGroup, numColumns,
				CleanUpMessages.HintFileTabPage_CheckboxName_BundleModernizeJava9,
				MYCleanUpConstants.HINTFILE_BUNDLE_MODERNIZE_JAVA9, FALSE_TRUE);
		intent(hintFileGroup);
		final CheckboxPreference bundleModernizeJava11 = createCheckboxPref(hintFileGroup, numColumns,
				CleanUpMessages.HintFileTabPage_CheckboxName_BundleModernizeJava11,
				MYCleanUpConstants.HINTFILE_BUNDLE_MODERNIZE_JAVA11, FALSE_TRUE);
		intent(hintFileGroup);
		final CheckboxPreference bundleEncoding = createCheckboxPref(hintFileGroup, numColumns,
				CleanUpMessages.HintFileTabPage_CheckboxName_BundleEncoding,
				MYCleanUpConstants.HINTFILE_BUNDLE_ENCODING, FALSE_TRUE);
		intent(hintFileGroup);
		final CheckboxPreference bundleJunit5 = createCheckboxPref(hintFileGroup, numColumns,
				CleanUpMessages.HintFileTabPage_CheckboxName_BundleJunit5,
				MYCleanUpConstants.HINTFILE_BUNDLE_JUNIT5, FALSE_TRUE);
		intent(hintFileGroup);
		final CheckboxPreference bundleStreamPerformance = createCheckboxPref(hintFileGroup, numColumns,
				CleanUpMessages.HintFileTabPage_CheckboxName_BundleStreamPerformance,
				MYCleanUpConstants.HINTFILE_BUNDLE_STREAM_PERFORMANCE, FALSE_TRUE);
		intent(hintFileGroup);
		final CheckboxPreference bundleIoPerformance = createCheckboxPref(hintFileGroup, numColumns,
				CleanUpMessages.HintFileTabPage_CheckboxName_BundleIoPerformance,
				MYCleanUpConstants.HINTFILE_BUNDLE_IO_PERFORMANCE, FALSE_TRUE);
		intent(hintFileGroup);
		final CheckboxPreference bundleCollectionPerformance = createCheckboxPref(hintFileGroup, numColumns,
				CleanUpMessages.HintFileTabPage_CheckboxName_BundleCollectionPerformance,
				MYCleanUpConstants.HINTFILE_BUNDLE_COLLECTION_PERFORMANCE, FALSE_TRUE);
		intent(hintFileGroup);
		final CheckboxPreference bundleNumberCompare = createCheckboxPref(hintFileGroup, numColumns,
				CleanUpMessages.HintFileTabPage_CheckboxName_BundleNumberCompare,
				MYCleanUpConstants.HINTFILE_BUNDLE_NUMBER_COMPARE, FALSE_TRUE);
		intent(hintFileGroup);
		final CheckboxPreference bundleStringEquals = createCheckboxPref(hintFileGroup, numColumns,
				CleanUpMessages.HintFileTabPage_CheckboxName_BundleStringEquals,
				MYCleanUpConstants.HINTFILE_BUNDLE_STRING_EQUALS, FALSE_TRUE);
		intent(hintFileGroup);
		final CheckboxPreference bundleStringIsblank = createCheckboxPref(hintFileGroup, numColumns,
				CleanUpMessages.HintFileTabPage_CheckboxName_BundleStringIsblank,
				MYCleanUpConstants.HINTFILE_BUNDLE_STRING_ISBLANK, FALSE_TRUE);
		intent(hintFileGroup);
		final CheckboxPreference bundleArrays = createCheckboxPref(hintFileGroup, numColumns,
				CleanUpMessages.HintFileTabPage_CheckboxName_BundleArrays,
				MYCleanUpConstants.HINTFILE_BUNDLE_ARRAYS, FALSE_TRUE);
		intent(hintFileGroup);
		final CheckboxPreference bundleCollectionToarray = createCheckboxPref(hintFileGroup, numColumns,
				CleanUpMessages.HintFileTabPage_CheckboxName_BundleCollectionToarray,
				MYCleanUpConstants.HINTFILE_BUNDLE_COLLECTION_TOARRAY, FALSE_TRUE);
		intent(hintFileGroup);
		final CheckboxPreference bundleProbableBugs = createCheckboxPref(hintFileGroup, numColumns,
				CleanUpMessages.HintFileTabPage_CheckboxName_BundleProbableBugs,
				MYCleanUpConstants.HINTFILE_BUNDLE_PROBABLE_BUGS, FALSE_TRUE);
		intent(hintFileGroup);
		final CheckboxPreference bundleMisc = createCheckboxPref(hintFileGroup, numColumns,
				CleanUpMessages.HintFileTabPage_CheckboxName_BundleMisc,
				MYCleanUpConstants.HINTFILE_BUNDLE_MISC, FALSE_TRUE);
		intent(hintFileGroup);
		final CheckboxPreference bundleDeprecations = createCheckboxPref(hintFileGroup, numColumns,
				CleanUpMessages.HintFileTabPage_CheckboxName_BundleDeprecations,
				MYCleanUpConstants.HINTFILE_BUNDLE_DEPRECATIONS, FALSE_TRUE);
		intent(hintFileGroup);
		final CheckboxPreference bundleClassfileApi = createCheckboxPref(hintFileGroup, numColumns,
				CleanUpMessages.HintFileTabPage_CheckboxName_BundleClassfileApi,
				MYCleanUpConstants.HINTFILE_BUNDLE_CLASSFILE_API, FALSE_TRUE);
		intent(hintFileGroup);
		final CheckboxPreference bundleSerialization = createCheckboxPref(hintFileGroup, numColumns,
				CleanUpMessages.HintFileTabPage_CheckboxName_BundleSerialization,
				MYCleanUpConstants.HINTFILE_BUNDLE_SERIALIZATION, FALSE_TRUE);
		intent(hintFileGroup);
		registerSlavePreference(hintFile, new CheckboxPreference[] {
				bundleCollections, bundlePerformance,
				bundleModernizeJava9, bundleModernizeJava11,
				bundleEncoding, bundleJunit5,
				bundleStreamPerformance, bundleIoPerformance,
				bundleCollectionPerformance, bundleNumberCompare,
				bundleStringEquals, bundleStringIsblank,
				bundleArrays, bundleCollectionToarray,
				bundleProbableBugs, bundleMisc,
				bundleDeprecations, bundleClassfileApi,
				bundleSerialization
		});
		registerPreference(hintFile);
	}
}