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); }
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); } } } } }