/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.ide.factory.json; import com.google.gwt.dom.client.Element; 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.FileUpload; import com.google.gwt.user.client.ui.FormPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Widget; import com.google.inject.Inject; import org.eclipse.che.ide.CoreLocalizationConstant; import org.eclipse.che.ide.ui.window.Window; /** * The implementation of {@link ImportFromConfigView}. * * @author Sergii Leschenko */ public class ImportFromConfigViewImpl extends Window implements ImportFromConfigView { @SuppressWarnings("unused") // used in native js private static final int MAX_FILE_SIZE_MB = 3; public interface ImportFromConfigViewBinder extends UiBinder<Widget, ImportFromConfigViewImpl> { } @UiField FormPanel uploadForm; @UiField Label errorMessage; FileUpload fileUpload; private ActionDelegate delegate; private String fileContent; private final Button buttonImport; @Inject public ImportFromConfigViewImpl(ImportFromConfigViewBinder importFromConfigViewBinder, CoreLocalizationConstant locale) { this.setTitle(locale.importFromConfigurationTitle()); setWidget(importFromConfigViewBinder.createAndBindUi(this)); Button btnCancel = createButton(locale.cancelButton(), "import-from-config-btn-cancel", event -> delegate.onCancelClicked()); addButtonToFooter(btnCancel); buttonImport = createButton(locale.importButton(), "import-from-config-btn-import", event -> delegate.onImportClicked()); addButtonToFooter(buttonImport); } /** {@inheritDoc} */ @Override public void showDialog() { errorMessage.setText(""); fileContent = null; fileUpload = new FileUpload(); fileUpload.setHeight("22px"); fileUpload.setWidth("100%"); fileUpload.setName("file"); fileUpload.ensureDebugId("import-from-config-ChooseFile"); addHandler(fileUpload.getElement()); fileUpload.addChangeHandler(event -> buttonImport.setEnabled(fileUpload.getFilename() != null)); uploadForm.add(fileUpload); this.show(); } /** {@inheritDoc} */ @Override public void closeDialog() { hide(); onClose(); } /** {@inheritDoc} */ @Override public void setDelegate(ActionDelegate delegate) { this.delegate = delegate; } @Override public void setEnabledImportButton(boolean enabled) { buttonImport.setEnabled(enabled); } @Override public String getFileContent() { return fileContent; } /** {@inheritDoc} */ @Override protected void onClose() { uploadForm.remove(fileUpload); fileUpload = null; } private native void addHandler(Element element) /*-{ var instance = this; function readFileContent(evt) { // Check for the various File API support. if (!window.File || !window.FileReader || !window.FileList || !window.Blob) { instance.@org.eclipse.che.ide.factory.json.ImportFromConfigViewImpl::onError(Ljava/lang/String;) ('The File APIs are not fully supported in this browser.'); return; } var selectedFile = evt.target.files[0]; var max_size = @org.eclipse.che.ide.factory.json.ImportFromConfigViewImpl::MAX_FILE_SIZE_MB; if (selectedFile.size > max_size * 100000) { instance.@org.eclipse.che.ide.factory.json.ImportFromConfigViewImpl::resetUploadFileField()(); instance.@org.eclipse.che.ide.factory.json.ImportFromConfigViewImpl::setErrorMessageOnForm(Ljava/lang/String;) ('File size exceeds the limit ' + max_size + 'mb'); return; } var reader = new FileReader(); reader.onload = function () { //reseting error message instance.@org.eclipse.che.ide.factory.json.ImportFromConfigViewImpl::setErrorMessageOnForm(Ljava/lang/String;)(''); //getting file's content instance.@org.eclipse.che.ide.factory.json.ImportFromConfigViewImpl::fileContent = reader.result; }; reader.onerror = function (event) { instance.@org.eclipse.che.ide.factory.json.ImportFromConfigViewImpl::onError(Ljava/lang/String;) ('Error reading config file ' + event.target.error.code); }; reader.readAsText(selectedFile); } element.addEventListener('change', readFileContent, false); }-*/; private void resetUploadFileField() { uploadForm.remove(fileUpload); fileUpload = new FileUpload(); fileUpload.setHeight("22px"); fileUpload.setWidth("100%"); fileUpload.setName("file"); fileUpload.ensureDebugId("import-from-config-ChooseFile"); addHandler(fileUpload.getElement()); fileUpload.addChangeHandler(event -> buttonImport.setEnabled(fileUpload.getFilename() != null)); uploadForm.add(fileUpload); } private void setErrorMessageOnForm(String msg) { errorMessage.setText(msg); } private void onError(String message) { delegate.onErrorReadingFile(message); } }