Especificamente para completar as opções de um text o NEO não possui nada pronto. Mas nas chamadas AJAX ele possui uma tag que pode ser útil, a ajax:call. Utilizada em conjunto com View.getCurrent().
O código especifico para fazer o 'code completion' pode ser encontrado facilmente na internet, aí é só integrar com a seguinte solução.
Controller
Code:
package org.neoframework.teste;
import java.util.ArrayList;
import java.util.List;
import org.springframework.web.servlet.ModelAndView;
import br.com.linkcom.neo.controller.Controller;
import br.com.linkcom.neo.controller.DefaultAction;
import br.com.linkcom.neo.controller.MultiActionController;
import br.com.linkcom.neo.core.web.WebRequestContext;
import br.com.linkcom.neo.view.ajax.View;
@Controller(path="/modulo/CodeComplete")
public class CodeCompleteController extends MultiActionController{
@DefaultAction
public ModelAndView pagina(WebRequestContext request, Filtro filtro){
return new ModelAndView("pagina", "filtro", filtro);
}
public void ajaxCodeComplete(WebRequestContext request, Filtro filtro){
//aqui ficaria o código que monta as opções
//o código a seguir é ficticio apenas para devolver algo para o cliente
String nome = filtro.getNome();
List<String> opcoes = new ArrayList<String>();
opcoes.add(nome + ((char)(Math.random()*30+65)));
opcoes.add(nome + ((char)(Math.random()*30+65)));
opcoes.add(nome + ((char)(Math.random()*30+65)));
opcoes.add(nome + ((char)(Math.random()*30+65)));
View view = View.getCurrent(); // a variável view provê funcionalidades para lidar com Ajax
for (String string : opcoes) {
view.println(string);
view.println("<BR>");//o println do view será enviada para a variável data lá no JSP
}
}
}
Filtro
Code:
package org.neoframework.teste;
public class Filtro {
String nome;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
}
JSP
Code:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="n" uri="neo"%>
<%@ taglib prefix="t" uri="template"%>
<%@ taglib prefix="ajax" uri="ajax"%>
<n:bean name="filtro">
<t:property name="nome" mode="input" onkeypress="codeComplete(this.value)"/>
<div id="propostas">
</div>
</n:bean>
<ajax:call
functionName="codeComplete(string)"
action="ajaxCodeComplete"
callback="function(data){montarPropostas(data);}"
parameters="javascript:'nome='+string"
/>
<%-- functionName: Nome da função Javascript que será criada, recebe um parâmetro --%>
<%-- action: Nome da action (no controller) para onde deve ser enviada a requisição --%>
<%-- callback: Indica o que deve ser feito com o resultado, a varável data é o que o servidor devolveu --%>
<%--
parameters: Indica quais parametros devem ser enviados na requisição, o javascript: indica que estamos colocando código javascript e não texto puro
'nome='+string Estamos montando os parâmetro como é monta a URL. Estamos concatenando nome= com o conteúdo da variável string.
string é o nome do parâmetro recebido no método (indicado em functionName)
--%>
<script type="text/javascript">
function montarPropostas(data){
document.getElementById('propostas').innerHTML = data;
//aqui seria montada a funcionalidade javascript para as opções enviadas pelo servidor
}
</script>
Qualquer dúvida pode perguntar.. flw