com.automaster.autoview.client.ui.paineis.tabs.monitoramento.TabHistorico.java Source code

Java tutorial

Introduction

Here is the source code for com.automaster.autoview.client.ui.paineis.tabs.monitoramento.TabHistorico.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.automaster.autoview.client.ui.paineis.tabs.monitoramento;

import com.automaster.autoview.client.Info;
import com.automaster.autoview.client.ui.openlayers.MapaHistoricoOpenLayer;
import com.automaster.autoview.client.ui.paineis.tabs.TabLog;
import com.google.gwt.core.client.GWT;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.i18n.client.DateTimeFormat.PredefinedFormat;
import com.google.gwt.i18n.client.TimeZone;
import com.google.gwt.i18n.client.constants.TimeZoneConstants;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.DataSource;
import com.smartgwt.client.data.Record;
import com.smartgwt.client.data.SortSpecifier;
import com.smartgwt.client.data.fields.DataSourceTextField;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.AnimationEffect;
import com.smartgwt.client.types.DateDisplayFormat;
import com.smartgwt.client.types.GroupStartOpen;
import com.smartgwt.client.types.Overflow;
import com.smartgwt.client.types.SelectionStyle;
import com.smartgwt.client.types.SortDirection;
import com.smartgwt.client.types.TitleOrientation;
import com.smartgwt.client.types.VisibilityMode;
import com.smartgwt.client.util.DateUtil;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.IButton;
import com.smartgwt.client.widgets.ImgButton;
import com.smartgwt.client.widgets.Label;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.events.DrawEvent;
import com.smartgwt.client.widgets.events.DrawHandler;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.DateTimeItem;
import com.smartgwt.client.widgets.grid.ListGrid;
import com.smartgwt.client.widgets.grid.ListGridField;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.smartgwt.client.widgets.grid.events.DataArrivedEvent;
import com.smartgwt.client.widgets.grid.events.DataArrivedHandler;
import com.smartgwt.client.widgets.grid.events.GroupByCompleteEvent;
import com.smartgwt.client.widgets.grid.events.GroupByCompleteHandler;
import com.smartgwt.client.widgets.grid.events.GroupStateChangedEvent;
import com.smartgwt.client.widgets.grid.events.GroupStateChangedHandler;
import com.smartgwt.client.widgets.grid.events.SelectionUpdatedEvent;
import com.smartgwt.client.widgets.grid.events.SelectionUpdatedHandler;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.SectionStack;
import com.smartgwt.client.widgets.layout.SectionStackSection;
import com.smartgwt.client.widgets.layout.VLayout;
import com.smartgwt.client.widgets.tab.Tab;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.TreeMap;

/**
 *
 * @author Adriano
 */
public class TabHistorico extends Tab {

    // Pega o cdigo da Unidade do Usurio Logado Cliente ou Funiconrio
    int codigoUnidade = Integer.parseInt(
            (Info.usuarioLogado.get("codUnidadeCliente") == null) ? Info.usuarioLogado.get("codUnidadeFuncionario")
                    : Info.usuarioLogado.get("codUnidadeCliente"));
    //private final DynamicForm formBusca = new DynamicForm();
    //private final RadioGroupItem tipoBusca = new RadioGroupItem();
    //private final TextItem buscaVeiculo = new TextItem();
    private int i, verificaTeste = 0;
    //private final ListGridField excluir = new ListGridField("excluir", "Excluir");
    public static ListGrid veiculos;
    //public static int LIMIT_CONSULTA_ENDERECO_GOOGLE = 0;
    public static boolean FLAG_CONSULTA_ENDERECO_GOOGLE = true;
    public static boolean TABELA_VEICULOS_HISTORICO_DESENHADA;
    private static ListGrid posicoesVeiculos;
    public static int indexVeiculoPlaca;
    private int contador = 0;
    //private ListGridRecord[] registeredPlacaRecords;
    //private static String endereco = "";
    //private static String latitude;
    private static ArrayList<Record> posicoesSemEndereco;
    private String icone = null;
    private int direcaoPosicao = 0;
    private int indexDistancia = 0;
    private String kms = null;
    private double metros = 0;
    private String m = null;
    private String dist = " Percorridos 0 metros";
    //private static String placaSelecionada = "";
    //private static boolean semafaro = true;
    private double distanciaTotal = 0;
    private double distancia = 0;
    private double latAnt = 0, lonAnt = 0, latAtual = 0, lonAtual = 0;
    private String tempoDecorrido = " 0";
    private int tamanhoListaVeiculos = 0;
    private boolean verificaListaDeVeiculos = true;
    private final VLayout painelSectionPlacas = new VLayout();
    private final Label infoVeiculo = new Label(
            "<strong style=\"font-size:15px; \">Placa: XXX-1111" + " Fabricante: XXXX" + " Modelo: XXXX"
                    + " Cor: XXXX" + " Ano: 0000/0000" + ".</strong> Percorridos: 0 metros. Tempo : 0.");
    private final Label labelPosicoesSemEndereco = new Label("<nbr> </nbr>");
    public static DataSource dataSoucePlacas;
    private String nomeCliente = "";
    private boolean flagSemEndereco = true;
    private static boolean flagBuscaEndereco = true;
    //private String timeZone = "0";
    public static TreeMap<String, String> codPlacasHistorico;
    //private int count  = 0;
    //public static boolean tabelaDesenhada;
    //private boolean verificaArrived = true;
    //private static ArrayList<TreeMap<String, String>> vintePosicoes;
    private MapaHistoricoOpenLayer mapaHistoricoOpenLayer;

    public TabHistorico() {

        //SC.say("Lagura da tela: "+Info.larguraTela());
        TabHistorico.codPlacasHistorico = new TreeMap<>();
        TabHistorico.TABELA_VEICULOS_HISTORICO_DESENHADA = false;
        //tabelaDesenhada = true;
        //this.timeZone = Info.timeZoneClient();
        /*if(timeZone.equalsIgnoreCase("0")){
         timeZone = "UTC";
         } else {
         timeZone = String.valueOf((-1) * (Integer.parseInt(timeZone) / 60));
         }*/
        //DateUtil.setDefaultDisplayTimezone(timeZone);
        this.indexVeiculoPlaca = 0;
        TabHistorico.dataSoucePlacas = new DataSource();
        TabHistorico.dataSoucePlacas.setClientOnly(true);
        DataSourceTextField codigoVeiculo = new DataSourceTextField("codigo", Info.titulosMsg.get("tituloCodigo"));
        codigoVeiculo.setHidden(true);
        codigoVeiculo.setRequired(true);
        //codigoVeiculo.setPrimaryKey(true);
        DataSourceTextField placaVeiculo = new DataSourceTextField("placa", Info.titulosMsg.get("placa"));
        placaVeiculo.setRequired(true);
        //placaVeiculo.setPrimaryKey(true);
        DataSourceTextField fabricanteDs = new DataSourceTextField("fabricante", Info.titulosMsg.get("fabricante"));
        fabricanteDs.setHidden(true);
        DataSourceTextField modeloDs = new DataSourceTextField("modelo", Info.titulosMsg.get("modelo"));
        modeloDs.setHidden(true);
        DataSourceTextField corDs = new DataSourceTextField("cor", Info.titulosMsg.get("cor"));
        corDs.setHidden(true);
        DataSourceTextField anoDs = new DataSourceTextField("ano", Info.titulosMsg.get("ano"));
        anoDs.setHidden(true);
        DataSourceTextField iconeVeiculo = new DataSourceTextField("icone", "?cone de veculo");
        iconeVeiculo.setHidden(true);
        DataSourceTextField grupoVeiculo = new DataSourceTextField("grupo", "Grupo");
        grupoVeiculo.setHidden(true);
        DataSourceTextField clienteGrid = new DataSourceTextField("cliente", "Cliente");
        clienteGrid.setHidden(true);
        TabHistorico.dataSoucePlacas.setFields(iconeVeiculo, codigoVeiculo, placaVeiculo, grupoVeiculo,
                fabricanteDs, modeloDs, corDs, anoDs, clienteGrid);

        final HLayout painelPai = new HLayout();
        painelPai.setWidth100();
        painelPai.setHeight100();
        painelPai.setAlign(Alignment.CENTER);

        //this.verificaLimpar = true;
        //TabHistorico.endereco = null;
        //TabHistorico.latitude = null;
        //TabHistorico.longitude = null;
        //TabHistorico.codUltimaPosicao = null;
        TabHistorico.posicoesSemEndereco = new ArrayList<>();
        //this.vintePosicoes = new ArrayList<>();

        TabHistorico.veiculos = new ListGrid();
        TabHistorico.veiculos.setSortDirection(SortDirection.ASCENDING);
        TabHistorico.veiculos.setSortField("placa");
        TabHistorico.veiculos.setWidth("10%");
        TabHistorico.veiculos.setSelectionType(SelectionStyle.SINGLE);
        TabHistorico.veiculos.setCanPickFields(false);
        TabHistorico.veiculos.setGroupByMaxRecords(100000);
        TabHistorico.veiculos.setAlternateRecordStyles(true);
        TabHistorico.veiculos.setCanGroupBy(true);
        TabHistorico.veiculos.setShowFilterEditor(true);
        TabHistorico.veiculos.setTooltip(Info.titulosMsg.get("listaVeiculos"));
        TabHistorico.veiculos.setFilterOnKeypress(true);
        TabHistorico.veiculos.setCanSort(false);

        TabHistorico.posicoesVeiculos = new ListGrid();
        TabHistorico.posicoesVeiculos.setCanPickFields(false);
        TabHistorico.posicoesVeiculos.setSelectionType(SelectionStyle.MULTIPLE);
        TabHistorico.posicoesVeiculos.setCanDragSelect(true);
        TabHistorico.posicoesVeiculos.setCanAutoFitFields(false);
        TabHistorico.posicoesVeiculos.setCanAutoFitFields(false);
        TabHistorico.posicoesVeiculos.setCanSort(false);
        TabHistorico.posicoesVeiculos.setCanGroupBy(false);
        TabHistorico.posicoesVeiculos.setCanFreezeFields(false);
        SortSpecifier sortSpecifier = new SortSpecifier("dataEhoraReal", SortDirection.DESCENDING);
        TabHistorico.posicoesVeiculos.setSort(sortSpecifier);
        TabHistorico.posicoesVeiculos.setLoadingDataMessage("Carregando posies...");
        TabHistorico.posicoesVeiculos.setProgressiveLoading(true);

        final VLayout mapaHistorico = new VLayout();
        mapaHistoricoOpenLayer = new MapaHistoricoOpenLayer();

        //TabHistorico.veiculos.setDataSource(dataSoucePlacas);
        //TabHistorico.veiculos.fetchData();
        Info.dbService.buscarVeiculoPorUsuarioLogadoHistorico(
                Integer.parseInt(Info.usuarioLogado.get("codUsuario")),
                new AsyncCallback<ArrayList<TreeMap<String, String>>>() {

                    @Override
                    public void onFailure(Throwable caught) {
                        SC.warn("Falha na conexo - VeiculoPorUsuarioLogadoHistorico");
                    }

                    @Override
                    public void onSuccess(ArrayList<TreeMap<String, String>> result) {
                        if (result != null) {
                            tamanhoListaVeiculos = result.size();
                            for (TreeMap<String, String> result1 : result) {
                                final ListGridRecord recordVeiculos = new ListGridRecord();
                                recordVeiculos.setAttribute("codigo", result1.get("codVeiculo"));
                                recordVeiculos.setAttribute("placa", result1.get("placa"));
                                recordVeiculos.setAttribute("fabricante", result1.get("fabricante"));
                                recordVeiculos.setAttribute("modelo", result1.get("modelo"));
                                recordVeiculos.setAttribute("cor", result1.get("cor"));
                                recordVeiculos.setAttribute("ano", result1.get("ano"));
                                recordVeiculos.setAttribute("icone", result1.get("codIcone"));
                                recordVeiculos.setAttribute("grupo", result1.get("nomeGrupo"));
                                recordVeiculos.setAttribute("cliente", result1.get("nomeCliente"));
                                TabHistorico.dataSoucePlacas.addData(recordVeiculos);
                                TabHistorico.codPlacasHistorico.put(result1.get("codVeiculo"),
                                        result1.get("codVeiculo"));
                            }
                            //TabHistorico.veiculos.setDataSource(dataSoucePlacas);
                            //TabHistorico.veiculos.fetchData();

                        } else {
                            //TabHistorico.veiculos.setData(new Record[0]);
                            SC.warn("O usurio no possui veculo");
                            //GWT.log("Lista de veculos do usurio  vazia!!! + linha 117 - TabHistorico");
                        }
                    }
                });
        //Setando itens de configurao da tab
        setTitle(Info.titulosMsg.get("historico"));

        final DynamicForm formHistorico = new DynamicForm();
        formHistorico.setAutoFocus(true);
        formHistorico.setMargin(8);
        //formHistorico.setWidth(220);

        final DateTimeItem itemDataEhora = new DateTimeItem("dataEhora", "Incio");
        itemDataEhora.setHeight(18);
        itemDataEhora.setRequired(true);
        //itemDataEhora.setWidth(150);
        //this.timeZone = Info.timeZoneClient();
        DateUtil.setDefaultDisplayTimezone("-03:00");
        DateTimeFormat dateTimeFormat = DateTimeFormat.getFormat("dd/MM/yyyy HH:mm");
        TimeZoneConstants t = (TimeZoneConstants) GWT.create(TimeZoneConstants.class);
        TimeZone timeZone = TimeZone.createTimeZone(180);
        //itemDataEhora.setDateFormatter(DateDisplayFormat.TOEUROPEANSHORTDATETIME);        
        final Date dataOntem = new Date(System.currentTimeMillis() - 21600000);
        dateTimeFormat.format(dataOntem, timeZone);
        final Date dataAtual = new Date(System.currentTimeMillis());
        dateTimeFormat.format(dataAtual, timeZone);
        itemDataEhora.setDefaultValue(dateTimeFormat.format(
                new Date(dataOntem.getYear(), dataOntem.getMonth(), dataOntem.getDate(), 0, 0, 0), timeZone));
        itemDataEhora.setHint("<nbr>*</nbr>");
        itemDataEhora.setUseMask(true);

        /*final DateItem itemData = new DateItem();
         itemData.setTitle("Data");
         itemData.setName("dataAdesao");
         itemData.setUseTextField(true);
         itemData.setHint("<nbr>*</nbr>");
         itemData.setUseMask(true);
         itemData.setDateFormatter(DateDisplayFormat.TOEUROPEANSHORTDATE);
         itemData.setRequired(true);
         itemData.setWidth(150);
         itemData.setValue(new Date(System.currentTimeMillis()));
            
         final TimeItem itemHora = new TimeItem("time", "Hora");  
         itemHora.setHint("<nbr>*</nbr>");  
         itemHora.setUseTextField(false);
         //itemHora.setWidth(100);
         itemHora.setValue(new Timestamp(Long.parseLong("-75600000")));*/
        formHistorico.setTitleWidth(300);
        formHistorico.setWidth("15%");
        formHistorico.setTitleOrientation(TitleOrientation.LEFT);
        formHistorico.setItems(itemDataEhora);

        final DynamicForm formHistoricoPara = new DynamicForm();
        formHistoricoPara.setMargin(8);
        formHistoricoPara.setWidth("15%");
        formHistoricoPara.setTitleWidth(300);
        formHistoricoPara.setTitleOrientation(TitleOrientation.LEFT);

        final DateTimeItem itemDataEhoraPara = new DateTimeItem("dataEhora", "Fim");
        itemDataEhoraPara.setRequired(true);
        itemDataEhoraPara.setHeight(18);
        //itemDataEhoraPara.setWidth(150);
        itemDataEhoraPara.setDateFormatter(DateDisplayFormat.TOEUROPEANSHORTDATETIME);
        itemDataEhoraPara.setDefaultValue(dateTimeFormat.format(
                new Date(dataAtual.getYear(), dataAtual.getMonth(), dataAtual.getDate(), 23, 59, 59), timeZone));
        itemDataEhoraPara.setHint("<nbr>*</nbr>");
        itemDataEhoraPara.setUseMask(true);
        /*final DateItem itemDataFim = new DateItem();
         itemDataFim.setTitle("Data");
         itemDataFim.setName("dataAdesao");
         itemDataFim.setUseTextField(true);
         itemDataFim.setHint("<nbr>*</nbr>");
         itemDataFim.setUseMask(true);
         itemDataFim.setDateFormatter(DateDisplayFormat.TOEUROPEANSHORTDATE);
         itemDataFim.setRequired(true);
         itemDataFim.setWidth(150);
         itemDataFim.setValue(new Date(System.currentTimeMillis()));
            
         final TimeItem itemHoraFim = new TimeItem("time", "Hora");  
         itemHoraFim.setHint("<nbr>*</nbr>");  
         itemHoraFim.setUseTextField(false);
         //itemHoraFim.setWidth(100);
         itemHoraFim.setValue(new Timestamp(Long.parseLong("10799000")));*/

        /*final SelectItem itemIgnicao = new SelectItem("ignicao", "Ignio");
                LinkedHashMap<String, String> sn = new LinkedHashMap<>();
                sn.put("0", "Ambos");
                sn.put("True", "Ligado");
                sn.put("False", "Desligado");
                itemIgnicao.setValueMap(sn);
                itemIgnicao.setHint("<nbr>*</nbr>");
                itemIgnicao.setRequired(true);
                itemIgnicao.setWidth(150);
                itemIgnicao.setValue("0");*/

        /*final SelectItem itemBloqueio = new SelectItem("ignicao", "Bloqueio");
                LinkedHashMap<String, String> bq = new LinkedHashMap<>();
                bq.put("0", "Ambos");
                bq.put("True", "Desbloqueado");
                bq.put("False", "Bloqueado");
                itemBloqueio.setValueMap(bq);
                itemBloqueio.setHint("<nbr>*</nbr>");
                itemBloqueio.setRequired(true);
                itemBloqueio.setWidth(150);
                itemBloqueio.setValue("0");*/
        formHistoricoPara.setItems(itemDataEhoraPara);

        final Label labelTitulo = new Label("<h3><center>Histrico de veculo</center></h3>");
        //labelTitulo.setWidth(200);
        labelTitulo.setHeight(5);
        final Label labelIncio = new Label("<h3><center>Incio</center></h3>");
        //labelIncio.setWidth(200);
        labelIncio.setHeight(5);
        final Label labelFim = new Label("<h3><center>Trmino</center></h3>");
        //labelFim.setWidth(200);
        labelFim.setHeight(5);

        HLayout hButoes = new HLayout();
        //hButoes.setWidth(200);
        //hButoes.setMembersMargin(3);
        hButoes.setLayoutAlign(Alignment.CENTER);
        hButoes.setAlign(Alignment.LEFT);
        final IButton pesquisar = new IButton("Pesquisar");
        pesquisar.setHeight(18);
        final IButton limpar = new IButton("Limpar");
        limpar.setHeight(18);
        hButoes.setMargin(8);
        hButoes.setMembersMargin(5);
        hButoes.addMember(pesquisar);
        hButoes.addMember(limpar);

        infoVeiculo.setHeight(30);
        infoVeiculo.setWidth("80%");
        labelPosicoesSemEndereco.setHeight(30);
        labelPosicoesSemEndereco.setWidth("20%");
        final Label html = new Label();
        html.setContents("<a href=\"#\">"
                + "<img src=\"./imagens/excel.png\" title=\"Baixar histrico - Excel\" width=\"25\" height=\"25\" />"
                + "</a>" + "<a href=\"#\">"
                + "<img src=\"./imagens/pdf.png\" title=\"Baixar histrico - PDF\" width=\"25\" height=\"25\" />"
                + "</a>");
        html.setWidth(60);
        html.setAlign(Alignment.CENTER);

        mapaHistorico.addDrawHandler(new DrawHandler() {

            @Override
            public void onDraw(DrawEvent event) {

                //Info.atualizaPosicoesSemEnderecoHistorico.scheduleRepeating(5000);
                final String codVeiculoGrid = TabHistorico.veiculos.getSelectedRecord().getAttribute("codigo");
                Timestamp dataInicio = new Timestamp(itemDataEhora.getValueAsDate().getTime());
                Timestamp dataFim = new Timestamp(itemDataEhoraPara.getValueAsDate().getTime());
                infoVeiculo.redraw();
                infoVeiculo.setContents("<strong style=\"font-size:15px; \">" + Info.titulosMsg.get("placa") + ": "
                        + TabHistorico.veiculos.getSelectedRecord().getAttribute("placa") + " "
                        + Info.titulosMsg.get("fabricante") + ": "
                        + TabHistorico.veiculos.getSelectedRecord().getAttributeAsString("fabricante") + " "
                        + Info.titulosMsg.get("modelo") + ": "
                        + TabHistorico.veiculos.getSelectedRecord().getAttributeAsString("modelo") + " "
                        + Info.titulosMsg.get("cor") + ": "
                        + TabHistorico.veiculos.getSelectedRecord().getAttributeAsString("cor") + " "
                        + Info.titulosMsg.get("ano") + ": "
                        + TabHistorico.veiculos.getSelectedRecord().getAttributeAsString("ano")
                        + ".</strong>  Percorridos: 0 metros. Tempo : 0.");

                Info.abrirJanelaCarregando();

                Info.dbService.buscarPosicoesPorIntervaloData(codVeiculoGrid, dataInicio, dataFim,
                        new AsyncCallback<ArrayList<TreeMap<String, String>>>() {

                            @Override
                            public void onFailure(Throwable caught) {
                                Info.fecharJanelaCarrgando();
                                SC.warn("Falha na conexo - PosicoesPorIntervaloData");
                            }

                            @Override
                            public void onSuccess(ArrayList<TreeMap<String, String>> result) {
                                if (result != null) {

                                    Info.fecharJanelaCarrgando();

                                    verificaTeste = i = 1;
                                    for (TreeMap<String, String> posicoes : result) {
                                        //if(posicoes.get("placa").equalsIgnoreCase(placaVeiculo)) {                       
                                        Record registro = new Record();
                                        registro.setAttribute("contador", i);
                                        registro.setAttribute("google",
                                                "<a  href=\"http://maps.google.com.br/maps?q=" + posicoes.get("lat")
                                                        + "," + posicoes.get("lon")
                                                        + "\" title=\"Google maps\" target=\"_blank\"><img src=\"./imagens/mapa.png\" alt=\"Google\" height =\"16px\" width=\"16px\"></a>");
                                        registro.setAttribute("codPosicao",
                                                Integer.parseInt(posicoes.get("codigo")));
                                        registro.setAttribute("lat", posicoes.get("lat"));
                                        registro.setAttribute("lon", posicoes.get("lon"));
                                        registro.setAttribute("dataEhoraReal",
                                                Long.parseLong(posicoes.get("dataHora")));
                                        //DateUtil.setDefaultDisplayTimezone("-03:00");
                                        //registro.setAttribute("dataEhora", DateTimeFormat.getFormat(PredefinedFormat.DATE_TIME_MEDIUM).format(new Timestamp(Long.parseLong(posicoes.get("dataHora"))), TimeZone.createTimeZone(120)));
                                        registro.setAttribute("dataEhora", posicoes.get("dataHoraString"));
                                        //registro.setAttribute("sat", posicoes.get("sat"));
                                        registro.setAttribute("sat", posicoes.get("sat")
                                                + " <img src=\"../imagens/satelite.png\" width=\"16\" height=\"16\" alt=\"Satlite\" title=\"Satlite\"/>");
                                        //registro.setAttribute("gps", posicoes.get("gps"));
                                        registro.setAttribute("gps",
                                                (posicoes.get("gps").equalsIgnoreCase("0"))
                                                        ? "<nbr class=\"positivo\">Atualizado</nbr>"
                                                        : "<nbr class=\"alerta\">Memria</nbr>");
                                        registro.setAttribute("vel", posicoes.get("vel"));
                                        registro.setAttribute("ignReal", Boolean.parseBoolean(posicoes.get("ign")));
                                        registro.setAttribute("ign", (Boolean.parseBoolean(posicoes.get("ign")))
                                                ? "<img src=\"../imagens/ignligada.png\" width=\"16\" height=\"16\" alt=\"Ligada\" title=\"Ligada\"/>"
                                                : "<img src=\"../imagens/igndesligada.png\" width=\"16\" height=\"16\" alt=\"desligada\"  title=\"Desligada\"/>");
                                        registro.setAttribute("entrada", posicoes.get("entrada"));
                                        registro.setAttribute("saida", posicoes.get("saida"));
                                        registro.setAttribute("evento", posicoes.get("evento"));
                                        registro.setAttribute("endereco",
                                                (posicoes.get("endereco") == null) ? "Sem endereo"
                                                        : posicoes.get("endereco"));
                                        registro.setAttribute("codDirecao", posicoes.get("codDirecao"));
                                        registro.setAttribute("direcao", posicoes.get("direcao"));
                                        TabHistorico.posicoesVeiculos.addData(registro);
                                        i++;
                                        if (posicoes.get("endereco") == null) {
                                            TabHistorico.posicoesSemEndereco.add(registro);
                                        }
                                    }
                                    //                            TabHistorico.posicoesVeiculos.selectRecord(0, true);
                                    ListGridRecord marcadorInicio = posicoesVeiculos.getRecord(0);
                                    //                            Info.mapaHistorico.setZoom(16);
                                    //                            LatLng latLng = new LatLng(marcadorInicio.getAttributeAsDouble("lat"), marcadorInicio.getAttributeAsDouble("lon"));
                                    //                            Info.mapaHistorico.panTo(latLng.value());
                                    //                            //Info.polyHistorico.setMap(Info.mapaHistorico.value());
                                    //                            nomeCliente = ((Info.usuarioLogado.get("codUnidadeCliente") == null) ? "</strong></br>Cliente: <strong>" + TabHistorico.veiculos.getSelectedRecord().getAttributeAsString("cliente") + "</strong>" : "");
                                    //                            
                                    if (marcadorInicio.getAttributeAsString("ignReal").equalsIgnoreCase("false")) {
                                        if (direcaoPosicao == 0) {
                                            icone = "./imagens/" + TabHistorico.veiculos.getSelectedRecord()
                                                    .getAttribute("icone") + "/parado_desligado.png";
                                        } else if (direcaoPosicao == 1) {
                                            icone = "./imagens/" + TabHistorico.veiculos.getSelectedRecord()
                                                    .getAttribute("icone") + "/norte_desligado.png";
                                        } else if (direcaoPosicao == 2) {
                                            icone = "./imagens/" + TabHistorico.veiculos.getSelectedRecord()
                                                    .getAttribute("icone") + "/nordeste_desligado.png";
                                        } else if (direcaoPosicao == 3) {
                                            icone = "./imagens/" + TabHistorico.veiculos.getSelectedRecord()
                                                    .getAttribute("icone") + "/leste_desligado.png";
                                        } else if (direcaoPosicao == 4) {
                                            icone = "./imagens/" + TabHistorico.veiculos.getSelectedRecord()
                                                    .getAttribute("icone") + "/sudeste_desligado.png";
                                        } else if (direcaoPosicao == 5) {
                                            icone = "./imagens/" + TabHistorico.veiculos.getSelectedRecord()
                                                    .getAttribute("icone") + "/sul_desligado.png";
                                        } else if (direcaoPosicao == 6) {
                                            icone = "./imagens/" + TabHistorico.veiculos.getSelectedRecord()
                                                    .getAttribute("icone") + "/sudoeste_desligado.png";
                                        } else if (direcaoPosicao == 7) {
                                            icone = "./imagens/" + TabHistorico.veiculos.getSelectedRecord()
                                                    .getAttribute("icone") + "/oeste_desligado.png";
                                        } else if (direcaoPosicao == 8) {
                                            icone = "./imagens/" + TabHistorico.veiculos.getSelectedRecord()
                                                    .getAttribute("icone") + "/noroeste_desligado.png";
                                        }

                                    } else if (direcaoPosicao == 0) {
                                        icone = "./imagens/"
                                                + TabHistorico.veiculos.getSelectedRecord().getAttribute("icone")
                                                + "/parado_ligado.png";
                                    } else if (direcaoPosicao == 1) {
                                        icone = "./imagens/"
                                                + TabHistorico.veiculos.getSelectedRecord().getAttribute("icone")
                                                + "/norte_ligado.png";
                                    } else if (direcaoPosicao == 2) {
                                        icone = "./imagens/"
                                                + TabHistorico.veiculos.getSelectedRecord().getAttribute("icone")
                                                + "/nordeste_ligado.png";
                                    } else if (direcaoPosicao == 3) {
                                        icone = "./imagens/"
                                                + TabHistorico.veiculos.getSelectedRecord().getAttribute("icone")
                                                + "/leste_ligado.png";
                                    } else if (direcaoPosicao == 4) {
                                        icone = "./imagens/"
                                                + TabHistorico.veiculos.getSelectedRecord().getAttribute("icone")
                                                + "/sudeste_ligado.png";
                                    } else if (direcaoPosicao == 5) {
                                        icone = "./imagens/"
                                                + TabHistorico.veiculos.getSelectedRecord().getAttribute("icone")
                                                + "/sul_ligado.png";
                                    } else if (direcaoPosicao == 6) {
                                        icone = "./imagens/"
                                                + TabHistorico.veiculos.getSelectedRecord().getAttribute("icone")
                                                + "/sudoeste_ligado.png";
                                    } else if (direcaoPosicao == 7) {
                                        icone = "./imagens/"
                                                + TabHistorico.veiculos.getSelectedRecord().getAttribute("icone")
                                                + "/oeste_ligado.png";
                                    } else if (direcaoPosicao == 8) {
                                        icone = "./imagens/"
                                                + TabHistorico.veiculos.getSelectedRecord().getAttribute("icone")
                                                + "/noroeste_ligado.png";
                                    }
                                    //Marker marker = new Marker(marcadorInicio.getAttributeAsDouble("lat"), marcadorInicio.getAttributeAsDouble("lon"), Info.mapaHistorico, icone, TabHistorico.veiculos.getSelectedRecord().getAttribute("placa"), Info.polyHistorico.value(), Info.markersHistorico.markersValue(), 0);
                                    //                            InfoWindow infoWindow = new InfoWindow();
                                    //                            Info.mapaHistorico.addListenerInfoWindow(infoWindow.value());
                                    String placa = TabHistorico.veiculos.getSelectedRecord().getAttribute("placa");
                                    String data = marcadorInicio.getAttributeAsString("dataEhora");
                                    String velocidade = marcadorInicio.getAttributeAsString("vel");
                                    String ignicao = marcadorInicio.getAttributeAsString("ignReal")
                                            .equalsIgnoreCase("false") ? "Desligada" : "Ligada";
                                    double latitudePosicao = marcadorInicio.getAttributeAsDouble("lat");
                                    double longitudePosicao = marcadorInicio.getAttributeAsDouble("lon");
                                    String enderecoPosicao = (marcadorInicio.getAttributeAsString("endereco")
                                            .equalsIgnoreCase("Sem endereo")
                                                    ? "No h resoluo de endereo para este local"
                                                    : marcadorInicio.getAttributeAsString("endereco"));
                                    nomeCliente = ((Info.usuarioLogado.get("codUnidadeCliente") == null)
                                            ? "</br><strong> Cliente: </strong>" + TabHistorico.veiculos
                                                    .getSelectedRecord().getAttributeAsString("cliente")
                                                    + "</strong>"
                                            : "");
                                    String direcao = "</br><strong>Direo: </strong> "
                                            + marcadorInicio.getAttributeAsString("direcao") + nomeCliente;
                                    GWT.log("mapaHistoricoOpenLayer 01");
                                    //mapaHistoricoOpenLayer.addMarker(longitudePosicao, latitudePosicao, placa, icone, 0, data, velocidade, ignicao, enderecoPosicao, direcao);
                                    GWT.log("mapaHistoricoOpenLayer 02");
                                    //                            String data = marcadorInicio.getAttributeAsString("dataEhora");
                                    //                            String velocidade = marcadorInicio.getAttributeAsString("vel");
                                    //                            String ignicao = marcadorInicio.getAttributeAsString("ignReal").equalsIgnoreCase("false") ? "Desligada" : "Ligada";
                                    //                            String latitudeVeiculo = marcadorInicio.getAttributeAsString("lat");
                                    //                            String longitudeVeiculo = marcadorInicio.getAttributeAsString("lon");
                                    //                            String enderecoVeiculo = (marcadorInicio.getAttributeAsString("endereco").equalsIgnoreCase("Sem endereo")) ? "No h resoluo de endereo para este local" : marcadorInicio.getAttributeAsString("endereco");
                                    //                            Marker marcadorStreet = new Marker(latLng.value(), placa, icone);
                                    //Info.mapaHistorico.addListenerStreetView(Info.mapaHistorico.value(), marker.value(), marcadorStreet.value(), latLng.value(), infoWindow.value(), String.valueOf(i + "Hr"), placa, data, velocidade, ignicao, latitudeVeiculo, longitudeVeiculo, enderecoVeiculo, direcao);
                                    infoVeiculo.redraw();
                                    //GWT.log("TimeZone client - addDrawHandler: " + timeZone);
                                    infoVeiculo.setContents("<strong style=\"font-size:15px; \">"
                                            + Info.titulosMsg.get("placa") + ": " + placa + " "
                                            + Info.titulosMsg.get("fabricante") + ": "
                                            + TabHistorico.veiculos.getSelectedRecord()
                                                    .getAttributeAsString("fabricante")
                                            + " " + Info.titulosMsg.get("modelo") + ": "
                                            + TabHistorico.veiculos.getSelectedRecord().getAttributeAsString(
                                                    "modelo")
                                            + " " + Info.titulosMsg.get("cor") + ": "
                                            + TabHistorico.veiculos.getSelectedRecord().getAttributeAsString("cor")
                                            + " " + Info.titulosMsg.get("ano") + ": "
                                            + TabHistorico.veiculos.getSelectedRecord().getAttributeAsString("ano")
                                            + ".</strong>  Percorridos: 0 metros. Tempo : 0.");
                                    html.redraw();
                                    html.setContents("<a href=\"./ExcelServlet?placa="
                                            + TabHistorico.veiculos.getSelectedRecord().getAttribute("placa")
                                            + "&dataInicio=" + itemDataEhora.getValueAsDate().getTime() + ""
                                            + "&dataFim=" + itemDataEhoraPara.getValueAsDate().getTime() + "\">"
                                            + "<img src=\"./imagens/excel.png\" title=\"Baixar histrico - Excel\" width=\"25\" height=\"25\" />"
                                            + "</a>" + "<a href=\"./PdfServlet?cod="
                                            + TabHistorico.veiculos.getSelectedRecord().getAttribute("codigo")
                                            + "&placa="
                                            + TabHistorico.veiculos.getSelectedRecord().getAttribute("placa")
                                            + "&dataInicio=" + itemDataEhora.getValueAsDate().getTime() + ""
                                            + "&dataFim=" + itemDataEhoraPara.getValueAsDate().getTime() + "\">"
                                            + "<img src=\"./imagens/pdf.png\" title=\"Baixar histrico - PDF\" width=\"25\" height=\"25\" />"
                                            + "</a>");
                                    //Info.atualizaEnderecosHistorico.scheduleRepeating(5000);
                                } else {
                                    //posicoesVeiculos.setData(new Record[0]);
                                    Info.fecharJanelaCarrgando();
                                    SC.warn("Este intervalo de datas no possui posies!");
                                    GWT.log("ERRO ao listar posicoes dos veculos! HistricoInicial");
                                }
                            }
                        });

            }
        });
        //GWT.log("Info.timeZoneClient() : " + timeZone);

        //        final HLayout janelaCarregando = new HLayout();
        //        janelaCarregando.setWidth100();
        //        janelaCarregando.setHeight100();
        //        janelaCarregando.setShowEdges(false);
        //        janelaCarregando.setLayoutAlign(Alignment.CENTER);
        //        janelaCarregando.setAlign(Alignment.CENTER);
        //        
        //        final VLayout janela = new VLayout();
        //        janela.setBackgroundColor("#1BAEAE");
        //        janela.setWidth(200);
        //        janela.setHeight(45);
        //        janela.setShowEdges(false);
        //        
        //        janela.setLayoutAlign(Alignment.CENTER);
        //        janelaCarregando.addMember(janela);
        pesquisar.addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {

                final Timestamp dataInicio = new Timestamp(itemDataEhora.getValueAsDate().getTime());
                final Timestamp dataFim = new Timestamp(itemDataEhoraPara.getValueAsDate().getTime());
                //GWT.log("dataInicio: "+dataInicio.getTime());
                //GWT.log("dataFim: "+dataFim.getTime());

                if (formHistorico.validate() && formHistoricoPara.validate()
                        && dataFim.getTime() > dataInicio.getTime()) {
                    Info.abrirJanelaCarregando();
                    final String codVeiculoGrid = TabHistorico.veiculos.getSelectedRecord().getAttribute("codigo");
                    i = 1;
                    TabHistorico.posicoesVeiculos.setData(new Record[0]);
                    TabHistorico.posicoesSemEndereco.clear();

                    Info.dbService.buscarPosicoesPorIntervaloData(codVeiculoGrid, dataInicio, dataFim,
                            new AsyncCallback<ArrayList<TreeMap<String, String>>>() {

                                @Override
                                public void onFailure(Throwable caught) {
                                    Info.fecharJanelaCarrgando();
                                    SC.warn("Falha na conexo - PosicoesPorIntervaloData");
                                }

                                @Override
                                public void onSuccess(ArrayList<TreeMap<String, String>> result) {

                                    if (result != null) {
                                        Info.fecharJanelaCarrgando();
                                        html.redraw();
                                        html.setContents("<a href=\"./ExcelServlet?placa="
                                                + TabHistorico.veiculos.getSelectedRecord().getAttribute("placa")
                                                + "&dataInicio=" + itemDataEhora.getValueAsDate().getTime() + ""
                                                + "&dataFim=" + itemDataEhoraPara.getValueAsDate().getTime() + "\">"
                                                + "<img src=\"./imagens/excel.png\" title=\"Baixar histrico - Excel\" width=\"25\" height=\"25\" />"
                                                + "</a>" + "<a href=\"./PdfServlet?cod="
                                                + TabHistorico.veiculos.getSelectedRecord().getAttribute("codigo")
                                                + "&placa="
                                                + TabHistorico.veiculos.getSelectedRecord().getAttribute("placa")
                                                + "&dataInicio=" + itemDataEhora.getValueAsDate().getTime() + ""
                                                + "&dataFim=" + itemDataEhoraPara.getValueAsDate().getTime() + "\">"
                                                + "<img src=\"./imagens/pdf.png\" title=\"Baixar histrico - PDF\" width=\"25\" height=\"25\" />"
                                                + "</a>");
                                        //setPosicoesVeiculo(result);
                                        for (TreeMap<String, String> posicoes : result) {
                                            //if(posicoes.get("placa").equalsIgnoreCase(placaVeiculo)) {                       
                                            Record registro = new Record();
                                            registro.setAttribute("contador", i);
                                            registro.setAttribute("google",
                                                    "<a  href=\"http://maps.google.com.br/maps?q="
                                                            + posicoes.get("lat") + "," + posicoes.get("lon")
                                                            + "\" title=\"Google maps\" target=\"_blank\"><img src=\"./imagens/mapa.png\" alt=\"Google\" height =\"16px\" width=\"16px\"></a>");
                                            registro.setAttribute("codPosicao",
                                                    Integer.parseInt(posicoes.get("codigo")));
                                            registro.setAttribute("lat", posicoes.get("lat"));
                                            registro.setAttribute("lon", posicoes.get("lon"));
                                            registro.setAttribute("dataEhoraReal",
                                                    Long.parseLong(posicoes.get("dataHora")));
                                            //DateUtil.setDefaultDisplayTimezone("-03:00");
                                            //registro.setAttribute("dataEhora", DateTimeFormat.getFormat(PredefinedFormat.DATE_TIME_MEDIUM).format(new Timestamp(Long.parseLong(posicoes.get("dataHora"))), TimeZone.createTimeZone(120)));
                                            registro.setAttribute("dataEhora", posicoes.get("dataHoraString"));
                                            //registro.setAttribute("sat", posicoes.get("sat"));
                                            registro.setAttribute("sat", posicoes.get("sat")
                                                    + " <img src=\"../imagens/satelite.png\" width=\"16\" height=\"16\" alt=\"Satlite\" title=\"Satlite\"/>");
                                            //registro.setAttribute("gps", posicoes.get("gps"));
                                            registro.setAttribute("gps",
                                                    (posicoes.get("gps").equalsIgnoreCase("0"))
                                                            ? "<nbr class=\"positivo\">Atualizado</nbr>"
                                                            : "<nbr class=\"alerta\">Memria</nbr>");
                                            registro.setAttribute("vel", posicoes.get("vel"));
                                            registro.setAttribute("ignReal",
                                                    Boolean.parseBoolean(posicoes.get("ign")));
                                            registro.setAttribute("ign", (Boolean.parseBoolean(posicoes.get("ign")))
                                                    ? "<img src=\"../imagens/ignligada.png\" width=\"16\" height=\"16\" alt=\"Ligada\" title=\"Ligada\"/>"
                                                    : "<img src=\"../imagens/igndesligada.png\" width=\"16\" height=\"16\" alt=\"desligada\"  title=\"Desligada\"/>");
                                            registro.setAttribute("entrada", posicoes.get("entrada"));
                                            registro.setAttribute("saida", posicoes.get("saida"));
                                            registro.setAttribute("evento", posicoes.get("evento"));
                                            registro.setAttribute("endereco",
                                                    (posicoes.get("endereco") == null) ? "Sem endereo"
                                                            : posicoes.get("endereco"));
                                            registro.setAttribute("codDirecao", posicoes.get("codDirecao"));
                                            registro.setAttribute("direcao", posicoes.get("direcao"));
                                            TabHistorico.posicoesVeiculos.addData(registro);
                                            i++;
                                            if (posicoes.get("endereco") == null) {
                                                TabHistorico.posicoesSemEndereco.add(registro);
                                            }
                                        }
                                        TabHistorico.posicoesVeiculos.selectRecord(0, true);
                                        infoVeiculo.redraw();
                                        infoVeiculo
                                                .setContents("<strong style=\"font-size:15px; \">"
                                                        + Info.titulosMsg.get("placa") + ": "
                                                        + TabHistorico.veiculos.getSelectedRecord()
                                                                .getAttribute("placa")
                                                        + " " + Info.titulosMsg.get("fabricante") + ": "
                                                        + TabHistorico.veiculos.getSelectedRecord()
                                                                .getAttributeAsString("fabricante")
                                                        + " " + Info.titulosMsg.get("modelo") + ": "
                                                        + TabHistorico.veiculos.getSelectedRecord()
                                                                .getAttributeAsString("modelo")
                                                        + " " + Info.titulosMsg.get("cor") + ": "
                                                        + TabHistorico.veiculos.getSelectedRecord()
                                                                .getAttributeAsString("cor")
                                                        + " " + Info.titulosMsg.get("ano") + ": "
                                                        + TabHistorico.veiculos.getSelectedRecord()
                                                                .getAttributeAsString("ano")
                                                        + ".</strong>  Percorridos: 0 metros. Tempo : 0.");
                                    } else {
                                        Info.fecharJanelaCarrgando();
                                        SC.warn("Este intervalo de datas no possui posies!");
                                        //GWT.log("ERRO ao listar posicoes dos veculos! Histrico");
                                    }
                                }
                            });
                } else if (formHistorico.validate(false) && formHistoricoPara.validate(false)
                        && dataFim.getTime() < dataInicio.getTime()) {
                    SC.warn("A data final  menor que a data inicial!");
                    formHistoricoPara.focusInItem(itemDataEhoraPara);
                }

            }
        });

        limpar.addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
                itemDataEhora.redraw();
                itemDataEhora.setValue(
                        new Date(dataAtual.getYear(), dataAtual.getMonth(), dataAtual.getDate(), 0, 0, 0));
                itemDataEhoraPara.redraw();
                itemDataEhoraPara.setValue(
                        new Date(dataAtual.getYear(), dataAtual.getMonth(), dataAtual.getDate(), 23, 59, 59));
            }
        });

        final HLayout painelFormulario = new HLayout();
        painelFormulario.setWidth((Info.larguraTela() - (Info.larguraTela() / 2)));
        painelFormulario.setLayoutAlign(Alignment.CENTER);
        painelFormulario.setMembersMargin(3);
        painelFormulario.addMember(formHistorico);
        painelFormulario.addMember(formHistoricoPara);
        painelFormulario.addMember(hButoes);

        final VLayout painelFormularioMapa = new VLayout();

        painelFormularioMapa.addMember(mapaHistoricoOpenLayer);

        final ImgButton refreshMapa = new ImgButton();
        refreshMapa.setSrc("[SKIN]actions/refresh.png");
        refreshMapa.setTooltip("Atualizar mapa");
        refreshMapa.setSize(16);
        refreshMapa.setShowFocused(false);
        refreshMapa.setShowRollOver(false);
        refreshMapa.setShowDown(false);
        refreshMapa.addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
                mapaHistoricoOpenLayer.getOsm_1().redraw();
            }
        });

        final ImgButton addPlacas = new ImgButton();
        addPlacas.setSrc("[SKIN]actions/add.png");
        addPlacas.setTooltip("Maximizar lista de veculos");
        addPlacas.setSize(16);
        addPlacas.setShowFocused(false);
        addPlacas.setShowRollOver(false);
        addPlacas.setShowDown(false);
        addPlacas.setDisabled(true);

        final ImgButton removePlacas = new ImgButton();
        removePlacas.setSrc("[SKIN]actions/remove.png");
        removePlacas.setTooltip("Minimizar lista de veculos");
        removePlacas.setSize(16);
        removePlacas.setShowFocused(false);
        removePlacas.setShowRollOver(false);
        removePlacas.setShowDown(false);
        removePlacas.setDisabled(true);

        addPlacas.addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
                painelSectionPlacas.setAnimateTime(1200);
                painelSectionPlacas.animateShow(AnimationEffect.FADE);
                addPlacas.setDisabled(true);
                removePlacas.setDisabled(false);
            }
        });

        removePlacas.addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {

                painelSectionPlacas.setAnimateTime(1200);
                painelSectionPlacas.animateHide(AnimationEffect.FADE);
                addPlacas.setDisabled(false);
                removePlacas.setDisabled(true);
                //painelFormulario.hide();
            }
        });

        final ImgButton telaCheia = new ImgButton();
        telaCheia.setSrc("../imagens/fullscreen.png");
        telaCheia.setTooltip("Tela Cheia");
        telaCheia.setSize(16);
        telaCheia.setShowFocused(false);
        telaCheia.setShowRollOver(false);
        telaCheia.setShowDown(false);
        //telaCheia.setDisabled(true);
        telaCheia.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                Info.telaCheia("map-historico");
            }
        });

        final SectionStackSection mapaSection = new SectionStackSection();
        mapaSection.setTitle(Info.titulosMsg.get("mapa"));//
        mapaSection.setExpanded(true);
        //        boolean internetExplore = false;
        //        internetExplore = Info.identificaNavegador();
        //        if (internetExplore) {
        mapaSection.setControls(painelFormulario, refreshMapa, addPlacas, removePlacas);
        //        } else {
        //            mapaSection.setControls(painelFormulario, telaCheia, refreshMapa, addPlacas, removePlacas);
        //        }      
        mapaSection.setResizeable(true);
        mapaSection.setItems(painelFormularioMapa);

        final HLayout painelLabelsInfomacoes = new HLayout();
        painelLabelsInfomacoes.setHeight(32);
        painelLabelsInfomacoes.addMember(infoVeiculo);
        painelLabelsInfomacoes.addMember(labelPosicoesSemEndereco);
        final VLayout painelGridVeiculos = new VLayout();
        //painelGridVeiculos.setMembersMargin(10);
        painelGridVeiculos.addMember(painelLabelsInfomacoes);
        painelGridVeiculos.addMember(TabHistorico.posicoesVeiculos);
        painelGridVeiculos.setHeight100();

        final HLayout painelGridInfoVeiculo = new HLayout();
        painelGridInfoVeiculo.setMembersMargin(5);
        painelGridInfoVeiculo.addMember(TabHistorico.veiculos);
        painelGridInfoVeiculo.addMember(painelGridVeiculos);
        painelGridInfoVeiculo.setHeight("28%");

        final SectionStackSection dadosSection = new SectionStackSection();
        dadosSection.setTitle(Info.titulosMsg.get("dadosVeiculo"));
        dadosSection.setItems(painelGridInfoVeiculo);
        dadosSection.setExpanded(true);
        dadosSection.setControls(html);

        final SectionStack buscarClientes = new SectionStack();
        buscarClientes.setSections(mapaSection, dadosSection);
        buscarClientes.setVisibilityMode(VisibilityMode.MULTIPLE);
        buscarClientes.setAnimateSections(true);
        buscarClientes.setWidth100();
        buscarClientes.setHeight100();
        buscarClientes.setOverflow(Overflow.VISIBLE);
        //excluir.setWidth(40);
        final ListGridField codigo = new ListGridField("codigo", Info.titulosMsg.get("tituloCodigo"));
        final ListGridField placaPosicao = new ListGridField("placa", Info.titulosMsg.get("lista"));
        codigo.setHidden(true);
        placaPosicao.setAlign(Alignment.CENTER);
        TabHistorico.veiculos.setDataSource(TabHistorico.dataSoucePlacas);

        final ListGridField quantidade = new ListGridField("contador", Info.titulosMsg.get("numeroEndereco"));
        final ListGridField googleMap = new ListGridField("google", "Mapa");
        final ListGridField codPosicao = new ListGridField("codPosicao", "codPosicao");
        final ListGridField lat = new ListGridField("lat", Info.titulosMsg.get("latitude"));
        final ListGridField lon = new ListGridField("lon", Info.titulosMsg.get("longitude"));
        final ListGridField dataEhoraReal = new ListGridField("dataEhoraReal", Info.titulosMsg.get("dataHora"));
        final ListGridField dataEhora = new ListGridField("dataEhora", Info.titulosMsg.get("dataHora"));
        final ListGridField sat = new ListGridField("sat", Info.titulosMsg.get("satelite"));
        final ListGridField gps = new ListGridField("gps", Info.titulosMsg.get("gps"));
        final ListGridField vel = new ListGridField("vel", Info.titulosMsg.get("velocidade"));
        final ListGridField ingReal = new ListGridField("ignReal", Info.titulosMsg.get("ignicao"));
        final ListGridField ing = new ListGridField("ign", Info.titulosMsg.get("ignicao"));
        final ListGridField entrada = new ListGridField("entrada", Info.titulosMsg.get("entrada"));
        final ListGridField saida = new ListGridField("saida", Info.titulosMsg.get("saida"));
        final ListGridField evento = new ListGridField("evento", Info.titulosMsg.get("evento"));
        final ListGridField enderecoPosicao = new ListGridField("endereco", Info.titulosMsg.get("endereco"));
        final ListGridField codDirecao = new ListGridField("codDirecao", Info.titulosMsg.get("direcao"));
        final ListGridField direcao = new ListGridField("direcao", Info.titulosMsg.get("direcao"));
        final ListGridField fabricante = new ListGridField("fabricante", Info.titulosMsg.get("fabricante"));
        final ListGridField modelo = new ListGridField("modelo", Info.titulosMsg.get("modelo"));
        final ListGridField cor = new ListGridField("cor", Info.titulosMsg.get("cor"));
        final ListGridField ano = new ListGridField("ano", Info.titulosMsg.get("ano"));

        quantidade.setWidth(40);
        quantidade.setAlign(Alignment.CENTER);
        googleMap.setAlign(Alignment.CENTER);
        googleMap.setWidth(60);
        //quantidade.setHidden(true);
        codPosicao.setHidden(true);
        fabricante.setHidden(true);
        modelo.setHidden(true);
        cor.setHidden(true);
        ano.setHidden(true);

        //codPosicao.setWidth(1);
        //codPosicao.setHidden(true);        
        lat.setAlign(Alignment.CENTER);
        lat.setWidth(80);
        lon.setAlign(Alignment.CENTER);
        lon.setWidth(80);
        dataEhora.setAlign(Alignment.CENTER);
        dataEhora.setWidth(115);
        sat.setAlign(Alignment.CENTER);
        sat.setWidth(80);
        gps.setAlign(Alignment.CENTER);
        gps.setWidth(65);
        vel.setAlign(Alignment.CENTER);
        vel.setWidth(80);
        ing.setAlign(Alignment.CENTER);
        ing.setWidth(70);
        ingReal.setAlign(Alignment.CENTER);
        ingReal.setHidden(true);
        entrada.setAlign(Alignment.CENTER);
        entrada.setWidth(80);
        saida.setAlign(Alignment.CENTER);
        saida.setWidth(80);
        evento.setAlign(Alignment.CENTER);
        evento.setWidth(80);
        enderecoPosicao.setAlign(Alignment.CENTER);
        //enderecoPosicao.setWidth(500);
        codDirecao.setAlign(Alignment.CENTER);
        codDirecao.setHidden(true);
        direcao.setAlign(Alignment.CENTER);
        direcao.setWidth(70);
        dataEhoraReal.setHidden(true);

        if (Info.usuarioLogado.get("codClienteCliente") != null) {
            lat.setHidden(true);
            lon.setHidden(true);
            //sat.setHidden(true);
            entrada.setHidden(true);
            saida.setHidden(true);
            evento.setHidden(true);
        }
        TabHistorico.posicoesVeiculos.setFields(quantidade, googleMap, codPosicao, dataEhoraReal, dataEhora, vel,
                ingReal, ing, lat, lon, sat, gps, entrada, saida, evento, enderecoPosicao, codDirecao, direcao,
                fabricante, modelo, cor, ano);

        //posicoesVeiculos.setSortField(0);
        //posicoesVeiculos.setSortDirection(SortDirection.DESCENDING);
        //painelPai.addMember(painelSectionPlacas);
        painelPai.addMember(buscarClientes);
        setPane(painelPai);

        TabHistorico.veiculos.addDrawHandler(new DrawHandler() {

            @Override
            public void onDraw(DrawEvent event) {

                //TabHistorico.veiculos.setDataSource(dataSoucePlacas);
                //TabHistorico.veiculos.fetchData();
                TabHistorico.TABELA_VEICULOS_HISTORICO_DESENHADA = true;
                TabHistorico.veiculos.selectRecord(veiculos.getRecord(indexVeiculoPlaca));
                TabHistorico.veiculos.groupBy("grupo");
                TabHistorico.veiculos.selectRecord(veiculos.getRecord(indexVeiculoPlaca));
                //TabHistorico.veiculos.selectRecord(indexVeiculoPlaca);
            }
        });
        TabHistorico.veiculos.setAutoFetchData(true);
        TabHistorico.veiculos.setDataSource(TabHistorico.dataSoucePlacas);
        TabHistorico.veiculos.fetchData();
        TabHistorico.veiculos.setGroupStartOpen(GroupStartOpen.ALL);
        TabHistorico.veiculos.setGroupByField("grupo");
        TabHistorico.veiculos.groupBy("grupo");

        TabHistorico.veiculos.addGroupByCompleteHandler(new GroupByCompleteHandler() {

            @Override
            public void onGroupByComplete(GroupByCompleteEvent event) {
                if (TabHistorico.veiculos.getTotalRows() > indexVeiculoPlaca) {
                    //veiculos.selectRecord(indexVeiculoPlaca + 1);
                    TabHistorico.veiculos.selectRecord(indexVeiculoPlaca);
                    //GWT.log("addGroupByCompleteHandler: "+indexVeiculoPlaca);
                } else {
                    TabHistorico.veiculos.selectRecord(0);
                    //GWT.log("addGroupByCompleteHandler: "+indexVeiculoPlaca);
                }
            }
        });
        TabHistorico.veiculos.addGroupStateChangedHandler(new GroupStateChangedHandler() {

            @Override
            public void onGroupStateChanged(GroupStateChangedEvent event) {
                if (TabHistorico.TABELA_VEICULOS_HISTORICO_DESENHADA) {
                    if (TabHistorico.veiculos.getTotalRows() > indexVeiculoPlaca) {
                        //veiculos.selectRecord(indexVeiculoPlaca + 1);
                        TabHistorico.veiculos.selectRecord(veiculos.getRecord(indexVeiculoPlaca));
                        //GWT.log("addGroupStateChangedHandler" + indexVeiculoPlaca);
                    } else {
                        TabHistorico.veiculos.selectRecord(veiculos.getRecord(0));
                        //GWT.log("addGroupStateChangedHandler" + indexVeiculoPlaca);
                    }
                    //veiculos.focus();
                }
            }
        });

        TabHistorico.veiculos.addSelectionUpdatedHandler(new SelectionUpdatedHandler() {

            @Override
            public void onSelectionUpdated(SelectionUpdatedEvent event) {
                //Info.markersHistorico.markersClearAll(Info.polyHistorico, Info.markersHistorico.markersValue());
                String codVeiculoGrid = TabHistorico.veiculos.getSelectedRecord().getAttribute("codigo");
                GWT.log("Cdigo do veculo selecionado: " + codVeiculoGrid);
                TabHistorico.indexVeiculoPlaca = TabHistorico.veiculos
                        .getRecordIndex(TabHistorico.veiculos.getSelectedRecord());
                //Info.mapaHistorico.setZoom(16);
                html.redraw();
                //GWT.log("TimeZone client - addSelectionChangedHandler: " + timeZone);
                html.setContents("<a href=\"./ExcelServlet?placa="
                        + TabHistorico.veiculos.getSelectedRecord().getAttribute("placa") + "&dataInicio="
                        + itemDataEhora.getValueAsDate().getTime() + "" + "&dataFim="
                        + itemDataEhoraPara.getValueAsDate().getTime() + "\">"
                        + "<img src=\"./imagens/excel.png\" title=\"Baixar histrico - Excel\" width=\"25\" height=\"25\" />"
                        + "</a>" + "<a href=\"./PdfServlet?cod="
                        + TabHistorico.veiculos.getSelectedRecord().getAttribute("codigo") + "&placa="
                        + TabHistorico.veiculos.getSelectedRecord().getAttribute("placa") + "&dataInicio="
                        + itemDataEhora.getValueAsDate().getTime() + "" + "&dataFim="
                        + itemDataEhoraPara.getValueAsDate().getTime() + "\">"
                        + "<img src=\"./imagens/pdf.png\" title=\"Baixar histrico - PDF\" width=\"25\" height=\"25\" />"
                        + "</a>");
                infoVeiculo.redraw();
                infoVeiculo.setContents("<strong style=\"font-size:15px; \">" + Info.titulosMsg.get("placa") + ": "
                        + TabHistorico.veiculos.getSelectedRecord().getAttribute("placa") + " "
                        + Info.titulosMsg.get("fabricante") + ": "
                        + TabHistorico.veiculos.getSelectedRecord().getAttributeAsString("fabricante") + " "
                        + Info.titulosMsg.get("modelo") + ": "
                        + TabHistorico.veiculos.getSelectedRecord().getAttributeAsString("modelo") + " "
                        + Info.titulosMsg.get("cor") + ": "
                        + TabHistorico.veiculos.getSelectedRecord().getAttributeAsString("cor") + " "
                        + Info.titulosMsg.get("ano") + ": "
                        + TabHistorico.veiculos.getSelectedRecord().getAttributeAsString("ano")
                        + ".</strong>  Percorridos: 0 metros. Tempo : 0.");

                //GWT.log("Index Placa: "+indexVeiculoPlaca);
                TabHistorico.posicoesSemEndereco.clear();

                Timestamp dataInicio = new Timestamp(itemDataEhora.getValueAsDate().getTime());
                Timestamp dataFim = new Timestamp(itemDataEhoraPara.getValueAsDate().getTime());
                TabHistorico.posicoesVeiculos.setData(new Record[0]);
                i = 1;
                Info.abrirJanelaCarregando();

                Info.dbService.buscarPosicoesPorIntervaloData(codVeiculoGrid, dataInicio, dataFim,
                        new AsyncCallback<ArrayList<TreeMap<String, String>>>() {

                            @Override
                            public void onFailure(Throwable caught) {
                                Info.fecharJanelaCarrgando();
                                SC.warn("Falha na conexo - PosicoesPorIntervaloData2");

                            }

                            @Override
                            public void onSuccess(ArrayList<TreeMap<String, String>> result) {

                                TabHistorico.posicoesVeiculos.setData(new Record[0]);
                                i = 1;

                                if (result != null) {
                                    Info.fecharJanelaCarrgando();
                                    html.redraw();

                                    for (TreeMap<String, String> posicoes : result) {
                                        Record registro = new Record();
                                        registro.setAttribute("contador", i);
                                        registro.setAttribute("google",
                                                "<a  href=\"http://maps.google.com.br/maps?q=" + posicoes.get("lat")
                                                        + "," + posicoes.get("lon")
                                                        + "\" title=\"Google maps\" target=\"_blank\"><img src=\"./imagens/mapa.png\" alt=\"Google\" height =\"16px\" width=\"16px\"></a>");
                                        registro.setAttribute("codPosicao",
                                                Integer.parseInt(posicoes.get("codigo")));
                                        registro.setAttribute("lat", posicoes.get("lat"));
                                        registro.setAttribute("lon", posicoes.get("lon"));
                                        registro.setAttribute("dataEhoraReal",
                                                Long.parseLong(posicoes.get("dataHora")));
                                        //DateUtil.setDefaultDisplayTimezone("-03:00");
                                        //registro.setAttribute("dataEhora", DateTimeFormat.getFormat(PredefinedFormat.DATE_TIME_MEDIUM).format(new Timestamp(Long.parseLong(posicoes.get("dataHora"))), TimeZone.createTimeZone(120)));
                                        registro.setAttribute("dataEhora", posicoes.get("dataHoraString"));
                                        //registro.setAttribute("sat", posicoes.get("sat"));
                                        registro.setAttribute("sat", posicoes.get("sat")
                                                + " <img src=\"../imagens/satelite.png\" width=\"16\" height=\"16\" alt=\"Satlite\" title=\"Satlite\"/>");
                                        //registro.setAttribute("gps", posicoes.get("gps"));
                                        registro.setAttribute("gps",
                                                (posicoes.get("gps").equalsIgnoreCase("0"))
                                                        ? "<nbr class=\"positivo\">Atualizado</nbr>"
                                                        : "<nbr class=\"alerta\">Memria</nbr>");
                                        registro.setAttribute("vel", posicoes.get("vel"));
                                        registro.setAttribute("ignReal", Boolean.parseBoolean(posicoes.get("ign")));
                                        registro.setAttribute("ign", (Boolean.parseBoolean(posicoes.get("ign")))
                                                ? "<img src=\"../imagens/ignligada.png\" width=\"16\" height=\"16\" alt=\"Ligada\" title=\"Ligada\"/>"
                                                : "<img src=\"../imagens/igndesligada.png\" width=\"16\" height=\"16\" alt=\"desligada\"  title=\"Desligada\"/>");
                                        registro.setAttribute("entrada", posicoes.get("entrada"));
                                        registro.setAttribute("saida", posicoes.get("saida"));
                                        registro.setAttribute("evento", posicoes.get("evento"));
                                        registro.setAttribute("endereco",
                                                (posicoes.get("endereco") == null) ? "Sem endereo"
                                                        : posicoes.get("endereco"));
                                        registro.setAttribute("codDirecao", posicoes.get("codDirecao"));
                                        registro.setAttribute("direcao", posicoes.get("direcao"));
                                        TabHistorico.posicoesVeiculos.addData(registro);
                                        i++;
                                        if (posicoes.get("endereco") == null) {
                                            TabHistorico.posicoesSemEndereco.add(registro);
                                        }
                                    }

                                    TabHistorico.posicoesVeiculos.selectRecord(0, true);
                                    if (flagSemEndereco) {
                                        flagSemEndereco = false;
                                        Info.atualizaPosicoesSemEnderecoHistorico.scheduleRepeating(5000);
                                    }

                                } else {
                                    Info.fecharJanelaCarrgando();
                                    html.redraw();
                                    SC.warn("Este intervalo de datas no possui posies!");
                                    //GWT.log("ERRO ao listar posicoes dos veculos! Histrico");
                                }
                            }
                        });
            }
        });

        TabHistorico.veiculos.addDataArrivedHandler(new DataArrivedHandler() {

            @Override
            public void onDataArrived(DataArrivedEvent event) {

                //GWT.log("LINHA addDataArrivedHandler ++++++++++++++++");
                if (tamanhoListaVeiculos > 0) {

                    if (tamanhoListaVeiculos > 7 && verificaListaDeVeiculos) {
                        verificaListaDeVeiculos = false;
                        //GWT.log("Tamanho lista veculos : " + tamanhoListaVeiculos + " verficaLista : " + verificaListaDeVeiculos);
                        //painelPai.clear();
                        removePlacas.setDisabled(false);
                        painelPai.redraw();
                        final SectionStackSection placasSection = new SectionStackSection();
                        placasSection.setTitle("Placas");
                        TabHistorico.veiculos.markForRedraw();
                        TabHistorico.veiculos.setBorder("0px");
                        TabHistorico.veiculos.setWidth("100%");
                        placasSection.setItems(veiculos);
                        placasSection.setExpanded(true);
                        //placasSection.setControls(addPlacas, removePlacas);

                        final SectionStack listaDePlacasSectionStack = new SectionStack();
                        listaDePlacasSectionStack.setSections(placasSection);
                        listaDePlacasSectionStack.setVisibilityMode(VisibilityMode.MULTIPLE);
                        listaDePlacasSectionStack.setAnimateSections(true);
                        listaDePlacasSectionStack.setWidth100();
                        listaDePlacasSectionStack.setHeight100();
                        listaDePlacasSectionStack.setOverflow(Overflow.VISIBLE);
                        painelSectionPlacas.setMembersMargin(5);
                        painelSectionPlacas.setWidth("10%");
                        painelSectionPlacas.setHeight100();
                        painelSectionPlacas.addMember(listaDePlacasSectionStack);

                        painelGridVeiculos.markForRedraw();
                        painelGridVeiculos.addMember(TabHistorico.posicoesVeiculos);

                        painelPai.addMember(painelSectionPlacas, 0);
                        painelPai.addMember(buscarClientes, 1);
                    }
                }
            }
        });

        TabHistorico.posicoesVeiculos.addSelectionUpdatedHandler(new SelectionUpdatedHandler() {

            @Override
            public void onSelectionUpdated(SelectionUpdatedEvent event) {

                ListGridRecord[] lista = new ListGridRecord[0];
                lista = TabHistorico.posicoesVeiculos.getSelectedRecords();
                //GWT.log("posicoesVeiculos.addSelectionUpdatedHandler");
                sortPosicoes(lista);
            }
        });

        Info.atualizaPosicoesSemEnderecoHistorico = new Timer() {

            @Override
            public void run() {

                if (Info.validaConexao()) {

                    Record registro = new Record();
                    registro.setAttribute("dataHoraReal", new Timestamp(System.currentTimeMillis()).getTime());
                    registro.setAttribute("log",
                            "Linha da Thread atualiza Posicoes sem endereo: "
                                    + DateTimeFormat.getFormat(PredefinedFormat.DATE_TIME_MEDIUM)
                                            .format(new Timestamp(System.currentTimeMillis())));
                    TabLog.log.addData(registro);
                    //GWT.log("HISTRICO - posicoesSemEndereco: "+TabHistorico.posicoesSemEndereco.size());
                    final String placaSelecao = TabHistorico.veiculos.getSelectedRecord()
                            .getAttributeAsString("placa");
                    //GWT.log("PLACA SELECIONADA H1 : "+placaSelecao);

                    if (TabHistorico.posicoesSemEndereco.size() > 0) {

                        Timer avisoTimer = new Timer() {

                            @Override
                            public void run() {
                                labelPosicoesSemEndereco.redraw();
                                labelPosicoesSemEndereco.setContents(
                                        "<nbr>Aguarde... Restando : " + TabHistorico.posicoesSemEndereco.size()
                                                + " endereo(s) a ser processado(s)!</nbr>");
                            }
                        };
                        avisoTimer.schedule(3500);

                        for (final Record posicaoSemEndereco : TabHistorico.posicoesSemEndereco) {

                            final String lat = posicaoSemEndereco.getAttributeAsString("lat");
                            final String lon = posicaoSemEndereco.getAttributeAsString("lon");

                            String latLng = lat + ";" + lon;
                            //GWT.log("LatLng T1: "+latLng);
                            if (Info.enderecosResolvidos.containsKey(latLng)) {

                                int index = TabHistorico.posicoesVeiculos.getRecordIndex(posicaoSemEndereco);

                                if (index != -1) {

                                    TabHistorico.posicoesVeiculos.getRecord(index).setAttribute("endereco",
                                            Info.enderecosResolvidos.get(latLng));
                                    TabHistorico.posicoesVeiculos.markForRedraw();
                                    TabHistorico.posicoesVeiculos.refreshRecordComponent(index, 13);

                                    //GWT.log("HISTRICO - Resolvido VARI?VEL LOCAL!");
                                    TreeMap<String, String> enderecoPosicao = new TreeMap<>();
                                    enderecoPosicao.put("placa", placaSelecao);
                                    //GWT.log("Placa selecionada HISTORICO 1 "+placaSelecao);
                                    enderecoPosicao.put("lat", lat);
                                    enderecoPosicao.put("lon", lon);

                                    TabHistorico.posicoesSemEndereco.remove(posicaoSemEndereco);
                                    //TabHistorico.semafaro = true;

                                    Info.dbService.atualizarPosicaoEndereco(enderecoPosicao,
                                            new AsyncCallback<Boolean>() {

                                                @Override
                                                public void onFailure(Throwable caught) {
                                                    Window.alert(
                                                            "atualizarPosicaoEnderecoHistorico - A remote interface failure !: "
                                                                    + caught.getMessage());
                                                }

                                                @Override
                                                public void onSuccess(Boolean result) {
                                                    //GWT.log("Endereco atualizado no BD : " + result);
                                                }
                                            });
                                }

                            } else {
                                for (int i = 0; i < 20; i++) {
                                    if (i == 19) {
                                        //if(flagBuscaEndereco){
                                        flagBuscaEndereco = false;
                                        GWT.log("LINHA 01 HISTORICO");
                                        buscaEndereco(lat, lon, placaSelecao, posicaoSemEndereco);
                                        GWT.log("LINHA 02 HISTORICO");
                                        //}
                                    }
                                }
                            }

                        }

                    } else {
                        //TabHistorico.LIMIT_CONSULTA_ENDERECO_GOOGLE = 0;
                        Timer avisoTimer = new Timer() {

                            @Override
                            public void run() {
                                labelPosicoesSemEndereco.redraw();
                                labelPosicoesSemEndereco.setContents("");
                            }
                        };
                        avisoTimer.schedule(3500);
                    }
                }
            }
        };
    }

    private void buscaEndereco(final String lat, final String lon, final String placa, final Record record) {

        GWT.log("LINHA 03 HISTRICO");
        TreeMap<String, String> posicoesEndereco = new TreeMap<>();
        posicoesEndereco.put("lat", lat);
        posicoesEndereco.put("lon", lon);
        posicoesEndereco.put("placa", placa);
        GWT.log("LINHA 04 HISTRICO");
        String latLon = lat + "," + lon;
        Info.enderecoGoogleHistorico(latLon, lat, lon, placa, record);
        //        Info.dbService.resolveEnderecoExterno(latLon, new AsyncCallback<String>() {
        //            @Override
        //            public void onFailure(Throwable caught) {
        //                flagBuscaEndereco = true;
        //                SC.warn("ERRO ao resolver endereo!");
        //            }
        //
        //            @Override
        //            public void onSuccess(String resposta) {
        //                
        //                GWT.log("Resposta: "+resposta);
        //                if (resposta != null) {
        //            
        //            int index = TabHistorico.posicoesVeiculos.getRecordIndex(record);
        //
        //            if (index != -1) {
        //                
        //                Info.enderecosResolvidos.put(lat + ";" + lon, resposta);
        //                
        //                TabHistorico.posicoesVeiculos.getRecord(index).setAttribute("endereco", resposta);
        //                TabHistorico.posicoesVeiculos.markForRedraw();
        //                TabHistorico.posicoesVeiculos.refreshRecordComponent(index, 13);
        //
        //                TreeMap<String, String> enderecoPosicao = new TreeMap<>();
        //                enderecoPosicao.put("placa", placa);
        //                //GWT.log("Placa selecionada HISTORICO 2 "+placa);
        //                enderecoPosicao.put("lat", lat);
        //                enderecoPosicao.put("lon", lon);
        //                enderecoPosicao.put("endereco", resposta);
        //                TabHistorico.posicoesSemEndereco.remove(record);
        //                //TabHistorico.semafaro = true;
        //
        //                Info.dbService.cadastrarPosicaoEndereco(enderecoPosicao, new AsyncCallback<Integer>() {
        //
        //                    @Override
        //                    public void onFailure(Throwable caught) {
        //                        flagBuscaEndereco = true;
        //                        SC.warn("Falha na conexo - cadastrarPosicaoEnd");
        //                    }
        //
        //                    @Override
        //                    public void onSuccess(Integer result) {
        //                        flagBuscaEndereco = true;
        //                        GWT.log("Histrico ltima posico cadastrada IF : " + result);
        //                    }
        //                });
        //            } else {
        //
        //                Info.enderecosResolvidos.put(lat + ";" + lon, resposta);
        //
        //                TreeMap<String, String> enderecoPosicao = new TreeMap<>();
        //                enderecoPosicao.put("placa", placa);
        //                //GWT.log("Placa selecionada HISTORICO 22 "+placa);
        //                enderecoPosicao.put("lat", lat);
        //                enderecoPosicao.put("lon", lon);
        //                enderecoPosicao.put("endereco", resposta);
        //                TabHistorico.posicoesSemEndereco.remove(record);
        //                //TabHistorico.semafaro = true;
        //
        //                Info.dbService.cadastrarPosicaoEndereco(enderecoPosicao, new AsyncCallback<Integer>() {
        //
        //                    @Override
        //                    public void onFailure(Throwable caught) {
        //                        flagBuscaEndereco = true;
        //                        SC.warn("Falha na conexo - cadastrarPosicaoEnd2");
        //                    }
        //
        //                    @Override
        //                    public void onSuccess(Integer result) {
        //                        flagBuscaEndereco = true;
        //                        //GWT.log("ltima posico cadastrada ELSE : " + result);
        //                    }
        //                });
        //            }
        //
        //        } else {
        //            flagBuscaEndereco = true;
        //        }
        //            }
        //        });

    }

    public static void enderecoGoogle(String resposta, String lat, String lon, String placa, Record record) {

        if (resposta != null) {

            int index = TabHistorico.posicoesVeiculos.getRecordIndex(record);

            if (index != -1) {

                Info.enderecosResolvidos.put(lat + ";" + lon, resposta);

                TabHistorico.posicoesVeiculos.getRecord(index).setAttribute("endereco", resposta);
                TabHistorico.posicoesVeiculos.markForRedraw();
                TabHistorico.posicoesVeiculos.refreshRecordComponent(index, 13);

                TreeMap<String, String> enderecoPosicao = new TreeMap<>();
                enderecoPosicao.put("placa", placa);
                //GWT.log("Placa selecionada HISTORICO 2 "+placa);
                enderecoPosicao.put("lat", lat);
                enderecoPosicao.put("lon", lon);
                enderecoPosicao.put("endereco", resposta);
                TabHistorico.posicoesSemEndereco.remove(record);
                //TabHistorico.semafaro = true;

                Info.dbService.cadastrarPosicaoEndereco(enderecoPosicao, new AsyncCallback<Integer>() {

                    @Override
                    public void onFailure(Throwable caught) {
                        SC.warn("Falha na conexo - cadastrarPosicaoEnd");
                    }

                    @Override
                    public void onSuccess(Integer result) {
                        flagBuscaEndereco = true;
                        GWT.log("Histrico ltima posico cadastrada IF : " + result);
                    }
                });
            } else {

                Info.enderecosResolvidos.put(lat + ";" + lon, resposta);

                TreeMap<String, String> enderecoPosicao = new TreeMap<>();
                enderecoPosicao.put("placa", placa);
                //GWT.log("Placa selecionada HISTORICO 22 "+placa);
                enderecoPosicao.put("lat", lat);
                enderecoPosicao.put("lon", lon);
                enderecoPosicao.put("endereco", resposta);
                TabHistorico.posicoesSemEndereco.remove(record);
                //TabHistorico.semafaro = true;

                Info.dbService.cadastrarPosicaoEndereco(enderecoPosicao, new AsyncCallback<Integer>() {

                    @Override
                    public void onFailure(Throwable caught) {
                        flagBuscaEndereco = true;
                        SC.warn("Falha na conexo - cadastrarPosicaoEnd2");
                    }

                    @Override
                    public void onSuccess(Integer result) {
                        flagBuscaEndereco = true;
                        //GWT.log("ltima posico cadastrada ELSE : " + result);
                    }
                });
            }

        } else {
            flagBuscaEndereco = true;
        }
    }

    public void sortPosicoes(ListGridRecord[] list) {
        ListGridRecord temp;
        for (int j = 0; j <= list.length - 1; j++) {
            for (int k = 0; k <= list.length - 2; ++k) {
                if (list[k].getAttributeAsInt("dataEhoraReal") < list[k + 1].getAttributeAsInt("dataEhoraReal")) {
                    temp = list[k];
                    list[k] = list[k + 1];
                    list[k + 1] = temp;
                }
                //GWT.log("Linha do mtodo sortPosicoes");
            }
        }

        latAnt = 0;
        lonAnt = 0;
        latAtual = 0;
        lonAtual = 0;
        distancia = 0;
        distanciaTotal = 0;

        for (int j = 0; j < list.length; j++) {
            direcaoPosicao = list[j].getAttributeAsInt("codDirecao");
            //LatLng latLng = new LatLng(list[j].getAttributeAsDouble("lat"), list[j].getAttributeAsDouble("lon"));
            //InfoWindow infoWindow = new InfoWindow();
            //Info.mapaHistorico.addListenerInfoWindow(infoWindow.value());
            icone = "./imagens/ponto_desligado.png";

            if (j == 0) {
                distancia = 0;
                if (list[j].getAttributeAsString("ignReal").equalsIgnoreCase("false")) {

                    if (direcaoPosicao == 0) {
                        icone = "./imagens/" + TabHistorico.veiculos.getSelectedRecord().getAttribute("icone")
                                + "/parado_desligado.png";
                    } else if (direcaoPosicao == 1) {
                        icone = "./imagens/" + TabHistorico.veiculos.getSelectedRecord().getAttribute("icone")
                                + "/norte_desligado.png";
                    } else if (direcaoPosicao == 2) {
                        icone = "./imagens/" + TabHistorico.veiculos.getSelectedRecord().getAttribute("icone")
                                + "/nordeste_desligado.png";
                    } else if (direcaoPosicao == 3) {
                        icone = "./imagens/" + TabHistorico.veiculos.getSelectedRecord().getAttribute("icone")
                                + "/leste_desligado.png";
                    } else if (direcaoPosicao == 4) {
                        icone = "./imagens/" + TabHistorico.veiculos.getSelectedRecord().getAttribute("icone")
                                + "/sudeste_desligado.png";
                    } else if (direcaoPosicao == 5) {
                        icone = "./imagens/" + TabHistorico.veiculos.getSelectedRecord().getAttribute("icone")
                                + "/sul_desligado.png";
                    } else if (direcaoPosicao == 6) {
                        icone = "./imagens/" + TabHistorico.veiculos.getSelectedRecord().getAttribute("icone")
                                + "/sudoeste_desligado.png";
                    } else if (direcaoPosicao == 7) {
                        icone = "./imagens/" + TabHistorico.veiculos.getSelectedRecord().getAttribute("icone")
                                + "/oeste_desligado.png";
                    } else if (direcaoPosicao == 8) {
                        icone = "./imagens/" + TabHistorico.veiculos.getSelectedRecord().getAttribute("icone")
                                + "/noroeste_desligado.png";
                    }
                } else if (direcaoPosicao == 0) {
                    icone = "./imagens/" + TabHistorico.veiculos.getSelectedRecord().getAttribute("icone")
                            + "/parado_ligado.png";
                } else if (direcaoPosicao == 1) {
                    icone = "./imagens/" + TabHistorico.veiculos.getSelectedRecord().getAttribute("icone")
                            + "/norte_ligado.png";
                } else if (direcaoPosicao == 2) {
                    icone = "./imagens/" + TabHistorico.veiculos.getSelectedRecord().getAttribute("icone")
                            + "/nordeste_ligado.png";
                } else if (direcaoPosicao == 3) {
                    icone = "./imagens/" + TabHistorico.veiculos.getSelectedRecord().getAttribute("icone")
                            + "/leste_ligado.png";
                } else if (direcaoPosicao == 4) {
                    icone = "./imagens/" + TabHistorico.veiculos.getSelectedRecord().getAttribute("icone")
                            + "/sudeste_ligado.png";
                } else if (direcaoPosicao == 5) {
                    icone = "./imagens/" + TabHistorico.veiculos.getSelectedRecord().getAttribute("icone")
                            + "/sul_ligado.png";
                } else if (direcaoPosicao == 6) {
                    icone = "./imagens/" + TabHistorico.veiculos.getSelectedRecord().getAttribute("icone")
                            + "/sudoeste_ligado.png";
                } else if (direcaoPosicao == 7) {
                    icone = "./imagens/" + TabHistorico.veiculos.getSelectedRecord().getAttribute("icone")
                            + "/oeste_ligado.png";
                } else if (direcaoPosicao == 8) {
                    icone = "./imagens/" + TabHistorico.veiculos.getSelectedRecord().getAttribute("icone")
                            + "/noroeste_ligado.png";
                }

                String placaPosicao = TabHistorico.veiculos.getSelectedRecord().getAttribute("placa");
                String data = list[j].getAttributeAsString("dataEhora");
                String velocidade = list[j].getAttributeAsString("vel");
                String ignicao = list[j].getAttributeAsString("ignReal").equalsIgnoreCase("false") ? "Desligada"
                        : "Ligada";
                double latitudePosicao = list[j].getAttributeAsDouble("lat");
                double longitudePosicao = list[j].getAttributeAsDouble("lon");
                String enderecoPosicao = (list[j].getAttributeAsString("endereco").equalsIgnoreCase("Sem endereo")
                        ? "No h resoluo de endereo para este local"
                        : list[j].getAttributeAsString("endereco"));
                nomeCliente = ((Info.usuarioLogado.get("codUnidadeCliente") == null)
                        ? "</br><strong>Cliente: </strong>"
                                + TabHistorico.veiculos.getSelectedRecord().getAttributeAsString("cliente")
                                + "</strong>"
                        : "");
                String direcao = "</br><strong>Direo: </strong> " + list[j].getAttributeAsString("direcao")
                        + nomeCliente;
                mapaHistoricoOpenLayer.addMarker(longitudePosicao, latitudePosicao, placaPosicao, icone, j, data,
                        velocidade, ignicao, enderecoPosicao, direcao);

            } else {
                if (list[j].getAttributeAsString("ignReal").equalsIgnoreCase("false")) {
                    icone = "./imagens/ponto_desligado.png";
                } else {
                    icone = "./imagens/ponto_ligado.png";
                }
                String placaPosicao = TabHistorico.veiculos.getSelectedRecord().getAttribute("placa");
                String data = list[j].getAttributeAsString("dataEhora");
                String velocidade = list[j].getAttributeAsString("vel");
                String ignicao = list[j].getAttributeAsString("ignReal").equalsIgnoreCase("false") ? "Desligada"
                        : "Ligada";
                double latitudePosicao = list[j].getAttributeAsDouble("lat");
                double longitudePosicao = list[j].getAttributeAsDouble("lon");
                String enderecoPosicao = (list[j].getAttributeAsString("endereco").equalsIgnoreCase("Sem endereo")
                        ? "No h resoluo de endereo para este local"
                        : list[j].getAttributeAsString("endereco"));
                nomeCliente = ((Info.usuarioLogado.get("codUnidadeCliente") == null)
                        ? "</br><strong> Cliente: </strong>"
                                + TabHistorico.veiculos.getSelectedRecord().getAttributeAsString("cliente")
                                + "</strong>"
                        : "");
                String direcao = "</br><strong>Direo: </strong> " + list[j].getAttributeAsString("direcao")
                        + nomeCliente;
                mapaHistoricoOpenLayer.addMarker(longitudePosicao, latitudePosicao, placaPosicao, icone, j, data,
                        velocidade, ignicao, enderecoPosicao, direcao);

                latAnt = list[j - 1].getAttributeAsDouble("lat");
                lonAnt = list[j - 1].getAttributeAsDouble("lon");
                latAtual = list[j].getAttributeAsDouble("lat");
                lonAtual = list[j].getAttributeAsDouble("lon");
                if (latAnt == latAtual && lonAnt == lonAtual) {
                    distancia = 0;
                } else {
                    distancia = Info.caculaDistanciaEntreDoisPontos(latAnt, lonAnt, latAtual, lonAtual);

                }
            }
            distanciaTotal = distanciaTotal + distancia;
        }
        GWT.log("Data : 1");
        mapaHistoricoOpenLayer.addLinha();
        GWT.log("Data : 2");
        tempoDecorrido = Info.calculaDatas(list[0].getAttributeAsLong("dataEhoraReal"),
                list[list.length - 1].getAttributeAsLong("dataEhoraReal"));
        //GWT.log("Data : 2");
        if (distanciaTotal > 0) {
            indexDistancia = String.valueOf(Info.formataDecimal(distanciaTotal)).indexOf(".");
            kms = String.valueOf(Info.formataDecimal(distanciaTotal)).substring(0, indexDistancia);
            m = "0" + (String.valueOf(Info.formataDecimal(distanciaTotal)).substring(indexDistancia));
            metros = Double.parseDouble(m) * 1000;
            dist = ((Double.parseDouble(kms) > 0) ? ". Percorridos: " + kms + " KM e " + metros + " metros"
                    : ". Percorridos: " + metros + " metros");
        } else {
            dist = " Percorridos 0 metros";
        }
        infoVeiculo.redraw();
        infoVeiculo.setContents("<strong style=\"font-size:15px; \">  " + Info.titulosMsg.get("placa") + ": "
                + TabHistorico.veiculos.getSelectedRecord().getAttributeAsString("placa") + " "
                + Info.titulosMsg.get("fabricante") + ": "
                + TabHistorico.veiculos.getSelectedRecord().getAttributeAsString("fabricante") + " "
                + Info.titulosMsg.get("modelo") + ": "
                + TabHistorico.veiculos.getSelectedRecord().getAttributeAsString("modelo") + " "
                + Info.titulosMsg.get("cor") + ": "
                + TabHistorico.veiculos.getSelectedRecord().getAttributeAsString("cor") + " "
                + Info.titulosMsg.get("ano") + ": "
                + TabHistorico.veiculos.getSelectedRecord().getAttributeAsString("ano") + "</strong>" + dist
                + ". Tempo : " + tempoDecorrido);

    }

}