diff src/DML/MainVisBundle/Resources/assets/marionette/modules/ContextModule/ContextModule.40-AppContext.js @ 0:493bcb69166c

added public content
author Daniel Wolff
date Tue, 09 Feb 2016 20:54:02 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/DML/MainVisBundle/Resources/assets/marionette/modules/ContextModule/ContextModule.40-AppContext.js	Tue Feb 09 20:54:02 2016 +0100
@@ -0,0 +1,118 @@
+"use strict";
+
+App.module("ContextModule", function(ContextModule, App, Backbone, Marionette, $, _, Logger) {
+
+    // Define private variables
+    var logger = null;
+
+    ContextModule.addInitializer(function(options){
+        
+        logger = Logger.get("ContextModule.AppContext");
+        logger.setLevel(Logger.DEBUG);
+        
+        /**
+         * AppContext is an object that describes the current user’s environment.
+         * It keeps the current state, a history of states and state bookmarks.
+         */
+        ContextModule.AppContext = Backbone.Model.extend({
+            defaults: function() {
+                return {
+                    state: new ContextModule.State(),
+                    stateHistory: new ContextModule.StateHistory(),
+                    stateBookmarks: new ContextModule.StateBookmarkCollection()
+                };
+            },
+
+            /**
+             * @memberOf App.ContextModule.AppContext
+             */
+            initialize: function() {
+                this._modificationPropagationEnabled = true;
+                this._linkBetweenStateAndStateHistoryEnabled = true;
+                this._attributesWereModified = false;
+
+                this._registerStateChange();
+                
+                this.attributes.state.bind("change", this._registerStateChange, this);
+                this.attributes.stateHistory.bind("change", this._registerStateHistoryChange, this);
+                this.attributes.stateBookmarks.bind("change", this._registerStateBookmarksChange, this);
+            },
+
+            /**
+             * @memberOf App.ContextModule.AppContext
+             */
+            serialize: function() {
+                //logger.debug("method called: AppContext::serialize");
+                var result = {
+                        stateHistory: this.attributes.stateHistory.serialize(),
+                        stateBookmarks: this.attributes.stateBookmarks.serialize(),
+                };
+                
+                return result;
+            },
+            
+            /**
+             * @memberOf App.ContextModule.AppContext
+             */
+            unserialize: function(serializedAttributes) {
+                //logger.debug("method called: AppContext::unserialize");
+                this._modificationPropagationEnabled = false;
+                
+                var fixedSerializedAttributes = serializedAttributes;
+                if (!_.isSimpleObject(fixedSerializedAttributes)) {
+                    logger.warn("AppContext::unserialize called for not an object: ", serializedAttributes);
+                    fixedSerializedAttributes = {};
+                }
+                this.attributes.stateBookmarks.unserialize(fixedSerializedAttributes.stateBookmarks);
+                
+                var serializedStateHistory = fixedSerializedAttributes["stateHistory"];
+                if (!_.isSimpleObject(serializedStateHistory)) {
+                    serializedStateHistory = {};
+                }
+                this._linkBetweenStateAndStateHistoryEnabled = false;
+                this.attributes.state.unserialize(serializedStateHistory.currentSerializedState);
+                serializedStateHistory.currentSerializedState = this.attributes.state.serialize();
+                this.attributes.stateHistory.unserialize(serializedStateHistory);
+                this._linkBetweenStateAndStateHistoryEnabled = true;
+                
+                this._triggerModificationEventsIfNeeded();
+                this._modificationPropagationEnabled = true;
+            },
+            
+            _registerStateChange: function() {
+                if (this._linkBetweenStateAndStateHistoryEnabled) {
+                    this.attributes.stateHistory.set("currentSerializedState", this.attributes.state.serialize());
+                }
+                this._registerModificationOfAttribute();
+            },
+
+            _registerStateHistoryChange: function() {
+                if (this._linkBetweenStateAndStateHistoryEnabled) {
+                    this.attributes.state.unserialize(this.attributes.stateHistory.get("currentSerializedState"));
+                }
+                if (this._stateHistoryModificationPropagationEnabled) {
+                    this._registerModificationOfAttribute();
+                }
+            },
+            
+            _registerStateBookmarksChange: function() {
+                this._registerModificationOfAttribute();
+            },
+            
+            _registerModificationOfAttribute: function() {
+                this._attributesWereModified = true;
+                if (this._modificationPropagationEnabled) {
+                    this._triggerModificationEventsIfNeeded();
+                };
+            },
+
+            _triggerModificationEventsIfNeeded: function() {
+                if (this._attributesWereModified) {
+                    this.trigger("change");
+                }
+                this._attributesWereModified = false;
+            },
+        });
+
+    });
+}, Logger);