--- /dev/null
+/*******************************************************************************
+ * 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 net.sourceforge.phpdt.internal.ui.wizards.dialogfields;
+
+import java.util.ArrayList;
+import java.util.List;
+
+//incastrix
+//import org.eclipse.jface.text.Assert;
+import org.eclipse.core.runtime.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;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Table;
+
+/**
+ * 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();
+ }
+
+ private 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;
+ }
+
+}