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();
}
});
});