1 16 package com.google.gwt.user.client.ui; 17 18 import com.google.gwt.core.client.GWT; 19 import com.google.gwt.user.client.DOM; 20 import com.google.gwt.user.client.Element; 21 import com.google.gwt.user.client.Event; 22 import com.google.gwt.user.client.EventPreview; 23 import com.google.gwt.user.client.Window; 24 import com.google.gwt.user.client.ui.impl.PopupImpl; 25 26 42 public class PopupPanel extends SimplePanel implements SourcesPopupEvents, 43 EventPreview { 44 45 private static final PopupImpl impl = (PopupImpl) GWT.create(PopupImpl.class); 46 47 private boolean autoHide, modal, showing; 48 49 private String desiredHeight; 51 private String desiredWidth; 52 53 private PopupListenerCollection popupListeners; 54 55 59 public PopupPanel() { 60 super(impl.createElement()); 61 } 62 63 69 public PopupPanel(boolean autoHide) { 70 this(); 71 this.autoHide = autoHide; 72 } 73 74 82 public PopupPanel(boolean autoHide, boolean modal) { 83 this(autoHide); 84 this.modal = modal; 85 } 86 87 public void addPopupListener(PopupListener listener) { 88 if (popupListeners == null) { 89 popupListeners = new PopupListenerCollection(); 90 } 91 popupListeners.add(listener); 92 } 93 94 101 public void center() { 102 if (!showing) { 105 throw new IllegalStateException ("PopupPanel must be shown before it may " 106 + "be centered."); 107 } 108 109 int left = (Window.getClientWidth() - getOffsetWidth()) / 2; 110 int top = (Window.getClientHeight() - getOffsetHeight()) / 2; 111 setPopupPosition(Window.getScrollLeft() + left, Window.getScrollTop() + top); 112 } 113 114 119 public int getPopupLeft() { 120 return DOM.getElementPropertyInt(getElement(), "offsetLeft"); 121 } 122 123 128 public int getPopupTop() { 129 return DOM.getElementPropertyInt(getElement(), "offsetTop"); 130 } 131 132 public String getTitle() { 133 return DOM.getElementProperty(getContainerElement(), "title"); 134 } 135 136 139 public void hide() { 140 hide(false); 141 } 142 143 public boolean onEventPreview(Event event) { 144 145 Element target = DOM.eventGetTarget(event); 146 boolean eventTargetsPopup = DOM.isOrHasChild(getElement(), target); 147 148 int type = DOM.eventGetType(event); 149 switch (type) { 150 case Event.ONKEYDOWN: { 151 if (eventTargetsPopup) { 152 return onKeyDownPreview((char) DOM.eventGetKeyCode(event), 153 KeyboardListenerCollection.getKeyboardModifiers(event)); 154 } else { 155 return !modal; 156 } 157 } 158 case Event.ONKEYUP: { 159 if (eventTargetsPopup) { 160 return onKeyUpPreview((char) DOM.eventGetKeyCode(event), 161 KeyboardListenerCollection.getKeyboardModifiers(event)); 162 } else { 163 return !modal; 164 } 165 } 166 case Event.ONKEYPRESS: { 167 if (eventTargetsPopup) { 168 return onKeyPressPreview((char) DOM.eventGetKeyCode(event), 169 KeyboardListenerCollection.getKeyboardModifiers(event)); 170 } else { 171 return !modal; 172 } 173 } 174 175 case Event.ONMOUSEDOWN: 176 case Event.ONMOUSEUP: 177 case Event.ONMOUSEMOVE: 178 case Event.ONCLICK: 179 case Event.ONDBLCLICK: { 180 if (DOM.getCaptureElement() != null) { 183 return true; 184 } 185 186 if (!eventTargetsPopup && autoHide && (type == Event.ONMOUSEDOWN)) { 190 hide(true); 191 return true; 192 } 193 194 break; 195 } 196 197 case Event.ONFOCUS: { 198 if (modal && !eventTargetsPopup && (target != null)) { 199 blur(target); 200 return false; 201 } 202 } 203 } 204 205 return !modal || eventTargetsPopup; 206 } 207 208 217 public boolean onKeyDownPreview(char key, int modifiers) { 218 return true; 219 } 220 221 230 public boolean onKeyPressPreview(char key, int modifiers) { 231 return true; 232 } 233 234 243 public boolean onKeyUpPreview(char key, int modifiers) { 244 return true; 245 } 246 247 public void removePopupListener(PopupListener listener) { 248 if (popupListeners != null) { 249 popupListeners.remove(listener); 250 } 251 } 252 253 public void setHeight(String height) { 254 desiredHeight = height; 255 maybeUpdateSize(); 256 if (height.length() == 0) { 258 desiredHeight = null; 259 } 260 } 261 262 269 public void setPopupPosition(int left, int top) { 270 if (left < 0) { 275 left = 0; 276 } 277 if (top < 0) { 278 top = 0; 279 } 280 281 Element elem = getElement(); 285 DOM.setStyleAttribute(elem, "left", left + "px"); 286 DOM.setStyleAttribute(elem, "top", top + "px"); 287 } 288 289 public void setTitle(String title) { 290 Element containerElement = getContainerElement(); 291 if (title == null || title.length() == 0) { 292 DOM.removeElementAttribute(containerElement, "title"); 293 } else { 294 DOM.setElementAttribute(containerElement, "title", title); 295 } 296 } 297 298 304 public void setVisible(boolean visible) { 305 DOM.setStyleAttribute(getElement(), "visibility", visible ? "visible" 310 : "hidden"); 311 312 impl.setVisible(getElement(), visible); 315 } 316 317 public void setWidget(Widget w) { 318 super.setWidget(w); 319 maybeUpdateSize(); 320 } 321 322 public void setWidth(String width) { 323 desiredWidth = width; 324 maybeUpdateSize(); 325 if (width.length() == 0) { 327 desiredWidth = null; 328 } 329 } 330 331 334 public void show() { 335 if (showing) { 336 return; 337 } 338 showing = true; 339 DOM.addEventPreview(this); 340 341 RootPanel.get().add(this); 342 DOM.setStyleAttribute(getElement(), "position", "absolute"); 343 impl.onShow(getElement()); 344 } 345 346 protected Element getContainerElement() { 347 return impl.getContainerElement(getElement()); 348 } 349 350 protected Element getStyleElement() { 351 return impl.getContainerElement(getElement()); 352 } 353 354 359 protected void onDetach() { 360 DOM.removeEventPreview(this); 361 super.onDetach(); 362 } 363 364 369 private native void blur(Element elt) ; 374 375 private void hide(boolean autoClosed) { 376 if (!showing) { 377 return; 378 } 379 showing = false; 380 381 RootPanel.get().remove(this); 382 impl.onHide(getElement()); 383 if (popupListeners != null) { 384 popupListeners.firePopupClosed(this, autoClosed); 385 } 386 } 387 388 394 private void maybeUpdateSize() { 395 Widget w = getWidget(); 396 if (w != null) { 397 if (desiredHeight != null) { 398 w.setHeight(desiredHeight); 399 } 400 if (desiredWidth != null) { 401 w.setWidth(desiredWidth); 402 } 403 } 404 } 405 } 406 | Popular Tags |