0011996: add fallback app icon
[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         var iconCls = this.appName + 'IconCls';
75         if (! Ext.util.CSS.getRule('.' + iconCls)) {
76             iconCls = 'ApplicationIconCls';
77         }
78
79         return iconCls;
80     },
81     
82     /**
83      * returns the mainscreen of this application
84      * 
85      * @return {Tine.widgets.app.MainScreen}
86      */
87     getMainScreen: function() {
88         if (! this.mainScreen && typeof Tine[this.appName].MainScreen === 'function') {
89             this.mainScreen = new Tine[this.appName].MainScreen({
90                 app: this
91             });
92         }
93         
94         return this.mainScreen;
95     },
96     
97     /**
98      * returns registry of this app
99      * 
100      * @return {Ext.util.MixedCollection}
101      */
102     getRegistry: function() {
103         return Tine[this.appName].registry;
104     },
105     
106     /**
107      * returns true if a specific feature is enabled for this application
108      * 
109      * @param {String} featureName
110      * @return {Boolean}
111      */
112     featureEnabled: function(featureName) {
113         var featureConfig = Tine[this.appName].registry.get("config").features,
114             result = featureConfig && featureConfig.value[featureName];
115
116         if (result == undefined) {
117             // check defaults if key is missing
118             result = featureConfig
119                 && featureConfig.definition
120                 && featureConfig.definition['default']
121                 && featureConfig.definition['default'][featureName];
122         }
123
124         return result;
125     },
126     
127     /**
128      * template function for subclasses to initialize application
129      */
130     init: Ext.emptyFn,
131
132     /**
133      * template function for subclasses to register app core data
134      */
135     registerCoreData: Ext.emptyFn,
136
137     /**
138      * init some auto hooks
139      */
140     initAutoHooks: function() {
141         if (this.addButtonText) {
142             Ext.ux.ItemRegistry.registerItem('Tine.widgets.grid.GridPanel.addButton', {
143                 text: this.i18n._hidden(this.addButtonText), 
144                 iconCls: this.getIconCls(),
145                 scope: this,
146                 handler: function() {
147                     var ms = this.getMainScreen(),
148                         cp = ms.getCenterPanel();
149                         
150                     cp.onEditInNewWindow.call(cp, {});
151                 }
152             });
153         }
154     },
155
156     /**
157      * Ext 5 like route dispatcher
158      *
159      * @see http://docs.sencha.com/extjs/5.0/application_architecture/router.html
160      *
161      * @param {String} action
162      * @param {Array} params
163      */
164     dispatchRoute: function(action, params) {
165         var route, methodName, paramNames;
166
167         if (this.routes) {
168             for (route in this.routes) {
169                 if (this.routes.hasOwnProperty(route)) {
170                     paramNames = route.split('/');
171                     if (action == paramNames.shift()) {
172                         methodName = this.routes[route].action;
173                         break;
174                     }
175                 }
176             }
177         }
178
179         if (methodName) {
180             // @TODO validate parameters according to docs
181
182             return this[methodName].apply(this, params);
183         }
184
185         Ext.MessageBox.show(Ext.apply(defaults, {
186             title: i18n._('Not Supported'),
187             msg: i18n._('Your request is not supported by this version.'),
188             fn: function() {
189                 Tine.Tinebase.common.reload();
190             }
191         }));
192     },
193
194     /**
195      * template function for subclasses is called before app activation. Return false to cancel activation
196      */
197     onBeforeActivate: Ext.emptyFn,
198     
199     /**
200      * template function for subclasses is called after app activation.
201      */
202     onActivate: Ext.emptyFn,
203     
204     /**
205      * template function for subclasses is called before app deactivation. Return false to cancel deactivation
206      */
207     onBeforeDeActivate: Ext.emptyFn,
208     
209     /**
210      * template function for subclasses is called after app deactivation.
211      */
212     onDeActivate: Ext.emptyFn
213     
214 });