private void paginatedList_DeeperLevelSelection(object sender, DeeperLevelSelectionEventArgs e)
        {
            // prever a situação onde o utilizador faz duplo click dentro da listview mas sem ser sobre um item dessa lista;
            // nesta situação pretende-se que o contexto seja perdido
            if (e.ItemToBeSelected.ListView == null)
            {
                lstVwPaginated_BeforeNewSelection(sender, new BeforeNewSelectionEventArgs(new ListViewItem(), true));

                return;
            }

            PermissoesHelper.UpdateNivelPermissions((GISADataset.NivelRow)e.ItemToBeSelected.Tag, SessionHelper.GetGisaPrincipal().TrusteeUserOperator.ID);
            if (!PermissoesHelper.AllowExpand)
            {
                MessageBox.Show("Não tem permissão para visualizar os sub-níveis do nível documental selecionado.", "Permissões", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                e.SelectionChange = false;
            }
            else
            {
                if (e.SelectionChange && !(((GISADataset.NivelRow)e.ItemToBeSelected.Tag).RowState == DataRowState.Detached))
                {
                    GISADataset.NivelRow dr = (GISADataset.NivelRow)e.ItemToBeSelected.Tag;

                    // determinar se o nivel actual é um nivel de topo e se está directamente abaixo do produtor de contexto


                    var firstBreadCrumb = BreadCrumbsPath1.Path[0];
                    var rhRow           = dr.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica().First();

                    if (rhRow.NivelRowByNivelRelacaoHierarquica.IDTipoNivel == TipoNivel.DOCUMENTAL && rhRow.NivelRowByNivelRelacaoHierarquicaUpper.IDTipoNivel == TipoNivel.ESTRUTURAL &&
                        dr.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica().SingleOrDefault(r => r.IDUpper == firstBreadCrumb.idNivel) == null)
                    {
                        // o nivel seleccionado é um nivel de topo e não está directamente abaixo do produtor usado como contexto na vista documental

                        BreadCrumbsPath1.ResetBreadCrumbsPath();

                        var ho = new GisaDataSetHelper.HoldOpen(GisaDataSetHelper.GetConnection());
                        try
                        {
                            NivelRule.Current.LoadNivelLocalizacao(GisaDataSetHelper.GetInstance(), dr.ID, SessionHelper.GetGisaPrincipal().TrusteeUserOperator.ID, ho.Connection);
                        }
                        catch (Exception ex) { Trace.WriteLine(ex.ToString()); throw; }
                        finally { ho.Dispose(); }

                        // identificar os produtores intermédios até chegar ao nivel documental e acrescentá-los na BreadCrumbsPath (método de pesquisa em profundidade: por cada nível identificam-se os níveis hierarquicamente inferiores e dentro desse conjunto e a partir do primeiro, encontram-se os seus descendentes)
                        rhRow = GisaDataSetHelper.GetInstance().RelacaoHierarquica.Cast <GISADataset.RelacaoHierarquicaRow>().Single(r => r.ID == firstBreadCrumb.idNivel && r.IDUpper == firstBreadCrumb.idUpperNivel);

                        var q = new Stack <GISADataset.RelacaoHierarquicaRow>();
                        rhRow.NivelRowByNivelRelacaoHierarquica.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquicaUpper().Where(r => r.IDTipoNivelRelacionado < 7).ToList().ForEach(r => q.Push(r));

                        var path        = new LinkedList <GISADataset.RelacaoHierarquicaRow>();
                        var currentNode = path.AddFirst(rhRow);

                        while (q.Count > 0)
                        {
                            rhRow = q.Pop();

                            // se o caminho seguido não levar ao documento pretendido, deve-se retirar todos os nós até àquele que representa o IDUpper de rhRow
                            while (path.Last.Value.ID != rhRow.IDUpper)
                            {
                                path.RemoveLast();
                                currentNode = path.Last;
                            }

                            if (rhRow.ID != dr.ID)
                            {
                                var rhRows = rhRow.NivelRowByNivelRelacaoHierarquica.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquicaUpper()
                                             .Where(r => r.IDTipoNivelRelacionado < 7 || (r.IDTipoNivelRelacionado >= 7 && r.ID == dr.ID)).ToList();

                                if (rhRows.Count > 0)
                                {
                                    currentNode = path.AddAfter(currentNode, rhRow);
                                    rhRows.ForEach(r => q.Push(r));
                                }
                            }
                            else
                            {
                                path.AddAfter(currentNode, rhRow);
                                break;
                            }
                        }

                        path.ToList().ForEach(rh =>
                        {
                            var imgIndex = SharedResourcesOld.CurrentSharedResources.NivelImageBase(System.Convert.ToInt32(rh.TipoNivelRelacionadoRow.GUIOrder));
                            BreadCrumbsPath1.AddBreadCrumb(GISA.Model.Nivel.GetDesignacao(rh.NivelRowByNivelRelacaoHierarquica), rh.ID, rh.IDUpper, imgIndex);
                        });
                    }
                    else
                    {
                        // acrescentar o nivel documental na BreadCrumbsPath
                        int imageIndex = 0;
                        imageIndex = SharedResourcesOld.CurrentSharedResources.NivelImageBase(System.Convert.ToInt32(dr.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica()[0].TipoNivelRelacionadoRow.GUIOrder));
                        BreadCrumbsPath1.AddBreadCrumb(GISA.Model.Nivel.GetDesignacao(dr), dr.ID, BreadCrumbsPath1.getBreadCrumbsPathContextID, imageIndex);
                    }

                    ClearFilter();
                    ReloadList();

                    // Quando não existem elementos a apresentar na lista deve-se forçar uma mudança de contexto para garantir que os paineis de descrição são gravados
                    if (this.Items.Count == 0)
                    {
                        lstVwPaginated_BeforeNewSelection(sender, new BeforeNewSelectionEventArgs(new ListViewItem(), true));
                    }
                    else if (this.Items.Count > 1)
                    {
                        lstVwPaginated_BeforeNewSelection(sender, new BeforeNewSelectionEventArgs(new ListViewItem(), true));
                        PermissoesHelper.UpdateNivelPermissions((GISADataset.NivelRow)e.ItemToBeSelected.Tag, SessionHelper.GetGisaPrincipal().TrusteeUserOperator.ID);
                        if (UpdateToolBarButtonsEvent != null)
                        {
                            UpdateToolBarButtonsEvent(new EventArgs());
                        }
                    }

                    e.SelectionChange = true;
                }
                else
                {
                    e.SelectionChange = false;
                }
            }
        }
		private void Listview_DeeperLevelSelection(object sender, DeeperLevelSelectionEventArgs e)
		{

			if (DeeperLevelSelection != null)
				DeeperLevelSelection(sender, e);
		}