*-- JUSTIFICACIÓN DE TEXTO EN EDITBOX
*-- Autor: Fernando D. Bozzo
*-- Email: fdbozzo@lycos.es
*-- Fecha: 09/04/2003
*-- Versión: 1.00
*-------------------------------------
*-- SINTAXIS: JustificarTexto(oEditBox [,lNoAsignarValor])
*-- Donde:
*-- oEditBox Es la referencia del control EditBox donde justificar el texto.
*-- [lNoAsignarValor] (opcional) Indica que NO se desea asignar la propiedad VALUE del control
*-- con el texto justificado.
#INCLUDE "INCLUDE\FOXPRO.H"
LPARAMETERS toEditbox, tlNoAsignarValor
LOCAL lnCantPalabrasParrafo, lnAnchoMedioCaracter, lnPalabra, lcPalabra, lcPalabraActual, ;
lnAnchoAcumulado, lnAnchoAnterior, lcTexto, lnAnchoSobrante, lnAnchoDecimal, lnEspacio, ;
lcFontName, lnFontSize, lnAnchoMaximo, lcNuevoTexto, lnParrafos, lnParrafo, lcFontStyle, ;
lnAnchoEspacio, lnEspaciosSobrantes, lnEspaciosEntrePalabras, lnEspacioResto, lnPal, lnLineas, ;
lnPalabraActual, lnAnchoAcumuladoReal, lnAnchoAnteriorReal, lnAnchoPalabraPixels
LOCAL ARRAY laParrafos(1), laPalabrasLineaVisual(1), laEspacios(1), laLineas(1)
IF NOT "FOXTOOLS.FLL" $ SET("LIBRARY")
IF FILE("FOXTOOLS.FLL")
SET LIBRARY TO "FOXTOOLS.FLL" ADDITIVE
ELSE
=MESSAGEBOX("El método para justificar texto necesita la librería FOXTOOLS.FLL de Visual FoxPro", MB_OK + MB_ICONEXCLAMATION, PROGRAM())
RETURN ""
ENDIF
ENDIF
IF toEditbox.BASECLASS # "Editbox"
=MESSAGEBOX("El método para justificar texto sólo es para controles EditBox!", MB_OK + MB_ICONEXCLAMATION, PROGRAM())
RETURN ""
ENDIF
WITH toEditbox
lcTexto = ALLTRIM(REDUCE(.VALUE, " "))
lcFontName = .FONTNAME
lnFontSize = .FONTSIZE
lcFontStyle = Get_EstiloFuente(.FONTBOLD, .FONTITALIC, .FONTUNDERLINE, .FONTSTRIKETHRU)
lnAnchoMaximo = .WIDTH - 2 - (.BORDERSTYLE * 2) - IIF(.BORDERSTYLE = 1 AND .SPECIALEFFECT = 0, 2, 0) - (.MARGIN * 2) - IIF(.SCROLLBARS = 0, 0, SYSMETRIC(5) + 1)
lnParrafos = ALINES(laParrafos, lcTexto, .T.)
lnLineas = 0
*-- Ancho medio del caracter
lnAnchoMedioCaracter = FONTMETRIC(6, lcFontName, lnFontSize, lcFontStyle)
lnAnchoEspacio = TXTWIDTH(" ", lcFontName, lnFontSize, lcFontStyle) * lnAnchoMedioCaracter
*-- Recorro los párrafos
FOR lnParrafo = 1 TO lnParrafos
*-- Verifico si es un párrafo vacío
laParrafos(lnParrafo) = ALLTRIM(laParrafos(lnParrafo))
IF EMPTY(laParrafos(lnParrafo))
lnLineas = lnLineas + 1
DECLARE laLineas(lnLineas)
laLineas(lnLineas) = ""
ELSE
*-- Cantidad de Palabras
lnCantPalabrasParrafo = WORDS(laParrafos(lnParrafo))
lnPalabra = 1
lcPalabraActual = ""
*-- Recorro todas las palabras del párrafo
DO WHILE lnPalabra <= lnCantPalabrasParrafo
lnAnchoAcumulado = 0
lnAnchoAnterior = 0
lnAnchoAcumuladoReal = 0
lnAnchoAnteriorReal = 0
lcPalabra = ""
lnPalabraActual = 0
FOR lnPalabra = lnPalabra TO lnCantPalabrasParrafo
lnPalabraActual = lnPalabraActual + 1
lnAnchoAnterior = lnAnchoAcumulado
lnAnchoAnteriorReal = lnAnchoAcumuladoReal
lcPalabraActual = WORDNUM(laParrafos(lnParrafo), lnPalabra, " ")
DECLARE laPalabrasLineaVisual(lnPalabraActual)
laPalabrasLineaVisual(lnPalabraActual) = lcPalabraActual
*lcPalabraActual = WORDNUM(laParrafos(lnParrafo), lnPalabra, " ")
lnAnchoPalabraPixels = TXTWIDTH(lcPalabraActual, lcFontName, lnFontSize, lcFontStyle) * lnAnchoMedioCaracter
lnAnchoAcumuladoReal = lnAnchoAcumuladoReal + lnAnchoPalabraPixels
lnAnchoAcumulado = lnAnchoAcumulado + lnAnchoPalabraPixels + lnAnchoEspacio
IF (lnAnchoAcumulado - lnAnchoEspacio) > lnAnchoMaximo
lnPalabraActual = lnPalabraActual - 1
lnPalabra = lnPalabra - 1
lnLineas = lnLineas + 1
DECLARE laLineas(lnLineas)
laLineas(lnLineas) = ""
*-- Calculo espacio sobrante en forma de 'espacios'
lnEspaciosSobrantes = INT((lnAnchoMaximo - lnAnchoAnteriorReal) / lnAnchoEspacio)
*-- Calculo cantidad de espacios entre palabras
lnEspaciosEntrePalabras = INT(lnEspaciosSobrantes / (lnPalabraActual - 1))
*-- Calculo espacios sobrantes
lnEspacioResto = lnEspaciosSobrantes - lnEspaciosEntrePalabras * (lnPalabraActual - 1)
*-- Distribuyo el espacio restante
DECLARE laEspacios(lnPalabraActual)
laEspacios = SPACE(lnEspaciosEntrePalabras)
FOR lnEspacio = 1 TO lnEspacioResto
laEspacios(lnEspacio) = laEspacios(lnEspacio) + " "
ENDFOR
*-- Formo la línea visual
FOR lnPal = 1 TO lnPalabraActual
lcPalabra = laPalabrasLineaVisual(lnPal)
laLineas(lnLineas) = laLineas(lnLineas) + lcPalabra + laEspacios(lnPal)
ENDFOR
laLineas(lnLineas) = RTRIM(laLineas(lnLineas)) + " "
*-- Especifico la próxima palabra donde comenzar
lnPalabra = lnPalabra + 1
DECLARE laPalabrasLineaVisual(1)
laPalabrasLineaVisual(1) = ""
EXIT
ENDIF
ENDFOR
ENDDO
*-- Agrego en una nueva línea las palabras sobrantes
IF NOT EMPTY(laPalabrasLineaVisual(1))
lnLineas = lnLineas + 1
DECLARE laLineas(lnLineas)
laLineas(lnLineas) = ""
FOR lnPal = 1 TO ALEN(laPalabrasLineaVisual, 1)
lcPalabra = laPalabrasLineaVisual(lnPal)
laLineas(lnLineas) = laLineas(lnLineas) + lcPalabra + SPACE(1)
ENDFOR
ENDIF
laLineas(lnLineas) = RTRIM(laLineas(lnLineas)) + CHR(13) + CHR(10)
ENDIF
ENDFOR
*-- Con el array de líneas obtenido genero un nuevo texto
lcNuevoTexto = ""
FOR lnLinea = 1 TO lnLineas
lcNuevoTexto = lcNuevoTexto + IIF(EMPTY(laLineas(lnLinea)), CHR(13) + CHR(10), laLineas(lnLinea))
ENDFOR
lcNuevoTexto = RTRIM(lcNuevoTexto)
IF NOT tlNoAsignarValor
.VALUE = lcNuevoTexto
ENDIF
.ALIGNMENT = 0
RETURN lcNuevoTexto
ENDWITH
*-- LIBRERÍA DE COMANDOS Y FUNCIONES REFERIDAS A FUENTES DE LETRA
FUNCTION Get_EstiloFuente(tlFontBold, tlFontItalic, tlFontUnderline, tlFontStrikeThru)
*-- Devuelve un código de Estilo de Fuente para uso de FONTMETRIC u otras
*-- funciones que requieren este tipo de código.
*-- PARAMETROS:
*-- tlFontBold Referencia de Objeto del control de edición o letra Negrita
*-- tlFontItalic Si tlFontBold indica letra Negrita, indica letra Itálica (Cursiva)
*-- tlFontUnderline Si tlFontBold indica letra Negrita, indica letra Subrayada
*-- tlFontStrikeThru Si tlFontBold indica letra Negrita, indica letra Tachada
LOCAL ;
lcEstilo, ;
llFontBold, ;
llFontItalic, ;
llFontUnderline, ;
llFontStrikeThru
lcEstilo = ""
DO CASE
CASE PCOUNT() = 0
=MESSAGEBOX("No se indicaron parámetros", MB_OK + MB_ICONEXCLAMATION, PROGRAM())
CASE VARTYPE(tlFontBold) = "O" AND NOT PEMSTATUS(tlFontBold, "FONTNAME", 5)
=MESSAGEBOX("El objeto indicado no es un control de Edición de datos", MB_OK + MB_ICONEXCLAMATION, PROGRAM())
CASE VARTYPE(tlFontBold) = "O"
*-- Se indicó un Objeto
llFontBold = tlFontBold.FONTBOLD
llFontItalic = tlFontBold.FONTITALIC
llFontUnderline = tlFontBold.FONTUNDERLINE
llFontStrikeThru = tlFontBold.FONTSTRIKETHRU
OTHERWISE
*-- Se indicó un Nombre de Fuente
llFontBold = tlFontBold
llFontItalic = tlFontItalic
llFontUnderline = tlFontUnderline
llFontStrikeThru = tlFontStrikeThru
ENDCASE
lcEstilo = lcEstilo + IIF(llFontBold, "B", "")
lcEstilo = lcEstilo + IIF(llFontItalic, "I", "N")
lcEstilo = lcEstilo + IIF(llFontUnderline, "U", "")
lcEstilo = lcEstilo + IIF(llFontStrikeThru, "-", "")
RETURN lcEstilo
ENDFUNC