/* AWE - Amanzi Wireless Explorer * http://awe.amanzi.org * (C) 2008-2009, AmanziTel AB * * This library is provided under the terms of the Eclipse Public License * as described at http://www.eclipse.org/legal/epl-v10.html. Any use, * reproduction or distribution of the library constitutes recipient's * acceptance of this agreement. * * This library is distributed WITHOUT ANY WARRANTY; without even the * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. */ package org.amanzi.awe.statistics.ui.table.filters.dialog; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Set; import org.amanzi.awe.statistics.ui.table.filters.GroupsFilter; import org.amanzi.awe.statistics.ui.table.filters.RegexViewerFilter; import org.amanzi.awe.statistics.ui.table.filters.dialog.KpiComboViewerWidget.IKpiTreeListener; import org.amanzi.awe.ui.icons.IconManager; import org.apache.commons.lang3.StringUtils; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.Text; /** * TODO Purpose of * <p> * </p> * * @author Vladislav_Kondratenko * @since 1.0.0 */ public class FilteringDialog implements IKpiTreeListener, ModifyListener, MouseListener { public interface IFilterDialogListener extends Listener { int UPDATE_SORTING_LISTENER = 1; } private static final Image sortAscImage = IconManager.getInstance().getImage("Asc"); private static final Image sortDescImage = IconManager.getInstance().getImage("Desc"); private static final String SORT_FROM_A_TO_Z_LABEL = "Sorting A to Z"; private static final String SORT_FROM_Z_TO_A_LABEL = "Sorting Z to A"; private static final String CLEAR_FILTERS = "Clear filters"; private static final String TEXT_FILTER = "Text filter..."; private static final String CLEAR_LABEL = "Clear"; private static final GridLayout TWO_COLUMN_LAYOUT = new GridLayout(2, false); private static final GridLayout ONE_COLUMN_LAYOUT = new GridLayout(1, false); private static final RegexViewerFilter REGEX_VIEWER_FILTER = new RegexViewerFilter(); private static final String OK_LABEL = "OK"; private static final String CANCEL = "Cancel"; private static final int MIN_SHWLL_HEIGHT = 400; private static final int MIN_SHELL_WIDTH = 300; private Button bSortZA; private Button bSortAZ; private final TableColumn column; private Button bClearFilters; private Text textField; private Button bClear; private final Shell shell; private final Set<String> groups; private KpiComboViewerWidget treeViewer; private Button bOk; private Button bCancel; private final TableViewer tableViewer; private List<ViewerFilter> filters = new ArrayList<ViewerFilter>(); private int currentDirection = SWT.UP; public FilteringDialog(final TableViewer tableViewer, final TableColumn column, final Set<String> groups) { Table table = tableViewer.getTable(); shell = new Shell(table.getShell(), SWT.SHELL_TRIM & (~SWT.RESIZE)); shell.setText("Aggregation filters setting"); // locate dialog Point location = table.getDisplay().getCursorLocation(); Rectangle clientArea = table.getDisplay().getClientArea(); int shellWidth = Math.min(MIN_SHELL_WIDTH, clientArea.width - location.x); int shellHeight = MIN_SHWLL_HEIGHT; shell.setSize(shellWidth, shellHeight); shell.setLocation(location); shell.setLayout(ONE_COLUMN_LAYOUT); // instantiate required variables filters = new ArrayList<ViewerFilter>(Arrays.asList(tableViewer.getFilters())); this.groups = groups; this.tableViewer = tableViewer; this.column = column; // create shell components createWidgets(); } /** * @param shellLayout */ private void createWidgets() { Composite composite = createComposite(shell, TWO_COLUMN_LAYOUT); bSortAZ = createButton(composite, sortAscImage, SORT_FROM_A_TO_Z_LABEL); bSortZA = createButton(composite, sortDescImage, SORT_FROM_Z_TO_A_LABEL); composite = createComposite(shell, ONE_COLUMN_LAYOUT); bClearFilters = createButton(composite, null, CLEAR_FILTERS); if (filters.isEmpty()) { bClearFilters.setEnabled(false); } Label textFilter = new Label(composite, SWT.NONE); textFilter.setText(TEXT_FILTER); composite = createComposite(shell, TWO_COLUMN_LAYOUT); textField = new Text(composite, SWT.BORDER); textField.setLayoutData(getGridData()); textField.addModifyListener(this); bClear = createButton(composite, null, CLEAR_LABEL); addKpiViewerWidget(); composite = createComposite(shell, TWO_COLUMN_LAYOUT); bOk = createButton(composite, null, OK_LABEL); bCancel = createButton(composite, null, CANCEL); } /** * @param composite * @param filteringDialog */ private void addKpiViewerWidget() { treeViewer = new KpiComboViewerWidget(shell, this); treeViewer.initializeWidget(); List<String> selected = null; // set existed filters from table viewer to tree viewer for (ViewerFilter filter : filters) { if (filter instanceof GroupsFilter) { GroupsFilter groupFilter = (GroupsFilter)filter; selected = groupFilter.getValues(); } } treeViewer.setItems(groups, selected); } private GridData getGridData() { return new GridData(SWT.FILL, SWT.TOP, true, false); } /** * @param filteringDialog * @param layout */ private Composite createComposite(final Composite filteringDialog, final GridLayout layout) { Composite composite = new Composite(filteringDialog, SWT.NONE); composite.setLayout(layout); composite.setLayoutData(getGridData()); return composite; } public void open() { shell.open(); } /** * create sorting button * * @param layout * @param image * @param label * @return */ private Button createButton(final Composite composite, final Image image, final String label) { Button button = new Button(composite, SWT.NONE); if (image != null) { button.setImage(image); } button.setText(label); button.setLayoutData(getGridData()); button.addMouseListener(this); return button; } @Override public void modifyText(final ModifyEvent e) { if (e.getSource().equals(textField)) { setFilter(); } } /** * set filter to tree viewer */ private void setFilter() { String filterText = textField.getText(); REGEX_VIEWER_FILTER.setFilterText(filterText); treeViewer.setFilters(REGEX_VIEWER_FILTER); bClear.setEnabled(true); } @Override public void mouseDoubleClick(final MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseDown(final MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseUp(final MouseEvent e) { Object source = e.getSource(); FilterDialogEvent event = new FilterDialogEvent(column); boolean isNeedToClose = false; if (bSortZA.equals(source)) { currentDirection = SWT.DOWN; } else if (bSortAZ.equals(source)) { currentDirection = SWT.UP; } else if (bClear.equals(source)) { textField.setText(StringUtils.EMPTY); } else if (bOk.equals(source)) { filters.add(new GroupsFilter(treeViewer.getSelected())); isNeedToClose = true; } else if (bCancel.equals(source)) { shell.close(); return; } else if (bClearFilters.equals(source)) { filters.clear(); treeViewer.reset(); bClearFilters.setEnabled(false); } event.setFilters(filters); event.setDirection(currentDirection); if (e.getSource().equals(bOk)) { tableViewer.getTable().notifyListeners(IFilterDialogListener.UPDATE_SORTING_LISTENER, event); } if (isNeedToClose) { shell.close(); } } }