/** * Copyright 2014 55 Minutes (http://www.55minutes.com) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package fiftyfive.wicket.css; import java.io.Serializable; import java.util.Arrays; import java.util.List; import org.apache.wicket.Component; import org.apache.wicket.behavior.Behavior; import org.apache.wicket.markup.html.IHeaderResponse; import org.apache.wicket.request.resource.ResourceReference; /** * This class contains static methods for injecting conditional stylesheet * references into the HTML header. These methods will create markup like this: * <pre class="example"> * <!--[if condition]> * <link rel="stylesheet" type="text/css" href="..." /> * <![endif]--></pre> * <p> * In non-Internet Explorer browsers, this stylesheet reference will be * ignored. But in IE, the stylesheet will be loaded as long as the * <code>condition</code> is met. For example, if the condition is * <code>IE 7</code>, the stylesheet will be loaded only in IE7 browsers. * Another example: <code>gte IE 7</code> will load in browsers IE7 or greater. * <p> * Here's how you might use it in your Wicket page: * <pre class="example"> * // Add a <link> to the ie-7.css stylesheet for IE7 browsers only * add(InternetExplorerCss.getConditionalHeaderContribution("IE 7", "styles/ie-7.css"));</pre> * * @see <a href="http://msdn.microsoft.com/en-us/library/ms537512%28VS.85%29.aspx">MSDN Reference</a> */ public abstract class InternetExplorerCss extends Behavior { /** * Creates a Wicket HeaderContributor for the specified stylesheet. * The stylesheet will only load in Internet Explorer versions that * meet the specified condition. * * @param condition The IE version for which this stylesheet applies. * Examples: "IE 7", "gte IE 7". * @param cssReference A reference to the stylesheet. * * @return A HeaderContributor that should be added to your page. Adding * it to the page will cause the appropriate markup to be * emitted in the HTML header. */ public static InternetExplorerCss getConditionalHeaderContribution ( final String condition, final ResourceReference cssReference ) { return getConditionalHeaderContribution(condition, cssReference, null); } /** * Creates a Wicket HeaderContributor for the specified stylesheet and * media type. * The stylesheet will only load in Internet Explorer versions that * meet the specified condition. * * @param condition The IE version for which this stylesheet applies. * Examples: "IE 7", "gte IE 7". * @param cssReference A reference to the stylesheet. * @param media The CSS media type, like "screen" or "print". * * @return A HeaderContributor that should be added to your page. Adding * it to the page will cause the appropriate markup to be * emitted in the HTML header. */ public static InternetExplorerCss getConditionalHeaderContribution ( final String condition, final ResourceReference cssReference, final String media ) { List<Serializable> token = Arrays.asList( condition, cssReference, media ); return new InternetExplorerCss(condition, token) { protected void doLinkRender(IHeaderResponse response) { response.renderCSSReference(cssReference, media); } }; } /** * Creates a Wicket HeaderContributor for the specified stylesheet. * The stylesheet will only load in Internet Explorer versions that * meet the specified condition. * * @param condition The IE version for which this stylesheet applies. * Examples: "IE 7", "gte IE 7". * @param contextRelativeUri The URI to the stylesheet. If starting with * "/", "http:" or "https:", the URI will be * emitted as-is. Otherwise the URI is prepended * with the context path to make it absolute. * * @return A HeaderContributor that should be added to your page. Adding * it to the page will cause the appropriate markup to be * emitted in the HTML header. */ public static InternetExplorerCss getConditionalHeaderContribution( final String condition, final String contextRelativeUri ) { return getConditionalHeaderContribution( condition, contextRelativeUri, null ); } /** * Creates a Wicket HeaderContributor for the specified stylesheet and * media type. * The stylesheet will only load in Internet Explorer versions that * meet the specified condition. * * @param condition The IE version for which this stylesheet applies. * Examples: "IE 7", "gte IE 7". * @param contextRelativeUri The URI to the stylesheet. If starting with * "/", "http:" or "https:", the URI will be * emitted as-is. Otherwise the URI is modified * so that it resolves relative to the context * path (/app-name). * @param media The CSS media type, like "screen" or "print". * * @return A HeaderContributor that should be added to your page. Adding * it to the page will cause the appropriate markup to be * emitted in the HTML header. */ public static InternetExplorerCss getConditionalHeaderContribution( final String condition, final String contextRelativeUri, final String media ) { List<String> token = Arrays.asList( condition, contextRelativeUri, media ); return new InternetExplorerCss(condition, token) { protected void doLinkRender(IHeaderResponse response) { response.renderCSSReference(contextRelativeUri, media); } }; } private String condition; private List<? extends Serializable> token; /** * Internal use only. */ protected InternetExplorerCss(String condition, List<? extends Serializable> token) { this.condition = condition; this.token = token; } /** * Renders the conditional Internet Explorer comment, delegating to * {@link #doLinkRender} to render the actual link element. */ @Override public void renderHead(Component comp, IHeaderResponse response) { if(!response.wasRendered(this.token)) { response.getResponse().write(String.format( "<!--[if %s]>%n", this.condition )); doLinkRender(response); response.getResponse().write(String.format("<![endif]-->%n")); response.markRendered(this.token); } } /** * Override to render the stylesheet link element. */ protected abstract void doLinkRender(IHeaderResponse response); }