From: Jouni Koivuviita Date: Thu, 3 Jul 2008 09:04:13 +0000 (+0000) Subject: Implemented a shadow for ToolkitOverlay and applied it to most overlay elements. X-Git-Tag: 6.7.0.beta1~4507 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=b0d8795098c9de54af7821ca3f40538357d233b7;p=vaadin-framework.git Implemented a shadow for ToolkitOverlay and applied it to most overlay elements. svn changeset:5016/svn branch:trunk --- diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/ContextMenu.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/ContextMenu.java index b3c14ba321..b97dafee5b 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/ContextMenu.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/ContextMenu.java @@ -27,7 +27,7 @@ public class ContextMenu extends ToolkitOverlay { * to be set as an owner of menu */ public ContextMenu() { - super(true); + super(true, false, true); setWidget(menu); setStyleName("i-contextmenu"); } @@ -99,5 +99,19 @@ public class ContextMenu extends ToolkitOverlay { super.onPopupClosed(sender, autoClosed); ContextMenu.this.hide(); } + + /*public void onBrowserEvent(Event event) { + // Remove current selection when mouse leaves + if (DOM.eventGetType(event) == Event.ONMOUSEOUT) { + Element to = DOM.eventGetToElement(event); + if (!DOM.isOrHasChild(getElement(), to)) { + DOM.setElementProperty( + super.getSelectedItem().getElement(), "className", + super.getSelectedItem().getStylePrimaryName()); + } + } + + super.onBrowserEvent(event); + }*/ } } diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IFilterSelect.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IFilterSelect.java index 05c05b7f35..eb16055fd6 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IFilterSelect.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IFilterSelect.java @@ -105,7 +105,7 @@ public class IFilterSelect extends Composite implements Paintable, Field, private long lastAutoClosed; SuggestionPopup() { - super(true); + super(true, false, true); menu = new SuggestionMenu(); setWidget(menu); setStyleName(CLASSNAME + "-suggestpopup"); diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IPopupCalendar.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IPopupCalendar.java index 307519c713..63af2f75d6 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IPopupCalendar.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IPopupCalendar.java @@ -37,7 +37,7 @@ public class IPopupCalendar extends ITextualDate implements Paintable, Field, add(calendarToggle); calendar = new CalendarPanel(this); - popup = new ToolkitOverlay(true, true); + popup = new ToolkitOverlay(true, true, true); popup.setStyleName(IDateField.CLASSNAME + "-popup"); popup.setWidget(calendar); popup.addPopupListener(this); @@ -79,12 +79,14 @@ public class IPopupCalendar extends ITextualDate implements Paintable, Field, - h - calendarToggle.getOffsetHeight() - 30; l += calendarToggle.getOffsetWidth(); } - popup.setPopupPosition(l, t - + calendarToggle.getOffsetHeight() + 2); - + // fix size popup.setWidth(w + "px"); popup.setHeight(h + "px"); + + popup.setPopupPosition(l, t + + calendarToggle.getOffsetHeight() + 2); + setFocus(true); } }); diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/ToolkitOverlay.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/ToolkitOverlay.java index a56cd245b0..8c756cb744 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/ToolkitOverlay.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/ToolkitOverlay.java @@ -5,7 +5,11 @@ package com.itmill.toolkit.terminal.gwt.client.ui; import com.google.gwt.user.client.DOM; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.PopupListener; import com.google.gwt.user.client.ui.PopupPanel; +import com.google.gwt.user.client.ui.RootPanel; +import com.google.gwt.user.client.ui.Widget; /** * In Toolkit UI this Overlay should always be used for all elements that @@ -16,6 +20,8 @@ public class ToolkitOverlay extends PopupPanel { public static final int Z_INDEX = 20000; + private Shadow shadow; + public ToolkitOverlay() { super(); adjustZIndex(); @@ -31,8 +37,104 @@ public class ToolkitOverlay extends PopupPanel { adjustZIndex(); } + public ToolkitOverlay(boolean autoHide, boolean modal, boolean showShadow) { + super(autoHide, modal); + if (showShadow) { + shadow = new Shadow(this); + } + adjustZIndex(); + } + private void adjustZIndex() { - DOM.setStyleAttribute(getElement(), "zIndex", "" + (Z_INDEX)); + DOM.setStyleAttribute(getElement(), "zIndex", "" + Z_INDEX); + } + + public void setPopupPosition(int left, int top) { + super.setPopupPosition(left, top); + if (shadow != null) { + shadow.updateSizeAndPosition(); + } + } + + public void show() { + super.show(); + if (shadow != null) { + DOM.appendChild(RootPanel.get().getElement(), shadow.getElement()); + } + } + + public void setShadowOffset(int top, int right, int bottom, int left) { + if(shadow != null) { + shadow.setOffset(top, right, bottom, left); + } + } + + private class Shadow extends HTML { + + private static final String CLASSNAME = "i-shadow"; + + private static final String HTML = "
"; + + private Widget overlay; + + // Amount of shadow on each side. + private int top = 2; + private int right = 5; + private int bottom = 6; + private int left = 5; + + public Shadow(ToolkitOverlay overlay) { + super(HTML); + setStyleName(CLASSNAME); + DOM.setStyleAttribute(getElement(), "position", "absolute"); + + this.overlay = overlay; + overlay.addPopupListener(new PopupListener() { + public void onPopupClosed(PopupPanel sender, boolean autoClosed) { + DOM.removeChild(RootPanel.get().getElement(), shadow.getElement()); + } + }); + } + + public void updateSizeAndPosition() { + // Calculate proper z-index + String zIndex = DOM.getStyleAttribute(overlay.getElement(), + "zIndex"); + if (zIndex == null) { + zIndex = "" + Z_INDEX; + } + + // Calculate position and size + int x = overlay.getAbsoluteLeft() - left; + int y = overlay.getAbsoluteTop() - top; + int width = overlay.getOffsetWidth() + left + right; + int height = overlay.getOffsetHeight() + top + bottom; + if (width < 0) { + width = 0; + } + if (height < 0) { + height = 0; + } + + // Update correct values + DOM.setStyleAttribute(shadow.getElement(), "zIndex", "" + + (Integer.parseInt(zIndex) - 1)); + DOM.setStyleAttribute(getElement(), "width", width + "px"); + DOM.setStyleAttribute(getElement(), "height", height + "px"); + DOM.setStyleAttribute(getElement(), "top", y + "px"); + DOM.setStyleAttribute(getElement(), "left", x + "px"); + } + + public void setOffset(int top, int right, int bottom, int left) { + this.top = top; + this.right = right; + this.bottom = bottom; + this.left = left; + if(overlay.isAttached()) { + updateSizeAndPosition(); + } + } + } }