blob: 7a5e3cb44e3bd6696a2f77aa0c1e888a02aa4168 [file] [log] [blame]
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<EditListener> listeners = new ArrayList<EditListener>();
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<DisclosurePanel>() {
public void onClose(CloseEvent<DisclosurePanel> e) {
view.setText(VIEW_FILTER_STRING);
}
});
queriesPanel.addOpenHandler(new OpenHandler<DisclosurePanel>() {
public void onOpen(OpenEvent<DisclosurePanel> 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<String, String> 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<String, String> 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();
}
}
}
}