Posicion BuscarParrafo(Parrafo parrafoBuscado, int paginainicio, int paginafin) { if (paginainicio > paginafin) { int centro2 = Math.Max(paginainicio, paginafin); reintentar: if (centro2 >= _Paginas.Count) { centro2 = _Paginas.Count - 1; } Pagina elemento2 = _Paginas[centro2]; int linea = BuscarLineaInicioParrafo(elemento2.LineaInicio, parrafoBuscado); Posicion p = new Posicion(_docimpreso); _docimpreso.Completar(p, centro2, linea, 0); return(p); } int centro = (paginainicio + paginafin) / 2; Pagina elemento = _Paginas[centro]; Linea inicial = _Lineas.Obtener(elemento.LineaInicio); if (inicial.Parrafo == parrafoBuscado) { int linea = BuscarLineaInicioParrafo(elemento.LineaInicio, parrafoBuscado); Posicion p = new Posicion(_docimpreso); _docimpreso.Completar(p, centro, linea, 0); return(p); //return CrearPosicion(centro, elemento.LineaInicio, 0); } else { if (inicial.Parrafo.EsSiguiente(parrafoBuscado)) { return(BuscarParrafo(parrafoBuscado, centro + 1, paginafin)); } else { return(BuscarParrafo(parrafoBuscado, paginainicio, centro - 1)); } } }
public TamBloque ObtenerMargenEdicion() { return(Linea.ObtenerMargenEdicion()); }
public IEnumerable <Bloque> ObtenerBloquesDe(Linea linea) { if (linea.Parrafo != _parrafoActual) { if (linea.Inicio == 0) { _parrafoActual = linea.Parrafo; _enumerador = _parrafoActual.ObtenerIndices().GetEnumerator(); _primerBloque = new IndiceBloque(0, 0, null); } else { AvanzarHastaLinea(linea.Parrafo, linea); } } int saldoprocesar = linea.Cantidad; while (saldoprocesar > 0) { if (_primerBloque.Cantidad == 0) { bool avanzado = _enumerador.MoveNext(); if (!avanzado) { yield break; } _primerBloque = _enumerador.Current; } int avance = Math.Min(_primerBloque.Cantidad, saldoprocesar); IndiceBloque parteLinea = _primerBloque.BloqueHasta(avance); yield return(new Bloque(parteLinea.Cantidad, parteLinea.Formato)); _primerBloque.AvanzarIndice(avance); saldoprocesar -= avance; } /*if (!_primerbloqueconsiderado) * { * int avance = Math.Min(_primerBloque.Cantidad, linea.Cantidad); * IndiceBloque parteLinea = _primerBloque.BloqueHasta(avance); * saldoprocesar += avance; * yield return new Bloque(parteLinea.Cantidad, parteLinea.Formato); * _primerBloque.AvanzarIndice(avance); * if (_primerBloque.Cantidad == 0) * { * _primerbloqueconsiderado = true; * } * } * else * { * if (_enumerador.MoveNext()) * { * int avance = Math.Min(b.Cantidad, saldoprocesar); * * } * }*/ /* * int baselinea = 0; * if (linea.Parrafo != _parrafoActual) * { * _parrafoActual = linea.Parrafo; * _primerbloqueconsiderado = true; * _enumerador = linea.Parrafo.ObtenerBloques().GetEnumerator(); * baselinea = 0; * _inicioBloque = linea.Inicio; * } * else * { * int _cantidadBloqueInicio = _primerbloque.Cantidad; * * while (!_primerbloqueconsiderado) * { * Bloque nuevo = _primerbloque.Clonar(); * int cantidadconsiderar = Math.Min(_primerbloque.Cantidad, linea.Cantidad); * nuevo.CambiarCantidad(cantidadconsiderar); * _primerbloque.DisminuirCantidad(cantidadconsiderar); * yield return nuevo; * * if (_inicioBloque+cantidadconsiderar == linea.Inicio+linea.Cantidad) * { * yield break; * } * _primerbloqueconsiderado = _primerbloque.Cantidad == 0; * _inicioBloque += cantidadconsiderar; * if (_primerbloque.Cantidad == 0) * { * break; * } * } * * } * Debug.Assert(_inicioBloque >= linea.Inicio); * int _finBloque; * while (_enumerador.MoveNext()) * { * Bloque b=_enumerador.Current; * _finBloque = _inicioBloque + b.Cantidad; * int finlinea=linea.Inicio+linea.Cantidad; * if (_finBloque > finlinea) * { * Bloque b2 = b.Clonar(); * int cantidadconsiderar = finlinea - _inicioBloque; * b2.CambiarCantidad(cantidadconsiderar); * yield return b2; * _primerbloque = b.Clonar(); * _primerbloque.CambiarCantidad(b.Cantidad - cantidadconsiderar); * _primerbloqueconsiderado = false; * yield break; * } * else * { * yield return b; * } * _inicioBloque = _finBloque; * }*/ //if (linea.Parrafo != parrafoActual) //{ // parrafoActual = linea.Parrafo; // sumainicio = 0; // primerbloqueconsiderado = true; // enumerador = linea.Parrafo.ObtenerBloques().GetEnumerator(); //} //else //{ // if (!primerbloqueconsiderado) // { // int tamdib = linea.Cantidad; // int tamrestante = primerbloque.Cantidad; // bool enbloquediv = false; // if (tamdib < tamrestante) // { // primerbloque.CambiarCantidad(tamdib); // enbloquediv = true; // } // yield return primerbloque; // sumainicio += primerbloque.Cantidad; // if (enbloquediv) // { // primerbloque = primerbloque.Clonar(); // primerbloque.CambiarCantidad(tamrestante - tamdib); // yield break; // } // else // { // primerbloqueconsiderado = true; // } // } //} //int fin = linea.Inicio + linea.Cantidad; //while (enumerador.MoveNext()) //{ // Bloque actual = enumerador.Current; // int sumaanterior = sumainicio; // sumainicio += actual.Cantidad; // if (sumainicio > fin) // { // Bloque b = actual.Clonar(); // int saldofaltante = b.Cantidad; // b.DisminuirCantidad(sumainicio-fin); // saldofaltante = saldofaltante - b.Cantidad; // yield return b; // primerbloque = actual.Clonar(); // primerbloque.CambiarCantidad(saldofaltante); // primerbloqueconsiderado = false; // sumainicio = fin; // yield break; // } // else // { // yield return actual; // } //} }
public AvanceBloques(Linea lineaInicio) { AvanzarHastaLinea(lineaInicio.Parrafo, lineaInicio); }
internal static Linea ObtenerSiguienteLinea(Parrafo parrafo, int caracterinicio, Medicion ancho, bool incluirAltoParrafo, bool incluirBaseParrafo) { int tamparrafo = parrafo.Longitud; //Estilo e = new Estilo(); if (tamparrafo == 0) { Estilo estparrafo = new Estilo(new Bloque(0, parrafo.Formato.ObtenerFormatoTexto())); Medicion alto = estparrafo.Medir(string.Empty).Alto;//e.Medir(string.Empty).Alto; if (parrafo.Formato.ObtenerEspaciadoInterlineal() != 1) { alto = alto * (float)parrafo.Formato.ObtenerEspaciadoInterlineal(); } if (incluirAltoParrafo) { alto += parrafo.Formato.ObtenerEspacioAnterior(); } if (incluirBaseParrafo) { alto += parrafo.Formato.ObtenerEspacioPosterior(); } ; return(new Linea(parrafo, caracterinicio, 0, alto, estparrafo.MedirBase(), ancho)); } Linea actual = new Linea(parrafo, caracterinicio, 0, Medicion.Cero, Medicion.Cero, ancho); TamBloque tampromedio = new Estilo(new Bloque(4, parrafo.Formato.ObtenerFormatoTexto())).Medir("MMMM"); Medicion anchocaracter = tampromedio.Ancho / 4; int numcaracteres = (int)(ancho / anchocaracter); int limitecaracteres = tamparrafo - caracterinicio; if (numcaracteres > limitecaracteres) { numcaracteres = limitecaracteres; } actual.Cantidad = numcaracteres; Medicion mbase; TamBloque bloque = actual.MedirDeParrafo(actual.Inicio, actual.Cantidad, out mbase);//e.Medir(parrafo.ObtenerSubCadena(caracterinicio, numcaracteres)); while (numcaracteres < limitecaracteres && bloque.Ancho < ancho) { actual.Cantidad = numcaracteres; bloque = actual.MedirDeParrafo(caracterinicio, numcaracteres, out mbase);//parrafo.ObtenerSubCadena(caracterinicio, numcaracteres)); numcaracteres++; } while (numcaracteres > 0 && bloque.Ancho > ancho) { actual.Cantidad = numcaracteres; //string subcad = parrafo.ObtenerSubCadena(caracterinicio, numcaracteres); bloque = actual.MedirDeParrafo(caracterinicio, numcaracteres, out mbase);// e.Medir(subcad); if (numcaracteres > 0 && bloque.Ancho > ancho) { string subcad = parrafo.ObtenerSubCadena(caracterinicio, numcaracteres); numcaracteres = ObtenerAnteriorDivision(subcad, numcaracteres); } } actual.AltoBase = mbase; actual.Cantidad = numcaracteres; actual.AltoLinea = bloque.Alto; actual.AnchoLinea = ancho; if (parrafo.Formato.ObtenerEspaciadoInterlineal() != 1) { actual.AltoLinea = actual.AltoLinea * (float)parrafo.Formato.ObtenerEspaciadoInterlineal(); } if (incluirAltoParrafo && actual.Inicio == 0) { actual.AltoLinea += parrafo.Formato.ObtenerEspacioAnterior(); } if (incluirBaseParrafo && actual.Inicio + actual.Cantidad == tamparrafo) { actual.AltoLinea += parrafo.Formato.ObtenerEspacioPosterior(); } return(actual); //return new Linea() { Parrafo = parrafo, Cantidad = numcaracteres, Inicio = caracterinicio,AltoLinea=tampromedio.Alto }; }