blob: 5284cf9f8e4bf9fe1b9ad20e5331e71e7abeed78 [file] [log] [blame]
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<DatabaseFilter> filters = new ArrayList<DatabaseFilter>();
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<String, String> 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<String, String> 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<String> filterParts = new ArrayList<String>();
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);
}
}