/*******************************************************************************
* Copyright (c) 2017 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.windup.ui;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.FilteredList;
public class FilteredListComposite {
private ILabelProvider renderer;
private boolean ignoreCase = true;
private boolean isMultipleSelection = true;
private boolean matchEmptyString = true;
private boolean allowDuplicates = true;
private String filter = null;
protected FilteredList filteredList;
private Text filterText;
public FilteredListComposite(Composite parent, ILabelProvider renderer) {
this.renderer = renderer;
createFilterText(parent);
createFilteredList(parent);
}
/**
* Specifies if sorting and filtering is case sensitive.
*/
public void setIgnoreCase(boolean ignoreCase) {
this.ignoreCase = ignoreCase;
}
/**
* Specifies whether everything or nothing should be filtered on
* empty filter string.
*/
public void setMatchEmptyString(boolean matchEmptyString) {
this.matchEmptyString = matchEmptyString;
}
/**
* Specifies if multiple selection is allowed.
*/
public void setMultipleSelection(boolean multipleSelection) {
this.isMultipleSelection = multipleSelection;
}
/**
* Specifies whether duplicate entries are displayed or not.
*/
public void setAllowDuplicates(boolean allowDuplicates) {
this.allowDuplicates = allowDuplicates;
}
public void setListElements(Object[] elements) {
filteredList.setElements(elements);
handleElementsChanged();
}
protected void handleElementsChanged() {
boolean enabled = !filteredList.isEmpty();
filteredList.setEnabled(enabled);
filterText.setEnabled(enabled);
filteredList.setEnabled(enabled);
}
public void setFilter(String filter) {
if (filterText == null) {
this.filter = filter;
} else {
this.filterText.setText(filter);
}
}
protected void createFilteredList(Composite parent) {
int flags = SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL
| (isMultipleSelection ? SWT.MULTI : SWT.SINGLE);
filteredList = new FilteredList(parent, flags, renderer,
ignoreCase, allowDuplicates, matchEmptyString);
GridDataFactory.fillDefaults().grab(true, true).applyTo(filteredList);
filteredList.setFont(parent.getFont());
filteredList.setFilter((filter == null ? "" : filter)); //$NON-NLS-1$
filteredList.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleWidgetSelected();
}
});
}
protected void createFilterText(Composite parent) {
filterText = new Text(parent, SWT.BORDER);
GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, GridData.BEGINNING).applyTo(filterText);
filterText.setFont(parent.getFont());
filterText.setText((filter == null ? "" : filter)); //$NON-NLS-1$
filterText.addListener(SWT.Modify, new Listener() {
@Override
public void handleEvent(Event e) {
filterChanged();
}
});
filterText.addKeyListener(new KeyListener() {
@Override
public void keyPressed(KeyEvent e) {
if (e.keyCode == SWT.ARROW_DOWN) {
filteredList.setFocus();
}
}
@Override
public void keyReleased(KeyEvent e) {}
});
}
protected void filterChanged() {
filteredList.setFilter(filterText.getText());
}
protected void handleWidgetSelected() {}
public Object[] getSelection() {
return filteredList.getSelection();
}
}