예제 #1
0
        public void DibujarRectangulo(Lapiz lapiz, Punto inicio, TamBloque bloque)
        {
            Pen    l   = _lapices.Obtener(lapiz);
            PointF pt  = Traducir(inicio);
            SizeF  tam = Traducir(bloque);

            g.DrawRectangle(l, pt.X, pt.Y, tam.Width, tam.Height);
        }
예제 #2
0
        public void RellenarRectangulo(Brocha brocha, Punto inicio, TamBloque bloque)
        {
            Brush  b   = _brochas.Obtener(brocha);
            PointF pt  = Traducir(inicio);
            SizeF  tam = Traducir(bloque);

            g.FillRectangle(b, pt.X, pt.Y, tam.Width, tam.Height);
        }
예제 #3
0
        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));
        }
예제 #4
0
        public void AsegurarVisibilidad(Posicion posicion)
        {
            TamBloque pos = posicion.ObtenerMargenEdicion();

            if (LineaAnterior != posicion.IndiceLinea)
            {
                AsegurarVisibilidadPuntoPagina(posicion.IndicePagina, posicion.PosicionPagina);
            }
            AsegurarVisibilidadMargen(posicion);
        }
예제 #5
0
        public void AsegurarVisibilidadMargen(Posicion posicion)
        {
            AsegurarGraficador();
            TamBloque margen    = posicion.ObtenerMargenEdicion();
            Punto     pt        = posicion.PosicionPagina;
            Punto     arribaizq = pt.Agregar(Medicion.Cero - margen.Ancho, Medicion.Cero - margen.Alto);
            Punto     abajoder  = pt.Agregar(margen.Ancho, margen.Alto + posicion.AltoLinea);

            AsegurarVisibilidadPuntoPagina(posicion.IndicePagina, abajoder);
            AsegurarVisibilidadPuntoPagina(posicion.IndicePagina, arribaizq);
        }
예제 #6
0
        public Punto DibujarFondo(IGraficador graficos, Punto posicionbase, string texto, string anteriortexto)
        {
            if (!string.IsNullOrEmpty(anteriortexto))
            {
                posicionbase.X += GraficadorConsultas.MedirUnion(Letra, anteriortexto, texto);
            }
            TamBloque b = Medir(texto);

            graficos.RellenarRectangulo(ColorFondo, posicionbase, b);
            return(new Punto(posicionbase.X + b.Ancho, posicionbase.Y));
        }
예제 #7
0
 public Pagina(int lineaInicio, ListaPaginas paginas, ListaLineas lineas)
 {
     _lineas     = lineas;
     _paginas    = paginas;
     LineaInicio = lineaInicio;
     Dimensiones = new TamBloque(new Medicion(210, Unidad.Milimetros), new Medicion(270, Unidad.Milimetros));
     Margen      = new Margen()
     {
         Derecho = new Medicion(10, Unidad.Milimetros), Izquierdo = new Medicion(10, Unidad.Milimetros), Superior = new Medicion(10, Unidad.Milimetros), Inferior = new Medicion(10, Unidad.Milimetros)
     };
     AltoActual = Medicion.Cero;
 }
예제 #8
0
 public Medicion MedirUnion(Letra letra, string a, string b)
 {
     if (a.Length > 0 && b.Length > 0)
     {
         TamBloque t1 = MedirTexto(letra, a[a.Length - 1].ToString() + b[0]);
         TamBloque t2 = MedirTexto(letra, a[a.Length - 1].ToString());
         TamBloque t3 = MedirTexto(letra, b[0].ToString());
         //return t1.Ancho-(t2.Ancho + t3.Ancho);
         return(t1.Ancho - (t2.Ancho + t3.Ancho));
     }
     return(Medicion.Cero);
 }
예제 #9
0
        void docimpr_QueryPageSettings(object sender, QueryPageSettingsEventArgs e)
        {
            if (!numpagina.HasValue)
            {
                numpagina = 0;
            }

            //int lim = escritorio.Controlador.Documento.ObtenerNumPaginas();
            TamBloque tam = _impgenerica.GetNextPageSize();

            e.PageSettings.PaperSize = new PaperSize("Personalizado",
                                                     (int)tam.Ancho.ConvertirA(CentesimaPulgada).Valor,
                                                     (int)tam.Alto.ConvertirA(CentesimaPulgada).Valor);
        }
예제 #10
0
        public int ObtenerNumCaracter(Medicion posicionx, Medicion anchoLinea)
        {
            if (Cantidad == 0)
            {
                return(0);
            }
            posicionx -= ObtenerDeltaAlineacion(anchoLinea);
            if (posicionx < new Medicion(0))
            {
                posicionx = new Medicion(0);
                return(0);
            }

            string    linea = Parrafo.ToString().Substring(Inicio, Cantidad);
            Medicion  maxbase;
            TamBloque tam = MedirDeParrafo(Inicio, Cantidad, out maxbase);
            Medicion  anchocaracterespromedio = tam.Ancho / linea.Length;

            if (posicionx > tam.Ancho)
            {
                return(Cantidad);
            }
            else
            {
                int      posicionestimada = (int)(posicionx / anchocaracterespromedio);//((posicionx / anchocaracterespromedio) * tam.Width);
                Medicion pos = ObtenerPosicionCaracter(posicionestimada, out maxbase);
                while (posicionestimada > 0 && pos - posicionx > Medicion.Cero)
                {
                    posicionestimada--;
                    pos = ObtenerPosicionCaracter(posicionestimada);
                }
                while (posicionestimada < Cantidad - 1 && pos - posicionx < Medicion.Cero)
                {
                    posicionestimada++;
                    pos = ObtenerPosicionCaracter(posicionestimada, out maxbase);
                }
                if (posicionestimada > 0 && pos - posicionx > Medicion.Cero)
                {
                    posicionestimada--;
                    pos = ObtenerPosicionCaracter(posicionestimada, out maxbase);
                }
                Normalizar(ref posicionestimada);
                return(posicionestimada);
            }
        }
예제 #11
0
        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);
        }
예제 #12
0
        private Medicion ObtenerDeltaAlineacion(Medicion anchoLinea)
        {
            AlineacionParrafo alineacion = Parrafo.Formato.ObtenerAlineacionHorizontal();
            Medicion          deltacalc  = Medicion.Cero;

            if (alineacion == AlineacionParrafo.Derecha || alineacion == AlineacionParrafo.Centro)
            {
                Medicion  altobase;
                TamBloque tam        = MedirDeParrafo(Inicio, Cantidad, out altobase);
                Medicion  anchotexto = tam.Ancho;
                if (alineacion == AlineacionParrafo.Derecha)
                {
                    deltacalc = anchoLinea - anchotexto;
                }
                else
                {
                    deltacalc = (anchoLinea - anchotexto) * 0.5;
                }
            }
            return(deltacalc);
        }
예제 #13
0
 public bool EnRango(Punto esquinaSuperior, TamBloque tamaño, Punto puntoTest)
 {
     return(puntoTest.X >= esquinaSuperior.X && (puntoTest.X < esquinaSuperior.X + tamaño.Ancho) &&
            puntoTest.Y >= esquinaSuperior.Y && (puntoTest.Y < esquinaSuperior.Y + tamaño.Alto));
 }
예제 #14
0
 public void NotifySizeChanged(TamBloque nuevoTamaño)
 {
     escritorio.Dimensiones = nuevoTamaño;
 }
예제 #15
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 };
        }
예제 #16
0
 public SizeF Traducir(TamBloque bloque)
 {
     return(new SizeF(
                (float)bloque.Ancho.ConvertirA(unidaddispositivox).Valor,
                (float)bloque.Alto.ConvertirA(unidaddispositivoy).Valor));
 }
예제 #17
0
 public Size CrearTam(TamBloque tambloque)
 {
     return(new Size(ObtenerMedida(tambloque.Ancho), ObtenerMedida(tambloque.Alto)));
 }