From 2c96704d94f8be83977fa5cf2350509b1b914f70 Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Mon, 27 Dec 2010 12:20:32 +0000 Subject: [PATCH] #6035 - Icons are no longer transparent in MenuBar in IE6 #6204 - IE6 png transparency fix depends on Runo theme svn changeset:16654/svn branch:6.5 --- .../gwt/client/ApplicationConnection.java | 2 +- src/com/vaadin/terminal/gwt/client/Util.java | 19 +++++---- .../terminal/gwt/client/ui/VMenuBar.java | 42 +++++++++++++++++-- 3 files changed, 50 insertions(+), 13 deletions(-) diff --git a/src/com/vaadin/terminal/gwt/client/ApplicationConnection.java b/src/com/vaadin/terminal/gwt/client/ApplicationConnection.java index a06ed73ed9..04d75ca187 100755 --- a/src/com/vaadin/terminal/gwt/client/ApplicationConnection.java +++ b/src/com/vaadin/terminal/gwt/client/ApplicationConnection.java @@ -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); } } diff --git a/src/com/vaadin/terminal/gwt/client/Util.java b/src/com/vaadin/terminal/gwt/client/Util.java index b417663b3b..fcc2576068 100644 --- a/src/com/vaadin/terminal/gwt/client/Util.java +++ b/src/com/vaadin/terminal/gwt/client/Util.java @@ -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); + } } /** diff --git a/src/com/vaadin/terminal/gwt/client/ui/VMenuBar.java b/src/com/vaadin/terminal/gwt/client/ui/VMenuBar.java index 26ca48017d..73510fbe02 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VMenuBar.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VMenuBar.java @@ -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 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 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")); + } + } + } -- 2.39.5