Académique Documents
Professionnel Documents
Culture Documents
Personalización de la
apariencia de nuestra
aplicación
Hemos terminado nuestra aplicación y ahora nos gustaría personalizar su aspecto para seguir el
estilo que nos gusta. En este capítulo, veremos cómo cambiar el estilo de los skins existentes
(usando CSS y XCSS) y cómo crear un skin nuevo personalizado a partir de los skins
incorporados que ofrece el marco RichFaces.
Skinnability
En el capítulo 1, Primeros Pasos, se da una introducción de lo que RichFaces skinnability trata y
durante el desarrollo de nuestra aplicación, hemos aprendido cómo establecer el skin por defecto
para un proyecto e incluso cómo cambiarlo dinámicamente.
En resumen, todos los componentes RichFaces dan soporte a la skinnability y significa que sólo
cambiando el skin, cambiamos la apariencia de todos los componentes. Eso es muy bueno para
dar a nuestra aplicación un aspecto coherente y no repetir siempre los mismos valores de CSS
para cada componente.
RichFaces todavía usa CSS, sino que también mejora con el fin de hacerlo más sencillo de
gestionar y mantener.
Como debes saber, RichFaces viene con algunos skins integrados (y otros plug ‘n’ skins
adicionales)-podemos empezar con los skins para crear un skin personalizado.
• laguna
• darkX
• glassX
Los plug ‘n’ skin están empaquetados en archivos JAR externos (que se puede descargar de la
misma ubicación que la del marco RichFaces) que se debe agregar en el proyecto con el fin de
poder utilizarlos. Vamos a ver cómo crear nuestro plug ‘n’ skin personalizado en el capítulo
siguiente.
Recuerde que el skin utilizado por la aplicación se puede establecer como parámetro de contexto
en el archivo web.xml:
<context-param>
<param-name>org.richfaces.SKIN</param-name>
<param-value>emeraldTown</param-value>
</context-param>
#Colors
headerBackgroundColor=#005000
headerGradientColor=#70BA70
headerTextColor=#FFFFFF
headerWeightFont=bold
generalBackgroundColor=#f1f1f1
generalTextColor=#000000
generalSizeFont=18px
generalFamilyFont=Arial, Verdana, sans-serif
controlTextColor=#000000
controlBackgroundColor=#ffffff
additionalBackgroundColor=#E2F6E2
shadowBackgroundColor=#000000
shadowOpacity=1
panelBorderColor=#C0C0C0
subBorderColor=#ffffff
tabBackgroundColor=#ADCDAD
tabDisabledTextColor=#67AA67
trimColor=#BBECBB
tipBackgroundColor=#FAE6B0
tipBorderColor=#E5973E
selectControlColor=#FF9409
generalLinkColor=#43BD43
hoverLinkColor=#FF9409
visitedLinkColor=#43BD43
# Fonts
headerSizeFont=18px
headerFamilyFont=Arial, Verdana, sans-serif
tabSizeFont=11
tabFamilyFont=Arial, Verdana, sans-serif
buttonSizeFont=18
buttonFamilyFont=Arial, Verdana, sans-serif
tableBackgroundColor=#FFFFFF
tableFooterBackgroundColor=#cccccc
tableSubfooterBackgroundColor=#f1f1f1
tableBorderColor=#C0C0C0
tableBorderWidth=2px
#Calendar colors
calendarWeekBackgroundColor=#f5f5f5
calendarHolidaysBackgroundColor=#FFEBDA
calendarHolidaysTextColor=#FF7800
calendarCurrentBackgroundColor=#FF7800
calendarCurrentTextColor=#FFEBDA
calendarSpecBackgroundColor=#E2F6E2
calendarSpecTextColor=#000000
warningColor=#FFE6E6
warningBackgroundColor=#FF0000
editorBackgroundColor=#F1F1F1
editBackgroundColor=#FEFFDA
#Gradients
gradientType=plain
Con el fin de probarlo, vamos a abrir nuestro proyecto de aplicación, crearemos un archivo
llamado mySkin.skin.properties dentro del directorio /resources/WEB-INF/ y
agregaremos el texto anterior.
<copy
tofile="${war.dir}/WEB-INF/classes/mySkin.skin.properties"
file="${basedir}/resources/WEB-INF/mySkin.skin.properties"
overwrite="true"/>
Además, como nuestra aplicación es compatible con múltiples skins, vamos a abrir el archivo
components.xml y agregamos soporte a la misma:
<property name="defaultSkin">mySkin</property>
<property name="availableSkins">
<value>mySkin</value>
<value>laguna</value>
<value>darkX</value>
<value>glassX</value>
<value>blueSky</value>
<value>classic</value>
<value>ruby</value>
<value>wine</value>
<value>deepMarine</value>
<value>emeraldTown</value>
<value>japanCherry</value>
</property>
Si sólo desea seleccionar el nuevo skin como skin fijo, sólo tendría que editar el archivo web.xml y
seleccione el nuevo skin mediante la inserción del nombre en el parámetro de contexto (como se
explicó antes).
Sólo para hacer un ejemplo (mal aspecto, pero comprensible), vamos a cambiar algunos
parámetros en el archivo de skin:
#Colors
headerBackgroundColor=#005000
headerGradientColor=#70BA70
headerTextColor=#FFFFFF
headerWeightFont=bold
generalBackgroundColor=#f1f1f1
generalTextColor=#000000
generalSizeFont=18px
generalFamilyFont=Arial, Verdana, sans-serif
controlTextColor=#000000
controlBackgroundColor=#ffffff
additionalBackgroundColor=#E2F6E2
shadowBackgroundColor=#000000
shadowOpacity=1
panelBorderColor=#C0C0C0
subBorderColor=#ffffff
tabBackgroundColor=#ADCDAD
tabDisabledTextColor=#67AA67
trimColor=#BBECBB
tipBackgroundColor=#FAE6B0
tipBorderColor=#E5973E
selectControlColor=#FF9409
generalLinkColor=#43BD43
hoverLinkColor=#FF9409
visitedLinkColor=#43BD43
# Fonts
headerSizeFont=18px
headerFamilyFont=Arial, Verdana, sans-serif
tabSizeFont=11
tabFamilyFont=Arial, Verdana, sans-serif
buttonSizeFont=18
buttonFamilyFont=Arial, Verdana, sans-serif
tableBackgroundColor=#FFFFFF
tableFooterBackgroundColor=#cccccc
tableSubfooterBackgroundColor=#f1f1f1
tableBorderColor=#C0C0C0
tableBorderWidth=2px
#Calendar colors
calendarWeekBackgroundColor=#f5f5f5
calendarHolidaysBackgroundColor=#FFEBDA
calendarHolidaysTextColor=#FF7800
calendarCurrentBackgroundColor=#FF7800
calendarCurrentTextColor=#FFEBDA
calendarSpecBackgroundColor=#E2F6E2
calendarSpecTextColor=#000000
warningColor=#FFE6E6
warningBackgroundColor=#FF0000
editorBackgroundColor=#F1F1F1
editBackgroundColor=#FEFFDA
#Gradients
gradientType=plain
Aquí está la captura de pantalla de lo que ocurrió con el nuevo skin:
¿Cómo sé cuales parámetros fueron cambiados? La guía oficial para desarrolladores RichFaces
contiene para cada componente, una tabla con las correspondencias entre los parámetros del skin
y las propiedades que conectan al CSS.
Uso de CSS
¿Qué pasa cuando tenemos que cambiar la apariencia de solo un componente en específico? ¿Y
si tenemos que cambiar sólo para una página específica?
En estos casos, podemos utilizar el marco de CSS para realizar las tareas.
Para el primer caso, podemos redefinir la clase CSS skin-inserted y para el segundo,
podemos especificar determinadas clases CSS para cada componente.
En la guía oficial de desarrollo con RichFaces , podemos ver que tenemos que redefinir la clase
CSS rich-panel-header. Vamos a abrir el /view/stylesheet/theme.css y agregamos el
siguiente código:
.rich-panel-header {
color: #FF0000;
background: #9999ff repeat scroll 0 0;
}
El resultado es el siguiente:
Por ahora, todos los componentes rich-panel tienen una nueva cabecera redefinida por la
clase de CSS.
Para dar un ejemplo, vamos a personalizar sólo a los componentes rich : toolbar de la tabla de
todos los contactos (All contacs), vamos a abrir el archivo /view/stylesheet/theme.css y
añadimos nuestra clase custom CSS como sigue:
.my-custom-toolbar {
background: #cccc00 repeat scroll 0 0;
}
...
<rich:toolBar styleClass="my-custom-toolbar">
...
Usted puede ver que sólo se personaliza la barra de herramientas de tabla Todos los contactos
(All contacs).
También puede insertar código CSS en línea con el atributo de estilo del componente:
...
<rich:toolBar styleClass="my-custom-toolbar"
style="border: 2px solid #FF0000;">
...
Incluso si se cambia el skin, nuestra configuración personalizada CSS seguirá siendo válida:
Usando skins con componentes non-skinnable
La característica skinnability sólo funciona para los componentes de RichFaces, así, los mismos
problemas para los que esta característica se ha creado se encuentran el uso de componentes de
otro marco de trabajo (que también utiliza los estándares JSF!).
Con el fin de poder utilizar los parámetros del skin también para los componentes de non-
RichFaces, el marco declara un objeto llamado richSkin que permite el acceso a los valores del
skin.
#{richSkin.tabBackgroundColor}
Por lo tanto, si tenemos un componente div costura (s: div) y aún desea utilizar el color del borde
definido por el skin, podemos utilizar este código:
<s:div
style="border: 10px solid #{richSkin.panelBorderColor}">
<h:outputText value="Example text" />
</s:div>
Y el color será el seleccionado por nuestro skin, por lo que, para nuestro skin nuevo hecho a la
medida, será como sigue:
RichFaces, de hecho, unifica la apariencia de la aplicación por desollar los elementos estándar
HTML de la misma manera que hace con los otros componentes de la biblioteca.
• Estándar: Para personalizar sólo las propiedades básicas (se aplica a IE 6, IE 7 en el modo de
BackCompat y Safari)
• Extendida: Para personalizar más las propiedades con más estilos (que se aplica a Mozilla
Firefox y Internet Explorer 7 en modo conforme con las normas)
Con el fin de activar los controles estándar de personalización, basta con añadir un nuevo
context-param dentro del archivo web.xml, como este:
<context-param>
<param-name>org.richfaces.CONTROL_SKINNING</param-name>
<param-value>enable</param-value>
</context-param>
Si desea personalizar los controles estándar utilizando el marco de CSS, también puede habilitar
el parámetro de contexto org.richfaces.CONTROL_SKINNING_CLASSES (dentro del archivo
web.xml)-al hacer esto, usted será capaz de editar un conjunto de clases CSS para personalizar
los componentes XHTML (algunos ejemplos de las clases CSS que puede redefinir son rich-select,
rich-input-text, etc que siguen los rich-<elementName> [- <elementType>] del patrón).
Para hacer esto, añada el siguiente código a la página XHTML (en nuestro caso, nos gustaría
añadir al archivo /view/layout/template.xhtml):
<script type="text/javascript">
window.RICH_FACES_EXTENDED_SKINNING_ON = true;
</script>
XCSS
Otra forma de utilizar los valores de las propiedades del skin para las clases de CSS es la XCSS.
Se trata de una versión XML de la CSS utilizado para ampliar la función de CSS y añadir
funcionalidades adicionales. Es ampliamente utilizado dentro del marco RichFaces, debido a su
flexibilidad. En resumen, es una versión XML del archivo CSS que contiene los parámetros del
skin y las clases de generador dinámico de los recursos. Automáticamente se convierte en un
archivo estándar CSS que sirve para todos los navegadores.
Como puede ver, usted tiene que utilizar las etiquetas XML <u:selector> y <u:style> para
crear un selector CSS.
<u:selector name=".rich-panel-header">
<u:style name="background-color"
skin="headerBackgroundColor" />
<u:style name="color"
skin="headerTextColor" />
</u:selector>
Este leerá los valores actuales del skin y generará el siguiente codigo CSS
(si se selecciona mySkin):
.rich-panel-header {
background-color: #005000;
color: #FFFFFF;
}
Como puede ver, el atributo de nombre de la etiqueta u:selector define el nombre de selector CSS,
y el atributo de nombre de la etiqueta u:style define el nombre de la propiedad CSS.
También puede utilizar los nombres separados por comas del selector CSS en el u:selector
nombre del atributo para especificar más de un selector a la vez
Otra característica es la posibilidad de utilizar los recursos de Java dentro de la CSS para generar
dinámicamente imágenes en theme.xcss, usted puede encontrar algunos ejemplos para generar
gradientes:
<u:selector name=".rich-table-subheadercell">
<u:style name="background-image">
<f:resource
f:key="org.richfaces.renderkit.images.TabGradientB"/>
</u:style>
</u:selector>
XCSS es muy potente y amplía el marco de CSS para desollar todos los componentes que
necesitamos para el skin!
Resumen
En este capítulo, hemos visto todas las potentes capacidades de personalización que ofrece el
marco RichFaces.
En el próximo capítulo, vamos a crear un nuevo skin utilizando la tecnología plug 'n' skin.