summaryrefslogtreecommitdiff
path: root/libopie2/opiecore/oapplicationfactory.h
authormickeyl <mickeyl>2004-01-15 15:50:38 (UTC)
committer mickeyl <mickeyl>2004-01-15 15:50:38 (UTC)
commit53fa609d585216173c834cd1f22678a087394cde (patch) (unidiff)
tree750759ec9a94326fc68e3ae573350c47b7aa52fe /libopie2/opiecore/oapplicationfactory.h
parent84bb8c9046007fe2adfaa016aded88b961c65e62 (diff)
downloadopie-53fa609d585216173c834cd1f22678a087394cde.zip
opie-53fa609d585216173c834cd1f22678a087394cde.tar.gz
opie-53fa609d585216173c834cd1f22678a087394cde.tar.bz2
- add oapplicationfactory to opiecore
- add big screen examples
Diffstat (limited to 'libopie2/opiecore/oapplicationfactory.h') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiecore/oapplicationfactory.h293
1 files changed, 293 insertions, 0 deletions
diff --git a/libopie2/opiecore/oapplicationfactory.h b/libopie2/opiecore/oapplicationfactory.h
new file mode 100644
index 0000000..6e10552
--- a/dev/null
+++ b/libopie2/opiecore/oapplicationfactory.h
@@ -0,0 +1,293 @@
1/*
2                 This file is part of the Opie Project
3              Copyright (C) Holger Freyther <zecke@handhelds.org>
4 =.
5 .=l.
6           .>+-=
7 _;:,     .>    :=|. This program is free software; you can
8.> <`_,   >  .   <= redistribute it and/or modify it under
9:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
10.="- .-=="i,     .._ License as published by the Free Software
11 - .   .-<_>     .<> Foundation; either version 2 of the License,
12     ._= =}       : or (at your option) any later version.
13    .%`+i>       _;_.
14    .i_,=:_.      -<s. This program is distributed in the hope that
15     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
16    : ..    .:,     . . . without even the implied warranty of
17    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
18  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
19..}^=.=       =       ; Library General Public License for more
20++=   -.     .`     .: details.
21 :     =  ...= . :.=-
22 -.   .:....=;==+<; You should have received a copy of the GNU
23  -_. . .   )=.  = Library General Public License along with
24    --        :-=` this library; see the file COPYING.LIB.
25 If not, write to the Free Software Foundation,
26 Inc., 59 Temple Place - Suite 330,
27 Boston, MA 02111-1307, USA.
28*/
29
30/*
31 This work is derived from:
32 ----
33 The Loki Library
34 Copyright (c) 2001 by Andrei Alexandrescu
35 This code accompanies the book:
36 Alexandrescu, Andrei. "Modern C++ Design: Generic Programming and Design
37 Patterns Applied". Copyright (c) 2001. Addison-Wesley.
38 Permission to use, copy, modify, distribute and sell this software for any
39 purpose is hereby granted without fee, provided that the above copyright
40 notice appear in all copies and that both that copyright notice and this
41 permission notice appear in supporting documentation.
42 The author or Addison-Welsey Longman make no representations about the
43 suitability of this software for any purpose. It is provided "as is"
44 without express or implied warranty.
45 ----
46
47 And KGenericFactor et all from Simon Hausmann <tronical@kde.org>
48
49*/
50
51#include <qstring.h>
52#include <qmetaobject.h>
53
54#include <qtopia/qcom.h>
55#include <qtopia/applicationinterface.h>
56
57namespace Opie {
58 struct NullType;
59
60 template <class T, class U>
61 struct Typelist
62 {
63 typedef T Head;
64 typedef U Tail;
65 };
66 template<
67 typename T1 = NullType, typename T2 = NullType, typename T3 = NullType,
68 typename T4 = NullType, typename T5 = NullType, typename T6 = NullType,
69 typename T7 = NullType, typename T8 = NullType, typename T9 = NullType,
70 typename T10 = NullType, typename T11 = NullType, typename T12 = NullType,
71 typename T13 = NullType, typename T14 = NullType, typename T15 = NullType,
72 typename T16 = NullType, typename T17 = NullType, typename T18 = NullType
73 >
74 struct MakeTypelist{
75 private:
76 typedef typename MakeTypelist
77 <
78 T2 , T3 , T4 ,
79 T5 , T6 , T7 ,
80 T8 , T9 , T10,
81 T11, T12, T13,
82 T14, T15, T16,
83 T17, T18
84 >
85 ::Result TailResult;
86
87public:
88 typedef Typelist<T1, TailResult> Result;
89};
90
91template<>
92struct MakeTypelist<>
93{
94 typedef NullType Result;
95};
96
97}
98
99/**
100 * To allow your application to be quick launched some one needs
101 * to create the QWidget.
102 * This is this factory. Make surce your widget has static QString Widget::appName()
103 * as one of its functions.
104 *
105 * This template takes one QWidget and initialized it in the form of
106 * MyWidget::MyWidget( QWidget* parent, const char* name, WFlags f );
107 *
108 * To use it on your app do that:
109 * typedef OApplicationFactory<MyWidget> MyFactory;
110 * OPIE_EXPORT_APP( MyFactory )
111 *
112 */
113template <class Product>
114struct OApplicationFactory : public ApplicationInterface {
115 QRESULT queryInterface( const QUuid &uuid, QUnknownInterface **iface ) {
116 *iface = 0;
117 if ( uuid == IID_QUnknown ) *iface = this;
118 else if ( uuid == IID_QtopiaApplication ) *iface = this;
119 else return QS_FALSE;
120 (*iface)->addRef();
121 return QS_OK;
122 }
123
124 /*
125 *
126 */
127 virtual QWidget *createMainWindow( const QString& appName, QWidget* parent,
128 const char* name, Qt::WFlags f ) {
129 if (appName == Product::appName() )
130 return new Product(parent, name, f );
131 else
132 return 0l;
133 }
134
135 virtual QStringList applications()const {
136 QStringList list;
137 list << Product::appName() ;
138
139 return list;
140 }
141 Q_REFCOUNT
142
143};
144
145
146/* Internal */
147
148template< class Product >
149struct OPrivate {
150 inline static QWidget *multiFactory( const QString& appName, QWidget* parent,
151 const char* name, Qt::WFlags fl ) {
152 if ( appName == Product::appName() )
153 return new Product( parent, name, fl );
154 else
155 return 0;
156 }
157
158 inline static QStringList multiString( const QStringList& _list ) {
159 QStringList list = _list;
160 list << Product::appName();
161 return list;
162 }
163};
164
165template <>
166struct OPrivate<Opie::NullType > {
167 inline static QWidget* multiFactory ( const QString& , QWidget* ,
168 const char* , Qt::WFlags ) {
169 return 0l;
170 }
171 inline static QStringList multiString( const QStringList& _list ) {
172 return _list;
173 }
174};
175
176/*
177template <>
178struct OPrivate <Opie::NullType, Opie::NullType > {
179 inline static QWidget* multiFactory( const QString& , QWidget* ,
180 const char* , Qt::WFlags ) {
181 return 0l;
182 }
183
184 inline static QStringList multiString( const QStringList& _list ) {
185 return _list;
186 }
187};
188*/
189
190template <class Product, class ProductListTail>
191struct OPrivate< Opie::Typelist<Product, ProductListTail> > {
192 inline static QWidget* multiFactory( const QString& appName, QWidget* parent,
193 const char* name, Qt::WFlags fl) {
194 QWidget* wid = OPrivate<Product>::multiFactory( appName, parent, name, fl );
195
196 if (!wid )
197 wid = OPrivate<ProductListTail>::multiFactory( appName, parent, name, fl );
198
199 return wid;
200 }
201
202 inline static QStringList multiString( const QStringList& _list ) {
203 QStringList list = _list;
204
205 list = OPrivate<Product>::multiString( list );
206 list = OPrivate<ProductListTail>::multiString( list );
207
208 return list;
209 }
210};
211
212
213
214
215
216
217
218
219/* Internal END */
220
221/*
222 * If you want to export more than one Widget use that function
223 * Make sure all your Widgets provide the appName() static method
224 * otherwise you'll get a compiler error
225 *
226 * typedef Opie::MakeTypeList<MyWidget, MyDialog, MyMediaPlayer >::Result MyTypes;
227 * OPIE_EXPORT_APP( OApplicationFactory<MyTypes> )
228 */
229
230template<class Product, class ProductListTail>
231struct OApplicationFactory< Opie::Typelist<Product, ProductListTail > >
232 : ApplicationInterface {
233 QRESULT queryInterface( const QUuid &uuid, QUnknownInterface **iface ) {
234 *iface = 0;
235 if ( uuid == IID_QUnknown ) *iface = this;
236 else if ( uuid ==IID_QtopiaApplication ) *iface = this;
237 else return QS_FALSE;
238 (*iface)->addRef();
239 return QS_OK;
240 }
241
242 QWidget* createMainWindow ( const QString& appName, QWidget* parent,
243 const char* name, Qt::WFlags fl ) {
244 qWarning("StringList is %s", applications().join(":").latin1() );
245 return OPrivate< Opie::Typelist<Product, ProductListTail > >::multiFactory( appName, parent, name, fl );
246 }
247
248 QStringList applications()const {
249 QStringList _list;
250 return OPrivate< Opie::Typelist<Product, ProductListTail> >::multiString( _list );
251 }
252
253 Q_REFCOUNT
254};
255
256
257/* If the library version should be build */
258#ifdef OPIE_APP_INTERFACE
259#define OPIE_EXPORT_APP( factory ) Q_EXPORT_INTERFACE() { Q_CREATE_INSTANCE( factory ) }
260#else
261
262#include <qpe/qpeapplication.h>
263
264#define OPIE_EXPORT_APP( Factory ) \
265int main( int argc, char **argv ) { \
266 QPEApplication a(argc, argv ); \
267 QWidget *mw = 0;\
268\
269 /* method from TT */ \
270 QString executableName = QString::fromLatin1( argv[0] ); \
271 executableName = executableName.right(executableName.length() \
272 - executableName.findRev('/') - 1); \
273 \
274 Factory f; \
275 QStringList list = f.applications(); \
276 if (list.contains(executableName) ) \
277 mw = f.createMainWindow(executableName, 0, 0, 0 ); \
278 else \
279 mw = f.createMainWindow( list[0], 0, 0, 0 ); \
280\
281 if( mw ) { \
282 if ( mw->metaObject()->slotNames().contains("setDocument(const QString&)" ) ) \
283 a.showMainDocumentWidget( mw ); \
284 else \
285 a.showMainWidget( mw ); \
286\
287 int rv = a.exec(); \
288 delete mw; \
289 return rv; \
290 }else \
291 return -1; \
292}
293#endif