You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
295 lines
9.9 KiB
295 lines
9.9 KiB
L.Control.Window = L.Control.extend({ |
|
|
|
includes: L.Evented.prototype || L.Mixin.Events, |
|
|
|
options: { |
|
element: 'mapL', |
|
className: 'control-window', |
|
visible: false, |
|
title: undefined, |
|
closeButton: true, |
|
content: undefined, |
|
prompt: undefined, |
|
maxWidth: 600, |
|
modal: false, |
|
position: 'center' |
|
}, |
|
initialize: function (container, options) { |
|
var self = this; |
|
|
|
if (container.hasOwnProperty('options')) { container = container.getContainer(); } |
|
|
|
options.element = container; |
|
L.setOptions(this, options); |
|
|
|
var modality = 'nonmodal'; |
|
|
|
if (this.options.modal){ |
|
modality = 'modal' |
|
} |
|
|
|
// Create popup window container |
|
this._wrapper = L.DomUtil.create('div',modality+' leaflet-control-window-wrapper', L.DomUtil.get(this.options.element)); |
|
|
|
this._container = L.DomUtil.create('div', 'leaflet-control leaflet-control-window '+this.options.className,this._wrapper); |
|
this._container.setAttribute('style','max-width:'+this.options.maxWidth+'px'); |
|
|
|
this._containerTitleBar = L.DomUtil.create('div', 'titlebar',this._container); |
|
this.titleContent = L.DomUtil.create('h2', 'title',this._containerTitleBar); |
|
this._containerContent = L.DomUtil.create('div', 'content' ,this._container); |
|
this._containerPromptButtons = L.DomUtil.create('div', 'promptButtons' ,this._container); |
|
|
|
if (this.options.closeButton) { |
|
this._closeButton = L.DomUtil.create('a', 'close',this._containerTitleBar); |
|
this._closeButton.innerHTML = '×'; |
|
} |
|
|
|
// Make sure we don't drag the map when we interact with the content |
|
var stop = L.DomEvent.stopPropagation; |
|
L.DomEvent |
|
.on(this._wrapper, 'contextmenu', stop) |
|
.on(this._wrapper, 'click', stop) |
|
.on(this._wrapper, 'mousedown', stop) |
|
.on(this._wrapper, 'touchstart', stop) |
|
.on(this._wrapper, 'dblclick', stop) |
|
.on(this._wrapper, 'mousewheel', stop) |
|
.on(this._wrapper, 'MozMousePixelScroll', stop) |
|
|
|
// Attach event to close button |
|
if (this.options.closeButton) { |
|
var close = this._closeButton; |
|
L.DomEvent.on(close, 'click', this.hide, this); |
|
} |
|
if (this.options.title){ |
|
this.title(this.options.title); |
|
} |
|
if (this.options.content) { |
|
this.content(this.options.content); |
|
} |
|
if (typeof(this.options.prompt)=='object') { |
|
this.prompt(this.options.prompt); |
|
} |
|
if (this.options.visible){ |
|
this.show(); |
|
} |
|
|
|
//map.on('resize',function(){self.mapResized()}); |
|
}, |
|
disableBtn: function(){ |
|
this._btnOK.disabled=true; |
|
this._btnOK.className='disabled'; |
|
}, |
|
enableBtn: function(){ |
|
this._btnOK.disabled=false; |
|
this._btnOK.className=''; |
|
}, |
|
title: function(titleContent){ |
|
if (titleContent==undefined){ |
|
return this.options.title |
|
} |
|
|
|
this.options.title = titleContent; |
|
var title = titleContent || ''; |
|
this.titleContent.innerHTML = title; |
|
return this; |
|
}, |
|
remove: function () { |
|
|
|
L.DomUtil.get(this.options.element).removeChild(this._wrapper); |
|
|
|
// Unregister events to prevent memory leak |
|
var stop = L.DomEvent.stopPropagation; |
|
L.DomEvent |
|
.off(this._wrapper, 'contextmenu', stop) |
|
.off(this._wrapper, 'click', stop) |
|
.off(this._wrapper, 'mousedown', stop) |
|
.off(this._wrapper, 'touchstart', stop) |
|
.off(this._wrapper, 'dblclick', stop) |
|
.off(this._wrapper, 'mousewheel', stop) |
|
.off(this._wrapper, 'MozMousePixelScroll', stop); |
|
|
|
// map.off('resize',self.mapResized); |
|
|
|
if (this._closeButton && this._close) { |
|
var close = this._closeButton; |
|
L.DomEvent.off(close, 'click', this.close, this); |
|
} |
|
this._source.remove(); |
|
return this; |
|
}, |
|
mapResized : function(){ |
|
// this.show() |
|
}, |
|
show: function (position) { |
|
|
|
if (position){ |
|
this.options.position = position |
|
} |
|
|
|
L.DomUtil.addClass(this._wrapper, 'visible'); |
|
|
|
|
|
this.setContentMaxHeight(); |
|
var thisWidth = this._container.offsetWidth; |
|
var thisHeight = this._container.offsetHeight; |
|
var margin = 8; |
|
|
|
var el = L.DomUtil.get(this.options.element); |
|
var rect = el.getBoundingClientRect(); |
|
var width = rect.right -rect.left || Math.max(document.documentElement.clientWidth, window.innerWidth || 0); |
|
var height = rect.bottom -rect.top || Math.max(document.documentElement.clientHeight, window.innerHeight || 0); |
|
|
|
var top = rect.top; |
|
var left = rect.left; |
|
var offset =0; |
|
|
|
// SET POSITION OF WINDOW |
|
if (this.options.position == 'topLeft'){ |
|
this.showOn([left,top+offset]) |
|
} else if (this.options.position == 'left') { |
|
this.showOn([left, top+height/2-thisHeight/2-margin+offset]) |
|
} else if (this.options.position == 'bottomLeft') { |
|
this.showOn([left, top+height-thisHeight-margin*2-offset]) |
|
} else if (this.options.position == 'top') { |
|
this.showOn([left+width/2-thisWidth/2-margin,top+offset]) |
|
} else if (this.options.position == 'topRight') { |
|
this.showOn([left+width-thisWidth-margin*2,top+ offset]) |
|
} else if (this.options.position == 'right') { |
|
this.showOn([left+width-thisWidth-margin*2, top+height/2-thisHeight/2-margin+offset]) |
|
} else if (this.options.position == 'bottomRight') { |
|
this.showOn([left+width-thisWidth-margin*2,top+ height-thisHeight-margin*2-offset]) |
|
} else if (this.options.position == 'bottom') { |
|
this.showOn([left+width/2-thisWidth/2-margin,top+ height-thisHeight-margin*2-offset]) |
|
} else { |
|
this.showOn([left+width/2-thisWidth/2-margin, top+top+height/2-thisHeight/2-margin+offset]) |
|
} |
|
|
|
return this; |
|
}, |
|
showOn: function(point){ |
|
|
|
this.setContentMaxHeight(); |
|
L.DomUtil.setPosition(this._container, L.point(Math.round(point[0]),Math.round(point[1]),true)); |
|
|
|
var draggable = new L.Draggable(this._container,this._containerTitleBar); |
|
draggable.enable(); |
|
|
|
L.DomUtil.addClass(this._wrapper, 'visible'); |
|
this.fire('show'); |
|
return this; |
|
}, |
|
hide: function (e) { |
|
|
|
L.DomUtil.removeClass(this._wrapper, 'visible'); |
|
this.fire('hide'); |
|
this._container.remove(); // fixes DOM element persistence |
|
return this; |
|
}, |
|
|
|
getContainer: function () { |
|
return this._containerContent; |
|
}, |
|
content: function (content) { |
|
if (content==undefined){ |
|
return this.options.content |
|
} |
|
this.options.content = content; |
|
this.getContainer().innerHTML = content; |
|
return this; |
|
}, |
|
prompt : function(promptObject){ |
|
|
|
if (promptObject==undefined){ |
|
return this.options.prompt |
|
} |
|
|
|
this.options.prompt = promptObject; |
|
|
|
this.setPromptCallback(promptObject.callback); |
|
|
|
this.setActionCallback(promptObject.action); |
|
|
|
var cancel = this.options.prompt.buttonCancel || undefined; |
|
|
|
var ok = this.options.prompt.buttonOK || 'OK'; |
|
|
|
var action = this.options.prompt.buttonAction || undefined; |
|
|
|
if (action != undefined) { |
|
var btnAction = L.DomUtil.create('button','',this._containerPromptButtons); |
|
L.DomEvent.on(btnAction, 'click',this.action, this); |
|
btnAction.innerHTML=action; |
|
} |
|
|
|
var btnOK= L.DomUtil.create('button','',this._containerPromptButtons); |
|
L.DomEvent.on(btnOK, 'click',this.promptCallback, this); |
|
btnOK.innerHTML=ok; |
|
|
|
this._btnOK=btnOK; |
|
|
|
if (cancel != undefined) { |
|
var btnCancel= L.DomUtil.create('button','',this._containerPromptButtons); |
|
L.DomEvent.on(btnCancel, 'click', this.close, this); |
|
btnCancel.innerHTML=cancel |
|
} |
|
|
|
return this; |
|
}, |
|
container : function(containerContent){ |
|
if (containerContent==undefined){ |
|
return this._container.innerHTML |
|
} |
|
|
|
this._container.innerHTML = containerContent; |
|
|
|
if (this.options.closeButton) { |
|
this._closeButton = L.DomUtil.create('a', 'close',this._container); |
|
this._closeButton.innerHTML = '×'; |
|
L.DomEvent.on(this._closeButton, 'click', this.close, this); |
|
} |
|
return this; |
|
|
|
}, |
|
setPromptCallback : function(callback){ |
|
var self = this; |
|
if (typeof(callback)!= 'function') { callback = function() {console.warn('No callback function specified!');}} |
|
var cb = function() { self.close();callback();}; |
|
this.promptCallback = cb; |
|
return this; |
|
}, |
|
setActionCallback : function(callback){ |
|
var self = this; |
|
if (typeof(callback)!= 'function') { callback = function() {console.warn('No callback function specified!');}} |
|
var cb = function() { self.hide();callback();}; |
|
this.action = cb; |
|
return this; |
|
}, |
|
|
|
setContentMaxHeight : function(){ |
|
var margin = 68; |
|
|
|
if (this.options.title){ |
|
margin += this._containerTitleBar.offsetHeight-36; |
|
} |
|
if (typeof(this.options.prompt) == 'object'){ |
|
margin += this._containerPromptButtons.offsetHeight-20 |
|
} |
|
|
|
var el = L.DomUtil.get(this.options.element) |
|
var rect = el.getBoundingClientRect(); |
|
var height = rect.bottom -rect.top; |
|
|
|
var maxHeight = height - margin; |
|
this._containerContent.setAttribute('style','max-height:'+maxHeight+'px') |
|
}, |
|
close : function(){ |
|
this.hide(); |
|
this.remove(); |
|
this.fire('close'); |
|
return undefined; |
|
} |
|
}); |
|
|
|
L.control.window = function (container,options) { |
|
return new L.Control.Window(container,options); |
|
};
|
|
|