123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415 |
- ///import core
- ///import uicore
- ///import ui/mask.js
- ///import ui/button.js
- (function (){
- var utils = baidu.editor.utils,
- domUtils = baidu.editor.dom.domUtils,
- uiUtils = baidu.editor.ui.uiUtils,
- Mask = baidu.editor.ui.Mask,
- UIBase = baidu.editor.ui.UIBase,
- Button = baidu.editor.ui.Button,
- Dialog = baidu.editor.ui.Dialog = function (options){
- if(options.name){
- var name = options.name;
- var cssRules = options.cssRules;
- if(!options.className){
- options.className = 'edui-for-' + name;
- }
- if(cssRules){
- options.cssRules = '.edui-default .edui-for-'+ name +' .edui-dialog-content {'+ cssRules +'}'
- }
- }
- this.initOptions(utils.extend({
- autoReset: true,
- draggable: true,
- onok: function (){},
- oncancel: function (){},
- onclose: function (t, ok){
- return ok ? this.onok() : this.oncancel();
- },
- //是否控制dialog中的scroll事件, 默认为不阻止
- holdScroll: false
- },options));
- this.initDialog();
- };
- var modalMask;
- var dragMask;
- var activeDialog;
- Dialog.prototype = {
- draggable: false,
- uiName: 'dialog',
- initDialog: function (){
- var me = this,
- theme=this.editor.options.theme;
- if(this.cssRules){
- utils.cssRule('edui-customize-'+this.name+'-style',this.cssRules);
- }
- this.initUIBase();
- this.modalMask = (modalMask || (modalMask = new Mask({
- className: 'edui-dialog-modalmask',
- theme:theme,
- onclick: function (){
- activeDialog && activeDialog.close(false);
- }
- })));
- this.dragMask = (dragMask || (dragMask = new Mask({
- className: 'edui-dialog-dragmask',
- theme:theme
- })));
- this.closeButton = new Button({
- className: 'edui-dialog-closebutton',
- title: me.closeDialog,
- theme:theme,
- onclick: function (){
- me.close(false);
- }
- });
- this.fullscreen && this.initResizeEvent();
- if (this.buttons) {
- for (var i=0; i<this.buttons.length; i++) {
- if (!(this.buttons[i] instanceof Button)) {
- this.buttons[i] = new Button(utils.extend(this.buttons[i],{
- editor : this.editor
- },true));
- }
- }
- }
- },
- initResizeEvent: function () {
- var me = this;
- domUtils.on( window, "resize", function () {
- if ( me._hidden || me._hidden === undefined ) {
- return;
- }
- if ( me.__resizeTimer ) {
- window.clearTimeout( me.__resizeTimer );
- }
- me.__resizeTimer = window.setTimeout( function () {
- me.__resizeTimer = null;
- var dialogWrapNode = me.getDom(),
- contentNode = me.getDom('content'),
- wrapRect = UE.ui.uiUtils.getClientRect( dialogWrapNode ),
- contentRect = UE.ui.uiUtils.getClientRect( contentNode ),
- vpRect = uiUtils.getViewportRect();
- contentNode.style.width = ( vpRect.width - wrapRect.width + contentRect.width ) + "px";
- contentNode.style.height = ( vpRect.height - wrapRect.height + contentRect.height ) + "px";
- dialogWrapNode.style.width = vpRect.width + "px";
- dialogWrapNode.style.height = vpRect.height + "px";
- me.fireEvent( "resize" );
- }, 100 );
- } );
- },
- fitSize: function (){
- var popBodyEl = this.getDom('body');
- // if (!(baidu.editor.browser.ie && baidu.editor.browser.version == 7)) {
- // uiUtils.removeStyle(popBodyEl, 'width');
- // uiUtils.removeStyle(popBodyEl, 'height');
- // }
- var size = this.mesureSize();
- popBodyEl.style.width = size.width + 'px';
- popBodyEl.style.height = size.height + 'px';
- return size;
- },
- safeSetOffset: function (offset){
- var me = this;
- var el = me.getDom();
- var vpRect = uiUtils.getViewportRect();
- var rect = uiUtils.getClientRect(el);
- var left = offset.left;
- if (left + rect.width > vpRect.right) {
- left = vpRect.right - rect.width;
- }
- var top = offset.top;
- if (top + rect.height > vpRect.bottom) {
- top = vpRect.bottom - rect.height;
- }
- el.style.left = Math.max(left, 0) + 'px';
- el.style.top = Math.max(top, 0) + 'px';
- },
- showAtCenter: function (){
- var vpRect = uiUtils.getViewportRect();
- if ( !this.fullscreen ) {
- this.getDom().style.display = '';
- var popSize = this.fitSize();
- var titleHeight = this.getDom('titlebar').offsetHeight | 0;
- var left = vpRect.width / 2 - popSize.width / 2;
- var top = vpRect.height / 2 - (popSize.height - titleHeight) / 2 - titleHeight;
- var popEl = this.getDom();
- this.safeSetOffset({
- left: Math.max(left | 0, 0),
- top: Math.max(top | 0, 0)
- });
- if (!domUtils.hasClass(popEl, 'edui-state-centered')) {
- popEl.className += ' edui-state-centered';
- }
- } else {
- var dialogWrapNode = this.getDom(),
- contentNode = this.getDom('content');
- dialogWrapNode.style.display = "block";
- var wrapRect = UE.ui.uiUtils.getClientRect( dialogWrapNode ),
- contentRect = UE.ui.uiUtils.getClientRect( contentNode );
- dialogWrapNode.style.left = "-100000px";
- contentNode.style.width = ( vpRect.width - wrapRect.width + contentRect.width ) + "px";
- contentNode.style.height = ( vpRect.height - wrapRect.height + contentRect.height ) + "px";
- dialogWrapNode.style.width = vpRect.width + "px";
- dialogWrapNode.style.height = vpRect.height + "px";
- dialogWrapNode.style.left = 0;
- //保存环境的overflow值
- this._originalContext = {
- html: {
- overflowX: document.documentElement.style.overflowX,
- overflowY: document.documentElement.style.overflowY
- },
- body: {
- overflowX: document.body.style.overflowX,
- overflowY: document.body.style.overflowY
- }
- };
- document.documentElement.style.overflowX = 'hidden';
- document.documentElement.style.overflowY = 'hidden';
- document.body.style.overflowX = 'hidden';
- document.body.style.overflowY = 'hidden';
- }
- this._show();
- },
- getContentHtml: function (){
- var contentHtml = '';
- if (typeof this.content == 'string') {
- contentHtml = this.content;
- } else if (this.iframeUrl) {
- contentHtml = '<span id="'+ this.id +'_contmask" class="dialogcontmask"></span><iframe id="'+ this.id +
- '_iframe" class="%%-iframe" height="100%" width="100%" frameborder="0" src="'+ this.iframeUrl +'"></iframe>';
- }
- return contentHtml;
- },
- getHtmlTpl: function (){
- var footHtml = '';
- if (this.buttons) {
- var buff = [];
- for (var i=0; i<this.buttons.length; i++) {
- buff[i] = this.buttons[i].renderHtml();
- }
- footHtml = '<div class="%%-foot">' +
- '<div id="##_buttons" class="%%-buttons">' + buff.join('') + '</div>' +
- '</div>';
- }
- return '<div id="##" class="%%"><div '+ ( !this.fullscreen ? 'class="%%"' : 'class="%%-wrap edui-dialog-fullscreen-flag"' ) +'><div id="##_body" class="%%-body">' +
- '<div class="%%-shadow"></div>' +
- '<div id="##_titlebar" class="%%-titlebar">' +
- '<div class="%%-draghandle" onmousedown="$$._onTitlebarMouseDown(event, this);">' +
- '<span class="%%-caption">' + (this.title || '') + '</span>' +
- '</div>' +
- this.closeButton.renderHtml() +
- '</div>' +
- '<div id="##_content" class="%%-content">'+ ( this.autoReset ? '' : this.getContentHtml()) +'</div>' +
- footHtml +
- '</div></div></div>';
- },
- postRender: function (){
- // todo: 保持居中/记住上次关闭位置选项
- if (!this.modalMask.getDom()) {
- this.modalMask.render();
- this.modalMask.hide();
- }
- if (!this.dragMask.getDom()) {
- this.dragMask.render();
- this.dragMask.hide();
- }
- var me = this;
- this.addListener('show', function (){
- me.modalMask.show(this.getDom().style.zIndex - 2);
- });
- this.addListener('hide', function (){
- me.modalMask.hide();
- });
- if (this.buttons) {
- for (var i=0; i<this.buttons.length; i++) {
- this.buttons[i].postRender();
- }
- }
- domUtils.on(window, 'resize', function (){
- setTimeout(function (){
- if (!me.isHidden()) {
- me.safeSetOffset(uiUtils.getClientRect(me.getDom()));
- }
- });
- });
- //hold住scroll事件,防止dialog的滚动影响页面
- // if( this.holdScroll ) {
- //
- // if( !me.iframeUrl ) {
- // domUtils.on( document.getElementById( me.id + "_iframe"), !browser.gecko ? "mousewheel" : "DOMMouseScroll", function(e){
- // domUtils.preventDefault(e);
- // } );
- // } else {
- // me.addListener('dialogafterreset', function(){
- // window.setTimeout(function(){
- // var iframeWindow = document.getElementById( me.id + "_iframe").contentWindow;
- //
- // if( browser.ie ) {
- //
- // var timer = window.setInterval(function(){
- //
- // if( iframeWindow.document && iframeWindow.document.body ) {
- // window.clearInterval( timer );
- // timer = null;
- // domUtils.on( iframeWindow.document.body, !browser.gecko ? "mousewheel" : "DOMMouseScroll", function(e){
- // domUtils.preventDefault(e);
- // } );
- // }
- //
- // }, 100);
- //
- // } else {
- // domUtils.on( iframeWindow, !browser.gecko ? "mousewheel" : "DOMMouseScroll", function(e){
- // domUtils.preventDefault(e);
- // } );
- // }
- //
- // }, 1);
- // });
- // }
- //
- // }
- this._hide();
- },
- mesureSize: function (){
- var body = this.getDom('body');
- var width = uiUtils.getClientRect(this.getDom('content')).width;
- var dialogBodyStyle = body.style;
- dialogBodyStyle.width = width;
- return uiUtils.getClientRect(body);
- },
- _onTitlebarMouseDown: function (evt, el){
- if (this.draggable) {
- var rect;
- var vpRect = uiUtils.getViewportRect();
- var me = this;
- uiUtils.startDrag(evt, {
- ondragstart: function (){
- rect = uiUtils.getClientRect(me.getDom());
- me.getDom('contmask').style.visibility = 'visible';
- me.dragMask.show(me.getDom().style.zIndex - 1);
- },
- ondragmove: function (x, y){
- var left = rect.left + x;
- var top = rect.top + y;
- me.safeSetOffset({
- left: left,
- top: top
- });
- },
- ondragstop: function (){
- me.getDom('contmask').style.visibility = 'hidden';
- domUtils.removeClasses(me.getDom(), ['edui-state-centered']);
- me.dragMask.hide();
- }
- });
- }
- },
- reset: function (){
- this.getDom('content').innerHTML = this.getContentHtml();
- this.fireEvent('dialogafterreset');
- },
- _show: function (){
- if (this._hidden) {
- this.getDom().style.display = '';
- //要高过编辑器的zindxe
- this.editor.container.style.zIndex && (this.getDom().style.zIndex = this.editor.container.style.zIndex * 1 + 10);
- this._hidden = false;
- this.fireEvent('show');
- baidu.editor.ui.uiUtils.getFixedLayer().style.zIndex = this.getDom().style.zIndex - 4;
- }
- },
- isHidden: function (){
- return this._hidden;
- },
- _hide: function (){
- if (!this._hidden) {
- var wrapNode = this.getDom();
- wrapNode.style.display = 'none';
- wrapNode.style.zIndex = '';
- wrapNode.style.width = '';
- wrapNode.style.height = '';
- this._hidden = true;
- this.fireEvent('hide');
- }
- },
- open: function (){
- if (this.autoReset) {
- //有可能还没有渲染
- try{
- this.reset();
- }catch(e){
- this.render();
- this.open()
- }
- }
- this.showAtCenter();
- if (this.iframeUrl) {
- try {
- this.getDom('iframe').focus();
- } catch(ex){}
- }
- activeDialog = this;
- },
- _onCloseButtonClick: function (evt, el){
- this.close(false);
- },
- close: function (ok){
- if (this.fireEvent('close', ok) !== false) {
- //还原环境
- if ( this.fullscreen ) {
- document.documentElement.style.overflowX = this._originalContext.html.overflowX;
- document.documentElement.style.overflowY = this._originalContext.html.overflowY;
- document.body.style.overflowX = this._originalContext.body.overflowX;
- document.body.style.overflowY = this._originalContext.body.overflowY;
- delete this._originalContext;
- }
- this._hide();
- //销毁content
- var content = this.getDom('content');
- var iframe = this.getDom('iframe');
- if (content && iframe) {
- var doc = iframe.contentDocument || iframe.contentWindow.document;
- doc && (doc.body.innerHTML = '');
- domUtils.remove(content);
- }
- }
- }
- };
- utils.inherits(Dialog, UIBase);
- })();
|