From 53fa609d585216173c834cd1f22678a087394cde Mon Sep 17 00:00:00 2001 From: mickeyl Date: Thu, 15 Jan 2004 15:50:38 +0000 Subject: - add oapplicationfactory to opiecore - add big screen examples --- (limited to 'libopie2') diff --git a/libopie2/examples/opieui/opieui.pro b/libopie2/examples/opieui/opieui.pro index ad66f47..853ac50 100644 --- a/libopie2/examples/opieui/opieui.pro +++ b/libopie2/examples/opieui/opieui.pro @@ -1,3 +1,5 @@ TEMPLATE = subdirs -SUBDIRS = olistviewdemo +SUBDIRS = olistviewdemo owidgetstack_example osplitter_example + + diff --git a/libopie2/examples/opieui/osplitter_example/.cvsignore b/libopie2/examples/opieui/osplitter_example/.cvsignore new file mode 100644 index 0000000..8f7300c --- a/dev/null +++ b/libopie2/examples/opieui/osplitter_example/.cvsignore @@ -0,0 +1,6 @@ +Makefile* +moc* +*moc +*.o +~* + diff --git a/libopie2/examples/opieui/osplitter_example/osplitter_example.cpp b/libopie2/examples/opieui/osplitter_example/osplitter_example.cpp new file mode 100644 index 0000000..7ba0f0d --- a/dev/null +++ b/libopie2/examples/opieui/osplitter_example/osplitter_example.cpp @@ -0,0 +1,32 @@ +#include "osplitter_example.h" + +/* OPIE */ + +#include +#include +#include + +/* QT*/ +#include +#include + +using namespace Opie; + +OPIE_EXPORT_APP( OApplicationFactory ) + +OSplitterExample::OSplitterExample( QWidget *w,const char* n,WFlags f ) + : QWidget( w, n, f ){ + QVBoxLayout * lay = new QVBoxLayout(this); + OSplitter * splitter = new OSplitter( Horizontal, this ); + lay->addWidget( splitter ); + + OFileSelector *selector = new OFileSelector( splitter, OFileSelector::FileSelector, + OFileSelector::Normal, QDir::homeDirPath(), + QString::null ); + splitter->addWidget( selector, "zoom", tr("Selector 1") ); + + selector = new OFileSelector( splitter, OFileSelector::FileSelector, OFileSelector::Normal, + QDir::homeDirPath(), QString::null ); + splitter->addWidget( selector, "zoom", tr("Selector 2") ); + +} diff --git a/libopie2/examples/opieui/osplitter_example/osplitter_example.h b/libopie2/examples/opieui/osplitter_example/osplitter_example.h new file mode 100644 index 0000000..176ad62 --- a/dev/null +++ b/libopie2/examples/opieui/osplitter_example/osplitter_example.h @@ -0,0 +1,20 @@ +/* + * May be used, copied and modified wihtout any limitation + */ + +#ifndef OSPlitter_EXAMPLE_H +#define OSPlitter_EXAMPLE_H + +#include +#include + +class OSplitterExample : public QWidget { + Q_OBJECT +public: + static QString appName() { return QString::fromLatin1("osplitter_example"); } + OSplitterExample( QWidget *parent, const char* name, WFlags fl ); + +}; + + +#endif diff --git a/libopie2/examples/opieui/osplitter_example/osplitter_example.pro b/libopie2/examples/opieui/osplitter_example/osplitter_example.pro new file mode 100644 index 0000000..224a1ee --- a/dev/null +++ b/libopie2/examples/opieui/osplitter_example/osplitter_example.pro @@ -0,0 +1,13 @@ +CONFIG = qt warn_on +TEMPLATE = app +TARGET = osplitter_example + +HEADERS = osplitter_example.h +SOURCES = osplitter_example.cpp + +INCLUDEPATH += $(OPIEDIR)/include +DEPENDSPATH += $(OPIEDIR)/include + +LIBS += -lqpe -lopieui2 + +include ( $(OPIEDIR)/include.pro ) diff --git a/libopie2/examples/opieui/osplitter_example/osplitter_mail.cpp b/libopie2/examples/opieui/osplitter_example/osplitter_mail.cpp new file mode 100644 index 0000000..4eaf3a9 --- a/dev/null +++ b/libopie2/examples/opieui/osplitter_example/osplitter_mail.cpp @@ -0,0 +1,82 @@ + +#include +#include +#include +#include + +#include +#include + +#include "../osplitter.h" + +#include "osplitter_mail.h" + + +OPIE_EXPORT_APP( OApplicationFactory ) + +class Folder { + int dummy; +}; + +// ----------------------------------------------------------------- + +ListViews::ListViews( QWidget* p, const char* name, WFlags fl ) + : QWidget( p, name, fl ) { + qApp->installEventFilter( this ); + m_lstFolders.setAutoDelete( true ); + QHBoxLayout *lay = new QHBoxLayout(this); + + m_splitter = new OSplitter( Horizontal, this, "SPlitter 1" ); + lay->addWidget( m_splitter ); + connect(m_splitter, SIGNAL(sizeChange(bool, const QSize& ) ), + this, SLOT(slotSizeChange(bool, const QSize& ) ) ); + + m_overview = new QListView( m_splitter ); + m_overview->header()->setClickEnabled( FALSE ); + m_overview->addColumn( tr("Folder") ); + m_overview->setMaximumWidth( 200 ); + m_splitter->addWidget( m_overview, "zoom", tr("Folder Overview") ); + m_splitter->setSizeChange( 300 ); + + /* OSplitter starts with the small mode */ + m_messages = 0; + m_message = m_attach = 0; + + splitti = new OSplitter( Vertical, m_splitter, "Splitti2" ); + splitti->setSizeChange( 300 ); + splitti->setSizePolicy( QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding ) ); + + QLabel *lbl = new QLabel(splitti); + lbl->setTextFormat ( Qt::RichText ); + lbl->setText("

Test Test Test

Fooooo hjhh

"); + + m_messages = new QListView( splitti ); + m_messages->addColumn(" Messages "); + + folder1 = new QListView( splitti ); + folder1->addColumn( "Messages 2 " ); + + splitti->addWidget(m_messages, "mail", tr("Mails") ); + splitti->addWidget(folder1, "folder", tr("Folder") ); + splitti->addWidget( lbl, "logo", tr("Label") ); + m_message = lbl; + + m_splitter->addWidget( splitti ); + +} + + +ListViews::~ListViews() { + +} + + +bool ListViews::eventFilter( QObject* obj, QEvent* ev ) { + if (!obj->isWidgetType() ) + return false; + if ( ev->type() == QEvent::MouseButtonRelease ) { + qWarning(" name %s, class %s", obj->name(), obj->className() ); + } + + return false; +} diff --git a/libopie2/examples/opieui/osplitter_example/osplitter_mail.h b/libopie2/examples/opieui/osplitter_example/osplitter_mail.h new file mode 100644 index 0000000..b7e7efe --- a/dev/null +++ b/libopie2/examples/opieui/osplitter_example/osplitter_mail.h @@ -0,0 +1,49 @@ +/* + * You may use, modify and distribute this code without any limitation + */ + +/* + * Header file for a more complete email client like + * layout + */ + +#ifndef OPIE_SPLITTER_MAIL_EXAMPLE_H +#define OPIE_SPLITTER_MAIL_EXAMPLE_H + +#include +#include +#include + +class Folder; +class QLabel; + +class OSplitter; +class ListViews : public QWidget { + Q_OBJECT +public: + static QString appName() { return QString::fromLatin1("osplitter-mail"); } + ListViews( QWidget* parent, const char * name, WFlags fl ); + ~ListViews(); + + bool eventFilter( QObject* , QEvent* ); +private: + void initFolders(); + void initFolder( Folder *folder, unsigned int &count ); + + QListView *m_messages, *m_overview; + QLabel *m_message, *m_attach; + QList m_folders; // used in tab mode + QList m_lstFolders; + bool m_mode : 1; // bitfield + OSplitter *m_splitter; + OSplitter *splitti; + QListView *folder1; +#if 0 +//private slots: +// void slotFolderChanged( QListViewItem* ); +// void slotMessageChanged(); +// void slotSizeChange( bool, const QSize& ); +#endif +}; + +#endif diff --git a/libopie2/examples/opieui/osplitter_example/osplitter_mail.pro b/libopie2/examples/opieui/osplitter_example/osplitter_mail.pro new file mode 100644 index 0000000..ec6e626 --- a/dev/null +++ b/libopie2/examples/opieui/osplitter_example/osplitter_mail.pro @@ -0,0 +1,12 @@ +CONFIG += qt warn_on +TEMPLATE = app +TARGET = osplitter-mail + +INCLUDEPATH += $(OPIEDIR)/include +DEPENDSPATH += $(OPIEDIR)/include + +HEADERS = osplitter_mail.h +SOURCES = osplitter_mail.cpp + +LIBS += -lqpe -lopie +include ( $(OPIEDIR)/include.pro ) diff --git a/libopie2/examples/opieui/owidgetstack_example/.cvsignore b/libopie2/examples/opieui/owidgetstack_example/.cvsignore new file mode 100644 index 0000000..8f7300c --- a/dev/null +++ b/libopie2/examples/opieui/owidgetstack_example/.cvsignore @@ -0,0 +1,6 @@ +Makefile* +moc* +*moc +*.o +~* + diff --git a/libopie2/examples/opieui/owidgetstack_example/owidgetstack_example.cpp b/libopie2/examples/opieui/owidgetstack_example/owidgetstack_example.cpp new file mode 100644 index 0000000..b1c5e70 --- a/dev/null +++ b/libopie2/examples/opieui/owidgetstack_example/owidgetstack_example.cpp @@ -0,0 +1,132 @@ +/* + * You may use, modify and distribute this example without any limitation + */ + +#include "owidgetstack_example.h" + +/* OPIE */ +#include +#include +#include + +/* QT */ +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace Opie; + +OPIE_EXPORT_APP( OApplicationFactory ) + +StackExample::StackExample( QWidget* parent, const char* name, WFlags fl ) + : QMainWindow( parent, name, fl ) +{ + m_stack = new OWidgetStack( this ); + setCentralWidget( m_stack ); + + /* nice Signal Mapper ;) */ + QSignalMapper *sm = new QSignalMapper(this); + connect(sm, SIGNAL(mapped(int) ), m_stack, SLOT(raiseWidget(int)) ); + + /* toolbar first but this should be known from the other examples */ + setToolBarsMovable( false ); + + /* only a menubar here */ + QToolBar* holder = new QToolBar( this ); + holder->setHorizontalStretchable( true ); + + QMenuBar *bar = new QMenuBar( holder ); + QPopupMenu *menu = new QPopupMenu( this ); + + QAction* a = new QAction( tr("Show MainWidget"), Resource::loadPixmap("zoom"), + QString::null, 0, this, 0 ); + sm->setMapping(a, 1 ); + connect(a, SIGNAL(activated() ), + sm, SLOT(map() ) ); + a->addTo( menu ); + + a = new QAction( tr("Show Details Small"), Resource::loadPixmap("zoom"), + QString::null, 0, this, 0 ); + sm->setMapping(a, 2 ); + connect(a, SIGNAL(activated() ), + sm, SLOT(map() ) ); + a->addTo( menu ); + + a = new QAction( tr("Show Details More"), Resource::loadPixmap("zoom"), + QString::null, 0, this, 0 ); + sm->setMapping(a, 3 ); + connect(a, SIGNAL(activated() ), + sm, SLOT(map() ) ); + a->addTo( menu ); + + a = new QAction( tr("Show Details All"), Resource::loadPixmap("zoom"), + QString::null, 0, this, 0 ); + sm->setMapping(a, 4 ); + connect(a, SIGNAL(activated() ), + sm, SLOT(map() ) ); + + bar->insertItem( tr("Actions"), menu ); + + /* now the gui */ + + /* first widget, main widget */ + QWidget * wid = new QWidget( m_stack ); + QGridLayout *grid = new QGridLayout(wid, 2, 2 ); + + QPushButton *btn = new QPushButton( tr("Show Details Small"), wid, "details1" ); + sm->setMapping(btn, 2 ); + connect(btn, SIGNAL(clicked()), sm, SLOT(map() ) ); + grid->addWidget( btn, 0, 0 ); + + btn = new QPushButton( tr("Show Details Medium"), wid, "details2"); + sm->setMapping(btn, 3 ); + connect(btn, SIGNAL(clicked()), sm, SLOT(map() ) ); + grid->addWidget( btn, 0, 1 ); + + btn = new QPushButton( tr("Show Details All"), wid, "details3"); + sm->setMapping(btn, 4 ); + connect(btn, SIGNAL(clicked()), sm, SLOT(map() ) ); + grid->addWidget( btn, 1, 1 ); + + m_stack->addWidget( wid, 1 ); + m_main = wid; + + QLabel *lbl = new QLabel(m_stack ); + lbl->setText(tr("Only small Details are shown here. Määh") ); + m_stack->addWidget( lbl, 2 ); + + lbl = new QLabel( m_stack ); + lbl->setText( tr("Some more details....Wo ist das Schaf?") ); + m_stack->addWidget( lbl, 3 ); + + lbl = new QLabel( m_stack ); + lbl->setText( tr("Ne nicht in Bayerisch Gmain sondern in Berlin
Vermiss und meine Augen werden nicht eckig, da mein Bildschirm abgerundet ist
Es lebe Hamburg Süd,weiss du, verstehst du? ;)
Susi ist dOOf, es lebe die Ofenecke...", "hard to translate that") ); + m_stack->addWidget( lbl, 4 ); + + + /* THE signal mapper does all the magic */ + m_stack->raiseWidget( m_main ); +} + + +StackExample::~StackExample() { + +} + + + +void StackExample::closeEvent( QCloseEvent* ev) { + /* if the close even came when we displayed a details */ + if (m_stack->visibleWidget() != m_main ) { + m_stack->raiseWidget( m_main ); + ev->ignore(); + return; + } + + ev->accept(); +} diff --git a/libopie2/examples/opieui/owidgetstack_example/owidgetstack_example.h b/libopie2/examples/opieui/owidgetstack_example/owidgetstack_example.h new file mode 100644 index 0000000..aea85cb --- a/dev/null +++ b/libopie2/examples/opieui/owidgetstack_example/owidgetstack_example.h @@ -0,0 +1,28 @@ +/* + * You may use, modify and distribute this example without any limitation + */ + +#ifndef O_STACK_EXAMPLE_SIMPLE_H +#define O_STACK_EXAMPLE_SIMPLE_H + +#include +#include + +using namespace Opie; + +class StackExample : public QMainWindow { + Q_OBJECT +public: + StackExample( QWidget* paren, const char* name, WFlags fl ); + ~StackExample(); + static QString appName() { return QString::fromLatin1("owidgetstack-example"); } + +protected: + void closeEvent( QCloseEvent* e ); +private: + OWidgetStack* m_stack; + QWidget* m_main; + +}; + +#endif diff --git a/libopie2/examples/opieui/owidgetstack_example/owidgetstack_example.pro b/libopie2/examples/opieui/owidgetstack_example/owidgetstack_example.pro new file mode 100644 index 0000000..395a4fb --- a/dev/null +++ b/libopie2/examples/opieui/owidgetstack_example/owidgetstack_example.pro @@ -0,0 +1,13 @@ +CONFIG += qt warn_on +TEMPLATE = app +TARGET = owidgetstack-example + +SOURCES = owidgetstack_example.cpp +HEADERS = owidgetstack_example.h + +INCLUDEPATH += $(OPIEDIR)/include +DEPENDSPATH += $(OPIEDIR)/include + +LIBS += -lqpe -lopieui2 + +include ( $(OPIEDIR)/include.pro ) 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 @@ +/* +                 This file is part of the Opie Project +              Copyright (C) Holger Freyther + =. + .=l. +           .>+-= + _;:,     .>    :=|. This program is free software; you can +.> <`_,   >  .   <= redistribute it and/or modify it under +:`=1 )Y*s>-.--   : the terms of the GNU Library General Public +.="- .-=="i,     .._ License as published by the Free Software + - .   .-<_>     .<> Foundation; either version 2 of the License, +     ._= =}       : or (at your option) any later version. +    .%`+i>       _;_. +    .i_,=:_.      -`: PARTICULAR PURPOSE. See the GNU +..}^=.=       =       ; Library General Public License for more +++=   -.     .`     .: details. + :     =  ...= . :.=- + -.   .:....=;==+<; You should have received a copy of the GNU +  -_. . .   )=.  = Library General Public License along with +    --        :-=` this library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +/* + This work is derived from: + ---- + The Loki Library + Copyright (c) 2001 by Andrei Alexandrescu + This code accompanies the book: + Alexandrescu, Andrei. "Modern C++ Design: Generic Programming and Design + Patterns Applied". Copyright (c) 2001. Addison-Wesley. + Permission to use, copy, modify, distribute and sell this software for any + purpose is hereby granted without fee, provided that the above copyright + notice appear in all copies and that both that copyright notice and this + permission notice appear in supporting documentation. + The author or Addison-Welsey Longman make no representations about the + suitability of this software for any purpose. It is provided "as is" + without express or implied warranty. + ---- + + And KGenericFactor et all from Simon Hausmann + +*/ + +#include +#include + +#include +#include + +namespace Opie { + struct NullType; + + template + struct Typelist + { + typedef T Head; + typedef U Tail; + }; + template< + typename T1 = NullType, typename T2 = NullType, typename T3 = NullType, + typename T4 = NullType, typename T5 = NullType, typename T6 = NullType, + typename T7 = NullType, typename T8 = NullType, typename T9 = NullType, + typename T10 = NullType, typename T11 = NullType, typename T12 = NullType, + typename T13 = NullType, typename T14 = NullType, typename T15 = NullType, + typename T16 = NullType, typename T17 = NullType, typename T18 = NullType + > + struct MakeTypelist{ + private: + typedef typename MakeTypelist + < + T2 , T3 , T4 , + T5 , T6 , T7 , + T8 , T9 , T10, + T11, T12, T13, + T14, T15, T16, + T17, T18 + > + ::Result TailResult; + +public: + typedef Typelist Result; +}; + +template<> +struct MakeTypelist<> +{ + typedef NullType Result; +}; + +} + +/** + * To allow your application to be quick launched some one needs + * to create the QWidget. + * This is this factory. Make surce your widget has static QString Widget::appName() + * as one of its functions. + * + * This template takes one QWidget and initialized it in the form of + * MyWidget::MyWidget( QWidget* parent, const char* name, WFlags f ); + * + * To use it on your app do that: + * typedef OApplicationFactory MyFactory; + * OPIE_EXPORT_APP( MyFactory ) + * + */ +template +struct OApplicationFactory : public ApplicationInterface { + QRESULT queryInterface( const QUuid &uuid, QUnknownInterface **iface ) { + *iface = 0; + if ( uuid == IID_QUnknown ) *iface = this; + else if ( uuid == IID_QtopiaApplication ) *iface = this; + else return QS_FALSE; + (*iface)->addRef(); + return QS_OK; + } + + /* + * + */ + virtual QWidget *createMainWindow( const QString& appName, QWidget* parent, + const char* name, Qt::WFlags f ) { + if (appName == Product::appName() ) + return new Product(parent, name, f ); + else + return 0l; + } + + virtual QStringList applications()const { + QStringList list; + list << Product::appName() ; + + return list; + } + Q_REFCOUNT + +}; + + +/* Internal */ + +template< class Product > +struct OPrivate { + inline static QWidget *multiFactory( const QString& appName, QWidget* parent, + const char* name, Qt::WFlags fl ) { + if ( appName == Product::appName() ) + return new Product( parent, name, fl ); + else + return 0; + } + + inline static QStringList multiString( const QStringList& _list ) { + QStringList list = _list; + list << Product::appName(); + return list; + } +}; + +template <> +struct OPrivate { + inline static QWidget* multiFactory ( const QString& , QWidget* , + const char* , Qt::WFlags ) { + return 0l; + } + inline static QStringList multiString( const QStringList& _list ) { + return _list; + } +}; + +/* +template <> +struct OPrivate { + inline static QWidget* multiFactory( const QString& , QWidget* , + const char* , Qt::WFlags ) { + return 0l; + } + + inline static QStringList multiString( const QStringList& _list ) { + return _list; + } +}; +*/ + +template +struct OPrivate< Opie::Typelist > { + inline static QWidget* multiFactory( const QString& appName, QWidget* parent, + const char* name, Qt::WFlags fl) { + QWidget* wid = OPrivate::multiFactory( appName, parent, name, fl ); + + if (!wid ) + wid = OPrivate::multiFactory( appName, parent, name, fl ); + + return wid; + } + + inline static QStringList multiString( const QStringList& _list ) { + QStringList list = _list; + + list = OPrivate::multiString( list ); + list = OPrivate::multiString( list ); + + return list; + } +}; + + + + + + + + +/* Internal END */ + +/* + * If you want to export more than one Widget use that function + * Make sure all your Widgets provide the appName() static method + * otherwise you'll get a compiler error + * + * typedef Opie::MakeTypeList::Result MyTypes; + * OPIE_EXPORT_APP( OApplicationFactory ) + */ + +template +struct OApplicationFactory< Opie::Typelist > + : ApplicationInterface { + QRESULT queryInterface( const QUuid &uuid, QUnknownInterface **iface ) { + *iface = 0; + if ( uuid == IID_QUnknown ) *iface = this; + else if ( uuid ==IID_QtopiaApplication ) *iface = this; + else return QS_FALSE; + (*iface)->addRef(); + return QS_OK; + } + + QWidget* createMainWindow ( const QString& appName, QWidget* parent, + const char* name, Qt::WFlags fl ) { + qWarning("StringList is %s", applications().join(":").latin1() ); + return OPrivate< Opie::Typelist >::multiFactory( appName, parent, name, fl ); + } + + QStringList applications()const { + QStringList _list; + return OPrivate< Opie::Typelist >::multiString( _list ); + } + + Q_REFCOUNT +}; + + +/* If the library version should be build */ +#ifdef OPIE_APP_INTERFACE +#define OPIE_EXPORT_APP( factory ) Q_EXPORT_INTERFACE() { Q_CREATE_INSTANCE( factory ) } +#else + +#include + +#define OPIE_EXPORT_APP( Factory ) \ +int main( int argc, char **argv ) { \ + QPEApplication a(argc, argv ); \ + QWidget *mw = 0;\ +\ + /* method from TT */ \ + QString executableName = QString::fromLatin1( argv[0] ); \ + executableName = executableName.right(executableName.length() \ + - executableName.findRev('/') - 1); \ + \ + Factory f; \ + QStringList list = f.applications(); \ + if (list.contains(executableName) ) \ + mw = f.createMainWindow(executableName, 0, 0, 0 ); \ + else \ + mw = f.createMainWindow( list[0], 0, 0, 0 ); \ +\ + if( mw ) { \ + if ( mw->metaObject()->slotNames().contains("setDocument(const QString&)" ) ) \ + a.showMainDocumentWidget( mw ); \ + else \ + a.showMainWidget( mw ); \ +\ + int rv = a.exec(); \ + delete mw; \ + return rv; \ + }else \ + return -1; \ +} +#endif -- cgit v0.9.0.2