package fr.lteconsulting.hexa.client.ui.dialog; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.Style.Position; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.MouseDownEvent; import com.google.gwt.event.dom.client.MouseDownHandler; import com.google.gwt.event.dom.client.MouseMoveEvent; import com.google.gwt.event.dom.client.MouseMoveHandler; import com.google.gwt.event.dom.client.MouseUpEvent; import com.google.gwt.event.dom.client.MouseUpHandler; import com.google.gwt.event.logical.shared.CloseEvent; import com.google.gwt.event.logical.shared.CloseHandler; import com.google.gwt.event.logical.shared.HasCloseHandlers; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.resources.client.ImageResource; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.ui.ComplexPanel; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.Widget; import fr.lteconsulting.hexa.client.ui.dialog.DialogBoxBuilder.DialogBox; import fr.lteconsulting.hexa.client.ui.resources.image.ImageResources; class DialogBoxForNormalWidget extends ComplexPanel implements DialogBox, HasCloseHandlers<DialogBox> { private boolean isDisplayed = false; private Element main; private Element title; private Element close; private Element content; private boolean isAutoHide; public DialogBoxForNormalWidget( String titleText, Widget contentWidget ) { Element glass = Document.get().createDivElement(); setElement( glass ); glass.getStyle().setBackgroundColor( "rgba(0, 0, 0, 0.25)" ); glass.getStyle().setPosition( Position.ABSOLUTE ); glass.getStyle().setLeft( 0, Unit.PX ); glass.getStyle().setTop( 0, Unit.PX ); glass.getStyle().setRight( 0, Unit.PX ); glass.getStyle().setBottom( 0, Unit.PX ); glass.getStyle().setTextAlign( com.google.gwt.dom.client.Style.TextAlign.CENTER ); ImageResource closeImage = ImageResources.INSTANCE.close(); int headerSize = Math.max( closeImage.getHeight(), closeImage.getWidth() ) + 5; glass.setInnerHTML( "<div class='"+ResizablePanel.CSS.bkgnd()+"' style='display: inline-block; position: relative; margin-top:50px'>"+ "<div class='"+ResizablePanel.CSS.title()+"' style='position:relative; left:0px; margin-right:"+headerSize+"px; top:0px; height:"+headerSize+"px'></div>"+ "<div style='position:absolute; right:0px; top:0px;'><img></img></div>"+ "<div style='position: relative; overflow:auto;'> <!-- content holder --> </div>"+ "</div>" ); main = (Element) glass.getChild( 0 ); title = (Element) main.getChild( 0 ); title.setInnerText( titleText ); close = (Element) main.getChild( 1 ).getChild( 0 ); close.setAttribute( "src", closeImage.getSafeUri().asString() ); content = (Element) main.getChild( 2 ); content.addClassName( ResizablePanel.CSS.content() ); add( contentWidget, content ); addDomHandler( new ClickHandler() { @Override public void onClick( ClickEvent event ) { if( ! isAutoHide ) return; if( (Object) event.getNativeEvent().getEventTarget() != (Object) close ) return; hide(); } }, ClickEvent.getType() ); addDomHandler( mouseDownHandler, MouseDownEvent.getType() ); addDomHandler( mouseMoveHandler, MouseMoveEvent.getType() ); addDomHandler( mouseUpHandler, MouseUpEvent.getType() ); } boolean isMoving = false; int movingMouseOffsetX; int movingMouseOffsetY; int movingOriginX; int movingOriginY; private MouseDownHandler mouseDownHandler = new MouseDownHandler() { @Override public void onMouseDown( MouseDownEvent event ) { if( event.getNativeEvent().getEventTarget().<Element>cast() == title ) { isMoving = true; movingMouseOffsetX = event.getClientX(); movingMouseOffsetY = event.getClientY(); DOM.setCapture( title ); event.preventDefault(); event.stopPropagation(); } } }; private MouseMoveHandler mouseMoveHandler = new MouseMoveHandler() { @Override public void onMouseMove( MouseMoveEvent event ) { if( isMoving ) { main.getStyle().setLeft( movingOriginX + event.getClientX() - movingMouseOffsetX, Unit.PX ); main.getStyle().setTop( movingOriginY + event.getClientY() - movingMouseOffsetY, Unit.PX ); } } }; private MouseUpHandler mouseUpHandler = new MouseUpHandler() { @Override public void onMouseUp( MouseUpEvent event ) { isMoving = false; DOM.releaseCapture( title ); movingOriginX += event.getClientX() - movingMouseOffsetX; movingOriginY += event.getClientY() - movingMouseOffsetY; } }; @Override public void show() { show( true ); } @Override public void show( boolean isAutoHide ) { this.isAutoHide = isAutoHide; if( isDisplayed ) return; isDisplayed = true; RootPanel.get().add( this ); } @Override public void hide() { if( ! isDisplayed ) return; isDisplayed = false; RootPanel.get().remove( this ); CloseEvent.fire( this, null ); } @Override public HandlerRegistration addCloseHandler( CloseHandler<DialogBox> handler ) { return addHandler( handler, CloseEvent.getType() ); } }