summaryrefslogtreecommitdiffstats
path: root/src/com/vaadin/terminal/gwt/client/CSSRule.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/vaadin/terminal/gwt/client/CSSRule.java')
-rw-r--r--src/com/vaadin/terminal/gwt/client/CSSRule.java85
1 files changed, 85 insertions, 0 deletions
diff --git a/src/com/vaadin/terminal/gwt/client/CSSRule.java b/src/com/vaadin/terminal/gwt/client/CSSRule.java
new file mode 100644
index 0000000000..eda6008c2b
--- /dev/null
+++ b/src/com/vaadin/terminal/gwt/client/CSSRule.java
@@ -0,0 +1,85 @@
+package com.vaadin.terminal.gwt.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;
+
+ public CSSRule(String selector) {
+ this.selector = selector;
+ fetchRule(selector);
+ }
+
+ // TODO how to find the right LINK-element? We should probably give the
+ // stylesheet a name.
+ private native void fetchRule(final String selector)
+ /*-{
+ this.@com.vaadin.terminal.gwt.client.CSSRule::rules = @com.vaadin.terminal.gwt.client.CSSRule::searchForRule(Lcom/google/gwt/core/client/JavaScriptObject;Ljava/lang/String;)($doc.styleSheets[1], selector);
+ }-*/;
+
+ /*
+ * 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(
+ JavaScriptObject sheet, final String selector)
+ /*-{
+ if(!$doc.styleSheets)
+ return null;
+
+ selector = selector.toLowerCase();
+
+ var allMatches = [];
+
+ 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 == 3) {
+ allMatches.unshift(@com.vaadin.terminal.gwt.client.CSSRule::searchForRule(Lcom/google/gwt/core/client/JavaScriptObject;Ljava/lang/String;)(r.styleSheet, selector));
+ } else if(r.type == 1) {
+ 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
+ }
+ }
+ }
+ }
+
+ return allMatches;
+ }-*/;
+
+ /**
+ * Returns a specific property value from this CSS rule.
+ *
+ * @param propertyName
+ * @return
+ */
+ public native String getPropertyValue(final String propertyName)
+ /*-{
+ for(var i=0; i<this.@com.vaadin.terminal.gwt.client.CSSRule::rules.length; i++){
+ var value = this.@com.vaadin.terminal.gwt.client.CSSRule::rules[i].style[propertyName];
+ if(value)
+ return value;
+ }
+ return null;
+ }-*/;
+
+ public String getSelector() {
+ return selector;
+ }
+
+}