Ei kranio,
Acredita que estou em uma situação muito parecida?
Eu consegui implementar de uma maneira, mas ainda há empecilhos e aproveito o espaço para buscar uma solução.
No caso, eu inclui a página de busca como um IFRAME dentro do ModalPanel. Ficou assim (na página de cadastro - CidadeEdit.xhtml):
<div class="actionButtons">
<h:form id="formSelecionar">
<input onclick="Richfaces.showModalPanel('panelUF', {width:'785px', height:'525px'});" value="#{messages.selecionar}" type="button" />
</h:form>
<a:form>
<rich:modalPanel id="panelUF" >
<f:facet name="header">
<h:outputText value="#{messages.selecionar} #{messages.uf}" />
</f:facet>
<f:facet name="controls">
<h:graphicImage value="/img/close.png" style="cursor:pointer" onclick="Richfaces.hideModalPanel('panelUF')" />
</f:facet>
<iframe src="UFSelect.xhtml" width="760" height="480"></iframe>
</rich:modalPanel>
</a:form>
</div>
Nesta janela que abre, que possibilita a seleção de uma UF para esta cidade, tem uma busca paginada que possibilita o usuário selecionar uma UF. Ao pressionar o botão de selecionar, o objeto selecionado é armazenado no contexto da sessão e a janela é fechada, e a janela anterior é postada. Aí, meu backing bean JSF obtém este objeto selecionado diretamente do contexto da sessão e armazena nele mesmo.
A janela de busca possui, para cada objeto que aparece como resultado da busca, um botão para selecioná-lo:
<h:commandButton action="#{ufListController.selecionar(_uf.id)}" value="#{messages.selecionar}" style="margin:0px;" />
Quando a janela de busca seleciona um objeto, ela posta o form, armazena este objeto no contexto da sessão e seta uma flag selecionado = true, e desta maneira eu coloquei o seguinte código no início da página de busca:
<h:outputText rendered="#{ufListController.selecionado == true}">
<script type="text/javascript" >
parent.document.getElementById('formCidade:save').click();
parent.Richfaces.hideModalPanel('panelUF');
</script>
</h:outputText>
Portanto, após postar o form, a página é recarregada, aí ela cai na condição acima e é fechada automaticamente e, neste momento, a janela de cadastro tem seu form postado, acessando o método que obtém o objeto selecionado do contexto da sessão.
Pode não ter ficado lindo mas aqui funcionou. Se alguém tiver uma sugestão melhor ou crítica, por favor estou a ouvidos, pois não estou certo que esta solução é boa o suficiente.
Meu problema agora é o seguinte: Em outra janela de cadastro, eu quero em um ModalPanel inserir uma outra janela de cadastro.
No caso é o cadastro de Usuario, que dentro dele quero chamar o cadastro de Email.
O que acontece é que tenho uma superclasse de backing beans controladores de edição (cadastros), que possui métodos gerais úteis para todos.
Tanto o backing bean de cadastro de Usuario quanto o de Email herdam desta superclasse.
Então, quando eu carrego a janela de cadastro de Usuario (que carrega o backing bean de cadastro de Usuario), ela carrega dentro dela o cadastro de Email (que carrega o backing bean de cadastro de Email), e o problema que dá é que depois de postar, o sistema entende que o backing bean de Usuario agora é o de Email!
Ou seja, quando eu faço assim: #{usuarioEditController.bean.pessoaFisica.cpf}
Ele dá exceção dizendo que Email não tem o atributo pessoaFisica.
E olhe que tanto usuarioEditController (o backing bean de cadastro de Usuario) quanto emailEditController (o backing bean de cadastro de Email) estão corretamente configurados no faces-config.xml.
Então eu pergunto: qual é o principal problema? É um problema de design? Sou iniciante e por isso desconfio que o design arquitetural que fiz, visando reutilização, ficou problemático.
Não devo utilizar superclasse de backing beans? Ou algo assim?