Author: nbelaevski
Date: 2008-07-22 19:32:51 -0400 (Tue, 22 Jul 2008)
New Revision: 9736
Added:
trunk/framework/impl/src/main/resources/org/richfaces/renderkit/html/scripts/skinning.js
Modified:
trunk/framework/impl/src/main/java/org/ajax4jsf/context/RenderPhaseViewResourcesVisitor.java
trunk/framework/impl/src/main/javascript/ajaxjsf/JSFAJAX.js
trunk/framework/impl/src/main/resources/META-INF/resources-config.xml
Log:
Extended skinning client-side support
Modified:
trunk/framework/impl/src/main/java/org/ajax4jsf/context/RenderPhaseViewResourcesVisitor.java
===================================================================
---
trunk/framework/impl/src/main/java/org/ajax4jsf/context/RenderPhaseViewResourcesVisitor.java 2008-07-22
15:51:23 UTC (rev 9735)
+++
trunk/framework/impl/src/main/java/org/ajax4jsf/context/RenderPhaseViewResourcesVisitor.java 2008-07-22
23:32:51 UTC (rev 9736)
@@ -6,7 +6,6 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -32,6 +31,7 @@
import org.ajax4jsf.renderkit.UserResourceRenderer;
import org.ajax4jsf.renderkit.UserResourceRenderer2;
import org.ajax4jsf.renderkit.RendererUtils.HTML;
+import org.ajax4jsf.resource.InternetResource;
import org.ajax4jsf.resource.InternetResourceBase;
import org.ajax4jsf.resource.InternetResourceBuilder;
import org.ajax4jsf.resource.ResourceNotFoundException;
@@ -153,20 +153,14 @@
private InternetResourceBuilder resourceBuilder;
private ResourceRenderer scriptRenderer;
private ResourceRenderer styleRenderer;
+ private boolean useSkinning;
+ private boolean ajaxRequest;
protected ResourceRenderer getScriptRenderer() {
- if (scriptRenderer == null) {
- scriptRenderer = resourceBuilder.getRenderer(".js");
- }
-
return scriptRenderer;
}
protected ResourceRenderer getStyleRenderer() {
- if (styleRenderer == null) {
- styleRenderer = resourceBuilder.getRenderer(".css");
- }
-
return styleRenderer;
}
@@ -189,17 +183,25 @@
return result;
}
- public State(boolean processScripts, boolean processStyles,
+ public State(boolean processScripts, boolean processStyles, boolean useSkinning,
RenderKit renderKit, InternetResourceBuilder resourceBuilder,
HeadResponseWriter component,
- HeadResponseWriter user) {
+ HeadResponseWriter user,
+ ResourceRenderer scriptRenderer,
+ ResourceRenderer styleRenderer, boolean ajaxRequest) {
super();
this.processScripts = processScripts;
this.processStyles = processStyles;
+ this.useSkinning = useSkinning;
this.renderKit = renderKit;
this.resourceBuilder = resourceBuilder;
this.component = component;
this.user = user;
+
+ this.scriptRenderer = scriptRenderer;
+ this.styleRenderer = styleRenderer;
+
+ this.ajaxRequest = ajaxRequest;
}
}
@@ -222,7 +224,7 @@
private boolean extendedSkinningAllowed = true;
- private void encodeSkinningResources(FacesContext context, InternetResourceBuilder
resourceBuilder) throws IOException, FacesException {
+ private boolean encodeSkinningResources(FacesContext context, InternetResourceBuilder
resourceBuilder) throws IOException, FacesException {
boolean useStdControlsSkinning = false;
String stdControlsSkinning = getInitParameterValue(context,
InternetResourceBuilder.STD_CONTROLS_SKINNING_PARAM);
@@ -261,7 +263,11 @@
resourceBuilder.createResource(
this,
SKINNING_STYLES_PATH.concat("extended").concat(resourceSuffix)).encode(context,
null, EXTENDED_SKINNING);
}
+
+ return true;
}
+
+ return false;
}
/* (non-Javadoc)
@@ -278,13 +284,18 @@
boolean processStyles = true;
boolean processScripts = true;
-
+ boolean useSkinning = false;
+
boolean ajaxRequest =
AjaxContext.getCurrentInstance(context).isAjaxRequest(context);
if (log.isDebugEnabled()) {
log
.debug("Process component tree for collect used scripts and styles");
}
+
+ String skinStyleSheetUri = null;
+ String skinExtendedStyleSheetUri = null;
+
try {
Skin skin = SkinFactory.getInstance().getSkin(context);
// For a "NULL" skin, do not collect components stylesheets
@@ -292,12 +303,22 @@
Skin.loadStyleSheets))) {
processStyles = false;
}
+
+ // Set default style sheet for current skin.
+ skinStyleSheetUri = (String) skin.getParameter(context,
+ Skin.generalStyleSheet);
+ // Set default style sheet for current skin.
+ skinExtendedStyleSheetUri = (String) skin.getParameter(context,
+ Skin.extendedStyleSheet);
} catch (SkinNotFoundException e) {
log.warn("Current Skin is not found", e);
}
InternetResourceBuilder internetResourceBuilder = InternetResourceBuilder
.getInstance();
+ ResourceRenderer scriptRenderer =
internetResourceBuilder.getRenderer(".js");
+ ResourceRenderer styleRenderer =
internetResourceBuilder.getRenderer(".css");
+
ResponseWriter oldResponseWriter = context.getResponseWriter();
HeadResponseWriter componentWriter = new HeadResponseWriter("component");
@@ -309,6 +330,32 @@
context.setResponseWriter(componentWriter);
+ // Append Skin StyleSheet after a
+ if (null != skinStyleSheetUri) {
+ String resourceURL = context.getApplication()
+ .getViewHandler().getResourceURL(context,
+ skinStyleSheetUri);
+
+ InternetResourceImpl resourceImpl = new InternetResourceImpl();
+ resourceImpl.setUri(resourceURL);
+ resourceImpl.setRenderer(styleRenderer);
+ resourceImpl.encode(context, null);
+
+ useSkinning = true;
+ }
+
+ if (null != skinExtendedStyleSheetUri && extendedSkinningAllowed) {
+ String resourceURL =
context.getApplication().getViewHandler().getResourceURL(context,
+ skinExtendedStyleSheetUri);
+
+ InternetResourceImpl resourceImpl = new InternetResourceImpl();
+ resourceImpl.setUri(resourceURL);
+ resourceImpl.setRenderer(styleRenderer);
+ resourceImpl.encode(context, null, EXTENDED_SKINNING);
+
+ useSkinning = true;
+ }
+
// Check init parameters for a resources processing.
String scriptStrategy = externalContext
.getInitParameter(InternetResourceBuilder.LOAD_SCRIPT_STRATEGY_PARAM);
@@ -356,7 +403,7 @@
if (!ajaxRequest) {
try {
- encodeSkinningResources(context, internetResourceBuilder);
+ useSkinning = encodeSkinningResources(context, internetResourceBuilder);
internetResourceBuilder
.createResource(this, InternetResourceBuilder.COMMON_STYLE).encode(context,
null);
@@ -370,7 +417,7 @@
}
} else {
- encodeSkinningResources(context, internetResourceBuilder);
+ useSkinning = encodeSkinningResources(context, internetResourceBuilder);
}
} catch (IOException e) {
throw new FacesException(e.getLocalizedMessage(), e);
@@ -383,7 +430,9 @@
RenderKit renderKit = rkFactory.getRenderKit(context, context
.getViewRoot().getRenderKitId());
- result = new State(processScripts, processStyles, renderKit, internetResourceBuilder,
componentWriter, userWriter);
+ result = new State(processScripts, processStyles, useSkinning, renderKit,
+ internetResourceBuilder, componentWriter, userWriter,
+ scriptRenderer, styleRenderer, ajaxRequest);
}
}
return result;
@@ -489,39 +538,38 @@
ExternalContext externalContext = context.getExternalContext();
Map<String,Object> requestMap = externalContext.getRequestMap();
State state = (State) object;
-
- String skinStyleSheetUri = null;
- String skinExtendedStyleSheetUri = null;
+
try {
- Skin skin = SkinFactory.getInstance().getSkin(context);
- // Set default style sheet for current skin.
- skinStyleSheetUri = (String) skin.getParameter(context,
- Skin.generalStyleSheet);
- // Set default style sheet for current skin.
- skinExtendedStyleSheetUri = (String) skin.getParameter(context,
- Skin.extendedStyleSheet);
- } catch (SkinNotFoundException e) {
- log.warn("Current Skin is not found", e);
- }
+ if (state.useSkinning && extendedSkinningAllowed) {
+ ResponseWriter oldWriter = context.getResponseWriter();
+
+ try {
+ HeadResponseWriter responseWriter = state.getComponentWriter();
+ if (!state.ajaxRequest) {
+ //skinning levels aren't dynamic, page-level setting cannot be changed
+ //by AJAX request
+ responseWriter.startElement("script", null);
+ responseWriter.writeAttribute(HTML.TYPE_ATTR, "text/javascript", null);
+ responseWriter.writeText("window.RICH_FACES_SKINNING_ON=true;", null);
+ responseWriter.endElement("script");
+ }
+
+ context.setResponseWriter(responseWriter);
+
+ if (state.processScripts) {
+ InternetResource resource = state.resourceBuilder.createResource(null,
+ "/org/richfaces/renderkit/html/scripts/skinning.js");
- try {
- // Append Skin StyleSheet after a
- if (null != skinStyleSheetUri) {
- String resourceURL = context.getApplication()
- .getViewHandler().getResourceURL(context,
- skinStyleSheetUri);
- encodeResources(context, state.getStyleRenderer(),
Collections.singleton(resourceURL));
+ resource.encode(context, null);
+ }
+
+ } finally {
+ context.setResponseWriter(oldWriter);
+ }
}
- if (null != skinExtendedStyleSheetUri && extendedSkinningAllowed) {
- String resourceURL =
context.getApplication().getViewHandler().getResourceURL(context,
- skinExtendedStyleSheetUri);
- encodeResources(context, state.getStyleRenderer(),
Collections.singleton(resourceURL));
- }
-
state.getComponentWriter().endDocument();
state.getUserWriter().endDocument();
-
} catch (IOException e) {
throw new FacesException(e.getLocalizedMessage(), e);
}
Modified: trunk/framework/impl/src/main/javascript/ajaxjsf/JSFAJAX.js
===================================================================
--- trunk/framework/impl/src/main/javascript/ajaxjsf/JSFAJAX.js 2008-07-22 15:51:23 UTC
(rev 9735)
+++ trunk/framework/impl/src/main/javascript/ajaxjsf/JSFAJAX.js 2008-07-22 23:32:51 UTC
(rev 9736)
@@ -499,6 +499,10 @@
LOG.debug("append element to document");
+ for ( var j = 0; j < A4J.AJAX._headTransformers.length; j++) {
+ A4J.AJAX._headTransformers[j](script);
+ }
+
var anchor = roleAnchors[elementRole];
if (anchor && anchor.parentNode) {
anchor.parentNode.insertBefore(script, anchor);
@@ -554,6 +558,17 @@
A4J.AJAX.removeListeners = function(listener){
A4J.AJAX._listeners = [];
};
+
+//head element transformers
+A4J.AJAX.HeadElementTransformer = function(elt){
+ this.elt = elt;
+};
+
+A4J.AJAX._headTransformers = [];
+A4J.AJAX.AddHeadElementTransformer = function(listener){
+ A4J.AJAX._headTransformers.push(listener);
+};
+
// pollers timerId's
A4J.AJAX._pollers = {};
/*
Modified: trunk/framework/impl/src/main/resources/META-INF/resources-config.xml
===================================================================
--- trunk/framework/impl/src/main/resources/META-INF/resources-config.xml 2008-07-22
15:51:23 UTC (rev 9735)
+++ trunk/framework/impl/src/main/resources/META-INF/resources-config.xml 2008-07-22
23:32:51 UTC (rev 9736)
@@ -126,5 +126,9 @@
<path>org/ajax4jsf/javascript/scripts/smartposition.js</path>
<renderer class="org.ajax4jsf.resource.ScriptRenderer"/>
</resource>
-
+ <resource>
+ <name>org/richfaces/renderkit/html/scripts/skinning.js</name>
+ <path>org/richfaces/renderkit/html/scripts/skinning.js</path>
+ <renderer class="org.ajax4jsf.resource.ScriptRenderer"/>
+ </resource>
</resource-config>
Added:
trunk/framework/impl/src/main/resources/org/richfaces/renderkit/html/scripts/skinning.js
===================================================================
---
trunk/framework/impl/src/main/resources/org/richfaces/renderkit/html/scripts/skinning.js
(rev 0)
+++
trunk/framework/impl/src/main/resources/org/richfaces/renderkit/html/scripts/skinning.js 2008-07-22
23:32:51 UTC (rev 9736)
@@ -0,0 +1,62 @@
+if (window.RICH_FACES_SKINNING_ON) {
+ var mediaName = "rich-extended-skinning";
+
+ var skipNavigator = window.opera || navigator.userAgent.indexOf('AppleWebKit/')
> -1;
+ if (!skipNavigator) {
+
+ var resetMedia = function(elt) {
+ var media = elt.getAttribute('media');
+
+ if (mediaName == media) {
+ elt.removeAttribute('media');
+ }
+ };
+
+ if (!window._RICH_FACES_SKINNING_ADDED_TO_BODY) {
+ var getElementByTagName = function(elt, name) {
+ var elements;
+ try {
+ elements = elt.selectNodes(".//*[local-name()=\"" +
+ name + "\"]");
+ } catch (ex) {
+ try {
+ elements = elt.getElementsByTagName(name);
+ } catch (nf) {
+ //ok, give up, no elements found
+ }
+ }
+
+ return elements;
+ };
+
+ var f = function() {
+ var styles = getElementByTagName(document, 'link');
+ if (styles) {
+ var l = styles.length;
+ for (var i = 0; i < l; i++) {
+ var elt = styles[i];
+ resetMedia(elt);
+ }
+ }
+
+ };
+
+ if (window.addEventListener) {
+ window.addEventListener("load", f, false);
+ } else {
+ window.attachEvent("onload", f);
+ }
+
+ window._RICH_FACES_SKINNING_ADDED_TO_BODY = true;
+ }
+
+ if (!window._RICH_FACES_SKINNING_ADDED_TO_AJAX && typeof A4J !=
"undefined" && A4J.AJAX) {
+ A4J.AJAX.AddHeadElementTransformer(function (elt) {
+ if (elt.tagName && elt.tagName.toLowerCase() == 'link') {
+ resetMedia(elt);
+ }
+ });
+ window._RICH_FACES_SKINNING_ADDED_TO_AJAX = true;
+ }
+ }
+};