]> source.dussan.org Git - vaadin-framework.git/commitdiff
#6035 - Icons are no longer transparent in MenuBar in IE6
authorArtur Signell <artur.signell@itmill.com>
Mon, 27 Dec 2010 12:20:32 +0000 (12:20 +0000)
committerArtur Signell <artur.signell@itmill.com>
Mon, 27 Dec 2010 12:20:32 +0000 (12:20 +0000)
#6204 - IE6 png transparency fix depends on Runo theme

svn changeset:16654/svn branch:6.5

src/com/vaadin/terminal/gwt/client/ApplicationConnection.java
src/com/vaadin/terminal/gwt/client/Util.java
src/com/vaadin/terminal/gwt/client/ui/VMenuBar.java

index a06ed73ed9760b8f9981ef0585bdf72e251bb13f..04d75ca18756b97f0d82893b950b3b5f9fcca605 100755 (executable)
@@ -2267,7 +2267,7 @@ public class ApplicationConnection {
     public void addPngFix(Element el) {
         BrowserInfo b = BrowserInfo.get();
         if (b.isIE6()) {
-            Util.addPngFix(el, getThemeUri() + "/../runo/common/img/blank.gif");
+            Util.addPngFix(el);
         }
     }
 
index b417663b3bcd6181dc2e2c6d2766365edd2fe56c..fcc257606851ff11f7327d70220f9a9f7508e8be 100644 (file)
@@ -10,6 +10,7 @@ import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
 
+import com.google.gwt.core.client.GWT;
 import com.google.gwt.core.client.Scheduler;
 import com.google.gwt.dom.client.DivElement;
 import com.google.gwt.dom.client.Document;
@@ -250,17 +251,15 @@ public class Util {
      * 
      * @param el
      *            IMG element
-     * @param blankImageUrl
-     *            URL to transparent one-pixel gif
      */
-    public native static void addPngFix(Element el, String blankImageUrl)
+    public native static void addPngFix(Element el)
     /*-{
         el.attachEvent("onload", function() {
-            @com.vaadin.terminal.gwt.client.Util::doPngFix(Lcom/google/gwt/user/client/Element;Ljava/lang/String;)(el,blankImageUrl);
+            @com.vaadin.terminal.gwt.client.Util::doIE6PngFix(Lcom/google/gwt/user/client/Element;)(el);
         },false);
     }-*/;
 
-    public native static void doPngFix(Element el, String blankImageUrl)
+    private native static void doPngFix(Element el, String blankImageUrl)
     /*-{
         var src = el.src;
         if (src.indexOf(".png") < 1) return;
@@ -281,10 +280,12 @@ public class Util {
         el.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+src+"', sizingMethod='crop')";  
        }-*/;
 
-    public static void doIE6PngFix(Element el, ApplicationConnection ac) {
-        String blankImageUrl = ac.getThemeUri()
-                + "/../runo/common/img/blank.gif";
-        doPngFix(el, blankImageUrl);
+    public static void doIE6PngFix(Element el) {
+        String blankImageUrl = GWT.getModuleBaseURL() + "ie6pngfix/blank.gif";
+        String src = el.getAttribute("src");
+        if (src != null && !src.equals(blankImageUrl)) {
+            doPngFix(el, blankImageUrl);
+        }
     }
 
     /**
index 26ca48017d46a08da6ea2e80fa6a1a1131ebdc4f..73510fbe02083a052c23eab91bdda5604dc3f220 100644 (file)
@@ -402,8 +402,7 @@ public class VMenuBar extends SimpleFocusablePanel implements Paintable,
         // Handle onload events (icon loaded, size changes)
         if (DOM.eventGetType(e) == Event.ONLOAD) {
             if (BrowserInfo.get().isIE6()) {
-                Util.doIE6PngFix((Element) Element.as(e.getEventTarget()),
-                        client);
+                Util.doIE6PngFix((Element) Element.as(e.getEventTarget()));
             }
             VMenuBar parent = getParentMenu();
             if (parent != null) {
@@ -766,7 +765,7 @@ public class VMenuBar extends SimpleFocusablePanel implements Paintable,
 
             sinkEvents(VTooltip.TOOLTIP_EVENTS);
 
-            // Sink the onload event for an icon (if it exists). The onload
+            // Sink the onload event for any icons. The onload
             // events are handled by the parent VMenuBar.
             NodeList<com.google.gwt.dom.client.Element> imgElements = getElement()
                     .getElementsByTagName("img");
@@ -981,6 +980,16 @@ public class VMenuBar extends SimpleFocusablePanel implements Paintable,
                     } else {
                         widthAvailable = diff;
                     }
+
+                    if (BrowserInfo.get().isIE6()) {
+                        /*
+                         * Handle transparency for IE6 here as we cannot
+                         * implement it in CustomMenuItem.onAttach because
+                         * onAttach is never called for CustomMenuItem due to an
+                         * invalid component hierarchy (#6203)...
+                         */
+                        reloadImages();
+                    }
                 }
             }
             if (collapsedRootItems.getItems().size() > 0) {
@@ -1375,4 +1384,31 @@ public class VMenuBar extends SimpleFocusablePanel implements Paintable,
         }
         return null;
     }
+
+    @Override
+    protected void onLoad() {
+        super.onLoad();
+        if (BrowserInfo.get().isIE6()) {
+            reloadImages();
+        }
+    }
+
+    /**
+     * Force a new onload event for all images. Used only for IE6 to deal with
+     * PNG transparency.
+     */
+    private void reloadImages() {
+
+        NodeList<com.google.gwt.dom.client.Element> imgElements = getElement()
+                .getElementsByTagName("img");
+        for (int i = 0; i < imgElements.getLength(); i++) {
+            Element e = (Element) imgElements.getItem(i);
+
+            // IE6 fires onload events for the icons before the listener
+            // is attached (or never). Updating the src force another
+            // onload event
+            e.setAttribute("src", e.getAttribute("src"));
+        }
+    }
+
 }