Spaces:
Sleeping
Sleeping
| // @flow | |
| import DOM from '../../util/dom'; | |
| import {bindAll, warnOnce} from '../../util/util'; | |
| import window from '../../util/window'; | |
| import type Map from '../map'; | |
| type Options = { | |
| container?: HTMLElement | |
| }; | |
| /** | |
| * A `FullscreenControl` control contains a button for toggling the map in and out of fullscreen mode. | |
| * | |
| * @implements {IControl} | |
| * @param {Object} [options] | |
| * @param {HTMLElement} [options.container] `container` is the [compatible DOM element](https://developer.mozilla.org/en-US/docs/Web/API/Element/requestFullScreen#Compatible_elements) which should be made full screen. By default, the map container element will be made full screen. | |
| * | |
| * @example | |
| * map.addControl(new mapboxgl.FullscreenControl({container: document.querySelector('body')})); | |
| * @see [View a fullscreen map](https://www.mapbox.com/mapbox-gl-js/example/fullscreen/) | |
| */ | |
| class FullscreenControl { | |
| _map: Map; | |
| _controlContainer: HTMLElement; | |
| _fullscreen: boolean; | |
| _fullscreenchange: string; | |
| _fullscreenButton: HTMLElement; | |
| _container: HTMLElement; | |
| constructor(options: Options) { | |
| this._fullscreen = false; | |
| if (options && options.container) { | |
| if (options.container instanceof window.HTMLElement) { | |
| this._container = options.container; | |
| } else { | |
| warnOnce('Full screen control \'container\' must be a DOM element.'); | |
| } | |
| } | |
| bindAll([ | |
| '_onClickFullscreen', | |
| '_changeIcon' | |
| ], this); | |
| if ('onfullscreenchange' in window.document) { | |
| this._fullscreenchange = 'fullscreenchange'; | |
| } else if ('onmozfullscreenchange' in window.document) { | |
| this._fullscreenchange = 'mozfullscreenchange'; | |
| } else if ('onwebkitfullscreenchange' in window.document) { | |
| this._fullscreenchange = 'webkitfullscreenchange'; | |
| } else if ('onmsfullscreenchange' in window.document) { | |
| this._fullscreenchange = 'MSFullscreenChange'; | |
| } | |
| } | |
| onAdd(map: Map) { | |
| this._map = map; | |
| if (!this._container) this._container = this._map.getContainer(); | |
| this._controlContainer = DOM.create('div', `mapboxgl-ctrl mapboxgl-ctrl-group`); | |
| if (this._checkFullscreenSupport()) { | |
| this._setupUI(); | |
| } else { | |
| this._controlContainer.style.display = 'none'; | |
| warnOnce('This device does not support fullscreen mode.'); | |
| } | |
| return this._controlContainer; | |
| } | |
| onRemove() { | |
| DOM.remove(this._controlContainer); | |
| this._map = (null: any); | |
| window.document.removeEventListener(this._fullscreenchange, this._changeIcon); | |
| } | |
| _checkFullscreenSupport() { | |
| return !!( | |
| window.document.fullscreenEnabled || | |
| (window.document: any).mozFullScreenEnabled || | |
| (window.document: any).msFullscreenEnabled || | |
| (window.document: any).webkitFullscreenEnabled | |
| ); | |
| } | |
| _setupUI() { | |
| const button = this._fullscreenButton = DOM.create('button', (`mapboxgl-ctrl-fullscreen`), this._controlContainer); | |
| DOM.create('span', `mapboxgl-ctrl-icon`, button).setAttribute('aria-hidden', true); | |
| button.type = 'button'; | |
| this._updateTitle(); | |
| this._fullscreenButton.addEventListener('click', this._onClickFullscreen); | |
| window.document.addEventListener(this._fullscreenchange, this._changeIcon); | |
| } | |
| _updateTitle() { | |
| const title = this._getTitle(); | |
| this._fullscreenButton.setAttribute("aria-label", title); | |
| this._fullscreenButton.title = title; | |
| } | |
| _getTitle() { | |
| return this._map._getUIString(this._isFullscreen() ? 'FullscreenControl.Exit' : 'FullscreenControl.Enter'); | |
| } | |
| _isFullscreen() { | |
| return this._fullscreen; | |
| } | |
| _changeIcon() { | |
| const fullscreenElement = | |
| window.document.fullscreenElement || | |
| (window.document: any).mozFullScreenElement || | |
| (window.document: any).webkitFullscreenElement || | |
| (window.document: any).msFullscreenElement; | |
| if ((fullscreenElement === this._container) !== this._fullscreen) { | |
| this._fullscreen = !this._fullscreen; | |
| this._fullscreenButton.classList.toggle(`mapboxgl-ctrl-shrink`); | |
| this._fullscreenButton.classList.toggle(`mapboxgl-ctrl-fullscreen`); | |
| this._updateTitle(); | |
| } | |
| } | |
| _onClickFullscreen() { | |
| if (this._isFullscreen()) { | |
| if (window.document.exitFullscreen) { | |
| (window.document: any).exitFullscreen(); | |
| } else if (window.document.mozCancelFullScreen) { | |
| (window.document: any).mozCancelFullScreen(); | |
| } else if (window.document.msExitFullscreen) { | |
| (window.document: any).msExitFullscreen(); | |
| } else if (window.document.webkitCancelFullScreen) { | |
| (window.document: any).webkitCancelFullScreen(); | |
| } | |
| } else if (this._container.requestFullscreen) { | |
| this._container.requestFullscreen(); | |
| } else if ((this._container: any).mozRequestFullScreen) { | |
| (this._container: any).mozRequestFullScreen(); | |
| } else if ((this._container: any).msRequestFullscreen) { | |
| (this._container: any).msRequestFullscreen(); | |
| } else if ((this._container: any).webkitRequestFullscreen) { | |
| (this._container: any).webkitRequestFullscreen(); | |
| } | |
| } | |
| } | |
| export default FullscreenControl; | |