/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates.
*
* 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.uberfire.client.plugin;
import javax.inject.Inject;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.SimplePanel;
import org.uberfire.client.jsapi.JSPlaceRequest;
import org.uberfire.mvp.ParameterizedCommand;
import org.uberfire.mvp.PlaceRequest;
public abstract class JSNativePlugin {
@Inject
protected RuntimePluginsServiceProxy runtimePluginsService;
protected JavaScriptObject obj;
protected Element element = null;
public static boolean hasTemplate(final JavaScriptObject obj) {
if (hasMethod(obj,
"template") || hasMethod(obj,
"templateUrl")) {
return true;
}
return hasStringProperty(obj,
"template") || hasStringProperty(obj,
"templateUrl");
}
public static native boolean hasMethod(final JavaScriptObject obj,
final String methodName) /*-{
return ((typeof obj[methodName]) === "function");
}-*/;
public static native boolean hasStringProperty(final JavaScriptObject obj,
final String propertyName) /*-{
return ((typeof obj[propertyName]) === "string");
}-*/;
public static native boolean hasIntProperty(final JavaScriptObject obj,
final String propertyName) /*-{
return (obj[propertyName] === parseInt(obj[propertyName]));
}-*/;
public static native boolean hasBooleanProperty(final JavaScriptObject obj,
final String propertyName) /*-{
return ((typeof obj[propertyName]) === "boolean");
}-*/;
public static native boolean hasArrayProperty(final JavaScriptObject obj,
final String propertyName) /*-{
return ((obj.propertyName) instanceof Array);
}-*/;
private static native String getTemplateUrlFunctionResult(final JavaScriptObject o) /*-{
var result = o.templateUrl();
if (typeof result === "string") {
return result;
}
return null;
}-*/;
private static native String getTemplateFunctionResult(final JavaScriptObject o) /*-{
var result = o.template();
if (typeof result === "string") {
return result;
}
return null;
}-*/;
private static native String getContextIdFunctionResult(final JavaScriptObject o) /*-{
var result = o.context_Id();
if (typeof result === "string") {
return result;
}
return null;
}-*/;
private static native String getTypeFunctionResult(final JavaScriptObject o) /*-{
var result = o.type();
if (typeof result === "string") {
return result;
}
return null;
}-*/;
private static native String getTitleFunctionResult(final JavaScriptObject o) /*-{
var result = o.title();
if (typeof result === "string") {
return result;
}
return null;
}-*/;
private static native void executeOnOpen(final JavaScriptObject o,
String URI) /*-{
o.on_open(URI);
}-*/;
private static native void executeOnOpen(final JavaScriptObject o) /*-{
o.on_open();
}-*/;
private static native void executeOnClose(final JavaScriptObject o) /*-{
o.on_close();
}-*/;
private static native void executeOnShutdown(final JavaScriptObject o) /*-{
o.on_shutdown();
}-*/;
private static native void executeOnStartup(final JavaScriptObject o,
String URI) /*-{
o.on_startup(URI);
}-*/;
private static native void executeOnStartup(final JavaScriptObject o,
final JSPlaceRequest place) /*-{
o.on_startup(place);
}-*/;
private static native void executeOnFocus(final JavaScriptObject o) /*-{
o.on_focus();
}-*/;
private static native void executeOnLostFocus(final JavaScriptObject o) /*-{
o.on_lost_focus();
}-*/;
private static native boolean executeOnMayClose(final JavaScriptObject o) /*-{
var result = o.type();
if (typeof result === "boolean") {
return result;
}
return true;
}-*/;
private static native String getType(final JavaScriptObject o) /*-{
return o.type;
}-*/;
private static native String getTitle(final JavaScriptObject o) /*-{
return o.title;
}-*/;
private static native String getContextId(final JavaScriptObject o) /*-{
return o.context_id;
}-*/;
private static native String getTemplate(final JavaScriptObject o) /*-{
return o.template;
}-*/;
private static native String getTemplateUrl(final JavaScriptObject o) /*-{
return o.templateUrl;
}-*/;
public void build(final JavaScriptObject obj) {
if (this.obj != null) {
throw new RuntimeException("Can't build more than once.");
}
this.obj = obj;
buildElement();
}
public native String getId() /*-{
return this.@org.uberfire.client.plugin.JSNativePlugin::obj.id;
}-*/;
public native String getPriority() /*-{
return this.@org.uberfire.client.plugin.JSNativePlugin::obj.priority;
}-*/;
public Element getElement() {
return element;
}
public String getContextId() {
String contextId = null;
if (hasMethod(obj,
"context_id")) {
contextId = getContextIdFunctionResult(obj);
} else if (hasStringProperty(obj,
"context_id")) {
contextId = getContextId(obj);
}
return contextId;
}
public String getTitle() {
String title = null;
if (hasMethod(obj,
"title")) {
title = getTitleFunctionResult(obj);
} else if (hasStringProperty(obj,
"title")) {
title = getTitle(obj);
}
if (title == null) {
title = getId();
}
return title;
}
public String getType() {
String type = null;
if (hasMethod(obj,
"type")) {
type = getTypeFunctionResult(obj);
} else if (hasStringProperty(obj,
"type")) {
type = getType(obj);
}
if (type == null) {
type = "";
}
return type;
}
public void onOpen() {
if (hasMethod(obj,
"on_open")) {
executeOnOpen(obj);
}
}
public void onOpen(String URI) {
if (hasMethod(obj,
"on_open")) {
executeOnOpen(obj,
URI);
}
}
public void onClose() {
if (hasMethod(obj,
"on_close")) {
executeOnClose(obj);
}
}
public void onFocus() {
if (hasMethod(obj,
"on_focus")) {
executeOnFocus(obj);
}
}
public void onLostFocus() {
if (hasMethod(obj,
"on_lost_focus")) {
executeOnLostFocus(obj);
}
}
public boolean onMayClose() {
if (hasMethod(obj,
"on_may_close")) {
return executeOnMayClose(obj);
}
return true;
}
protected void buildElement() {
final String content;
final String contentUrl;
if (hasMethod(obj,
"templateUrl")) {
contentUrl = getTemplateUrlFunctionResult(obj);
content = null;
} else if (hasMethod(obj,
"template")) {
content = getTemplateFunctionResult(obj);
contentUrl = null;
} else if (hasStringProperty(obj,
"templateUrl")) {
contentUrl = getTemplateUrl(obj);
content = null;
} else if (hasStringProperty(obj,
"template")) {
content = getTemplate(obj);
contentUrl = null;
} else {
content = null;
contentUrl = null;
}
element = new SimplePanel(new Label("Loading")).getElement();
if (content != null) {
element = new HTML(new SafeHtmlBuilder().appendHtmlConstant(content).toSafeHtml()).getElement();
} else if (contentUrl != null) {
runtimePluginsService.getTemplateContent(contentUrl,
new ParameterizedCommand<String>() {
@Override
public void execute(String parameter) {
element = new HTML(new SafeHtmlBuilder().appendHtmlConstant(parameter).toSafeHtml()).getElement();
}
});
} else {
element = null;
}
}
public void onStartup(String URI) {
if (hasMethod(obj,
"on_startup")) {
executeOnStartup(obj,
URI);
}
}
public void onStartup(PlaceRequest place) {
if (hasMethod(obj,
"on_startup")) {
executeOnStartup(obj,
JSPlaceRequest.fromPlaceRequest(place));
}
}
public void onShutdown() {
if (hasMethod(obj,
"on_shutdown")) {
executeOnShutdown(obj);
}
}
}