package de.swm.gwt.client.responsive;
import com.google.gwt.core.shared.GWT;
/**
* Wrapper for the javascript matchMedia function.<br>
* Based on patch/contribution at <a href="https://code.google.com/p/google-web-toolkit/issues/detail?id=8399">GWT bug tracker</a>
* Use a polyfill in case the browser doesn't support this function (see links below).
*
* Typical application example:
* <pre>
* MatchMediaFacade facade = MatchMediaFacade.getInstance();
*
* IMatchMedia minWidth = facade.match("(min-width: 720px)");
* minWidth.addMatchMediaChangeHandler(new IMatchMediaChangeHandler() {
*
* @Override
* public void onMatchMediaChange(IMatchMedia matchMedia) {
* if (matchMedia.hasMatch() {
* <implement responsive design functionality>
* }
* }
* });
* </pre>
*
* @see <a href="https://developer.mozilla.org/en-US/docs/Web/API/window.matchMedia">Js MatchMedia</a>
* @see <a href="https://github.com/paulirish/matchMedia.js">Polyfill</a>
* @see <a href="https://hacks.mozilla.org/2012/06/using-window-matchmedia-to-do-media-queries-in-javascript/">Example usages</a>
* @see <a href="http://caniuse.com/#search=matchMedia">Browser support</a>
* @see <a href="http://css-tricks.com/enquire-js-media-query-callbacks-in-javascript/">Match Media alternative JS lib.</a>
*
* @author Ed Bras
*/
public final class MatchMediaFacade {
private MatchMediaFacade() {
}
public static MatchMediaFacade getInstance() {
return InstanceHolder.INSTANCE;
}
public native boolean isSupported() /*-{ return $wnd.matchMedia != null || $wnd.msMatchMedia != null; }-*/;
public IMatchMedia match(final String mediaQuery) {
return (mediaQuery == null) ? null : matchIntern(mediaQuery);
}
private native JsMatchMedia matchIntern(String mediaQuery) /*-{ return $wnd.matchMedia(mediaQuery); }-*/;
private interface InstanceHolder {
MatchMediaFacade INSTANCE = GWT.create(MatchMediaFacade.class);
}
}