    001    // Copyright 2010, 2011 The Apache Software Foundation
    002    //
    003    // Licensed under the Apache License, Version 2.0 (the "License");
    004    // you may not use this file except in compliance with the License.
    005    // You may obtain a copy of the License at
    006    //
    007    // http://www.apache.org/licenses/LICENSE-2.0
    008    //
    009    // Unless required by applicable law or agreed to in writing, software
    010    // distributed under the License is distributed on an "AS IS" BASIS,
    011    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    012    // See the License for the specific language governing permissions and
    013    // limitations under the License.
    014
    015    package org.apache.tapestry5.services.javascript;
    016
    017    import org.apache.tapestry5.internal.TapestryInternalUtils;
    018
    019    /**
    020     * Provides options to describe options associated with importing a stylesheet onto a page.  Stylesheet options
    021     * are immutable.
    022     *
    023     * @since 5.2.0
    024     */
    025    public final class StylesheetOptions
    026    {
    027        /**
    028         * The media associated with this stylesheet, i.e., "print". Becomes the media attribute
    029         * of the &lt;link&gt; tag. May be null.
    030         */
    031        public final String media;
    032
    033        /**
    034         * The Internet Explorer condition associated with the link. When non-blank, the
    035         * &lt;link&gt; element will be written inside a specially formatted comment interpreted
    036         * by Internet Explorer. Usually null, and only used for full page renders (not partial page renders).
    037         *
    038         * @see <a href="http://en.wikipedia.org/wiki/Conditional_comment">http://en.wikipedia.org/wiki/Conditional_comment</a>
    039         */
    040        public final String condition;
    041
    042        /**
    043         * If true, then this stylesheet is the insertion point for Ajax operations; any added CSS links will be inserted before this link. Only at most
    044         * one CSS link should be the insertion point.     Only used for full page renders (not partial page renders). When this is true, the {@code <link>} element's
    045         * ref attribute is wrtten out as "stylesheet t-ajax-insertion-point".
    046         */
    047        public boolean ajaxInsertionPoint;
    048
    049        /**
    050         * Returns a new options object with media as null (that is, unspecified), no condition, and not the Ajax insertion point.
    051         */
    052        public StylesheetOptions()
    053        {
    054            this(null);
    055        }
    056
    057        public StylesheetOptions(String media)
    058        {
    059            this(media, null);
    060        }
    061
    062        /**
    063         * @deprecated In 5.3, may be removed in a later release. Use {@link #StylesheetOptions(String)} and {@link #withCondition(String)}} instead.
    064         */
    065        public StylesheetOptions(String media, String condition)
    066        {
    067            this(media, condition, false);
    068        }
    069
    070        private StylesheetOptions(String media, String condition, boolean ajaxInsertionPoint)
    071        {
    072            this.media = media;
    073            this.condition = condition;
    074            this.ajaxInsertionPoint = ajaxInsertionPoint;
    075        }
    076
    077        /**
    078         * Returns a new options object with the indicated {@linkplain #condition Internet Explorer condition}. @since 5.3
    079         */
    080        public StylesheetOptions withCondition(String condition)
    081        {
    082            return new StylesheetOptions(media, condition, ajaxInsertionPoint);
    083        }
    084
    085        /**
    086         * Returns a new options object with the {@link #ajaxInsertionPoint} flag set to true.
    087         */
    088        public StylesheetOptions asAjaxInsertionPoint()
    089        {
    090            return new StylesheetOptions(media, condition, true);
    091        }
    092
    093        /**
    094         * The media associated with this stylesheet, i.e., "print". Becomes the media attribute
    095         * of the &lt;link&gt; tag. May be null.
    096         *
    097         * @deprecated in 5.3, may be removed in a later release, use the {@link #media} field instead
    098         */
    099        public String getMedia()
    100        {
    101            return media;
    102        }
    103
    104        /**
    105         * The Internet Explorer condition associated with the link. When non-blank, the
    106         * &lt;link&gt; element will be written inside a specially formatted comment interpreted
    107         * by Internet Explorer. Usually null.
    108         *
    109         * @see <a href="http://en.wikipedia.org/wiki/Conditional_comment">http://en.wikipedia.org/wiki/Conditional_comment</a>
    110         * @deprecated in 5.3, may be removed in a later release, use the {@link #condition} field instead
    111         */
    112        public String getCondition()
    113        {
    114            return condition;
    115        }
    116
    117        @Override
    118        public String toString()
    119        {
    120            StringBuilder builder = new StringBuilder("StyleSheetOptions[");
    121
    122            String sep = "";
    123
    124            if (media != null)
    125            {
    126                builder.append("media=").append(media);
    127                sep = " ";
    128            }
    129
    130            if (condition != null)
    131            {
    132                builder.append(sep).append("condition=").append(condition);
    133                sep = " ";
    134            }
    135
    136            if (ajaxInsertionPoint)
    137            {
    138                builder.append(sep).append("ajaxInsertionPoint=true");
    139                sep = " ";
    140            }
    141
    142            return builder.append("]").toString();
    143        }
    144
    145        @Override
    146        public boolean equals(Object obj)
    147        {
    148            if (obj == this)
    149                return true;
    150
    151            if (obj == null || !(obj instanceof StylesheetOptions))
    152                return false;
    153
    154            StylesheetOptions sso = (StylesheetOptions) obj;
    155
    156            return ajaxInsertionPoint == sso.ajaxInsertionPoint && TapestryInternalUtils.isEqual(media, sso.media)
    157                    && TapestryInternalUtils.isEqual(condition, sso.condition);
    158        }
    159    }