205a5fb59514ea3dce0440c57c3d8d3c3af75d53
[tine20] / tine20 / Tinebase / js / Application.js
1 /*
2  * Tine 2.0
3  * 
4  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
5  * @author      Cornelius Weiss <c.weiss@metaways.de>
6  * @copyright   Copyright (c) 2007-2010 Metaways Infosystems GmbH (http://www.metaways.de)
7  */
8 Ext.ns('Tine.Tinebase');
9
10 /**
11  * <p>Abstract base class for all Tine applications</p>
12  * 
13  * @namespace   Tine.Tinebase
14  * @class       Tine.Tinebase.Application
15  * @extends     Ext.util.Observable
16  * @consturctor
17  * @author      Cornelius Weiss <c.weiss@metaways.de>
18  */
19 Tine.Tinebase.Application = function(config) {
20     config = config || {};
21     Ext.apply(this, config);
22     
23     Tine.Tinebase.Application.superclass.constructor.call(this);
24     
25     this.i18n = new Locale.Gettext();
26     this.i18n.textdomain(this.appName);
27     
28     this.init();
29     if (Tine.CoreData && Tine.CoreData.Manager) {
30         this.registerCoreData();
31     }
32     this.initAutoHooks();
33 };
34
35 Ext.extend(Tine.Tinebase.Application, Ext.util.Observable , {
36     
37     /**
38      * @cfg {String} appName
39      * untranslated application name (required)
40      */
41     appName: null,
42     
43     /**
44      * @cfg {Boolean} hasMainScreen
45      */
46     hasMainScreen: true,
47
48     /**
49      * @cfg {Object} routes
50      */
51     routes: null,
52
53     /**
54      * @property {Locale.gettext} i18n
55      */
56     i18n: null,
57
58     /**
59      * returns title of this application
60      * 
61      * @return {String}
62      */
63     getTitle: function() {
64         return this.i18n._(this.appName);
65     },
66     
67     /**
68      * returns iconCls of this application
69      * 
70      * @param {String} target
71      * @return {String}
72      */
73     getIconCls: function(target) {
74         return this.appName + 'IconCls';
75     },
76     
77     /**
78      * returns the mainscreen of this application
79      * 
80      * @return {Tine.widgets.app.MainScreen}
81      */
82     getMainScreen: function() {
83         if (! this.mainScreen && typeof Tine[this.appName].MainScreen === 'function') {
84             this.mainScreen = new Tine[this.appName].MainScreen({
85                 app: this
86             });
87         }
88         
89         return this.mainScreen;
90     },
91     
92     /**
93      * returns registry of this app
94      * 
95      * @return {Ext.util.MixedCollection}
96      */
97     getRegistry: function() {
98         return Tine[this.appName].registry;
99     },
100     
101     /**
102      * returns true if a specific feature is enabled for this application
103      * 
104      * @param {String} featureName
105      * @return {Boolean}
106      */
107     featureEnabled: function(featureName) {
108         var featureConfig = Tine[this.appName].registry.get("config").features,
109             result = featureConfig && featureConfig.value[featureName];
110
111         if (result == undefined) {
112             // check defaults if key is missing
113             result = featureConfig
114                 && featureConfig.definition
115                 && featureConfig.definition['default']
116                 && featureConfig.definition['default'][featureName];
117         }
118
119         return result;
120     },
121     
122     /**
123      * template function for subclasses to initialize application
124      */
125     init: Ext.emptyFn,
126
127     /**
128      * template function for subclasses to register app core data
129      */
130     registerCoreData: Ext.emptyFn,
131
132     /**
133      * init some auto hooks
134      */
135     initAutoHooks: function() {
136         if (this.addButtonText) {
137             Ext.ux.ItemRegistry.registerItem('Tine.widgets.grid.GridPanel.addButton', {
138                 text: this.i18n._hidden(this.addButtonText), 
139                 iconCls: this.getIconCls(),
140                 scope: this,
141                 handler: function() {
142                     var ms = this.getMainScreen(),
143                         cp = ms.getCenterPanel();
144                         
145                     cp.onEditInNewWindow.call(cp, {});
146                 }
147             });
148         }
149     },
150
151     /**
152      * Ext 5 like route dispatcher
153      *
154      * @see http://docs.sencha.com/extjs/5.0/application_architecture/router.html
155      *
156      * @param {String} action
157      * @param {Array} params
158      */
159     dispatchRoute: function(action, params) {
160         var route, methodName, paramNames;
161
162         if (this.routes) {
163             for (route in this.routes) {
164                 if (this.routes.hasOwnProperty(route)) {
165                     paramNames = route.split('/');
166                     if (action == paramNames.shift()) {
167                         methodName = this.routes[route].action;
168                         break;
169                     }
170                 }
171             }
172         }
173
174         if (methodName) {
175             // @TODO validate parameters according to docs
176
177             return this[methodName].apply(this, params);
178         }
179
180         Ext.MessageBox.show(Ext.apply(defaults, {
181             title: i18n._('Not Supported'),
182             msg: i18n._('Your request is not supported by this version.'),
183             fn: function() {
184                 Tine.Tinebase.common.reload();
185             }
186         }));
187     },
188
189     /**
190      * template function for subclasses is called before app activation. Return false to cancel activation
191      */
192     onBeforeActivate: Ext.emptyFn,
193     
194     /**
195      * template function for subclasses is called after app activation.
196      */
197     onActivate: Ext.emptyFn,
198     
199     /**
200      * template function for subclasses is called before app deactivation. Return false to cancel deactivation
201      */
202     onBeforeDeActivate: Ext.emptyFn,
203     
204     /**
205      * template function for subclasses is called after app deactivation.
206      */
207     onDeActivate: Ext.emptyFn
208     
209 });