01: /*
02: ItsNat Java Web Application Framework
03: Copyright (C) 2007 Innowhere Software Services S.L., Spanish Company
04: Author: Jose Maria Arranz Santamaria
05:
06: This program is free software: you can redistribute it and/or modify
07: it under the terms of the GNU Affero General Public License as published by
08: the Free Software Foundation, either version 3 of the License, or
09: (at your option) any later version. See the GNU Affero General Public
10: License for more details. See the copy of the GNU Affero General Public License
11: included in this program. If not, see <http://www.gnu.org/licenses/>.
12: */
13:
14: package org.itsnat.impl.core.js;
15:
16: import org.itsnat.impl.core.js.ScriptReference;
17: import org.itsnat.impl.core.ItsNatDocumentImpl;
18: import org.itsnat.impl.core.js.domrender.node.JSNodeRenderImpl;
19:
20: /**
21: * ESTA CLASE ES INTERNA
22: *
23: * @author jmarranz
24: */
25: public class JSReferenceImpl implements ScriptReference {
26: protected ItsNatDocumentImpl itsNatDoc;
27: protected Object value;
28: protected String tmpVarName;
29:
30: /** Creates a new instance of CodeValueImpl */
31: public JSReferenceImpl(Object value, ItsNatDocumentImpl itsNatDoc) {
32: this .value = value;
33: this .itsNatDoc = itsNatDoc;
34: }
35:
36: public String getCode() {
37: /* "Alguien" ha invocado este método porque quiere este código
38: * para usarlo en alguna sentencia JavaScript,
39: * consideremos que contiene this.value el código
40: * de una llamada a una función: myCall(params);
41: * dicho código ya se añadió a los Document Listener
42: * por lo que debemos generar una variable "al vuelo" e insertar
43: * para que quede algo así: var tmp_111111 = myCall(params);
44: * y se usará la variable en vez del código de la llamada
45: * Así podemos conseguir en Java que este objeto parezca una referencia JavaScript en ese caso
46: */
47: if (tmpVarName != null)
48: return tmpVarName; // Ya se generó (value es un CodeFragmentImpl y ya se pasó por aquí)
49:
50: if (value instanceof JSCodeFragmentImpl) {
51: JSCodeFragmentImpl fragment = (JSCodeFragmentImpl) value;
52: this .tmpVarName = "tmp_" + itsNatDoc.generateUniqueId();
53: fragment.setCode("var " + tmpVarName + "="
54: + fragment.getCode());
55: return tmpVarName;
56: } else
57: return JSNodeRenderImpl.javaToJS(value, itsNatDoc);
58: }
59:
60: private JSReferenceImpl addCodeToSendListeners(String code) {
61: JSCodeFragmentImpl fragment = new JSCodeFragmentImpl(code);
62: // Es muy importante que el objeto sea el mismo y compartido por el propietario y los observers
63: // pues el código puede ser modificado (setCode) y su modificación debe ser manifestada en todos
64: itsNatDoc.addCodeToSend(fragment);
65: return new JSReferenceImpl(fragment, itsNatDoc);
66: }
67:
68: public ScriptReference setProperty(String propName,
69: Object newValue, boolean endSentence) {
70: String code = JSNodeRenderImpl.getSetPropertyCode(this ,
71: propName, newValue, itsNatDoc);
72: if (endSentence)
73: code += ";";
74: return addCodeToSendListeners(code);
75: }
76:
77: public ScriptReference getProperty(String propName,
78: boolean endSentence) {
79: String code = JSNodeRenderImpl.getGetPropertyCode(this ,
80: propName, itsNatDoc);
81: if (endSentence)
82: code += ";";
83: return addCodeToSendListeners(code);
84: }
85:
86: public ScriptReference callMethod(String methodName,
87: Object[] params, boolean endSentence) {
88: String code = JSNodeRenderImpl.getCallMethodCode(this ,
89: methodName, params, itsNatDoc);
90: if (endSentence)
91: code += ";";
92: return addCodeToSendListeners(code);
93: }
94: }
|