示例#1
0
        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));
                }
            }
        }
示例#2
0
 public TamBloque ObtenerMargenEdicion()
 {
     return(Linea.ObtenerMargenEdicion());
 }
示例#3
0
        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;
            //    }
            //}
        }
示例#4
0
 public AvanceBloques(Linea lineaInicio)
 {
     AvanzarHastaLinea(lineaInicio.Parrafo, lineaInicio);
 }
示例#5
0
        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 };
        }