CleanupPreferencePage.java
package com.codeaffine.extras.launch.internal.cleanup;
import java.util.stream.Stream;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunchConfigurationType;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.LayoutConstants;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
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.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.model.WorkbenchViewerComparator;
public class CleanupPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
public static final String ID = "com.codeaffine.extras.launch.internal.cleanup.CleanupPreferencePage";
private final ILaunchManager launchManager;
private final LaunchPreferences launchPreferences;
Button cleanupButton;
Label cleanupTypesLabel;
CheckboxTableViewer cleanupTypesViewer;
Button selectAllButton;
Button deselectAllButton;
private Label notelabel;
public CleanupPreferencePage() {
this( LaunchPreferences.getPluginPreferenceStore() );
}
public CleanupPreferencePage( IPreferenceStore preferenceStore ) {
super( "Clean Up" );
setPreferenceStore( preferenceStore );
launchManager = DebugPlugin.getDefault().getLaunchManager();
launchPreferences = new LaunchPreferences( getPreferenceStore() );
}
@Override
public void init( IWorkbench workbench ) {
}
@Override
protected Control createContents( Composite parent ) {
Composite composite = new Composite( parent, SWT.NONE );
createPageControls( composite );
layoutPageControls( composite );
initPageControls();
return composite;
}
@Override
protected void performDefaults() {
cleanupButton.setSelection( false );
cleanupTypesViewer.setAllChecked( false );
super.performDefaults();
}
@Override
public boolean performOk() {
ILaunchConfigurationType[] types = getCheckedLaunchConfigTypes();
String serializedTypeIds = new LaunchConfigTypeSerializer( launchManager ).serialize( types );
launchPreferences.setCleanupGenerateLaunchConfigTypes( serializedTypeIds );
return super.performOk();
}
private void createPageControls( Composite parent ) {
cleanupButton = new Button( parent, SWT.CHECK );
cleanupButton.setText( "Remove on-the-fly generated launch configurations when no longer needed" );
cleanupButton.addListener( SWT.Selection, this::cleanupButtonSelected );
cleanupTypesLabel = new Label( parent, SWT.NONE );
cleanupTypesLabel.setText( "Select the launch configuration types to clean up" );
cleanupTypesViewer = CheckboxTableViewer.newCheckList( parent, SWT.BORDER );
cleanupTypesViewer.setLabelProvider( DebugUITools.newDebugModelPresentation() );
cleanupTypesViewer.setContentProvider( ArrayContentProvider.getInstance() );
cleanupTypesViewer.setComparator( new WorkbenchViewerComparator() );
cleanupTypesViewer.addFilter( new LaunchConfigTypeFilter() );
cleanupTypesViewer.setInput( launchManager.getLaunchConfigurationTypes() );
selectAllButton = new Button( parent, SWT.PUSH );
selectAllButton.addListener( SWT.Selection, event -> cleanupTypesViewer.setAllChecked( true ) );
selectAllButton.setText( "&Select All" );
deselectAllButton = new Button( parent, SWT.PUSH );
deselectAllButton.setText( "&Deselect All" );
deselectAllButton.addListener( SWT.Selection, event -> cleanupTypesViewer.setAllChecked( false ) );
notelabel = new Label( parent, SWT.WRAP );
String text
= "Note: Launch configurations are considered as on-the-fly generated if "
+ "they were created outside the Run Configurations dialog without further "
+ "manual changes. For example with Run As > JUnit Test";
notelabel.setText( text );
}
private void layoutPageControls( Composite parent ) {
parent.setLayout( new GridLayout( 2, false ) );
GridDataFactory.swtDefaults()
.align( SWT.FILL, SWT.TOP )
.grab( true, false )
.applyTo( parent );
GridDataFactory.swtDefaults()
.align( SWT.FILL, SWT.TOP )
.indent( 20, 0 )
.span( 2, 1 )
.applyTo( cleanupTypesLabel );
GridDataFactory.swtDefaults()
.align( SWT.FILL, SWT.TOP )
.indent( 20, 0 )
.hint( SWT.DEFAULT, cleanupTypesViewer.getTable().getItemHeight() * 14 )
.grab( true, false )
.span( 1, 2 )
.applyTo( cleanupTypesViewer.getControl() );
GridDataFactory.swtDefaults()
.align( SWT.FILL, SWT.TOP )
.hint( computePreferredButtonWidth( selectAllButton ), SWT.DEFAULT )
.applyTo( selectAllButton );
GridDataFactory.swtDefaults()
.align( SWT.FILL, SWT.TOP )
.hint( computePreferredButtonWidth( deselectAllButton ), SWT.DEFAULT )
.applyTo( deselectAllButton );
GridDataFactory.swtDefaults()
.align( SWT.FILL, SWT.TOP )
.hint( getTextWidth( cleanupButton.getText() ), SWT.DEFAULT )
.span( 2, 1 )
.applyTo( notelabel );
}
private static int computePreferredButtonWidth( Button button ) {
int defaultButtonWidth = getDefaultButtonWidth();
Point minSize = button.computeSize( SWT.DEFAULT, SWT.DEFAULT, true );
return Math.max( defaultButtonWidth, minSize.x );
}
private static int getDefaultButtonWidth() {
return LayoutConstants.getMinButtonSize().x;
}
private void initPageControls() {
cleanupButton.setSelection( launchPreferences.isCleanupGeneratedLaunchConfigs() );
cleanupTypesViewer.setCheckedElements( getCleanupLaunchConfigTypes() );
updateEnablement();
}
private void updateEnablement() {
boolean enabled = launchPreferences.isCleanupGeneratedLaunchConfigs();
cleanupTypesLabel.setEnabled( enabled );
cleanupTypesViewer.getControl().setEnabled( launchPreferences.isCleanupGeneratedLaunchConfigs() );
selectAllButton.setEnabled( launchPreferences.isCleanupGeneratedLaunchConfigs() );
deselectAllButton.setEnabled( launchPreferences.isCleanupGeneratedLaunchConfigs() );
}
@SuppressWarnings("unused")
private void cleanupButtonSelected( Event event ) {
launchPreferences.setCleanupGeneratedLaunchConfigs( cleanupButton.getSelection() );
updateEnablement();
}
private ILaunchConfigurationType[] getCheckedLaunchConfigTypes() {
return Stream.of( cleanupTypesViewer.getCheckedElements() )
.map( element -> ( ILaunchConfigurationType )element )
.toArray( ILaunchConfigurationType[]::new );
}
private ILaunchConfigurationType[] getCleanupLaunchConfigTypes() {
String typeIds = launchPreferences.getCleanupGenerateLaunchConfigTypes();
return new LaunchConfigTypeSerializer( launchManager ).deserialize( typeIds );
}
private int getTextWidth( String text ) {
GC gc = new GC( cleanupTypesViewer.getControl() );
try {
return gc.textExtent( text ).x;
} finally {
gc.dispose();
}
}
}