/* Copyright 2012-2017 Jose Robson Mariano Alves This file is part of bgfinancas. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This package is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ package badernageral.bgfinancas.biblioteca.ajuda; import badernageral.bgfinancas.biblioteca.sistema.Janela; import badernageral.bgfinancas.biblioteca.sistema.Kernel; import badernageral.bgfinancas.biblioteca.tipo.Duracao; import badernageral.bgfinancas.biblioteca.tipo.Posicao; import badernageral.bgfinancas.biblioteca.tipo.Status; import badernageral.bgfinancas.biblioteca.utilitario.Animacao; import badernageral.bgfinancas.idioma.Linguagem; import badernageral.bgfinancas.template.barra.BarraPadrao; import badernageral.bgfinancas.template.cena.CenaItem; import badernageral.bgfinancas.template.cena.CenaMovimento; import badernageral.bgfinancas.template.cena.CenaPadrao; import com.sun.javafx.tk.FontMetrics; import com.sun.javafx.tk.Toolkit; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import javafx.geometry.Point2D; import javafx.scene.Node; import javafx.scene.Scene; import javafx.scene.control.Control; import javafx.scene.control.Label; import javafx.scene.control.ProgressIndicator; import javafx.scene.control.Tooltip; import javafx.scene.text.Font; import javafx.stage.Window; public final class Ajuda { private static final Ajuda instance = new Ajuda(); private final List<Node> objetos = new ArrayList<>(); private final List<Capitulo> capitulos = new ArrayList<>(); private final Tooltip mensagem = new Tooltip(); private int capituloAtual = -1; private ProgressIndicator progresso; private final Font fonte = Font.loadFont(getClass().getResource("/badernageral/bgfinancas/recursos/fonte/Ubuntu-L.ttf").toExternalForm(), 14); private Ajuda(){ mensagem.getStyleClass().add("mensagemAjuda"); mensagem.setWrapText(true); } public void setBotaoProgresso(ProgressIndicator progresso){ this.progresso = progresso; } public void setObjetos(Node... nodes){ objetos.addAll(Arrays.asList(nodes)); } public void setObjetos(BarraPadrao barra, Node... nodes){ objetos.addAll(Arrays.asList( barra.getBotaoVoltar(), barra.getLabelTitulo(), barra.getBotaoCadastrar(), barra.getBotaoAlterar(), barra.getBotaoExcluir(), barra.getFiltro() )); objetos.addAll(Arrays.asList(nodes)); } public void setObjetos(CenaPadrao cena, Node tabela){ objetos.addAll(Arrays.asList( cena.getBotaoVoltar(), cena.getLabelTitulo(), cena.getBotaoCadastrar(), cena.getBotaoAlterar(), cena.getBotaoExcluir(), cena.getFiltro(), tabela )); } public void setObjetos(CenaItem cena, Node tabela){ objetos.addAll(Arrays.asList( cena.getBotaoVoltar(), cena.getLabelTitulo(), cena.getBotaoCadastrar(), cena.getBotaoAlterar(), cena.getBotaoExcluir(), cena.getLabelCategoria(), cena.getChoiceCategoria(), cena.getBotaoGerenciarCategoria(), cena.getFiltro(), tabela )); } public void setObjetos(CenaMovimento cena, Node... nodes){ objetos.addAll(Arrays.asList( cena.getBotaoVoltar(), cena.getLabelTitulo(), cena.getBotaoCadastrar(), cena.getBotaoAlterar(), cena.getBotaoExcluir(), cena.getLabelCategoria(), cena.getChoiceCategoria(), cena.getLabelItem(), cena.getBotaoGerenciarItem(), cena.getBotaoGerenciarCategoria(), cena.getFiltro(), cena.getGridPaneContas() )); objetos.addAll(Arrays.asList(nodes)); } public void capitulo(Posicao posicao, String mensagem){ capitulos.add(new Capitulo(posicao, mensagem)); } public void capitulo(Node node, Posicao posicao, String mensagem){ capitulos.add(new Capitulo(node, posicao, mensagem)); } public void capitulo(List<Node> nodes, Posicao posicao, String mensagem){ capitulos.add(new Capitulo(nodes, posicao, mensagem)); } public void apresentarProximo(){ capituloAtual++; apresentar(); } public void apresentarAnterior(){ capituloAtual--; apresentar(); } private void updateProgresso(){ if(progresso != null){ double porcentagem; int qtd = capitulos.size(); if(capituloAtual==(qtd-1)){ porcentagem = 100; }else{ porcentagem = (100/qtd)*(capituloAtual+1); } progresso.setProgress(porcentagem/100); } } private void apresentar(){ try{ updateProgresso(); Capitulo c = capitulos.get(capituloAtual); Animacao.fadeOutMultiplo(objetos.stream().filter(n -> !n.equals(c.getNode())).collect(Collectors.toList())); Scene cena; Window janela; double largura, x, y; if(c.getNode()!=null){ Animacao.fadeInMultiplo(Arrays.asList(c.getNode())); cena = c.getNode().getScene(); janela = c.getNode().getScene().getWindow(); Point2D coordenada = c.getNode().localToScene(0.0, 0.0); x = coordenada.getX() + cena.getX() + janela.getX(); y = coordenada.getY() + cena.getY() + janela.getY(); largura = c.getNode().getBoundsInLocal().getWidth(); largura = (largura<350) ? 350 : largura; if(c.getPosicao()==Posicao.BAIXO){ y += c.getNode().getBoundsInLocal().getHeight()+8; }else if(c.getPosicao()==Posicao.TOPO){ FontMetrics fm = Toolkit.getToolkit().getFontLoader().getFontMetrics(fonte); double linhas = fm.computeStringWidth(c.getMensagem())/largura; y -= ((Math.ceil(linhas)*15)+30); }else{ // CENTRO double centroX = c.getNode().getBoundsInLocal().getWidth()/2; double centroY = c.getNode().getBoundsInLocal().getHeight()/2; largura = 400; x = (x + centroX) - (largura/2); y = y + centroY; } }else{ if(c.getNodes()!=null){ Animacao.fadeInMultiplo(c.getNodes()); } Node node = Kernel.layoutCentro; janela = node.getScene().getWindow(); cena = node.getScene(); if(c.getPosicao()==Posicao.TOPO){ largura = node.getBoundsInLocal().getWidth(); Point2D coordenada = node.localToScene(0.0, 0.0); x = coordenada.getX() + cena.getX() + janela.getX(); y = coordenada.getY() + cena.getY() + janela.getY(); }else if(c.getPosicao()==Posicao.BAIXO){ largura = node.getBoundsInLocal().getWidth(); Point2D coordenada = node.localToScene(0.0, 0.0); x = coordenada.getX() + cena.getX() + janela.getX(); y = coordenada.getY() + cena.getY() + janela.getY() + node.getBoundsInLocal().getHeight(); FontMetrics fm = Toolkit.getToolkit().getFontLoader().getFontMetrics(fonte); double linhas = fm.computeStringWidth(c.getMensagem())/largura; y -= ((Math.ceil(linhas)*15)+15); }else{ // CENTRO double centroX = node.getBoundsInLocal().getWidth()/2; double centroY = node.getBoundsInLocal().getHeight()/2; largura = 400; x = (cena.getX() + janela.getX() + centroX) - (largura/2); y = cena.getY() + janela.getY() + centroY; } } updateMensagem(c.getMensagem(), largura, x, y); mensagem.show(janela); }catch(IndexOutOfBoundsException ex){ Kernel.principal.desativarAjuda(); } } public void updateMensagem(String texto, double largura, double x, double y){ mensagem.setText(texto); mensagem.setMinWidth(largura); mensagem.setMaxWidth(largura); mensagem.setX(x); mensagem.setY(y); } public void desativarAjuda(){ Animacao.fadeInMultiplo(objetos.stream().filter(n -> n.getOpacity()<1).collect(Collectors.toList())); mensagem.hide(); objetos.clear(); capitulos.clear(); capituloAtual = -1; } public static Ajuda getInstance(){ return instance; } public static void estilizarBotaoDica(Control campo, Label ajuda, String dica, Duracao duracao){ ajuda.getStyleClass().add("labelAjuda"); ajuda.setPrefWidth(24); ajuda.setPrefHeight(24); ajuda.setOnMouseClicked(e -> { Janela.showTooltip(Status.ADVERTENCIA, dica, campo, duracao); }); } }