/////////////////////////////////////////////////////////////////////////// // Copyright © 2014 - 2018 Esri. All Rights Reserved. // // Licensed under the Apache License Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /////////////////////////////////////////////////////////////////////////// define(['dojo/_base/declare', 'dojo/_base/lang', 'dojo/_base/html', 'dojo/_base/array', 'dijit/_WidgetBase' ], function(declare, lang, html, array, _WidgetBase) { return declare(_WidgetBase, { // summary: // a dijit which can hold many views but display only one at on time // description: // the constructor params is {views: []}, every view should have a property: label. // View can be a dijit or dom baseClass: 'jimu-viewstack', declaredClass: 'jimu.dijit.ViewStack', _currentView: null, postCreate: function() { this.inherited(arguments); if(!this.views){ this.views = []; } array.forEach(this.views, lang.hitch(this, function(view){ if(view.nodeType === 1){ html.place(view, this.domNode); html.addClass(view, 'view'); html.setStyle(view, 'display', 'none'); } else if(view.domNode){ html.place(view.domNode, this.domNode); html.addClass(view.domNode, 'view'); html.setStyle(view.domNode, 'display', 'none'); } })); }, startup: function() { this.inherited(arguments); if(this.views.length > 0){ this.switchView(0); } }, getSelectedView: function(){ return this._currentView; }, getSelectedLabel: function(){ var label = ''; var view = this.getSelectedView(); if(view){ label = view.label; } return label; }, getViewByLabel: function(label){ for(var i = 0; i < this.views.length; i++){ if(label === this.views[i].label){ return this.views[i]; } } return null; }, addView: function(view){ this.views.push(view); if(view.nodeType === 1){ html.place(view, this.domNode); html.addClass(view, 'view'); } else if(view.domNode){ html.place(view.domNode, this.domNode); html.addClass(view.domNode, 'view'); } }, removeView: function(view){ var c1 = this.views.length; this.views = array.filter(this.views, function(v){ return view !== v; }); var c2 = this.views.length; if(c1 !== c2){ if(view.nodeType === 1){ html.destroy(view); } else if(view.domNode){ view.destroyRecursive(); } } }, switchView: function(v){ var view, dom; if(typeof v === 'number'){ view = this.views[v]; }else if(typeof v === 'string'){ view = this.getViewByLabel(v); }else{ view = v; } this.views.forEach(lang.hitch(this, function(_v){ if(!_v){ return; } if(_v.nodeType === 1){ dom = _v; } else if(_v.domNode){ dom = _v.domNode; } if(_v === view){ html.setStyle(dom, 'display', 'block'); if(_v.domNode){ if(!_v._started){ _v.startup(); _v._started = true; }else if(typeof _v.onShown === 'function'){ _v.onShown(); } } } else{ html.setStyle(dom, 'display', 'none'); if(_v.domNode && typeof _v.onHidden === 'function'){ _v.onHidden(); } } })); this._currentView = view; this.onViewSwitch(view); }, onViewSwitch: function(){} }); });