1 /*
2  * DataImportColumnTypesMenu.java
3  *
4  * Copyright (C) 2021 by RStudio, PBC
5  *
6  * Unless you have received this program directly from RStudio pursuant
7  * to the terms of a commercial license agreement with RStudio, then
8  * this program is licensed to you under the terms of version 3 of the
9  * GNU Affero General Public License. This program is distributed WITHOUT
10  * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
11  * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
12  * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
13  *
14  */
15 
16 package org.rstudio.studio.client.workbench.views.environment.dataimport;
17 
18 import java.util.ArrayList;
19 import java.util.HashMap;
20 
21 import org.rstudio.core.client.widget.OperationWithInput;
22 
23 import com.google.gwt.core.client.GWT;
24 import com.google.gwt.event.dom.client.ClickEvent;
25 import com.google.gwt.resources.client.CssResource;
26 import com.google.gwt.uibinder.client.UiBinder;
27 import com.google.gwt.uibinder.client.UiField;
28 import com.google.gwt.uibinder.client.UiHandler;
29 import com.google.gwt.user.client.ui.HTMLPanel;
30 import com.google.gwt.user.client.ui.Label;
31 import com.google.gwt.user.client.ui.PopupPanel;
32 import com.google.gwt.user.client.ui.Widget;
33 
34 public class DataImportColumnTypesMenu extends PopupPanel
35 {
36 
37    private static DataImportColumnTypesMenuUiBinder uiBinder = GWT
38          .create(DataImportColumnTypesMenuUiBinder.class);
39 
40    private OperationWithInput<String> onTypeChange_;
41    private OperationWithInput<String> onSelectionChange_;
42 
43    class MenuItem
44    {
45       private String name_;
46       private Widget widget_;
47 
MenuItem(String name, Widget widget)48       public MenuItem(String name, Widget widget)
49       {
50          name_ = name;
51          widget_ = widget;
52       }
53 
getName()54       String getName()
55       {
56          return name_;
57       }
58 
getWidget()59       Widget getWidget()
60       {
61          return widget_;
62       }
63    }
64 
65    private ArrayList<MenuItem> menuItems_;
66    private HashMap<String, MenuItem> menuItemsMap_;
67 
68    interface DataImportColumnTypesMenuUiBinder
69          extends UiBinder<Widget, DataImportColumnTypesMenu>
70    {
71    }
72 
73    interface DataImportColumnTypesMenuCss extends CssResource {
entry()74       String entry();
entrySelected()75       String entrySelected();
76    }
77 
78    @UiField DataImportColumnTypesMenuCss style;
79 
DataImportColumnTypesMenu()80    public DataImportColumnTypesMenu()
81    {
82       super(true);
83       setWidget(uiBinder.createAndBindUi(this));
84 
85       menuItemsMap_ = new HashMap<>();
86 
87       menuItems_ = new ArrayList<>();
88       menuItems_.add(new MenuItem("include", (Widget)include_));
89       menuItems_.add(new MenuItem("skip", (Widget)skip_));
90       menuItems_.add(new MenuItem("only", (Widget)only_));
91       menuItems_.add(new MenuItem("guess", (Widget)guess_));
92       menuItems_.add(new MenuItem("character", (Widget)character_));
93       menuItems_.add(new MenuItem("double", (Widget)double_));
94       menuItems_.add(new MenuItem("integer", (Widget)integer_));
95       menuItems_.add(new MenuItem("numeric", (Widget)numeric_));
96       menuItems_.add(new MenuItem("logical", (Widget)logical_));
97       menuItems_.add(new MenuItem("date", (Widget)date_));
98       menuItems_.add(new MenuItem("time", (Widget)time_));
99       menuItems_.add(new MenuItem("dateTime", (Widget)dateTime_));
100       menuItems_.add(new MenuItem("factor", (Widget)factor_));
101 
102       for (int idx = 0; idx < menuItems_.size(); idx++)
103       {
104          menuItemsMap_.put(menuItems_.get(idx).getName(), menuItems_.get(idx));
105       }
106 
107       errorPanel_.setVisible(false);
108    }
109 
setOnChange( OperationWithInput<String> onTypeChange, OperationWithInput<String> onSelectionChange)110    public void setOnChange(
111       OperationWithInput<String> onTypeChange,
112       OperationWithInput<String> onSelectionChange)
113    {
114       onTypeChange_ = onTypeChange;
115       onSelectionChange_ = onSelectionChange;
116    }
117 
resetSelected()118    public void resetSelected()
119    {
120       for (final MenuItem elem : menuItems_)
121       {
122          elem.getWidget().setStyleName(style.entry());
123       }
124 
125       include_.setStyleName(style.entrySelected());
126 
127       typesPanel_.setVisible(true);
128       includePanel_.setVisible(true);
129       errorPanel_.setVisible(false);
130    }
131 
setVisibleColumns(String[] columnNames)132    public void setVisibleColumns(String[] columnNames)
133    {
134       for (final MenuItem elem : menuItems_)
135       {
136          elem.getWidget().setVisible(false);
137       }
138 
139       for (final String columnName : columnNames)
140       {
141          menuItemsMap_.get(columnName).getWidget().setVisible(true);
142       }
143    }
144 
setSelected(String entry)145    public void setSelected(String entry)
146    {
147 
148       if (entry == "skip")
149       {
150          include_.setStyleName(style.entry());
151          only_.setStyleName(style.entry());
152          skip_.setStyleName(style.entrySelected());
153       }
154       else if (entry == "only")
155       {
156          include_.setStyleName(style.entry());
157          only_.setStyleName(style.entrySelected());
158          skip_.setStyleName(style.entry());
159       }
160       else
161       {
162          for (final MenuItem elem : menuItems_)
163          {
164             if (entry == elem.getName())
165             {
166                elem.getWidget().setStyleName(style.entrySelected());
167             }
168          }
169       }
170    }
171 
setError(String error)172    public void setError(String error)
173    {
174       error_.setText(error);
175       errorPanel_.setVisible(true);
176       typesPanel_.setVisible(false);
177       includePanel_.setVisible(false);
178    }
179 
180    @UiField
181    Label include_;
182 
183    @UiHandler("include_")
onIncludeClick(ClickEvent e)184    void onIncludeClick(ClickEvent e)
185    {
186       onSelectionChange_.execute("include");
187    }
188 
189    @UiField
190    Label skip_;
191 
192    @UiHandler("skip_")
onSkipClick(ClickEvent e)193    void onSkipClick(ClickEvent e)
194    {
195       onSelectionChange_.execute("skip");
196    }
197 
198    @UiField
199    Label only_;
200 
201    @UiHandler("only_")
onOnlyClick(ClickEvent e)202    void onOnlyClick(ClickEvent e)
203    {
204       onSelectionChange_.execute("only");
205    }
206 
207    @UiField
208    Label  guess_;
209 
210    @UiHandler("guess_")
onGuessClick(ClickEvent e)211    void onGuessClick(ClickEvent e)
212    {
213       onTypeChange_.execute("guess");
214    }
215 
216    @UiField
217    Label  character_;
218 
219    @UiHandler("character_")
onCharacterClick(ClickEvent e)220    void onCharacterClick(ClickEvent e)
221    {
222       onTypeChange_.execute("character");
223    }
224 
225    @UiField
226    Label double_;
227 
228    @UiHandler("double_")
onDoubleClick(ClickEvent e)229    void onDoubleClick(ClickEvent e)
230    {
231       onTypeChange_.execute("double");
232    }
233 
234    @UiField
235    Label integer_;
236 
237    @UiHandler("integer_")
onIntegerClick(ClickEvent e)238    void onIntegerClick(ClickEvent e)
239    {
240       onTypeChange_.execute("integer");
241    }
242 
243    @UiField
244    Label numeric_;
245 
246    @UiHandler("numeric_")
onNumericClick(ClickEvent e)247    void onNumericClick(ClickEvent e)
248    {
249       onTypeChange_.execute("numeric");
250    }
251 
252    @UiField
253    Label logical_;
254 
255    @UiHandler("logical_")
onLogicalClick(ClickEvent e)256    void onLogicalClick(ClickEvent e)
257    {
258       onTypeChange_.execute("logical");
259    }
260 
261    @UiField
262    Label date_;
263 
264    @UiHandler("date_")
onDateClick(ClickEvent e)265    void onDateClick(ClickEvent e)
266    {
267       onTypeChange_.execute("date");
268    }
269 
270    @UiField
271    Label time_;
272 
273    @UiHandler("time_")
onTimeClick(ClickEvent e)274    void onTimeClick(ClickEvent e)
275    {
276       onTypeChange_.execute("time");
277    }
278 
279    @UiField
280    Label dateTime_;
281 
282    @UiHandler("dateTime_")
onDateTimeClick(ClickEvent e)283    void onDateTimeClick(ClickEvent e)
284    {
285       onTypeChange_.execute("dateTime");
286    }
287 
288    @UiField
289    Label factor_;
290 
291    @UiHandler("factor_")
onFactorClick(ClickEvent e)292    void onFactorClick(ClickEvent e)
293    {
294       onTypeChange_.execute("factor");
295    }
296 
297    @UiField
298    HTMLPanel typesPanel_;
299 
300    @UiField
301    HTMLPanel includePanel_;
302 
303    @UiField
304    HTMLPanel errorPanel_;
305 
306    @UiField
307    Label error_;
308 }
309