blob: fd59de180ac5427ed01a865a114f101c94eca221 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2008 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.team.internal.ccvs.ui.wizards;
import java.text.Collator; // don't use ICU, pending resolution of issue
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialogWithToggle;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.*;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Item;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.team.internal.ccvs.core.client.Command.KSubstOption;
import org.eclipse.team.internal.ccvs.core.util.StringMatcher;
import org.eclipse.team.internal.ccvs.ui.*;
import org.eclipse.team.internal.ccvs.ui.wizards.ModeWizard.ModeChange;
import org.eclipse.team.internal.ui.PixelConverter;
import org.eclipse.team.internal.ui.SWTUtils;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.model.WorkbenchLabelProvider;
//TODO: Filtering the TableViewer is currently slow for large amounts of files. 3.1M5 will feature a framework to help with this, so wait until it is there.
//TODO: Files should be added to the viewer asynchronously, currently bringing up the dialog takes a lot of time for large selections (e.g. jdt.ui)
public class ModeWizardSelectionPage extends WizardPage {
private final static class ModeChangeCellModifier implements ICellModifier {
private final ModeChangeTable fTable;
public ModeChangeCellModifier(ModeChangeTable table) {
fTable= table;
}
public boolean canModify(Object element, String property) {
return PROPERTY_MODE.equals(property);
}
public Object getValue(Object element, String property) {
if (PROPERTY_MODE.equals(property)) {
final KSubstOption mode= ((ModeChange)element).getNewMode();
for (int i = 0; i < MODES.length; i++) {
if (MODES[i].equals(mode)) {
return Integer.valueOf(i);
}
}
}
return null;
}
public void modify(Object element, String property, Object value) {
if (element instanceof Item)
element= ((Item)element).getData();
if (PROPERTY_MODE.equals(property)) {
((ModeChange)element).setNewMode(MODES[((Integer)value).intValue()]);
fTable.modelChanged(true);
}
}
}
private final static class ModeChangeLabelProvider implements ITableLabelProvider {
private final DecoratingLabelProvider fDecoratingLP;
private final ModeChangeTable fTable;
public ModeChangeLabelProvider(ModeChangeTable table) {
fTable= table;
fDecoratingLP= new DecoratingLabelProvider(new WorkbenchLabelProvider(), PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator());
fDecoratingLP.addListener(fTable);
}
public Image getColumnImage(Object element, int columnIndex) {
if (columnIndex == INDEX_FILE) {
return fDecoratingLP.getImage(((ModeChange)element).getFile());
}
return null;
}
public String getColumnText(Object element, int columnIndex) {
final ModeChange change= (ModeChange)element;
switch (columnIndex) {
case INDEX_FILE: return (change.hasChanged() ? "* " : "") + change.getFile().getName(); //$NON-NLS-1$ //$NON-NLS-2$
case INDEX_MODE: return change.getNewMode().getLongDisplayText();
case INDEX_PATH: return change.getFile().getFullPath().toOSString();
}
throw new IllegalArgumentException();
}
public void addListener(ILabelProviderListener listener) {
}
public boolean isLabelProperty(Object element, String property) {
return false;
}
public void dispose() {
fDecoratingLP.removeListener(fTable);
}
public void removeListener(ILabelProviderListener listener) {
}
}
private final static class TableComparator extends ViewerComparator implements SelectionListener {
private final Collator fCollator;
private final TableViewer fViewer;
private final TableColumn fFile, fMode, fPath;
private int fIndex;
private boolean fAscending;
public TableComparator(TableViewer viewer, TableColumn fileColumn, TableColumn modeColumn, TableColumn pathColumn) {
// TODO: possible issue, TableSorter's Collator not shared with base class. Might cause problem switching to ICU collation.
fCollator= Collator.getInstance();
fViewer= viewer;
fFile= fileColumn;
fMode= modeColumn;
fPath= pathColumn;
// Set initial sorting to file column
fIndex= INDEX_FILE;
fViewer.getTable().setSortColumn(fFile);
fViewer.getTable().setSortDirection(SWT.DOWN);
fAscending= true;
fileColumn.addSelectionListener(this);
modeColumn.addSelectionListener(this);
pathColumn.addSelectionListener(this);
}
public int compare(Viewer viewer, Object e1, Object e2) {
final ModeChange mc1= (ModeChange)e1;
final ModeChange mc2= (ModeChange)e2;
final String s1, s2;
switch (fIndex) {
case INDEX_FILE:
s1= mc1.getFile().getName();
s2= mc2.getFile().getName();
break;
case INDEX_MODE:
s1= mc1.getNewMode().getLongDisplayText();
s2= mc2.getNewMode().getLongDisplayText();
break;
case INDEX_PATH:
s1= mc1.getFile().getFullPath().toOSString();
s2= mc2.getFile().getFullPath().toOSString();
break;
default:
throw new IllegalArgumentException();
}
final int compare= fCollator.compare(s1, s2);
return fAscending ? compare : -compare;
}
public void widgetSelected(SelectionEvent e) {
final int index= columnToIndex(e.widget);
if (index == fIndex) {
fIndex= index;
fAscending= !fAscending;
fViewer.getTable().setSortDirection(fAscending ? SWT.DOWN : SWT.UP);
} else {
fIndex= index;
TableColumn tableCol = null;
switch(fIndex){
case INDEX_FILE:
tableCol = fFile;
break;
case INDEX_MODE:
tableCol = fMode;
break;
case INDEX_PATH:
tableCol = fPath;
break;
}
fViewer.getTable().setSortColumn(tableCol);
fViewer.getTable().setSortDirection(fAscending ? SWT.DOWN : SWT.UP);
}
fViewer.refresh();
}
public void widgetDefaultSelected(SelectionEvent e) {
// nop
}
private int columnToIndex(Object column) {
if (column == fFile) return INDEX_FILE;
if (column == fMode) return INDEX_MODE;
if (column == fPath) return INDEX_PATH;
throw new IllegalArgumentException();
}
}
private static final class ModeChangeTable extends Observable implements ISelectionChangedListener, ILabelProviderListener {
private final List fChanges;
private final TableViewer fViewer;
private final Filter fFilter;
private int fNumberOfChanges;
public ModeChangeTable(Composite composite, PixelConverter converter, List changes) {
fChanges= changes;
fNumberOfChanges= 0;
/**
* Create a table.
*/
final Table table = new Table(composite, SWT.V_SCROLL | SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
table.setLayoutData(SWTUtils.createHVFillGridData());
table.setLinesVisible(false);
table.setHeaderVisible(true);
/**
* The 'File' column
*/
final TableColumn fileColumn = new TableColumn(table, SWT.NONE, INDEX_FILE);
fileColumn.setWidth(converter.convertWidthInCharsToPixels(LARGE_COLUMN));
fileColumn.setText(CVSUIMessages.ModeWizardSelectionPage_2);
table.setSortColumn(fileColumn);
table.setSortDirection(SWT.DOWN);
/**
* The 'Mode' column
*/
final TableColumn newModeColumn = new TableColumn(table, SWT.NONE, INDEX_MODE);
newModeColumn.setWidth(converter.convertWidthInCharsToPixels(COLUMN_MIN_WIDTH_IN_CHARS + 6));
newModeColumn.setText(CVSUIMessages.ModeWizardSelectionPage_3);
/**
* The 'Path' column
*/
final TableColumn pathColumn= new TableColumn(table, SWT.NONE, INDEX_PATH);
pathColumn.setWidth(converter.convertWidthInCharsToPixels(50));
pathColumn.setText(CVSUIMessages.ModeWizardSelectionPage_4);
fViewer= new TableViewer(table);
fViewer.setContentProvider(new ModeChangeContentProvider());
fViewer.setLabelProvider(new ModeChangeLabelProvider(this));
fViewer.getControl().setLayoutData(SWTUtils.createHVFillGridData());
final CellEditor newModeEditor = new ComboBoxCellEditor(table, COMBO_TEXT, SWT.READ_ONLY);
fViewer.setCellEditors(new CellEditor [] { null, newModeEditor, null });
fViewer.setColumnProperties(new String [] { PROPERTY_FILE, PROPERTY_MODE, PROPERTY_CHANGED });
fViewer.setCellModifier(new ModeChangeCellModifier(this));
fViewer.addFilter(fFilter= new Filter());
fViewer.setComparator(new TableComparator(fViewer, fileColumn, newModeColumn, pathColumn));
fViewer.setInput(fChanges);
//TODO: CVSLightweightDecorator.decorate() is lighter than normal decs.
fViewer.addSelectionChangedListener(this);
fileColumn.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
}
});
fViewer.refresh();
}
public TableViewer getViewer() {
return fViewer;
}
public void selectionChanged(SelectionChangedEvent event) {
setChanged();
notifyObservers(fViewer.getSelection());
}
public void modelChanged(boolean updateLabels) {
fViewer.refresh(updateLabels);
fNumberOfChanges= 0;
for (Iterator iter = fChanges.iterator(); iter.hasNext();) {
ModeChange change = (ModeChange) iter.next();
if (change.hasChanged())
++fNumberOfChanges;
}
setChanged();
notifyObservers();
}
public Filter getFilter() {
return fFilter;
}
public IStructuredSelection getSelection() {
return (IStructuredSelection)fViewer.getSelection();
}
public void labelProviderChanged(LabelProviderChangedEvent event) {
fViewer.refresh();
}
public void selectAll() {
fViewer.setSelection(new StructuredSelection(fChanges));
fViewer.getControl().setFocus();
}
public void selectNone() {
fViewer.setSelection(StructuredSelection.EMPTY);
fViewer.getControl().setFocus();
}
public int getNumberOfChanges() {
return fNumberOfChanges;
}
}
private static final class ModeChangeContentProvider implements IStructuredContentProvider {
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
public Object[] getElements(Object inputElement) {
// new FetchJob(fViewer, (List)inputElement, fPattern);
// return new Object[0];
return ((List)inputElement).toArray();
}
public void dispose() {
}
}
private static final class ModeCombo extends SelectionAdapter implements Observer {
private final Combo fCombo;
private final ModeChangeTable fTable;
public ModeCombo(ModeChangeTable table, Composite parent) {
fTable= table;
fCombo= new Combo(parent, SWT.READ_ONLY);
fCombo.setLayoutData(SWTUtils.createHFillGridData());
fCombo.setItems(COMBO_TEXT);
fCombo.addSelectionListener(this);
fTable.addObserver(this);
}
public void widgetSelected(SelectionEvent e) {
final KSubstOption mode= MODES[fCombo.getSelectionIndex()];
final IStructuredSelection selection= fTable.getSelection();
for (final Iterator iter = selection.iterator(); iter.hasNext();) {
final ModeChange change = (ModeChange) iter.next();
change.setNewMode(mode);
}
fTable.modelChanged(true);
}
public void update(Observable o, Object arg) {
final IStructuredSelection selection= (IStructuredSelection)fTable.getViewer().getSelection();
if (selection.isEmpty()) {
fCombo.deselectAll();
fCombo.setEnabled(false);
} else {
fCombo.setEnabled(true);
final KSubstOption option= ((ModeChange)selection.getFirstElement()).getNewMode();
for (Iterator iter = selection.iterator(); iter.hasNext();) {
if (option != ((ModeChange)iter.next()).getNewMode()) {
fCombo.deselectAll();
return;
}
}
fCombo.setText(option.getLongDisplayText());
}
}
}
private static final class Filter extends ViewerFilter {
private boolean fFilterUnchanged;
private StringMatcher fMatcher;
public Filter() {
fFilterUnchanged= false;
fMatcher= new StringMatcher("*", true, false); //$NON-NLS-1$
}
public boolean select(Viewer viewer, Object parentElement, Object element) {
final ModeChange change= (ModeChange)element;
if (fFilterUnchanged && !change.hasChanged())
return false;
if (!fMatcher.match(change.getFile().getName()))
return false;
return true;
}
public void setPattern(String pattern) {
pattern= pattern.trim();
if (!pattern.endsWith("*")) { //$NON-NLS-1$
pattern += "*"; //$NON-NLS-1$
}
fMatcher= new StringMatcher(pattern, true, false);
}
public void filterUnchanged(boolean filter) {
fFilterUnchanged= filter;
}
}
private static final class ResetButton extends SelectionAdapter implements Observer {
private final ModeChangeTable fTable;
private final Button fButton;
public ResetButton(ModeChangeTable table, Composite parent, PixelConverter converter) {
final int buttonWidth= converter.convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
fTable= table;
fButton= new Button(parent, SWT.NONE);
fButton.setLayoutData(SWTUtils.createGridData(buttonWidth, SWT.DEFAULT, SWT.FILL, SWT.CENTER, false, false));
fButton.setText(CVSUIMessages.ModeWizardSelectionPage_8);
fButton.setToolTipText(CVSUIMessages.ModeWizardSelectionPage_9);
fButton.addSelectionListener(this);
fTable.addObserver(this);
}
public void widgetSelected(SelectionEvent e) {
fButton.setEnabled(false);
final IStructuredSelection selection= fTable.getSelection();
for (Iterator iter = selection.iterator(); iter.hasNext();) {
final ModeChange change = (ModeChange) iter.next();
change.setNewMode(change.getMode());
}
fTable.modelChanged(true);
}
public void update(Observable o, Object arg) {
final IStructuredSelection selection= fTable.getSelection();
for (final Iterator iter = selection.iterator(); iter.hasNext();) {
if (((ModeChange)iter.next()).hasChanged()) {
fButton.setEnabled(true);
return;
}
}
fButton.setEnabled(false);
}
}
private static final class GuessButton extends SelectionAdapter implements Observer {
private final ModeChangeTable fTable;
private final Button fButton;
public GuessButton(ModeChangeTable table, Composite parent, PixelConverter converter) {
fTable= table;
final int buttonWidth= converter.convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
fButton= new Button(parent, SWT.NONE);
fButton.setLayoutData(SWTUtils.createGridData(buttonWidth, SWT.DEFAULT, SWT.FILL, SWT.CENTER, false, false));
fButton.setText(CVSUIMessages.ModeWizardSelectionPage_10);
fButton.setToolTipText(CVSUIMessages.ModeWizardSelectionPage_11);
fButton.addSelectionListener(this);
fTable.addObserver(this);
}
public void widgetSelected(SelectionEvent e) {
final IStructuredSelection selection= fTable.getSelection();
for (Iterator iter = selection.iterator(); iter.hasNext();) {
final ModeChange change = (ModeChange) iter.next();
change.setNewMode(KSubstOption.fromFile(change.getFile()));
}
fTable.modelChanged(true);
}
public void update(Observable o, Object arg) {
fButton.setEnabled(!fTable.getSelection().isEmpty());
}
}
private static final class SelectAllButton extends SelectionAdapter {
private final ModeWizardSelectionPage fPage;
private final Button fButton;
public SelectAllButton(ModeWizardSelectionPage page, Composite parent, PixelConverter converter) {
fPage= page;
final int buttonWidth= converter.convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
fButton= new Button(parent, SWT.NONE);
fButton.setLayoutData(SWTUtils.createGridData(buttonWidth, SWT.DEFAULT, SWT.FILL, SWT.CENTER, false, false));
fButton.setText(CVSUIMessages.ModeWizardSelectionPage_12);
fButton.addSelectionListener(this);
}
public void widgetSelected(SelectionEvent e) {
fPage.getTable().selectAll();
}
}
private static final class SelectNoneButton extends SelectionAdapter {
private final ModeWizardSelectionPage fPage;
private final Button fButton;
public SelectNoneButton(ModeWizardSelectionPage page, Composite parent, PixelConverter converter) {
fPage= page;
final int buttonWidth= converter.convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
fButton= new Button(parent, SWT.NONE);
fButton.setLayoutData(SWTUtils.createGridData(buttonWidth, SWT.DEFAULT, SWT.FILL, SWT.CENTER, false, false));
fButton.setText(CVSUIMessages.ModeWizardSelectionPage_13);
fButton.addSelectionListener(this);
}
public void widgetSelected(SelectionEvent e) {
fPage.getTable().selectNone();
}
}
private static final class ShowChangesOnlyCheckbox extends SelectionAdapter {
private final ModeWizardSelectionPage fPage;
private final Button fCheck;
public ShowChangesOnlyCheckbox(ModeWizardSelectionPage page, Composite parent) {
fPage= page;
fCheck= new Button(parent, SWT.CHECK);
fCheck.setText(CVSUIMessages.ModeWizardSelectionPage_14);
fCheck.setLayoutData(SWTUtils.createHFillGridData());
fCheck.setSelection(false);
fCheck.addSelectionListener(this);
}
public void widgetSelected(SelectionEvent e) {
final ModeChangeTable table= fPage.getTable();
table.getFilter().filterUnchanged(fCheck.getSelection());
table.modelChanged(true);
}
}
private static final class FilterTextBox extends SelectionAdapter implements ModifyListener {
private final ModeWizardSelectionPage fPage;
private final Text fTextField;
public FilterTextBox(ModeWizardSelectionPage page, Composite parent, PixelConverter converter) {
fPage= page;
fTextField= new Text(parent, SWT.SINGLE | SWT.BORDER);
fTextField.setLayoutData(SWTUtils.createHFillGridData());
final int buttonWidth= converter.convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
final Button button= new Button(parent, SWT.PUSH);
button.setText(CVSUIMessages.ModeWizardSelectionPage_15);
button.setLayoutData(SWTUtils.createGridData(buttonWidth, SWT.DEFAULT, SWT.FILL, SWT.CENTER, false, false));
button.addSelectionListener(this);
fTextField.addModifyListener(this);
}
public void widgetSelected(SelectionEvent e) {
fTextField.setText(""); //$NON-NLS-1$
fTextField.setFocus();
}
public void modifyText(ModifyEvent e) {
final ModeChangeTable table= fPage.getTable();
table.getFilter().setPattern(fTextField.getText());
table.modelChanged(false);
}
public void setFocus() {
fTextField.setFocus();
}
}
private static final class ChangeCounterLabel implements Observer {
private final Label fLabel;
private final ModeChangeTable fTable;
ChangeCounterLabel(Composite parent, ModeChangeTable table) {
fTable= table;
fTable.addObserver(this);
fLabel= SWTUtils.createLabel(parent, null);
fLabel.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DIALOG_FONT));
}
public void update(Observable o, Object arg) {
updateText(fTable.getNumberOfChanges());
}
/**
* @param numberOfChanges
*/
private void updateText(int numberOfChanges) {
fLabel.setText(NLS.bind(CVSUIMessages.ModeWizardSelectionPage_17, new String[] { Integer.toString(numberOfChanges) }));
}
}
private static final class SelectionCounterLabel implements Observer {
private final Label fLabel;
private final ModeChangeTable fTable;
public SelectionCounterLabel(Composite parent, ModeChangeTable table) {
fTable= table;
fTable.addObserver(this);
fLabel= new Label(parent, SWT.WRAP | SWT.RIGHT);
fLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
}
public void update(Observable o, Object arg) {
updateText(fTable.getSelection().size());
}
/**
* @param numberOfChanges
*/
private void updateText(int selected) {
fLabel.setText(NLS.bind(CVSUIMessages.ModeWizardSelectionPage_25, new String[] { Integer.toString(selected) }));
}
}
private final static int LARGE_COLUMN= 50;
protected static final int INDEX_FILE= 0;
protected static final int INDEX_MODE= 1;
protected static final int INDEX_PATH= 2;
protected static final String PROPERTY_FILE= "file"; //$NON-NLS-1$
protected static final String PROPERTY_MODE= "mode"; //$NON-NLS-1$
protected static final String PROPERTY_CHANGED= "changed"; //$NON-NLS-1$
protected static final KSubstOption [] MODES;
protected static final String [] COMBO_TEXT;
static final int COLUMN_MIN_WIDTH_IN_CHARS;
static {
MODES= KSubstOption.getAllKSubstOptions();
Arrays.sort(MODES, new Comparator() {
public int compare(Object a, Object b) {
String aKey = ((KSubstOption)a).getLongDisplayText();
String bKey = ((KSubstOption) b).getLongDisplayText();
return aKey.compareTo(bKey);
}
});
COMBO_TEXT= new String[MODES.length];
int maxLength= 0;
for (int i = 0; i < MODES.length; i++) {
COMBO_TEXT[i]= MODES[i].getLongDisplayText();
if (COMBO_TEXT[i].length() > maxLength) maxLength= COMBO_TEXT[i].length();
}
COLUMN_MIN_WIDTH_IN_CHARS= maxLength;
}
private final List fChanges;
protected ModeChangeTable fTable;
private CommitCommentArea fCommentArea;
public ModeWizardSelectionPage(List modeChanges) {
super(CVSUIMessages.ModeWizardSelectionPage_18, CVSUIMessages.ModeWizardSelectionPage_19, CVSUIPlugin.getPlugin().getImageDescriptor(ICVSUIConstants.IMG_WIZBAN_KEYWORD)); //
setDescription(CVSUIMessages.ModeWizardSelectionPage_20);
fChanges= modeChanges;
}
public void createControl(final Composite parent) {
final PixelConverter converter= SWTUtils.createDialogPixelConverter(parent);
final int horizontalSpace= converter.convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
final int verticalSpace= converter.convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
/**
* The main composite with the vertical sash
*/
final Composite mainComposite= SWTUtils.createHVFillComposite(parent, SWTUtils.MARGINS_DEFAULT);
// set F1 help
PlatformUI.getWorkbench().getHelpSystem().setHelp(mainComposite, IHelpContextIds.KEYWORD_SUBSTITUTION_PAGE);
final SashForm mainSash= new SashForm(mainComposite, SWT.VERTICAL);
mainSash.setLayoutData(SWTUtils.createHVFillGridData());
/**
* The composite with the filter box, the table and the selection and filter controls.
*/
final Composite topComposite= SWTUtils.createHVFillComposite(mainSash, SWTUtils.MARGINS_NONE);
((GridLayout)topComposite.getLayout()).marginBottom= verticalSpace;
final Composite topGroup= SWTUtils.createHVFillGroup(topComposite, CVSUIMessages.ModeWizardSelectionPage_21, SWTUtils.MARGINS_DIALOG);
final Composite filterComposite= SWTUtils.createHFillComposite(topGroup, SWTUtils.MARGINS_NONE, 2);
final FilterTextBox filterBox= new FilterTextBox(ModeWizardSelectionPage.this, filterComposite, converter);
fTable= new ModeChangeTable(topGroup, converter, fChanges);
final Composite selectionComposite= SWTUtils.createHFillComposite(topGroup, SWTUtils.MARGINS_NONE, 2);
new ChangeCounterLabel(selectionComposite, fTable);
new SelectionCounterLabel(selectionComposite, fTable);
new ShowChangesOnlyCheckbox(ModeWizardSelectionPage.this, selectionComposite);
final Composite buttonComposite= SWTUtils.createHFillComposite(selectionComposite, SWTUtils.MARGINS_NONE, 2);
buttonComposite.setLayoutData(new GridData());
new SelectAllButton(ModeWizardSelectionPage.this, buttonComposite, converter);
new SelectNoneButton(ModeWizardSelectionPage.this, buttonComposite, converter);
/**
* The bottom sash which separates the mode controls from the commit comment area
*/
final SashForm bottomSash= new SashForm(mainSash, SWT.NONE);
bottomSash.setLayoutData(SWTUtils.createHFillGridData());
/**
* The left composite with the mode controls.
*/
final Composite leftComposite= SWTUtils.createHVFillComposite(bottomSash, SWTUtils.MARGINS_NONE, 1);
((GridLayout)leftComposite.getLayout()).marginRight= horizontalSpace;
((GridLayout)leftComposite.getLayout()).marginTop= verticalSpace;
final Group leftGroup= SWTUtils.createHVFillGroup(leftComposite, CVSUIMessages.ModeWizardSelectionPage_22, SWTUtils.MARGINS_DIALOG, 3);
new ModeCombo(fTable, leftGroup);
new GuessButton(fTable, leftGroup, converter);
new ResetButton(fTable, leftGroup, converter);
SWTUtils.createPlaceholder(leftGroup, 1);
final Label infoLabel= SWTUtils.createLabel(leftGroup, CVSUIMessages.ModeWizardSelectionPage_23, 3);
fTable.addObserver(new Observer() {
public void update(Observable o, Object arg) {
final boolean enabled= !fTable.getSelection().isEmpty();
leftGroup.setEnabled(enabled);
infoLabel.setEnabled(enabled);
}
});
/**
* The right composite with the commit comment area.
*/
final Composite rightComposite= SWTUtils.createHVFillComposite(bottomSash, SWTUtils.MARGINS_NONE);
((GridLayout)rightComposite.getLayout()).marginLeft= horizontalSpace;
((GridLayout)rightComposite.getLayout()).marginTop= verticalSpace;
final Group rightGroup= SWTUtils.createHVFillGroup(rightComposite, CVSUIMessages.ModeWizardSelectionPage_24, SWTUtils.MARGINS_DIALOG);
(fCommentArea= new CommitCommentArea()).createArea(rightGroup);
/**
* Set up the page
*/
mainSash.setWeights(new int [] { 5, 2 });
bottomSash.setWeights(new int [] { 3, 2 });
fTable.modelChanged(true);
fTable.selectAll();
filterBox.setFocus();
setupListeners();
setControl(mainComposite);
validatePage();
}
private void setupListeners() {
fCommentArea.addPropertyChangeListener(new IPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
if (event.getProperty() != null) {
validatePage();
}
}
});
}
protected ModeChangeTable getTable() {
return fTable;
}
public List getChanges() {
final List changes= new ArrayList();
for (Iterator iter = fChanges.iterator(); iter.hasNext();) {
final ModeChange change = (ModeChange) iter.next();
if (change.hasChanged())
changes.add(change);
}
return changes;
}
public String getComment(Shell shell) {
return fCommentArea.getCommentWithPrompt(shell);
}
private void validatePage() {
if (fCommentArea.getComment(false).equals("")) { //$NON-NLS-1$
final IPreferenceStore store = CVSUIPlugin.getPlugin()
.getPreferenceStore();
final String allowEmptyComment = store
.getString(ICVSUIConstants.PREF_ALLOW_EMPTY_COMMIT_COMMENTS);
if (allowEmptyComment.equals(MessageDialogWithToggle.NEVER)) {
setPageComplete(false); // then the page is not complete
return;
}
}
setPageComplete(true);
}
}