|
From: Walter M. <wal...@us...> - 2008-03-02 20:59:19
|
User: walterim
Date: 08/03/02 12:59:25
Modified: andromda-jsf2/src/main/resources/resources/views/css
custom.css
andromda-jsf2/src/main/resources/templates/jsf2/controllers/crud
Controller.java.vsl
andromda-jsf2/src/main/resources/templates/jsf2/forms/crud
SearchForm.java.vsl Form.java.vsl
andromda-jsf2/src/main/resources/META-INF/andromda
namespace.xml cartridge.xml
andromda-jsf2/src/main/resources/resources/views/skins/beach
beach.css
andromda-jsf2/src/main/resources/resources/views/skins/default
default.css
. .project
andromda-jsf2/src/main/resources/templates/jsf2/converters/crud
EntityConverter.java.vsl
andromda-seam pom.xml
andromda-jsf2/src/main/resources/templates/jsf2/configuration
faces-config.xml.vsl web.xml.vsl
andromda-jsf2/src/main/resources/resources/views/skins/purple
purpleSkin.css
andromda-jsf2/src/main/resources/templates/jsf2/views/facelets/crud
view.xhtml.vsl
andromda-jsf2/src/main/resources/templates/jsf2/exception
PatternMatchingExceptionHandler.java.vsl
Added: andromda-jsf2/src/main/resources/resources/views/skins/default/images
autocomplete-button.gif
autocomplete-button-action.gif
andromda-jsf2/src/main/resources/resources/views/skins/purple/images
autocomplete-button-action.gif
autocomplete-button.gif
andromda-jsf2/src/main/resources/templates/jsf2/views/facelets
jsf2.taglib.xml.vsl
andromda-jsf2/src/main/resources/templates/jsf2/views/facelets/components
autocomplete.xhtml.vsl autocompleteMulti.xhtml.vsl
andromda-jsf2/src/main/resources/resources/views/skins/beach/images
autocomplete-button.gif
autocomplete-button-action.gif
Log:
Added the autocomplete component
Revision Changes Path
1.2 +1 -1 cartridges/andromda-jsf2/src/main/resources/resources/views/css/custom.css
Index: custom.css
===================================================================
RCS file: /cvsroot/andromdaplugins/cartridges/andromda-jsf2/src/main/resources/resources/views/css/custom.css,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -w -r1.1 -r1.2
1.1 cartridges/andromda-jsf2/src/main/resources/resources/views/skins/default/images/autocomplete-button.gif
<<Binary file>>
1.1 cartridges/andromda-jsf2/src/main/resources/resources/views/skins/default/images/autocomplete-button-action.gif
<<Binary file>>
1.13 +154 -78 cartridges/andromda-jsf2/src/main/resources/templates/jsf2/controllers/crud/Controller.java.vsl
Index: Controller.java.vsl
===================================================================
RCS file: /cvsroot/andromdaplugins/cartridges/andromda-jsf2/src/main/resources/templates/jsf2/controllers/crud/Controller.java.vsl,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -w -r1.12 -r1.13
--- Controller.java.vsl 28 Jan 2008 19:19:18 -0000 1.12
+++ Controller.java.vsl 2 Mar 2008 20:59:16 -0000 1.13
@@ -2,9 +2,6 @@
// license-header java merge-point
package $manageable.manageablePackageName;
-import javax.faces.component.UIParameter;
-import javax.faces.event.ActionEvent;
-
public class ${manageable.controllerName}
implements java.io.Serializable
{
@@ -14,7 +11,7 @@
private static final long serialVersionUID = ${manageable.actionSerialVersionUID}L;
public String init(){
- final org.andromda.presentation.jsf2.AdfFacesContextWrapper contextWrapper = new org.andromda.presentation.jsf2.AdfFacesContextWrapper();
+ final ${managedBeansPackage}.AdfFacesContextWrapper contextWrapper = new ${managedBeansPackage}.AdfFacesContextWrapper();
try
{
final ${manageable.formBeanType} form = this.getForm();
@@ -27,14 +24,14 @@
}
catch (final Throwable throwable)
{
- final String message = org.andromda.presentation.jsf2.Messages.get(
- org.andromda.presentation.jsf2.PatternMatchingExceptionHandler.instance().handleException(throwable), null);
- throwable.printStackTrace();
- this.addErrorMessage(message);
+ final String messageKey = ${managedBeansPackage}.${patternMatchingExceptionHandler}.instance().handleException(throwable);
+ if(!org.apache.commons.lang.StringUtils.isEmpty(messageKey))
+ this.addErrorMessage(${managedBeansPackage}.Messages.get(messageKey, null));
}
}
catch (final Throwable throwable)
{
+ throwable.printStackTrace();
this.addExceptionMessage(throwable);
}
return "${manageable.viewFullPath}";
@@ -53,11 +50,13 @@
#end
#end
+#if (!$useAutocompleteLookup)
#if (!$manageable.manageableAssociationEnds.empty)
final java.util.Map backingLists = ${manageable.manageableServiceAccessorCall}.readBackingLists();
#foreach ($member in $manageable.manageableAssociationEnds)
form.${member.setterName}BackingList((java.util.Collection)backingLists.get("${member.name}"));
#end
+#end
#end
form.setEditState(false);
@@ -68,8 +67,8 @@
#else
#set($idParamClass = $manageable.manageableIdentifier.type.name)
#end
- public void load(ActionEvent event){
- final org.andromda.presentation.jsf2.AdfFacesContextWrapper contextWrapper = new org.andromda.presentation.jsf2.AdfFacesContextWrapper();
+ public void load(javax.faces.event.ActionEvent event){
+ final ${managedBeansPackage}.AdfFacesContextWrapper contextWrapper = new ${managedBeansPackage}.AdfFacesContextWrapper();
try
{
final ${manageable.formBeanType} form = this.getForm();
@@ -78,17 +77,18 @@
{
contextWrapper.getCurrentInstance().getPageFlowScope().put("form", form);
- this.doLoad(${idParamClass}.valueOf(((UIParameter)event.getComponent().findComponent("${manageable.manageableIdentifier.name}")).getValue().toString()),form);
+ this.doLoad(${idParamClass}.valueOf(((javax.faces.component.UIParameter)event.getComponent().findComponent("${manageable.manageableIdentifier.name}")).getValue().toString()),form);
}
catch (final Throwable throwable)
{
- final String message = org.andromda.presentation.jsf2.Messages.get(
- org.andromda.presentation.jsf2.PatternMatchingExceptionHandler.instance().handleException(throwable), null);
- this.addErrorMessage(message);
+ final String messageKey = ${managedBeansPackage}.${patternMatchingExceptionHandler}.instance().handleException(throwable);
+ if(!org.apache.commons.lang.StringUtils.isEmpty(messageKey))
+ this.addErrorMessage(${managedBeansPackage}.Messages.get(messageKey, null));
}
}
catch (final Throwable throwable)
{
+ throwable.printStackTrace();
this.addExceptionMessage(throwable);
}
}
@@ -97,7 +97,7 @@
final ${manageable.valueObjectClassName} vo=
${manageable.manageableServiceAccessorCall}.readById(${manageable.manageableIdentifier.name});
-#foreach ($member in $manageable.attributes)
+#foreach ($member in $manageable.manageableAttributes)
#if(!${member.inputFile})
form.${member.setterName}(vo.${member.getterName}());
#end
@@ -109,38 +109,8 @@
form.setEditState(true);
}
- public String back(){
- final org.andromda.presentation.jsf2.AdfFacesContextWrapper contextWrapper = new org.andromda.presentation.jsf2.AdfFacesContextWrapper();
- try
- {
- final ${manageable.formBeanType} form = this.getForm();
-
- try
- {
- contextWrapper.getCurrentInstance().getPageFlowScope().put("form", form);
-
- this.doBack(form);
- }
- catch (final Throwable throwable)
- {
- final String message = org.andromda.presentation.jsf2.Messages.get(
- org.andromda.presentation.jsf2.PatternMatchingExceptionHandler.instance().handleException(throwable), null);
- this.addErrorMessage(message);
- }
- }
- catch (final Throwable throwable)
- {
- this.addExceptionMessage(throwable);
- }
- return null;
- }
-
- public void doBack(${manageable.formBeanType} form) throws Exception {
- form.setEditState(false);
- }
-
public String cancel(){
- final org.andromda.presentation.jsf2.AdfFacesContextWrapper contextWrapper = new org.andromda.presentation.jsf2.AdfFacesContextWrapper();
+ final ${managedBeansPackage}.AdfFacesContextWrapper contextWrapper = new ${managedBeansPackage}.AdfFacesContextWrapper();
try
{
final ${manageable.formBeanType} form = this.getForm();
@@ -153,13 +123,14 @@
}
catch (final Throwable throwable)
{
- final String message = org.andromda.presentation.jsf2.Messages.get(
- org.andromda.presentation.jsf2.PatternMatchingExceptionHandler.instance().handleException(throwable), null);
- this.addErrorMessage(message);
+ final String messageKey = ${managedBeansPackage}.${patternMatchingExceptionHandler}.instance().handleException(throwable);
+ if(!org.apache.commons.lang.StringUtils.isEmpty(messageKey))
+ this.addErrorMessage(${managedBeansPackage}.Messages.get(messageKey, null));
}
}
catch (final Throwable throwable)
{
+ throwable.printStackTrace();
this.addExceptionMessage(throwable);
}
return null;
@@ -171,7 +142,7 @@
#if ($manageable.create)
public String startNew(){
- final org.andromda.presentation.jsf2.AdfFacesContextWrapper contextWrapper = new org.andromda.presentation.jsf2.AdfFacesContextWrapper();
+ final ${managedBeansPackage}.AdfFacesContextWrapper contextWrapper = new ${managedBeansPackage}.AdfFacesContextWrapper();
try
{
final ${manageable.formBeanType} form = this.getForm();
@@ -184,22 +155,24 @@
}
catch (final Throwable throwable)
{
- final String message = org.andromda.presentation.jsf2.Messages.get(
- org.andromda.presentation.jsf2.PatternMatchingExceptionHandler.instance().handleException(throwable), null);
- this.addErrorMessage(message);
+ final String messageKey = ${managedBeansPackage}.${patternMatchingExceptionHandler}.instance().handleException(throwable);
+ if(!org.apache.commons.lang.StringUtils.isEmpty(messageKey))
+ this.addErrorMessage(${managedBeansPackage}.Messages.get(messageKey, null));
}
}
catch (final Throwable throwable)
{
+ throwable.printStackTrace();
this.addExceptionMessage(throwable);
}
- return null;
+
+ return "${manageable.viewFullPath}";
}
public void doStartNew(${manageable.formBeanType} form) throws Exception {
## set all default attribute values
-#foreach ($member in $manageable.attributes)
+#foreach ($member in $manageable.manageableAttributes)
#set($memberType = $member.type)
#if ($member.defaultValue)
#if ($memberType.dateType)
@@ -234,7 +207,13 @@
#end
#end
-##tem mesmo que ler de novo ????
+#if (!$manageable.manageableAssociationEnds.empty)
+#foreach ($member in $manageable.manageableAssociationEnds)
+ form.${member.setterName}(null);
+#end
+#end
+
+#if (!$useAutocompleteLookup)
#if (!$manageable.manageableAssociationEnds.empty)
final java.util.Map backingLists = ${manageable.manageableServiceAccessorCall}.readBackingLists();
#foreach ($member in $manageable.manageableAssociationEnds)
@@ -242,12 +221,13 @@
#end
#end
+#end
form.setEditState(true);
}
#end
#if ($manageable.create || $manageable.update)
public String save(){
- final org.andromda.presentation.jsf2.AdfFacesContextWrapper contextWrapper = new org.andromda.presentation.jsf2.AdfFacesContextWrapper();
+ final ${managedBeansPackage}.AdfFacesContextWrapper contextWrapper = new ${managedBeansPackage}.AdfFacesContextWrapper();
try
{
final ${manageable.formBeanType} form = this.getForm();
@@ -260,13 +240,14 @@
}
catch (final Throwable throwable)
{
- final String message = org.andromda.presentation.jsf2.Messages.get(
- org.andromda.presentation.jsf2.PatternMatchingExceptionHandler.instance().handleException(throwable), null);
- this.addErrorMessage(message);
+ final String messageKey = ${managedBeansPackage}.${patternMatchingExceptionHandler}.instance().handleException(throwable);
+ if(!org.apache.commons.lang.StringUtils.isEmpty(messageKey))
+ this.addErrorMessage(${managedBeansPackage}.Messages.get(messageKey, null));
}
}
catch (final Throwable throwable)
{
+ throwable.printStackTrace();
this.addExceptionMessage(throwable);
}
return null;
@@ -309,9 +290,40 @@
form.setEditState(false);
}
+
+#end
+#if ($manageable.create)
+ public String saveAndNew(){
+ final ${managedBeansPackage}.AdfFacesContextWrapper contextWrapper = new ${managedBeansPackage}.AdfFacesContextWrapper();
+ try
+ {
+ final ${manageable.formBeanType} form = this.getForm();
+
+ try
+ {
+ contextWrapper.getCurrentInstance().getPageFlowScope().put("form", form);
+
+ this.doSave(form);
+ this.doStartNew(form);
+ }
+ catch (final Throwable throwable)
+ {
+ final String messageKey = ${managedBeansPackage}.${patternMatchingExceptionHandler}.instance().handleException(throwable);
+ if(!org.apache.commons.lang.StringUtils.isEmpty(messageKey))
+ this.addErrorMessage(${managedBeansPackage}.Messages.get(messageKey, null));
+ }
+ }
+ catch (final Throwable throwable)
+ {
+ throwable.printStackTrace();
+ this.addExceptionMessage(throwable);
+ }
+ return null;
+ }
#end
+
public String search(){
- final org.andromda.presentation.jsf2.AdfFacesContextWrapper contextWrapper = new org.andromda.presentation.jsf2.AdfFacesContextWrapper();
+ final ${managedBeansPackage}.AdfFacesContextWrapper contextWrapper = new ${managedBeansPackage}.AdfFacesContextWrapper();
try
{
final ${manageable.formBeanType} form = this.getForm();
@@ -324,13 +336,14 @@
}
catch (final Throwable throwable)
{
- final String message = org.andromda.presentation.jsf2.Messages.get(
- org.andromda.presentation.jsf2.PatternMatchingExceptionHandler.instance().handleException(throwable), null);
- this.addErrorMessage(message);
+ final String messageKey = ${managedBeansPackage}.${patternMatchingExceptionHandler}.instance().handleException(throwable);
+ if(!org.apache.commons.lang.StringUtils.isEmpty(messageKey))
+ this.addErrorMessage(${managedBeansPackage}.Messages.get(messageKey, null));
}
}
catch (final Throwable throwable)
{
+ throwable.printStackTrace();
this.addExceptionMessage(throwable);
}
return null;
@@ -372,20 +385,18 @@
);
form.${manageable.listSetterName}(list);
- if(org.apache.commons.collections.CollectionUtils.isEmpty(list)){
- this.addInfoMessage(org.andromda.presentation.jsf2.Messages.get("empty.result.set", null));
#if ($manageable.maximumListSize > 0)
- } else {
if (list.size() >= $manageable.maximumListSize)
saveMaxResultsWarning();
#end
- }
+#if (!$useAutocompleteLookup)
#if (!$manageable.manageableAssociationEnds.empty)
final java.util.Map backingLists = ${manageable.manageableServiceAccessorCall}.readBackingLists();
#foreach ($member in $manageable.manageableAssociationEnds)
form.${member.setterName}BackingList((java.util.Collection)backingLists.get("${member.name}"));
#end
+#end
#end
form.setEditState(false);
@@ -397,8 +408,8 @@
#else
#set($idParamClass = $manageable.manageableIdentifier.type.name)
#end
- public void delete(ActionEvent event){
- final org.andromda.presentation.jsf2.AdfFacesContextWrapper contextWrapper = new org.andromda.presentation.jsf2.AdfFacesContextWrapper();
+ public void delete(javax.faces.event.ActionEvent event){
+ final ${managedBeansPackage}.AdfFacesContextWrapper contextWrapper = new ${managedBeansPackage}.AdfFacesContextWrapper();
try
{
final ${manageable.formBeanType} form = this.getForm();
@@ -407,17 +418,18 @@
{
contextWrapper.getCurrentInstance().getPageFlowScope().put("form", form);
- this.doDelete(${idParamClass}.valueOf(((UIParameter)event.getComponent().findComponent("${manageable.manageableIdentifier.name}")).getValue().toString()),form);
+ this.doDelete(${idParamClass}.valueOf(((javax.faces.component.UIParameter)event.getComponent().findComponent("${manageable.manageableIdentifier.name}")).getValue().toString()),form);
}
catch (final Throwable throwable)
{
- final String message = org.andromda.presentation.jsf2.Messages.get(
- org.andromda.presentation.jsf2.PatternMatchingExceptionHandler.instance().handleException(throwable), null);
- this.addErrorMessage(message);
+ final String messageKey = ${managedBeansPackage}.${patternMatchingExceptionHandler}.instance().handleException(throwable);
+ if(!org.apache.commons.lang.StringUtils.isEmpty(messageKey))
+ this.addErrorMessage(${managedBeansPackage}.Messages.get(messageKey, null));
}
}
catch (final Throwable throwable)
{
+ throwable.printStackTrace();
this.addExceptionMessage(throwable);
}
}
@@ -431,10 +443,59 @@
#end
#if ($manageable.maximumListSize > 0)
private void saveMaxResultsWarning() {
- addWarningMessage(org.andromda.presentation.jsf2.Messages.get("maximum.results.fetched.warning", new Object[]{String.valueOf("${manageable.maximumListSize}")}));
+ addWarningMessage(${managedBeansPackage}.Messages.get("maximum.results.fetched.warning", new Object[]{String.valueOf("${manageable.maximumListSize}")}));
}
#end
+ public void fillAutocomplete(javax.faces.event.ActionEvent event){
+ final javax.faces.context.FacesContext facesContext = this.getContext();
+ final java.util.Map parameters = facesContext.getExternalContext().getRequestParameterMap();
+ final Object fieldValue = parameters.get(this.getParameterValue("searchFieldRequestParamName",event));
+ try{
+ final java.util.List list = ${manageable.manageableServiceAccessorCall}.read(
+#set ($comma = '')
+#foreach ($member in $manageable.manageableMembers)
+#if($member.name == $manageable.displayAttribute.name)
+#if($member.type.stringType)
+ ${comma}(String)fieldValue
+#else
+#if($member.type.primitive)
+ ${comma}(fieldValue==null) ? null : ${member.type.wrapperName}.valueOf(fieldValue.toString())
+#else
+ ${comma}(fieldValue==null) ? null : ${member.type.fullyQualifiedName}.valueOf(fieldValue.toString())
+#end
+#end
+#else
+ ${comma}null
+#end
+#set ($comma = ', ')
+#end
+ );
+ final javax.faces.el.ValueBinding vb = facesContext.getApplication().createValueBinding("#{autocompleteResult}");
+ vb.setValue(facesContext, list);
+ }
+ catch (final Throwable throwable)
+ {
+ throwable.printStackTrace();
+ this.addExceptionMessage(throwable);
+ }
+ }
+
+ public java.util.Collection<javax.faces.model.SelectItem> getAsSelectItems(){
+ final java.util.Collection<${manageable.valueObjectClassName}> vos;
+ try {
+ vos = ${manageable.manageableServiceAccessorCall}.readAll();
+ } catch (Exception e) {
+ e.printStackTrace();
+ this.addExceptionMessage(e);
+ return null;
+ }
+ final java.util.Collection<javax.faces.model.SelectItem> result=new java.util.ArrayList<javax.faces.model.SelectItem>(vos.size());
+ for(${manageable.valueObjectClassName} vo: vos){
+ result.add(new javax.faces.model.SelectItem(vo.${manageable.manageableIdentifier.getterName}(),org.apache.commons.lang.ObjectUtils.toString(vo.get$stringUtils.upperCamelCaseName($manageable.displayAttribute.name)())));
+ }
+ return result;
+ }
protected ${manageable.formBeanType} getForm()
{
@@ -442,6 +503,21 @@
}
/**
+ * Returns an javax.faces.event.ActionEvent parameter value, from its name
+ */
+ protected Object getParameterValue(String parameterName, javax.faces.event.ActionEvent event){
+ for(Object uiObject : event.getComponent().getChildren()){
+ if(uiObject instanceof javax.faces.component.UIParameter){
+ final javax.faces.component.UIParameter param = (javax.faces.component.UIParameter)uiObject;
+ if(param.getName().equals(parameterName)) {
+ return param.getValue();
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
* Gets the current faces context. This object is the point
* from which to retrieve any request, session, etc information.
*
@@ -507,7 +583,7 @@
*
* @param throwable the exception information to add.
*/
- private final void addExceptionMessage(
+ protected final void addExceptionMessage(
Throwable throwable)
{
String message = null;
1.3 +5 -15 cartridges/andromda-jsf2/src/main/resources/templates/jsf2/forms/crud/SearchForm.java.vsl
Index: SearchForm.java.vsl
===================================================================
RCS file: /cvsroot/andromdaplugins/cartridges/andromda-jsf2/src/main/resources/templates/jsf2/forms/crud/SearchForm.java.vsl,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -w -r1.2 -r1.3
--- SearchForm.java.vsl 18 Jan 2007 10:11:08 -0000 1.2
+++ SearchForm.java.vsl 2 Mar 2008 20:59:16 -0000 1.3
@@ -62,8 +62,12 @@
#end
#foreach ($member in $manageable.manageableSearchAssociationEnds)
-#set ($identifier = $member.type.manageableIdentifier)
#set ($fieldType = $member.manageableIdentifier.type.fullyQualifiedName)
+#if($member.type.hasStereotype("Manageable"))
+#set ($fieldType = $member.manageableIdentifier.type.fullyQualifiedName)
+#else
+#set ($fieldType = $member.type.identifiers.get(0).type.fullyQualifiedName)
+#end
#if ($member.many)
#set ($fieldType = "${fieldType}[]")
#end
@@ -89,20 +93,6 @@
public void set${backingListMethod}(java.util.Collection ${member.backingListName}){
this.${member.backingListName} = ${member.backingListName};
}
-
- private ${member.type.searchFormBeanType} ${member.name}SearchForm = null;##não pode inicializar direto senão dá loop
-
- $member.visibility ${member.type.searchFormBeanType} ${member.getterName}SearchForm()
- {
- if(this.${member.name}SearchForm == null)
- this.${member.name}SearchForm = new ${member.type.searchFormBeanType}();
- return this.${member.name}SearchForm;
- }
-
- $member.visibility void ${member.setterName}SearchForm(${member.type.searchFormBeanType} ${member.name}SearchForm)
- {
- this.${member.name}SearchForm = ${member.name}SearchForm;
- }
#end
/**
1.4 +5 -15 cartridges/andromda-jsf2/src/main/resources/templates/jsf2/forms/crud/Form.java.vsl
Index: Form.java.vsl
===================================================================
RCS file: /cvsroot/andromdaplugins/cartridges/andromda-jsf2/src/main/resources/templates/jsf2/forms/crud/Form.java.vsl,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -w -r1.3 -r1.4
--- Form.java.vsl 4 Mar 2007 16:06:54 -0000 1.3
+++ Form.java.vsl 2 Mar 2008 20:59:16 -0000 1.4
@@ -170,8 +170,11 @@
#end
#foreach ($member in $manageable.manageableAssociationEnds)
-#set ($identifier = $member.type.manageableIdentifier)
+#if($member.type.hasStereotype("Manageable"))
#set ($fieldType = $member.manageableIdentifier.type.fullyQualifiedName)
+#else
+#set ($fieldType = $member.type.identifiers.get(0).type.fullyQualifiedName)
+#end
#if ($member.many)
#set ($fieldType = "${fieldType}[]")
#end
@@ -198,19 +201,6 @@
this.${member.backingListName} = ${member.backingListName};
}
- private ${member.type.searchFormBeanType} ${member.name}SearchForm = null;##não pode inicializar direto senão dá loop
-
- $member.visibility ${member.type.searchFormBeanType} ${member.getterName}SearchForm()
- {
- if(this.${member.name}SearchForm == null)
- this.${member.name}SearchForm = new ${member.type.searchFormBeanType}();
- return this.${member.name}SearchForm;
- }
-
- $member.visibility void ${member.setterName}SearchForm(${member.type.searchFormBeanType} ${member.name}SearchForm)
- {
- this.${member.name}SearchForm = ${member.name}SearchForm;
- }
#end
/**
* Stores any date or time formatters for this form.
1.6 +7 -0 cartridges/andromda-jsf2/src/main/resources/META-INF/andromda/namespace.xml
Index: namespace.xml
===================================================================
RCS file: /cvsroot/andromdaplugins/cartridges/andromda-jsf2/src/main/resources/META-INF/andromda/namespace.xml,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -w -r1.5 -r1.6
--- namespace.xml 19 Jul 2007 17:31:43 -0000 1.5
+++ namespace.xml 2 Mar 2008 20:59:16 -0000 1.6
@@ -515,6 +515,13 @@
The name to give the pattern matching exception handler.
</documentation>
</property>
+ <property name="useAutocompleteLookup">
+ <default>false</default>
+ <documentation>
+ Use autocomplete instead of select, to select related entities.
+ Available only with Facelets.
+ </documentation>
+ </property>
</propertyGroup>
<propertyGroup name="Manageable Entities">
<documentation>
1.12 +26 -15 cartridges/andromda-jsf2/src/main/resources/META-INF/andromda/cartridge.xml
Index: cartridge.xml
===================================================================
RCS file: /cvsroot/andromdaplugins/cartridges/andromda-jsf2/src/main/resources/META-INF/andromda/cartridge.xml,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -w -r1.11 -r1.12
--- cartridge.xml 2 Nov 2007 18:13:33 -0000 1.11
+++ cartridge.xml 2 Mar 2008 20:59:17 -0000 1.12
@@ -67,6 +67,7 @@
<property reference="defaultTableExportTypes"/>
<property reference="manageableFormName"/>
<property reference="manageableFieldMaxLength"/>
+ <property reference="useAutocompleteLookup"/>
<property reference="manageableReferenceParameterPrefix"/>
<property reference="crudValueObjectSuffix"/>
@@ -83,6 +84,7 @@
<condition name="clientValidation">$clientValidation.equalsIgnoreCase("true")</condition>
<condition name="formSerialization">$formSerialization.equalsIgnoreCase("true")</condition>
<condition name="securityEnabled">$stringUtils.isNotBlank($securityRealm)</condition>
+ <condition name="useAutocompleteLookup">$useAutocompleteLookup.equalsIgnoreCase("true")</condition>
<!-- condition merge-point-->
@@ -137,20 +139,6 @@
overwrite="true"/>
<resource
- path="resources/WEB-INF/lib/*.jar"
- outputPattern="WEB-INF/lib/{0}"
- outlet="configuration"
- overwrite="true"
- lastModifiedCheck="true"/>
-
- <resource
- path="resources/lib/trinidad/*.jar"
- outputPattern="WEB-INF/lib/{0}"
- outlet="libraries"
- overwrite="true"
- lastModifiedCheck="true"/>
-
- <resource
path="resources/views/css/*"
outputPattern="css/{0}"
outlet="custom-resources"
@@ -491,7 +479,6 @@
path="templates/jsf2/utils/JsfUtils.java.vsl"
outputPattern="$stringUtils.replace($managedBeansPackage, '.', '/')/${className}.java"
outlet="managed-beans"
- outputCondition="formSerialization"
overwrite="true"/>
<template
@@ -607,6 +594,30 @@
outputCondition="viewTypeIsFacelets"/>
<template
+ path="templates/jsf2/views/facelets/components/autocomplete.xhtml.vsl"
+ outputPattern="WEB-INF/facelets/components/autocomplete.xhtml"
+ outlet="views"
+ overwrite="true"
+ generateEmptyFiles="true"
+ outputCondition="viewTypeIsFacelets"/>
+
+ <template
+ path="templates/jsf2/views/facelets/components/autocompleteMulti.xhtml.vsl"
+ outputPattern="WEB-INF/facelets/components/autocompleteMulti.xhtml"
+ outlet="views"
+ overwrite="true"
+ generateEmptyFiles="true"
+ outputCondition="viewTypeIsFacelets"/>
+
+ <template
+ path="templates/jsf2/views/facelets/jsf2.taglib.xml.vsl"
+ outputPattern="WEB-INF/jsf2.taglib.xml"
+ outlet="views"
+ overwrite="true"
+ generateEmptyFiles="true"
+ outputCondition="viewTypeIsFacelets"/>
+
+ <template
path="templates/jsf2/views/facelets/view.xhtml.vsl"
outputPattern="${view.path}.xhtml"
outlet="views"
1.1 cartridges/andromda-jsf2/src/main/resources/resources/views/skins/purple/images/autocomplete-button-action.gif
<<Binary file>>
1.1 cartridges/andromda-jsf2/src/main/resources/resources/views/skins/purple/images/autocomplete-button.gif
<<Binary file>>
1.3 +28 -0 cartridges/andromda-jsf2/src/main/resources/resources/views/skins/beach/beach.css
Index: beach.css
===================================================================
RCS file: /cvsroot/andromdaplugins/cartridges/andromda-jsf2/src/main/resources/resources/views/skins/beach/beach.css,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -w -r1.2 -r1.3
--- beach.css 19 Jul 2007 17:38:57 -0000 1.2
+++ beach.css 2 Mar 2008 20:59:17 -0000 1.3
@@ -450,3 +450,31 @@
{
margin: 25px;
}
\ No newline at end of file
+
+/** Autocomplete component **/
+
+/* autocomplete classes: should go to skin css in the future */
+.autocomplete-line {
+ background-color: #E0ECFF;
+ cursor:pointer;
+}
+
+.autocomplete-selected-line{
+ background-color: #C3D9FF;
+ cursor:pointer;
+}
+
+.autocomplete-button, .autocomplete-button-action{
+ border:0px;
+ width:22px;
+ height:17px;
+ background-color: transparent;
+ background-image:url(/skins/beach/images/autocomplete-button.gif);
+ background-position:top center;
+ background-repeat: no-repeat;
+ cursor:pointer;
+}
+
+.autocomplete-button-action{
+ background-image:url(/skins/beach/images/autocomplete-button-action.gif);
+}
\ No newline at end of file
1.2 +28 -0 cartridges/andromda-jsf2/src/main/resources/resources/views/skins/default/default.css
Index: default.css
===================================================================
RCS file: /cvsroot/andromdaplugins/cartridges/andromda-jsf2/src/main/resources/resources/views/skins/default/default.css,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -w -r1.1 -r1.2
--- default.css 5 Dec 2006 19:39:33 -0000 1.1
+++ default.css 2 Mar 2008 20:59:18 -0000 1.2
@@ -547,3 +547,31 @@
{
width: 100%;
}
\ No newline at end of file
+
+/** Autocomplete component **/
+
+/* autocomplete classes: should go to skin css in the future */
+.autocomplete-line {
+ background-color: #E0ECFF;
+ cursor:pointer;
+}
+
+.autocomplete-selected-line{
+ background-color: #C3D9FF;
+ cursor:pointer;
+}
+
+.autocomplete-button, .autocomplete-button-action{
+ border:0px;
+ width:22px;
+ height:17px;
+ background-color: transparent;
+ background-image:url(/skins/default/images/autocomplete-button.gif);
+ background-position:top center;
+ background-repeat: no-repeat;
+ cursor:pointer;
+}
+
+.autocomplete-button-action{
+ background-image:url(/skins/default/images/autocomplete-button-action.gif);
+}
\ No newline at end of file
1.1 cartridges/andromda-jsf2/src/main/resources/templates/jsf2/views/facelets/jsf2.taglib.xml.vsl
Index: jsf2.taglib.xml.vsl
===================================================================
<?xml version="1.0"?>
<!DOCTYPE facelet-taglib PUBLIC
"-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
"http://java.sun.com/dtd/web-facesconfig_1_0.dtd">
<facelet-taglib>
<namespace>http://www.andromda.org/cartridges/jsf2</namespace>
<tag>
<tag-name>autocomplete</tag-name>
<source>
facelets/components/autocomplete.xhtml
</source>
</tag>
<tag>
<tag-name>autocompleteMulti</tag-name>
<source>
facelets/components/autocompleteMulti.xhtml
</source>
</tag>
<function>
<function-name>valueFromConverter</function-name>
<function-class>${managedBeansPackage}.JsfUtils</function-class>
<function-signature>java.lang.String valueFromConverter(java.lang.Object, java.lang.String, java.lang.String)</function-signature>
</function>
<function>
<function-name>valueFromConverter</function-name>
<function-class>${managedBeansPackage}.JsfUtils</function-class>
<function-signature>java.lang.String valueFromConverter(java.lang.Object, java.lang.String)</function-signature>
</function>
</facelet-taglib>
1.2 +7 -1 plugins/.project
Index: .project
===================================================================
RCS file: /cvsroot/andromdaplugins/plugins/.project,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -w -r1.1 -r1.2
--- .project 19 Dec 2005 03:51:24 -0000 1.1
+++ .project 2 Mar 2008 20:59:18 -0000 1.2
@@ -1,11 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
- <name>plugins</name>
+ <name>andromda-plugins</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
+ <buildCommand>
+ <name>org.jboss.ide.eclipse.archives.core.archivesBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
</buildSpec>
<natures>
+ <nature>org.jboss.ide.eclipse.archives.core.archivesNature</nature>
</natures>
</projectDescription>
1.2 +12 -3 cartridges/andromda-jsf2/src/main/resources/templates/jsf2/converters/crud/EntityConverter.java.vsl
Index: EntityConverter.java.vsl
===================================================================
RCS file: /cvsroot/andromdaplugins/cartridges/andromda-jsf2/src/main/resources/templates/jsf2/converters/crud/EntityConverter.java.vsl,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -w -r1.1 -r1.2
--- EntityConverter.java.vsl 2 Nov 2007 18:13:31 -0000 1.1
+++ EntityConverter.java.vsl 2 Mar 2008 20:59:18 -0000 1.2
@@ -17,12 +17,21 @@
java.lang.Object value)
throws javax.faces.convert.ConverterException
{
+ if(value == null)
+ return "";
+
final ${manageable.valueObjectClassName} vo;
try {
- vo = ${manageable.manageableServiceAccessorCall}.readById((${manageable.manageableIdentifier.type.name})value);
+ final ${manageable.manageableIdentifier.type.name} id;
+ if(value instanceof String)
+ id = ${manageable.manageableIdentifier.type.name}.valueOf((String)value);
+ else
+ id = (${manageable.manageableIdentifier.type.name})value;
+
+ vo = ${manageable.manageableServiceAccessorCall}.readById(id);
} catch (Exception e) {
e.printStackTrace();
- return ("Id "+value+" not found.");
+ return ("Failed to locate object.");
}
#if($manageable.displayAttribute.type.stringType)
return vo.get$stringUtils.upperCamelCaseName($manageable.displayAttribute.name)();
@@ -40,6 +49,6 @@
java.lang.String value)
throws javax.faces.convert.ConverterException
{
- return null;
+ throw new UnsupportedOperationException();
}
}
1.1 cartridges/andromda-jsf2/src/main/resources/templates/jsf2/views/facelets/components/autocomplete.xhtml.vsl
Index: autocomplete.xhtml.vsl
===================================================================
<ui:component
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:tr="http://myfaces.apache.org/trinidad"
xmlns:trh="http://myfaces.apache.org/trinidad/html"
xmlns:c="http://java.sun.com/jstl/core"
xmlns:jsf2="http://www.andromda.org/cartridges/jsf2">
<c:set var="jsIdPrefix" value=""/>
<c:if test="#{not empty parentId}">
<c:set var="jsIdPrefix" value="#{parentId}:"/>
</c:if>
<c:set var="autocompleteSubformId" value="_#{id}_subformAutocomplete"/>
<c:set var="editId" value="edit"/>
<c:set var="jsEditId" value="#{jsIdPrefix}#{autocompleteSubformId}:#{editId}"/>
<c:set var="jsActionId" value="#{jsIdPrefix}#{autocompleteSubformId}:action"/>
<c:set var="jsTableId" value="#{jsIdPrefix}#{autocompleteSubformId}:table"/>
<c:set var="jsHiddenId" value="#{jsIdPrefix}#{id}"/>
<c:set var="timeoutVar" value="_#{parentId}_#{id}_timeout_"/>
<c:set var="lineArrayVar" value="_#{parentId}_#{id}_lineArray_"/>
<c:set var="selectedLineVar" value="_#{parentId}_#{id}_selectedLine_"/>
<c:set var="orgValue" value="_#{parentId}_#{id}_orgValue_"/>
<c:set var="orgEditValue" value="_#{parentId}_#{id}_orgEditValue_"/>
<c:set var="showResultTableFunc" value="_#{parentId}_#{id}_showResultTableFunc"/>
<c:set var="setValuesFromTableFunc" value="_#{parentId}_#{id}_setValuesFromTableFunc"/>
<c:set var="hideResultTableFunc" value="_#{parentId}_#{id}_hideResultTableFunc"/>
<c:set var="editKeydownFunc" value="_#{parentId}_#{id}_editKeydownFunc"/>
<c:set var="pprMonitorFunc" value="_#{parentId}_#{id}_pprMonitorFunc"/>
<c:set var="addPPRListenerFunc" value="_#{parentId}_#{id}_addPPRListenerFunc"/>
<c:set var="checkEmptyEditFunc" value="_#{parentId}_#{id}_checkEmptyEditFunc"/>
<tr:inputHidden id="#{id}" value="#{value}" required="#{required}" />
<tr:subform id="#{autocompleteSubformId}">
<trh:script type="text/javascript">
var #{timeoutVar}=null;
var #{lineArrayVar}=null;
var #{selectedLineVar}=null;
var #{orgValue}='';
var #{orgEditValue}='';
function #{showResultTableFunc}(ignoreEdit){
window.clearTimeout(#{timeoutVar});
var edit=document.getElementById('#{jsEditId}');
if(ignoreEdit || edit.value != ''){
#{selectedLineVar} = null;
#{lineArrayVar} = null;
var action=document.getElementById('#{jsActionId}')
action.click();
} else {
#{hideResultTableFunc}();
}
}
function #{pprMonitorFunc}(state)
{
var busy = state == TrRequestQueue.STATE_BUSY;
if(busy){
document.getElementById('#{jsActionId}').className = 'autocomplete-button-action';
} else {
document.getElementById('#{jsActionId}').className = 'autocomplete-button';
TrPage.getInstance().getRequestQueue().removeStateChangeListener(#{pprMonitorFunc});
var firstElement = document.getElementById('#{jsTableId}0');
if(firstElement){
var table = document.getElementById('#{jsTableId}');
var edit=document.getElementById('#{jsEditId}');
#{lineArrayVar} = table.getElementsByTagName('TD');
#{selectedLineVar} = 0;
firstElement.className='autocomplete-selected-line';
table.style.display="";
table.style.left = edit.style.left;
table.style.top = edit.style.top+edit.style.height;
table.style.width = edit.offsetWidth;
#{orgValue} = document.getElementById('#{jsHiddenId}').value;
#{orgEditValue} = edit.value;
edit.focus();
} else {
#{selectedLineVar} = null;
#{lineArrayVar} = null;
}
}
}
function #{addPPRListenerFunc}()
{
var requestQueue = TrPage.getInstance().getRequestQueue();
requestQueue.addStateChangeListener(#{pprMonitorFunc});
}
function #{setValuesFromTableFunc}(hiddenValue, editValue){
document.getElementById('#{jsEditId}').value=editValue; //the order matters
document.getElementById('#{jsHiddenId}').value=hiddenValue;
#{hideResultTableFunc}();
}
function #{hideResultTableFunc}(){
window.clearTimeout(#{timeoutVar});
#{timeoutVar}=null;
document.getElementById('#{jsTableId}').style.display='none';
#{selectedLineVar}=null;
#{lineArrayVar}=null;
}
function #{checkEmptyEditFunc}(){
var edit=document.getElementById('#{jsEditId}');
var hidden=document.getElementById('#{jsHiddenId}');
if(hidden.value == ''){
edit.value = '';
} else {
edit.value = edit.value.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); //trim
if(edit.value == ''){
hidden.value = '';
}
}
}
function #{editKeydownFunc}(event) {
window.clearTimeout(#{timeoutVar});
var _keyCode = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
if(#{selectedLineVar} == null){
if(_keyCode==40) { //down arrow
#{showResultTableFunc}(true);
} else {
#{timeoutVar}=window.setTimeout('#{showResultTableFunc}(false);',900);
}
} else {
if(_keyCode==38){//up arrow
if(#{selectedLineVar} > 0){
document.getElementById('#{jsTableId}'+#{selectedLineVar}).className='autocomplete-line';
--#{selectedLineVar};
document.getElementById('#{jsTableId}'+#{selectedLineVar}).className='autocomplete-selected-line';
}
}else if(_keyCode==40){//down arrow
if((#{lineArrayVar}.length - 1) > #{selectedLineVar}){
if(#{selectedLineVar} > -1)
document.getElementById('#{jsTableId}'+#{selectedLineVar}).className='autocomplete-line';
++#{selectedLineVar};
document.getElementById('#{jsTableId}'+#{selectedLineVar}).className='autocomplete-selected-line';
}
}else if(_keyCode==27){ //esc
#{setValuesFromTableFunc}(#{orgValue}, #{orgEditValue});
return false;
}else if(_keyCode==13){ //enter
document.getElementById('#{jsTableId}'+#{selectedLineVar}).onclick();
return false;
}else if(_keyCode==9){ //tab
document.getElementById('#{jsTableId}'+#{selectedLineVar}).onclick();
} else {
#{timeoutVar}=window.setTimeout('#{showResultTableFunc}(false);',900);
}
}
return true;
}
</trh:script>
<h:inputText id="#{editId}" autocomplete="off" required="#{required}"
readOnly="#{readOnly}"
ondblclick="document.getElementById('#{jsActionId}').click(); return false;"
onkeydown="return #{editKeydownFunc}(event);"
onchange="document.getElementById('#{jsHiddenId}').value=''; return true;"
onblur="window.clearTimeout(#{timeoutVar}); #{checkEmptyEditFunc}(); #{timeoutVar}=window.setTimeout('#{hideResultTableFunc}();',100);"
value="#{empty value ? '' : jsf2:valueFromConverter(value,itemConverterId)}"/>
<tr:commandButton id="action" styleClass="autocomplete-button" actionListener="#{locateBackingBean[locateActionListenerName]}"
partialSubmit="true" text="" immediate="true" onclick="#{addPPRListenerFunc}(); return true;">
<f:param name="searchFieldRequestParamName" value="#{jsEditId}"/>
</tr:commandButton>
<tr:table inlineStyle="position:absolute; z-index:100; #{empty autocompleteResult ? 'display:none': ''}"
id="table" var="row" value="#{autocompleteResult}" rows="20" width="100%" partialTriggers="action" varStatus="status">
<tr:column>
<div id="#{jsTableId}#{status.index}" class="autocomplete-line" onmouseover="this.className='autocomplete-selected-line';"
onmouseout="this.className = 'autocomplete-line';" onclick="#{setValuesFromTableFunc}('#{row[locateValueFieldName]}','#{row[locateVisibleFieldName]}');" >
<c:if test="#{not empty locateVisibleFieldName}">
<h:outputText value="#{row[locateVisibleFieldName]}"/>
</c:if>
<c:if test="#{empty locateVisibleFieldName}">
<h:outputText value="#{row[locateValueFieldName]}" converter="#{itemConverterId}"/>
</c:if>
</div>
</tr:column>
</tr:table>
</tr:subform>
</ui:component>
1.1 cartridges/andromda-jsf2/src/main/resources/templates/jsf2/views/facelets/components/autocompleteMulti.xhtml.vsl
Index: autocompleteMulti.xhtml.vsl
===================================================================
<ui:component xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:tr="http://myfaces.apache.org/trinidad"
xmlns:trh="http://myfaces.apache.org/trinidad/html" xmlns:c="http://java.sun.com/jstl/core"
xmlns:jsf2="http://www.andromda.org/cartridges/jsf2">
<c:set var="jsIdPrefix" value="" />
<c:if test="#{not empty parentId}">
<c:set var="jsIdPrefix" value="#{parentId}:" />
</c:if>
<c:set var="autocompleteSubformId" value="_#{id}_subformAutocomplete" />
<c:set var="hiddenId" value="hidden" />
<c:set var="editId" value="edit" />
<c:set var="jsEditId" value="#{jsIdPrefix}#{autocompleteSubformId}:#{editId}" />
<c:set var="jsHiddenId" value="#{jsIdPrefix}#{autocompleteSubformId}:#{hiddenId}" />
<c:set var="jsActionId" value="#{jsIdPrefix}#{autocompleteSubformId}:action" />
<c:set var="jsTableId" value="#{jsIdPrefix}#{autocompleteSubformId}:table" />
<c:set var="jsVisibleListId" value="#{jsIdPrefix}#{autocompleteSubformId}:visibleList" />
<c:set var="jsHiddenListId" value="#{jsIdPrefix}#{id}" />
<c:set var="timeoutName" value="_#{parentId}_#{id}_timeout_" />
<c:set var="lineArrayName" value="_#{parentId}_#{id}_lineArray_" />
<c:set var="selectedLineName" value="_#{parentId}_#{id}_selectedLine_" />
<c:set var="orgValue" value="_#{parentId}_#{id}_orgValue_" />
<c:set var="orgEditValue" value="_#{parentId}_#{id}_orgEditValue_" />
<c:set var="showResultTable" value="_#{parentId}_#{id}_showResultTable" />
<c:set var="setValuesFromTable" value="_#{parentId}_#{id}_setValuesFromTable" />
<c:set var="hideResultTable" value="_#{parentId}_#{id}_hideResultTable" />
<c:set var="editKeydown" value="_#{parentId}_#{id}_editKeydown" />
<c:set var="pprMonitor" value="_#{parentId}_#{id}_pprMonitor" />
<c:set var="addPPRListener" value="_#{parentId}_#{id}_addPPRListener" />
<c:set var="checkEmptyEdit" value="_#{parentId}_#{id}_checkEmptyEdit" />
<c:set var="addActionClick" value="_#{parentId}_#{id}_addActionClick" />
<c:set var="removeActionClick" value="_#{parentId}_#{id}_removeActionClick" />
<c:set var="addValueToLists" value="_#{parentId}_#{id}_addValueToLists" />
<tr:selectManyListbox inlineStyle="display:none" id="#{id}" value="#{value}" required="#{required}" simple="true" valuePassThru="true">
<c:forEach var="item" items="#{value}">
<tr:selectItem value="#{item}" />
</c:forEach>
</tr:selectManyListbox>
<tr:subform id="#{autocompleteSubformId}">
<trh:script type="text/javascript">
var #{timeoutName}=null;
var #{lineArrayName}=null;
var #{selectedLineName}=null;
var #{orgValue}='';
var #{orgEditValue}='';
function #{showResultTable}(ignoreEdit){
window.clearTimeout(#{timeoutName});
var edit=document.getElementById('#{jsEditId}');
if(ignoreEdit || edit.value != ''){
#{selectedLineName} = null;
#{lineArrayName} = null;
var action=document.getElementById('#{jsActionId}')
action.click();
} else {
#{hideResultTable}();
}
}
function #{pprMonitor}(state)
{
var busy = state == TrRequestQueue.STATE_BUSY;
if(busy){
document.getElementById('#{jsActionId}').className = 'autocomplete-button-action';
} else {
document.getElementById('#{jsActionId}').className = 'autocomplete-button';
TrPage.getInstance().getRequestQueue().removeStateChangeListener(#{pprMonitor});
var firstElement = document.getElementById('#{jsTableId}0');
if(firstElement){
var table = document.getElementById('#{jsTableId}');
var edit=document.getElementById('#{jsEditId}');
#{lineArrayName} = table.getElementsByTagName('TD');
#{selectedLineName} = 0;
firstElement.className='autocomplete-selected-line';
table.style.display="";
table.style.left = edit.style.left;
table.style.top = edit.style.top+edit.style.height;
table.style.width = edit.offsetWidth;
#{orgValue} = document.getElementById('#{jsHiddenId}').value;
#{orgEditValue} = edit.value;
edit.focus();
} else {
#{selectedLineName} = null;
#{lineArrayName} = null;
}
}
}
function #{addPPRListener}()
{
var requestQueue = TrPage.getInstance().getRequestQueue();
requestQueue.addStateChangeListener(#{pprMonitor});
}
function #{setValuesFromTable}(hiddenValue, editValue){
document.getElementById('#{jsEditId}').value=editValue; //the order matters
document.getElementById('#{jsHiddenId}').value=hiddenValue;
#{hideResultTable}();
}
function #{hideResultTable}(){
window.clearTimeout(#{timeoutName});
#{timeoutName}=null;
document.getElementById('#{jsTableId}').style.display='none';
#{selectedLineName}=null;
#{lineArrayName}=null;
}
function #{checkEmptyEdit}(){
var edit=document.getElementById('#{jsEditId}');
var hidden=document.getElementById('#{jsHiddenId}');
if(hidden.value == ''){
edit.value = '';
} else {
edit.value = edit.value.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); //trim
if(edit.value == ''){
hidden.value = '';
}
}
}
function #{editKeydown}(event) {
window.clearTimeout(#{timeoutName});
var _keyCode = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
if(#{selectedLineName} == null){
if(_keyCode==40) { //down arrow
#{showResultTable}(true);
} else {
#{timeoutName}=window.setTimeout('#{showResultTable}(false);',900);
}
} else {
if(_keyCode==38){//up arrow
if(#{selectedLineName} > 0){
document.getElementById('#{jsTableId}'+#{selectedLineName}).className='autocomplete-line';
--#{selectedLineName};
document.getElementById('#{jsTableId}'+#{selectedLineName}).className='autocomplete-selected-line';
}
}else if(_keyCode==40){//down arrow
if((#{lineArrayName}.length - 1) > #{selectedLineName}){
if(#{selectedLineName} > -1)
document.getElementById('#{jsTableId}'+#{selectedLineName}).className='autocomplete-line';
++#{selectedLineName};
document.getElementById('#{jsTableId}'+#{selectedLineName}).className='autocomplete-selected-line';
}
}else if(_keyCode==27){ //esc
#{setValuesFromTable}(#{orgValue}, #{orgEditValue});
return false;
}else if(_keyCode==13){ //enter
document.getElementById('#{jsTableId}'+#{selectedLineName}).onclick();
return false;
}else if(_keyCode==9){ //tab
document.getElementById('#{jsTableId}'+#{selectedLineName}).onclick();
} else {
#{timeoutName}=window.setTimeout('#{showResultTable}(false);',900);
}
}
return true;
}
function #{addValueToLists}(value, label){
var hiddenList = document.getElementById('#{jsHiddenListId}');
hiddenList[hiddenList.options.length]=new Option(label, value, true,true);
var visibleList = document.getElementById('#{jsVisibleListId}');
visibleList[visibleList.options.length]=new Option(label, value, false,false);
}
function #{addActionClick}(){
var hiddenValue = document.getElementById('#{jsHiddenId}').value;
if(hiddenValue != ''){
#{addValueToLists}(hiddenValue, document.getElementById('#{jsEditId}').value);
#{setValuesFromTable}('', '')
}
}
function #{removeActionClick} (){
var hiddenList = document.getElementById('#{jsHiddenListId}');
var visibleList = document.getElementById('#{jsVisibleListId}');
for (var i = visibleList.length - 1; i>=0; i--) {
if (visibleList.options[i].selected) {
visibleList.remove(i);
hiddenList.remove(i);
}
}
}
<...
[truncated message content] |