diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/dialogfields/CheckedListDialogField.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/dialogfields/CheckedListDialogField.java new file mode 100644 index 00000000000..f87c6135539 --- /dev/null +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/dialogfields/CheckedListDialogField.java @@ -0,0 +1,216 @@ +/******************************************************************************* + * 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.cdt.internal.ui.wizards.dialogfields; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Table; + +import org.eclipse.jface.util.Assert; +import org.eclipse.jface.viewers.CheckStateChangedEvent; +import org.eclipse.jface.viewers.CheckboxTableViewer; +import org.eclipse.jface.viewers.ICheckStateListener; +import org.eclipse.jface.viewers.ILabelProvider; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.TableViewer; + +/** + * A list with checkboxes and a button bar. Typical buttons are 'Check All' and 'Uncheck All'. + * List model is independend of widget creation. + * DialogFields controls are: Label, List and Composite containing buttons. + */ +public class CheckedListDialogField extends ListDialogField { + + private int fCheckAllButtonIndex; + private int fUncheckAllButtonIndex; + + private List fCheckElements; + + public CheckedListDialogField(IListAdapter adapter, String[] customButtonLabels, ILabelProvider lprovider) { + super(adapter, customButtonLabels, lprovider); + fCheckElements= new ArrayList(); + + fCheckAllButtonIndex= -1; + fUncheckAllButtonIndex= -1; + } + + /** + * Sets the index of the 'check' button in the button label array passed in the constructor. + * The behaviour of the button marked as the check button will then be handled internally. + * (enable state, button invocation behaviour) + */ + public void setCheckAllButtonIndex(int checkButtonIndex) { + Assert.isTrue(checkButtonIndex < fButtonLabels.length); + fCheckAllButtonIndex= checkButtonIndex; + } + + /** + * Sets the index of the 'uncheck' button in the button label array passed in the constructor. + * The behaviour of the button marked as the uncheck button will then be handled internally. + * (enable state, button invocation behaviour) + */ + public void setUncheckAllButtonIndex(int uncheckButtonIndex) { + Assert.isTrue(uncheckButtonIndex < fButtonLabels.length); + fUncheckAllButtonIndex= uncheckButtonIndex; + } + + + /* + * @see ListDialogField#createTableViewer + */ + protected TableViewer createTableViewer(Composite parent) { + Table table= new Table(parent, SWT.CHECK + getListStyle()); + CheckboxTableViewer tableViewer= new CheckboxTableViewer(table); + tableViewer.addCheckStateListener(new ICheckStateListener() { + public void checkStateChanged(CheckStateChangedEvent e) { + doCheckStateChanged(e); + } + }); + return tableViewer; + } + + + /* + * @see ListDialogField#getListControl + */ + public Control getListControl(Composite parent) { + Control control= super.getListControl(parent); + if (parent != null) { + ((CheckboxTableViewer)fTable).setCheckedElements(fCheckElements.toArray()); + } + return control; + } + + /* + * @see DialogField#dialogFieldChanged + * Hooks in to get element changes to update check model. + */ + public void dialogFieldChanged() { + for (int i= fCheckElements.size() -1; i >= 0; i--) { + if (!fElements.contains(fCheckElements.get(i))) { + fCheckElements.remove(i); + } + } + super.dialogFieldChanged(); + } + + private void checkStateChanged() { + //call super and do not update check model + super.dialogFieldChanged(); + } + + /** + * Gets the checked elements. + */ + public List getCheckedElements() { + return new ArrayList(fCheckElements); + } + + /** + * Returns true if the element is checked. + */ + public boolean isChecked(Object obj) { + return fCheckElements.contains(obj); + } + + /** + * Sets the checked elements. + */ + public void setCheckedElements(List list) { + fCheckElements= new ArrayList(list); + if (fTable != null) { + ((CheckboxTableViewer)fTable).setCheckedElements(list.toArray()); + } + checkStateChanged(); + } + + /** + * Sets the checked state of an element. + */ + public void setChecked(Object object, boolean state) { + setCheckedWithoutUpdate(object, state); + checkStateChanged(); + } + + /** + * Sets the checked state of an element. No dialog changed listener is informed. + */ + public void setCheckedWithoutUpdate(Object object, boolean state) { + if (!fCheckElements.contains(object)) { + fCheckElements.add(object); + } + if (fTable != null) { + ((CheckboxTableViewer)fTable).setChecked(object, state); + } + } + + /** + * Sets the check state of all elements + */ + public void checkAll(boolean state) { + if (state) { + fCheckElements= getElements(); + } else { + fCheckElements.clear(); + } + if (fTable != null) { + ((CheckboxTableViewer)fTable).setAllChecked(state); + } + checkStateChanged(); + } + + + protected void doCheckStateChanged(CheckStateChangedEvent e) { + if (e.getChecked()) { + fCheckElements.add(e.getElement()); + } else { + fCheckElements.remove(e.getElement()); + } + checkStateChanged(); + } + + // ------ enable / disable management + + /* + * @see ListDialogField#getManagedButtonState + */ + protected boolean getManagedButtonState(ISelection sel, int index) { + if (index == fCheckAllButtonIndex) { + return !fElements.isEmpty(); + } else if (index == fUncheckAllButtonIndex) { + return !fElements.isEmpty(); + } + return super.getManagedButtonState(sel, index); + } + + /* + * @see ListDialogField#extraButtonPressed + */ + protected boolean managedButtonPressed(int index) { + if (index == fCheckAllButtonIndex) { + checkAll(true); + } else if (index == fUncheckAllButtonIndex) { + checkAll(false); + } else { + return super.managedButtonPressed(index); + } + return true; + } + + + + + +} diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/dialogfields/ComboDialogField.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/dialogfields/ComboDialogField.java index 35d9854dff3..6b2d6333f1a 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/dialogfields/ComboDialogField.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/dialogfields/ComboDialogField.java @@ -122,7 +122,7 @@ public class ComboDialogField extends DialogField { return fComboControl; } - private void doModifyText(ModifyEvent e) { + protected void doModifyText(ModifyEvent e) { if (isOkToUse(fComboControl)) { fText= fComboControl.getText(); fSelectionIndex= fComboControl.getSelectionIndex(); @@ -130,7 +130,7 @@ public class ComboDialogField extends DialogField { dialogFieldChanged(); } - private void doSelectionChanged(SelectionEvent e) { + protected void doSelectionChanged(SelectionEvent e) { if (isOkToUse(fComboControl)) { fItems= fComboControl.getItems(); fText= fComboControl.getText(); diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/dialogfields/LinkToFileGroup.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/dialogfields/LinkToFileGroup.java index a531371daf9..8ac26a801bc 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/dialogfields/LinkToFileGroup.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/dialogfields/LinkToFileGroup.java @@ -46,20 +46,20 @@ import org.eclipse.ui.internal.dialogs.PathVariableSelectionDialog; */ public class LinkToFileGroup extends StringButtonDialogField { private String fText; - private Listener listener; + protected Listener listener; private String initialLinkTarget; private int type; - private boolean createLink = false; + protected boolean createLink = false; // used to compute layout sizes //private FontMetrics fontMetrics; // widgets //private Composite groupComposite; - private Text linkTargetField; - private Button linkButton; - private Button browseButton; - private Button variablesButton; + protected Text linkTargetField; + protected Button linkButton; + protected Button browseButton; + protected Button variablesButton; private Label resolvedPathLabelText; private Label resolvedPathLabelData; @@ -76,7 +76,7 @@ public class LinkToFileGroup extends StringButtonDialogField { Label label= getLabelControl(parent); label.setLayoutData(gridDataForLabel(1)); - Button checkButton = getLinkCheckButtonControl(parent); + //Button checkButton = getLinkCheckButtonControl(parent); Text text= getTextControl(parent); text.setLayoutData(gridDataForText(1)); @@ -242,7 +242,7 @@ public class LinkToFileGroup extends StringButtonDialogField { /** * Opens a file or directory browser depending on the link type. */ - private void handleLinkTargetBrowseButtonPressed() { + protected void handleLinkTargetBrowseButtonPressed() { String linkTargetName = linkTargetField.getText(); File file = null; String selection = null; @@ -279,7 +279,7 @@ public class LinkToFileGroup extends StringButtonDialogField { /** * Opens a path variable selection dialog */ - private void handleVariablesButtonPressed() { + protected void handleVariablesButtonPressed() { int variableTypes = IResource.FOLDER; // allow selecting file and folder variables when creating a @@ -300,7 +300,7 @@ public class LinkToFileGroup extends StringButtonDialogField { * a variable, if the value is a relative path. * Displays the resolved value if the entered value is a variable. */ - private void resolveVariable() { + protected void resolveVariable() { if(!linkTargetField.isEnabled()) return; diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/dialogfields/ListDialogField.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/dialogfields/ListDialogField.java index f8ddd7ec124..db326ad9ff3 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/dialogfields/ListDialogField.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/dialogfields/ListDialogField.java @@ -59,9 +59,9 @@ import org.eclipse.cdt.internal.ui.util.TableLayoutComposite; public class ListDialogField extends DialogField { public static class ColumnsDescription { - private ColumnLayoutData[] columns; - private String[] headers; - private boolean drawLines; + protected ColumnLayoutData[] columns; + protected String[] headers; + protected boolean drawLines; public ColumnsDescription(ColumnLayoutData[] columns, String[] headers, boolean drawLines) { this.columns= columns; @@ -103,7 +103,7 @@ public class ListDialogField extends DialogField { private Label fLastSeparator; - private Control fTableControl; + protected Control fTableControl; private Composite fButtonsControl; private ISelection fSelectionWhenEnabled; @@ -111,7 +111,7 @@ public class ListDialogField extends DialogField { private Object fParentElement; - private ColumnsDescription fTableColumns; + protected ColumnsDescription fTableColumns; /** @@ -438,7 +438,7 @@ public class ListDialogField extends DialogField { return fButtonsControl; } - private void doButtonSelected(SelectionEvent e) { + protected void doButtonSelected(SelectionEvent e) { if (fButtonControls != null) { for (int i= 0; i < fButtonControls.length; i++) { if (e.widget == fButtonControls[i]) { diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/dialogfields/SelectionButtonDialogField.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/dialogfields/SelectionButtonDialogField.java index 6484096dc2b..a69f1fb3330 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/dialogfields/SelectionButtonDialogField.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/dialogfields/SelectionButtonDialogField.java @@ -131,7 +131,7 @@ public class SelectionButtonDialogField extends DialogField { return fButton; } - private void doWidgetSelected(SelectionEvent e) { + protected void doWidgetSelected(SelectionEvent e) { if (isOkToUse(fButton)) { changeValue(fButton.getSelection()); } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/dialogfields/SelectionButtonDialogFieldGroup.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/dialogfields/SelectionButtonDialogFieldGroup.java index 35e2bd03b1c..396c52d589e 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/dialogfields/SelectionButtonDialogFieldGroup.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/dialogfields/SelectionButtonDialogFieldGroup.java @@ -183,7 +183,7 @@ public class SelectionButtonDialogFieldGroup extends DialogField { return null; } - private void doWidgetSelected(SelectionEvent e) { + protected void doWidgetSelected(SelectionEvent e) { Button button= (Button)e.widget; for (int i= 0; i < fButtons.length; i++) { if (fButtons[i] == button) { diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/dialogfields/StringDialogField.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/dialogfields/StringDialogField.java index 2f0deed424f..2bc15ba7a4d 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/dialogfields/StringDialogField.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/dialogfields/StringDialogField.java @@ -98,7 +98,7 @@ public class StringDialogField extends DialogField { return fTextControl; } - private void doModifyText(ModifyEvent e) { + protected void doModifyText(ModifyEvent e) { if (isOkToUse(fTextControl)) { fText= fTextControl.getText(); }