Problema Richfaces TabPanel dinamica

0 respostas
Cherubini

Oi pessoal,

Estou tentando criar uma pagina com rich:tappanel dinamica, porem até agora sem sucesso.

Ao clicar no menu ele deve criar uma tab no meu panelgrid,mais as vezes cria, as vezes some, não esta funcionando.

Será que alguem tem alguma dica ?

Segue codigo JAVA TAB:

public class TabControle {

	private HtmlPanelGrid panelGrid;
	private HtmlTabPanel tabPanel;
	private String DYN_TAB_PANEL = "dynTabPanel";
	private Map<String, HtmlTab> mapaTabs = new HashMap<String, HtmlTab>();

	//Teste
	private static int count;
	private String nomeTab;
	
	public String getNomeTab() {
		return nomeTab;
	}

	public void setNomeTab(String nomeTab) {
		this.nomeTab = nomeTab;
	}

	public HtmlPanelGrid getPanelGrid() {

		// Cria Panel Grid
		panelGrid = (HtmlPanelGrid) FacesContext.getCurrentInstance()
				.getApplication().createComponent(HtmlPanelGrid.COMPONENT_TYPE);
		panelGrid.setStyle("width:100%;height:100%");

		// Criação da Tab Home
		HtmlTab tabHome;
		tabHome = (HtmlTab) FacesContext.getCurrentInstance().getApplication()
				.createComponent(HtmlTab.COMPONENT_TYPE);
		tabHome.setLabel("Home");
		tabHome.setId("IdHome");

		// Criação do Tab Panel
		tabPanel = (HtmlTabPanel) FacesContext.getCurrentInstance()
				.getApplication().createComponent(HtmlTabPanel.COMPONENT_TYPE);
		tabPanel.setSwitchType("ajax");
		tabPanel.setId(DYN_TAB_PANEL);
		tabPanel.getChildren().clear();

		// Adiciona Tab Home
		tabPanel.getChildren().clear();
		tabPanel.getChildren().add(tabHome);

		// Adiciona o Tab Panel
		panelGrid.getChildren().clear();
		panelGrid.getChildren().add(tabPanel);

		// Limpa HashMap das Tabs
		mapaTabs.clear();

		return panelGrid;
	}

	public void setPanelGrid(HtmlPanelGrid panelGrid) {
		this.panelGrid = panelGrid;
	}

	public void deleteTab(ActionEvent event) {

		// Recebe Id da Tab que será deletada
		String tabId = FacesContext.getCurrentInstance().getExternalContext()
				.getRequestParameterMap().get("tabToDelete");

		// Busca Tab no HashMap com o Id recebido
		HtmlTab tabDel = mapaTabs.get(tabId);

		// Se a Tab existir, exclui do Tab Panel e do HashMap
		if (tabDel != null) {
			tabPanel.getChildren().remove(tabDel);
			panelGrid.getChildren().clear();
			panelGrid.getChildren().add(tabPanel);

			mapaTabs.remove(tabId);
		}
	}

	public void addTabTeste(ActionEvent event) {

		HtmlTab htmlTab = new HtmlTab();
		
		count++;
		htmlTab.setLabel(nomeTab);
		htmlTab.setId("A".concat(count + ""));
		htmlTab.setValue("A".concat(count + ""));

		tabPanel.getChildren().add(htmlTab);
		panelGrid.getChildren().clear();
		panelGrid.getChildren().add(tabPanel);

	}

	public void addTab(ActionEvent event) {

		// Recebe Id da Tab que será adicionada
		String tabId = FacesContext.getCurrentInstance().getExternalContext()
				.getRequestParameterMap().get("tabToAdd");

		// Verifica se a Tab já foi adicionada ao panel
		HtmlTab tabAdd = mapaTabs.get(tabId);

		// Se tab não foi criada
		if (tabAdd == null) {

			// Cria nova Tab
			HtmlTab htmlTab = (HtmlTab) FacesContext.getCurrentInstance()
					.getApplication().createComponent(HtmlTab.COMPONENT_TYPE);

			htmlTab.setLabel(tabId);
			htmlTab.setId(tabId);
			htmlTab.setValue(tabId);

			// Cria Panel Group, para adicionar o Label da Tab e o Icone de fechar
			HtmlPanelGroup panelGroup = (HtmlPanelGroup) FacesContext
					.getCurrentInstance().getApplication()
					.createComponent(HtmlPanelGroup.COMPONENT_TYPE);
			
			panelGroup.setId("PanelGrp" + tabId);

			//Label da Tab
			HtmlOutputText label = new HtmlOutputText();
			label.setValue(htmlTab.getLabel());
			
			//Imagem de Fechar Tab
			HtmlGraphicImage pic = new HtmlGraphicImage();
			pic.setValue("/images/icons/close.png");
			pic.setOnclick("deleteTab('" + htmlTab.getId()
					+ "');Event.stop(event);");
			pic.setStyleClass("hidelink");
			
			//Adiciona Label e Imagem
			panelGroup.getChildren().add(label);
			panelGroup.getChildren().add(pic);

			//Adiciona Panel Group no Facet da Tab 
			htmlTab.getFacets().put("label", panelGroup);

			//Adiciona Tab no TabPanel
			tabPanel.getChildren().add(htmlTab);
			
			//Atualiza o PanelGrid
			//panelGrid.getChildren().clear();
			panelGrid.getChildren().add(tabPanel);

			//Adiciona a Tab no HashMap
			mapaTabs.put(htmlTab.getId(), htmlTab);
			
		} 		
		
	}

}

Segue codigo Menu:

public HtmlToolBar criarMenu() {

		// Lista de Menus
		List<ItemMenu> itens = getItens();

		if (itens == null || itens.isEmpty()) {
			return menuBar;
		}

		Map<Long, Map<Long, ItemMenu>> menuTotal = new HashMap<Long, Map<Long, ItemMenu>>();

		for (ItemMenu item : itens) {
			Long idPai = item.getMenuSuperior() == null ? 0L : item
					.getMenuSuperior().getIdMenu();

			if (!menuTotal.containsKey(idPai)) {
				menuTotal.put(idPai, new HashMap<Long, ItemMenu>());
			}
			menuTotal.get(idPai).put(item.getIdMenu(), item);
		}

		return (HtmlToolBar) montarMenuBar(menuTotal, menuBar, 0L);
	}

	public UIComponent montarMenuBar(Map<Long, Map<Long, ItemMenu>> menuTotal,
			UIComponent pai, Long keyPai) {

		UIComponent novoPai = null;

		Iterator<Long> it = menuTotal.get(keyPai).keySet().iterator();

		while (it.hasNext()) {

			Long keyFilho = it.next();
			ItemMenu item = menuTotal.get(keyPai).get(keyFilho);

			// Se o Item não possuir MenuSuperior, cria HtmlDropDownMenu
			if (item.getMenuSuperior() == null) {
				HtmlDropDownMenu menuDD = new HtmlDropDownMenu();
				menuDD = new HtmlDropDownMenu();
				menuDD.setValue(item.getNomeMenu());
				menuDD.setId("Menu" + item.getIdMenu());

				// Se possuir Link, cria evento
				//if (item.hasLink()) {
					//menuDD.setOnexpand("addTab('" + item.getIdMenu()
					//		+ "');Event.stop(event);");
				//}

				pai.getChildren().add(menuDD);
				novoPai = menuDD;
			}
			// Se o Item possuir sub-menus, cria HtmlMenuGroup
			else if (menuTotal.containsKey(keyFilho)) {
				HtmlMenuGroup menuGrp = new HtmlMenuGroup();
				menuGrp.setValue(item.getNomeMenu());
				menuGrp.setId("Menu" + item.getIdMenu());

				pai.getChildren().add(menuGrp);
				novoPai = menuGrp;
			}
			// Senão, cria HtmlMenuItem
			else {
				HtmlMenuItem menuItem = new HtmlMenuItem();
				menuItem.setValue(item.getNomeMenu());
				menuItem.setId("Menu" + item.getIdMenu());

				// Se possuir Link, cria evento
				if (!item.hasLink()) {
					//menuItem.setOnselect("addTab('Id" + item.getIdMenu()
					//		+ "');Event.stop(event);");
					
					menuItem.setOnselect("addTabTeste();Event.stop(event);");
				}

				pai.getChildren().add(menuItem);
				novoPai = menuItem;
			}

			// Cria os sub-menus para os itens HtmlDropDownMenu ou HtmlMenuGroup
			if (menuTotal.containsKey(keyFilho)) {
				montarMenuBar(menuTotal, novoPai, keyFilho);
			}
		}

		return pai;
	}

Segue view:

<h:panelGrid id="tabs" binding="#{tabControle.panelGrid}" />

<a4j:jsFunction id="deleteFunc" reRender="tabs" name="deleteTab"
	actionListener="#{tabControle.deleteTab}">
	<f:param name="tabToDelete" />
</a4j:jsFunction>

<a4j:jsFunction id="addFunc" reRender="tabs" name="addTab"
	actionListener="#{tabControle.addTab}">
	<f:param name="tabToAdd" />
</a4j:jsFunction>

Fico no aguardo e obrigado.

Criado 23 de setembro de 2011
Respostas 0
Participantes 1