/*! * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software * Foundation. * * You should have received a copy of the GNU Lesser General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package org.pentaho.gwt.widgets.client.utils; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.Node; import com.google.gwt.dom.client.NodeList; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.ui.AbsolutePanel; import com.google.gwt.user.client.ui.HorizontalSplitPanel; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.VerticalSplitPanel; import com.google.gwt.user.client.ui.Widget; public class ElementUtils { public static final int LEFT = 0; public static final int RIGHT = 1; public static final int TOP = 0; public static final int BOTTOM = 1; private static AbsolutePanel sandbox = new AbsolutePanel(); // Used to find the size of elements static { sandbox.getElement().getStyle().setProperty( "position", "absolute" ); //$NON-NLS-1$ //$NON-NLS-2$ sandbox.getElement().getStyle().setProperty( "overflow", "hidden" ); //$NON-NLS-1$ //$NON-NLS-2$ sandbox.getElement().getStyle().setProperty( "width", "0px" ); //$NON-NLS-1$ //$NON-NLS-2$ sandbox.getElement().getStyle().setProperty( "height", "0px" ); //$NON-NLS-1$ //$NON-NLS-2$ RootPanel.get().add( sandbox ); } public static native void blur( Element e )/*-{ if(e.blur){ e.blur(); } }-*/; public static void removeScrollingFromSplitPane( Widget panel ) { if ( !panel.isAttached() ) { // throw new IllegalStateException("Operation not allowed while element not on DOM"); } if ( ( panel instanceof HorizontalSplitPanel || panel instanceof VerticalSplitPanel ) == false ) { throw new IllegalArgumentException( "Widget not expected SplitPane type" ); //$NON-NLS-1$ } if ( panel instanceof HorizontalSplitPanel ) { HorizontalSplitPanel hp = (HorizontalSplitPanel) panel; removeScrollingFromUpTo( hp.getLeftWidget().getElement(), hp.getElement() ); removeScrollingFromUpTo( hp.getRightWidget().getElement(), hp.getElement() ); } else { VerticalSplitPanel vp = (VerticalSplitPanel) panel; removeScrollingFromUpTo( vp.getTopWidget().getElement(), vp.getElement() ); removeScrollingFromUpTo( vp.getBottomWidget().getElement(), vp.getElement() ); } } public static void removeScrollingFromUpTo( Element bottom, Element top ) { Element ele = bottom; while ( ele != top && ele.getParentElement() != null ) { ele.getStyle().setProperty( "overflow", "visible" ); //$NON-NLS-1$ //$NON-NLS-2$ ele.getStyle().setProperty( "overflowX", "visible" ); //$NON-NLS-1$ //$NON-NLS-2$ ele.getStyle().setProperty( "overflowY", "visible" ); //$NON-NLS-1$ //$NON-NLS-2$ ele = ele.getParentElement(); } } public static void killAutoScrolling( Element ele ) { ele.getStyle().setProperty( "overflow", "visible" ); //$NON-NLS-1$ //$NON-NLS-2$ if ( ele.hasChildNodes() ) { NodeList<Node> nodes = ele.getChildNodes(); for ( int i = 0; i < nodes.getLength(); i++ ) { Node n = nodes.getItem( i ); if ( n instanceof Element ) { killAutoScrolling( (Element) n ); } } } } public static void killAllTextSelection( com.google.gwt.dom.client.Element item ) { ElementUtils.preventTextSelection( item ); com.google.gwt.dom.client.NodeList<Node> children = item.getChildNodes(); for ( int i = 0; i < children.getLength(); i++ ) { killAllTextSelection( (com.google.gwt.dom.client.Element) children.getItem( i ) ); } } public static native void preventTextSelection( Element ele ) /*-{ // Handle all 3 browser types if(ele.getAttribute('style') != null){ var isWebkit = 'webkitRequestAnimationFrame' in $wnd; // IE (note: IE10 already supports msUserSelect style) if(document.all){ ele.onselectstart=function() {return false}; } //Webkit else if(isWebkit){ ele.style.webkitUserSelect='none'; } //Firefox else { ele.style.MozUserSelect='none'; } } }-*/; public static native Element[] getElementsByTagName( String name )/*-{ return $doc.getElementsByTagName(name); }-*/; public static native void convertPNGs() /*-{ try { if ($wnd.fixPNGs) { $wnd.fixPNGs(); } } catch(e){alert("pngfix died: "+e);} }-*/; public static native int[] calculateScrollOffsets( Element e )/*-{ var x=0; var y=0; while(e.offsetParent != null){ x += e.scrollLeft; y += e.scrollTop; e = e.offsetParent; } return [x,y]; }-*/; public static native int[] calculateOffsets( Element e )/*-{ var x=0; var y=0; while(e.offsetParent != null){ x += e.offsetLeft; y += e.offsetTop; e = e.offsetParent; } return [x,y]; }-*/; public static Element findElementAboveByTagName( Element base, String targetName ) { Element curEle = base; Element parent; while ( ( parent = curEle.getParentElement() ) != null ) { if ( parent.getTagName().equalsIgnoreCase( targetName ) ) { return parent; } curEle = parent; } return null; } public static boolean elementsOverlap( Element ele1, Element ele2 ) { Rectangle r1 = new Rectangle( ele1.getAbsoluteLeft(), ele1.getAbsoluteTop(), ele1.getOffsetWidth(), ele1.getOffsetHeight() ); Rectangle r2 = new Rectangle( ele2.getAbsoluteLeft(), ele2.getAbsoluteTop(), ele2.getOffsetWidth(), ele2.getOffsetHeight() ); return r1.intersects( r2 ); } public static Rectangle getSize( com.google.gwt.user.client.Element ele ) { Rectangle r = new Rectangle(); r.width = ele.getOffsetWidth(); r.height = ele.getOffsetHeight(); // If the element is not on the DOM, or not visible, browsers may not be able to calculate the size // Clone the element and put it in the "sandbox" to grab the size. if ( r.width == 0 && r.height == 0 ) { com.google.gwt.user.client.Element e = DOM.clone( ele, true ); sandbox.getElement().appendChild( e ); r.width = e.getOffsetWidth(); r.height = e.getOffsetHeight(); sandbox.getElement().removeChild( e ); } return r; } public boolean isVisible( com.google.gwt.user.client.Element ele ) { if ( ele.getStyle().getProperty( "display" ).equals( "none" ) ) { //$NON-NLS-1$ //$NON-NLS-2$ return false; } if ( ele.getStyle().getProperty( "visibility" ).equals( "hidden" ) ) { //$NON-NLS-1$ //$NON-NLS-2$ return false; } // TODO: add scrollpanel checking here return true; } public static void setupButtonHoverEffect() { setupHoverEffectJS(); } private static native void setupHoverEffectJS()/*-{ if(!$wnd.jQuery || !$wnd.setupJsButtonHover){ return; } try{ $wnd.setupJsButtonHover(); } catch(e){ alert(e); } }-*/; public static native String getComputedStyle( Element ele, String styleName )/*-{ if(window.getComputedStyle) { var style = window.getComputedStyle(ele, null); return style.getPropertyValue(styleName); } else { if (ele.currentStyle && ele.currentStyle[styleName]) { return ele.currentStyle[styleName]; } } return ""; }-*/; }