/*******************************************************************************
 * Copyright (c) 2000, 2006 IBM Corporation and others.
 * 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.internal.ui.fix;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;

import org.eclipse.core.resources.ResourcesPlugin;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
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.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Layout;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.wizard.IWizardPage;

import org.eclipse.jface.text.Region;
import org.eclipse.jface.text.formatter.FormattingContextProperties;
import org.eclipse.jface.text.formatter.IContentFormatter;
import org.eclipse.jface.text.formatter.IContentFormatterExtension;
import org.eclipse.jface.text.formatter.IFormattingContext;

import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.ContainerCheckedTreeViewer;

import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
import org.eclipse.ltk.ui.refactoring.UserInputWizardPage;

import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaModel;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.JavaCore;

import org.eclipse.jdt.internal.corext.fix.CleanUpRefactoring;
import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
import org.eclipse.jdt.internal.corext.util.Messages;

import org.eclipse.jdt.ui.JavaElementLabelProvider;
import org.eclipse.jdt.ui.JavaElementLabels;
import org.eclipse.jdt.ui.JavaElementSorter;
import org.eclipse.jdt.ui.StandardJavaElementContentProvider;

import org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
import org.eclipse.jdt.internal.ui.IJavaStatusConstants;
import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.JavaPluginImages;
import org.eclipse.jdt.internal.ui.preferences.formatter.JavaPreview;
import org.eclipse.jdt.internal.ui.text.comment.CommentFormattingContext;

public class CleanUpRefactoringWizard extends RefactoringWizard {
	
	private static final String CLEAN_UP_WIZARD_SETTINGS_SECTION_ID= "CleanUpWizard"; //$NON-NLS-1$
	
	private interface ISelectionChangeListener {
		void selectionChanged(ICleanUp cleanUp, int flag, boolean selection);
	}
	
	private class SelectCUPage extends UserInputWizardPage {

		private ContainerCheckedTreeViewer fTreeViewer;

		public SelectCUPage(String name) {
			super(name);
		}

		/* (non-Javadoc)
		 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
		 */
		public void createControl(Composite parent) {
			Composite composite= new Composite(parent, SWT.NONE);
			composite.setLayout(new GridLayout());
			
			createViewer(composite);
			setControl(composite);
			
			Dialog.applyDialogFont(composite);
		}
		
		private TreeViewer createViewer(Composite parent) {
			fTreeViewer= new ContainerCheckedTreeViewer(parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
			GridData gd= new GridData(GridData.FILL_BOTH);
			gd.widthHint= convertWidthInCharsToPixels(40);
			gd.heightHint= convertHeightInCharsToPixels(15);
			fTreeViewer.getTree().setLayoutData(gd);
			fTreeViewer.setLabelProvider(new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_SMALL_ICONS));
			fTreeViewer.setContentProvider(new StandardJavaElementContentProvider());
			fTreeViewer.setSorter(new JavaElementSorter());
			fTreeViewer.addFilter(new ViewerFilter() {

				public boolean select(Viewer viewer, Object parentElement, Object element) {
					if (element instanceof IJavaElement) {
						IJavaElement jElement= (IJavaElement)element;
						return !jElement.isReadOnly();
					} else {
						return false;
					}
				}
				
			});
			IJavaModel create= JavaCore.create(ResourcesPlugin.getWorkspace().getRoot());
			fTreeViewer.setInput(create);
			checkElements(fTreeViewer, (CleanUpRefactoring)getRefactoring());
			return fTreeViewer;
		}
		
		private void checkElements(CheckboxTreeViewer treeViewer, CleanUpRefactoring refactoring) {
			ICompilationUnit[] compilationUnits= refactoring.getCompilationUnits();
			for (int i= 0; i < compilationUnits.length; i++) {
				ICompilationUnit compilationUnit= compilationUnits[i];
				treeViewer.expandToLevel(compilationUnit, 0);
				treeViewer.setChecked(compilationUnit, true);
			}
			if (compilationUnits.length > 0)
				treeViewer.setSelection(new StructuredSelection(smallestCommonParents(compilationUnits)), true);
		}
		
		private IJavaElement[] smallestCommonParents(IJavaElement[] elements) {
			if (elements.length == 1) {
				return elements;
			} else {
				List parents= new ArrayList();
				boolean hasParents= false;
				
				IJavaElement parent= getParent(elements[0]);
				if (parent == null) {
					parent= elements[0];
				} else {
					hasParents= true;
				}
				parents.add(parent);
				
				for (int i= 1; i < elements.length; i++) {
					parent= getParent(elements[i]);
					if (getParent(elements[i - 1]) != parent) {
						if (parent == null) {
							parent= elements[i];
						} else {
							hasParents= true;
						}
						if (!parents.contains(parent)) {
							parents.add(parent);
						}
					}
				}
				
				IJavaElement[] parentsArray= (IJavaElement[])parents.toArray(new IJavaElement[parents.size()]);
				if (hasParents) {
					return smallestCommonParents(parentsArray);
				}
				return parentsArray;
			}
		}
		
		private IJavaElement getParent(IJavaElement element) {
			if (element instanceof ICompilationUnit) {
				return element.getParent();
			} else if (element instanceof IPackageFragment){
				return element.getParent().getParent();
			} else {
				return element.getParent();
			}
		}

		protected boolean performFinish() {
			initializeRefactoring();
			return super.performFinish();
		}
	
		public IWizardPage getNextPage() {
			initializeRefactoring();
			return super.getNextPage();
		}

		private void initializeRefactoring() {
			CleanUpRefactoring refactoring= (CleanUpRefactoring)getRefactoring();
			refactoring.clearCompilationUnits();
			Object[] checkedElements= fTreeViewer.getCheckedElements();
			for (int i= 0; i < checkedElements.length; i++) {
				if (checkedElements[i] instanceof ICompilationUnit)
					refactoring.addCompilationUnit((ICompilationUnit)checkedElements[i]);
			}
			if (!refactoring.hasCleanUps()) {
				ICleanUp[] cleanUps= createAllCleanUps();
				for (int i= 0; i < cleanUps.length; i++) {
					refactoring.addCleanUp(cleanUps[i]);
				}
			}
		}
		
		private ICleanUp[] createAllCleanUps() {
			IDialogSettings section= getCleanUpWizardSettings();
			
			ICleanUp[] result= new ICleanUp[9];
			result[0]= new CodeStyleCleanUp(section);
			result[1]= new ControlStatementsCleanUp(section);
			result[2]= new UnusedCodeCleanUp(section);
			result[3]= new Java50CleanUp(section);
			result[4]= new StringCleanUp(section);
			result[5]= new PotentialProgrammingProblemsCleanUp(section);
			result[6]= new UnnecessaryCodeCleanUp(section);
			result[7]= new ExpressionsCleanUp(section);
			result[8]= new VariableDeclarationCleanUp(section);
			
			return result;
		}
	}
	
	private class SelectCleanUpPage extends UserInputWizardPage {
		
		private class TabFolderLayout extends Layout {

			protected Point computeSize (Composite composite, int wHint, int hHint, boolean flushCache) {
				return new Point(600, 340);
			}
			
			protected void layout (Composite composite, boolean flushCache) {
				Rectangle rect= composite.getClientArea();
			
				Control[] children = composite.getChildren();
				for (int i = 0; i < children.length; i++) {
					children[i].setBounds(rect);
				}
			}
		}
		
		private class FlagConfigurationButton {
			
			private final int fFlag;
			private final ICleanUp fCleanUp;
			private final String fLabel;
			private final int fStyle;
			private Button fButton;
			private final List fSelectionChangeListeners;
			
			public FlagConfigurationButton(ICleanUp cleanUp, int flag, String label, int style) {
				fCleanUp= cleanUp;
				fFlag= flag;
				fLabel= label;
				fStyle= style;
				fSelectionChangeListeners= new ArrayList();
			}
			
			public void createButton(Composite parent) {
				fButton= new Button(parent, fStyle);
				fButton.setText(fLabel);
				fButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
				fButton.setSelection(fCleanUp.isFlag(fFlag));
				fButton.addSelectionListener(new SelectionAdapter() {
					public void widgetSelected(SelectionEvent e) {
						boolean selection= ((Button)e.getSource()).getSelection();
						fCleanUp.setFlag(fFlag, selection);
						for (Iterator iter= fSelectionChangeListeners.iterator(); iter.hasNext();) {
							ISelectionChangeListener listener= (ISelectionChangeListener)iter.next();
							listener.selectionChanged(fCleanUp, fFlag, selection);	
						}
					}
				});
			}
				
			public Button getButton() {
				return fButton;
			}
			
			public void addSelectionChangeListener(ISelectionChangeListener listener) {
				fSelectionChangeListeners.add(listener);
			}
			
			public void select() {
				fButton.setSelection(true);
			}
			
			public void deselect() {
				fButton.setSelection(false);
			}
			
			public boolean isSelected() {
				return fButton.getSelection();
			}

			public void disable() {
				fButton.setEnabled(false);
			}

			public void enable() {
				fButton.setEnabled(true);
			}

			public int getFlag() {
				return fFlag;
			}

			public ICleanUp getCleanUp() {
				return fCleanUp;
			}

			public void enableFlag() {
				if (!fCleanUp.isFlag(fFlag)) {
					internalSetFlag(true);
				}
			}
			
			public void disableFlag() {
				if (fCleanUp.isFlag(fFlag)) {
					internalSetFlag(false);
				}
			}
			
			public void enableDefault() {
				int defaultFlag= fCleanUp.getDefaultFlag();
				if ((defaultFlag & fFlag) != 0) {
					enableFlag();
				} else {
					disableFlag();
				}
			}
			
			public void selectDefault() {
				int defaultFlag= fCleanUp.getDefaultFlag();
				if ((defaultFlag & fFlag) != 0) {
					select();
				} else {
					deselect();
				}
			}

			private void internalSetFlag(boolean b) {
				fCleanUp.setFlag(fFlag, b);
				for (Iterator iter= fSelectionChangeListeners.iterator(); iter.hasNext();) {
					ISelectionChangeListener listener= (ISelectionChangeListener)iter.next();
					listener.selectionChanged(fCleanUp, fFlag, b);	
				}
			}

			public boolean isRadio() {
				return (fStyle & SWT.RADIO) != 0;
			}
		}
		
		private class FlagConfigurationGroup {

			private final String fLabel;
			private final FlagConfigurationButton[] fButtons;
			private final int fStyle;
			private int fUIFlags;
			private Button fControlButton;

			public FlagConfigurationGroup(String label, FlagConfigurationButton[] buttons, int style, IDialogSettings settings) {
				fLabel= label;
				fButtons= buttons;
				fStyle= style;
				fUIFlags= loadSettings(settings);
			}
			
			public void enableDefaults() {
				if (isDisabled())
					return;
				
				boolean hasDefaultSelection= false;
				for (int i= 0; i < fButtons.length; i++) {
					if ((fButtons[i].getCleanUp().getDefaultFlag() & fButtons[i].getFlag()) != 0) {
						hasDefaultSelection= true;
					}
				}
				if (hasDefaultSelection) {
					select();
					for (int i= 0; i < fButtons.length; i++) {
						fButtons[i].enableDefault();
						fButtons[i].selectDefault();
					}
				} else {
					deselect();
					for (int i= 0; i < fButtons.length; i++) {
						fButtons[i].disableFlag();
					}
				}
			}
			
			public void disable() {
				fControlButton.setEnabled(false);
				for (int i= 0; i < fButtons.length; i++) {
					fButtons[i].disable();
				}
			}
			
			public boolean isDisabled() {
				return !fControlButton.isEnabled();
			}
			
			public void createButton(Composite parent) {
				final boolean isVertical= (fStyle & SWT.VERTICAL) != 0;
				
				fControlButton= new Button(parent, SWT.CHECK);
				fControlButton.setText(fLabel);
				fControlButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
				
				Composite sub= new Composite(parent, SWT.NONE);
				sub.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
				GridLayout layout= new GridLayout(isVertical?1:fButtons.length, false);
				layout.marginHeight= 0;
				layout.marginWidth= 0;
				sub.setLayout(layout);
				
				for (int i= 0; i < fButtons.length; i++) {
					FlagConfigurationButton config= fButtons[i];
					config.createButton(sub);
					Button button= config.getButton();
					if (i == 0 || isVertical) {//indent
						GridData data= (GridData)button.getLayoutData();
						data.horizontalIndent= 20;
					}
					config.addSelectionChangeListener(new ISelectionChangeListener() {
						public void selectionChanged(ICleanUp cleanUp, int flag, boolean selection) {
							setFlag(flag, selection);
						}
					});
				}
				
				if (hasSelectedButtons()) {
					select();
					initUIFlags();
				} else {
					deselect();
					restoreFromUIFlags();
				}
				
				fControlButton.addSelectionListener(new SelectionAdapter() {

					public void widgetSelected(SelectionEvent e) {
						if (!((Button)e.getSource()).getSelection()) {
							deselect();
							for (int i= 0; i < fButtons.length; i++) {
								fButtons[i].disableFlag();
							}
							for (int i= 0; i < fButtons.length; i++) {
								if (fButtons[i].isSelected())
									setFlag(fButtons[i].getFlag(), true);
							}
						} else {
							select();
							for (int i= 0; i < fButtons.length; i++) {
								if (fButtons[i].isSelected())
									fButtons[i].enableFlag();
							}
						}
					}
					
				});
				
			}
			
			private void restoreFromUIFlags() {
				boolean hasCheck= false;
				for (int i= 0; i < fButtons.length; i++) {
					boolean flag= isFlag(fButtons[i].getFlag());
					if (flag) {
						if ((fStyle & SWT.CHECK) != 0) {
							fButtons[i].select();
						} else if (!hasCheck) {
							fButtons[i].select();
						}
						hasCheck= true;
					} else {
						fButtons[i].deselect();
					}
				}
				if ((fStyle & SWT.RADIO) != 0 && !hasCheck) {
					fButtons[0].select();
				}
			}

			private void initUIFlags() {
				for (int i= 0; i < fButtons.length; i++) {
					setFlag(fButtons[i].getFlag(), fButtons[i].isSelected());
				}
			}

			private void deselect() {
				fControlButton.setSelection(false);
				for (int j= 0; j < fButtons.length; j++) {
					fButtons[j].disable();
				}
			}

			private void select() {
				fControlButton.setSelection(true);
				for (int j= 0; j < fButtons.length; j++) {
					fButtons[j].enable();
				}
			}

			private boolean hasSelectedButtons() {
				for (int j= 0; j < fButtons.length; j++) {
					if (fButtons[j].getCleanUp().isFlag(fButtons[j].getFlag()))
						return true;
				}
				return false;
			}

			private void setFlag(int flag, boolean b) {
				if (!isFlag(flag) && b) {
					fUIFlags |= flag;
				} else if (isFlag(flag) && !b) {
					fUIFlags &= ~flag;
				}
			}
			
			private boolean isFlag(int flag) {
				return (fUIFlags & flag) != 0;
			}

			public void saveSettings(IDialogSettings settings) {
				String sectionName= getSectionName();
				IDialogSettings section= settings.getSection(sectionName);
				if (section == null)
					section= settings.addNewSection(sectionName);

				section.put("uiFlags", fUIFlags); //$NON-NLS-1$
			}
			
			private int loadSettings(IDialogSettings settings) {
				String sectionName= getSectionName();
				IDialogSettings section= settings.getSection(sectionName);
				if (section == null)
					return 0;
				
				return section.getInt("uiFlags"); //$NON-NLS-1$
			}
			
			private String getSectionName() {
				StringBuffer buf= new StringBuffer(fLabel);
				for (int i=buf.length()-1;i>=0;i--) {
					if (buf.charAt(i) == '&' || buf.charAt(i) == ' ')
						buf.deleteCharAt(i);
				}
				return buf.toString();
			}
		}
		
		private class CleanUpPreview extends JavaPreview {

			private final ICleanUp[] fPreviewCleanUps;
			private boolean fUpdateBlocked;

			public CleanUpPreview(Composite parent, Map map, ICleanUp[] cleanUps) {
				super(map, parent);
				fPreviewCleanUps= cleanUps;
				fUpdateBlocked= false;
			}

			/**
			 * {@inheritDoc}
			 */
			protected void doFormatPreview() {
			
				StringBuffer buf= new StringBuffer();
				for (int i= 0; i < fPreviewCleanUps.length; i++) {
					buf.append(fPreviewCleanUps[i].getPreview());
					buf.append("\n"); //$NON-NLS-1$
				}
				format(buf.toString());
			}
			
			private void format(String text) {
		        if (text == null) {
		            fPreviewDocument.set(""); //$NON-NLS-1$
		            return;
		        }
		        fPreviewDocument.set(text);
				
				fSourceViewer.setRedraw(false);
				final IFormattingContext context = new CommentFormattingContext();
				try {
					final IContentFormatter formatter =	fViewerConfiguration.getContentFormatter(fSourceViewer);
					if (formatter instanceof IContentFormatterExtension) {
						final IContentFormatterExtension extension = (IContentFormatterExtension) formatter;
						context.setProperty(FormattingContextProperties.CONTEXT_PREFERENCES, fWorkingValues);
						context.setProperty(FormattingContextProperties.CONTEXT_DOCUMENT, Boolean.valueOf(true));
						extension.format(fPreviewDocument, context);
					} else
						formatter.format(fPreviewDocument, new Region(0, fPreviewDocument.getLength()));
				} catch (Exception e) {
					final IStatus status= new Status(IStatus.ERROR, JavaPlugin.getPluginId(), IJavaStatusConstants.INTERNAL_ERROR, 
						MultiFixMessages.CleanUpRefactoringWizard_formatterException_errorMessage, e); 
					JavaPlugin.log(status);
				} finally {
				    context.dispose();
				    fSourceViewer.setRedraw(true);
				}
			}

			public void resumeUpdate() {
				fUpdateBlocked= false;
			}

			public void blockUpdate() {
				fUpdateBlocked= true;
			}

			public boolean isUpdateSuspended() {
				return fUpdateBlocked;
			}
		}
		
		private ICleanUp[] fCleanUps;
		private List fConfigurationGroups;
		private int fTotalCleanUpsCount, fSelectedCleanUpsCount;
		private Label fStatusLine;
		
		public SelectCleanUpPage(String name) {
			super(name);
			fConfigurationGroups= new ArrayList();
		}
		
		public void createControl(Composite parent) {
			Composite composite= new Composite(parent, SWT.NONE);
			composite.setLayout(new GridLayout(1, true));
			composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
			
			TabFolder tabFolder= new TabFolder(composite, SWT.NONE);
			tabFolder.setLayout(new TabFolderLayout());
			tabFolder.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
			
			fStatusLine= new Label(composite, SWT.NONE);
			fStatusLine.setLayoutData(new GridData(SWT.FILL, SWT.BOTTOM, false, false));
			
			createGroups(tabFolder);
			
			fStatusLine.setText(Messages.format(MultiFixMessages.CleanUpRefactoringWizard_statusLineText, new Object[] {new Integer(fSelectedCleanUpsCount), new Integer(fTotalCleanUpsCount)}));
			
			setControl(composite);
			Dialog.applyDialogFont(composite);

			PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, IJavaHelpContextIds.SELECT_CLEAN_UPS_PAGE);
		}
		
		private void createGroups(TabFolder parent) {
			CleanUpRefactoring refactoring= (CleanUpRefactoring)getRefactoring();
			IJavaProject[] projects= refactoring.getProjects();
			final IJavaProject project;
			if (projects.length == 1) {
				project= projects[0];
			} else {
				project= null;
			}
			
			IDialogSettings section= getCleanUpWizardSettings();
			
			fCleanUps= new ICleanUp[9];
			
			Composite codeStyleTab= createTab(parent, MultiFixMessages.CleanUpRefactoringWizard_CodeStyleSection_description);
			fillCodeStyleTab(codeStyleTab, project, section);
			
			Composite accessesTab= createTab(parent, MultiFixMessages.CleanUpRefactoringWizard_memberAccesses_sectionDescription);
			fillMemberAccessesTab(accessesTab, project, section);	
			
			Composite unnecessaryCodeTab= createTab(parent, MultiFixMessages.CleanUpRefactoringWizard_UnnecessaryCode_tabLabel);
			fillUnnecessaryCodeTab(unnecessaryCodeTab, project, section);
			
			Composite missingCodeTab= createTab(parent, MultiFixMessages.CleanUpRefactoringWizard_MissingCode_tabLabel);
			fillMissingCodeTab(missingCodeTab, project, section);
		}
		
		private Composite fillCodeStyleTab(Composite parent, final IJavaProject project, IDialogSettings settings) {
			Composite composite= new Composite(parent, SWT.NONE);
			GridLayout gridLayout= new GridLayout(2, false);
			gridLayout.marginWidth= 0;
			gridLayout.marginHeight= 0;
			composite.setLayout(gridLayout);
			composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
			
			Composite left= new Composite(composite, SWT.NONE);
			gridLayout= new GridLayout(1, false);
			gridLayout.marginWidth= 0;
			gridLayout.marginHeight= 0;
			left.setLayout(gridLayout);
			left.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true));
			
			Composite groups= new Composite(left, SWT.NONE);
			groups.setLayout(new GridLayout(1, false));
			groups.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true));
			
			//Control statements group
			ControlStatementsCleanUp controlStatementsCleanUp= new ControlStatementsCleanUp(settings);
			Composite group= createGroup(groups, MultiFixMessages.CleanUpRefactoringWizard_controlStatements_sectionDescription);
			
			FlagConfigurationButton addBlock= new FlagConfigurationButton(controlStatementsCleanUp, ControlStatementsCleanUp.ADD_BLOCK_TO_CONTROL_STATEMENTS, MultiFixMessages.ControlStatementsCleanUp_always_checkBoxLabel, SWT.RADIO);
			FlagConfigurationButton removeBlockReturn= new FlagConfigurationButton(controlStatementsCleanUp, ControlStatementsCleanUp.REMOVE_UNNECESSARY_BLOCKS_CONTAINING_RETURN_OR_THROW, MultiFixMessages.CleanUpRefactoringWizard_NoBlockForReturnOrThrow_checkBoxLabel, SWT.RADIO);
			FlagConfigurationButton removeBlock= new FlagConfigurationButton(controlStatementsCleanUp, ControlStatementsCleanUp.REMOVE_UNNECESSARY_BLOCKS, MultiFixMessages.ControlStatementsCleanUp_removeIfPossible_checkBoxLabel, SWT.RADIO);
			FlagConfigurationGroup blockGroup= new FlagConfigurationGroup(MultiFixMessages.ControlStatementsCleanUp_useBlocks_checkBoxLabel, new FlagConfigurationButton[] {addBlock, removeBlockReturn, removeBlock}, SWT.RADIO | SWT.VERTICAL, settings);
			blockGroup.createButton(group);
		
			FlagConfigurationButton convertLoop= new FlagConfigurationButton(controlStatementsCleanUp, ControlStatementsCleanUp.CONVERT_FOR_LOOP_TO_ENHANCED_FOR_LOOP, MultiFixMessages.ControlStatementsCleanUp_convertLoops_checkBoxLabel, SWT.CHECK);
			convertLoop.createButton(group);
			
			//Expressions group
			ExpressionsCleanUp expressionsCleanUp= new ExpressionsCleanUp(settings);
			group= createGroup(groups, MultiFixMessages.CleanUpRefactoringWizard_expressions_sectionDescription);
			
			FlagConfigurationButton addParanoic= new FlagConfigurationButton(expressionsCleanUp, ExpressionsCleanUp.ADD_PARANOIC_PARENTHESIS, MultiFixMessages.ExpressionsCleanUp_addParanoiac_checkBoxLabel, SWT.RADIO);
			FlagConfigurationButton removeParanoic= new FlagConfigurationButton(expressionsCleanUp, ExpressionsCleanUp.REMOVE_UNNECESSARY_PARENTHESIS, MultiFixMessages.ExpressionsCleanUp_removeUnnecessary_checkBoxLabel, SWT.RADIO);
			FlagConfigurationGroup parenthesisGroup= new FlagConfigurationGroup(MultiFixMessages.ExpressionsCleanUp_parenthesisAroundConditions_checkBoxLabel, new FlagConfigurationButton[] {addParanoic, removeParanoic}, SWT.RADIO | SWT.HORIZONTAL, settings);
			parenthesisGroup.createButton(group);
			
			//Variable declaration group
			VariableDeclarationCleanUp varDeclCleanUp= new VariableDeclarationCleanUp(settings);
			group= createGroup(groups, MultiFixMessages.CleanUpRefactoringWizard_variableDeclaration_groupDescription);
			
			FlagConfigurationButton addFinalField= new FlagConfigurationButton(varDeclCleanUp, VariableDeclarationCleanUp.ADD_FINAL_MODIFIER_FIELDS, MultiFixMessages.CleanUpRefactoringWizard_addFinalFields_checkBoxLabel, SWT.CHECK);
			FlagConfigurationButton addFinalParam= new FlagConfigurationButton(varDeclCleanUp, VariableDeclarationCleanUp.ADD_FINAL_MODIFIER_PARAMETERS, MultiFixMessages.CleanUpRefactoringWizard_addFinalParameters_checkBoxLabel, SWT.CHECK);
			FlagConfigurationButton addFinalLocal= new FlagConfigurationButton(varDeclCleanUp, VariableDeclarationCleanUp.ADD_FINAL_MODIFIER_LOCAL_VARIABLES, MultiFixMessages.CleanUpRefactoringWizard_addFinalLocals_checkBoxLabel, SWT.CHECK);
			FlagConfigurationGroup addFinalGroup= new FlagConfigurationGroup(MultiFixMessages.CleanUpRefactoringWizard_changeToFinal_checkBoxLabel, new FlagConfigurationButton[] {addFinalField, addFinalParam, addFinalLocal}, SWT.CHECK | SWT.HORIZONTAL, settings);
			addFinalGroup.createButton(group);
			
			FlagConfigurationButton[] flagConfigurationButtons= new FlagConfigurationButton[] {addBlock, removeBlock, removeBlockReturn, convertLoop, addParanoic, removeParanoic, addFinalField, addFinalParam, addFinalLocal};
			FlagConfigurationGroup[] radioButtonGroups= new FlagConfigurationGroup[] {blockGroup, parenthesisGroup};
			FlagConfigurationGroup[] checkBoxGroup= new FlagConfigurationGroup[] {addFinalGroup};
			
			CleanUpPreview preview= addPreview(composite, new ICleanUp[] {controlStatementsCleanUp, expressionsCleanUp, varDeclCleanUp}, flagConfigurationButtons);
			
			if (project != null && !JavaModelUtil.is50OrHigher(project)) {
				convertLoop.disable();
				convertLoop.deselect();
				addEnableButtonsGroup(left, flagConfigurationButtons, radioButtonGroups, checkBoxGroup, new FlagConfigurationButton[] {convertLoop}, preview);
			} else {
				addEnableButtonsGroup(left, flagConfigurationButtons, radioButtonGroups, checkBoxGroup, new FlagConfigurationButton[0], preview);
			}
			
			addSelectionCounter(flagConfigurationButtons);
			
			fCleanUps[1]= controlStatementsCleanUp;
			fCleanUps[3]= expressionsCleanUp;
			fCleanUps[2]= varDeclCleanUp;
			
			fConfigurationGroups.add(blockGroup);
			fConfigurationGroups.add(parenthesisGroup);
			fConfigurationGroups.add(addFinalGroup);
			
			return composite;
		}
		
		private Composite fillMemberAccessesTab(Composite parent, IJavaProject project, IDialogSettings settings) {
			Composite composite= new Composite(parent, SWT.NONE);
			GridLayout gridLayout= new GridLayout(2, false);
			gridLayout.marginWidth= 0;
			gridLayout.marginHeight= 0;
			composite.setLayout(gridLayout);
			composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
			
			Composite left= new Composite(composite, SWT.NONE);
			gridLayout= new GridLayout(1, false);
			gridLayout.marginWidth= 0;
			gridLayout.marginHeight= 0;
			left.setLayout(gridLayout);
			left.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true));
			
			Composite groups= new Composite(left, SWT.NONE);
			groups.setLayout(new GridLayout(1, false));
			groups.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true));
			
			//Non Static group
			CodeStyleCleanUp codeStyleCleanUp= new CodeStyleCleanUp(settings);
			Composite group= createGroup(groups, MultiFixMessages.CleanUpRefactoringWizard_NonStaticAccesses_groupDescription);
			
			FlagConfigurationButton addThisField= new FlagConfigurationButton(codeStyleCleanUp, CodeStyleCleanUp.QUALIFY_FIELD_ACCESS, MultiFixMessages.CleanUpRefactoringWizard_qualifyNonStaticField_checkBoxLabel, SWT.RADIO);
			FlagConfigurationButton removeThisField= new FlagConfigurationButton(codeStyleCleanUp, CodeStyleCleanUp.REMOVE_THIS_FIELD_QUALIFIER, MultiFixMessages.CleanUpRefactoringWizard_removeThis_checkBoxLabel, SWT.RADIO);
			FlagConfigurationGroup  addThisGroup= new FlagConfigurationGroup(MultiFixMessages.CodeStyleCleanUp_useThis_checkBoxLabel, new FlagConfigurationButton[] {addThisField, removeThisField}, SWT.RADIO | SWT.HORIZONTAL, settings);
			addThisGroup.createButton(group);
			FlagConfigurationButton addThisMethod= new FlagConfigurationButton(codeStyleCleanUp, CodeStyleCleanUp.QUALIFY_METHOD_ACCESS, MultiFixMessages.CleanUpRefactoringWizard_qualifyNonStaticMethod_checkBoxLabel, SWT.RADIO);
			FlagConfigurationButton removeThisMethod= new FlagConfigurationButton(codeStyleCleanUp, CodeStyleCleanUp.REMOVE_THIS_METHOD_QUALIFIER, MultiFixMessages.CleanUpRefactoringWizard_removeMethodThis_checkBoxLabel, SWT.RADIO);
			FlagConfigurationGroup addThisMethodGroup= new FlagConfigurationGroup(MultiFixMessages.CleanUpRefactoringWizard_addMethodThis_checkBoxLabel, new FlagConfigurationButton[] {addThisMethod, removeThisMethod}, SWT.RADIO | SWT.HORIZONTAL, settings);
			addThisMethodGroup.createButton(group);
			
			//Static group
			group= createGroup(groups, MultiFixMessages.CleanUpRefactoringWizard_StaticAccesses_groupDescription);
			FlagConfigurationButton nonStatic= new FlagConfigurationButton(codeStyleCleanUp, CodeStyleCleanUp.CHANGE_NON_STATIC_ACCESS_TO_STATIC, MultiFixMessages.CodeStyleCleanUp_changeNonStatic_checkBoxLabel, SWT.CHECK);
			FlagConfigurationButton indirect= new FlagConfigurationButton(codeStyleCleanUp, CodeStyleCleanUp.CHANGE_INDIRECT_STATIC_ACCESS_TO_DIRECT, MultiFixMessages.CodeStyleCleanUp_changeIndirect_checkBoxLabel, SWT.CHECK);
			FlagConfigurationButton qualifyStatic= new FlagConfigurationButton(codeStyleCleanUp, CodeStyleCleanUp.QUALIFY_STATIC_FIELD_ACCESS, MultiFixMessages.CodeStyleCleanUp_addStaticQualifier_checkBoxLabel, SWT.CHECK);
			FlagConfigurationButton qualifyStaticMethod= new FlagConfigurationButton(codeStyleCleanUp, CodeStyleCleanUp.QUALIFY_STATIC_METHOD_ACCESS, MultiFixMessages.CleanUpRefactoringWizard_qualifyStaticMethod_checkBoxLabel, SWT.CHECK);
			FlagConfigurationGroup staticGroup= new FlagConfigurationGroup(MultiFixMessages.CodeStyleCleanUp_useDeclaring_checkBoxLabel, new FlagConfigurationButton[] {qualifyStatic, qualifyStaticMethod, indirect, nonStatic}, SWT.CHECK | SWT.VERTICAL, settings);
			staticGroup.createButton(group);
			
			FlagConfigurationButton[] flagConfigurationButtons= new FlagConfigurationButton[] {addThisField, removeThisField, addThisMethod, removeThisMethod, nonStatic, indirect, qualifyStatic, qualifyStaticMethod};
			FlagConfigurationGroup[] radioButtonGroups= new FlagConfigurationGroup[] {addThisGroup, addThisMethodGroup};
			
			CleanUpPreview preview= addPreview(composite, new ICleanUp[] {codeStyleCleanUp}, flagConfigurationButtons);
			
			addEnableButtonsGroup(left, flagConfigurationButtons, radioButtonGroups, new FlagConfigurationGroup[] {staticGroup}, new FlagConfigurationButton[0], preview);
			
			addSelectionCounter(flagConfigurationButtons);
			
			fCleanUps[0]= codeStyleCleanUp;
			
			fConfigurationGroups.add(addThisGroup);
			fConfigurationGroups.add(addThisMethodGroup);
			fConfigurationGroups.add(staticGroup);
			
			return composite;
		}

		private Composite fillUnnecessaryCodeTab(Composite parent, final IJavaProject project, IDialogSettings section) {
			Composite composite= new Composite(parent, SWT.NONE);
			GridLayout gridLayout= new GridLayout(2, false);
			gridLayout.marginWidth= 0;
			gridLayout.marginHeight= 0;
			composite.setLayout(gridLayout);
			composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
			
			Composite left= new Composite(composite, SWT.NONE);
			gridLayout= new GridLayout(1, false);
			gridLayout.marginWidth= 0;
			gridLayout.marginHeight= 0;
			left.setLayout(gridLayout);
			left.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true));
			
			Composite groups= new Composite(left, SWT.NONE);
			groups.setLayout(new GridLayout(1, false));
			groups.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true));
			
			//Unused code group
			UnusedCodeCleanUp unusedCodeCleanUp= new UnusedCodeCleanUp(section);
			Composite group= createGroup(groups, MultiFixMessages.CleanUpRefactoringWizard_UnusedCodeSection_description);
			
			FlagConfigurationButton imports= new FlagConfigurationButton(unusedCodeCleanUp, UnusedCodeCleanUp.REMOVE_UNUSED_IMPORTS, MultiFixMessages.UnusedCodeCleanUp_unusedImports_checkBoxLabel, SWT.CHECK);
			imports.createButton(group);
			FlagConfigurationButton types= new FlagConfigurationButton(unusedCodeCleanUp, UnusedCodeCleanUp.REMOVE_UNUSED_PRIVATE_TYPES, MultiFixMessages.UnusedCodeCleanUp_unusedTypes_checkBoxLabel, SWT.CHECK);
			FlagConfigurationButton contructors= new FlagConfigurationButton(unusedCodeCleanUp, UnusedCodeCleanUp.REMOVE_UNUSED_PRIVATE_CONSTRUCTORS, MultiFixMessages.UnusedCodeCleanUp_unusedConstructors_checkBoxLabel, SWT.CHECK);
			FlagConfigurationButton methods= new FlagConfigurationButton(unusedCodeCleanUp, UnusedCodeCleanUp.REMOVE_UNUSED_PRIVATE_METHODS, MultiFixMessages.UnusedCodeCleanUp_unusedMethods_checkBoxLabel, SWT.CHECK);
			FlagConfigurationButton fields= new FlagConfigurationButton(unusedCodeCleanUp, UnusedCodeCleanUp.REMOVE_UNUSED_PRIVATE_FIELDS, MultiFixMessages.UnusedCodeCleanUp_unusedFields_checkBoxLabel, SWT.CHECK);
			FlagConfigurationGroup membersGroup= new FlagConfigurationGroup(MultiFixMessages.UnusedCodeCleanUp_unusedPrivateMembers_checkBoxLabel, new FlagConfigurationButton[] {types, contructors, fields, methods}, SWT.CHECK | SWT.HORIZONTAL, section);
			membersGroup.createButton(group);
			FlagConfigurationButton locals= new FlagConfigurationButton(unusedCodeCleanUp, UnusedCodeCleanUp.REMOVE_UNUSED_LOCAL_VARIABLES, MultiFixMessages.UnusedCodeCleanUp_unusedLocalVariables_checkBoxLabel, SWT.CHECK);
			locals.createButton(group);

			//Unnecessary code group
			UnnecessaryCodeCleanUp unnecessaryCodeCleanUp= new UnnecessaryCodeCleanUp(section);
			StringCleanUp stringCleanUp= new StringCleanUp(section);
			group= createGroup(groups, MultiFixMessages.CleanUpRefactoringWizard_UnnecessaryCode_section );
			
			FlagConfigurationButton casts= new FlagConfigurationButton(unnecessaryCodeCleanUp, UnnecessaryCodeCleanUp.REMOVE_UNUSED_CAST, MultiFixMessages.UnusedCodeCleanUp_unnecessaryCasts_checkBoxLabel, SWT.CHECK);
			casts.createButton(group);
			FlagConfigurationButton nlsTags= new FlagConfigurationButton(stringCleanUp, StringCleanUp.REMOVE_UNNECESSARY_NLS_TAG, MultiFixMessages.StringCleanUp_RemoveNLSTag_label, SWT.CHECK);
			nlsTags.createButton(group);
			
			FlagConfigurationButton[] flagConfigurationButtons= new FlagConfigurationButton[] {imports, types, contructors, methods, locals, fields, casts, nlsTags};
			
			CleanUpPreview preview= addPreview(composite, new ICleanUp[] {unusedCodeCleanUp, unnecessaryCodeCleanUp, stringCleanUp}, flagConfigurationButtons);
			
			addEnableButtonsGroup(left, flagConfigurationButtons, new FlagConfigurationGroup[0], new FlagConfigurationGroup[] {membersGroup}, new FlagConfigurationButton[0], preview);
			
			addSelectionCounter(flagConfigurationButtons);

			fCleanUps[4]= unusedCodeCleanUp;
			fCleanUps[7]= unnecessaryCodeCleanUp;
			fCleanUps[8]= stringCleanUp;
			
			fConfigurationGroups.add(membersGroup);
			
			return composite;
		}

		private Composite fillMissingCodeTab(Composite parent, final IJavaProject project, IDialogSettings section) {
			Composite composite= new Composite(parent, SWT.NONE);
			GridLayout gridLayout= new GridLayout(2, false);
			gridLayout.marginWidth= 0;
			gridLayout.marginHeight= 0;
			composite.setLayout(gridLayout);
			composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
			
			Composite left= new Composite(composite, SWT.NONE);
			gridLayout= new GridLayout(1, false);
			gridLayout.marginWidth= 0;
			gridLayout.marginHeight= 0;
			left.setLayout(gridLayout);
			left.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true));
			
			Composite groups= new Composite(left, SWT.NONE);
			groups.setLayout(new GridLayout(1, false));
			groups.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true));
			
			//Java50Fix Group
			Java50CleanUp java50CleanUp= new Java50CleanUp(section);
			Composite group= createGroup(groups, MultiFixMessages.CleanUpRefactoringWizard_Annotations_sectionName);
			
			FlagConfigurationButton override= new FlagConfigurationButton(java50CleanUp, Java50CleanUp.ADD_OVERRIDE_ANNOATION, MultiFixMessages.Java50CleanUp_override_checkBoxLabel, SWT.CHECK);
			FlagConfigurationButton deprecated= new FlagConfigurationButton(java50CleanUp, Java50CleanUp.ADD_DEPRECATED_ANNOTATION, MultiFixMessages.Java50CleanUp_deprecated_checkBoxLabel, SWT.CHECK);
			FlagConfigurationGroup annotations= new FlagConfigurationGroup(MultiFixMessages.Java50CleanUp_addMissingAnnotations_checkBoxLabel, new FlagConfigurationButton[] {override, deprecated}, SWT.CHECK | SWT.VERTICAL, section);
			annotations.createButton(group);

			//Potential Programming Problems Group
			PotentialProgrammingProblemsCleanUp potentialProgrammingProblemsCleanUp= new PotentialProgrammingProblemsCleanUp(section);
			group= createGroup(groups, MultiFixMessages.CleanUpRefactoringWizard_PotentialProgrammingProblems_description);
			
			FlagConfigurationButton hash= new FlagConfigurationButton(potentialProgrammingProblemsCleanUp, PotentialProgrammingProblemsCleanUp.ADD_CALCULATED_SERIAL_VERSION_ID, MultiFixMessages.PotentialProgrammingProblemsCleanUp_Generated_radioButton_name, SWT.RADIO);
			FlagConfigurationButton defaultId= new FlagConfigurationButton(potentialProgrammingProblemsCleanUp, PotentialProgrammingProblemsCleanUp.ADD_DEFAULT_SERIAL_VERSION_ID, MultiFixMessages.PotentialProgrammingProblemsCleanUp_Default_radioButton_name, SWT.RADIO);
			FlagConfigurationGroup serial= new FlagConfigurationGroup(MultiFixMessages.PotentialProgrammingProblemsCleanUp_AddSerialId_section_name, new FlagConfigurationButton[] {hash, defaultId}, SWT.RADIO | SWT.HORIZONTAL, section);
			serial.createButton(group);
			
			FlagConfigurationButton[] flagConfigurationButtons= new FlagConfigurationButton[] {override, deprecated, hash, defaultId};
			
			CleanUpPreview preview= addPreview(composite, new ICleanUp[] {java50CleanUp, potentialProgrammingProblemsCleanUp}, flagConfigurationButtons);
			
			if (project != null && !JavaModelUtil.is50OrHigher(project)) {
				override.deselect();
				override.disableFlag();
				deprecated.deselect();
				deprecated.disableFlag();
				annotations.disable();
				addEnableButtonsGroup(left, flagConfigurationButtons, new FlagConfigurationGroup[] {serial}, new FlagConfigurationGroup[] {annotations},  new FlagConfigurationButton[] {override, deprecated}, preview);
			} else {
				addEnableButtonsGroup(left, flagConfigurationButtons, new FlagConfigurationGroup[] {serial}, new FlagConfigurationGroup[] {annotations}, new FlagConfigurationButton[0], preview);
			}
			
			addSelectionCounter(flagConfigurationButtons);
			
			fCleanUps[5]= java50CleanUp;
			fCleanUps[6]= potentialProgrammingProblemsCleanUp;
			
			fConfigurationGroups.add(annotations);
			fConfigurationGroups.add(serial);
			
			return composite;
		}
		
		private CleanUpPreview addPreview(Composite parent, ICleanUp[] cleanUps, FlagConfigurationButton[] flagConfigurationButtons) {
			Composite composite= new Composite(parent, SWT.NONE);
			composite.setLayout(new GridLayout(1, true));
			composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
			
			Label label= new Label(composite, SWT.NONE);
			label.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));
			label.setText(MultiFixMessages.CleanUpRefactoringWizard_previewLabel_text);
			
			IJavaProject javaProject= ((CleanUpRefactoring)getRefactoring()).getProjects()[0];
			final CleanUpPreview preview= new CleanUpPreview(composite, javaProject.getOptions(true), cleanUps);
			
			GridData gd= new GridData(SWT.FILL, SWT.FILL, true, true);
			gd.widthHint= 0;
			gd.heightHint=0;
			preview.getControl().setLayoutData(gd);
			
			preview.update();
			for (int i= 0; i < flagConfigurationButtons.length; i++) {
				flagConfigurationButtons[i].addSelectionChangeListener(new ISelectionChangeListener() {

					public void selectionChanged(ICleanUp cleanUp, int flag, boolean selection) {
						if (!preview.isUpdateSuspended())
							preview.update();
					}
				});
			}
			return preview;
		}
		
		private void addSelectionCounter(FlagConfigurationButton[] configs) {
			for (int i= 0; i < configs.length; i++) {
				FlagConfigurationButton config= configs[i];
				if (config.getCleanUp().isFlag(config.getFlag()))
					fSelectedCleanUpsCount++;
				config.addSelectionChangeListener(new ISelectionChangeListener() {
					public void selectionChanged(ICleanUp cleanUp, int flag, boolean selection) {
						if (selection) {
							fSelectedCleanUpsCount++;
						} else {
							fSelectedCleanUpsCount--;
						}
						fStatusLine.setText(Messages.format(MultiFixMessages.CleanUpRefactoringWizard_statusLineText, new Object[] {new Integer(fSelectedCleanUpsCount), new Integer(fTotalCleanUpsCount)}));
					}
					
				});
			}
			fTotalCleanUpsCount+=configs.length;
		}

		private void addEnableButtonsGroup(Composite parent, final FlagConfigurationButton[] configButtons, final FlagConfigurationGroup[] radioGroups, final FlagConfigurationGroup[] checkBoxGroups, final FlagConfigurationButton[] disabledButtons, final CleanUpPreview preview) {
			Composite down= new Composite(parent, SWT.NONE);
			down.setLayout(new GridLayout(2, false));
			down.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
			
			Composite space= new Composite(down, SWT.NONE);
			space.setLayout(new GridLayout(1, true));
			space.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
			
			Composite buttons= new Composite(down, SWT.NONE);
			buttons.setLayout(new GridLayout(3, true));
			buttons.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true));
			
			Button all= new Button(buttons, SWT.PUSH);
			all.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
			all.setText(MultiFixMessages.CleanUpRefactoringWizard_EnableAllButton_label);
			all.addSelectionListener(new SelectionAdapter() {
				public void widgetSelected(SelectionEvent e) {
					preview.blockUpdate();
					for (int i= 0; i < configButtons.length; i++) {
						FlagConfigurationButton config= configButtons[i];
						boolean isDisabled= false;
						for (int j= 0; j < disabledButtons.length; j++) {
							if (config == disabledButtons[j])
								isDisabled= true;
						}
						if (!isDisabled) {
							if (config.isRadio()) {
								if (config.isSelected()) {
									config.enableFlag();
								}
							} else {
								config.enableFlag();
								config.select();
							}
						}
					}
					for (int i= 0; i < checkBoxGroups.length; i++) {
						if (!checkBoxGroups[i].isDisabled())
							checkBoxGroups[i].select();
					}
					for (int i= 0; i < radioGroups.length; i++) {
						if (!radioGroups[i].isDisabled())
							radioGroups[i].select();
					}
					preview.resumeUpdate();
					preview.update();
				}	
			});
			
			Button none= new Button(buttons, SWT.PUSH);
			none.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
			none.setText(MultiFixMessages.CleanUpRefactoringWizard_DisableAllButton_label);
			none.addSelectionListener(new SelectionAdapter() {
				public void widgetSelected(SelectionEvent e) {
					preview.blockUpdate();
					for (int i= 0; i < configButtons.length; i++) {
						FlagConfigurationButton config= configButtons[i];
						config.disableFlag();
						if (!config.isRadio()) {
							config.deselect();
						}
					}
					for (int i= 0; i < radioGroups.length; i++) {
						FlagConfigurationGroup group= radioGroups[i];
						group.deselect();
					}
					for (int i= 0; i < checkBoxGroups.length; i++) {
						checkBoxGroups[i].deselect();
					}
					preview.resumeUpdate();
					preview.update();
				}	
			});
			
			Button def= new Button(buttons, SWT.PUSH);
			def.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
			def.setText(MultiFixMessages.CleanUpRefactoringWizard_EnableDefaultsButton_label);
			def.addSelectionListener(new SelectionAdapter() {
				public void widgetSelected(SelectionEvent e) {
					preview.blockUpdate();
					for (int i= 0; i < configButtons.length; i++) {
						FlagConfigurationButton config= configButtons[i];
						if (!config.isRadio()) {
							boolean isDisabled= false;
							for (int j= 0; j < disabledButtons.length; j++) {
								if (config == disabledButtons[j])
									isDisabled= true;
							}
							if (!isDisabled) {
								config.enableDefault();
								config.selectDefault();
							}
						}
					}
					for (int i= 0; i < radioGroups.length; i++) {
						FlagConfigurationGroup group= radioGroups[i];
						group.enableDefaults();
					}
					for (int i= 0; i < checkBoxGroups.length; i++) {
						checkBoxGroups[i].enableDefaults();
					}
					preview.resumeUpdate();
					preview.update();
				}	
			});
		}

		private Composite createTab(TabFolder parent, String label) {
			TabItem csTab= new TabItem(parent, SWT.NONE);
			csTab.setText(label);
			
			Composite result= new Composite(parent, SWT.NONE);
			result.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
			result.setLayout(new GridLayout(1, false));
			csTab.setControl(result);
			return result;
		}

		private Composite createGroup(Composite parent, String description) {
			
			Group group= new Group(parent, SWT.NONE);
			group.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
			group.setLayout(new GridLayout(1, true));
			group.setText(description);
			
			return group;
		}

		protected boolean performFinish() {
			initializeRefactoring();
			storeSettings();
			return super.performFinish();
		}
	
		public IWizardPage getNextPage() {
			initializeRefactoring();
			storeSettings();
			return super.getNextPage();
		}
		
		private void storeSettings() {
			if (fCleanUps != null) {
				IDialogSettings settings= getCleanUpWizardSettings();
				for (int i= 0; i < fCleanUps.length; i++) {
					fCleanUps[i].saveSettings(settings);
				}
				for (Iterator iter= fConfigurationGroups.iterator(); iter.hasNext();) {
					FlagConfigurationGroup group= (FlagConfigurationGroup)iter.next();
					group.saveSettings(settings);
				}
			}
		}

		private void initializeRefactoring() {
			if (fCleanUps != null) {
				CleanUpRefactoring refactoring= (CleanUpRefactoring)getRefactoring();
				refactoring.clearCleanUps();
				for (int i= 0; i < fCleanUps.length; i++) {
					refactoring.addCleanUp(fCleanUps[i]);
				}
			}
		}
		
	}
	
	private final boolean fShowCUPage;
	private final boolean fShowCleanUpPage;
	
	public CleanUpRefactoringWizard(CleanUpRefactoring refactoring, int flags, boolean showCUPage, boolean showCleanUpPage) {
		super(refactoring, flags);
		fShowCUPage= showCUPage;
		fShowCleanUpPage= showCleanUpPage;
		setDefaultPageTitle(MultiFixMessages.CleanUpRefactoringWizard_PageTitle);
		setWindowTitle(MultiFixMessages.CleanUpRefactoringWizard_WindowTitle);
		setDefaultPageImageDescriptor(JavaPluginImages.DESC_WIZBAN_CLEAN_UP);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ltk.ui.refactoring.RefactoringWizard#addUserInputPages()
	 */
	protected void addUserInputPages() {
		if (fShowCUPage) {
			SelectCUPage selectCUPage= new SelectCUPage(MultiFixMessages.CleanUpRefactoringWizard_SelectCompilationUnitsPage_name);
			if (fShowCleanUpPage) {
				selectCUPage.setMessage(MultiFixMessages.CleanUpRefactoringWizard_SelectCompilationUnitsPage_message);
			} else {
				ICleanUp[] cleanUps= ((CleanUpRefactoring)getRefactoring()).getCleanUps();
				if (cleanUps.length == 1) {
					ICleanUp cleanUp= cleanUps[0];
					String[] descriptions= cleanUp.getDescriptions();
					if (descriptions.length == 1) {
						selectCUPage.setMessage(Messages.format(MultiFixMessages.CleanUpRefactoringWizard_SelectCompilationUnitsPage_preSingleSelect_message, descriptions[0]));
					} else {
						selectCUPage.setMessage(MultiFixMessages.CleanUpRefactoringWizard_SelectCompilationUnitsPage_preSelect_message);
					}
				} else {
					selectCUPage.setMessage(MultiFixMessages.CleanUpRefactoringWizard_SelectCompilationUnitsPage_preSelect_message);
				}
			}
			addPage(selectCUPage);
		}
		
		if (fShowCleanUpPage){
			SelectCleanUpPage selectSolverPage= new SelectCleanUpPage(MultiFixMessages.CleanUpRefactoringWizard_SelectCleanUpsPage_name);
			if (fShowCUPage) {
				selectSolverPage.setMessage(MultiFixMessages.CleanUpRefactoringWizard_SelectCleanUpsPage_message);
			} else {
				ICompilationUnit[] compilationUnits= ((CleanUpRefactoring)getRefactoring()).getCompilationUnits();
				if (compilationUnits.length == 1) {
					String label= JavaElementLabels.getElementLabel(compilationUnits[0], JavaElementLabels.ALL_DEFAULT);
					selectSolverPage.setMessage(Messages.format(MultiFixMessages.CleanUpRefactoringWizard_SelectCleanUpsPage_preSingleSelect_message, label));
				} else {
					selectSolverPage.setMessage(MultiFixMessages.CleanUpRefactoringWizard_SelectCleanUpsPage_message);
				}
			}
			addPage(selectSolverPage);
		}
	}
	
	private static IDialogSettings getCleanUpWizardSettings() {
		IDialogSettings settings= JavaPlugin.getDefault().getDialogSettings();
		IDialogSettings section= settings.getSection(CLEAN_UP_WIZARD_SETTINGS_SECTION_ID);
		if (section == null) {
			section= settings.addNewSection(CLEAN_UP_WIZARD_SETTINGS_SECTION_ID);
		}
		return section;
	}


}
