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 { 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 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 fields = new ArrayList(); 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 arguments, String name) { if (!arguments.containsKey(name)) { return; } Set fields = new HashSet(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(); } } }