define([
'dojo/_base/declare',
'dojo/_base/lang',
'dojo/_base/array',
'dojo/_base/html',
'dojo/on',
'dojo/aspect',
'dojo/dom-construct',
'dojo/dom-geometry',
'dojo/dom-class',
'dijit/_WidgetBase',
'dijit/_TemplatedMixin',
'jimu/PanelManager',
'jimu/WidgetManager'
],
function(declare, lang, array, html, on, aspect,
domConstruct, domGeometry, domClass, _WidgetBase, _TemplatedMixin, PanelManager,
WidgetManager) {
var clazz = declare([_WidgetBase, _TemplatedMixin], {
baseClass: 'jimu-dnd-mobile-controller',
templateString: '
',
appConfig: null,
panelContainerNode: null,
openIds: null,
toolsCount: 0,
panels: null,
openPanelIds: null,
widgetOnCloseHandlerIds: null,
panelOnCloseHandlerIds: null,
postCreate: function() {
this.inherited(arguments);
this.panelManager = PanelManager.getInstance();
this.widgetManager = WidgetManager.getInstance();
this.openIds = [];
this.openPanelIds = [];
this.widgetOnCloseHandlerIds = [];
this.panelOnCloseHandlerIds = [];
this.panels = {};
this.createWidgetIcons();
if (this.toolsCount === 0) {
html.setStyle(this.domNode, 'display', 'none');
}
this.own(on(this.iconNode, 'click', lang.hitch(this, function(event) {
event.stopPropagation();
if (domClass.contains(this.containerNode, 'in')) {
domClass.remove(this.containerNode, 'in');
domClass.add(this.containerNode, 'out');
} else {
domClass.remove(this.containerNode, 'out');
domClass.add(this.containerNode, 'in');
}
})));
this.own(on(document.body, 'click', lang.hitch(this, function (event) {
if (domClass.contains(this.containerNode, 'in')) {
var target = event.target || event.srcElement;
if (!this.isPartOfPopup(target)) {
domClass.remove(this.containerNode, 'in');
domClass.add(this.containerNode, 'out');
}
}
})));
},
destroyOnScreenWidgets: function() {
array.forEach(this.appConfig.widgetOnScreen.widgets, function(widget) {
if (widget.inPanel) {
var pid = widget.id + '_panel';
this.panelManager.destroyPanel(pid);
} else {
this.widgetManager.destroyWidget(widget.id);
}
}, this);
},
isPartOfPopup: function (target) {
var node = this.containerNode;
var isInternal = target === node || html.isDescendant(target, node);
return isInternal;
},
setConfig: function(config) {
this.appConfig = config;
this.createWidgetIcons();
},
createWidgetIcons: function() {
this.toolsCount = 0;
domConstruct.empty(this.containerNode);
if (this.appConfig && this.appConfig.widgetOnScreen) {
array.forEach(this.appConfig.widgetOnScreen.widgets, function(widget) {
// widgets in placeholder
if (widget.uri && widget.closeable) {
this._addItem(widget);
this.toolsCount++;
}
}, this);
}
},
_pushId: function(panelId) {
this._popId(panelId);
this.openPanelIds.push(panelId);
},
_popId: function(panelId, update) {
var idx = this.openPanelIds.indexOf(panelId), activePanelId;
if (idx >= 0) {
this.openPanelIds.splice(idx, 1);
if (update && this.openPanelIds.length > 0) {
activePanelId = this.openPanelIds[this.openPanelIds.length - 1];
this.panelManager.openPanel(activePanelId);
}
}
},
_addItem: function(widget) {
var widgetCopy = lang.clone(widget);
var row = domConstruct.create('div', {
'class': 'row'
}, this.containerNode);
domConstruct.create('div', {
'class': 'widget-icon column',
'style': 'background: url(' + widget.icon + ') no-repeat;'
}, row);
domConstruct.create('div', {
'class': 'widget-label jimu-ellipsis column',
title: widget.label,
innerHTML: widget.label
}, row);
this.own(on(row, 'click', lang.hitch(this, function(event) {
var box, panelPosition;
event.stopPropagation();
if (widget.inPanel) {
box = domGeometry.getMarginBox(this.panelContainerNode);
if (window.isRTL) {
panelPosition = {
relativeTo: 'browser',
right: box.l,
top: box.t,
width: box.w,
height: box.h
};
} else {
panelPosition = {
relativeTo: 'browser',
left: box.l,
top: box.t,
width: box.w,
height: box.h
};
}
widgetCopy.panel = {
uri: 'themes/DashboardTheme/panels/OnScreenPanel/Panel',
position: panelPosition
};
this.panelManager.showPanel(widgetCopy)
.then(lang.hitch(this, function(panel) {
this.panels[panel.id] = panel;
this._pushId(panel.id);
panel.setPosition(panelPosition);
if (this.panelOnCloseHandlerIds.indexOf(panel.id) < 0) {
this.own(aspect.after(panel, 'onClose', lang.hitch(this, function() {
this._popId(panel.id, true);
})));
this.panelOnCloseHandlerIds.push(panel.id);
}
return panel;
}))
.then(lang.hitch(this, function(panel) {
this.panelManager.openPanel(panel);
}));
} else {
box = domGeometry.getMarginBox(row);
this._toggleOffPanelWidget(widget, box.l + box.w, box.t);
}
domClass.remove(this.containerNode, 'in');
domClass.add(this.containerNode, 'out');
})));
},
_toggleOffPanelWidget: function(widgetConfig, left, top) {
var index = this.openIds.indexOf(widgetConfig.id);
if (index >= 0) {
this.widgetManager.closeWidget(widgetConfig.id);
this.openIds.splice(index, 1);
} else {
this.widgetManager.loadWidget(widgetConfig).then(
lang.hitch(this, function(widget) {
this.openIds.push(widgetConfig.id);
widget.setPosition({
left: left,
top: top,
zIndex: 100,
relativeTo: 'map'
});
this.widgetManager.openWidget(widget);
if (this.widgetOnCloseHandlerIds.indexOf(widgetConfig.id) < 0) {
this.own(aspect.after(widget, 'onClose', lang.hitch(this, function() {
index = this.openIds.indexOf(widgetConfig.id);
if (index >= 0) {
this.openIds.splice(index, 1);
}
})));
this.widgetOnCloseHandlerIds.push(widgetConfig.id);
}
}));
}
},
setPanelPosition: function(pos) {
array.forEach(this.openPanelIds, lang.hitch(this, function(id, index) {
if (index === this.openPanelIds.length - 1) {
pos.zIndex = 101;
}
if (this.panels[id].state === 'opened' || this.panels[id].state === 'active') {
this.panels[id].setPosition(pos, true);
}
}));
}
});
return clazz;
});