/* * DataImportOptionsCsv.java * * Copyright (C) 2009-16 by RStudio, Inc. * * Unless you have received this program directly from RStudio pursuant * to the terms of a commercial license agreement with RStudio, then * this program is licensed to you under the terms of version 3 of the * GNU Affero General Public License. This program is distributed WITHOUT * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT, * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details. * */ package org.rstudio.studio.client.workbench.views.environment.dataimport; import org.rstudio.core.client.MessageDisplay.PromptWithOptionResult; import org.rstudio.core.client.widget.Operation; import org.rstudio.core.client.widget.OperationWithInput; import org.rstudio.core.client.widget.ProgressIndicator; import org.rstudio.core.client.widget.ProgressOperationWithInput; import org.rstudio.studio.client.RStudioGinjector; import org.rstudio.studio.client.common.GlobalDisplay; import org.rstudio.studio.client.common.HelpLink; import org.rstudio.studio.client.workbench.views.environment.dataimport.model.DataImportAssembleResponse; import org.rstudio.studio.client.workbench.views.source.model.SourceServerOperations; import com.google.gwt.core.client.GWT; 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.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.TextBox; import com.google.inject.Inject; public class DataImportOptionsUiCsv extends DataImportOptionsUi { private static DataImportOptionsCsvUiBinder uiBinder = GWT .create(DataImportOptionsCsvUiBinder.class); private final String escapeBoth_ = "both"; private final String escapeBackslash_ = "backslash"; private final String escapeDouble_ = "double"; private DataImportOptionsCsvLocale localeInfo_ = null; private int lastDelimiterListBoxIndex_ = 0; interface DataImportOptionsCsvUiBinder extends UiBinder<HTMLPanel, DataImportOptionsUiCsv> {} HTMLPanel mainPanel_; SourceServerOperations sourceServer_; GlobalDisplay globalDisplay_; @Inject public DataImportOptionsUiCsv() { super(); mainPanel_ = uiBinder.createAndBindUi(this); initWidget(mainPanel_); initEvents(); RStudioGinjector.INSTANCE.injectMembers(this); } @Inject private void initialize(SourceServerOperations sourceServer, GlobalDisplay globalDisplay) { sourceServer_ = sourceServer; globalDisplay_ = globalDisplay; initDefaults(); } private boolean isBackslashValue(String value) { return value == escapeBoth_ || value == escapeBackslash_; } private boolean isDoubleValue(String value) { return value == escapeBoth_ || value == escapeDouble_; } @Override public DataImportOptionsCsv getOptions() { return DataImportOptionsCsv.create(nameTextBox_.getValue(), delimiterListBox_.getSelectedValue(), !quotesListBox_.getSelectedValue().isEmpty() ? quotesListBox_.getSelectedValue() : null, isBackslashValue(escapeListBox_.getSelectedValue()), isDoubleValue(escapeListBox_.getSelectedValue()), columnNamesCheckBox_.getValue().booleanValue(), trimSpacesCheckBox_.getValue().booleanValue(), localeInfo_, !naListBox_.getSelectedValue().isEmpty() ? naListBox_.getSelectedValue() : null, !commentListBox_.getSelectedValue().isEmpty() ? commentListBox_.getSelectedValue() : null, Integer.parseInt(skipTextBox_.getText()), openDataViewerCheckBox_.getValue().booleanValue()); } @Override public void setAssembleResponse(DataImportAssembleResponse response) { nameTextBox_.setText(response.getDataName()); } @Override public void clearOptions() { nameTextBox_.setText(""); } void initDefaults() { skipTextBox_.setText("0"); columnNamesCheckBox_.setValue(true); trimSpacesCheckBox_.setValue(true); openDataViewerCheckBox_.setValue(true); escapeListBox_.addItem("None", ""); escapeListBox_.addItem("Backslash", escapeBackslash_); escapeListBox_.addItem("Double", escapeDouble_); escapeListBox_.addItem("Both", escapeBoth_); delimiterListBox_.addItem("Comma", ","); delimiterListBox_.addItem("Semicolon", ";"); delimiterListBox_.addItem("Tab", "\t"); delimiterListBox_.addItem("Whitespace", " "); delimiterListBox_.addItem("Other...", "other"); quotesListBox_.addItem("Default", ""); quotesListBox_.addItem("Single (')", "'"); quotesListBox_.addItem("Double (\")", "\\\""); quotesListBox_.addItem("None", ""); naListBox_.addItem("Default", ""); naListBox_.addItem("NA", "NA"); naListBox_.addItem("null", "null"); naListBox_.addItem("0", "0"); naListBox_.addItem("empty", "empty"); commentListBox_.addItem("Default", ""); commentListBox_.addItem("#", "#"); commentListBox_.addItem("%", "%"); commentListBox_.addItem("//", "//"); commentListBox_.addItem("'", "'"); commentListBox_.addItem("!", "!"); commentListBox_.addItem(";", ";"); commentListBox_.addItem("--", "--"); commentListBox_.addItem("*", "*"); commentListBox_.addItem("||", "||"); commentListBox_.addItem("\"", "\""); commentListBox_.addItem("\\", "\\"); commentListBox_.addItem("*>", "*>"); updateEnabled(); } void initEvents() { ValueChangeHandler<String> valueChangeHandler = new ValueChangeHandler<String>() { @Override public void onValueChange(ValueChangeEvent<String> arg0) { updateEnabled(); triggerChange(); } }; ChangeHandler changeHandler = new ChangeHandler() { @Override public void onChange(ChangeEvent arg0) { updateEnabled(); triggerChange(); } }; ChangeHandler delimChangeHandler = new ChangeHandler() { @Override public void onChange(ChangeEvent arg0) { if (delimiterListBox_.getSelectedValue() == "other") { globalDisplay_.promptForTextWithOption( "Other Delimiter", "Please enter a single character delimiter.", "", false, "", false, new ProgressOperationWithInput<PromptWithOptionResult>() { private void dismissAndUpdate(ProgressIndicator indicator, int newSelectIndex) { lastDelimiterListBoxIndex_ = newSelectIndex; delimiterListBox_.setSelectedIndex(newSelectIndex); indicator.onCompleted(); updateEnabled(); triggerChange(); } @Override public void execute(PromptWithOptionResult result, ProgressIndicator indicator) { String otherDelimiter = result.input; if (otherDelimiter.length() != 1) { globalDisplay_.showErrorMessage("Incorrect Delimiter", "The specified delimiter is not valid."); } else { for (int idxDelimiter = 0; idxDelimiter < delimiterListBox_.getItemCount(); idxDelimiter++) { if (delimiterListBox_.getValue(idxDelimiter) == otherDelimiter) { dismissAndUpdate(indicator, idxDelimiter); return; } } int selectedIndex = delimiterListBox_.getSelectedIndex(); delimiterListBox_.insertItem("Character " + otherDelimiter, otherDelimiter, selectedIndex - 1); dismissAndUpdate(indicator, selectedIndex - 1); } } }, new Operation() { @Override public void execute() { delimiterListBox_.setSelectedIndex(lastDelimiterListBoxIndex_); updateEnabled(); triggerChange(); } } ); } else { lastDelimiterListBoxIndex_ = delimiterListBox_.getSelectedIndex(); updateEnabled(); triggerChange(); } } }; ValueChangeHandler<Boolean> booleanValueChangeHandler = new ValueChangeHandler<Boolean>() { @Override public void onValueChange(ValueChangeEvent<Boolean> arg0) { updateEnabled(); triggerChange(); } }; nameTextBox_.addValueChangeHandler(valueChangeHandler); delimiterListBox_.addChangeHandler(delimChangeHandler); quotesListBox_.addChangeHandler(changeHandler); escapeListBox_.addChangeHandler(changeHandler); columnNamesCheckBox_.addValueChangeHandler(booleanValueChangeHandler); trimSpacesCheckBox_.addValueChangeHandler(booleanValueChangeHandler); openDataViewerCheckBox_.addValueChangeHandler(booleanValueChangeHandler); naListBox_.addChangeHandler(changeHandler); commentListBox_.addChangeHandler(changeHandler); skipTextBox_.addValueChangeHandler(valueChangeHandler); localeButton_.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { new DataImportOptionsUiCsvLocale( new OperationWithInput<DataImportOptionsCsvLocale>() { @Override public void execute(final DataImportOptionsCsvLocale result) { localeInfo_ = result; updateEnabled(); triggerChange(); } }, localeInfo_ ).showModal(); } }); } void updateEnabled() { if (delimiterListBox_.getSelectedValue() == ",") { trimSpacesCheckBox_.setEnabled(true); escapeListBox_.getElement().setAttribute("disabled", "disabled"); quotesListBox_.getElement().setAttribute("disabled", "disabled"); } else { trimSpacesCheckBox_.setEnabled(false); escapeListBox_.getElement().removeAttribute("disabled"); quotesListBox_.getElement().removeAttribute("disabled"); } } @Override public HelpLink getHelpLink() { return new HelpLink( "Reading rectangular data using readr", "import_readr", false, true); } @UiField TextBox skipTextBox_; @UiField ListBox delimiterListBox_; @UiField ListBox quotesListBox_; @UiField Button localeButton_; @UiField ListBox naListBox_; @UiField ListBox commentListBox_; @UiField ListBox escapeListBox_; @UiField CheckBox columnNamesCheckBox_; @UiField CheckBox trimSpacesCheckBox_; @UiField CheckBox openDataViewerCheckBox_; }