Patch from Silvio for preference pages
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/messages.properties b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/messages.properties
index 78d6a5e..dad541b 100644
--- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/messages.properties
+++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/messages.properties
@@ -11,7 +11,6 @@
 org.eclipse.team.internal.provider.cvs.CVSException=CVS Error: {0}
 
 ok=ok
-null=null
 internal=An internal error has occurred. Consult the error log for details.
 
 AbstractStructureVisitor.sendingFolder=Processing {0}
diff --git a/bundles/org.eclipse.team.cvs.ui/plugin.xml b/bundles/org.eclipse.team.cvs.ui/plugin.xml
index 3247764..366cbb7 100644
--- a/bundles/org.eclipse.team.cvs.ui/plugin.xml
+++ b/bundles/org.eclipse.team.cvs.ui/plugin.xml
@@ -765,14 +765,6 @@
             id="org.eclipse.team.cvs.ui.PasswordManagementPreferencePage">
       </page>
    </extension>
-   <extension
-         point="org.eclipse.ui.preferencePages">
-      <page
-            class="org.eclipse.team.internal.ccvs.ui.WorkInProgressPreferencePage"
-            category="org.eclipse.team.cvs.ui.CVSPreferences"
-            name="%WorkInProgressPreferencePage.name"
-            id="org.eclipse.team.cvs.ui.WorkInProgressPreferencePage"/>
-   </extension>
 <!-- **************** Decorator ******************* -->
    <extension
          point="org.eclipse.ui.decorators">
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSDecoratorPreferencesPage.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSDecoratorPreferencesPage.java
index 445fdf8..38e3f4d 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSDecoratorPreferencesPage.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSDecoratorPreferencesPage.java
@@ -122,7 +122,7 @@
 			final Button button = new Button(composite, SWT.NONE);
 			button.setText(buttonText);
 			button.setLayoutData(new GridData());
-			((GridData)button.getLayoutData()).widthHint= SWTUtils.calculateButtonSize(converter, new Button[] {button});
+			((GridData)button.getLayoutData()).widthHint= SWTUtils.calculateControlSize(converter, new Button[] {button});
 
 			button.addSelectionListener(this);
 		}
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSPreferencesPage.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSPreferencesPage.java
index 815e0de..97e49b3 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSPreferencesPage.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSPreferencesPage.java
@@ -11,27 +11,41 @@
 
 package org.eclipse.team.internal.ccvs.ui;
 
-import java.util.*;
+import java.text.Collator;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
 import java.util.List;
 
-import org.eclipse.jface.dialogs.*;
-import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.dialogs.MessageDialogWithToggle;
 import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.jface.preference.PreferencePage;
 import org.eclipse.jface.util.PropertyChangeEvent;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.*;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+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.TabFolder;
+import org.eclipse.swt.widgets.TabItem;
+import org.eclipse.swt.widgets.Text;
 import org.eclipse.team.internal.ccvs.core.CVSProviderPlugin;
 import org.eclipse.team.internal.ccvs.core.client.Command;
 import org.eclipse.team.internal.ccvs.core.client.Command.KSubstOption;
 import org.eclipse.team.internal.ccvs.core.client.Command.QuietOption;
+import org.eclipse.team.internal.ui.SWTUtils;
+import org.eclipse.ui.IPerspectiveDescriptor;
 import org.eclipse.ui.IWorkbench;
 import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.help.WorkbenchHelp;
 
 /**
@@ -46,184 +60,373 @@
  *  2. There is no help associated with the page
  */
 public class CVSPreferencesPage extends PreferencePage implements IWorkbenchPreferencePage {
-
-	private Button pruneEmptyDirectoriesField;
-	private Text timeoutValue;
-	private Combo quietnessCombo;
-	private Combo compressionLevelCombo;
-	private Combo ksubstCombo;
-	private Button usePlatformLineend;
-	private List ksubstOptions;
-	private Button replaceUnmanaged;
-	private Button repositoriesAreBinary;
-	private Button determineVersionEnabled;
-	private Button confirmMoveTag;
-	private Button debugProtocol;
-	private Button autoRefreshTags;
 	
-	private Button never;
-	private Button prompt;
-	private Button auto;
+	private static class PerspectiveDescriptorComparator implements Comparator {
+		public int compare(Object o1, Object o2) {
+			if (o1 instanceof IPerspectiveDescriptor && o2 instanceof IPerspectiveDescriptor) {
+				String id1= ((IPerspectiveDescriptor)o1).getLabel();
+				String id2= ((IPerspectiveDescriptor)o2).getLabel();
+				return Collator.getInstance().compare(id1, id2);
+			}
+			return 0;
+		}
+	}
+    
+	
+	private abstract class Field {
+		protected final String fKey;
+		public Field(String key) { fFields.add(this); fKey= key; }
+		public abstract void initializeValue(IPreferenceStore store);
+		public abstract void performOk(IPreferenceStore store);
+		public void performDefaults(IPreferenceStore store) {
+			store.setToDefault(fKey);
+			initializeValue(store);
+		}
+	}
+	
+	private class Checkbox extends Field {
+		
+		private final Button fCheckbox;
+		
+		public Checkbox(Composite composite, String key, String label, String helpID) {
+			super(key);
+			fCheckbox= new Button(composite, SWT.CHECK);
+			fCheckbox.setText(label);
+			WorkbenchHelp.setHelp(fCheckbox, helpID);
+		}
+		
+		public void initializeValue(IPreferenceStore store) {
+			fCheckbox.setSelection(store.getBoolean(fKey));
+		}
+		
+		public void performOk(IPreferenceStore store) {
+			store.setValue(fKey, fCheckbox.getSelection());
+		}
+	}
 
-	public CVSPreferencesPage() {
-		// sort the options by display text
-		setDescription(Policy.bind("CVSPreferencePage.description")); //$NON-NLS-1$
-		KSubstOption[] options = KSubstOption.getAllKSubstOptions();
-		this.ksubstOptions = new ArrayList();
-		for (int i = 0; i < options.length; i++) {
-			KSubstOption option = options[i];
-			if (! option.isBinary()) {
-				ksubstOptions.add(option);
+	private abstract class ComboBox extends Field {
+		protected final Combo fCombo;
+		private final String [] fLabels;
+		private final List fValues;
+		
+		public ComboBox(Composite composite, String key, String text, String helpID, String [] labels, Object [] values) {
+			super(key);
+			fLabels= labels;
+			fValues= Arrays.asList(values);
+			
+			final Label label= SWTUtils.createLabel(composite, text);
+			fCombo= new Combo(composite, SWT.READ_ONLY);
+			fCombo.setLayoutData(SWTUtils.createHFillGridData());
+			fCombo.setItems(labels);
+			
+			if (((GridLayout)composite.getLayout()).numColumns > 1) {
+				label.setLayoutData(SWTUtils.createGridData(SWT.DEFAULT, SWT.DEFAULT, false, false));
+			}
+			
+			WorkbenchHelp.setHelp(fCombo, helpID);
+		}
+		
+		public Combo getCombo() {
+			return fCombo;
+		}
+		
+		public void initializeValue(IPreferenceStore store) {
+			final Object value= getValue(store, fKey);
+			final int index= fValues.indexOf(value); 
+			if (index >= 0 && index < fLabels.length)
+				fCombo.select(index);
+			else 
+				fCombo.select(0);
+		}
+		
+		public void performOk(IPreferenceStore store) {
+			saveValue(store, fKey, fValues.get(fCombo.getSelectionIndex()));
+		}
+		
+		protected abstract void saveValue(IPreferenceStore store, String key, Object object);
+		protected abstract Object getValue(IPreferenceStore store, String key);
+	}
+	
+	private class IntegerComboBox extends ComboBox {
+		public IntegerComboBox(Composite composite, String key, String label, String helpID, String[] labels, Integer [] values) {
+			super(composite, key, label, helpID, labels, values);
+		}
+
+		protected void saveValue(IPreferenceStore store, String key, Object object) {
+			store.setValue(key, ((Integer)object).intValue());			
+		}
+		
+		protected Object getValue(IPreferenceStore store, String key) {
+			return new Integer(store.getInt(key));			
+		}
+	}
+	
+	private class StringComboBox extends ComboBox {
+		
+		public StringComboBox(Composite composite, String key, String label, String helpID, String [] labels, String [] values) {
+			super(composite, key, label, helpID, labels, values);
+		}
+
+		protected Object getValue(IPreferenceStore store, String key) {
+			return store.getString(key);
+		}
+		
+		protected void saveValue(IPreferenceStore store, String key, Object object) {
+			store.setValue(key, (String)object);
+		}
+	}
+
+	private abstract class RadioButtons extends Field {
+		protected final Button [] fButtons;
+		private final String [] fLabels;
+		private final List fValues;
+		private final Group fGroup;
+		
+		public RadioButtons(Composite composite, String key, String label, String helpID, String [] labels, Object [] values) {
+			super(key);
+			fLabels= labels;
+			fValues= Arrays.asList(values);
+			
+			fGroup= SWTUtils.createHFillGroup(composite, label, SWTUtils.MARGINS_DEFAULT, labels.length);
+			
+			
+			fButtons= new Button [labels.length];
+			for (int i = 0; i < fLabels.length; i++) {
+				fButtons[i]= new Button(fGroup, SWT.RADIO);
+				fButtons[i].setLayoutData(SWTUtils.createGridData(SWT.DEFAULT, SWT.DEFAULT, false, false));
+				fButtons[i].setText(labels[i]);
+			}
+			SWTUtils.equalizeControls(SWTUtils.createDialogPixelConverter(composite), fButtons, 0, fButtons.length - 2);
+			WorkbenchHelp.setHelp(fGroup, helpID);
+		}
+		
+		public void initializeValue(IPreferenceStore store) {
+			final Object value= loadValue(store, fKey);
+			final int index= fValues.indexOf(value);
+			if (index >= 0 && index < fLabels.length)
+				fButtons[index].setSelection(true);
+		}
+
+		public void performOk(IPreferenceStore store) {
+			for (int i = 0; i < fButtons.length; ++i) {
+				if (fButtons[i].getSelection()) {
+					saveValue(store, fKey, fValues.get(i));
+					return;
+				} 
 			}
 		}
-		Collections.sort(ksubstOptions, new Comparator() {
+		
+		public Control getControl() {
+			return fGroup;
+		}
+		
+		protected abstract Object loadValue(IPreferenceStore store, String key);
+
+		protected abstract void saveValue(IPreferenceStore store, String key, Object value);
+	}
+
+	private class IntegerRadioButtons extends RadioButtons {
+
+		public IntegerRadioButtons(Composite composite, String key, String label, String helpID, String[] labels, Integer [] values) {
+			super(composite, key, label, helpID, labels, values);
+		}
+
+		protected Object loadValue(IPreferenceStore store, String key) {
+			return new Integer(store.getInt(key));
+		}
+
+		protected void saveValue(IPreferenceStore store, String key, Object value) {
+			store.setValue(key, ((Integer)value).intValue());
+		}
+	}
+	
+	private class StringRadioButtons extends RadioButtons {
+
+		public StringRadioButtons(Composite composite, String key, String label, String helpID, String[] labels, String [] values) {
+			super(composite, key, label, helpID, labels, values);
+		}
+
+		protected Object loadValue(IPreferenceStore store, String key) {
+			return store.getString(key);
+		}
+
+		protected void saveValue(IPreferenceStore store, String key, Object value) {
+			store.setValue(key, (String)value);
+		}
+	}
+	
+	private abstract class TextField extends Field {
+		protected final Text fText;
+		
+		public TextField(Composite composite, String key, String text, String helpID) {
+			super(key);
+			
+			final Label label= new Label(composite, SWT.WRAP);
+			label.setText(text);
+			label.setLayoutData(SWTUtils.createGridData(SWT.DEFAULT, SWT.DEFAULT, false, false));
+			
+			fText= SWTUtils.createText(composite);
+			
+			WorkbenchHelp.setHelp(fText, helpID);
+		}
+		
+		public Text getControl() {
+			return fText;
+		}
+		
+		public void initializeValue(IPreferenceStore store) {
+			final String value= store.getString(fKey);
+			fText.setText(value);
+		}
+		
+		public void performOk(IPreferenceStore store) {
+			store.setValue(fKey, fText.getText());
+		}
+		
+		protected abstract void modifyText(Text text);
+	}
+	
+	private final String [] KSUBST_VALUES;
+	private final String [] KSUBST_LABELS;
+	
+	private final String [] COMPRESSION_LABELS;
+	private final Integer [] COMPRESSION_VALUES;
+	
+	protected final ArrayList fFields;
+	private final String [] PERSPECTIVE_VALUES;
+	private final String [] PERSPECTIVE_LABELS;
+	private final String [] YES_NO_PROMPT;
+	
+	public CVSPreferencesPage() {
+		fFields= new ArrayList();
+		
+		final KSubstOption[] options = KSubstOption.getAllKSubstOptions();
+		final ArrayList KSUBST_MODES= new ArrayList();
+		for (int i = 0; i < options.length; i++) {
+			final KSubstOption option = options[i];
+			if (!option.isBinary()) {
+				KSUBST_MODES.add(option);
+			}
+		}
+		Collections.sort(KSUBST_MODES, new Comparator() {
 			public int compare(Object a, Object b) {
-				String aKey = ((KSubstOption) a).getLongDisplayText();
-				String bKey = ((KSubstOption) b).getLongDisplayText();
+				final String aKey = ((KSubstOption) a).getLongDisplayText();
+				final String bKey = ((KSubstOption) b).getLongDisplayText();
 				return aKey.compareTo(bKey);
 			}
 		});
+		
+		KSUBST_LABELS= new String[KSUBST_MODES.size()];
+		KSUBST_VALUES= new String[KSUBST_MODES.size()];
+		int index= 0;
+		for (Iterator iter = KSUBST_MODES.iterator(); iter.hasNext();) {
+			KSubstOption mod = (KSubstOption) iter.next();
+			KSUBST_LABELS[index]= mod.getLongDisplayText();
+			final String mode= mod.toMode().trim();
+			KSUBST_VALUES[index]= mode.length() != 0 ? mode : "-kkv";    //$NON-NLS-1$
+			++index;
+		}	
+	
+		COMPRESSION_LABELS= new String [] { Policy.bind("CVSPreferencesPage.0"), Policy.bind("CVSPreferencesPage.1"), Policy.bind("CVSPreferencesPage.2"), Policy.bind("CVSPreferencesPage.3"), Policy.bind("CVSPreferencesPage.4"), Policy.bind("CVSPreferencesPage.5"), Policy.bind("CVSPreferencesPage.6"), Policy.bind("CVSPreferencesPage.7"), Policy.bind("CVSPreferencesPage.8"), Policy.bind("CVSPreferencesPage.9") }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
+		COMPRESSION_VALUES= new Integer [COMPRESSION_LABELS.length];
+		for (int i = 0; i < COMPRESSION_VALUES.length; i++) {
+			COMPRESSION_VALUES[i]= new Integer(i);
+		}
+		
+	    final IPerspectiveDescriptor [] perspectives= PlatformUI.getWorkbench().getPerspectiveRegistry().getPerspectives();
+	    PERSPECTIVE_VALUES= new String[perspectives.length + 1];
+	    PERSPECTIVE_LABELS= new String [perspectives.length + 1];
+		Arrays.sort(perspectives, new PerspectiveDescriptorComparator());
+		PERSPECTIVE_VALUES[0]= ICVSUIConstants.OPTION_NO_PERSPECTIVE;
+		PERSPECTIVE_LABELS[0]= Policy.bind("CVSPreferencesPage.10"); //$NON-NLS-1$
+		for (int i = 0; i < perspectives.length; i++) {
+			PERSPECTIVE_VALUES[i + 1]= perspectives[i].getId();
+			PERSPECTIVE_LABELS[i + 1]= perspectives[i].getLabel();
+		}
+		
+		YES_NO_PROMPT= new String [] { Policy.bind("CVSPreferencesPage.11"), Policy.bind("CVSPreferencesPage.12"), Policy.bind("CVSPreferencesPage.13") }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		/**
+		 * Handle deleted perspectives
+		 */
+		final IPreferenceStore store= CVSUIPlugin.getPlugin().getPreferenceStore();
+		final String id= store.getString(ICVSUIConstants.PREF_DEFAULT_PERSPECTIVE_FOR_SHOW_ANNOTATIONS);
+		if (PlatformUI.getWorkbench().getPerspectiveRegistry().findPerspectiveWithId(id) == null) {
+			store.putValue(ICVSUIConstants.PREF_DEFAULT_PERSPECTIVE_FOR_SHOW_ANNOTATIONS, ICVSUIConstants.OPTION_NO_PERSPECTIVE);
+		}
 	}
 
-	/**
-	 * Utility method that creates a combo box
-	 *
-	 * @param parent  the parent for the new label
-	 * @return the new widget
-	 */
-	protected Combo createCombo(Composite parent, int widthChars) {
-		Combo combo = new Combo(parent, SWT.READ_ONLY);
-		GridData data = new GridData(GridData.FILL_HORIZONTAL);
-		GC gc = new GC(combo);
-	 	gc.setFont(combo.getFont());
-		FontMetrics fontMetrics = gc.getFontMetrics();		
-		data.widthHint = Dialog.convertWidthInCharsToPixels(fontMetrics, widthChars);
-		gc.dispose();
-		combo.setLayoutData(data);
-		return combo;
+	protected Control createContents(Composite parent) {
+		
+		// create a tab folder for the page
+		final TabFolder tabFolder = new TabFolder(parent, SWT.NONE);
+		tabFolder.setLayoutData(SWTUtils.createHFillGridData());
+
+		createGeneralTab(tabFolder);
+		createFilesFoldersTab(tabFolder);
+		createConnectionTab(tabFolder);
+		createPromptingTab(tabFolder);
+		
+		return tabFolder;
 	}
 
-	/**
-	 * Utility method that creates a combo box
-	 *
-	 * @param parent  the parent for the new label
-	 * @return the new widget
-	 */
-	protected Combo createCombo(Composite parent) {
-		Combo combo = new Combo(parent, SWT.READ_ONLY);
-		GridData data = new GridData(GridData.FILL_HORIZONTAL);
-		data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
-		combo.setLayoutData(data);
-		return combo;
-	}
-
-	/**
-	 * Creates composite control and sets the default layout data.
-	 *
-	 * @param parent  the parent of the new composite
-	 * @param numColumns  the number of columns for the new composite
-	 * @return the newly-created coposite
-	 */
-	private Composite createComposite(Composite parent, int numColumns) {
-		Composite composite = new Composite(parent, SWT.NULL);
-
-		//GridLayout
-		GridLayout layout = new GridLayout();
-		layout.numColumns = numColumns;
-		layout.marginWidth = 0;
-		layout.marginHeight = 0;
-		composite.setLayout(layout);
-
-		//GridData
-		GridData data = new GridData();
-		data.verticalAlignment = GridData.FILL;
-		data.horizontalAlignment = GridData.FILL;
-		composite.setLayoutData(data);
+	private Composite createGeneralTab(final TabFolder tabFolder) {
+		final Composite composite = SWTUtils.createHFillComposite(tabFolder, SWTUtils.MARGINS_DEFAULT);
+		final TabItem tab= new TabItem(tabFolder, SWT.NONE);
+		tab.setText(Policy.bind("CVSPreferencesPage.14")); //$NON-NLS-1$
+		tab.setControl(composite);
+		new Checkbox(composite, ICVSUIConstants.PREF_DETERMINE_SERVER_VERSION,  Policy.bind("CVSPreferencesPage.15"), IHelpContextIds.PREF_DETERMINE_SERVER_VERSION); //$NON-NLS-1$
+		new Checkbox(composite, ICVSUIConstants.PREF_CONFIRM_MOVE_TAG, Policy.bind("CVSPreferencesPage.16"), IHelpContextIds.PREF_CONFIRM_MOVE_TAG); //$NON-NLS-1$
+		new Checkbox(composite, ICVSUIConstants.PREF_DEBUG_PROTOCOL, Policy.bind("CVSPreferencesPage.17"), IHelpContextIds.PREF_DEBUG_PROTOCOL); //$NON-NLS-1$
+		new Checkbox(composite, ICVSUIConstants.PREF_AUTO_REFRESH_TAGS_IN_TAG_SELECTION_DIALOG, Policy.bind("CVSPreferencesPage.18"), IHelpContextIds.PREF_AUTOREFRESH_TAG); //$NON-NLS-1$
 		return composite;
 	}
+	
+	private Composite createConnectionTab(final TabFolder tabFolder) {
+		final Composite composite = SWTUtils.createHFillComposite(tabFolder, SWTUtils.MARGINS_DEFAULT);
+		final TabItem tab= new TabItem(tabFolder, SWT.NONE);
+		tab.setText(Policy.bind("CVSPreferencesPage.19")); //$NON-NLS-1$
+		tab.setControl(composite);
+		new Checkbox(composite, ICVSUIConstants.PREF_DETERMINE_SERVER_VERSION,  Policy.bind("CVSPreferencesPage.20"), IHelpContextIds.PREF_DETERMINE_SERVER_VERSION); //$NON-NLS-1$
+		new Checkbox(composite, ICVSUIConstants.PREF_DEBUG_PROTOCOL, Policy.bind("CVSPreferencesPage.21"), IHelpContextIds.PREF_DEBUG_PROTOCOL); //$NON-NLS-1$
+		new Checkbox(composite, ICVSUIConstants.PREF_AUTO_REFRESH_TAGS_IN_TAG_SELECTION_DIALOG, Policy.bind("CVSPreferencesPage.22"), IHelpContextIds.PREF_AUTOREFRESH_TAG); //$NON-NLS-1$
 
-	/**
-	 * Creates an new checkbox instance and sets the default
-	 * layout data.
-	 *
-	 * @param group  the composite in which to create the checkbox
-	 * @param label  the string to set into the checkbox
-	 * @return the new checkbox
-	 */
-	private Button createCheckBox(Composite group, String label) {
-		Button button = new Button(group, SWT.CHECK | SWT.LEFT);
-		button.setText(label);
-		GridData data = new GridData();
-		data.horizontalSpan = 2;
-		button.setLayoutData(data);
-		return button;
-	}
-
-	/**
-	 * @see PreferencePage#createContents(Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		Composite composite = createComposite(parent, 2);
-
-		pruneEmptyDirectoriesField = createCheckBox(composite, Policy.bind("CVSPreferencePage.pruneEmptyDirectories")); //$NON-NLS-1$	
-		replaceUnmanaged = createCheckBox(composite, Policy.bind("CVSPreferencePage.replaceUnmanaged")); //$NON-NLS-1$
-		repositoriesAreBinary = createCheckBox(composite, Policy.bind("CVSPreferencePage.repositoriesAreBinary")); //$NON-NLS-1$
-		determineVersionEnabled = createCheckBox(composite, Policy.bind("CVSPreferencePage.determineVersionEnabled")); //$NON-NLS-1$
-		confirmMoveTag = createCheckBox(composite, Policy.bind("CVSPreferencePage.confirmMoveTag")); //$NON-NLS-1$
-		debugProtocol = createCheckBox(composite, Policy.bind("CVSPreferencePage.debugProtocol")); //$NON-NLS-1$
-		usePlatformLineend = createCheckBox(composite, Policy.bind("CVSPreferencePage.lineend")); //$NON-NLS-1$
-		autoRefreshTags = createCheckBox(composite, Policy.bind("CVSPreferencePage.autoRefreshTags")); //$NON-NLS-1$
-			
-		createLabel(composite, ""); createLabel(composite, ""); //$NON-NLS-1$ //$NON-NLS-2$
-		
-		createLabel(composite, Policy.bind("CVSPreferencePage.timeoutValue")); //$NON-NLS-1$
-		timeoutValue = createTextField(composite);
-		timeoutValue.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
+		SWTUtils.createPlaceholder(composite, 1);
+		final Composite textComposite= SWTUtils.createHFillComposite(composite, SWTUtils.MARGINS_NONE, 2);
+		new TextField(
+				textComposite, 
+				ICVSUIConstants.PREF_TIMEOUT, 
+				Policy.bind("CVSPreferencesPage.23"),  //$NON-NLS-1$
+				IHelpContextIds.PREF_COMMS_TIMEOUT) {
+			protected void modifyText(Text text) {
 				// Parse the timeout value
 				try {
-					int x = Integer.parseInt(timeoutValue.getText());
+					final int x = Integer.parseInt(text.getText());
 					if (x >= 0) {
 						setErrorMessage(null);
 						setValid(true);
 					} else {
-						setErrorMessage(Policy.bind("CVSPreferencesPage.Timeout_must_not_be_negative_1")); //$NON-NLS-1$
+						setErrorMessage(Policy.bind("CVSPreferencesPage.24")); //$NON-NLS-1$
 						setValid(false);
 					}
 				} catch (NumberFormatException ex) {
-					setErrorMessage(Policy.bind("CVSPreferencesPage.Timeout_must_be_a_number_2")); //$NON-NLS-1$
+					setErrorMessage(Policy.bind("CVSPreferencesPage.25")); //$NON-NLS-1$
 					setValid(false);
 				}
 			}
-		});
+		};
 		
-		createLabel(composite, Policy.bind("CVSPreferencePage.quietness")); //$NON-NLS-1$
-		quietnessCombo = createCombo(composite);
-
-		createLabel(composite, Policy.bind("CVSPreferencePage.compressionLevel")); //$NON-NLS-1$
-		compressionLevelCombo = createCombo(composite);
+		final ComboBox quietnessCombo = new IntegerComboBox(
+				textComposite, 
+				ICVSUIConstants.PREF_QUIETNESS, 
+				Policy.bind("CVSPreferencesPage.26"),  //$NON-NLS-1$
+				IHelpContextIds.PREF_QUIET,
+				new String [] { Policy.bind("CVSPreferencesPage.27"), Policy.bind("CVSPreferencesPage.28"), Policy.bind("CVSPreferencesPage.29") }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				new Integer [] { new Integer(0), new Integer(1), new Integer(2)});
 		
-		createLabel(composite, Policy.bind("CVSPreferencePage.defaultTextKSubst")); //$NON-NLS-1$
-		int chars = 0;
-		for (Iterator it = ksubstOptions.iterator(); it.hasNext();) {
-			KSubstOption option = (KSubstOption) it.next();
-			int c = option.getLongDisplayText().length();
-			if(c > chars) {
-				chars = c;
-			}
-		}
-		ksubstCombo = createCombo(composite, chars);
-		
-		createLabel(composite, ""); createLabel(composite, ""); //$NON-NLS-1$ //$NON-NLS-2$
-				
-		createSaveCombo(composite);
-				
-		initializeValues();
-		
-		quietnessCombo.addSelectionListener(new SelectionListener() {
+		quietnessCombo.getCombo().addSelectionListener(new SelectionListener() {
 			public void widgetSelected(SelectionEvent e) {
-				if (getQuietnessOptionFor(quietnessCombo.getSelectionIndex()).equals(Command.SILENT)) {
-					MessageDialog.openWarning(getShell(), Policy.bind("CVSPreferencePage.silentWarningTitle"), Policy.bind("CVSPreferencePage.silentWarningMessage")); //$NON-NLS-1$ //$NON-NLS-2$
+				if (getQuietnessOptionFor(quietnessCombo.getCombo().getSelectionIndex()).equals(Command.SILENT)) {
+					MessageDialog.openWarning(getShell(), Policy.bind("CVSPreferencesPage.30"), Policy.bind("CVSPreferencesPage.31"));  //$NON-NLS-1$ //$NON-NLS-2$
 				}
 			}
 			public void widgetDefaultSelected(SelectionEvent e) {
@@ -231,139 +434,114 @@
 			}
 		});
 
-		WorkbenchHelp.setHelp(pruneEmptyDirectoriesField, IHelpContextIds.PREF_PRUNE);
-		WorkbenchHelp.setHelp(compressionLevelCombo, IHelpContextIds.PREF_COMPRESSION);
-		WorkbenchHelp.setHelp(quietnessCombo, IHelpContextIds.PREF_QUIET);
-		WorkbenchHelp.setHelp(ksubstCombo, IHelpContextIds.PREF_KEYWORDMODE);
-		WorkbenchHelp.setHelp(usePlatformLineend, IHelpContextIds.PREF_LINEEND);
-		WorkbenchHelp.setHelp(timeoutValue, IHelpContextIds.PREF_COMMS_TIMEOUT);
-		WorkbenchHelp.setHelp(replaceUnmanaged, IHelpContextIds.PREF_REPLACE_DELETE_UNMANAGED);
-		WorkbenchHelp.setHelp(repositoriesAreBinary, IHelpContextIds.PREF_TREAT_NEW_FILE_AS_BINARY);
-		WorkbenchHelp.setHelp(determineVersionEnabled, IHelpContextIds.PREF_DETERMINE_SERVER_VERSION);
-		WorkbenchHelp.setHelp(confirmMoveTag, IHelpContextIds.PREF_CONFIRM_MOVE_TAG);
-		WorkbenchHelp.setHelp(autoRefreshTags, IHelpContextIds.PREF_AUTOREFRESH_TAG);
-		Dialog.applyDialogFont(parent);
+		new IntegerComboBox(
+				textComposite, 
+				ICVSUIConstants.PREF_COMPRESSION_LEVEL, 
+				Policy.bind("CVSPreferencesPage.32"),  //$NON-NLS-1$
+				IHelpContextIds.PREF_COMPRESSION, 
+				COMPRESSION_LABELS, COMPRESSION_VALUES);
+
 		return composite;
 	}
-	/**
-	 * Utility method that creates a label instance
-	 * and sets the default layout data.
-	 *
-	 * @param parent  the parent for the new label
-	 * @param text  the text for the new label
-	 * @return the new label
-	 */
-	private Label createLabel(Composite parent, String text) {
-		Label label = new Label(parent, SWT.LEFT);
-		label.setText(text);
-		GridData data = new GridData();
-		data.horizontalSpan = 1;
-		data.horizontalAlignment = GridData.FILL;
-		label.setLayoutData(data);
-		return label;
+
+	
+	private Composite createFilesFoldersTab(final TabFolder tabFolder) {
+		final Composite composite = SWTUtils.createHFillComposite(tabFolder, SWTUtils.MARGINS_DEFAULT);
+		final TabItem tab= new TabItem(tabFolder, SWT.NONE);
+		tab.setText(Policy.bind("CVSPreferencesPage.33")); //$NON-NLS-1$
+		tab.setControl(composite);
+		new Checkbox(composite, ICVSUIConstants.PREF_REPOSITORIES_ARE_BINARY, Policy.bind("CVSPreferencesPage.34"), IHelpContextIds.PREF_TREAT_NEW_FILE_AS_BINARY); //$NON-NLS-1$
+		new Checkbox(composite, ICVSUIConstants.PREF_USE_PLATFORM_LINEEND, Policy.bind("CVSPreferencesPage.35"), IHelpContextIds.PREF_LINEEND); //$NON-NLS-1$
+		new Checkbox(composite, ICVSUIConstants.PREF_PRUNE_EMPTY_DIRECTORIES, Policy.bind("CVSPreferencesPage.36"), IHelpContextIds.PREF_PRUNE); //$NON-NLS-1$
+		new Checkbox(composite, ICVSUIConstants.PREF_REPLACE_UNMANAGED, Policy.bind("CVSPreferencesPage.37"), IHelpContextIds.PREF_REPLACE_DELETE_UNMANAGED); //$NON-NLS-1$
+		SWTUtils.createPlaceholder(composite, 1);
+		final Composite bottom= SWTUtils.createHFillComposite(composite, SWTUtils.MARGINS_NONE, 2);
+		new StringComboBox(
+				bottom, 
+				ICVSUIConstants.PREF_TEXT_KSUBST, 
+				Policy.bind("CVSPreferencesPage.38"),  //$NON-NLS-1$
+				IHelpContextIds.PREF_KEYWORDMODE, 
+				KSUBST_LABELS, KSUBST_VALUES);
+		
+		return composite;
 	}
-	/**
-	 * Creates an new text widget and sets the default
-	 * layout data.
-	 *
-	 * @param group  the composite in which to create the checkbox
-	 * @return the new text widget
-	 */ 
-	private Text createTextField(Composite group) {
-		Text text = new Text(group, SWT.BORDER);
-		text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		return text;
+	
+	private Composite createPromptingTab(final TabFolder tabFolder) {
+
+		final Composite composite = SWTUtils.createHFillComposite(tabFolder, SWTUtils.MARGINS_DEFAULT, 1);
+		final TabItem tab= new TabItem(tabFolder, SWT.NONE);
+		tab.setText(Policy.bind("CVSPreferencesPage.39")); //$NON-NLS-1$
+		tab.setControl(composite);
+		
+		new StringRadioButtons(
+				composite,
+				ICVSUIConstants.PREF_ALLOW_EMPTY_COMMIT_COMMENTS,
+				Policy.bind("CVSPreferencesPage.40"), //$NON-NLS-1$
+				IHelpContextIds.PREF_ALLOW_EMPTY_COMMIT_COMMENTS,
+				YES_NO_PROMPT,
+				new String [] { MessageDialogWithToggle.ALWAYS, MessageDialogWithToggle.NEVER, MessageDialogWithToggle.PROMPT });
+		
+		new IntegerRadioButtons(composite, 
+				ICVSUIConstants.PREF_SAVE_DIRTY_EDITORS, 
+				Policy.bind("CVSPreferencesPage.41"),  //$NON-NLS-1$
+				IHelpContextIds.PREF_SAVE_DIRTY_EDITORS, 
+	    		YES_NO_PROMPT,
+	    		new Integer [] { new Integer(ICVSUIConstants.OPTION_AUTOMATIC),	new Integer(ICVSUIConstants.OPTION_NEVER), 	new Integer(ICVSUIConstants.OPTION_PROMPT)});
+				
+	    new StringRadioButtons(
+	    		composite, 
+	    		ICVSUIConstants.PREF_CHANGE_PERSPECTIVE_ON_SHOW_ANNOTATIONS, 
+	    		Policy.bind("CVSPreferencesPage.42"), //$NON-NLS-1$
+	    		IHelpContextIds.PREF_CHANGE_PERSPECTIVE_ON_SHOW_ANNOTATIONS,
+	    		YES_NO_PROMPT,
+	    		new String [] { MessageDialogWithToggle.ALWAYS, MessageDialogWithToggle.NEVER,	MessageDialogWithToggle.PROMPT }
+	    		);
+	    
+	    SWTUtils.createPlaceholder(composite, 1);
+	    new StringComboBox(
+	    		composite, 
+	    		ICVSUIConstants.PREF_DEFAULT_PERSPECTIVE_FOR_SHOW_ANNOTATIONS,
+	    		Policy.bind("CVSPreferencesPage.43"), //$NON-NLS-1$
+	    		IHelpContextIds.PREF_DEFAULT_PERSPECTIVE_FOR_SHOW_ANNOTATIONS,
+	    		PERSPECTIVE_LABELS,
+	    		PERSPECTIVE_VALUES);
+
+		initializeValues();
+
+		return composite;
 	}
+	
 	/**
 	 * Initializes states of the controls from the preference store.
 	 */
 	private void initializeValues() {
-		IPreferenceStore store = getPreferenceStore();
-		pruneEmptyDirectoriesField.setSelection(store.getBoolean(ICVSUIConstants.PREF_PRUNE_EMPTY_DIRECTORIES));
-		timeoutValue.setText(new Integer(store.getInt(ICVSUIConstants.PREF_TIMEOUT)).toString());
-		repositoriesAreBinary.setSelection(store.getBoolean(ICVSUIConstants.PREF_REPOSITORIES_ARE_BINARY));
-		quietnessCombo.add(Policy.bind("CVSPreferencePage.notquiet")); //$NON-NLS-1$
-		quietnessCombo.add(Policy.bind("CVSPreferencePage.somewhatquiet")); //$NON-NLS-1$
-		quietnessCombo.add(Policy.bind("CVSPreferencePage.reallyquiet")); //$NON-NLS-1$
-		quietnessCombo.select(store.getInt(ICVSUIConstants.PREF_QUIETNESS));
-		for (int i = 0; i < 10; ++i) {
-			compressionLevelCombo.add(Policy.bind("CVSPreferencePage.level" + i)); //$NON-NLS-1$
+		final IPreferenceStore store = getPreferenceStore();
+		for (Iterator iter = fFields.iterator(); iter.hasNext();) {
+			((Field)iter.next()).initializeValue(store);
 		}
-		compressionLevelCombo.select(store.getInt(ICVSUIConstants.PREF_COMPRESSION_LEVEL));
-		for (Iterator it = ksubstOptions.iterator(); it.hasNext();) {
-			KSubstOption option = (KSubstOption) it.next();
-			ksubstCombo.add(option.getLongDisplayText());
-		}
-		ksubstCombo.select(getKSubstComboIndexFor(store.getString(ICVSUIConstants.PREF_TEXT_KSUBST)));
-		usePlatformLineend.setSelection(store.getBoolean(ICVSUIConstants.PREF_USE_PLATFORM_LINEEND));
-		replaceUnmanaged.setSelection(store.getBoolean(ICVSUIConstants.PREF_REPLACE_UNMANAGED));
-		determineVersionEnabled.setSelection(store.getBoolean(ICVSUIConstants.PREF_DETERMINE_SERVER_VERSION));
-		confirmMoveTag.setSelection(store.getBoolean(ICVSUIConstants.PREF_CONFIRM_MOVE_TAG));
-		debugProtocol.setSelection(store.getBoolean(ICVSUIConstants.PREF_DEBUG_PROTOCOL));
-		autoRefreshTags.setSelection(store.getBoolean(ICVSUIConstants.PREF_AUTO_REFRESH_TAGS_IN_TAG_SELECTION_DIALOG));
-		
-		initializeSaveRadios(store.getInt(ICVSUIConstants.PREF_SAVE_DIRTY_EDITORS));		
 	}
 
-   /**
-	* @see IWorkbenchPreferencePage#init(IWorkbench)
-	*/
 	public void init(IWorkbench workbench) {
 	}
 
-	/**
-	 * OK was clicked. Store the CVS preferences.
-	 *
-	 * @return whether it is okay to close the preference page
-	 */
 	public boolean performOk() {
-		
-		// Parse the timeout value
-		int timeout = Integer.parseInt(timeoutValue.getText());
 
-		IPreferenceStore store = getPreferenceStore();
-		
-		// set the provider preferences first because the preference change
-		// listeners invoked from the preference store change may need these
-		// values
-		
-		store.setValue(ICVSUIConstants.PREF_PRUNE_EMPTY_DIRECTORIES, pruneEmptyDirectoriesField.getSelection());
-		store.setValue(ICVSUIConstants.PREF_TIMEOUT, timeout);
-		store.setValue(ICVSUIConstants.PREF_QUIETNESS, quietnessCombo.getSelectionIndex());
-		store.setValue(ICVSUIConstants.PREF_COMPRESSION_LEVEL, compressionLevelCombo.getSelectionIndex());
-		// Text mode processed separately to avoid empty string in properties file.
-		String mode =((KSubstOption)ksubstOptions.get(ksubstCombo.getSelectionIndex())).toMode();
-		if (mode.length() == 0) {
-			mode = "-kkv"; //$NON-NLS-1$
+		final IPreferenceStore store = getPreferenceStore();
+		for (Iterator iter = fFields.iterator(); iter.hasNext();) {
+			((Field) iter.next()).performOk(store);
 		}
-		store.setValue(ICVSUIConstants.PREF_TEXT_KSUBST, mode);
-		store.setValue(ICVSUIConstants.PREF_USE_PLATFORM_LINEEND, usePlatformLineend.getSelection());
-		store.setValue(ICVSUIConstants.PREF_REPLACE_UNMANAGED, replaceUnmanaged.getSelection());
-		store.setValue(ICVSUIConstants.PREF_SAVE_DIRTY_EDITORS, getSaveRadio());
-		store.setValue(ICVSUIConstants.PREF_REPOSITORIES_ARE_BINARY, repositoriesAreBinary.getSelection());
-		store.setValue(ICVSUIConstants.PREF_DETERMINE_SERVER_VERSION, determineVersionEnabled.getSelection());
-		store.setValue(ICVSUIConstants.PREF_CONFIRM_MOVE_TAG, confirmMoveTag.getSelection());
-		store.setValue(ICVSUIConstants.PREF_DEBUG_PROTOCOL, debugProtocol.getSelection());
-		store.setValue(ICVSUIConstants.PREF_AUTO_REFRESH_TAGS_IN_TAG_SELECTION_DIALOG, autoRefreshTags.getSelection());
-		
-		CVSProviderPlugin.getPlugin().setReplaceUnmanaged(
-			store.getBoolean(ICVSUIConstants.PREF_REPLACE_UNMANAGED));
-		CVSProviderPlugin.getPlugin().setPruneEmptyDirectories(
-			store.getBoolean(ICVSUIConstants.PREF_PRUNE_EMPTY_DIRECTORIES));
-		CVSProviderPlugin.getPlugin().setTimeout(
-			store.getInt(ICVSUIConstants.PREF_TIMEOUT));
-		CVSProviderPlugin.getPlugin().setQuietness(
-			getQuietnessOptionFor(store.getInt(ICVSUIConstants.PREF_QUIETNESS)));
-		CVSProviderPlugin.getPlugin().setCompressionLevel(
-			store.getInt(ICVSUIConstants.PREF_COMPRESSION_LEVEL));
-		CVSProviderPlugin.getPlugin().setDebugProtocol(
-					store.getBoolean(ICVSUIConstants.PREF_DEBUG_PROTOCOL));
+
+		CVSProviderPlugin.getPlugin().setReplaceUnmanaged(store.getBoolean(ICVSUIConstants.PREF_REPLACE_UNMANAGED));
+		CVSProviderPlugin.getPlugin().setPruneEmptyDirectories(store.getBoolean(ICVSUIConstants.PREF_PRUNE_EMPTY_DIRECTORIES));
+		CVSProviderPlugin.getPlugin().setTimeout(store.getInt(ICVSUIConstants.PREF_TIMEOUT));
+		CVSProviderPlugin.getPlugin().setQuietness(getQuietnessOptionFor(store.getInt(ICVSUIConstants.PREF_QUIETNESS)));
+		CVSProviderPlugin.getPlugin().setCompressionLevel(store.getInt(ICVSUIConstants.PREF_COMPRESSION_LEVEL));
+		CVSProviderPlugin.getPlugin().setDebugProtocol(store.getBoolean(ICVSUIConstants.PREF_DEBUG_PROTOCOL));
 		CVSProviderPlugin.getPlugin().setRepositoriesAreBinary(store.getBoolean(ICVSUIConstants.PREF_REPOSITORIES_ARE_BINARY));
 		KSubstOption oldKSubst = CVSProviderPlugin.getPlugin().getDefaultTextKSubstOption();
 		KSubstOption newKSubst = KSubstOption.fromMode(store.getString(ICVSUIConstants.PREF_TEXT_KSUBST));
 		CVSProviderPlugin.getPlugin().setDefaultTextKSubstOption(newKSubst);
-		CVSProviderPlugin.getPlugin().setUsePlatformLineend(
-				store.getBoolean(ICVSUIConstants.PREF_USE_PLATFORM_LINEEND));
+		CVSProviderPlugin.getPlugin().setUsePlatformLineend(store.getBoolean(ICVSUIConstants.PREF_USE_PLATFORM_LINEEND));
 		CVSProviderPlugin.getPlugin().setDetermineVersionEnabled(store.getBoolean(ICVSUIConstants.PREF_DETERMINE_SERVER_VERSION));
 		CVSProviderPlugin.getPlugin().setConfirmMoveTagEnabled(store.getBoolean(ICVSUIConstants.PREF_CONFIRM_MOVE_TAG));
 		
@@ -377,52 +555,14 @@
 		return true;
 	}
 
-	/**
-	 * Defaults was clicked. Restore the CVS preferences to
-	 * their default values
-	 */
 	protected void performDefaults() {
 		super.performDefaults();
-		IPreferenceStore store = getPreferenceStore();
-		pruneEmptyDirectoriesField.setSelection(
-			store.getDefaultBoolean(ICVSUIConstants.PREF_PRUNE_EMPTY_DIRECTORIES));
-		timeoutValue.setText(new Integer(store.getDefaultInt(ICVSUIConstants.PREF_TIMEOUT)).toString());
-		quietnessCombo.select(store.getDefaultInt(ICVSUIConstants.PREF_QUIETNESS));
-		compressionLevelCombo.select(store.getDefaultInt(ICVSUIConstants.PREF_COMPRESSION_LEVEL));
-		ksubstCombo.select(getKSubstComboIndexFor(store.getDefaultString(ICVSUIConstants.PREF_TEXT_KSUBST)));
-		usePlatformLineend.setSelection(store.getDefaultBoolean(ICVSUIConstants.PREF_USE_PLATFORM_LINEEND));
-		replaceUnmanaged.setSelection(store.getDefaultBoolean(ICVSUIConstants.PREF_REPLACE_UNMANAGED));
-		initializeSaveRadios(store.getDefaultInt(ICVSUIConstants.PREF_SAVE_DIRTY_EDITORS));
-		repositoriesAreBinary.setSelection(store.getDefaultBoolean(ICVSUIConstants.PREF_REPOSITORIES_ARE_BINARY));
-		confirmMoveTag.setSelection(store.getDefaultBoolean(ICVSUIConstants.PREF_CONFIRM_MOVE_TAG));
-		debugProtocol.setSelection(store.getDefaultBoolean(ICVSUIConstants.PREF_DEBUG_PROTOCOL));
-		autoRefreshTags.setSelection(store.getDefaultBoolean(ICVSUIConstants.PREF_AUTO_REFRESH_TAGS_IN_TAG_SELECTION_DIALOG));
+		final IPreferenceStore store = getPreferenceStore();
+		for (Iterator iter = fFields.iterator(); iter.hasNext();) {
+			((Field) iter.next()).performDefaults(store);
+		}
 	}
 
-   private void createSaveCombo(Composite composite) {
-		Group group = new Group(composite, SWT.NULL);
-		GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL);
-		data.horizontalSpan = 2;
-		group.setLayoutData(data);
-		GridLayout layout = new GridLayout();
-		group.setLayout(layout);
-		group.setText(Policy.bind("CVSPreferencePage.Save_dirty_editors_before_CVS_operations_1")); //$NON-NLS-1$
-		
-		never = new Button(group, SWT.RADIO | SWT.LEFT);
-		never.setLayoutData(new GridData());
-		never.setText(Policy.bind("CVSPreferencePage.&Never_2")); //$NON-NLS-1$
-		
-		prompt = new Button(group, SWT.RADIO | SWT.LEFT);
-		prompt.setLayoutData(new GridData());
-		prompt.setText(Policy.bind("CVSPreferencePage.&Prompt_3")); //$NON-NLS-1$
-		
-		auto = new Button(group, SWT.RADIO | SWT.LEFT);
-		auto.setLayoutData(new GridData());
-		auto.setText(Policy.bind("CVSPreferencePage.Auto-&save_4")); //$NON-NLS-1$
-		
-		WorkbenchHelp.setHelp(group, IHelpContextIds.PREF_SAVE_DIRTY_EDITORS);
-   }
-   
    /**
 	* Returns preference store that belongs to the our plugin.
 	* This is important because we want to store
@@ -442,42 +582,4 @@
 		}
 		return null;
 	}
-	
-	protected int getKSubstComboIndexFor(String mode) {
-		KSubstOption ksubst = KSubstOption.fromMode(mode);
-		int i = 0;
-		for (Iterator it = ksubstOptions.iterator(); it.hasNext();) {
-			KSubstOption option = (KSubstOption) it.next();
-			if (ksubst.equals(option)) return i;
-			i++;
-		}
-		// unknown option, add it to the list
-		ksubstOptions.add(ksubst);
-		ksubstCombo.add(ksubst.getLongDisplayText());
-		return i;
-	}
-	
-	protected void initializeSaveRadios(int option) {
-		auto.setSelection(false);
-		never.setSelection(false);
-		prompt.setSelection(false);
-		switch(option) {
-			case ICVSUIConstants.OPTION_AUTOMATIC:
-				auto.setSelection(true); break;
-			case ICVSUIConstants.OPTION_NEVER:
-				never.setSelection(true); break;
-			case ICVSUIConstants.OPTION_PROMPT:
-				prompt.setSelection(true); break;
-		}
-	}
-	
-	protected int getSaveRadio() {
-		if(auto.getSelection()) {
-			return ICVSUIConstants.OPTION_AUTOMATIC;
-		} else if(never.getSelection()) {
-			return ICVSUIConstants.OPTION_NEVER;
-		} else {
-			return ICVSUIConstants.OPTION_PROMPT;
-		}
-	}
 }
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/ComparePreferencePage.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/ComparePreferencePage.java
index 240e63e..4332ebc 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/ComparePreferencePage.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/ComparePreferencePage.java
@@ -51,7 +51,7 @@
 		});
 		addField(new BooleanFieldEditor(
 		        ICVSUIConstants.PREF_SHOW_COMPARE_REVISION_IN_DIALOG, 
-		        Policy.bind("CVSPreferencePage.showCompareMergeInSync"),  //$NON-NLS-1$
+		        Policy.bind("ComparePreferencePage.3"),  //$NON-NLS-1$
 				BooleanFieldEditor.DEFAULT, 
 				getFieldEditorParent()));
 		addField(new BooleanFieldEditor(
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/IHelpContextIds.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/IHelpContextIds.java
index 7bedf07..45b9007 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/IHelpContextIds.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/IHelpContextIds.java
@@ -73,6 +73,7 @@
 	public static final String REFRESH_REMOTE_PROJECT_SELECTION_PAGE = PREFIX + "refresh_remote_project_selection_page_context"; //$NON-NLS-1$
 
 	// Preference Pages
+	public static final String PREF_DEBUG_PROTOCOL = PREFIX + "debug_protocol_pref"; //$NON-NLS-1$
 	public static final String PREF_PRUNE = PREFIX + "prune_empty_directories_pref"; //$NON-NLS-1$
 	public static final String PREF_QUIET = PREFIX + "quietness_level_pref"; //$NON-NLS-1$
 	public static final String PREF_COMPRESSION = PREFIX + "compression_level_pref"; //$NON-NLS-1$
@@ -82,6 +83,9 @@
 	public static final String PREF_CONSIDER_CONTENT = PREFIX + "consider_content_pref"; //$NON-NLS-1$
 	public static final String PREF_REPLACE_DELETE_UNMANAGED = PREFIX + "replace_deletion_of_unmanaged_pref"; //$NON-NLS-1$
 	public static final String PREF_SAVE_DIRTY_EDITORS = PREFIX + "save_dirty_editors_pref"; //$NON-NLS-1$
+	public static final String PREF_CHANGE_PERSPECTIVE_ON_SHOW_ANNOTATIONS = PREFIX + "change_perspective_on_show_annotations"; //$NON-NLS-1$
+	public static final String PREF_ALLOW_EMPTY_COMMIT_COMMENTS = PREFIX + "allow_empty_commit_comment"; //$NON-NLS-1$
+	public static final String PREF_DEFAULT_PERSPECTIVE_FOR_SHOW_ANNOTATIONS = PREFIX + "show_annotations_perspective"; //$NON-NLS-1$
 
 	public static final String PREF_TREAT_NEW_FILE_AS_BINARY = PREFIX + "treat_new_files_as_binary_pref"; //$NON-NLS-1$
 	public static final String PREF_DETERMINE_SERVER_VERSION = PREFIX + "determine_server_version"; //$NON-NLS-1$
@@ -148,4 +152,7 @@
 	public static final String PROJECT_PROPERTY_PAGE = PREFIX + "project_property_page_context"; //$NON-NLS-1$
 	public static final String FOLDER_PROPERTY_PAGE = PREFIX + "folder_property_page_context"; //$NON-NLS-1$
 	public static final String FILE_PROPERTY_PAGE = PREFIX + "file_property_page_context"; //$NON-NLS-1$
+
+
+
 }
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/WorkInProgressPreferencePage.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/WorkInProgressPreferencePage.java
deleted file mode 100644
index 05a6600..0000000
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/WorkInProgressPreferencePage.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.team.internal.ccvs.ui;
-
-import java.text.Collator;
-import java.util.Arrays;
-import java.util.Comparator;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.jface.preference.*;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.team.internal.ui.preferences.ComboFieldEditor;
-import org.eclipse.ui.*;
-
-public class WorkInProgressPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
-    
-	private static class PerspectiveDescriptorComparator implements Comparator {
-		/*
-		 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
-		 */
-		public int compare(Object o1, Object o2) {
-			if (o1 instanceof IPerspectiveDescriptor && o2 instanceof IPerspectiveDescriptor) {
-				String id1= ((IPerspectiveDescriptor)o1).getLabel();
-				String id2= ((IPerspectiveDescriptor)o2).getLabel();
-				return Collator.getInstance().compare(id1, id2);
-			}
-			return 0;
-		}
-	}
-    
-	public WorkInProgressPreferencePage() {
-		super(GRID);
-		setTitle(Policy.bind("WorkInProgressPreferencePage.0")); //$NON-NLS-1$
-		setDescription(Policy.bind("WorkInProgressPreferencePage.1")); //$NON-NLS-1$
-		setPreferenceStore(CVSUIPlugin.getPlugin().getPreferenceStore());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.FieldEditorPreferencePage#createFieldEditors()
-	 */
-	public void createFieldEditors() {	
-	    
-	    addField(new RadioGroupFieldEditor(
-		        ICVSUIConstants.PREF_CHANGE_PERSPECTIVE_ON_SHOW_ANNOTATIONS, 
-		        Policy.bind("WorkInProgressPreferencePage.7"), //$NON-NLS-1$
-		        3,
-				new String[][] {
-		            {Policy.bind("WorkInProgressPreferencePage.8"), MessageDialogWithToggle.ALWAYS},  //$NON-NLS-1$
-		            {Policy.bind("WorkInProgressPreferencePage.2"), MessageDialogWithToggle.NEVER},  //$NON-NLS-1$
-		            {Policy.bind("WorkInProgressPreferencePage.3"), MessageDialogWithToggle.PROMPT} //$NON-NLS-1$
-		        },
-		        getFieldEditorParent(), true));
-		
-		
-
-		
-		final Group perspectiveGroup = createGroup(
-		        getFieldEditorParent(), 
-		        Policy.bind("WorkInProgressPreferencePage.4"));  //$NON-NLS-1$
-
-		handleDeletedPerspectives();
-		final String[][] perspectiveNamesAndIds = getPerspectiveNamesAndIds();
-		
-		ComboFieldEditor comboEditor= new ComboFieldEditor(
-			ICVSUIConstants.PREF_DEFAULT_PERSPECTIVE_FOR_SHOW_ANNOTATIONS,
-			Policy.bind("WorkInProgressPreferencePage.5"), //$NON-NLS-1$
-			perspectiveNamesAndIds,
-			perspectiveGroup);
-		addField(comboEditor);
-
-		addField(new RadioGroupFieldEditor(
-		        ICVSUIConstants.PREF_ALLOW_EMPTY_COMMIT_COMMENTS,
-		        "&Allow empty commit comments:", //$NON-NLS-1$
-		        3,
-				new String[][] {
-		            { "Yes", MessageDialogWithToggle.ALWAYS},  //$NON-NLS-1$
-		            { "No", MessageDialogWithToggle.NEVER},  //$NON-NLS-1$
-		            { "Prompt", MessageDialogWithToggle.PROMPT} //$NON-NLS-1$
-		        },
-		        getFieldEditorParent(), true));
-
-		updateLayout(perspectiveGroup);
-		getFieldEditorParent().layout(true);	
-		
-		Dialog.applyDialogFont(getFieldEditorParent());
-	    
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
-	 */
-	public void init(IWorkbench workbench) {
-	}		
-	
-	private Group createGroup(Composite parent, String title) {
-		Group display = new Group(parent, SWT.NONE);
-		updateLayout(display);
-		GridData data = new GridData();
-		data.horizontalSpan = 2;
-		data.horizontalAlignment = GridData.FILL;
-		display.setLayoutData(data);						
-		display.setText(title);
-		return display;
-	}
-	
-	private void updateLayout(Composite composite) {
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.marginWidth = 5;
-		layout.marginHeight =5;
-		layout.horizontalSpacing = 5;
-		layout.verticalSpacing = 5;
-		composite.setLayout(layout);
-	}
-
-	private static void handleDeletedPerspectives() {
-		final IPreferenceStore store= CVSUIPlugin.getPlugin().getPreferenceStore();
-		final String id= store.getString(ICVSUIConstants.PREF_DEFAULT_PERSPECTIVE_FOR_SHOW_ANNOTATIONS);
-		if (PlatformUI.getWorkbench().getPerspectiveRegistry().findPerspectiveWithId(id) == null) {
-			store.putValue(ICVSUIConstants.PREF_DEFAULT_PERSPECTIVE_FOR_SHOW_ANNOTATIONS, ICVSUIConstants.OPTION_NO_PERSPECTIVE);
-		}
-	}	
-	
-	private String[][] getPerspectiveNamesAndIds() {
-	    
-	    final IPerspectiveRegistry registry= PlatformUI.getWorkbench().getPerspectiveRegistry();
-	    final IPerspectiveDescriptor[] perspectiveDescriptors= registry.getPerspectives();
-	    
-	    Arrays.sort(perspectiveDescriptors, new PerspectiveDescriptorComparator());
-	    
-	    final String[][] table = new String[perspectiveDescriptors.length + 1][2];
-	    table[0][0] = Policy.bind("WorkInProgressPreferencePage.6"); //$NON-NLS-1$
-	    table[0][1] = ICVSUIConstants.OPTION_NO_PERSPECTIVE;
-	    for (int i = 0; i < perspectiveDescriptors.length; i++) {
-	        table[i + 1][0] = perspectiveDescriptors[i].getLabel();
-	        table[i + 1][1] = perspectiveDescriptors[i].getId();
-	    }
-	    return table;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/messages.properties b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/messages.properties
index 86191ec..bc6cd1f 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/messages.properties
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/messages.properties
@@ -224,44 +224,53 @@
 CVSPropertiesPage.module=Module:
 CVSPropertiesPage.defaultPort=Default
 CVSPropertiesPage.tag=Tag:
+CVSPreferencesPage.0=0 (disabled)
+CVSPreferencesPage.1=1
+CVSPreferencesPage.2=2
+CVSPreferencesPage.3=3
+CVSPreferencesPage.4=4
+CVSPreferencesPage.5=5
+CVSPreferencesPage.6=6
+CVSPreferencesPage.7=7
+CVSPreferencesPage.8=8
+CVSPreferencesPage.9=9 (highest compression)
+CVSPreferencesPage.10=None
+CVSPreferencesPage.11=Yes
+CVSPreferencesPage.12=No
+CVSPreferencesPage.13=Prompt
+CVSPreferencesPage.14=&General
+CVSPreferencesPage.15=&Validate server version compatibility on first connection
+CVSPreferencesPage.16=Confirm &move tag on tag operation
+CVSPreferencesPage.17=P&rint detailed protocol output to stdout (for debugging)
+CVSPreferencesPage.18=R&efresh tags when comparing or replacing tags
+CVSPreferencesPage.19=&Connection
+CVSPreferencesPage.20=&Validate server version compatibility on first connection
+CVSPreferencesPage.21=&Display detailed protocol output to stdout (for debugging purposes)
+CVSPreferencesPage.22=R&efresh tags when comparing or replacing tags
+CVSPreferencesPage.23=C&onnection timeout:
+CVSPreferencesPage.24=Timeout must be positive
+CVSPreferencesPage.25=The timeout must be a number
+CVSPreferencesPage.26=&Quietness level:
+CVSPreferencesPage.27=Verbose
+CVSPreferencesPage.28=Somewhat quiet
+CVSPreferencesPage.29=Very quiet
+CVSPreferencesPage.30='Very Quiet' mode is dangerous
+CVSPreferencesPage.31=In 'Very Quiet' mode, some cvs servers may not communicate important information about errors that have occurred. You may want to consider using 'Somewhat quiet' mode instead.
+CVSPreferencesPage.32=Compre&ssion:
+CVSPreferencesPage.33=&Files and Folders
+CVSPreferencesPage.34=&Treat all new files as binary
+CVSPreferencesPage.35=Con&vert text files to use platform line ending
+CVSPreferencesPage.36=P&rune empty directories
+CVSPreferencesPage.37=&Delete unmanaged resources on replace
+CVSPreferencesPage.38=Default te&xt mode:
+CVSPreferencesPage.39=&Prompting
+CVSPreferencesPage.40=A&llow empty commit comments
+CVSPreferencesPage.41=A&utomatically save dirty editors before CVS operations
+CVSPreferencesPage.42=S&witch perspective after a 'Show Annotations' operation
+CVSPreferencesPage.43=D&efault perspective for 'Show Annotations':
 CVSPropertiesPage.update=Change &Tag...
 CVSPropertiesPage.virtualModule=<no corresponding remote folder>
 
-CVSPreferencePage.description=General CVS settings:
-CVSPreferencePage.debugProtocol=&Display detailed protocol output to stdout (for debugging purposes)
-CVSPreferencePage.pruneEmptyDirectories=&Prune empty directories
-CVSPreferencePage.timeoutValue=&Communication timeout (in seconds):
-CVSPreferencePage.quietness=&Quietness level:
-CVSPreferencePage.notquiet=Verbose
-CVSPreferencePage.somewhatquiet=Somewhat quiet
-CVSPreferencePage.reallyquiet=Very quiet
-CVSPreferencePage.silentWarningTitle="Very Quiet" mode is dangerous
-CVSPreferencePage.silentWarningMessage= In "Very Quiet" mode, some cvs servers may not communicate important information about errors that have occurred. You may want to consider using "Somewhat quiet" mode instead.
-CVSPreferencePage.considerContentsInCompare=Con&sider file contents in comparisons
-CVSPreferencePage.showAddRemoveMarkers=Show deleted file &markers
-CVSPreferencePage.replaceUnmanaged=&Delete unmanaged resources on replace
-CVSPreferencePage.defaultTextKSubst=Default &keyword substitution:
-CVSPreferencePage.compressionLevel=Compression &level:
-CVSPreferencePage.level0=0 (disabled)
-CVSPreferencePage.level1=1 (lowest compression)
-CVSPreferencePage.level2=2
-CVSPreferencePage.level3=3
-CVSPreferencePage.level4=4
-CVSPreferencePage.level5=5
-CVSPreferencePage.level6=6
-CVSPreferencePage.level7=7
-CVSPreferencePage.level8=8
-CVSPreferencePage.level9=9 (highest compression)
-CVSPreferencePage.lineend=Con&vert text files to use platform line ending
-CVSPreferencePage.autoRefreshTags=R&efresh tags when comparing or replacing tags from another branch or version
-CVSPreferencePage.Save_dirty_editors_before_CVS_operations_1=Save dirty editors before CVS operations
-CVSPreferencePage.&Never_2=&Never
-CVSPreferencePage.&Prompt_3=P&rompt
-CVSPreferencePage.Auto-&save_4=&Auto-save
-CVSPreferencePage.repositoriesAreBinary=&Treat all new files as binary
-CVSPreferencePage.determineVersionEnabled=&Validate server version compatibility on first connection
-CVSPreferencePage.confirmMoveTag=Confirm &move tag on tag operation
-CVSPreferencePage.showCompareMergeInSync=Show revision &comparisons in a dialog
 
 CVSRemoteFilePropertySource.name=Name
 CVSRemoteFilePropertySource.revision=Revision
@@ -869,6 +878,7 @@
 CVSProjectPropertiesPage.setReadOnly=Setting all files read-only
 CVSProjectPropertiesPage.clearReadOnly=Setting all files writable
 CVSRepositoryPropertiesPage.Confirm_Project_Sharing_Changes_1=Confirm Project Sharing Changes
+CVSPreferencePage.Save_dirty_editors_before_CVS_operations_1=
 CVSRepositoryPropertiesPage.There_are_projects_in_the_workspace_shared_with_this_repository_2=There are projects in the workspace shared with this repository. The projects will be updated with the new information that you have entered
 CVSRepositoryPropertiesPage.sharedProject=The projects that are shared with {0} are:
 CVSRepositoryPropertiesPage.useDefaultProgramName=Expect the &default program name "cvs" in text message prefixes from this server
@@ -905,8 +915,6 @@
 AlternateUserValidationDialog.message=Enter the password for {0}:
 WorkbenchUserAuthenticator.The_operation_was_canceled_by_the_user_1=The operation was canceled by the user
 CVSCatchupReleaseViewer.No_workspace_file_1=No workspace file
-CVSPreferencesPage.Timeout_must_not_be_negative_1=Timeout must not be negative
-CVSPreferencesPage.Timeout_must_be_a_number_2=Timeout must be a number
 CVSCatchupReleaseViewer.Select_&Outgoing_Additions_1=Select New Reso&urces
 ForceCommitSyncAction.Outgoing_Changes_Not_Added_1=Outgoing Changes Not Added
 ForceCommitSyncAction.You_have_chosen_to_commit_new_resources_which_have_not_been_added_to_version_control._Do_you_wish_to_add_them_to_version_control_now__2=You have chosen to commit new resources which have not been added to version control. Do you wish to add them to version control now?
@@ -1141,14 +1149,6 @@
 CommitCommentArea.4=Re&member decision?
 
 OverrideAndUpdateAction.jobName=Performing CVS Override and Update on {0} resources
-WorkInProgressPreferencePage.0=CVS Work In Progress
-WorkInProgressPreferencePage.1=Preferences for enabling features that are not complete:
-WorkInProgressPreferencePage.7=Switch to the associated perspective after a show annotations operation is complete:
-WorkInProgressPreferencePage.8=Al&ways
-WorkInProgressPreferencePage.2=N&ever
-WorkInProgressPreferencePage.3=&Prompt
-WorkInProgressPreferencePage.4=Associated perspective for the show annotations operation:
-WorkInProgressPreferencePage.5=Pe&rspective:
 WorkInProgressPreferencePage.6=None
 
 
@@ -1273,9 +1273,12 @@
 CVSRepositoryPropertiesPage.1=You have chosen to change the host name or repository root path for this location. You should ensure that this new information still identifies the same repository.
 CompareRevertAction.0=Reverting {0} resources
 CompareParticipant.0={0} ({1})
+
 ComparePreferencePage.0=Options for CVS comparisons:
 ComparePreferencePage.1=Show the &file author in compare editors
 ComparePreferencePage.2=Automatically enable co&mmit set grouping in CVS synchronizations
+ComparePreferencePage.3=Show revision &comparisons in a dialog
+
 FileModificationValidator.3=Perform Edit?
 FileModificationValidator.4=A CVS edit notification is required to be sent to the server in order to allow editing of one or more selected files. Continue?
 CVSSynchronizeViewPage.0=Show incoming grouped by comment
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/tags/TagRefreshButtonArea.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/tags/TagRefreshButtonArea.java
index 13b7a75..d4584bf 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/tags/TagRefreshButtonArea.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/tags/TagRefreshButtonArea.java
@@ -80,7 +80,7 @@
 		
 		
 		Dialog.applyDialogFont(buttonComp);
-		final int buttonWidth= SWTUtils.calculateButtonSize(converter, new Button [] { addButton, refreshButton });
+		final int buttonWidth= SWTUtils.calculateControlSize(converter, new Button [] { addButton, refreshButton });
 		refreshButton.setLayoutData(SWTUtils.createGridData(buttonWidth, SWT.DEFAULT, SWT.END, SWT.CENTER, false, false));
 		addButton.setLayoutData(SWTUtils.createGridData(buttonWidth, SWT.DEFAULT, SWT.END, SWT.CENTER, false, false));
 		
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/MergeWizardPage.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/MergeWizardPage.java
index 8c1cb71..4c29f82 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/MergeWizardPage.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/MergeWizardPage.java
@@ -67,7 +67,7 @@
         
         createEndTagArea(mainArea);
         createStartTagArea(mainArea);
-        SWTUtils.equalizeButtons(converter, new Button [] { endTagBrowseButton, startTagBrowseButton } );
+        SWTUtils.equalizeControls(converter, new Button [] { endTagBrowseButton, startTagBrowseButton } );
         
         createPreviewOptionArea(composite, converter);
         createTagRefreshArea(composite);
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/SWTUtils.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/SWTUtils.java
index 3716820..027c256 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/SWTUtils.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/SWTUtils.java
@@ -48,7 +48,7 @@
 	}
 	
     public static GridData createGridData(int width, int height, boolean hFill, boolean vFill) {
-        return createGridData(width, height, hFill ? SWT.FILL : SWT.BEGINNING, vFill ? SWT.FILL : SWT.TOP, hFill, vFill);
+        return createGridData(width, height, hFill ? SWT.FILL : SWT.BEGINNING, vFill ? SWT.FILL : SWT.CENTER, hFill, vFill);
     }
     
     public static GridData createGridData(int width, int height, int hAlign, int vAlign, boolean hGrab, boolean vGrab) {
@@ -72,11 +72,11 @@
         return createHFillComposite(parent, margins, 1);
     }
     
-    public static Composite createHFillComposite(Composite parent, int margins, int rows) {
+    public static Composite createHFillComposite(Composite parent, int margins, int columns) {
         final Composite composite= new Composite(parent, SWT.NONE);
         composite.setFont(parent.getFont());
         composite.setLayoutData(createHFillGridData());
-        composite.setLayout(createGridLayout(rows, new PixelConverter(parent), margins));
+        composite.setLayout(createGridLayout(columns, new PixelConverter(parent), margins));
         return composite;
     }
     
@@ -84,11 +84,11 @@
         return createHVFillComposite(parent, margins, 1);
     }
     
-    public static Composite createHVFillComposite(Composite parent, int margins, int rows) {
+    public static Composite createHVFillComposite(Composite parent, int margins, int columns) {
         final Composite composite= new Composite(parent, SWT.NONE);
         composite.setFont(parent.getFont());
         composite.setLayoutData(createHVFillGridData());
-        composite.setLayout(createGridLayout(rows, new PixelConverter(parent), margins));
+        composite.setLayout(createGridLayout(columns, new PixelConverter(parent), margins));
         return composite;
     }
 
@@ -245,23 +245,41 @@
     	return new PixelConverter(control);
     }
     
-	public static int calculateButtonSize(PixelConverter converter, Button [] buttons) {
+	public static int calculateControlSize(PixelConverter converter, Control [] controls) {
+		return calculateControlSize(converter, controls, 0, controls.length - 1);
+	}
+
+	public static int calculateControlSize(PixelConverter converter, Control [] controls, int start, int end) {
 		int minimum= converter.convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
-		for (int i = 0; i < buttons.length; i++) {
-			final int length= buttons[i].computeSize(SWT.DEFAULT, SWT.DEFAULT).x;
+		for (int i = start; i <= end; i++) {
+			final int length= controls[i].computeSize(SWT.DEFAULT, SWT.DEFAULT).x;
 			if (minimum < length)
 				minimum= length;
 		}
 		return minimum;
 	}
 	
-	public static void equalizeButtons(PixelConverter converter, Button [] buttons) {
-		final int size= calculateButtonSize(converter, buttons);
-		for (int i = 0; i < buttons.length; i++) {
-			final Button button= buttons[i];
+	public static void equalizeControls(PixelConverter converter, Control [] controls) {
+		equalizeControls(converter, controls, 0, controls.length - 1);
+	}
+
+	public static void equalizeControls(PixelConverter converter, Control [] controls, int start, int end) {
+		final int size= calculateControlSize(converter, controls, start, end);
+		for (int i = start; i <= end; i++) {
+			final Control button= controls[i];
 			if (button.getLayoutData() instanceof GridData) {
 				((GridData)button.getLayoutData()).widthHint= size;
 			}
 		}
 	}
+
+	public static int getWidthInCharsForLongest(PixelConverter converter, String [] strings) {
+		int minimum= 0;
+		for (int i = 0; i < strings.length; i++) {
+			final int length= converter.convertWidthInCharsToPixels(strings[i].length());
+			if (minimum < length)
+				minimum= length;
+		}
+		return minimum;
+	}
 }
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/preferences/TextPreferencePage.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/preferences/TextPreferencePage.java
index bba0e5f..195a306 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/preferences/TextPreferencePage.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/preferences/TextPreferencePage.java
@@ -199,7 +199,7 @@
 		 * Calculate and set the button size 
 		 */
 		applyDialogFont(composite);
-		final int buttonWidth= SWTUtils.calculateButtonSize(converter, new Button [] { addExtensionButton, addNameButton, fChangeButton, fRemoveButton });
+		final int buttonWidth= SWTUtils.calculateControlSize(converter, new Button [] { addExtensionButton, addNameButton, fChangeButton, fRemoveButton });
 		addExtensionButton.setLayoutData(SWTUtils.createGridData(buttonWidth, SWT.DEFAULT, SWT.FILL, SWT.FILL, false, false));
 		addNameButton.setLayoutData(SWTUtils.createGridData(buttonWidth, SWT.DEFAULT, SWT.FILL, SWT.FILL, false, false));
 		fChangeButton.setLayoutData(SWTUtils.createGridData(buttonWidth, SWT.DEFAULT, SWT.FILL, SWT.FILL, false, false));