diff --git a/krusader/Panel/krviewfactory.cpp b/krusader/Panel/krviewfactory.cpp index 4a5688fb..d4e955c2 100644 --- a/krusader/Panel/krviewfactory.cpp +++ b/krusader/Panel/krviewfactory.cpp @@ -1,103 +1,115 @@ /*************************************************************************** krviewfactory.cpp ------------------- copyright : (C) 2000-2007 by Shie Erlich & Rafi Yanai & Csaba Karai e-mail : krusader@users.sourceforge.net web site : http://krusader.sourceforge.net --------------------------------------------------------------------------- Description *************************************************************************** A db dD d8888b. db db .d8888. .d8b. d8888b. d88888b d8888b. 88 ,8P' 88 `8D 88 88 88' YP d8' `8b 88 `8D 88' 88 `8D 88,8P 88oobY' 88 88 `8bo. 88ooo88 88 88 88ooooo 88oobY' 88`8b 88`8b 88 88 `Y8b. 88~~~88 88 88 88~~~~~ 88`8b 88 `88. 88 `88. 88b d88 db 8D 88 88 88 .8D 88. 88 `88. YP YD 88 YD ~Y8888P' `8888Y' YP YP Y8888D' Y88888P 88 YD S o u r c e F i l e *************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include "krviewfactory.h" #include "krinterdetailedview.h" #include "krinterbriefview.h" #include #include -KrViewInstance::KrViewInstance(int id, QString name, QString desc, QString icon, QKeySequence shortcut) : - m_id(id), m_name(name), m_description(desc), m_icon(icon), m_shortcut(shortcut) +KrViewInstance::KrViewInstance(int id, const QString &name, const QString &desc, + const QString &icon, const QKeySequence &shortcut) + : m_id(id), m_name(name), m_description(desc), m_icon(icon), m_shortcut(shortcut) { - KrViewFactory::self().registerView(this); } - -KrViewFactory::KrViewFactory() : m_defaultViewId(-1) +template +class KrViewInstanceImpl : public KrViewInstance { -} + public: + KrViewInstanceImpl(int id, const QString &name, const QString &desc, const QString &icon, + const QKeySequence &shortcut) + : KrViewInstance(id, name, desc, icon, shortcut) {} + + virtual KrView *create(QWidget *w, KConfig *cfg) Q_DECL_OVERRIDE { + return new T(w, *this, cfg); + } +}; + +KrViewFactory::KrViewFactory() : m_defaultViewId(-1) {} // static initialization, on first use idiom -KrViewFactory & KrViewFactory::self() +KrViewFactory &KrViewFactory::self() { - static KrViewFactory * factory = 0; - if(!factory) { + static KrViewFactory *factory = 0; + if (!factory) { factory = new KrViewFactory(); - init(); + factory->init(); } return *factory; } void KrViewFactory::init() { - new KrViewInstanceImpl (0, "KrInterDetailedView", - i18n("&Detailed View"), "view-list-details", Qt::ALT + Qt::SHIFT + Qt::Key_D); + registerView(new KrViewInstanceImpl (0, "KrInterDetailedView", + i18n("&Detailed View"), "view-list-details", Qt::ALT + Qt::SHIFT + Qt::Key_D)); - new KrViewInstanceImpl (1, "KrInterBriefView", - i18n("&Brief View"), "view-list-icons", Qt::ALT + Qt::SHIFT + Qt::Key_B); + registerView(new KrViewInstanceImpl (1, "KrInterBriefView", + i18n("&Brief View"), "view-list-icons", Qt::ALT + Qt::SHIFT + Qt::Key_B)); } -KrView * KrViewFactory::createView(int id, QWidget *widget, KConfig *cfg) +KrView *KrViewFactory::createView(int id, QWidget *widget, KConfig *cfg) { - return viewInstance(id)->create(widget, cfg); + return self().viewInstance(id)->create(widget, cfg); } -void KrViewFactory::registerView(KrViewInstance * inst) +void KrViewFactory::registerView(KrViewInstance *inst) { int position = 0; - while (position < self().m_registeredViews.count()) { - if (self().m_registeredViews[ position ]->id() > inst->id()) + while (position < m_registeredViews.count()) { + if (m_registeredViews[position]->id() > inst->id()) break; position++; } - self().m_registeredViews.insert(self().m_registeredViews.begin() + position, inst); - if (self().m_defaultViewId == -1 || inst->id() < self().m_defaultViewId) - self().m_defaultViewId = inst->id(); + m_registeredViews.insert(m_registeredViews.begin() + position, inst); + if (m_defaultViewId == -1 || inst->id() < m_defaultViewId) + m_defaultViewId = inst->id(); } -KrViewInstance * KrViewFactory::viewInstance(int id) +KrViewInstance *KrViewFactory::viewInstance(int id) { - foreach(KrViewInstance * inst, self().m_registeredViews) - if (inst->id() == id) - return inst; + foreach (KrViewInstance *inst, m_registeredViews) { + if (inst->id() == id) + return inst; + } - foreach(KrViewInstance * inst_dflt, self().m_registeredViews) - if (inst_dflt->id() == self().m_defaultViewId) - return inst_dflt; + foreach (KrViewInstance *inst_dflt, m_registeredViews) { + if (inst_dflt->id() == m_defaultViewId) + return inst_dflt; + } fprintf(stderr, "Internal Error: no views registered!\n"); exit(-1); } diff --git a/krusader/Panel/krviewfactory.h b/krusader/Panel/krviewfactory.h index 03841146..1ef9d830 100644 --- a/krusader/Panel/krviewfactory.h +++ b/krusader/Panel/krviewfactory.h @@ -1,117 +1,96 @@ /*************************************************************************** krviewfactory.h ------------------- copyright : (C) 2000-2008 by Csaba Karai e-mail : krusader@users.sourceforge.net web site : http://krusader.sourceforge.net --------------------------------------------------------------------------- Description *************************************************************************** A db dD d8888b. db db .d8888. .d8b. d8888b. d88888b d8888b. 88 ,8P' 88 `8D 88 88 88' YP d8' `8b 88 `8D 88' 88 `8D 88,8P 88oobY' 88 88 `8bo. 88ooo88 88 88 88ooooo 88oobY' 88`8b 88`8b 88 88 `Y8b. 88~~~88 88 88 88~~~~~ 88`8b 88 `88. 88 `88. 88b d88 db 8D 88 88 88 .8D 88. 88 `88. YP YD 88 YD ~Y8888P' `8888Y' YP YP Y8888D' Y88888P 88 YD H e a d e r F i l e *************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #ifndef KRVIEWFACTORY_H #define KRVIEWFACTORY_H // QtCore #include #include // QtGui #include // QtWidgets #include class KrView; class KConfig; +/** Abstract container for KrView implementation classes. Created internally by KrViewFactory. */ class KrViewInstance { friend class KrView; -public: - - KrViewInstance(int id, QString name, QString desc, QString icon, QKeySequence shortcut); - virtual ~KrViewInstance() {} - inline int id() { - return m_id; - } - inline QString name() { - return m_name; - } - inline QString description() { - return m_description; - } - inline QString icon() { - return m_icon; - } - inline QKeySequence shortcut() { - return m_shortcut; - } +public: + inline int id() const { return m_id; } + inline QString name() const { return m_name; } + inline QString description() const { return m_description; } + inline QString icon() const { return m_icon; } + inline QKeySequence shortcut() const { return m_shortcut; } virtual KrView *create(QWidget *w, KConfig *cfg) = 0; protected: - int m_id; - QString m_name; - QString m_description; - QString m_icon; - QKeySequence m_shortcut; - QList m_objects; -}; - + KrViewInstance(int id, const QString &name, const QString &desc, const QString &icon, + const QKeySequence &shortcut); + virtual ~KrViewInstance() {} -template< typename T > -class KrViewInstanceImpl: public KrViewInstance -{ -public: - KrViewInstanceImpl(int id, QString name, QString desc, QString icon, QKeySequence shortcut) : - KrViewInstance(id, name, desc, icon, shortcut) {} +private: + const int m_id; + const QString m_name; + const QString m_description; + const QString m_icon; + const QKeySequence m_shortcut; - virtual KrView *create(QWidget *w, KConfig *cfg) Q_DECL_OVERRIDE { - return new T(w, *this, cfg); - } + QList m_objects; // direct access in KrView }; +/** Factory for KrView implementations. This is a hidden singleton. */ class KrViewFactory { friend class KrViewInstance; + public: - static KrView * createView(int id, QWidget * widget, KConfig *cfg); - static KrViewInstance * viewInstance(int id); - static const QList& registeredViews() { - return self().m_registeredViews; - } - static int defaultViewId() { - return self().m_defaultViewId; - } + static KrView *createView(int id, QWidget *widget, KConfig *cfg); + static const QList ®isteredViews() { return self().m_registeredViews; } + static int defaultViewId() { return self().m_defaultViewId; } private: KrViewFactory(); + void init(); + void registerView(KrViewInstance *); + KrViewInstance *viewInstance(int id); - static KrViewFactory & self(); - static void init(); - static void registerView(KrViewInstance *); + static KrViewFactory &self(); - QList m_registeredViews; - int m_defaultViewId; + QList m_registeredViews; + int m_defaultViewId; }; #endif /* __KRVIEWFACTORY_H__ */