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 <link> 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 * <link> 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 <link> 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 * <link> 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 }