Home | History | Annotate | Download | only in tko
      1 package autotest.tko;
      2 
      3 import com.google.gwt.event.dom.client.ChangeEvent;
      4 import com.google.gwt.event.dom.client.ChangeHandler;
      5 import com.google.gwt.event.dom.client.ClickEvent;
      6 import com.google.gwt.event.dom.client.ClickHandler;
      7 import com.google.gwt.event.logical.shared.CloseEvent;
      8 import com.google.gwt.event.logical.shared.CloseHandler;
      9 import com.google.gwt.event.logical.shared.OpenEvent;
     10 import com.google.gwt.event.logical.shared.OpenHandler;
     11 import com.google.gwt.user.client.DOM;
     12 import com.google.gwt.user.client.Window;
     13 import com.google.gwt.user.client.ui.Anchor;
     14 import com.google.gwt.user.client.ui.Button;
     15 import com.google.gwt.user.client.ui.Composite;
     16 import com.google.gwt.user.client.ui.DisclosurePanel;
     17 import com.google.gwt.user.client.ui.HorizontalPanel;
     18 import com.google.gwt.user.client.ui.Panel;
     19 import com.google.gwt.user.client.ui.TextArea;
     20 
     21 import java.util.ArrayList;
     22 import java.util.Map;
     23 
     24 // TODO(showard): combine this code with similar code from autotest.afe.CreateJobView
     25 public class FilterStringViewer extends Composite {
     26 
     27     public static final String VIEW_FILTER_STRING = "View Filter String";
     28     public static final String HIDE_FILTER_STRING = "Hide Filter String";
     29     public static final String EDIT_FILTER_STRING = "Edit Filter String";
     30     public static final String UNEDIT_FILTER_STRING = "Revert Filter String";
     31 
     32     public static interface EditListener {
     33         public void onEdit();
     34         public void onRevert();
     35     }
     36 
     37     private Anchor view = new Anchor(VIEW_FILTER_STRING);
     38     private Button edit = new Button(EDIT_FILTER_STRING);
     39     private TextArea queries = new TextArea();
     40     private DisclosurePanel queriesPanel = new DisclosurePanel();
     41     private boolean filterEdited = false;
     42     private boolean viewerEditable = false;
     43     private ArrayList<EditListener> listeners = new ArrayList<EditListener>();
     44 
     45     public FilterStringViewer() {
     46         edit.addClickHandler(new ClickHandler() {
     47             public void onClick(ClickEvent event) {
     48                 changeEditable(true);
     49             }
     50         });
     51 
     52         queries.setSize("35em", "10em");
     53         queries.setReadOnly(true);
     54         queries.addChangeHandler(new ChangeHandler() {
     55             public void onChange(ChangeEvent event) {
     56                 filterEdited = true;
     57             }
     58         });
     59 
     60         Panel viewerHeaderPanel = new HorizontalPanel();
     61         viewerHeaderPanel.add(view);
     62         viewerHeaderPanel.add(edit);
     63 
     64         queriesPanel.setHeader(viewerHeaderPanel);
     65         queriesPanel.add(queries);
     66 
     67         queriesPanel.addCloseHandler(new CloseHandler<DisclosurePanel>() {
     68             public void onClose(CloseEvent<DisclosurePanel> e) {
     69                 view.setText(VIEW_FILTER_STRING);
     70             }
     71         });
     72         queriesPanel.addOpenHandler(new OpenHandler<DisclosurePanel>() {
     73             public void onOpen(OpenEvent<DisclosurePanel> e) {
     74                 view.setText(HIDE_FILTER_STRING);
     75             }
     76         });
     77 
     78         initWidget(queriesPanel);
     79     }
     80 
     81     public void setText(String text) {
     82         queries.setText(text);
     83     }
     84 
     85     public String getText() {
     86         return queries.getText();
     87     }
     88 
     89     public void addEditListener(EditListener listener) {
     90         listeners.add(listener);
     91     }
     92 
     93     protected void addToHistory(Map<String, String> args, String prefix) {
     94         args.put(prefix + "_viewerOpen", String.valueOf(queriesPanel.isOpen()));
     95         args.put(prefix + "_viewerEditable", String.valueOf(viewerEditable));
     96         if (viewerEditable) {
     97             args.put(prefix + "_viewerEdited", String.valueOf(filterEdited));
     98             if (filterEdited) {
     99                 args.put(prefix + "_viewerText", queries.getText());
    100             }
    101         }
    102     }
    103 
    104     protected void handleHistoryArguments(Map<String, String> args, String prefix) {
    105         // No _viewerOpen parameter. This is a preconfig without a specified custom filter.
    106         if (args.get(prefix + "_viewerOpen") == null) {
    107             queriesPanel.setOpen(false);
    108             if (viewerEditable) {
    109                 changeEditable(false);
    110             }
    111             return;
    112         }
    113 
    114         queriesPanel.setOpen(Boolean.parseBoolean(args.get(prefix + "_viewerOpen")));
    115         if (viewerEditable) {
    116             changeEditable(false);
    117         }
    118         if (Boolean.parseBoolean(args.get(prefix + "_viewerEditable"))) {
    119             changeEditable(false);
    120             filterEdited = Boolean.parseBoolean(args.get(prefix + "_viewerEdited"));
    121             if (filterEdited) {
    122                 queries.setText(args.get(prefix + "_viewerText"));
    123             }
    124         }
    125     }
    126 
    127     // Change the viewer's editable state
    128     private void changeEditable(boolean clicked) {
    129         if (clicked) {
    130             DOM.eventGetCurrentEvent().stopPropagation();
    131         }
    132 
    133         if (viewerEditable) {
    134             // We only want the confirmation on revert from an edited viewer, and only if "revert"
    135             // was clicked (not on programmatic revert)
    136             boolean userCancelled = filterEdited && clicked
    137                 && !Window.confirm("Are you sure you want to revert your changes?");
    138             if (userCancelled) {
    139                 return;
    140             }
    141 
    142             viewerEditable = false;
    143             filterEdited = false;
    144             queries.setReadOnly(true);
    145             edit.setText(EDIT_FILTER_STRING);
    146             for (EditListener listener : listeners) {
    147                 listener.onRevert();
    148             }
    149         } else {
    150             viewerEditable = true;
    151             queries.setReadOnly(false);
    152             edit.setText(UNEDIT_FILTER_STRING);
    153             queriesPanel.setOpen(true);
    154             for (EditListener listener : listeners) {
    155                 listener.onEdit();
    156             }
    157         }
    158     }
    159 }
    160