/*
* Copyright 2014-2016 CyberVision, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.kaaproject.kaa.server.admin.client.mvp.view.widget;
import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.SpanElement;
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.ValueChangeHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CaptionPanel;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.FormPanel.SubmitCompleteEvent;
import com.google.gwt.user.client.ui.FormPanel.SubmitCompleteHandler;
import com.google.gwt.user.client.ui.HasValue;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.SimplePanel;
import org.kaaproject.avro.ui.gwt.client.util.BusyAsyncCallback;
import org.kaaproject.avro.ui.gwt.client.widget.AvroWidgetsConfig;
import org.kaaproject.avro.ui.gwt.client.widget.RecordFieldWidget;
import org.kaaproject.avro.ui.shared.RecordField;
import org.kaaproject.kaa.server.admin.client.KaaAdmin;
import org.kaaproject.kaa.server.admin.client.util.HasErrorMessage;
import org.kaaproject.kaa.server.admin.client.util.Utils;
public class RecordPanel extends SimplePanel implements HasValue<RecordField>, ChangeHandler {
private static final String REQUIRED = Utils.avroUiStyle.requiredField();
private CaptionPanel recordCaption;
private RecordFieldWidget recordFieldWidget;
private FlexTable uploadTable;
private FileUploadForm recordFileUpload;
private Button uploadButton;
private String recordFileItemName;
private boolean readOnly;
private HasErrorMessage hasErrorMessage;
private FormDataLoader formDataLoader;
private boolean optional;
private boolean showCaption;
public RecordPanel(String title, HasErrorMessage hasErrorMessage,
boolean optional, boolean readOnly) {
this(null, title, hasErrorMessage, optional, readOnly);
}
public RecordPanel(AvroWidgetsConfig config, String title, HasErrorMessage hasErrorMessage,
boolean optional, boolean readOnly) {
this(config, true, title, hasErrorMessage, optional, readOnly);
}
/**
* Instantiates a new RecordPanel.
*/
public RecordPanel(AvroWidgetsConfig config, boolean showCaption, String title,
HasErrorMessage hasErrorMessage, boolean optional, boolean readOnly) {
this.showCaption = showCaption;
this.optional = optional;
this.readOnly = readOnly;
this.hasErrorMessage = hasErrorMessage;
FlexTable table = new FlexTable();
table.setWidth("100%");
if (config == null) {
config = new AvroWidgetsConfig.Builder().createConfig();
}
recordFieldWidget = new RecordFieldWidget(config, readOnly);
if (showCaption) {
recordCaption = new CaptionPanel();
setTitle(title);
recordCaption.setContentWidget(recordFieldWidget);
table.setWidget(0, 0, recordCaption);
} else {
table.setWidget(0, 0, recordFieldWidget);
}
recordFileUpload = new FileUploadForm();
recordFileUpload.addSubmitCompleteHandler(new SubmitCompleteHandler() {
@Override
public void onSubmitComplete(SubmitCompleteEvent event) {
loadRecordFromFile();
}
});
recordFileUpload.addChangeHandler(this);
recordFileItemName = recordFileUpload.getFileItemName();
uploadButton = new Button(Utils.constants.upload(), new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
recordFileUpload.submit();
}
});
uploadButton.addStyleName(Utils.kaaAdminStyle.bAppButtonSmall());
uploadButton.setEnabled(false);
uploadTable = new FlexTable();
Label uploadLabel = new Label(Utils.constants.uploadFromFile());
uploadTable.setWidget(0, 0, uploadLabel);
uploadTable.setWidget(0, 1, recordFileUpload);
uploadTable.setWidget(0, 2, uploadButton);
uploadTable.getFlexCellFormatter()
.setVerticalAlignment(0, 0, HasVerticalAlignment.ALIGN_MIDDLE);
uploadTable.getFlexCellFormatter()
.setVerticalAlignment(0, 2, HasVerticalAlignment.ALIGN_MIDDLE);
table.setWidget(1, 0, uploadTable);
setWidget(table);
setUploadVisible(!readOnly);
formDataLoader = new DefaultFormDataLoader();
}
public void setPreferredHeightPx(int height) {
recordFieldWidget.setPreferredHeightPx(height);
}
public RecordFieldWidget getRecordWidget() {
return recordFieldWidget;
}
/**
* Set readOnly.
*/
public void setReadOnly(boolean readOnly) {
if (this.readOnly != readOnly) {
this.readOnly = readOnly;
recordFieldWidget.setReadOnly(readOnly);
setUploadVisible(!readOnly);
}
}
/**
* Set title.
* @param title the title
*/
public void setTitle(String title) {
if (showCaption) {
if (optional) {
recordCaption.setCaptionText(title);
} else {
SpanElement span = Document.get().createSpanElement();
span.appendChild(Document.get().createTextNode(title));
span.addClassName("gwt-Label");
span.addClassName(REQUIRED);
recordCaption.setCaptionHTML(span.getString());
}
}
}
private void setUploadVisible(boolean visible) {
uploadTable.setVisible(visible);
}
@Override
public HandlerRegistration addValueChangeHandler(
ValueChangeHandler<RecordField> handler) {
return recordFieldWidget.addValueChangeHandler(handler);
}
@Override
public RecordField getValue() {
return recordFieldWidget.getValue();
}
@Override
public void setValue(RecordField value) {
recordFieldWidget.setValue(value);
}
@Override
public void setValue(RecordField value, boolean fireEvents) {
recordFieldWidget.setValue(value, fireEvents);
}
/**
* Reset.
*/
public void reset() {
recordFieldWidget.setValue(null);
if (!readOnly) {
recordFileUpload.reset();
uploadButton.setEnabled(false);
}
}
public boolean validate() {
return recordFieldWidget.validate();
}
public void setFormDataLoader(FormDataLoader formDataLoader) {
this.formDataLoader = formDataLoader;
}
private void loadRecordFromFile() {
hasErrorMessage.clearError();
formDataLoader.loadFormData(recordFileItemName, new BusyAsyncCallback<RecordField>() {
@Override
public void onSuccessImpl(RecordField result) {
setValue(result, true);
recordFileUpload.reset();
uploadButton.setEnabled(false);
}
@Override
public void onFailureImpl(Throwable caught) {
Utils.handleException(caught, hasErrorMessage);
}
});
}
@Override
public void onChange(ChangeEvent event) {
boolean enabled = recordFileUpload.getFileName().length() > 0
&& recordFieldWidget.getValue() != null;
uploadButton.setEnabled(enabled);
}
public static interface FormDataLoader {
void loadFormData(String fileItemName, AsyncCallback<RecordField> callback);
}
private class DefaultFormDataLoader implements FormDataLoader {
@Override
public void loadFormData(String fileItemName,
final AsyncCallback<RecordField> callback) {
String schema = recordFieldWidget.getValue().getSchema();
KaaAdmin.getDataSource().getRecordDataFromFile(schema, fileItemName,
new AsyncCallback<RecordField>() {
@Override
public void onSuccess(RecordField result) {
callback.onSuccess(result);
}
@Override
public void onFailure(Throwable caught) {
callback.onFailure(caught);
}
});
}
}
}