#!/bin/sh ##################################################################################################### # # Generator for instances.h and instances.cpp # # This file is part of the KVirc irc client distribution # Copyright (C) 2001-2006 Szymon Stefanek (pragma at kvirc dot net) # ##################################################################################################### echo "" > instances.h ###################################################################################################### cat >> instances.h < * pChildList; bool bDoInsert; // a helper for KviOptionsDialog::fillListView() } KviOptionsWidgetInstanceEntry; class KviOptionsInstanceManager : public QObject { Q_OBJECT public: KviOptionsInstanceManager(); virtual ~KviOptionsInstanceManager(); protected: KviPointerList * m_pInstanceTree; public: KviPointerList * instanceEntryTree(){ return m_pInstanceTree; }; KviOptionsWidget * getInstance(KviOptionsWidgetInstanceEntry * e,QWidget * par); KviOptionsWidgetInstanceEntry * findInstanceEntry(const char * clName); void cleanup(KviModule * m); protected: KviOptionsWidgetInstanceEntry * findInstanceEntry(const char * clName,KviPointerList * l); KviOptionsWidgetInstanceEntry * findInstanceEntry(const QObject * ptr,KviPointerList * l); void deleteInstanceTree(KviPointerList * l); protected Q_SLOTS: void widgetDestroyed(); }; #endif //__OPTIONS_INSTANCES_H__ EOF ###################################################################################################### CLASS_LIST=`grep -h "[ ]*\:[ ]*public[ ]*KviOptionsWidget" optw_*.h | sed -e 's/[ ]*\:[ ]*public[ ]*KviOptionsWidget'//g | sed -e 's/[ ]*class[ ]*//g'` TARGET="instances.cpp" echo "" > $TARGET ###################################################################################################### cat >> instances.cpp <> $TARGET done ###################################################################################################### cat >> instances.cpp <> $TARGET echo "_createInstanceProc(QWidget * parent)" >> $TARGET echo "{" >> $TARGET echo " return new $aclass(parent);" >> $TARGET echo "}" >> $TARGET echo "" >> $TARGET done ###################################################################################################### cat >> instances.cpp <> $TARGET echo "static const char * g_szClassName_$aclass = \"$aclass\";" >> $TARGET done ###################################################################################################### cat >> instances.cpp <; m_pInstanceTree->setAutoDelete(true); EOF ###################################################################################################### CLASSDIR=".classtmp" mkdir -p $CLASSDIR rm -f $CLASSDIR/* for aclass in $CLASS_LIST; do PARENT=`grep -h "KVI_OPTIONS_WIDGET_PARENT_$aclass" optw_*.h | sed -e 's/#define//g' | sed -e s/KVI_OPTIONS_WIDGET_PARENT_$aclass//g | sed -e 's/[ ]*//g'` if [ -z "$PARENT" ]; then PARENT="NOPARENT" fi echo $aclass >> $CLASSDIR/$PARENT done SPACES="" printclass() { echo "" >> $TARGET found= for anum in $DECLARED; do if [ "$anum" = "$1" ]; then found="yes" break fi done if [ -z "$found" ]; then echo "$3 KviOptionsWidgetInstanceEntry * e$1;" >> $TARGET DECLARED="$DECLARED $1" fi echo "$3 e$1 = new KviOptionsWidgetInstanceEntry;" >> $TARGET echo -n "$3 e$1->createProc = &class$2" >> $TARGET echo "_createInstanceProc;" >> $TARGET echo "$3 e$1->pWidget = 0;" >> $TARGET echo "$3 e$1->szClassName = g_szClassName_$2;" >> $TARGET echo "$3 e$1->iIcon = KVI_OPTIONS_WIDGET_ICON_$2;" >> $TARGET echo "$3 #ifdef KVI_OPTIONS_WIDGET_PRIORITY_$2" >> $TARGET echo "$3 e$1->iPriority = KVI_OPTIONS_WIDGET_PRIORITY_$2;" >> $TARGET echo "$3 #else" >> $TARGET echo "$3 e$1->iPriority = 0;" >> $TARGET echo "$3 #endif" >> $TARGET echo "$3 #ifdef KVI_OPTIONS_WIDGET_KEYWORDS_$2" >> $TARGET echo "$3 e$1->szKeywordsNoLocale = KVI_OPTIONS_WIDGET_KEYWORDS_$2;" >> $TARGET echo "$3 e$1->szKeywords = __tr2qs_ctx_no_xgettext(e$1->szKeywordsNoLocale,\"options\");;" >> $TARGET echo "$3 #endif" >> $TARGET echo "$3 #ifdef KVI_OPTIONS_WIDGET_GROUP_$2" >> $TARGET echo "$3 e$1->szGroup = KVI_OPTIONS_WIDGET_GROUP_$2;" >> $TARGET echo "$3 #else" >> $TARGET echo "$3 e$1->szGroup = \"general\";" >> $TARGET echo "$3 #endif" >> $TARGET echo "$3 #ifdef KVI_OPTIONS_WIDGET_CONTAINER_$2" >> $TARGET echo "$3 e$1->bIsContainer = KVI_OPTIONS_WIDGET_CONTAINER_$2;" >> $TARGET echo "$3 #else" >> $TARGET echo "$3 e$1->bIsContainer = false;" >> $TARGET echo "$3 #endif" >> $TARGET echo "$3 #ifdef KVI_OPTIONS_WIDGET_NOTCONTAINED_$2" >> $TARGET echo "$3 e$1->bIsNotContained = KVI_OPTIONS_WIDGET_NOTCONTAINED_$2;" >> $TARGET echo "$3 #else" >> $TARGET echo "$3 e$1->bIsNotContained = false;" >> $TARGET echo "$3 #endif" >> $TARGET echo "$3 e$1->szNameNoLocale = g_szName_$2;" >> $TARGET echo "$3 e$1->szName = __tr2qs_ctx_no_xgettext(g_szName_$2,\"options\");" >> $TARGET if [ "$1" = "0" ]; then echo "$3 m_pInstanceTree->append(e$1);" >> $TARGET else VAL=`expr $1 - 1` echo "$3 e$VAL->pChildList->append(e$1);" >> $TARGET fi } addchildren() { if [ -f "$CLASSDIR/$2" ]; then LEVEL=`cat $CLASSDIR/$2` for achild in $LEVEL; do printclass $1 $achild "$3" if [ -f "$CLASSDIR/$achild" ]; then echo "" >> $TARGET echo "$3 e$1->pChildList = new KviPointerList;" >> $TARGET echo "$3 e$1->pChildList->setAutoDelete(true);" >> $TARGET NEXTLEVEL=`expr $1 + 1` addchildren $NEXTLEVEL $achild "$3 " else echo "$3 e$1->pChildList = 0;" >> $TARGET fi done fi } addchildren 0 NOPARENT "" rm -fr $CLASSDIR ###################################################################################################### cat >> $TARGET < * l) { if(l) { for(KviOptionsWidgetInstanceEntry * e = l->first();e;e = l->next()) { if(e->pWidget) { if(e->pWidget->parent()->inherits("KviOptionsWidgetContainer")) { disconnect(e->pWidget,SIGNAL(destroyed()),this,SLOT(widgetDestroyed())); delete e->pWidget->parent(); e->pWidget = 0; } else { debug("Ops...i have deleted the options dialog ?"); } } //else debug("Clas %s has no widget",e->szName); if(e->pChildList)deleteInstanceTree(e->pChildList); } delete l; } } KviOptionsInstanceManager::~KviOptionsInstanceManager() { if(m_pInstanceTree)debug("Ops...KviOptionsInstanceManager::cleanup() not called ?"); } void KviOptionsInstanceManager::cleanup(KviModule * m) { deleteInstanceTree(m_pInstanceTree); m_pInstanceTree = 0; } void KviOptionsInstanceManager::widgetDestroyed() { KviOptionsWidgetInstanceEntry * e = findInstanceEntry(sender(),m_pInstanceTree); if(e)e->pWidget = 0; if(g_iOptionWidgetInstances > 0)g_iOptionWidgetInstances--; } KviOptionsWidget * KviOptionsInstanceManager::getInstance(KviOptionsWidgetInstanceEntry * e,QWidget * par) { if(!e)return 0; if(!(e->pWidget)) { e->pWidget = e->createProc(par); g_iOptionWidgetInstances++; connect(e->pWidget,SIGNAL(destroyed()),this,SLOT(widgetDestroyed())); } if(e->pWidget->parent() != par) { QWidget * oldPar = (QWidget *)e->pWidget->parent(); e->pWidget->reparent(par,TQPoint(0,0)); delete oldPar; } if(e->bIsContainer) { // need to create the container structure! e->pWidget->createTabbedPage(); if(e->pChildList) { KviPointerList tmp; tmp.setAutoDelete(false); for(KviOptionsWidgetInstanceEntry * e2 = e->pChildList->first();e2;e2 = e->pChildList->next()) { // add only non containers and widgets not explicitly marked as noncontained if((!e2->bIsContainer) && (!e2->bIsNotContained)) { KviOptionsWidgetInstanceEntry * ee = tmp.first(); int idx = 0; while(ee) { if(ee->iPriority >= e2->iPriority)break; idx++; ee = tmp.next(); } tmp.insert(idx,e2); } } for(KviOptionsWidgetInstanceEntry * e3 = tmp.last();e3;e3 = tmp.prev()) { KviOptionsWidget * ow = getInstance(e3,e->pWidget->tabWidget()); e->pWidget->addOptionsWidget(e3->szName,*(g_pIconManager->getSmallIcon(e3->iIcon)),ow); } } } return e->pWidget; } KviOptionsWidgetInstanceEntry * KviOptionsInstanceManager::findInstanceEntry(const QObject * ptr,KviPointerList * l) { if(l) { for(KviOptionsWidgetInstanceEntry * e = l->first();e;e = l->next()) { if(ptr == e->pWidget)return e; if(e->pChildList) { KviOptionsWidgetInstanceEntry * e2 = findInstanceEntry(ptr,e->pChildList); if(e2)return e2; } } } return 0; } KviOptionsWidgetInstanceEntry * KviOptionsInstanceManager::findInstanceEntry(const char * clName,KviPointerList * l) { if(l) { for(KviOptionsWidgetInstanceEntry * e = l->first();e;e = l->next()) { if(kvi_strEqualCI(e->szClassName,clName))return e; if(e->pChildList) { KviOptionsWidgetInstanceEntry * e2 = findInstanceEntry(clName,e->pChildList); if(e2)return e2; } } } return 0; } KviOptionsWidgetInstanceEntry * KviOptionsInstanceManager::findInstanceEntry(const char * clName) { return findInstanceEntry(clName,m_pInstanceTree); } #include "m_instances.moc" EOF ######################################################################################################