/******************************************************************************* * Copyright (c) 2008 SAP AG 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: * Stefan Dimov, stefan.dimov@sap.com - initial API and implementation *******************************************************************************/ package org.eclipse.jst.j2ee.internal.ui; import java.util.ArrayList; import java.util.Hashtable; import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.ViewerRow; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.TableEditor; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableItem; public class DoubleCheckboxTableViewer extends CheckboxTableViewer { protected int mSecondCheckboxColumnIndex; protected ICheckStateListener lstnr = null; public DoubleCheckboxTableViewer(Table table, int secondCheckBoxColumnIndex) { super(table); if (secondCheckBoxColumnIndex < 1) throw new IllegalArgumentException( "The index of the second column with check box must be bigger than zero"); //$NON-NLS-1$ mSecondCheckboxColumnIndex = secondCheckBoxColumnIndex; } @Override public void addCheckStateListener(ICheckStateListener listener) { super.addCheckStateListener(listener); lstnr = listener; } @Override public void removeCheckStateListener(ICheckStateListener listener) { super.removeCheckStateListener(listener); lstnr = null; getTable().getItems(); for (int i = 0; i < getTable().getItems().length; i++) { DoubleCheckboxTableItem it = (DoubleCheckboxTableItem)getTable().getItem(i); it.setTableListener(null); } } @Override protected ViewerRow internalCreateNewRowPart(int style, int rowIndex) { DoubleCheckboxTableItem item; if (rowIndex >= 0) { item = new DoubleCheckboxTableItem(getTable(), style, rowIndex, mSecondCheckboxColumnIndex, this); } else { item = new DoubleCheckboxTableItem(getTable(), style, mSecondCheckboxColumnIndex, this); } item.setTableListener(lstnr); TableEditor editor = new TableEditor(getTable()); editor.minimumWidth = item.getSecondCheckBox().getSize ().x; editor.horizontalAlignment = SWT.CENTER; editor.setEditor(item.getSecondCheckBox(), item, mSecondCheckboxColumnIndex); return getViewerRowFromItem(item); } public Object[] getSecondCheckedItems() { TableItem[] children = getTable().getItems(); ArrayList v = new ArrayList(children.length); for (int i = 0; i < children.length; i++) { DoubleCheckboxTableItem item = (DoubleCheckboxTableItem)children[i]; if (item.getSecondChecked()) { v.add(item); } } return v.toArray(); } public void setAllSecondChecked(boolean state) { TableItem[] children = getTable().getItems(); for (int i = 0; i < children.length; i++) { DoubleCheckboxTableItem item = (DoubleCheckboxTableItem)children[i]; item.setSecondChecked(state); } } public Object[] getSingleCheckedElements() { TableItem[] children = getTable().getItems(); ArrayList v = new ArrayList(children.length); for (int i = 0; i < children.length; i++) { DoubleCheckboxTableItem item = (DoubleCheckboxTableItem)children[i]; if (item.getChecked() && (!item.getSecondChecked())) { v.add(item.getData()); } } return v.toArray(); } public Object[] getDoubleCheckedElements() { TableItem[] children = getTable().getItems(); ArrayList v = new ArrayList(children.length); for (int i = 0; i < children.length; i++) { DoubleCheckboxTableItem item = (DoubleCheckboxTableItem)children[i]; if (item.getChecked() && item.getSecondChecked()) { v.add(item.getData()); } } return v.toArray(); } public Object[] getUncheckedItems() { TableItem[] children = getTable().getItems(); ArrayList v = new ArrayList(children.length); for (int i = 0; i < children.length; i++) { TableItem item = children[i]; if (!item.getChecked()) { v.add(item); } } return v.toArray(); } public Object[] getSecondUncheckedElements() { TableItem[] children = getTable().getItems(); ArrayList v = new ArrayList(children.length); for (int i = 0; i < children.length; i++) { DoubleCheckboxTableItem item = (DoubleCheckboxTableItem)children[i]; if (!item.getSecondChecked()) { v.add(item.getData()); } } return v.toArray(); } public void setSecondCheckedItems(Object[] inputItems) { assertElementsNotNull(inputItems); Hashtable set = new Hashtable(); for (int i = 0; i < inputItems.length; ++i) { set.put(inputItems[i], inputItems[i]); } TableItem[] items = getTable().getItems(); for (int i = 0; i < items.length; ++i) { DoubleCheckboxTableItem item = (DoubleCheckboxTableItem)items[i]; boolean check = set.containsKey(item); if (item.getSecondChecked() != check) { item.setSecondChecked(check); } } } @Override protected void doRemove(int start, int end) { // ensure that the second check box is disposed for (int i = start; i <= end; i++) { disposeSecondCheckboxOfItem(i); } super.doRemove(start, end); } @Override protected void doRemove(int[] indices) { // ensure that the second check box is disposed for (int i : indices) { disposeSecondCheckboxOfItem(i); } super.doRemove(indices); } private void disposeSecondCheckboxOfItem(int index) { TableItem item = getTable().getItem(index); if (item instanceof DoubleCheckboxTableItem) { ((DoubleCheckboxTableItem) item).disposeSecondCheckbox(); } } }