package com.gwt.ui.client; import com.google.gwt.dom.client.EventTarget; import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.Event.NativePreviewEvent; import com.google.gwt.user.client.ui.DialogBox; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.Widget; import com.gwt.ui.client.resources.Images; /** * @author jguibert */ public class WindowPopup extends DialogBox { private FlowPanel content; private CaptionTitle captionTitle; private Image closer; private ClickHandler closeHandler; private ClickHandler saveHandler; private FlowPanel captionPanel; private boolean isCtrl = false; public WindowPopup() { super(false, true); Element td01 = getCellElement(0, 1); Widget caption = (Widget)this.getCaption(); DOM.removeChild(td01, caption.getElement()); captionPanel = new FlowPanel(); captionPanel.addStyleName("Caption-Panel"); DOM.appendChild(td01, captionPanel.getElement()); adopt(captionPanel); FlowPanel closePanel = new FlowPanel(); closePanel.addStyleName("Close-Panel"); closer = new Image(Images.IMAGES.closeWindowIcon()); closer.addStyleName("Close-Button"); closePanel.add(closer); captionPanel.add(closePanel); this.captionTitle = new CaptionTitle(); captionTitle.addStyleName("Caption-Title"); captionPanel.add(this.captionTitle); content = new FlowPanel(); setWidget(content); } static protected boolean isWidgetEvent(NativeEvent event, Widget w) { EventTarget target = event.getEventTarget(); if (Element.is(target)) { boolean t = w.getElement().isOrHasChild(Element.as(target)); return t; } return false; } @Override public void onBrowserEvent(Event event) { if (isWidgetEvent(event, closer)) { switch (event.getTypeInt()) { case Event.ONMOUSEUP: case Event.ONCLICK: if (closeHandler != null) closeHandler.onClick(null); break; } return; } super.onBrowserEvent(event); } @Override protected void onPreviewNativeEvent(NativePreviewEvent event) { super.onPreviewNativeEvent(event); switch (event.getTypeInt()) { case Event.ONKEYDOWN: if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ESCAPE) if (closeHandler != null) closeHandler.onClick(null); if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_CTRL) { isCtrl = true; } if (event.getNativeEvent().getKeyCode() == 83 && isCtrl) { if (saveHandler != null) saveHandler.onClick(null); event.cancel(); } break; case Event.ONKEYUP: if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_CTRL) { isCtrl = false; } break; default: break; } } public FlowPanel getContent() { return content; } public void setCaption(String caption) { captionTitle.setText(caption); } public void addClosehandler(ClickHandler clickHandler) { this.closeHandler = clickHandler; } public void addSaveHandler(ClickHandler clickHandler) { saveHandler = clickHandler; } private class CaptionTitle extends HTML implements Caption { } }