blob: 217024ed87b0928d489499f19110f73150e18eb0 [file] [log] [blame]
package autotest.tko;
import autotest.common.Utils;
import autotest.common.CustomHistory.HistoryToken;
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.event.logical.shared.HasValueChangeHandlers;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONString;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.VerticalPanel;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class ContentSelect extends Composite implements HasValueChangeHandlers<Boolean> {
public static final String HISTORY_OPENED = "_opened";
public static final String ADD_ADDITIONAL_CONTENT = "Add additional content...";
public static final String CANCEL_ADDITIONAL_CONTENT = "Don't use additional content";
private HeaderFieldCollection headerFields;
private Anchor addLink = new Anchor(ADD_ADDITIONAL_CONTENT);
private ListBox contentSelect = new ListBox(true);
public ContentSelect(HeaderFieldCollection headerFields) {
this.headerFields = headerFields;
Panel panel = new VerticalPanel();
contentSelect.setVisible(false);
panel.add(addLink);
panel.add(contentSelect);
initWidget(panel);
addLink.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
if (contentSelect.isVisible()) {
addLink.setText(ADD_ADDITIONAL_CONTENT);
contentSelect.setVisible(false);
notifyHandlers();
} else {
openContentSelect();
}
}
});
contentSelect.addChangeHandler(new ChangeHandler() {
public void onChange(ChangeEvent event) {
notifyHandlers();
}
});
}
private void notifyHandlers() {
ValueChangeEvent.fire(this, hasSelection());
}
private void openContentSelect() {
addLink.setText(CANCEL_ADDITIONAL_CONTENT);
contentSelect.setVisible(true);
notifyHandlers();
}
public void refreshFields() {
contentSelect.clear();
for (HeaderField field : headerFields) {
contentSelect.addItem(field.getName(), field.getSqlName());
}
}
public HandlerRegistration addValueChangeHandler(ValueChangeHandler<Boolean> handler) {
return addHandler(handler, ValueChangeEvent.getType());
}
public boolean hasSelection() {
return contentSelect.isVisible() && contentSelect.getSelectedIndex() != -1;
}
public void addToCondition(JSONObject condition) {
if (hasSelection()) {
JSONArray extraInfo = new JSONArray();
for (int i = 0; i < contentSelect.getItemCount(); i++) {
if (contentSelect.isItemSelected(i)) {
extraInfo.set(extraInfo.size(), new JSONString(contentSelect.getValue(i)));
}
}
condition.put("extra_info", extraInfo);
}
}
public void addHistoryArguments(HistoryToken arguments, String name) {
List<String> fields = new ArrayList<String>();
for (int i = 0; i < contentSelect.getItemCount(); i++) {
if (contentSelect.isItemSelected(i)) {
fields.add(contentSelect.getValue(i));
}
}
String fieldList = Utils.joinStrings(",", fields);
arguments.put(name, fieldList);
if (contentSelect.isVisible()) {
arguments.put(name + HISTORY_OPENED, "true");
}
}
public void handleHistoryArguments(Map<String, String> arguments, String name) {
if (!arguments.containsKey(name)) {
return;
}
Set<String> fields = new HashSet<String>(Arrays.asList(arguments.get(name).split(",")));
for (int i = 0; i < contentSelect.getItemCount(); i++) {
if (fields.contains(contentSelect.getValue(i))) {
contentSelect.setItemSelected(i, true);
}
}
if (arguments.containsKey(name + HISTORY_OPENED)) {
openContentSelect();
}
}
}