xref: /aosp_15_r20/external/autotest/frontend/client/src/autotest/tko/FilterStringViewer.java (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
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 {
onEdit()33         public void onEdit();
onRevert()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 
FilterStringViewer()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 
setText(String text)81     public void setText(String text) {
82         queries.setText(text);
83     }
84 
getText()85     public String getText() {
86         return queries.getText();
87     }
88 
addEditListener(EditListener listener)89     public void addEditListener(EditListener listener) {
90         listeners.add(listener);
91     }
92 
addToHistory(Map<String, String> args, String prefix)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 
handleHistoryArguments(Map<String, String> args, String prefix)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
changeEditable(boolean clicked)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