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] |