/*******************************************************************************
* 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);
}
}