define([ 'dojo/_base/declare', 'dojo/_base/array', 'dojo/_base/lang', 'dojo/_base/html', 'dojo/aspect', 'dojo/query', 'dojo/on', 'dojo/dom-attr', 'dojo/dom-class', 'dojo/dom-construct', 'dojo/dom-geometry', 'dojo/dom-style', 'jimu/BaseWidget', 'jimu/PoolControllerMixin', 'jimu/utils' ], function(declare, array, lang, html, aspect, query, on, domAttr, domClass, domConstruct, domGeometry, domStyle, BaseWidget, PoolControllerMixin, utils) { /* jshint scripturl:true */ var clazz = declare([BaseWidget, PoolControllerMixin], { baseClass: 'dart-controller dart-bgcolor jimu-main-background shadow', height: 54, minimized: false, collapsed: false, iconCount: 0, wPos: { bottom: 78, right: 0 }, panelCount: 0, openedId: '', openedIds: [], // post create postCreate: function() { this.inherited(arguments); this.titleNode.innerHTML = utils.sanitizeHTML(this.appConfig.title ? this.appConfig.title : ''); on(this.toggleNode, "click", lang.hitch(this, this._toggleController)); on(this.collapseNode, "click", lang.hitch(this, this._collapseController)); this.own(on(this.widgetManager, 'widget-created', lang.hitch(this, this._onWidgetCreation))); on(window, "resize", lang.hitch(this, this._resizeWindow)); }, // startup startup: function() { this.inherited(arguments); this._createIconNodes(); }, // on action onAction: function(action, data) { /*jshint unused: false*/ if (action === 'highLight' && data) { var node = query('div[settingid="' + data.widgetId + '"]', this.domNode)[0]; this._highLight(node); } if (action === 'removeHighLight') { this._removeHighLight(); } }, // destroy destroy: function() { if (this.timeoutHandle) { clearTimeout(this.timeoutHandle); this.timeoutHandle = null; } this.inherited(arguments); }, // on app config changed onAppConfigChanged: function(appConfig, reason, changedData) { switch (reason) { case 'attributeChange': this._onAttributeChange(appConfig, changedData); break; case 'layoutChange': break; default: return; } }, getOpenedIds: function() { this.inherited(arguments); var ids = []; if (this.openedId && this.openedId !== '') { ids.push(this.openedId); } array.forEach(this.openedIds, function(id) { ids.push(id); }); return ids; }, setOpenedIds: function(ids) { var interval = 0; for (var i = 0; i < ids.length; i++) { interval += 600; setTimeout(lang.hitch(this, this._switchNodeToOpen), interval, ids[i]); } }, _onWidgetCreation: function(widget) { if (widget.name === 'Search') { this._resizeWindow(); } }, // resize window _resizeWindow: function() { if (this.resizeTimer) { clearTimeout(this.resizeTimer); this.resizeTimer = null; } this.resizeTimer = setTimeout(lang.hitch(this, this._resizeController), 600); }, // resize controller _resizeController: function() { if (!this.minimized) { try { var box = domGeometry.getContentBox(this.domNode); var boxTools = domGeometry.getContentBox(this.toolsNode); var balance = (box.w - boxTools.w - 35); var count = Math.floor(balance / this.height); var w = this.height * count; domStyle.set(this.barNode, "width", w + 'px'); domStyle.set(this.pagesNode, "width", w + 'px'); this._createPages(); domClass.remove(this.toolsNode, "dart-controller-tools-anim"); } catch (ex) { console.log(ex); } } }, // toggle controller _toggleController: function() { if (this.minimized) { this._maximizeController(); } else { this._minimizeController(); } }, // maximize controller _maximizeController: function() { this.minimized = false; domClass.remove(this.domNode, "dart-controller-minimized"); if (this.openedId) { var node = this._getIconNodeById(this.openedId); if (node.config.inPanel === false) { this._switchNodeToClose(this.openedId); } } setTimeout(lang.hitch(this, this._resizeController), 600); }, // minimize controller _minimizeController: function() { this.minimized = true; domClass.add(this.domNode, "dart-controller-minimized"); if (this.collapsed) { this._expand(); } }, // collapse controller _collapseController: function() { if (this.collapsed) { this._expand(); } else { this._collapse(); } }, // collapse _collapse: function() { this.collapsed = true; domClass.add(this.toolsNode, "dart-controller-tools-anim"); domClass.add(this.toolsNode, "dart-controller-tools-collapsed"); setTimeout(lang.hitch(this, this._resizeController), 600); }, // expand _expand: function() { this.collapsed = false; domClass.add(this.toolsNode, "dart-controller-tools-anim"); domClass.remove(this.toolsNode, "dart-controller-tools-collapsed"); setTimeout(lang.hitch(this, this._resizeController), 600); }, // highlight _highLight: function(node) { if (this.hlDiv) { this._removeHighLight(); } if (!node) { return; } var position = domGeometry.getMarginBox(node); var hlStyle = { position: 'absolute', left: (position.l) + 'px', top: (position.t) + 'px', width: (position.w) + 'px', height: (position.h) + 'px' }; this.hlDiv = domConstruct.create('div', { "style": hlStyle, "class": 'icon-highlight' }, node, 'before'); }, // remove highlight _removeHighLight: function() { if (this.hlDiv) { domConstruct.destroy(this.hlDiv); this.hlDiv = null; } }, // on attribute change _onAttributeChange: function(appConfig, changedData) { /*jshint unused: false*/ if (changedData.title !== undefined && changedData.title !== this.appConfig.title) { this.titleNode.innerHTML = utils.sanitizeHTML(changedData.title ? changedData.title : ''); } }, // create icon nodes _createIconNodes: function() { html.empty(this.containerNode); this.openedIds = []; var i, iconConfig, name, allIconConfigs = this.getAllConfigs(); var defaultSearch = true; var openAtStartNode; this.iconCount = 0; for (i = 0; i < allIconConfigs.length; i++) { iconConfig = allIconConfigs[i]; name = iconConfig.name; if (name === "ZoomSlider" || name === "HomeButton" || name === "MyLocation" || name === "ExtentNavigate") { this._createChildWidget(iconConfig); } else if (name === "Search" && defaultSearch) { defaultSearch = false; this._createChildWidget(iconConfig); } else { this.iconCount += 1; var node = this._createIconNode(iconConfig); if (iconConfig.openAtStart) { openAtStartNode = node; } } } var containerStyle = { width: this.iconCount * this.height + 'px' }; html.setStyle(this.containerNode, containerStyle); //open the first openatstart widget if (openAtStartNode && !this.openAtStartWidget) { this._onIconClick(openAtStartNode); this.openAtStartWidget = openAtStartNode.config.name; } }, // create pages _createPages: function() { var visW = domGeometry.getContentBox(this.barNode).w; if (visW > 0) { var w = this.iconCount * this.height; var pageCount = Math.ceil(w / visW); var list = this.pageListNode; list.innerHTML = ""; if (pageCount > 1) { for (var i = 0; i < pageCount; i++) { var id = "page" + i; var link = domConstruct.create("li", { id: id }, list); this.own(on(link, "click", lang.hitch(this, this._setPage, i))); } if (!this.page || this.page >= pageCount) { this.page = 0; } this._setPage(this.page); } else { domStyle.set(this.containerNode, "left", "0px"); } } }, // set page _setPage: function(num) { var visW = domGeometry.getContentBox(this.barNode).w; domClass.remove("page" + this.page, "active"); this.page = num; domClass.add("page" + this.page, "active"); var pos = 0 - (num * visW) + 'px'; var prop = "left"; if (window.isRTL) { prop = "right"; } domStyle.set(this.containerNode, prop, pos); }, // create child widget _createChildWidget: function(iconConfig) { this.widgetManager.loadWidget(iconConfig).then(lang.hitch(this, function(widget) { var name = iconConfig.name; switch (name) { case "ZoomSlider": domConstruct.place(widget.domNode, this.navNode); domAttr.set(this.navNode, "settingId", iconConfig.id); domStyle.set(this.navNode, "display", "block"); break; case "HomeButton": domConstruct.place(widget.domNode, this.homeNode); domAttr.set(this.homeNode, "settingId", iconConfig.id); domStyle.set("homeNode", "display", "block"); break; case "MyLocation": domConstruct.place(widget.domNode, this.locateNode); domAttr.set(this.locateNode, "settingId", iconConfig.id); domStyle.set("locateNode", "display", "block"); break; case "ExtentNavigate": widget.setOrientation(false); domConstruct.place(widget.domNode, this.extentNavigateNode); domAttr.set(this.extentNavigateNode, "settingId", iconConfig.id); domStyle.set(this.extentNavigateDiv, "display", "block"); break; case "Search": domConstruct.place(widget.domNode, this.searchNode); domAttr.set(this.searchNode, "settingId", iconConfig.id); domStyle.set("searchNode", "display", "block"); break; } this.widgetManager.openWidget(widget); })); }, // create icon node _createIconNode: function(iconConfig) { var node, iconUrl; iconUrl = iconConfig.icon; node = html.create('div', { 'class': 'icon-node', title: iconConfig.label, settingId: iconConfig.id }, this.containerNode); html.create('img', { src: iconUrl }, node); node.config = iconConfig; on(node, 'click', lang.hitch(this, this._onIconClick, node)); return node; }, // on icon click _onIconClick: function(node) { var id = node.config.id; if (this.openedIds.indexOf(id) !== -1) { this._switchNodeToClose(id); } else { this._switchNodeToOpen(id); } }, // switch node to open _switchNodeToOpen: function(id) { var node = this._getIconNodeById(id); if (!node) { return; } if (node.config.widgets && node.config.widgets.length > 1) { var interval = 0; array.forEach(node.config.widgets, lang.hitch(this, function(w) { setTimeout(lang.hitch(this, this._showIconContent), interval, w); interval += 600; })); } else { this._showIconContent(node.config); if (node.config.inPanel) { domClass.add(node, "icon-node-active"); } } }, // switch node to close _switchNodeToClose: function(id) { var node = this._getIconNodeById(id); if (!node) { return; } if (node.config.inPanel === false) { this.openedId = ''; this.widgetManager.closeWidget(id); } else { var idx = this.openedIds.indexOf(id); if (idx !== -1) { this.openedIds.splice(idx, 1); } this._updatePanelCount(-1); domClass.remove(node, "icon-node-active"); this.panelManager.closePanel(id + '_panel'); } }, // get icon node by id _getIconNodeById: function(id) { var node = query('.icon-node[settingId="' + id + '"]', this.domNode); if (node.length === 0) { return; } return node[0]; }, // show icon content _showIconContent: function(iconConfig) { if (iconConfig.inPanel === false) { var name = iconConfig.name; this.widgetManager.loadWidget(iconConfig).then(lang.hitch(this, function(widget) { this.openedId = iconConfig.id; html.setStyle(widget.domNode, 'zIndex', 0); if (name !== "OverviewMap") { widget.setPosition(this.wPos, window.jimuConfig.mapId); } this.widgetManager.openWidget(widget); domStyle.set(widget.domNode, "display", null); this._minimizeController(); })); } else { var pid = iconConfig.id + '_panel'; var panel = this.panelManager.getPanelById(pid); var pos = this._getNextPosition(); if (panel) { pos = panel.position; } iconConfig.panel.position = pos; this.openedIds.push(iconConfig.id); this.panelManager.showPanel(iconConfig).then(lang.hitch(this, function(panel) { aspect.after(panel, 'onClose', lang.hitch(this, function() { this._switchNodeToClose(iconConfig.id); })); })); } }, // get next position _getNextPosition: function() { this._updatePanelCount(1); var offset = (this.panelCount - 1) * 10 + 10; var pos = { top: offset, left: offset, width: 320, height: 450, relativeTo: 'map' }; return pos; }, // update panel count _updatePanelCount: function(value) { this.panelCount += value; if (this.panelCount < 0) { this.panelCount = 0; } } }); return clazz; });