package autotest.tko; 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.CloseEvent; import com.google.gwt.event.logical.shared.CloseHandler; import com.google.gwt.event.logical.shared.OpenEvent; import com.google.gwt.event.logical.shared.OpenHandler; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.DisclosurePanel; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Panel; import com.google.gwt.user.client.ui.TextArea; import java.util.ArrayList; import java.util.Map; // TODO(showard): combine this code with similar code from autotest.afe.CreateJobView public class FilterStringViewer extends Composite { public static final String VIEW_FILTER_STRING = "View Filter String"; public static final String HIDE_FILTER_STRING = "Hide Filter String"; public static final String EDIT_FILTER_STRING = "Edit Filter String"; public static final String UNEDIT_FILTER_STRING = "Revert Filter String"; public static interface EditListener { public void onEdit(); public void onRevert(); } private Anchor view = new Anchor(VIEW_FILTER_STRING); private Button edit = new Button(EDIT_FILTER_STRING); private TextArea queries = new TextArea(); private DisclosurePanel queriesPanel = new DisclosurePanel(); private boolean filterEdited = false; private boolean viewerEditable = false; private ArrayList listeners = new ArrayList(); public FilterStringViewer() { edit.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { changeEditable(true); } }); queries.setSize("35em", "10em"); queries.setReadOnly(true); queries.addChangeHandler(new ChangeHandler() { public void onChange(ChangeEvent event) { filterEdited = true; } }); Panel viewerHeaderPanel = new HorizontalPanel(); viewerHeaderPanel.add(view); viewerHeaderPanel.add(edit); queriesPanel.setHeader(viewerHeaderPanel); queriesPanel.add(queries); queriesPanel.addCloseHandler(new CloseHandler() { public void onClose(CloseEvent e) { view.setText(VIEW_FILTER_STRING); } }); queriesPanel.addOpenHandler(new OpenHandler() { public void onOpen(OpenEvent e) { view.setText(HIDE_FILTER_STRING); } }); initWidget(queriesPanel); } public void setText(String text) { queries.setText(text); } public String getText() { return queries.getText(); } public void addEditListener(EditListener listener) { listeners.add(listener); } protected void addToHistory(Map args, String prefix) { args.put(prefix + "_viewerOpen", String.valueOf(queriesPanel.isOpen())); args.put(prefix + "_viewerEditable", String.valueOf(viewerEditable)); if (viewerEditable) { args.put(prefix + "_viewerEdited", String.valueOf(filterEdited)); if (filterEdited) { args.put(prefix + "_viewerText", queries.getText()); } } } protected void handleHistoryArguments(Map args, String prefix) { // No _viewerOpen parameter. This is a preconfig without a specified custom filter. if (args.get(prefix + "_viewerOpen") == null) { queriesPanel.setOpen(false); if (viewerEditable) { changeEditable(false); } return; } queriesPanel.setOpen(Boolean.parseBoolean(args.get(prefix + "_viewerOpen"))); if (viewerEditable) { changeEditable(false); } if (Boolean.parseBoolean(args.get(prefix + "_viewerEditable"))) { changeEditable(false); filterEdited = Boolean.parseBoolean(args.get(prefix + "_viewerEdited")); if (filterEdited) { queries.setText(args.get(prefix + "_viewerText")); } } } // Change the viewer's editable state private void changeEditable(boolean clicked) { if (clicked) { DOM.eventGetCurrentEvent().stopPropagation(); } if (viewerEditable) { // We only want the confirmation on revert from an edited viewer, and only if "revert" // was clicked (not on programmatic revert) boolean userCancelled = filterEdited && clicked && !Window.confirm("Are you sure you want to revert your changes?"); if (userCancelled) { return; } viewerEditable = false; filterEdited = false; queries.setReadOnly(true); edit.setText(EDIT_FILTER_STRING); for (EditListener listener : listeners) { listener.onRevert(); } } else { viewerEditable = true; queries.setReadOnly(false); edit.setText(UNEDIT_FILTER_STRING); queriesPanel.setOpen(true); for (EditListener listener : listeners) { listener.onEdit(); } } } }