baseview.js 4.15 KB
/*
 *
 * ADOBE CONFIDENTIAL
 * __________________
 *
 *  Copyright 2014 Adobe Systems Incorporated
 *  All Rights Reserved.
 *
 * NOTICE:  All information contained herein is, and remains
 * the property of Adobe Systems Incorporated and its suppliers,
 * if any.  The intellectual and technical concepts contained
 * herein are proprietary to Adobe Systems Incorporated and its
 * suppliers and are protected by trade secret or copyright law.
 * Dissemination of this information or reproduction of this material
 * is strictly forbidden unless prior written permission is obtained
 * from Adobe Systems Incorporated.
 */

define('screens/player/ui/baseview', [
    'underscore',
    'backbone'
], function(_, Backbone) {
    'use strict';

    var BaseView = Backbone.View.extend(/** @lends BaseView.prototype */{

        /**
         * @classdesc Abstract base View that provides generic methods
         * @class BaseView
         * @extends Backbone.View
         *
         * @param {Object} [options] An object of configurable options.
         */
        constructor: function(options) {
            this._initOptions(options);
            Backbone.View.apply(this, arguments);
        },

        /**
         * initialized the options of an object by applying the given options and default options.
         * The properties of the given options (or default options) are applied onto {@code this.options} if
         * not already present.
         *
         * @param {Object} options configuration options to apply
         * @param {Object} defaultOptions default options to apply
         *
         * @protected
         */
        _initOptions: function(options, defaultOptions) {
            this.options = _.defaults(this.options || {}, options, defaultOptions);
        },

        /**
         * generic initialization of this view
         */
        initialize: function() {
            this._isRendered = false;
            this._isVisible = false;
            this.el.viewController = this;
        },

        /**
         * destroys this view and calls {@link Backbone.View#remove()} which removes the view from the DOM.
         */
        destroy: function() {
            delete this.el.viewController;
            this._isRendered = false;
            this.remove();
        },

        /**
         * hide this view
         * @returns {BaseView} this
         */
        hide: function() {
            this.$el.hide();
            this._isVisible = false;
            return this;
        },

        /**
         * show this view
         * @returns {BaseView} this
         */
        show: function() {
            this.$el.show();
            this._isVisible = true;
            return this;
        },

        /**
         * Helper method to prevent re-rendering if not needed. It sets the rendering state to the given value and
         * returns the previously assigned one.
         * @param {boolean} value the value
         * @returns {boolean} the previously assigned value
         */
        setRendered: function(value) {
            try {
                return this._isRendered;
            } finally {
                this._isRendered = value;
            }
        },

        /**
         * Helper method to prevent re-rendering if not needed. It returns the rendering state of this view.
         * @returns {boolean} true if rendered
         */
        isRendered: function() {
            return this._isRendered;
        },

        /**
         * Returns if the view is shown or not
         * @returns {boolean} true if visibile
         */
        isVisible: function() {
            return this._isVisible;
        },

        /**
         * Dispatches an event on {code}this.el{code}.
         * @param {String} type event type or name
         * @param {Object} [data] additional event data added to event.detail.
         */
        dispatchEvent: function(type, data) {
            var ev = document.createEvent('Event');
            ev.initEvent(type, true, true);
            ev.detail = data || {};
            ev.data = data || {};
            ev.viewController = this;
            this.el.dispatchEvent(ev);
        }

    });

    // return module export
    return BaseView;

});