define(['dojo/_base/declare', 'dojo/_base/lang', 'dojo/_base/html', 'dojo/on', 'dojo/dnd/move', 'dijit/_TemplatedMixin', 'jimu/BaseWidgetPanel', 'jimu/utils', 'dojox/layout/ResizeHandle', 'dojo/touch' ], function( declare, lang, html, on, Move, _TemplatedMixin, BaseWidgetPanel, utils, ResizeHandle ) { /* global jimuConfig */ return declare([BaseWidgetPanel, _TemplatedMixin], { baseClass: 'jimu-panel jimu-on-screen-widget-panel jimu-main-background', _positionInfoBox: null, _originalBox: null, widgetIcon: null, _resizeOnOpen: true, templateString: '
' + '
' + '
${label}
' + '
' + '
' + '
' + '
' + '
' + '
', postCreate: function() { this._originalBox = { w: 400, h: 410 }; }, startup: function() { this.inherited(arguments); this._normalizePositionObj(this.position); this._makeOriginalBox(); this.makePositionInfoBox(); this.makeMoveable(this._positionInfoBox.w, this._positionInfoBox.w * 0.25); }, _onMaxBtnClicked: function(evt) { evt.stopPropagation(); var posInfo = this._getPositionInfo(); if (posInfo.isRunInMobile) { if (this.windowState === 'maximized') { this.panelManager.normalizePanel(this); } else { this.panelManager.maximizePanel(this); } this._setMobilePosition(); } }, _onFoldableBtnClicked: function(evt) { evt.stopPropagation(); var posInfo = this._getPositionInfo(); if (posInfo.isRunInMobile) { if (this.windowState === 'minimized') { html.removeClass(this.foldableNode, 'fold-up'); html.addClass(this.foldableNode, 'fold-down'); this.panelManager.normalizePanel(this); } else { html.removeClass(this.foldableNode, 'fold-down'); html.addClass(this.foldableNode, 'fold-up'); this.panelManager.minimizePanel(this); } this._setMobilePosition(); } }, _onCloseBtnClicked: function(evt) { this.panelManager.closePanel(this); evt.stopPropagation(); //avoid to touchEvent pass through the closeBtn if (evt.type === "touchstart") { evt.preventDefault(); } }, _normalizePositionObj: function(position) { var layoutBox = this._getLayoutBox(); position.left = isFinite(position.left) ? position.left : layoutBox.w - position.right; position.top = isFinite(position.top) ? position.top : layoutBox.h - position.bottom; delete position.right; delete position.bottom; this.position = lang.mixin(lang.clone(this.position), position); }, makePositionInfoBox: function() { this._positionInfoBox = { w: this.position.width || 400, h: this.position.height || 410, l: this.position.left || 0, t: this.position.top || 0 }; }, _makeOriginalBox: function() { this._originalBox = { w: this.position.width || 400, h: this.position.height || 410, l: this.position.left || 0, t: this.position.top || 0 }; }, makeResizable: function() { this.disableResizable(); this.resizeHandle = new ResizeHandle({ targetId: this, minWidth: this._originalBox.w, minHeight: this._originalBox.h, activeResize: false }).placeAt(this.domNode); this.resizeHandle.startup(); }, disableResizable: function() { if (this.resizeHandle) { this.resizeHandle.destroy(); this.resizeHandle = null; } }, makeMoveable: function(width, tolerance) { this.disableMoveable(); var containerBox = html.getMarginBox(jimuConfig.layoutId); containerBox.l = containerBox.l - width + tolerance; containerBox.w = containerBox.w + 2 * (width - tolerance); this.moveable = new Move.boxConstrainedMoveable(this.domNode, { box: containerBox, handle: this.titleNode, within: true }); this.own(on(this.moveable, 'Moving', lang.hitch(this, this.onMoving))); this.own(on(this.moveable, 'MoveStop', lang.hitch(this, this.onMoveStop))); }, disableMoveable: function() { if (this.moveable) { this.moveable.destroy(); this.moveable = null; } }, createHandleNode: function() { return this.titleNode; }, onOpen: function() { if (this._resizeOnOpen) { this.resize(); this._resizeOnOpen = false; } if (window.appInfo.isRunInMobile) { this._setMobilePosition(); } this.inherited(arguments); }, _switchToMobileUI: function() { html.removeClass(this.titleNode, 'title-normal'); html.addClass(this.titleNode, 'title-full'); html.setStyle(this.foldableNode, 'display', 'block'); html.setStyle(this.maxNode, 'display', 'block'); if (this.windowState === 'normal') { html.removeClass(this.foldableNode, 'fold-up'); html.addClass(this.foldableNode, 'fold-down'); } else { html.removeClass(this.foldableNode, 'fold-down'); html.addClass(this.foldableNode, 'fold-up'); } }, _switchToDesktopUI: function() { html.removeClass(this.titleNode, 'title-full'); html.addClass(this.titleNode, 'title-normal'); html.setStyle(this.foldableNode, 'display', 'none'); html.setStyle(this.maxNode, 'display', 'none'); }, resize: function(tmp) { var posInfo = this._getPositionInfo(); var _pos = { left: posInfo.position.left, top: posInfo.position.top, width: this._positionInfoBox.w, height: this._positionInfoBox.h }; if (tmp) { tmp.t = this.domNode.offsetTop; _pos.left = isFinite(tmp.l) ? tmp.l : _pos.left; _pos.top = isFinite(tmp.t) ? tmp.t : _pos.top; _pos.width = isFinite(tmp.w) ? tmp.w : _pos.width; _pos.height = isFinite(tmp.h) ? tmp.h : _pos.height; this._normalizePositionObj(lang.clone(_pos)); this.makePositionInfoBox(); _pos.width = this._positionInfoBox.w; _pos.height = this._positionInfoBox.h; } posInfo.position = _pos; this._onResponsible(posInfo); this.inherited(arguments); }, _onResponsible: function(posInfo) { if (posInfo.isRunInMobile) { this._setMobilePosition(); this.disableMoveable(); this.disableResizable(); this._switchToMobileUI(); } else { this._setDesktopPosition(posInfo.position); this.makeResizable(); this.makeMoveable(this._positionInfoBox.w, this._positionInfoBox.w * 0.25); this._switchToDesktopUI(); } }, setPosition: function(position) { this._normalizePositionObj(position); this.makePositionInfoBox(); var posInfo = this._getPositionInfo(); this._onResponsible(posInfo); }, destroy: function() { this.widgetIcon = null; this.inherited(arguments); }, _getLayoutBox: function() { var pid = jimuConfig.layoutId; if (this.position.relativeTo === 'map') { pid = jimuConfig.mapId; } else { pid = jimuConfig.layoutId; } return html.getMarginBox(pid); }, _getPositionInfo: function() { var result = { isRunInMobile: false, position: { left: 0, top: 5 } }; var layoutBox = this._getLayoutBox(); //judge width var leftBlankWidth = this._positionInfoBox.l; if (!window.appInfo.isRunInMobile) { if (window.isRTL) { result.position.left = layoutBox.w - leftBlankWidth; // prevent the panel out of map content if ((result.position.left + this._positionInfoBox.w) > layoutBox.w) { result.position.left -= this._positionInfoBox.w; if (result.position.left < 0) { result.position.left = layoutBox.w - this._positionInfoBox.w; } } } else { result.position.left = leftBlankWidth; // prevent the panel out of map content if ((result.position.left + this._positionInfoBox.w) > layoutBox.w) { if (layoutBox.w > this._positionInfoBox.w) { result.position.left = layoutBox.w - this._positionInfoBox.w; } else { result.position.left = 0; } } } } else { result.isRunInMobile = true; return result; } //judge height // preloadIcon height is 40px, tolerance is 3px var topBlankHeight = this._positionInfoBox.t; var bottomBlankHeight = layoutBox.h - topBlankHeight; if (topBlankHeight >= bottomBlankHeight) { if (topBlankHeight >= this._positionInfoBox.h) { // preloadIcon height is 40px result.position.top = this._positionInfoBox.t - this._positionInfoBox.h - 40 - 3; } } else { if (bottomBlankHeight >= this._positionInfoBox.h) { result.position.top = this._positionInfoBox.t + 40 + 3; // preloadIcon height is 40px } } return result; }, _setMobilePosition: function() { if (window.appInfo.isRunInMobile && this.domNode && this.domNode.parentNode !== html.byId(jimuConfig.layoutId)) { html.place(this.domNode, jimuConfig.layoutId); } var pos = this.panelManager.getPositionOnMobile(this); if (this.position.zIndex) { pos.zIndex = this.position.zIndex; } var style = utils.getPositionStyle(pos); lang.mixin(style, pos.borderRadiusStyle); html.setStyle(this.domNode, style); }, _setDesktopPosition: function(position) { if(!window.appInfo.isRunInMobile && this.domNode && this.domNode.parentNode !== html.byId(jimuConfig.mapId)) { html.place(this.domNode, jimuConfig.mapId); } html.setStyle(this.domNode, { left: position.left + 'px', right: 'auto', top: position.top + 'px', width: (position.width || this.position.width || this._originalBox.w) + 'px', height: (position.height || this.position.height || this._originalBox.h) + 'px' }); }, onMoving: function(mover) { html.setStyle(mover.node, 'opacity', 0.9); }, onMoveStop: function(mover) { html.setStyle(mover.node, 'opacity', 1); var panelBox = html.getMarginBox(mover.node); var _pos = { left: panelBox.l, top: panelBox.t, width: panelBox.w, height: panelBox.h }; this._normalizePositionObj(lang.clone(_pos)); this.makePositionInfoBox(); } }); });