You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@cocoon.apache.org by Leonid Chumanov <lc...@framedoc.ru> on 2004/12/02 12:57:00 UTC
[CForms] widget mode (readonly, output, hidden, etc.) - offer to developers
I know, that there are plans to make block CFORMS stable and there is a
gathering the information. I enough for a long time use this block and
me there are certain reasons which I would like to offer. Beforehand I
apologize, if I shall tell something already discussed. Earlier I did
not write and did not read this conference, I participated only in the
user conference.
I think, it is necessary to make more flexible system of readwrite modes
in elements. In the my project I have made the following changes:
Has entered new attribute of widget style "rwmode" (though it was
possible to use already existing type, but it is now used and as for the
task of a readwrite mode (hidden, output), and as for the type of
element (textarea, data))
Possible values of rwmode:
invisible - the element is inaccessible and is not shown (as though it
and is not present in general)
hidden - the element is displayed by the hidden field (same as
type=hidden)
output - the element is displayed by the text (same as output)
output_hidden - simultaneously the element is displayed by the hidden
field and the element is displayed by the text
readonly - the element is displayed by a field of editing, but with a
grey background and attribute only reading
readwrite (default) - a usual element of editing
For example:
<ft:widget id="creationDate">
<fi:styling rwmode="output_hidden" format="dd/MM/yyyy"/>
</ft:widget>
Also I wanted, that it was possible to set a readwrite mode not only
from a template, but also from API. Therefore I have made the following
changes to source codes
public interface Widget {
public static final int RWMODE_INVISIBLE = 0;
public static final int RWMODE_HIDDEN = 1;
public static final int RWMODE_OUTPUT = 2;
public static final int RWMODE_OUTPUT_HIDDEN = 3;
public static final int RWMODE_READONLY = 4;
public static final int RWMODE_READWRITE = 5;
public static final String RWMODE_EL = "rwmode";
public static final String RWMODE_INVISIBLE_STR = "invisible";
public static final String RWMODE_HIDDEN_STR = "hidden";
public static final String RWMODE_OUTPUT_STR = "output";
public static final String RWMODE_OUTPUT_HIDDEN_STR = "output_hidden";
public static final String RWMODE_READONLY_STR = "readonly";
public static final String RWMODE_READWRITE_STR = "readwrite";
public int getRwmode();
public void setRwmode(int rwmode);
public int getRwmodeDefinition();
public void setRwmodeDefinition(int rwmodeDefinition);
public void restoreRwmodeToDefinition();
//:
}
public abstract class AbstractWidget implements Widget {
private int rwmode = RWMODE_READWRITE;
private int rwmodeDefinition = RWMODE_READWRITE;
public int getRwmode() {
return rwmode;
}
public void setRwmode(int rwmode) {
this.rwmode = rwmode;
}
public int getRwmodeDefinition() {
return rwmodeDefinition;
}
public void setRwmodeDefinition(int rwmodeDefinition) {
this.rwmodeDefinition = rwmodeDefinition;
}
public void restoreRwmodeToDefinition(){
rwmode = rwmodeDefinition;
}
protected void generateRWMODESaxFragment(ContentHandler
contentHandler, Locale locale) throws SAXException {
String stringValue = "true";
if (rwmode == RWMODE_INVISIBLE){
stringValue = RWMODE_INVISIBLE_STR;
}
else if (rwmode == RWMODE_HIDDEN){
stringValue = RWMODE_HIDDEN_STR;
}
else if (rwmode == RWMODE_OUTPUT){
stringValue = RWMODE_OUTPUT_STR;
}
else if (rwmode == RWMODE_OUTPUT_HIDDEN){
stringValue = RWMODE_OUTPUT_HIDDEN_STR;
}
else if (rwmode == RWMODE_READONLY){
stringValue = RWMODE_READONLY_STR;
}
else if (rwmode == RWMODE_READWRITE){
stringValue = RWMODE_READWRITE_STR;
}
if (rwmode != RWMODE_READWRITE){
contentHandler.startElement(Constants.INSTANCE_NS, RWMODE_EL,
Constants.INSTANCE_PREFIX_COLON +
RWMODE_EL,
XMLUtils.EMPTY_ATTRIBUTES);
contentHandler.characters(stringValue.toCharArray(), 0,
stringValue.length());
contentHandler.endElement(Constants.INSTANCE_NS, RWMODE_EL,
Constants.INSTANCE_PREFIX_COLON +
RWMODE_EL);
}
}
//:
}
and in each child Widget element I added call of function
generateRWMODESaxFragment() to function generateItemSaxFragment
public void generateItemSaxFragment(ContentHandler contentHandler,
Locale locale) throws SAXException {
//some code
//:
generateRWMODESaxFragment(contentHandler, locale);
}
public class EffectWidgetReplacingPipe extends EffectPipe {
//:
protected class WidgetHandler extends Handler {
public Handler process() throws SAXException {
switch (event) {
case EVENT_START_ELEMENT:
widgetId = getWidgetId(input.attrs);
widget = getWidget(widgetId);
gotStylingElement = false;
out.bufferInit();
return this;
case EVENT_ELEMENT:
if (Constants.INSTANCE_NS.equals(input.uri) &&
STYLING_EL.equals(input.loc)) {
gotStylingElement = true;
//my added code start
String rwmode = null;
if (input.attrs != null){
rwmode = input.attrs.getValue(Widget.RWMODE_EL);
}
if (rwmode != null && widget != null){
if (Widget.RWMODE_INVISIBLE_STR.equals(rwmode)){
widget.setRwmodeDefinition(Widget.RWMODE_INVISIBLE);
}
else if (Widget.RWMODE_HIDDEN_STR.equals(rwmode)){
widget.setRwmodeDefinition(Widget.RWMODE_HIDDEN);
}
else if
(Widget.RWMODE_OUTPUT_HIDDEN_STR.equals(rwmode)){
widget.setRwmodeDefinition(Widget.RWMODE_OUTPUT_HIDDEN);
}
else if (Widget.RWMODE_OUTPUT_STR.equals(rwmode)){
widget.setRwmodeDefinition(Widget.RWMODE_OUTPUT);
}
else if
(Widget.RWMODE_READONLY_STR.equals(rwmode)){
widget.setRwmodeDefinition(Widget.RWMODE_READONLY);
}
else {
widget.setRwmodeDefinition(Widget.RWMODE_READWRITE);
}
widget.restoreRwmodeToDefinition();
}
//my added code end
}
return bufferHandler;
case EVENT_END_ELEMENT:
stylingHandler.recycle();
stylingHandler.setSaxFragment(out.getBuffer());
stylingHandler.setContentHandler(getContentHandler());
stylingHandler.setLexicalHandler(getLexicalHandler());
widget.generateSaxFragment(stylingHandler,
pipeContext.getLocale());
widget = null;
out.bufferFini();
return this;
default:
out.copy();
return this;
}
}
}
}
Unfortunately it was necessary to bring in the greatest changes in xsl.
It is necessary to add checks for each element. For example:
<xsl:template match="fi:field">
<input name="{@id}" id="{@id}"
value="{fi:value}" title="{fi:hint}">
<xsl:if test="fi:styling">
<xsl:copy-of
select="fi:styling/@*[not(name() = 'rwmode' or name() =
'submit-on-change')]"/>
</xsl:if>
<xsl:if
test="fi:styling/@submit-on-change='true'">
<xsl:attribute
name="onchange">forms_submitForm(this)</xsl:attribute>
</xsl:if>
<xsl:choose>
<xsl:when test="fi:rwmode
= 'readonly'">
<xsl:attribute name="class">rdtext</xsl:attribute>
<xsl:attribute name="readonly">1</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="class">text</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
</input>
<xsl:apply-templates select="." mode="common"/>
</xsl:template>
<xsl:template match="fi:field[fi:rwmode = 'invisible']"
priority="2"/>
<xsl:template match="fi:field[fi:styling/@type='output' or
fi:rwmode = 'output']" priority="2">
<xsl:choose>
<xsl:when test="fi:selection-list">
<xsl:variable
name="value" select="fi:value"/>
<xsl:variable
name="selected" select="fi:selection-list/fi:item[@value = $value]"/>
<xsl:choose>
<xsl:when
test="$selected/fi:label">
<xsl:apply-templates select="$selected/fi:label"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$value"/>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of
select="fi:value/node()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Re: [CForms] widget mode (readonly, output, hidden, etc.) - offer
to developers
Posted by Sylvain Wallez <sy...@apache.org>.
Leonid Chumanov wrote:
> I know, that there are plans to make block CFORMS stable and there is
> a gathering the information. I enough for a long time use this block
> and me there are certain reasons which I would like to offer.
> Beforehand I apologize, if I shall tell something already discussed.
> Earlier I did not write and did not read this conference, I
> participated only in the user conference.
>
What do you mean by "user conference"? Do you mean the Cocoon GetTogether?
> I think, it is necessary to make more flexible system of readwrite
> modes in elements. In the my project I have made the following changes:
>
> Has entered new attribute of widget style “rwmode” (though it was
> possible to use already existing type, but it is now used and as for
> the task of a readwrite mode (hidden, output), and as for the type of
> element (textarea, data))
>
> Possible values of rwmode:
>
> invisible - the element is inaccessible and is not shown (as though it
> and is not present in general)
>
> hidden - the element is displayed by the hidden field (same as
> type=hidden)
>
> output - the element is displayed by the text (same as output)
>
> output_hidden - simultaneously the element is displayed by the hidden
> field and the element is displayed by the text
>
> readonly - the element is displayed by a field of editing, but with a
> grey background and attribute only reading
>
> readwrite (default) - a usual element of editing
>
This list is partially implemented by a recent new feature, the "widget
states". There are now getState/setState methods taking a WidgetState
argument.
The currently available states are:
- active: what you call readwrite
- disabled: what you call readonly
- invisible: same as you.
The "output" state will be added as it corresponds to a real need, but
I'm not sure about the "hidden" and the "output_hidden" states. Can you
explain the use cases for these two states?
Sylvain
--
Sylvain Wallez Anyware Technologies
http://www.apache.org/~sylvain http://www.anyware-tech.com
{ XML, Java, Cocoon, OpenSource }*{ Training, Consulting, Projects }