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