001 // Copyright 2007, 2008, 2009, 2010 The Apache Software Foundation
002 //
003 // Licensed under the Apache License, Version 2.0 (the "License");
004 // you may not use this file except in compliance with the License.
005 // You may obtain a copy of the License at
006 //
007 // http://www.apache.org/licenses/LICENSE-2.0
008 //
009 // Unless required by applicable law or agreed to in writing, software
010 // distributed under the License is distributed on an "AS IS" BASIS,
011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012 // See the License for the specific language governing permissions and
013 // limitations under the License.
014
015 package org.apache.tapestry5.internal.services;
016
017 import org.apache.tapestry5.Field;
018 import org.apache.tapestry5.Link;
019 import org.apache.tapestry5.corelib.data.InsertPosition;
020 import org.apache.tapestry5.json.JSONArray;
021 import org.apache.tapestry5.json.JSONLiteral;
022 import org.apache.tapestry5.json.JSONObject;
023 import org.apache.tapestry5.services.ClientBehaviorSupport;
024 import org.apache.tapestry5.services.Environment;
025 import org.apache.tapestry5.services.FormSupport;
026 import org.apache.tapestry5.services.javascript.JavaScriptSupport;
027
028 public class ClientBehaviorSupportImpl implements ClientBehaviorSupport
029 {
030 private final JavaScriptSupport javascriptSupport;
031
032 private final Environment environment;
033
034 private final JSONObject validations = new JSONObject();
035
036 public ClientBehaviorSupportImpl(JavaScriptSupport javascriptSupport, Environment environment)
037 {
038 this.javascriptSupport = javascriptSupport;
039 this.environment = environment;
040 }
041
042 public void addZone(String clientId, String showFunctionName, String updateFunctionName)
043 {
044 JSONObject spec = new JSONObject("element", clientId);
045
046 addFunction(spec, "show", showFunctionName);
047 addFunction(spec, "update", updateFunctionName);
048
049 FormSupport formSupport = environment.peek(FormSupport.class);
050
051 if (formSupport != null)
052 {
053 JSONObject parameters = new JSONObject(RequestConstants.FORM_CLIENTID_PARAMETER, formSupport.getClientId(),
054 RequestConstants.FORM_COMPONENTID_PARAMETER, formSupport.getFormComponentId());
055 spec.put("parameters", parameters);
056 }
057
058 javascriptSupport.addInitializerCall("zone", spec);
059 }
060
061 private void addFunction(JSONObject spec, String key, String functionName)
062 {
063 if (functionName != null)
064 spec.put(key, functionName.toLowerCase());
065 }
066
067 public void linkZone(String linkId, String elementId, Link eventLink)
068 {
069 JSONObject spec = new JSONObject("linkId", linkId, "zoneId", elementId, "url", eventLink.toURI());
070
071 javascriptSupport.addInitializerCall("linkZone", spec);
072 }
073
074 /**
075 * @deprecated Use {@link #addFormFragment(String,boolean,String,String)} instead
076 */
077 public void addFormFragment(String clientId, String showFunctionName, String hideFunctionName)
078 {
079 addFormFragment(clientId, false, showFunctionName, hideFunctionName, null);
080 }
081
082 /**
083 * @deprecated Use {@link #addFormFragment(String, boolean, String, String, String)} instead
084 */
085 public void addFormFragment(String clientId, boolean alwaysSubmit, String showFunctionName, String hideFunctionName)
086 {
087 addFormFragment(clientId, false, showFunctionName, hideFunctionName, null);
088 }
089
090 public void addFormFragment(String clientId, boolean alwaysSubmit, String showFunctionName, String hideFunctionName, String visibilityBoundFunctionName)
091 {
092 JSONObject spec = new JSONObject("element", clientId);
093
094 addFunction(spec, "show", showFunctionName);
095 addFunction(spec, "hide", hideFunctionName);
096
097 if (visibilityBoundFunctionName != null)
098 spec.put("bound", new JSONLiteral(visibilityBoundFunctionName));
099
100 if (alwaysSubmit)
101 spec.put("alwaysSubmit", true);
102
103 javascriptSupport.addInitializerCall("formFragment", spec);
104 }
105
106 public void addFormInjector(String clientId, Link link, InsertPosition insertPosition, String showFunctionName)
107 {
108 JSONObject spec = new JSONObject("element", clientId, "url", link.toURI());
109
110 if (insertPosition == InsertPosition.BELOW)
111 spec.put("below", true);
112
113 addFunction(spec, "show", showFunctionName);
114
115 // Always has at least two properties.
116
117 javascriptSupport.addInitializerCall("formInjector", spec);
118 }
119
120 public void addValidation(Field field, String validationName, String message, Object constraint)
121 {
122 String fieldId = field.getClientId();
123
124 JSONArray specs;
125
126 if (validations.has(fieldId))
127 specs = validations.getJSONArray(fieldId);
128 else
129 {
130 specs = new JSONArray();
131 validations.put(fieldId, specs);
132 }
133
134 JSONArray thisSpec = new JSONArray();
135
136 thisSpec.put(validationName);
137 thisSpec.put(message);
138
139 if (constraint != null)
140 thisSpec.put(constraint);
141
142 specs.put(thisSpec);
143 }
144
145 /**
146 * Invoked at the end of rendering to commit (to the {@link JavaScriptSupport}) any accumulated
147 * validations.
148 */
149 public void commit()
150 {
151 if (validations.length() != 0)
152 javascriptSupport.addInitializerCall("validate", validations);
153 }
154 }