summaryrefslogtreecommitdiffstats
path: root/client/src/com/vaadin/client/CSSRule.java
diff options
context:
space:
mode:
authorArtur Signell <artur@vaadin.com>2012-08-29 11:21:56 +0300
committerArtur Signell <artur@vaadin.com>2012-08-29 11:21:56 +0300
commitbfbfdd51a0563d212d1e811a3eb534122847d206 (patch)
tree8fe2f3f9feda9fe3a1c22ba261c7b498718ddbfd /client/src/com/vaadin/client/CSSRule.java
parented8a1d154436a635b29a35093cc349e4a4aa2897 (diff)
downloadvaadin-framework-bfbfdd51a0563d212d1e811a3eb534122847d206.tar.gz
vaadin-framework-bfbfdd51a0563d212d1e811a3eb534122847d206.zip
Renamed com.vaadin.terminal.gwt.client to com.vaadin.client (#9432)
Diffstat (limited to 'client/src/com/vaadin/client/CSSRule.java')
-rw-r--r--client/src/com/vaadin/client/CSSRule.java132
1 files changed, 132 insertions, 0 deletions
diff --git a/client/src/com/vaadin/client/CSSRule.java b/client/src/com/vaadin/client/CSSRule.java
new file mode 100644
index 0000000000..f32458e5a4
--- /dev/null
+++ b/client/src/com/vaadin/client/CSSRule.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright 2011 Vaadin Ltd.
+ *
+ * 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 com.vaadin.client;
+
+import com.google.gwt.core.client.JavaScriptObject;
+
+/**
+ * Utility class for fetching CSS properties from DOM StyleSheets JS object.
+ */
+public class CSSRule {
+
+ private final String selector;
+ private JavaScriptObject rules = null;
+
+ /**
+ *
+ * @param selector
+ * the CSS selector to search for in the stylesheets
+ * @param deep
+ * should the search follow any @import statements?
+ */
+ public CSSRule(final String selector, final boolean deep) {
+ this.selector = selector;
+ fetchRule(selector, deep);
+ }
+
+ // TODO how to find the right LINK-element? We should probably give the
+ // stylesheet a name.
+ private native void fetchRule(final String selector, final boolean deep)
+ /*-{
+ var sheets = $doc.styleSheets;
+ for(var i = 0; i < sheets.length; i++) {
+ var sheet = sheets[i];
+ if(sheet.href && sheet.href.indexOf("VAADIN/themes")>-1) {
+ // $entry not needed as function is not exported
+ this.@com.vaadin.client.CSSRule::rules = @com.vaadin.client.CSSRule::searchForRule(Lcom/google/gwt/core/client/JavaScriptObject;Ljava/lang/String;Z)(sheet, selector, deep);
+ return;
+ }
+ }
+ this.@com.vaadin.client.CSSRule::rules = [];
+ }-*/;
+
+ /*
+ * Loops through all current style rules and collects all matching to
+ * 'rules' array. The array is reverse ordered (last one found is first).
+ */
+ private static native JavaScriptObject searchForRule(
+ final JavaScriptObject sheet, final String selector,
+ final boolean deep)
+ /*-{
+ if(!$doc.styleSheets)
+ return null;
+
+ selector = selector.toLowerCase();
+
+ var allMatches = [];
+
+ // IE handles imported sheet differently
+ if(deep && sheet.imports && sheet.imports.length > 0) {
+ for(var i=0; i < sheet.imports.length; i++) {
+ // $entry not needed as function is not exported
+ var imports = @com.vaadin.client.CSSRule::searchForRule(Lcom/google/gwt/core/client/JavaScriptObject;Ljava/lang/String;Z)(sheet.imports[i], selector, deep);
+ allMatches.concat(imports);
+ }
+ }
+
+ var theRules = new Array();
+ if (sheet.cssRules)
+ theRules = sheet.cssRules
+ else if (sheet.rules)
+ theRules = sheet.rules
+
+ var j = theRules.length;
+ for(var i=0; i<j; i++) {
+ var r = theRules[i];
+ if(r.type == 1 || sheet.imports) {
+ var selectors = r.selectorText.toLowerCase().split(",");
+ var n = selectors.length;
+ for(var m=0; m<n; m++) {
+ if(selectors[m].replace(/^\s+|\s+$/g, "") == selector) {
+ allMatches.unshift(r);
+ break; // No need to loop other selectors for this rule
+ }
+ }
+ } else if(deep && r.type == 3) {
+ // Search @import stylesheet
+ // $entry not needed as function is not exported
+ var imports = @com.vaadin.client.CSSRule::searchForRule(Lcom/google/gwt/core/client/JavaScriptObject;Ljava/lang/String;Z)(r.styleSheet, selector, deep);
+ allMatches = allMatches.concat(imports);
+ }
+ }
+
+ return allMatches;
+ }-*/;
+
+ /**
+ * Returns a specific property value from this CSS rule.
+ *
+ * @param propertyName
+ * camelCase CSS property name
+ * @return the value of the property as a String
+ */
+ public native String getPropertyValue(final String propertyName)
+ /*-{
+ var j = this.@com.vaadin.client.CSSRule::rules.length;
+ for(var i=0; i<j; i++) {
+ // $entry not needed as function is not exported
+ var value = this.@com.vaadin.client.CSSRule::rules[i].style[propertyName];
+ if(value)
+ return value;
+ }
+ return null;
+ }-*/;
+
+ public String getSelector() {
+ return selector;
+ }
+
+}