* CheckedTreeSelectionDialog#createSelectionButtons(Composite) fails to
* align the selection buttons to the right
* François Rajotte - Support for multiple columns + selection control
+ * Patrick Tasse - Fix Sonar warnings
+ * Generoso Pagano - Add tree filter
*******************************************************************************/
package org.eclipse.linuxtools.tmf.ui.widgets.timegraph.dialogs;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.ISelectionStatusValidator;
+import org.eclipse.ui.dialogs.PatternFilter;
import org.eclipse.ui.dialogs.SelectionStatusDialog;
/**
- * Filter dialog for the time graphs
- * This class is derived from the CheckedTreeSelectionDialog
- * It was necessary to develop this similar dialog to allow multiple columns
+ * Filter dialog for the time graphs This class is derived from the
+ * CheckedTreeSelectionDialog It was necessary to develop this similar dialog to
+ * allow multiple columns
*
* @version 1.0
* @since 2.0
* @author François Rajotte
*/
public class TimeGraphFilterDialog extends SelectionStatusDialog {
- private final static int BUTTON_CHECK_SELECTED_ID = IDialogConstants.CLIENT_ID;
- private final static int BUTTON_UNCHECK_SELECTED_ID = IDialogConstants.CLIENT_ID + 1;
- private final static int BUTTON_CHECK_SUBTREE_ID = IDialogConstants.CLIENT_ID + 2;
- private final static int BUTTON_UNCHECK_SUBTREE_ID = IDialogConstants.CLIENT_ID + 3;
+ private static final int BUTTON_CHECK_SELECTED_ID = IDialogConstants.CLIENT_ID;
+ private static final int BUTTON_UNCHECK_SELECTED_ID = IDialogConstants.CLIENT_ID + 1;
+ private static final int BUTTON_CHECK_SUBTREE_ID = IDialogConstants.CLIENT_ID + 2;
+ private static final int BUTTON_UNCHECK_SUBTREE_ID = IDialogConstants.CLIENT_ID + 3;
+ private static final int DEFAULT_WIDTH = 60;
+ private static final int DEFAULT_HEIGHT = 18;
- private CheckboxTreeViewer fViewer;
+ private FilteredCheckboxTree fTree;
private IBaseLabelProvider fLabelProvider;
private boolean fIsEmpty;
- private int fWidth = 60;
+ private int fWidth = DEFAULT_WIDTH;
- private int fHeight = 18;
+ private int fHeight = DEFAULT_HEIGHT;
private Object[] fExpandedElements;
*/
public TimeGraphFilterDialog(Shell parent) {
super(parent);
- setResult(new ArrayList<Object>(0));
+ setResult(new ArrayList<>(0));
setStatusLineAboveButtons(true);
setHelpAvailable(false);
fExpandedElements = null;
*/
public void addFilter(ViewerFilter filter) {
if (fFilters == null) {
- fFilters = new ArrayList<ViewerFilter>(4);
+ fFilters = new ArrayList<>();
}
fFilters.add(filter);
}
* The elements that will be expanded.
*/
public void setExpandedElements(Object[] elements) {
- fExpandedElements = elements;
+ if (elements != null) {
+ fExpandedElements = Arrays.copyOf(elements, elements.length);
+ } else {
+ fExpandedElements = null;
+ }
}
/**
}
/**
- * @param contentProvider The content provider for the table
+ * @param contentProvider
+ * The content provider for the table
*/
public void setContentProvider(ITreeContentProvider contentProvider) {
fContentProvider = contentProvider;
}
/**
- * @param labelProvider The label provider for the table
+ * @param labelProvider
+ * The label provider for the table
*/
public void setLabelProvider(IBaseLabelProvider labelProvider) {
fLabelProvider = labelProvider;
}
/**
- * @param columnNames An array of column names to display
+ * @param columnNames
+ * An array of column names to display
*/
public void setColumnNames(String[] columnNames) {
- fColumnNames = columnNames;
+ if (columnNames != null) {
+ fColumnNames = Arrays.copyOf(columnNames, columnNames.length);
+ } else {
+ fColumnNames = null;
+ }
}
/**
protected void updateOKStatus() {
if (!fIsEmpty) {
if (fValidator != null) {
- fCurrStatus = fValidator.validate(fViewer.getCheckedElements());
+ fCurrStatus = fValidator.validate(fTree.getCheckedElements());
updateStatus(fCurrStatus);
} else if (!fCurrStatus.isOK()) {
fCurrStatus = new Status(IStatus.OK, PlatformUI.PLUGIN_ID,
return getReturnCode();
}
- private void access$superCreate() {
- super.create();
- }
-
@Override
protected void cancelPressed() {
setResult(null);
@Override
protected void computeResult() {
- setResult(Arrays.asList(fViewer.getCheckedElements()));
+ setResult(Arrays.asList(fTree.getCheckedElements()));
}
@Override
BusyIndicator.showWhile(null, new Runnable() {
@Override
public void run() {
- access$superCreate();
- fViewer.setCheckedElements(getInitialElementSelections()
+ TimeGraphFilterDialog.super.create();
+ fTree.setCheckedElements(getInitialElementSelections()
.toArray());
if (fExpandedElements != null) {
- fViewer.setExpandedElements(fExpandedElements);
+ fTree.getViewer().setExpandedElements(fExpandedElements);
}
updateOKStatus();
}
* @return the tree viewer
*/
protected CheckboxTreeViewer createTreeViewer(Composite parent) {
- fViewer = new CheckboxTreeViewer(parent, SWT.BORDER | SWT.MULTI);
+ PatternFilter filter = new TreePatternFilter();
+ filter.setIncludeLeadingWildcard(true);
+ fTree = new FilteredCheckboxTree(parent, SWT.BORDER | SWT.MULTI, filter, true);
- Tree tree = fViewer.getTree();
+ Tree tree = fTree.getViewer().getTree();
tree.setHeaderVisible(true);
for (String columnName : fColumnNames) {
TreeColumn column = new TreeColumn(tree, SWT.LEFT);
column.pack();
}
- fViewer.setContentProvider(fContentProvider);
- fViewer.setLabelProvider(fLabelProvider);
- fViewer.addCheckStateListener(new CheckStateListener());
- fViewer.addCheckStateListener(new ICheckStateListener() {
- @Override
- public void checkStateChanged(CheckStateChangedEvent event) {
- updateOKStatus();
- }
- });
- fViewer.setComparator(fComparator);
+ fTree.getViewer().setContentProvider(fContentProvider);
+ fTree.getViewer().setLabelProvider(fLabelProvider);
+ fTree.addCheckStateListener(new CheckStateListener());
+ fTree.getViewer().setComparator(fComparator);
if (fFilters != null) {
for (int i = 0; i != fFilters.size(); i++) {
- fViewer.addFilter(fFilters.get(i));
+ fTree.getViewer().addFilter(fFilters.get(i));
}
}
- fViewer.setInput(fInput);
+ fTree.getViewer().setInput(fInput);
- //pack the columns again for a nice view...
+ // pack the columns again for a nice view...
for (TreeColumn column : tree.getColumns()) {
column.pack();
}
- return fViewer;
+ return (CheckboxTreeViewer) fTree.getViewer();
}
/**
* @return the tree viewer
*/
protected CheckboxTreeViewer getTreeViewer() {
- return fViewer;
+ return (CheckboxTreeViewer) fTree.getViewer();
}
/**
IDialogConstants.DESELECT_ALL_ID, Messages.TmfTimeFilterDialog_UNCHECK_ALL,
false);
-
/*
* Apply the layout again after creating the buttons to override
* createButton messing with the columns
checkSelectedButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
- TreeSelection selection = (TreeSelection) fViewer.getSelection();
+ TreeSelection selection = (TreeSelection) fTree.getViewer().getSelection();
for (Object element : selection.toArray()) {
checkElement(element);
checkSubtreeButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
- TreeSelection selection = (TreeSelection) fViewer.getSelection();
+ TreeSelection selection = (TreeSelection) fTree.getViewer().getSelection();
for (Object element : selection.toArray()) {
checkElementAndSubtree(element);
Object[] viewerElements = fContentProvider.getElements(fInput);
for (int i = 0; i < viewerElements.length; i++) {
- fViewer.setSubtreeChecked(viewerElements[i], true);
+ fTree.setSubtreeChecked(viewerElements[i], true);
}
updateOKStatus();
uncheckSelectedButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
- TreeSelection selection = (TreeSelection) fViewer.getSelection();
+ TreeSelection selection = (TreeSelection) fTree.getViewer().getSelection();
for (Object element : selection.toArray()) {
uncheckElement(element);
uncheckSubtreeButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
- TreeSelection selection = (TreeSelection) fViewer.getSelection();
+ TreeSelection selection = (TreeSelection) fTree.getViewer().getSelection();
for (Object element : selection.toArray()) {
uncheckElement(element);
uncheckAllButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
- fViewer.setCheckedElements(new Object[0]);
+ Object[] viewerElements = fContentProvider.getElements(fInput);
+ for (Object element : viewerElements) {
+ if (fTree.getViewer().testFindItem(element) != null) {
+ // uncheck only visible roots and their children
+ uncheckElement(element);
+ }
+ }
updateOKStatus();
}
});
* The element to check.
*/
private void checkElement(Object element) {
- fViewer.setChecked(element, true);
+ fTree.setChecked(element, true);
Object parent = fContentProvider.getParent(element);
- if (parent != null) {
+ if (parent != null && !fTree.getChecked(parent)) {
checkElement(parent);
}
}
* The element to uncheck.
*/
private void uncheckElement(Object element) {
- fViewer.setChecked(element, false);
+ fTree.setChecked(element, false);
for (Object child : fContentProvider.getChildren(element)) {
uncheckElement(child);
private boolean evaluateIfTreeEmpty(Object input) {
Object[] elements = fContentProvider.getElements(input);
- if (elements.length > 0) {
- if (fFilters != null) {
- for (int i = 0; i < fFilters.size(); i++) {
- ViewerFilter curr = fFilters.get(i);
- elements = curr.filter(fViewer, input, elements);
- }
+ if (elements.length > 0 && fFilters != null) {
+ for (int i = 0; i < fFilters.size(); i++) {
+ ViewerFilter curr = fFilters.get(i);
+ elements = curr.filter(fTree.getViewer(), input, elements);
}
}
return elements.length == 0;
}
} catch (ClassCastException e) {
return;
+ } finally {
+ updateOKStatus();
}
}
+
}
-}
+}
\ No newline at end of file