From 9e91339f81a1c288c1be5b564e81c72cb01b74fd Mon Sep 17 00:00:00 2001 From: Jouni Koivuviita Date: Wed, 26 May 2010 09:31:02 +0000 Subject: [PATCH] Improved CSSRule helper class (not really used anywhere). svn changeset:13368/svn branch:6.4 --- .../vaadin/terminal/gwt/client/CSSRule.java | 101 +++++++++++------- 1 file changed, 63 insertions(+), 38 deletions(-) diff --git a/src/com/vaadin/terminal/gwt/client/CSSRule.java b/src/com/vaadin/terminal/gwt/client/CSSRule.java index d50f7ce21b..c3cebaba6b 100644 --- a/src/com/vaadin/terminal/gwt/client/CSSRule.java +++ b/src/com/vaadin/terminal/gwt/client/CSSRule.java @@ -13,16 +13,30 @@ public class CSSRule { private final String selector; private JavaScriptObject rules = null; - public CSSRule(String selector) { + /** + * + * @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); + 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) - /*-{ - 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); + 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) { + this.@com.vaadin.terminal.gwt.client.CSSRule::rules = @com.vaadin.terminal.gwt.client.CSSRule::searchForRule(Lcom/google/gwt/core/client/JavaScriptObject;Ljava/lang/String;Z)(sheet, selector, deep); + return; + } + } + this.@com.vaadin.terminal.gwt.client.CSSRule::rules = []; }-*/; /* @@ -30,38 +44,48 @@ public class CSSRule { * '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) + final JavaScriptObject sheet, final String selector, + final boolean deep) /*-{ + if(!$doc.styleSheets) return null; - - selector = selector.toLowerCase(); - - var allMatches = []; - - var theRules = new Array(); - if (sheet.cssRules) + + selector = selector.toLowerCase(); + + var allMatches = []; + + // IE handles imported sheet differently + if(deep && sheet.imports.length > 0) { + for(var i=0; i < sheet.imports.length; i++) { + var imports = @com.vaadin.terminal.gwt.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) + else if (sheet.rules) theRules = sheet.rules - + var j = theRules.length; for(var i=0; i