KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > tapestry > form > LinkSubmit


1 // Copyright 2004, 2005 The Apache Software Foundation
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
// you may not use this file except in compliance with the License.
5
// You may obtain a copy of the License at
6
//
7
// http://www.apache.org/licenses/LICENSE-2.0
8
//
9
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
// See the License for the specific language governing permissions and
13
// limitations under the License.
14

15 package org.apache.tapestry.form;
16
17 import org.apache.hivemind.ApplicationRuntimeException;
18 import org.apache.tapestry.IForm;
19 import org.apache.tapestry.IMarkupWriter;
20 import org.apache.tapestry.IRequestCycle;
21 import org.apache.tapestry.PageRenderSupport;
22 import org.apache.tapestry.Tapestry;
23 import org.apache.tapestry.TapestryUtils;
24
25 /**
26  * Implements a component that submits its enclosing form via a JavaScript link. [ <a
27  * HREF="../../../../../ComponentReference/LinkSubmit.html">Component Reference </a>]
28  *
29  * @author Richard Lewis-Shell
30  */

31
32 public abstract class LinkSubmit extends AbstractSubmit
33 {
34     /**
35      * The name of an {@link org.apache.tapestry.IRequestCycle}attribute in which the current
36      * submit link is stored. LinkSubmits do not nest.
37      */

38
39     public static final String JavaDoc ATTRIBUTE_NAME = "org.apache.tapestry.form.LinkSubmit";
40
41     /**
42      * The name of an {@link org.apache.tapestry.IRequestCycle}attribute in which the link submit
43      * component that generates the javascript function is stored. The function is only required
44      * once per page (containing a form with a non-disabled LinkSubmit)
45      */

46     public static final String JavaDoc ATTRIBUTE_FUNCTION_NAME = "org.apache.tapestry.form.LinkSubmit_function";
47
48     protected boolean isClicked(IRequestCycle cycle, String JavaDoc name)
49     {
50         // How to know which Submit link was actually
51
// clicked? When submitted, it sets its elementId into a hidden field
52
String JavaDoc value = cycle.getParameter("_linkSubmit");
53
54         // If the value isn't the elementId of this component, then this link wasn't
55
// selected.
56
return value != null && value.equals(name);
57     }
58     
59     /**
60      * @see org.apache.tapestry.form.AbstractFormComponent#renderFormComponent(org.apache.tapestry.IMarkupWriter, org.apache.tapestry.IRequestCycle)
61      */

62     protected void renderFormComponent(IMarkupWriter writer, IRequestCycle cycle)
63     {
64         boolean disabled = isDisabled();
65         
66         IMarkupWriter wrappedWriter;
67         
68         if (!disabled)
69         {
70             PageRenderSupport pageRenderSupport = TapestryUtils.getPageRenderSupport(
71                     cycle,
72                     this);
73     
74             // make sure the submit function is on the page (once)
75
if (cycle.getAttribute(ATTRIBUTE_FUNCTION_NAME) == null)
76             {
77                 pageRenderSupport
78                         .addBodyScript("function submitLink(form, elementId) { form._linkSubmit.value = elementId; if (form.onsubmit == null || form.onsubmit()) form.submit(); }");
79                 cycle.setAttribute(ATTRIBUTE_FUNCTION_NAME, this);
80             }
81     
82             IForm form = getForm();
83             String JavaDoc formName = form.getName();
84
85             // one hidden field per form:
86
String JavaDoc formHiddenFieldAttributeName = ATTRIBUTE_FUNCTION_NAME + formName;
87             if (cycle.getAttribute(formHiddenFieldAttributeName) == null)
88             {
89                 writer.beginEmpty("input");
90                 writer.attribute("type", "hidden");
91                 writer.attribute("name", "_linkSubmit");
92                 cycle.setAttribute(formHiddenFieldAttributeName, this);
93             }
94             
95             writer.begin("a");
96             writer.attribute("href", "javascript:submitLink(document." + formName + ",\"" + getName()
97                     + "\");");
98         
99             // Allow the wrapped components a chance to render.
100
// Along the way, they may interact with this component
101
// and cause the name variable to get set.
102
wrappedWriter = writer.getNestedWriter();
103         }
104         else
105             wrappedWriter = writer;
106
107         renderBody(wrappedWriter, cycle);
108
109         if (!disabled)
110         {
111             // Generate additional attributes from informal parameters.
112
renderInformalParameters(writer, cycle);
113         
114             // Dump in HTML provided by wrapped components
115
wrappedWriter.close();
116         
117             // Close the <a> tag
118
writer.end();
119         }
120     }
121
122     /**
123      * @see org.apache.tapestry.AbstractComponent#prepareForRender(org.apache.tapestry.IRequestCycle)
124      */

125     protected void prepareForRender(IRequestCycle cycle)
126     {
127         if (cycle.getAttribute(ATTRIBUTE_NAME) != null)
128             throw new ApplicationRuntimeException(Tapestry.getMessage("LinkSubmit.may-not-nest"),
129                     this, null, null);
130
131         cycle.setAttribute(ATTRIBUTE_NAME, this);
132     }
133
134     /**
135      * @see org.apache.tapestry.AbstractComponent#cleanupAfterRender(org.apache.tapestry.IRequestCycle)
136      */

137     protected void cleanupAfterRender(IRequestCycle cycle)
138     {
139         cycle.removeAttribute(ATTRIBUTE_NAME);
140     }
141 }
Popular Tags