source: Dev/branches/rest-dojo-ui/client/dojox/mobile/app/SceneController.js @ 256

Last change on this file since 256 was 256, checked in by hendrikvanantwerpen, 13 years ago

Reworked project structure based on REST interaction and Dojo library. As
soon as this is stable, the old jQueryUI branch can be removed (it's
kept for reference).

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.