gwt.material.design.incubator.client.jsontable.JsonTable Maven / Gradle / Ivy
/*
* #%L
* GwtMaterial
* %%
* Copyright (C) 2015 - 2018 GwtMaterialDesign
* %%
* 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.
* #L%
*/
package gwt.material.design.incubator.client.jsontable;
import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.Element;
import com.google.gwt.event.logical.shared.HasSelectionHandlers;
import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.json.client.JSONValue;
import com.google.gwt.user.client.DOM;
import gwt.material.design.client.MaterialDesign;
import gwt.material.design.client.base.HasType;
import gwt.material.design.client.base.JsLoader;
import gwt.material.design.client.base.MaterialWidget;
import gwt.material.design.client.base.mixin.CssTypeMixin;
import gwt.material.design.incubator.client.AddinsIncubator;
import gwt.material.design.incubator.client.base.constants.IncubatorCssName;
import gwt.material.design.incubator.client.jsontable.constants.JsonTableType;
import gwt.material.design.incubator.client.jsontable.js.JsTable;
import gwt.material.design.incubator.client.jsontable.js.JsTableOptions;
import gwt.material.design.jquery.client.api.JQueryElement;
import static gwt.material.design.jquery.client.api.JQuery.$;
/**
* A widget that provides an easy way to load JSON values and display in a Table component.
*
*
* Note: This component is under the incubation process and subject to change.
*
*
* @author kevzlou7979
*/
public class JsonTable extends MaterialWidget implements HasSelectionHandlers, HasType, JsLoader {
static {
if (AddinsIncubator.isDebug()) {
MaterialDesign.injectJs(JsonTableClientDebugBundle.INSTANCE.jsonTableDebugJs());
MaterialDesign.injectCss(JsonTableClientDebugBundle.INSTANCE.jsonTableDebugCss());
} else {
MaterialDesign.injectJs(JsonTableClientBundle.INSTANCE.jsonTableJs());
MaterialDesign.injectCss(JsonTableClientBundle.INSTANCE.jsonTableCss());
}
}
private JSONValue value;
private JsTableOptions options = JsTableOptions.create();
private CssTypeMixin typeMixin;
public JsonTable() {
super(Document.get().createDivElement(), IncubatorCssName.JSON_TABLE);
}
@Override
protected void onLoad() {
super.onLoad();
load();
}
@Override
public void load() {
if (value != null) {
setId(DOM.createUniqueId());
options.id = "#" + getId();
JsTable.jsontotable(value, options);
$("tr").mousedown((e, handler) -> {
SelectionEvent.fire(JsonTable.this, $(e.target).parent().asElement());
return true;
});
}
}
@Override
protected void onUnload() {
super.onUnload();
unload();
}
@Override
public void unload() {
$("tr").off("mousedown");
}
@Override
public void reload() {
unload();
load();
}
/**
* Will display or not the thead elements.
*/
public void setShowHeader(boolean header) {
options.header = header;
}
public boolean isShowHeader() {
return options.header;
}
/**
* Will get the table element.
*/
public JQueryElement getTableElement() {
return $("table");
}
public JSONValue getValue() {
return value;
}
/**
* Will set the value of provided json values.
*/
public void setValue(JSONValue value) {
this.value = value;
reload();
}
@Override
public void setType(JsonTableType type) {
getTypeMixin().setType(type);
}
@Override
public JsonTableType getType() {
return getTypeMixin().getType();
}
@Override
public HandlerRegistration addSelectionHandler(SelectionHandler selectionHandler) {
return addHandler(selectionHandler, SelectionEvent.getType());
}
public CssTypeMixin getTypeMixin() {
if (typeMixin == null) {
typeMixin = new CssTypeMixin<>(this);
}
return typeMixin;
}
}