Exemple #1
0
        public async Task dividir()
        {
            if (nodos.Count() <= BTree.D)
            {
                return;
            }

            Pagina     iPagina = PaginaPadre == null ? this : PaginaPadre;
            PaginaHijo lHijo = new PaginaHijo(iPagina), rHijo = new PaginaHijo(iPagina);
            Pagina     lPagina = new Pagina(lHijo), rPagina = new Pagina(rHijo);

            int     mitad     = nodos.Count / 2;
            Nodo    mitadNodo = nodos[mitad];
            Puntero lPointer  = new Puntero(mitad)
            {
                PaginaPadre = iPagina
            }, rPointer = new Puntero(mitad + 1)
            {
                PaginaPadre = iPagina
            };
            await lPointer.actualizar(); await rPointer.actualizar();

            for (int i = 0; i < mitad; i++)
            {
                lPagina.nodos.Add(nodos[i]);
                nodos[i].PaginaPadre = lPagina;

                lPagina.hijos.Add(hijos[i]);
                hijos[i].paginaPadre         = lPagina;
                hijos[i].puntero.PaginaPadre = lPagina;
            }
            lPagina.hijos.Add(hijos[mitad]);
            hijos[mitad].paginaPadre         = lPagina;
            hijos[mitad].puntero.PaginaPadre = lPagina;

            for (int i = mitad + 1; i < nodos.Count; i++)
            {
                rPagina.nodos.Add(nodos[i]);
                nodos[i].PaginaPadre = rPagina;

                rPagina.hijos.Add(hijos[i]);
                hijos[i].paginaPadre         = rPagina;
                hijos[i].puntero.PaginaPadre = rPagina;

                nodos[i].Indice         = i - mitad - 1;
                hijos[i].puntero.Indice = i - mitad - 1;
            }
            rPagina.hijos.Add(hijos.Last());
            hijos.Last().paginaPadre = rPagina;
            hijos.Last().puntero.PaginaPadre = rPagina;
            hijos.Last().puntero.Indice = hijos.Count - mitad - 2;

            lHijo.pagina = lPagina;
            rHijo.pagina = rPagina;

            rHijo.pagina.MouseDown += (s, e) => { };

            lHijo.puntero = lPointer;
            rHijo.puntero = rPointer;

            nodos.Clear();
            hijos.Clear();

            if (PaginaPadre == null)
            {
                mitadNodo.Indice = 0;
                iPagina.nodos.Add(mitadNodo);
                lPointer.Indice = 0;
                rPointer.Indice = 1;
                iPagina.hijos.Add(lHijo);
                iPagina.hijos.Add(rHijo);

                iPagina.actualizarJerarquia();
                await Task.WhenAll(iPagina.actualizarElementosVista(true),
                                   lPagina.actualizarElementosVista(true),
                                   rPagina.actualizarElementosVista(true),
                                   iPagina.reajustarPocision(true));
            }
            else
            {
                await iPagina.Insertar_Nodo(mitadNodo, lHijo, rHijo);

                iPagina.UpdateLayout();
                iPagina.actualizarJerarquia();
                await Task.WhenAll(iPagina.reajustarPocision(true),
                                   lPagina.actualizarElementosVista(true),
                                   rPagina.actualizarElementosVista(true));

                if (PaginaPadre != null)
                {
                    ((Canvas)Parent).Children.Remove(this);
                }
            }
            await iPagina.dividir();
        }
Exemple #2
0
        public async Task Insertar_Nodo(Nodo nodo, PaginaHijo previo = null, PaginaHijo siguiente = null)
        {
            int valor = nodo.Value;

            Puntero pizquierdo, pderecho;

            if (previo == null)
            {
                pizquierdo = new Puntero(0);
                pderecho   = new Puntero(1);
                previo     = new PaginaHijo(this)
                {
                    puntero = pizquierdo
                };
                siguiente = new PaginaHijo(this)
                {
                    puntero = pderecho
                };
            }
            else
            {
                pizquierdo = previo.puntero;
                pderecho   = siguiente.puntero;
            }

            previo.paginaPadre = siguiente.paginaPadre = nodo.PaginaPadre = pizquierdo.PaginaPadre = pderecho.PaginaPadre = this;

            if (nodos.Count() == 0)
            {
                foreach (var hijo in hijos)
                {
                    Children.Remove(hijo.puntero);
                }
                hijos.Clear();

                UpdateLayout();

                nodo.Indice       = 0;
                pizquierdo.Indice = 0;
                pderecho.Indice   = 1;

                nodos.Add(nodo);
                hijos.Add(previo);
                hijos.Add(siguiente);

                await Task.WhenAll(reajustarPocision(true), actualizarElementosVista());
            }
            else
            {
                int i = 0;
                for (i = 0; i < nodos.Count(); i++)
                {
                    if (nodos[i].Value >= valor)
                    {
                        break;
                    }
                }
                nodo.Indice       = i;
                pizquierdo.Indice = i;
                pderecho.Indice   = i + 1;

                if (i < nodos.Count())
                {
                    if (nodos[i].Value == valor)
                    {
                        return;
                    }

                    Children.Remove(hijos[i].puntero);
                    hijos[i] = siguiente;
                    pderecho.Indice--;
                    await Task.WhenAll(pizquierdo.actualizar(), pderecho.actualizar());

                    List <Task> tarea = new List <Task>();

                    for (int j = i; j < nodos.Count(); j++)
                    {
                        tarea.Add(nodos[j].incrementoProgreso(1));
                        tarea.Add(hijos[j].puntero.incrementoProgreso(1));
                    }
                    tarea.Add(hijos.Last().puntero.incrementoProgreso(1));
                    hijos.Insert(i, previo);

                    nodos.Insert(i, nodo);
                    nodo.Indice = i;

                    tarea.Add(reajustarPocision(true));
                    tarea.Add(actualizarElementosVista());

                    await Task.WhenAll(tarea);
                }
                else
                {
                    Children.Remove(hijos[i].puntero);
                    hijos[i] = previo;

                    hijos.Insert(i + 1, siguiente);

                    nodos.Insert(i, nodo);
                    nodo.Indice = i;

                    actualizarJerarquia();
                    await Task.WhenAll(reajustarPocision(true), actualizarElementosVista());
                }
            }
        }