⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 metadatabase.cpp

📁 Linux下的基于X11的图形开发环境。
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/************************************************************************ Copyright (C) 2000-2002 Trolltech AS.  All rights reserved.**** This file is part of Qt Designer.**** This file may be distributed and/or modified under the terms of the** GNU General Public License version 2 as published by the Free Software** Foundation and appearing in the file LICENSE.GPL included in the** packaging of this file.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.**** See http://www.trolltech.com/gpl/ for GPL licensing information.**** Contact info@trolltech.com if any conditions of this licensing are** not clear to you.************************************************************************/#include "metadatabase.h"#include "widgetfactory.h"#include "formwindow.h"#include "parser.h"#include "widgetdatabase.h"#include "formfile.h"#include "propertyobject.h"#include "project.h"#include "mainwindow.h"#include <qapplication.h>#include <qobject.h>#include <qlayout.h>#include <qptrdict.h>#include <qobjectlist.h>#include <qstrlist.h>#include <qmetaobject.h>#include <qwidgetlist.h>#include <qmainwindow.h>#include <qregexp.h>#include <private/qpluginmanager_p.h>#include <qdatetime.h>#include <qfile.h>#include <qfileinfo.h>#include <qtextstream.h>#include <stdlib.h>class MetaDataBaseRecord{public:    QObject *object;    QStringList changedProperties;    QMap<QString,QVariant> fakeProperties;    QMap<QString, QString> propertyComments;    int spacing, margin;    QValueList<MetaDataBase::Connection> connections;    QValueList<MetaDataBase::Function> functionList;    QValueList<MetaDataBase::Include> includes;    QValueList<MetaDataBase::Variable> variables;    QStringList forwards, sigs;    QWidgetList tabOrder;    MetaDataBase::MetaInfo metaInfo;    QCursor cursor;    QMap<int, QString> pixmapArguments;    QMap<int, QString> pixmapKeys;    QMap<QString, QString> columnFields;    QValueList<uint> breakPoints;    QMap<int, QString> breakPointConditions;    QString exportMacro;};static QPtrDict<MetaDataBaseRecord> *db = 0;static QPtrList<MetaDataBase::CustomWidget> *cWidgets = 0;static bool doUpdate = TRUE;static QStringList langList;static QStringList editorLangList;static QPluginManager<LanguageInterface> *languageInterfaceManager = 0;/*!  \class MetaDataBase metadatabase.h  \brief Database which stores meta data of widgets  The MetaDataBase stores meta information of widgets, which are not  stored directly in widgets (properties). This is e.g. the  information which properties have been modified.*/MetaDataBase::MetaDataBase(){}inline void setupDataBase(){    if ( !db || !cWidgets ) {	db = new QPtrDict<MetaDataBaseRecord>( 1481 );	db->setAutoDelete( TRUE );	cWidgets = new QPtrList<MetaDataBase::CustomWidget>;	cWidgets->setAutoDelete( TRUE );    }}void MetaDataBase::clearDataBase(){    delete db;    db = 0;    delete cWidgets;    cWidgets = 0;}void MetaDataBase::addEntry( QObject *o ){    if ( !o )	return;    setupDataBase();    if ( db->find( o ) )	return;    MetaDataBaseRecord *r = new MetaDataBaseRecord;    r->object = o;    r->spacing = r->margin = -1;    db->insert( (void*)o, r );    WidgetFactory::initChangedProperties( o );}void MetaDataBase::removeEntry( QObject *o ){    setupDataBase();    db->remove( o );}void MetaDataBase::setPropertyChanged( QObject *o, const QString &property, bool changed ){    setupDataBase();    if ( o->isA( "PropertyObject" ) ) {	( (PropertyObject*)o )->mdPropertyChanged( property, changed );	return;    }    MetaDataBaseRecord *r = db->find( (void*)o );    if ( !r ) {	qWarning( "No entry for %p (%s, %s) found in MetaDataBase",		  o, o->name(), o->className() );	return;    }    if ( changed ) {	if ( r->changedProperties.findIndex( property ) == -1 )	    r->changedProperties.append( property );    } else {	if ( r->changedProperties.findIndex( property ) != -1 )	    r->changedProperties.remove( property );    }    if ( doUpdate &&	 ( property == "hAlign" || property == "vAlign" || property == "wordwrap" ) ) {	doUpdate = FALSE;	setPropertyChanged( o, "alignment", changed ||			    isPropertyChanged( o, "hAlign" ) ||			    isPropertyChanged( o, "vAlign" ) ||			    isPropertyChanged( o, "wordwrap" ) );	doUpdate = TRUE;    }    if ( doUpdate && property == "alignment" ) {	doUpdate = FALSE;	setPropertyChanged( o, "hAlign", changed );	setPropertyChanged( o, "vAlign", changed );	setPropertyChanged( o, "wordwrap", changed );	doUpdate = TRUE;    }}bool MetaDataBase::isPropertyChanged( QObject *o, const QString &property ){    setupDataBase();    if ( o->isA( "PropertyObject" ) )	return ( (PropertyObject*)o )->mdIsPropertyChanged( property );    MetaDataBaseRecord *r = db->find( (void*)o );    if ( !r ) {	qWarning( "No entry for %p (%s, %s) found in MetaDataBase",		  o, o->name(), o->className() );	return FALSE;    }    return r->changedProperties.findIndex( property ) != -1;}QStringList MetaDataBase::changedProperties( QObject *o ){    setupDataBase();    MetaDataBaseRecord *r = db->find( (void*)o );    if ( !r ) {	qWarning( "No entry for %p (%s, %s) found in MetaDataBase",		  o, o->name(), o->className() );	return QStringList();    }    QStringList lst( r->changedProperties );    return lst;}void MetaDataBase::setPropertyComment( QObject *o, const QString &property, const QString &comment ){    setupDataBase();    if ( o->isA( "PropertyObject" ) ) {	( (PropertyObject*)o )->mdSetPropertyComment( property, comment );	return;    }    MetaDataBaseRecord *r = db->find( (void*)o );    if ( !r ) {	qWarning( "No entry for %p (%s, %s) found in MetaDataBase",		  o, o->name(), o->className() );	return;    }    r->propertyComments.insert( property, comment );}QString MetaDataBase::propertyComment( QObject *o, const QString &property ){    setupDataBase();    if ( o->isA( "PropertyObject" ) )	return ( (PropertyObject*)o )->mdPropertyComment( property );    MetaDataBaseRecord *r = db->find( (void*)o );    if ( !r ) {	qWarning( "No entry for %p (%s, %s) found in MetaDataBase",		  o, o->name(), o->className() );	return QString::null;    }    return *r->propertyComments.find( property );}void MetaDataBase::setFakeProperty( QObject *o, const QString &property, const QVariant& value ){    setupDataBase();    if ( o->isA( "PropertyObject" ) ) {	( (PropertyObject*)o )->mdSetFakeProperty( property, value );	return;    }    MetaDataBaseRecord *r = db->find( (void*)o );    if ( !r ) {	qWarning( "No entry for %p (%s, %s) found in MetaDataBase",		  o, o->name(), o->className() );	return;    }    r->fakeProperties[property] = value;}QVariant MetaDataBase::fakeProperty( QObject * o, const QString &property){    setupDataBase();    if ( o->isA( "PropertyObject" ) )	return ( (PropertyObject*)o )->mdFakeProperty( property );    MetaDataBaseRecord *r = db->find( (void*)o );    if ( !r ) {	if ( !o->isA( "QDesignerPopupMenu" ) )	    qWarning( "No entry for %p (%s, %s) found in MetaDataBase",		      o, o->name(), o->className() );	return QVariant();    }    QMap<QString, QVariant>::Iterator it = r->fakeProperties.find( property );    if ( it != r->fakeProperties.end() )	return r->fakeProperties[property];    return WidgetFactory::defaultValue( o, property );}QMap<QString,QVariant>* MetaDataBase::fakeProperties( QObject* o ){    setupDataBase();    MetaDataBaseRecord *r = db->find( (void*)o );    if ( !r ) {	qWarning( "No entry for %p (%s, %s) found in MetaDataBase",		  o, o->name(), o->className() );	return 0;    }    return &r->fakeProperties;}void MetaDataBase::setSpacing( QObject *o, int spacing ){    if ( !o )	return;    setupDataBase();    MetaDataBaseRecord *r = db->find( (void*)o );    if ( !r || !o->isWidgetType() ) {	qWarning( "No entry for %p (%s, %s) found in MetaDataBase",		  o, o->name(), o->className() );	return;    }    r->spacing = spacing;    QLayout * layout = 0;    WidgetFactory::layoutType( (QWidget*)o, layout );    if ( layout ) {	int spadef = 6;	if ( MainWindow::self->formWindow() )	    spadef = MainWindow::self->formWindow()->layoutDefaultSpacing();	if ( spacing == -1 )	    layout->setSpacing( spadef );	else	    layout->setSpacing( spacing );    }}int MetaDataBase::spacing( QObject *o ){    if ( !o )	return -1;    setupDataBase();    if ( o->inherits( "QMainWindow" ) )	o = ( (QMainWindow*)o )->centralWidget();    MetaDataBaseRecord *r = db->find( (void*)o );    if ( !r || !o->isWidgetType() ) {	qWarning( "No entry for %p (%s, %s) found in MetaDataBase",		  o, o->name(), o->className() );	return -1;    }    return r->spacing;}void MetaDataBase::setMargin( QObject *o, int margin ){    if ( !o )	return;    setupDataBase();    MetaDataBaseRecord *r = db->find( (void*)o );    if ( !r || !o->isWidgetType() ) {	qWarning( "No entry for %p (%s, %s) found in MetaDataBase",		  o, o->name(), o->className() );	return;    }    r->margin = margin;    QLayout * layout = 0;    WidgetFactory::layoutType( (QWidget*)o, layout );    bool isInnerLayout = TRUE;    QWidget *widget = (QWidget*)o;    if ( widget && !widget->inherits( "QLayoutWidget" ) &&	( WidgetDatabase::isContainer( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( widget ) ) ) ||	widget && widget->parentWidget() && widget->parentWidget()->inherits( "FormWindow" ) ) )	isInnerLayout = FALSE;    if ( layout ) {	int mardef = 11;	if ( MainWindow::self->formWindow() )	    mardef = MainWindow::self->formWindow()->layoutDefaultMargin();	if ( margin == -1 ) {	    if ( isInnerLayout )		layout->setMargin( 1 );	    else		layout->setMargin( QMAX( 1, mardef ) );	}	else	    layout->setMargin( QMAX( 1, margin ) );    }}int MetaDataBase::margin( QObject *o ){    if ( !o )	return -1;    setupDataBase();    if ( o->inherits( "QMainWindow" ) )	o = ( (QMainWindow*)o )->centralWidget();    MetaDataBaseRecord *r = db->find( (void*)o );    if ( !r || !o->isWidgetType() ) {	qWarning( "No entry for %p (%s, %s) found in MetaDataBase",		  o, o->name(), o->className() );	return -1;    }    return r->margin;}void MetaDataBase::addConnection( QObject *o, QObject *sender, const QCString &signal,				  QObject *receiver, const QCString &slot, bool addCode ){    setupDataBase();    MetaDataBaseRecord *r = db->find( (void*)o );    if ( !r ) {	qWarning( "No entry for %p (%s, %s) found in MetaDataBase",		  o, o->name(), o->className() );	return;    }    if ( !(sender && receiver) )	return;    Connection conn;    conn.sender = sender;    conn.signal = signal;    conn.receiver = receiver;    conn.slot = slot;    r->connections.append( conn );    if ( addCode ) {	QString rec = receiver->name();	if ( o->inherits( "FormWindow" ) && receiver == ( (FormWindow*)o )->mainContainer() )	    rec = "this";	QString sen = sender->name();	if ( o->inherits( "FormWindow" ) && sender == ( (FormWindow*)o )->mainContainer() )	    sen = "this";	FormFile *ff = 0;	if ( o->inherits( "FormFile" ) )	    ff = (FormFile*)o;	else if ( o->inherits( "FormWindow" ) )	    ff = ( (FormWindow*)o )->formFile();	ff->addConnection( sen, signal, rec, slot );    }}void MetaDataBase::removeConnection( QObject *o, QObject *sender, const QCString &signal,				     QObject *receiver, const QCString &slot ){    setupDataBase();    MetaDataBaseRecord *r = db->find( (void*)o );    if ( !r ) {	qWarning( "No entry for %p (%s, %s) found in MetaDataBase",		  o, o->name(), o->className() );	return;    }    if ( !(sender && receiver) )	return;    for ( QValueList<Connection>::Iterator it = r->connections.begin(); it != r->connections.end(); ++it ) {	Connection conn = *it;	if ( conn.sender == sender &&	     conn.signal == signal &&	     conn.receiver == receiver &&	     conn.slot == slot ) {	    r->connections.remove( it );	    break;	}    }    if ( o->inherits( "FormWindow" ) ) {	QString rec = receiver->name();	if ( receiver == ( (FormWindow*)o )->mainContainer() )	    rec = "this";	( (FormWindow*)o )->formFile()->removeConnection( sender->name(), signal, rec, slot );    }}void MetaDataBase::setupConnections( QObject *o, const QValueList<LanguageInterface::Connection> &conns ){    setupDataBase();    MetaDataBaseRecord *r = db->find( (void*)o );    if ( !r ) {	qWarning( "No entry for %p (%s, %s) found in MetaDataBase",		  o, o->name(), o->className() );	return;    }    if ( !o->inherits( "FormFile" ) )	return;    FormFile *formfile = (FormFile*)o;    r->connections.clear();    for ( QValueList<LanguageInterface::Connection>::ConstIterator cit = conns.begin();	  cit != conns.end(); ++cit ) {	// #### get the correct sender object out of Bla.Blub.sender	QString senderName = (*cit).sender;	if ( senderName.find( '.' ) != -1 )	    senderName = senderName.mid( senderName.findRev( '.' ) + 1 );	QObject *sender = 0;	if ( formfile->formWindow() )	    sender = formfile->formWindow()->child( senderName );	if ( !sender && formfile->isFake() )	    sender = formfile->project()->objectForFakeFormFile( formfile );	if ( !sender && senderName == "this" )	    sender = formfile->formWindow() ?		     formfile->formWindow()->mainContainer() :		     formfile->project()->objectForFakeFormFile( formfile );	if ( !sender )	    continue;	MetaDataBase::addConnection( formfile->formWindow() ?				     (QObject*)formfile->formWindow() :				     (QObject*)formfile,				     sender,				     (*cit).signal.latin1(),				     formfile->formWindow() ?				     formfile->formWindow()->mainContainer() :				     formfile->project()->objectForFakeFormFile( formfile ),				     (*cit).slot.latin1(),				     FALSE );    }}bool MetaDataBase::hasConnection( QObject *o, QObject *sender, const QCString &signal,				  QObject *receiver, const QCString &slot ){    setupDataBase();    MetaDataBaseRecord *r = db->find( (void*)o );    if ( !r ) {	qWarning( "No entry for %p (%s, %s) found in MetaDataBase",		  o, o->name(), o->className() );	return FALSE;    }    for ( QValueList<Connection>::Iterator it = r->connections.begin(); it != r->connections.end(); ++it ) {	Connection conn = *it;	if ( conn.sender == sender &&	     conn.signal == signal &&	     conn.receiver == receiver &&	     conn.slot == slot )	    return TRUE;    }    return FALSE;}QValueList<MetaDataBase::Connection> MetaDataBase::connections( QObject *o ){    setupDataBase();    MetaDataBaseRecord *r = db->find( (void*)o );    if ( !r ) {	qWarning( "No entry for %p (%s, %s) found in MetaDataBase",		  o, o->name(), o->className() );	return QValueList<Connection>();    }    return r->connections;}QValueList<MetaDataBase::Connection> MetaDataBase::connections( QObject *o, QObject *sender,								QObject *receiver ){    setupDataBase();    MetaDataBaseRecord *r = db->find( (void*)o );    if ( !r ) {	qWarning( "No entry for %p (%s, %s) found in MetaDataBase",		  o, o->name(), o->className() );	return QValueList<Connection>();    }    QValueList<Connection>::Iterator it = r->connections.begin();    QValueList<Connection> ret;    QValueList<Connection>::Iterator conn;    while ( ( conn = it ) != r->connections.end() ) {	++it;	if ( (*conn).sender == sender &&	     (*conn).receiver == receiver )	    ret << *conn;    }    return ret;}QValueList<MetaDataBase::Connection> MetaDataBase::connections( QObject *o, QObject *object )

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -