package autotest.tko; import autotest.common.Utils; import autotest.common.ui.ExtendedListBox; import autotest.tko.FilterStringViewer.EditListener; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.HasHorizontalAlignment; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Panel; import com.google.gwt.user.client.ui.RadioButton; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.VerticalPanel; import java.util.ArrayList; import java.util.List; import java.util.Map; public class FilterSelector extends Composite { public class DatabaseFilter extends Composite implements ChangeHandler { private ExtendedListBox dbColumnSelector = new DBColumnSelector(dbView); private TextBox condition = new TextBox(); private FlexTable flexTable = new FlexTable(); private Anchor deleteLink = new Anchor("[X]"); private DatabaseFilter() { dbColumnSelector.addChangeHandler(this); condition.addChangeHandler(this); deleteLink.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { if (enabled) { deleteFilter(DatabaseFilter.this); buildFilterString(); } } }); flexTable.setWidget(0, 0, dbColumnSelector); flexTable.setWidget(0, 1, condition); flexTable.setWidget(0, 2, deleteLink); initWidget(flexTable); } @Override public void onChange(ChangeEvent event) { buildFilterString(); } public void setEnabled(boolean enabled) { dbColumnSelector.setEnabled(enabled); condition.setEnabled(enabled); } public boolean isEmpty() { return condition.getText().equals(""); } public String getFilterString() { return dbColumnSelector.getSelectedValue() + " " + condition.getText(); } } private FlexTable table = new FlexTable(); private Panel filtersPanel = new VerticalPanel(); private List filters = new ArrayList(); private RadioButton all; private RadioButton any; private Anchor addLink = new Anchor("[Add Filter]"); private FilterStringViewer viewer = new FilterStringViewer(); private boolean enabled = true; private String dbView; private static int filterSelectorId; public FilterSelector(String dbView) { this.dbView = dbView; int id = filterSelectorId; filterSelectorId++; all = new RadioButton("booleanOp" + id, "all of"); any = new RadioButton("booleanOp" + id, "any of"); ClickHandler booleanOpListener = new ClickHandler() { public void onClick(ClickEvent event) { buildFilterString(); } }; all.addClickHandler(booleanOpListener); any.addClickHandler(booleanOpListener); all.setValue(true); addLink.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { if (enabled) { addFilter(); } } }); viewer.addEditListener(new EditListener() { public void onEdit() { setEnabled(false); } public void onRevert() { setEnabled(true); buildFilterString(); } }); Panel booleanOpPanel = new HorizontalPanel(); booleanOpPanel.add(all); booleanOpPanel.add(any); table.setWidget(0, 0, booleanOpPanel); table.setWidget(1, 0, filtersPanel); table.getFlexCellFormatter().setColSpan(1, 0, 2); table.setWidget(2, 1, addLink); table.getFlexCellFormatter().setHorizontalAlignment( 2, 1, HasHorizontalAlignment.ALIGN_RIGHT); table.setWidget(3, 0, viewer); table.getFlexCellFormatter().setColSpan(3, 0, 2); table.setStylePrimaryName("box"); addFilter(); initWidget(table); } public String getFilterString() { return viewer.getText(); } public void reset() { filtersPanel.clear(); filters.clear(); addFilter(); } protected void addToHistory(Map args, String prefix) { // Get all the filters/conditions for (int index = 0; index < filters.size(); index++) { args.put(prefix + "[" + index + "][db]", filters.get(index).dbColumnSelector.getSelectedValue()); args.put(prefix + "[" + index + "][condition]", filters.get(index).condition.getText()); } // Get whether the filter should be "all" or "any" args.put(prefix + "_all", Boolean.toString(all.getValue())); viewer.addToHistory(args, prefix); } protected void handleHistoryArguments(Map args, String prefix) { int index = 0; String db, condition; // Restore all the filters/conditions while ((db = args.get(prefix + "[" + index + "][db]")) != null) { condition = args.get(prefix + "[" + index + "][condition]"); DatabaseFilter filter; if (index == 0) { filter = filters.get(0); } else { filter = addFilter(); } filter.dbColumnSelector.selectByValue(db); filter.condition.setText(condition); index++; } // Restore the "all" or "any" selection boolean allChecked = Boolean.parseBoolean(args.get(prefix + "_all")); if (allChecked) { all.setValue(true); } else { any.setValue(true); } buildFilterString(); viewer.handleHistoryArguments(args, prefix); } private DatabaseFilter addFilter() { DatabaseFilter nextFilter = new DatabaseFilter(); filters.add(nextFilter); filtersPanel.add(nextFilter); return nextFilter; } private void deleteFilter(DatabaseFilter filter) { // If there's only one filter, clear it if (filters.size() == 1) { reset(); return; } filters.remove(filter); filtersPanel.remove(filter); } private void setEnabled(boolean enabled) { this.enabled = enabled; all.setEnabled(enabled); any.setEnabled(enabled); for (DatabaseFilter filter : filters) { filter.setEnabled(enabled); } } private void buildFilterString() { List filterParts = new ArrayList(); for (DatabaseFilter filter : filters) { if (!filter.isEmpty()) { filterParts.add(filter.getFilterString()); } } String joiner = all.getValue() ? " AND " : " OR "; String fullFilterString = Utils.joinStrings(joiner, filterParts); viewer.setText(fullFilterString); } }