define(['dojo/_base/declare',
|
'dojo/_base/lang',
|
'dojo/on',
|
'dojo/dom-style',
|
'dojo/dom-class',
|
'dojo/dom-construct',
|
'dojo/dom-geometry',
|
'dojo/_base/fx',
|
'dojo/dnd/move',
|
'dojox/layout/ResizeHandle',
|
'jimu/utils',
|
'jimu/BaseWidgetPanel',
|
'dijit/_TemplatedMixin',
|
'dojo/text!./Panel.html'
|
],
|
function(declare, lang, on, domStyle, domClass, domConstruct, domGeometry, baseFx, Move,
|
ResizeHandle, utils, BaseWidgetPanel, _TemplatedMixin, template) {
|
/* global jimuConfig*/
|
var borderRadius = '4px',
|
DEFAULT_WIDTH = 320,
|
DEFAULT_HEIGHT = 450;
|
|
return declare([BaseWidgetPanel, _TemplatedMixin], {
|
baseClass: 'dart-panel dart-bgcolor jimu-main-background shadow',
|
templateString: template,
|
titleHeight: 60,
|
normalPosition: null,
|
lastWindowState: null,
|
openAnimation: 'fadeIn',
|
closeAnimation: 'fadeOut',
|
animationDuration: 400,
|
moving: false,
|
|
postCreate: function() {
|
this.inherited(arguments);
|
this._makeOriginalBox();
|
},
|
|
startup: function() {
|
this.inherited(arguments);
|
this.panelManager.normalizePanel(this);
|
},
|
|
_makeOriginalBox: function() {
|
this._originalBox = {
|
w: this.position.width || DEFAULT_WIDTH,
|
h: this.position.height || DEFAULT_HEIGHT,
|
l: this.position.left || 0,
|
t: this.position.top || 0
|
};
|
},
|
|
makeMoveable: function(handleNode, width, tolerance) {
|
this.disableMoveable();
|
var containerBox = domGeometry.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: handleNode || this.handleNode,
|
within: true
|
});
|
this.own(on(this.moveable, 'MoveStart', lang.hitch(this, this.onMoveStart)));
|
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;
|
}
|
},
|
|
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;
|
}
|
},
|
|
onMoveStart: function(mover) {
|
if (window.isRTL) {
|
var containerBox = domGeometry.getMarginBox(jimuConfig.layoutId),
|
domBox = domGeometry.getMarginBox(this.domNode),
|
rightPx = domStyle.get(mover.node, 'right');
|
domStyle.set(mover.node, 'left',
|
(containerBox.w - domBox.w - parseInt(rightPx, 10)) + 'px');
|
domStyle.set(mover.node, 'right', '');
|
}
|
},
|
|
onMoving: function(mover) {
|
domStyle.set(mover.node, 'opacity', 0.9);
|
this.moving = true;
|
},
|
|
onMoveStop: function(mover) {
|
domStyle.set(mover.node, 'opacity', 1);
|
var panelBox = domGeometry.getMarginBox(mover.node);
|
this.position.left = panelBox.l;
|
this.position.top = panelBox.t;
|
setTimeout(lang.hitch(this, function() {
|
this.moving = false;
|
}), 500);
|
},
|
|
_getLayoutBox: function() {
|
var pid = jimuConfig.layoutId;
|
if (this.position.relativeTo === 'map') {
|
pid = jimuConfig.mapId;
|
} else {
|
pid = jimuConfig.layoutId;
|
}
|
return domGeometry.getMarginBox(pid);
|
},
|
|
_onMinClick: function(evt) {
|
if (this.windowState === 'minimized') {
|
this.panelManager.normalizePanel(this);
|
} else {
|
this.panelManager.minimizePanel(this);
|
}
|
evt.stopPropagation();
|
},
|
|
_onCloseClick: function(evt) {
|
this.panelManager.closePanel(this, 'wipe');
|
evt.stopPropagation();
|
},
|
|
_onHandleClick: function(evt) {
|
if (this.windowState === 'minimized' && !this.moving) {
|
this.panelManager.normalizePanel(this);
|
}
|
evt.stopPropagation();
|
},
|
|
_calculatePanelPosition: function() {
|
if (this.windowState === 'minimized') {
|
this._minimize();
|
} else {
|
this._normalize();
|
}
|
},
|
|
_minimize: function() {
|
this.disableResizable();
|
domClass.add(this.closeNode, 'minimized');
|
domClass.add(this.minNode, 'minimized');
|
domClass.add(this.handleNode, 'minimized');
|
baseFx.animateProperty({
|
node: this.domNode,
|
properties: {
|
width: {
|
start: this.normalPosition.w,
|
end: this.titleHeight
|
},
|
height: {
|
start: this.normalPosition.h,
|
end: this.titleHeight
|
}
|
},
|
duration: 400
|
}).play();
|
},
|
|
_normalize: function() {
|
this._onResponsible();
|
domClass.remove(this.closeNode, 'minimized');
|
domClass.remove(this.minNode, 'minimized');
|
domClass.remove(this.handleNode, 'minimized');
|
var pos;
|
|
if (this.normalPosition) {
|
pos = {
|
left: this.normalPosition.x,
|
top: this.normalPosition.y,
|
width: this.normalPosition.w,
|
bottom: 'auto',
|
height: this.normalPosition.h,
|
borderRadiusStyle: {
|
borderTopLeftRadius: borderRadius,
|
borderTopRightRadius: borderRadius,
|
borderBottomLeftRadius: 0,
|
borderBottomRightRadius: 0
|
}
|
};
|
baseFx.animateProperty({
|
node: this.domNode,
|
properties: {
|
width: {
|
end: this.normalPosition.w,
|
start: this.titleHeight
|
},
|
height: {
|
end: this.normalPosition.h,
|
start: this.titleHeight
|
}
|
},
|
duration: 400
|
}).play();
|
} else {
|
pos = lang.clone(this.position);
|
if (typeof pos.width === 'undefined') {
|
pos.width = DEFAULT_WIDTH;
|
}
|
if (typeof pos.height === 'undefined') {
|
pos.height = DEFAULT_HEIGHT;
|
}
|
pos.borderRadiusStyle = {
|
borderTopLeftRadius: borderRadius,
|
borderTopRightRadius: borderRadius,
|
borderBottomLeftRadius: borderRadius,
|
borderBottomRightRadius: borderRadius
|
};
|
this._setPositionStyle(pos);
|
}
|
},
|
|
_setPositionStyle: function(pos) {
|
var style;
|
|
if (this.position.zIndex) {
|
pos.zIndex = this.position.zIndex;
|
}
|
this.position.left = pos.left;
|
this.position.top = pos.top;
|
this.position.width = pos.width;
|
this.position.height = pos.height;
|
|
style = utils.getPositionStyle(pos);
|
lang.mixin(style, pos.borderRadiusStyle);
|
|
if (style.zIndex === 'auto') {
|
style.zIndex = 0;
|
}
|
domStyle.set(this.domNode, style);
|
},
|
|
/**
|
* @override
|
* @param {[type]} position [description]
|
* @param {[type]} containerNode [description]
|
*/
|
setPosition: function(position, containerNode) {
|
var style, box, row, col, margin = 10;
|
|
if (!containerNode) {
|
if (position.relativeTo === 'map') {
|
containerNode = window.jimuConfig.mapId;
|
} else {
|
containerNode = window.jimuConfig.layoutId;
|
}
|
}
|
|
box = domGeometry.getMarginBox(containerNode);
|
if (window.appInfo.isRunInMobile) {
|
position.left = 0;
|
position.top = 0;
|
position.width = box.w;
|
position.height = box.h - 220;
|
}
|
|
if (position.left + position.width > box.w) {
|
row = Math.ceil((position.left + position.width - box.w) / box.w);
|
col = Math.floor((position.left + position.width - box.w * row) / position.width);
|
position.left = (row + 1) * margin + col * (position.width + margin);
|
position.top -= margin * row;
|
}
|
|
this.position = position;
|
style = utils.getPositionStyle(this.position);
|
style.position = 'absolute';
|
if (window.appInfo.isRunInMobile) {
|
style.width = '100%';
|
}
|
if (style.zIndex === 'auto') {
|
style.zIndex = 0;
|
}
|
domConstruct.place(this.domNode, containerNode);
|
domStyle.set(this.domNode, style);
|
|
if (this.windowState === 'minimized') {
|
this.panelManager.normalizePanel(this);
|
}
|
|
this._onResponsible();
|
},
|
|
/**
|
* @override
|
* @return {[type]} [description]
|
*/
|
onNormalize: function() {
|
this._calculatePanelPosition();
|
},
|
|
/**
|
* @override
|
* @return {[type]} [description]
|
*/
|
onMinimize: function() {
|
this.normalPosition = domGeometry.position(this.domNode);
|
this._calculatePanelPosition();
|
},
|
|
/**
|
* @override
|
* @return {[type]} [description]
|
*/
|
resize: function(tmp) {
|
if (!tmp) {
|
return;
|
}
|
var pos, style;
|
var zIndex = this.position.zIndex;
|
pos = {
|
left: tmp.l ? tmp.l : this.position.left,
|
top: tmp.t ? tmp.t : this.position.top,
|
width: tmp.w ? tmp.w : this.position.width,
|
height: tmp.h ? tmp.h : this.position.height
|
};
|
this.position = pos;
|
style = utils.getPositionStyle(this.position);
|
style.zIndex = zIndex;
|
if(window.isRTL && 'right' in style){
|
style.left = style.right;
|
style.right = '';
|
}
|
domStyle.set(this.domNode, style);
|
this._onResponsible();
|
this.inherited(arguments);
|
},
|
|
_onResponsible: function() {
|
if (window.appInfo.isRunInMobile) {
|
this.disableMoveable();
|
this.disableResizable();
|
} else {
|
this.makeResizable();
|
this.makeMoveable(this.handleNode, this.position.w, this.position.w * 0.25);
|
}
|
}
|
|
});
|
});
|