public TamBloque MedirDeParrafo(int inicio, int cantidad, out Medicion maximaBase) { Debug.Assert(inicio >= 0 && inicio + cantidad <= Parrafo.Longitud && cantidad >= 0); AvanceBloques av = new AvanceBloques(this); int inicioact = inicio; TamBloque bq = new TamBloque(Medicion.Cero, Medicion.Cero); Medicion maxbase = Medicion.Cero; IEnumerable <Bloque> bloques = av.ObtenerBloquesDe(this); bool primerbloqueOK = false; //Medir al menos uno de los bloques foreach (Bloque b in bloques) { if (!primerbloqueOK) { primerbloqueOK = true; } else { if (b.Cantidad == 0) { continue; } } Estilo e = new Estilo(b); Medicion medicionbase = e.MedirBase(); if (medicionbase > maxbase) { maxbase = medicionbase; } int cantidadbloque = Math.Min(b.Cantidad, cantidad); TamBloque tm = e.Medir(Parrafo.ObtenerSubCadena(inicioact, cantidadbloque)); if (tm.Alto > bq.Alto) { bq.Alto = tm.Alto; } bq.Ancho = bq.Ancho + tm.Ancho; cantidad -= cantidadbloque; inicioact += cantidadbloque; } maximaBase = maxbase; return(bq); }
public void DibujarPagina(IGraficador g, Punto esquinaSuperior, int numpagina, Seleccion seleccion) { AvanceBloques av = new AvanceBloques(_Lineas.Obtener(_Paginas.Obtener(numpagina).LineaInicio)); _Paginas.Obtener(numpagina).Dibujar(g, esquinaSuperior, _Lineas, seleccion, av); }
public Punto Dibujar(IGraficador g, Punto posicionInicial, Seleccion seleccion, AvanceBloques avance, Medicion anchoLinea, bool incluirEspacioAnterior, bool incluirEspacioPosterior) { List <Bloque> lista = new List <Bloque>(avance.ObtenerBloquesDe(this)); bool esultimalinea = EsUltimaLineaParrafo; Medicion espacioanterior = EsPrimeraLineaParrafo?(incluirEspacioAnterior ? (Parrafo.Formato.ObtenerEspacioAnterior()) : Medicion.Cero):Medicion.Cero; Medicion espacioposterior = EsUltimaLineaParrafo?(incluirEspacioPosterior?(Parrafo.Formato.ObtenerEspacioPosterior()):Medicion.Cero):Medicion.Cero; Medicion altolinea = AltoLinea - espacioposterior; Medicion deltacalc = ObtenerDeltaAlineacion(anchoLinea); AlineacionParrafo alineacion = Parrafo.Formato.ObtenerAlineacionHorizontal(); Punto posicion = new Punto(posicionInicial.X, posicionInicial.Y); for (int i = 0; i < 2; i++) { Medicion deltax; if (alineacion == AlineacionParrafo.Centro || alineacion == AlineacionParrafo.Derecha) { deltax = posicion.X + deltacalc; } else { deltax = posicion.X; } Punto pt = posicion; int posbase = Inicio; Medicion altobase = AltoBase; Bloque ultb = new Bloque(0, Parrafo.Formato.ObtenerFormatoTexto()); foreach (Bloque b in lista) { ultb = b; if (b.Cantidad == 0) { continue; } Estilo e = new Estilo(b); Medicion baset = e.MedirAlto(); string total = Parrafo.ObtenerSubCadena(posbase, b.Cantidad); TamBloque tb = e.Medir(total); Punto posdibujo = new Punto(deltax, posicion.Y + (altolinea - baset) - altobase); Dibujar(g, posdibujo, seleccion, e, posbase, b.Cantidad, total, i); posbase += b.Cantidad; deltax += tb.Ancho; } if (seleccion != null && EsUltimaLineaParrafo && seleccion.Contiene(Parrafo, Inicio + Cantidad)) { Estilo e = new Estilo(ultb); Medicion baset = e.MedirAlto(); Estilo sel = e.Clonar(); sel.ColorFondo = new BrochaSolida(new ColorDocumento(0, 0, 0)); sel.ColorLetra = new BrochaSolida(new ColorDocumento(255, 255, 255)); Punto posdibujo = new Punto(deltax, posicion.Y + (altolinea - baset) - altobase); DibujarConTam(sel, g, posdibujo, " ", "", i); } } return(new Punto(posicion.X, posicion.Y + AltoLinea)); }
public void Dibujar(IGraficador g, Punto esquinaSuperior, ListaLineas _Lineas, Seleccion seleccion, AvanceBloques avance) { CompletarLineas(); Punto pt = esquinaSuperior; pt.X += Margen.Izquierdo; pt.Y += Margen.Superior; Medicion anchoPagina = ObtenerAnchoLineas(); int lim = LineaInicio + Cantidad; for (int numlinea = LineaInicio; numlinea < lim; numlinea++) { Linea l = _Lineas.Obtener(numlinea); pt = l.Dibujar(g, pt, seleccion, avance, anchoPagina, true, true); } }