// ========================================================================== // Project: SproutCore - JavaScript Application Framework // Copyright: ©2006-2011 Strobe Inc. and contributors. // Portions ©2008-2011 Apple Inc. All rights reserved. // License: Licensed under MIT license (see license.js) // ========================================================================== sc_require('views/segmented'); /** @static @type String @constant */ SC.TOP_LOCATION = 'top'; /** @static @type String @constant */ SC.TOP_TOOLBAR_LOCATION = 'top-toolbar'; /** @static @type String @constant */ SC.BOTTOM_LOCATION = 'bottom'; /** @class Incorporates a segmented view and a container view to display the selected tab. Provide an array of items, which will be passed onto the segmented view. @extends SC.View @since SproutCore 1.0 */ SC.TabView = SC.View.extend( /** @scope SC.TabView.prototype */ { /** @type Array @default ['sc-tab-view'] @see SC.View#classNames */ classNames: ['sc-tab-view'], /** @type Array @default ['nowShowing'] @see SC.View#displayProperties */ displayProperties: ['nowShowing'], // .......................................................... // PROPERTIES // /** Set nowShowing with the page you want to display. @type String @default null */ nowShowing: null, /** @type Array @default [] */ items: [], /** @type String @default null */ itemTitleKey: null, /** @type String @default null */ itemValueKey: null, /** @type String @default null */ itemIsEnabledKey: null, /** @type String @default null */ itemIconKey: null, /** @type String @default null */ itemWidthKey: null, /** @type String @default null */ itemToolTipKey: null, /** @type Number @default SC.REGULAR_BUTTON_HEIGHT */ tabHeight: SC.REGULAR_BUTTON_HEIGHT, /** Possible values: - SC.TOP_LOCATION - SC.TOP_TOOLBAR_LOCATION - SC.BOTTOM_LOCATION @type String @default SC.TOP_LOCATION */ tabLocation: SC.TOP_LOCATION, /** If set, then the tab location will be automatically saved in the user defaults. Browsers that support localStorage will automatically store this information locally. @type String @default null */ userDefaultKey: null, // .......................................................... // FORWARDING PROPERTIES // // forward important changes on to child views /** @private */ _tab_nowShowingDidChange: function() { var v = this.get('nowShowing'); this.get('containerView').set('nowShowing',v); this.get('segmentedView').set('value',v); return this ; }.observes('nowShowing'), /** @private */ _tab_saveUserDefault: function() { // if user default is set, save also var v = this.get('nowShowing'); var defaultKey = this.get('userDefaultKey'); if (defaultKey) { SC.userDefaults.set([defaultKey,'nowShowing'].join(':'), v); } }.observes('nowShowing'), /** @private */ _tab_itemsDidChange: function() { this.get('segmentedView').set('items', this.get('items')); return this ; }.observes('items'), /** @private Restore userDefault key if set. */ init: function() { sc_super(); this._tab_nowShowingDidChange()._tab_itemsDidChange(); }, /** @private */ awake: function() { sc_super(); var defaultKey = this.get('userDefaultKey'); if (defaultKey) { defaultKey = [defaultKey,'nowShowing'].join(':'); var nowShowing = SC.userDefaults.get(defaultKey); if (!SC.none(nowShowing)) this.set('nowShowing', nowShowing); } }, /** @private */ createChildViews: function() { var childViews = [], containerView, layout, tabLocation = this.get('tabLocation'), tabHeight = this.get('tabHeight'), controlSize = this.get('controlSize'); if (tabLocation === SC.TOP_LOCATION) { layout = { top: tabHeight/2+1, left: 0, right: 0, bottom: 0, border: 1 }; } else if (tabLocation === SC.TOP_TOOLBAR_LOCATION) { layout = { top: tabHeight+1, left: 0, right: 0, bottom: 0, border: 1 }; } else { layout = { top: 0, left: 0, right: 0, bottom: (tabHeight/2) - 1, border: 1 }; } containerView = this.containerView.extend({ layout: layout, //adding the role ariaRole: 'tabpanel' }); this.containerView = this.createChildView(containerView) ; // The segmentedView managed by this tab view. Note that this TabView uses // a custom segmented view. You can access this view but you cannot change // it. layout = (tabLocation === SC.TOP_LOCATION || tabLocation === SC.TOP_TOOLBAR_LOCATION) ? { height: tabHeight, left: 0, right: 0, top: 0 } : { height: tabHeight, left: 0, right: 0, bottom: 0 } ; this.segmentedView = this.get('segmentedView').extend({ layout: layout, controlSize: controlSize, /** @private When the value changes, update the parentView's value as well. */ _sc_tab_segmented_valueDidChange: function() { var pv = this.get('parentView'); if (pv) pv.set('nowShowing', this.get('value')); }.observes('value'), /** @private */ init: function() { // before we setup the rest of the view, copy key config properties // from the owner view... var pv = this.get('parentView'); if (pv) { SC._TAB_ITEM_KEYS.forEach(function(k) { this[k] = pv.get(k); }, this); } return sc_super(); } }); this.segmentedView = this.createChildView(this.segmentedView) ; childViews.push(this.containerView); childViews.push(this.segmentedView); this.set('childViews', childViews); return this; }, // .......................................................... // COMPONENT VIEWS // /** The containerView managed by this tab view. Note that TabView uses a custom container view. You can access this view but you cannot change it. @type SC.View @default SC.ContainerView @readOnly */ containerView: SC.ContainerView.extend({ renderDelegateName: 'wellRenderDelegate' }), /** @type SC.View @default SC.SegmentedView */ segmentedView: SC.SegmentedView }) ; SC._TAB_ITEM_KEYS = ['itemTitleKey', 'itemValueKey', 'itemIsEnabledKey', 'itemIconKey', 'itemWidthKey', 'itemToolTipKey', 'itemActionKey', 'itemTargetKey'];