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