Esempio n. 1
0
        internal Texto Dividir(int posicionDivision)
        {
            Texto texto2 = new Texto();

            texto2.Iniciar();
            if (!_bloques.SinAsignar())
            {
                int primerbloque, ultimobloque;
                int deltaini, deltafin;
                ObtenerRango(posicionDivision, st.Length - posicionDivision, out primerbloque, out deltaini, out ultimobloque, out deltafin);
                Bloque bloqueinicio      = _bloques.Obtener(primerbloque);
                int    saldoprimerbloque = bloqueinicio.Cantidad - deltaini;
                bloqueinicio.CambiarCantidad(deltaini);
                _bloques.Guardar(primerbloque, bloqueinicio);
                texto2.AsegurarBloques();
                int deltaelim = 0;
                if (saldoprimerbloque != 0)
                {
                    Bloque clon = _bloques.Obtener(primerbloque);//.Clonar();
                    texto2._bloques.Agregar(saldoprimerbloque, clon.Formato);
                    deltaelim++;
                }
                for (int i = primerbloque + 1; i < _bloques.Cantidad; i++)
                {
                    Bloque b = _bloques.Obtener(i);
                    texto2._bloques.Agregar(b.Cantidad, b.Formato);
                }
                if (primerbloque + 1 != _bloques.Cantidad)
                {
                    _bloques.EliminarRango(primerbloque + 1, _bloques.Cantidad - (primerbloque + 1));
                }
            }
            texto2.st.Append(st.ToString(posicionDivision, st.Length - posicionDivision));
            st.Remove(posicionDivision, st.Length - posicionDivision);
#if DEBUG
            Verificar();
            texto2.Verificar();
#endif
            return(texto2);
        }
Esempio n. 2
0
        public IEnumerable <Bloque> ObtenerRangoBloques(int inicio, int cantidad)
        {
            Bloque bc = new Bloque(0, null);

            if (_bloques.SinAsignar())
            {
                if (st.Length == 0)
                {
                    yield return(_BloqueVacio);
                }
                else
                {
                    bc.CambiarCantidad(cantidad);
                    yield return(bc);
                }
            }
            else
            {
                if (_bloques.Cantidad == 1)
                {
                    Bloque b = _bloques.Obtener(0);
                    bc.CambiarCantidad(b.Cantidad);
                    bc.Formato = b.Formato;
                    yield return(bc);

                    yield break;
                }
                int inicioBloque = 0;
                int finSeleccion = inicio + cantidad;
                for (int i = 0; i < _bloques.Cantidad; i++)
                {
                    Bloque b              = _bloques.Obtener(i);
                    int    finBloque      = inicioBloque + b.Cantidad;
                    bool   inicioEnBloque = inicio >= inicioBloque && inicio < finBloque;
                    bool   enmedio        = inicioBloque > finSeleccion && finBloque > finSeleccion;
                    bool   finEnBloque    = finSeleccion >= inicioBloque && finSeleccion <= finBloque;
                    if (inicioEnBloque)
                    {
                        if (finEnBloque)
                        {
                            bc.CambiarCantidad(finBloque - inicioBloque);
                            bc.Formato = b.Formato;
                            yield return(bc);

                            yield break;
                        }
                        else
                        {
                            bc.Formato = b.Formato;
                            bc.CambiarCantidad(b.Cantidad);
                            bc.DisminuirCantidad(inicio - inicioBloque);
                            yield return(bc);
                        }
                    }
                    else
                    {
                        if (finEnBloque)
                        {
                            bc.Formato = b.Formato;
                            bc.CambiarCantidad(finSeleccion - inicioBloque);
                            yield return(bc);

                            yield break;
                        }
                        else if (enmedio)
                        {
                            bc.Formato = b.Formato;
                            bc.CambiarCantidad(b.Cantidad);
                            yield return(bc);
                        }
                    }
                }
            }
        }