jaroslav@1230: /** jaroslav@1230: * Back 2 Browser Bytecode Translator jaroslav@1230: * Copyright (C) 2012 Jaroslav Tulach jaroslav@1230: * jaroslav@1230: * This program is free software: you can redistribute it and/or modify jaroslav@1230: * it under the terms of the GNU General Public License as published by jaroslav@1230: * the Free Software Foundation, version 2 of the License. jaroslav@1230: * jaroslav@1230: * This program is distributed in the hope that it will be useful, jaroslav@1230: * but WITHOUT ANY WARRANTY; without even the implied warranty of jaroslav@1230: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the jaroslav@1230: * GNU General Public License for more details. jaroslav@1230: * jaroslav@1230: * You should have received a copy of the GNU General Public License jaroslav@1230: * along with this program. Look for COPYING file in the top folder. jaroslav@1230: * If not, see http://opensource.org/licenses/GPL-2.0. jaroslav@1230: */ jaroslav@1230: package org.apidesign.bck2brwsr.kofx; jaroslav@1230: jaroslav@1230: import java.io.IOException; jaroslav@1230: import java.io.InputStream; jaroslav@1230: import java.util.ServiceLoader; jaroslav@1230: import java.util.logging.Logger; jaroslav@1230: import netscape.javascript.JSObject; jaroslav@1230: import org.apidesign.html.context.spi.Contexts; jaroslav@1230: import org.apidesign.html.json.spi.FunctionBinding; jaroslav@1230: import org.apidesign.html.json.spi.JSONCall; jaroslav@1230: import org.apidesign.html.json.spi.PropertyBinding; jaroslav@1230: import org.apidesign.html.json.spi.Technology; jaroslav@1230: import org.apidesign.html.json.spi.Transfer; jaroslav@1230: import org.openide.util.lookup.ServiceProvider; jaroslav@1230: jaroslav@1230: /** This is an implementation package - just jaroslav@1230: * include its JAR on classpath and use official {@link Context} API jaroslav@1230: * to access the functionality. jaroslav@1230: *

jaroslav@1230: * Registers {@link ContextProvider}, so {@link ServiceLoader} can find it. jaroslav@1230: * jaroslav@1230: * @author Jaroslav Tulach jaroslav@1230: */ jaroslav@1230: @ServiceProvider(service = Contexts.Provider.class) jaroslav@1230: public final class FXContext jaroslav@1230: implements Technology, Transfer, Contexts.Provider { jaroslav@1230: static final Logger LOG = Logger.getLogger(FXContext.class.getName()); jaroslav@1230: jaroslav@1230: @Override jaroslav@1230: public void fillContext(Contexts.Builder context, Class requestor) { jaroslav@1230: context.register(Technology.class, this, 100); jaroslav@1230: context.register(Transfer.class, this, 100); jaroslav@1230: } jaroslav@1230: jaroslav@1230: @Override jaroslav@1230: public JSObject wrapModel(Object model) { jaroslav@1230: return (JSObject) Knockout.createBinding(model).koData(); jaroslav@1230: } jaroslav@1230: jaroslav@1230: @Override jaroslav@1230: public void bind(PropertyBinding b, Object model, JSObject data) { jaroslav@1230: final boolean isList = false; jaroslav@1230: final boolean isPrimitive = false; jaroslav@1230: Knockout.bind(data, model, b, isPrimitive, isList); jaroslav@1230: } jaroslav@1230: jaroslav@1230: @Override jaroslav@1230: public void valueHasMutated(JSObject data, String propertyName) { jaroslav@1230: Knockout.valueHasMutated(data, propertyName); jaroslav@1230: } jaroslav@1230: jaroslav@1230: @Override jaroslav@1230: public void expose(FunctionBinding fb, Object model, JSObject d) { jaroslav@1230: Knockout.expose(d, fb); jaroslav@1230: } jaroslav@1230: jaroslav@1230: @Override jaroslav@1230: public void applyBindings(JSObject data) { jaroslav@1230: Knockout.applyBindings(data); jaroslav@1230: } jaroslav@1230: jaroslav@1230: @Override jaroslav@1230: public Object wrapArray(Object[] arr) { jaroslav@1230: return Knockout.toArray(arr); jaroslav@1230: } jaroslav@1230: jaroslav@1230: @Override jaroslav@1230: public void extract(Object obj, String[] props, Object[] values) { jaroslav@1230: LoadJSON.extractJSON(obj, props, values); jaroslav@1230: } jaroslav@1230: jaroslav@1230: @Override jaroslav@1230: public void loadJSON(final JSONCall call) { jaroslav@1230: LoadJSON.loadJSON(call); jaroslav@1230: } jaroslav@1230: jaroslav@1230: @Override jaroslav@1230: public M toModel(Class modelClass, Object data) { jaroslav@1230: if (data instanceof JSObject) { jaroslav@1230: data = ((JSObject)data).getMember("ko-fx.model"); // NOI18N jaroslav@1230: } jaroslav@1230: return modelClass.cast(data); jaroslav@1230: } jaroslav@1230: jaroslav@1230: @Override jaroslav@1230: public Object toJSON(InputStream is) throws IOException { jaroslav@1230: return LoadJSON.parse(is); jaroslav@1230: } jaroslav@1230: }