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);
}
}