define(['dojo/_base/declare', 'dojo/_base/lang', 'dojo/_base/array', 'dojo/_base/html', 'dijit/_WidgetBase', 'dijit/_Container', './dijit/LoadingIndicator', './BaseWidgetFrame', './utils'], function (declare, lang, array, html, _WidgetBase, _Container, LoadingIndicator, BaseWidgetFrame, utils) { return declare([_WidgetBase, _Container], { baseClass: 'jimu-panel jimu-container', started: false, state: 'closed', windowState: 'normal', moveTopOnActive: true, /************** *animations, can be: * string: For open animation: fadeIn, wipeIn ... For close animation: fadeOut, wipeOut ... * array: array of the above effects, will be played one by one * function: an animation function ***************/ openAnimation: null, closeAnimation: null, // onPositionChangeAnimation: null, // animationDuration: 0, startup: function(){ this.inherited(arguments); this.loadAllWidgetsInOrder(); this.started = true; }, loadAllWidgetsInOrder: function(){ var configs = this.getAllWidgetConfigs(); if(Array.isArray(this.config.widgets)){ configs = this.config.widgets; }else{ configs = [this.config]; } array.forEach(configs, function(widgetConfig){ var frame, loading; if(widgetConfig.visible === false){ return; } loading = new LoadingIndicator(); frame = this.createFrame(widgetConfig); this.addChild(frame); frame.setLoading(loading); this.widgetManager.loadWidget(widgetConfig).then(lang.hitch(this, function(widget){ frame.setWidget(widget); widget.startup(); })); }, this); }, getAllWidgetConfigs: function(){ var configs = []; if(Array.isArray(this.config.widgets)){ configs = this.config.widgets; }else{ configs = [this.config]; } return configs; }, getWidgetById: function(widgetId){ var frames = this.getChildren(); for(var i = 0; i < frames.length; i++){ if(frames[i].getWidget() && frames[i].getWidget().id === widgetId){ return frames[i].getWidget(); } } }, getWidgets: function(){ return this.getChildren().map(function(f){ return f.getWidget(); }); }, createFrame: function(widgetSetting){ /*jshint unused: false*/ return new BaseWidgetFrame(); }, setPosition: function(position, containerNode){ this.position = position; var style = utils.getPositionStyle(this.position); style.position = 'absolute'; if(!containerNode){ if(position.relativeTo === 'map'){ containerNode = window.jimuConfig.mapId; }else{ containerNode = window.jimuConfig.layoutId; } } if(this.started){ this.resize(); }else{ if(this.openAnimation){//hiden panel to play animation style.display = 'none'; } } html.place(this.domNode, containerNode); html.setStyle(this.domNode, style); }, getPosition: function(){ return this.position; }, setState: function(state){ this.state = state; // console.log('Panel', this.id, 'state:', state); }, setWindowState: function(state){ this.windowState = state; }, resize: function(){ this.getChildren().forEach(function(frame){ frame.resize(); }); }, onPositionChange: function(position){ this.setPosition(position); }, onOpen: function(){ array.forEach(this.getChildren(), function(frame){ if(frame.getWidget()){ this.widgetManager.openWidget(frame.getWidget()); } }, this); }, onClose: function(){ array.forEach(this.getChildren(), function(frame){ if(frame.getWidget()){ this.widgetManager.closeWidget(frame.getWidget()); } }, this); }, onMaximize: function(){ array.forEach(this.getChildren(), function(frame){ if(frame.getWidget()){ this.widgetManager.maximizeWidget(frame.getWidget()); } }, this); }, onMinimize: function(){ array.forEach(this.getChildren(), function(frame){ if(frame.getWidget()){ this.widgetManager.minimizeWidget(frame.getWidget()); } }, this); }, onNormalize: function(){ array.forEach(this.getChildren(), function(frame){ if(frame.getWidget()){ this.widgetManager.normalizeWidget(frame.getWidget()); } }, this); }, onActive: function(){ // summary: // this function will be called when panel is clicked. }, onDeActive: function(){ // summary: // this function will be called when another panel is clicked. }, //update the config without reload the widget updateConfig: function(_config){ this._updateConfig(_config); }, reloadWidget: function(widgetConfig){ if(!this.isWidgetInPanel(widgetConfig)){ return; } this._updateConfig(widgetConfig); this.getChildren().forEach(function(frame){ if(frame.getWidget() && frame.getWidget().id === widgetConfig.id){ frame.getWidget().destroy(); frame.setLoading(new LoadingIndicator()); this.widgetManager.loadWidget(widgetConfig).then(lang.hitch(this, function(widget){ frame.setWidget(widget); widget.startup(); if(this.state === 'closed'){ this.widgetManager.closeWidget(widget); } })); } }, this); }, isWidgetInPanel: function(widgetConfig){ if(array.some(this.getAllWidgetConfigs(), function(wc){ if(widgetConfig.id === wc.id){ return true; } })){ //the widget is in the panel return true; }else{ return false; } }, _updateConfig: function(widgetConfig) { if(Array.isArray(this.config.widgets)){ var index = -1; for(var i = 0; i < this.config.widgets.length; i++){ if(this.config.widgets[i].id === widgetConfig.id){ index = i; } } if(index > 0){ this.config.widgets[index] = widgetConfig; } }else{ this.config = widgetConfig; } }, destroy: function(){ this.getChildren().forEach(function(frame){ try{ if(frame.domNode){ frame.destroy(); } }catch(error){ console.error('destroy widget frame error.' + error.stack); } }); this.inherited(arguments); } }); });