source: Dev/trunk/src/client/dojox/mobile/app/SceneController.js @ 532

Last change on this file since 532 was 483, checked in by hendrikvanantwerpen, 11 years ago

Added Dojo 1.9.3 release.

File size: 4.2 KB
Line 
1dojo.provide("dojox.mobile.app.SceneController");
2dojo.experimental("dojox.mobile.app.SceneController");
3dojo.require("dojox.mobile._base");
4
5(function(){
6
7        var app = dojox.mobile.app;
8
9        var templates = {};
10
11        dojo.declare("dojox.mobile.app.SceneController", dojox.mobile.View, {
12
13                stageController: null,
14
15                keepScrollPos: false,
16
17                init: function(sceneName, params){
18                        // summary:
19                        //              Initializes the scene by loading the HTML template and code, if it has
20                        //              not already been loaded
21
22                        this.sceneName = sceneName;
23                        this.params = params;
24                        var templateUrl = app.resolveTemplate(sceneName);
25
26                        this._deferredInit = new dojo.Deferred();
27
28                        if(templates[sceneName]){
29                                // If the template has been cached, do not load it again.
30                                this._setContents(templates[sceneName]);
31                        }else{
32                                // Otherwise load the template
33                                dojo.xhrGet({
34                                        url: templateUrl,
35                                        handleAs: "text"
36                                }).addCallback(dojo.hitch(this, this._setContents));
37                        }
38
39                        return this._deferredInit;
40                },
41
42                _setContents: function(templateHtml){
43                        // summary:
44                        //              Sets the content of the View, and invokes either the loading or
45                        //              initialization of the scene assistant.
46                        templates[this.sceneName] = templateHtml;
47
48                        this.domNode.innerHTML = "<div>" + templateHtml + "</div>";
49
50                        var sceneAssistantName = "";
51
52                        var nameParts = this.sceneName.split("-");
53
54                        for(var i = 0; i < nameParts.length; i++){
55                                sceneAssistantName += nameParts[i].substring(0, 1).toUpperCase()
56                                                        + nameParts[i].substring(1);
57                        }
58                        sceneAssistantName += "Assistant";
59                        this.sceneAssistantName = sceneAssistantName;
60
61                        var _this = this;
62
63                        dojox.mobile.app.loadResourcesForScene(this.sceneName, function(){
64
65                                console.log("All resources for ",_this.sceneName," loaded");
66
67                                var assistant;
68                                if(typeof(dojo.global[sceneAssistantName]) != "undefined"){
69                                        _this._initAssistant();
70                                }else{
71                                        var assistantUrl = app.resolveAssistant(_this.sceneName);
72
73                                        dojo.xhrGet({
74                                                url: assistantUrl,
75                                                handleAs: "text"
76                                        }).addCallback(function(text){
77                                                try{
78                                                        dojo.eval(text);
79                                                }catch(e){
80                                                        console.log("Error initializing code for scene " + _this.sceneName
81                                                        + '. Please check for syntax errors');
82                                                        throw e;
83                                                }
84                                                _this._initAssistant();
85                                        });
86                                }
87                        });
88
89                },
90
91                _initAssistant: function(){
92                        // summary:
93                        //              Initializes the scene assistant. At this point, the View is
94                        //              populated with the HTML template, and the scene assistant type
95                        //              is declared.
96
97                        console.log("Instantiating the scene assistant " + this.sceneAssistantName);
98
99                        var cls = dojo.getObject(this.sceneAssistantName);
100
101                        if(!cls){
102                                throw Error("Unable to resolve scene assistant "
103                                                        + this.sceneAssistantName);
104                        }
105
106                        this.assistant = new cls(this.params);
107
108                        this.assistant.controller = this;
109                        this.assistant.domNode = this.domNode.firstChild;
110
111                        this.assistant.setup();
112
113                        this._deferredInit.callback();
114                },
115
116                query: function(selector, node){
117                        // summary:
118                        //              Queries for DOM nodes within either the node passed in as an argument
119                        //              or within this view.
120
121                        return dojo.query(selector, node || this.domNode)
122                },
123
124                parse: function(node){
125                        var widgets = this._widgets =
126                                dojox.mobile.parser.parse(node || this.domNode, {
127                                        controller: this
128                                });
129
130                        // Tell all widgets what their controller is.
131                        for(var i = 0; i < widgets.length; i++){
132                                widgets[i].set("controller", this);
133                        }
134                },
135
136                getWindowSize: function(){
137                        // TODO, this needs cross browser testing
138
139                        return {
140                                w: dojo.global.innerWidth,
141                                h: dojo.global.innerHeight
142                        }
143                },
144
145                showAlertDialog: function(props){
146
147                        var size = dojo.marginBox(this.assistant.domNode);
148                        var dialog = new dojox.mobile.app.AlertDialog(
149                                        dojo.mixin(props, {controller: this}));
150                        this.assistant.domNode.appendChild(dialog.domNode);
151
152                        console.log("Appended " , dialog.domNode, " to ", this.assistant.domNode);
153                        dialog.show();
154                },
155
156                popupSubMenu: function(info){
157                        var widget = new dojox.mobile.app.ListSelector({
158                                controller: this,
159                                destroyOnHide: true,
160                                onChoose: info.onChoose
161                        });
162
163                        this.assistant.domNode.appendChild(widget.domNode);
164
165                        widget.set("data", info.choices);
166                        widget.show(info.fromNode);
167                }
168        });
169
170})();
Note: See TracBrowser for help on using the repository browser.