diff options
Diffstat (limited to 'src/kernel/qmetaobject.cpp')
-rw-r--r-- | src/kernel/qmetaobject.cpp | 1251 |
1 files changed, 0 insertions, 1251 deletions
diff --git a/src/kernel/qmetaobject.cpp b/src/kernel/qmetaobject.cpp deleted file mode 100644 index ae74503c3..000000000 --- a/src/kernel/qmetaobject.cpp +++ /dev/null @@ -1,1251 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQMetaObject class -** -** Created : 930419 -** -** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. -** -** This file is part of the kernel module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "ntqmetaobject.h" -#include "tqasciidict.h" - -#ifdef TQT_THREAD_SUPPORT -#include <private/tqmutexpool_p.h> -#endif // TQT_THREAD_SUPPORT - -/*! - \class TQMetaData ntqmetaobject.h - \reentrant - - \brief The TQMetaData class provides information about a member function that is known to the meta object system. - - \internal - - The struct consists of three members, \e name, \e method and \e access: - - \code - const char *name; // - member name - const TQUMethod* method; // - detailed method description - enum Access { Private, Protected, Public }; - Access access; // - access permission - \endcode - */ - -/*! - \class TQClassInfo ntqmetaobject.h - - \brief The TQClassInfo class provides a struct that stores some basic information about a single class. - - \internal - - The class information is a simple \e name - \e value pair: - - \code - const char* name; - const char* value; - \endcode - - */ - - -/*! - \class TQMetaObject ntqmetaobject.h - \brief The TQMetaObject class contains meta information about TQt objects. - - \ingroup objectmodel - - The Meta Object System in TQt is responsible for the signals and - slots inter-object communication mechanism, runtime type - information and the property system. All meta information in TQt is - kept in a single instance of TQMetaObject per class. - - This class is not normally required for application programming. - But if you write meta applications, such as scripting engines or - GUI builders, you might find these functions useful: - \list - \i className() to get the name of a class. - \i superClassName() to get the name of the superclass. - \i inherits(), the function called by TQObject::inherits(). - \i superClass() to access the superclass's meta object. - \i numSlots(), numSignals(), slotNames(), and signalNames() to get - information about a class's signals and slots. - \i property() and propertyNames() to obtain information about a - class's properties. - \endlist - - Classes may have a list of name-value pairs of class information. - The number of pairs is returned by numClassInfo(), and values are - returned by classInfo(). - - \sa \link moc.html moc (Meta Object Compiler)\endlink - -*/ - - -/***************************************************************************** - The private object. - *****************************************************************************/ - -// extra flags from moc.y -enum Flags { - Invalid = 0x00000000, - Readable = 0x00000001, - Writable = 0x00000002, - EnumOrSet = 0x00000004, - UnresolvedEnum = 0x00000008, - StdSet = 0x00000100, - Override = 0x00000200, - NotDesignable = 0x00001000, - DesignableOverride = 0x00002000, - NotScriptable = 0x00004000, - ScriptableOverride = 0x00008000, - NotStored = 0x00010000, - StoredOverride = 0x00020000 -}; - -static TQAsciiDict<void> *qt_metaobjects = 0; -static int qt_metaobjects_count = 0; - -class TQMetaObjectPrivate -{ -public: - TQMetaObjectPrivate() : -#ifndef TQT_NO_PROPERTIES - enumData(0), numEnumData(0), - propData(0),numPropData(0), - tqt_static_property(0), -#endif - classInfo(0), numClassInfo(0) {} -#ifndef TQT_NO_PROPERTIES - const TQMetaEnum *enumData; - int numEnumData; - const TQMetaProperty *propData; - int numPropData; - bool (*tqt_static_property)(TQObject*, int, int, TQVariant*); -#endif - const TQClassInfo *classInfo; - int numClassInfo; -}; - - -/***************************************************************************** - Internal dictionary for fast access to class members - *****************************************************************************/ - -#if defined(Q_CANNOT_DELETE_CONSTANT) -typedef TQMetaData TQConstMetaData; -#else -typedef const TQMetaData TQConstMetaData; -#endif - -class TQ_EXPORT TQMemberDict : public TQAsciiDict<TQConstMetaData> -{ -public: - TQMemberDict( int size = 17, bool cs = TRUE, bool ck = TRUE ) : - TQAsciiDict<TQConstMetaData>(size,cs,ck) {} - TQMemberDict( const TQMemberDict &dict ) : TQAsciiDict<TQConstMetaData>(dict) {} - ~TQMemberDict() { clear(); } - TQMemberDict &operator=(const TQMemberDict &dict) - { return (TQMemberDict&)TQAsciiDict<TQConstMetaData>::operator=(dict); } -}; - - -/* - Calculate optimal dictionary size for n entries using prime numbers, - and assuming there are no more than 40 entries. -*/ - -static int optDictSize( int n ) -{ - if ( n < 6 ) - n = 5; - else if ( n < 10 ) - n = 11; - else if ( n < 14 ) - n = 17; - else - n = 23; - return n; -} - - -/***************************************************************************** - TQMetaObject member functions - *****************************************************************************/ - -/*!\internal - */ -TQMetaObject::TQMetaObject( const char *const class_name, TQMetaObject *super_class, - const TQMetaData *const slot_data, int n_slots, - const TQMetaData *const signal_data, int n_signals, -#ifndef TQT_NO_PROPERTIES - const TQMetaProperty *const prop_data, int n_props, - const TQMetaEnum *const enum_data, int n_enums, -#endif - const TQClassInfo *const class_info, int n_info ) -{ - classname = class_name; // set meta data - superclass = super_class; - superclassname = superclass ? superclass->className() : 0; - slotDict = init( slotData = slot_data, n_slots ); - signalDict = init( signalData = signal_data, n_signals ); - - d = new TQMetaObjectPrivate; - reserved = 0; - -#ifndef TQT_NO_PROPERTIES - d->propData = prop_data; - d->numPropData = n_props; - d->enumData = enum_data; - d->numEnumData = n_enums; -#endif - d->classInfo = class_info; - d->numClassInfo = n_info; - - signaloffset = superclass ? ( superclass->signalOffset() + superclass->numSignals() ) : 0; - slotoffset = superclass ? ( superclass->slotOffset() + superclass->numSlots() ) : 0; -#ifndef TQT_NO_PROPERTIES - propertyoffset = superclass ? ( superclass->propertyOffset() + superclass->numProperties() ) : 0; -#endif -} - -#ifndef TQT_NO_PROPERTIES -/*!\internal - */ -TQMetaObject::TQMetaObject( const char *const class_name, TQMetaObject *super_class, - const TQMetaData *const slot_data, int n_slots, - const TQMetaData *const signal_data, int n_signals, - const TQMetaProperty *const prop_data, int n_props, - const TQMetaEnum *const enum_data, int n_enums, - bool (*tqt_static_property)(TQObject*, int, int, TQVariant*), - const TQClassInfo *const class_info, int n_info ) -{ - classname = class_name; // set meta data - superclass = super_class; - superclassname = superclass ? superclass->className() : 0; - slotDict = init( slotData = slot_data, n_slots ); - signalDict = init( signalData = signal_data, n_signals ); - - d = new TQMetaObjectPrivate; - reserved = 0; - - d->propData = prop_data; - d->numPropData = n_props; - d->enumData = enum_data; - d->numEnumData = n_enums; - d->tqt_static_property = tqt_static_property; - d->classInfo = class_info; - d->numClassInfo = n_info; - - signaloffset = superclass ? ( superclass->signalOffset() + superclass->numSignals() ) : 0; - slotoffset = superclass ? ( superclass->slotOffset() + superclass->numSlots() ) : 0; - propertyoffset = superclass ? ( superclass->propertyOffset() + superclass->numProperties() ) : 0; -} -#endif - -/*!\internal - */ -TQMetaObject::~TQMetaObject() -{ - delete slotDict; // delete dicts - delete signalDict; - delete d; -#ifdef TQT_THREAD_SUPPORT - TQMutexLocker( tqt_global_mutexpool ? - tqt_global_mutexpool->get( &qt_metaobjects ) : 0 ); -#endif // TQT_THREAD_SUPPORT - if ( qt_metaobjects ) { - qt_metaobjects->remove( classname ); - if ( qt_metaobjects->isEmpty() ) { - delete qt_metaobjects; - qt_metaobjects = 0; - } - } - - // delete reserved; // Unused void* -} - - -/*! - \fn const char *TQMetaObject::className() const - - Returns the class name. - - \sa TQObject::className(), superClassName() -*/ - -/*! - \fn const char *TQMetaObject::superClassName() const - - Returns the class name of the superclass or 0 if there is no - superclass in the TQObject hierachy. - - \sa className() -*/ - -/*! - \fn TQMetaObject *TQMetaObject::superClass() const - - Returns the meta object of the super class or 0 if there is no - such object. -*/ - -/*! - Returns the number of slots for this class. - - If \a super is TRUE, inherited slots are included. - - \sa slotNames() -*/ -int TQMetaObject::numSlots( bool super ) const // number of slots -{ - int n = slotDict ? slotDict->count() : 0; - if ( !super || !superclass ) - return n; - return n + superclass->numSlots( super ); -} - -/*! - Returns the number of signals for this class. - - If \a super is TRUE, inherited signals are included. - - \sa signalNames() -*/ -int TQMetaObject::numSignals( bool super ) const // number of signals -{ - int n = signalDict ? signalDict->count() : 0; - if ( !super || !superclass ) - return n; - return n + superclass->numSignals( super ); -} - - -/*! \internal - - Returns the meta data of the slot with the name \a n or 0 if no - such slot exists. - - If \a super is TRUE, inherited slots are included. - */ -const TQMetaData* TQMetaObject::slot( int index, bool super ) const -{ - int idx = index - ( super ? slotOffset() : 0 ); - if ( slotDict && idx >= 0 && idx < (int) slotDict->count() ) { - return slotData + idx; - } - if ( !super || !superclass ) - return 0; - return superclass->slot( index, super ); -} - -/*! \internal - - Returns the meta data of the signal with the name \a n or 0 if no - such signal exists. - - If \a super is TRUE, inherited signals are included. - */ -const TQMetaData* TQMetaObject::signal( int index, bool super ) const -{ - int idx = index - ( super ? signalOffset() : 0 ); - if ( signalDict && idx >= 0 && idx < (int) signalDict->count() ) { - return signalData + idx; - } - if ( !super || !superclass ) - return 0; - return superclass->signal( index, super ); -} - - -/*! - \fn int TQMetaObject::signalOffset() const - - \internal - - Returns the signal offset for this metaobject. - -*/ - -/*! - \fn int TQMetaObject::propertyOffset() const - - \internal - - Returns the property offset for this metaobject. - -*/ - -/*! \internal - Returns the index of the signal with name \n or -1 if no such signal exists. - - If \a super is TRUE, inherited signals are included. -*/ -int TQMetaObject::findSignal( const char* n, bool super ) const -{ - const TQMetaObject *mo = this; - int offset = -1; - - do { - const TQMetaData *md = mo->signalDict ? mo->signalDict->find( n ) : 0; - if ( md ) { -#if defined(QT_CHECK_RANGE) - if ( offset != -1 ) { - tqWarning( "TQMetaObject::findSignal:%s: Conflict with %s::%s", - className(), mo->className(), n ); - return offset; - } -#endif - offset = mo->signalOffset() + ( md - mo->signalData ); -#if !defined(QT_CHECK_RANGE) - return offset; -#endif - } - } while ( super && (mo = mo->superclass) ); - - return offset; -} - -/*! - \fn int TQMetaObject::slotOffset() const - - \internal - - Returns the slot offset for this metaobject. - -*/ - -/*! \internal - Returns the index of the slot with name \n or -1 if no such slot exists. - - If \a super is TRUE, inherited slots are included. - */ -int TQMetaObject::findSlot( const char* n, bool super ) const -{ - const TQMetaData *md = slotDict ? slotDict->find( n ) : 0; - if ( md ) - return slotOffset() + ( md - slotData ); - if ( !super || !superclass) - return -1; - return superclass->findSlot( n, super ); -} - -/*!\internal - */ -TQMetaObject *TQMetaObject::new_metaobject( const char *classname, - TQMetaObject *superclassobject, - const TQMetaData * const slot_data, int n_slots, - const TQMetaData * const signal_data, int n_signals, -#ifndef TQT_NO_PROPERTIES - const TQMetaProperty * const prop_data, int n_props, - const TQMetaEnum * const enum_data, int n_enums, -#endif - const TQClassInfo * const class_info, int n_info ) -{ - return new TQMetaObject( classname, superclassobject, slot_data, n_slots, - signal_data, n_signals, -#ifndef TQT_NO_PROPERTIES - prop_data, n_props, - enum_data, n_enums, -#endif - class_info, n_info ); -} - -#ifndef TQT_NO_PROPERTIES -/*!\internal - */ -TQMetaObject *TQMetaObject::new_metaobject( const char *classname, - TQMetaObject *superclassobject, - const TQMetaData * const slot_data, int n_slots, - const TQMetaData * const signal_data, int n_signals, - const TQMetaProperty * const prop_data, int n_props, - const TQMetaEnum * const enum_data, int n_enums, - bool (*tqt_static_property)(TQObject*, int, int, TQVariant*), - const TQClassInfo * const class_info, int n_info ) -{ - return new TQMetaObject( classname, superclassobject, slot_data, n_slots, - signal_data, n_signals, - prop_data, n_props, - enum_data, n_enums, - tqt_static_property, - class_info, n_info ); -} -#endif - -/*!\internal - */ -TQMemberDict *TQMetaObject::init( const TQMetaData * data, int n ) -{ - if ( n == 0 ) // nothing, then make no dict - return 0; - TQMemberDict *dict = new TQMemberDict( optDictSize(n), TRUE, FALSE ); - TQ_CHECK_PTR( dict ); - while ( n-- ) { // put all members into dict - dict->insert( data->name, data ); - data++; - } - return dict; -} - -/*! - Returns the number of items of class information available for - this class. - - If \a super is TRUE, inherited class information is included. -*/ -int TQMetaObject::numClassInfo( bool super ) const -{ - return d->numClassInfo + ((super && superclass)?superclass->numClassInfo(super):0); -} - -/*! - Returns the class information with index \a index or 0 if no such - information exists. - - If \a super is TRUE, inherited class information is included. -*/ -const TQClassInfo* TQMetaObject::classInfo( int index, bool super ) const -{ - if ( index < 0 ) - return 0; - if ( index < d->numClassInfo ) - return &(d->classInfo[ index ]); - if ( !super || !superclass ) - return 0; - return superclass->classInfo( index - d->numClassInfo, super ); -} - -/*! - \overload - Returns the class information with name \a name or 0 if no such - information exists. - - If \a super is TRUE, inherited class information is included. -*/ -const char* TQMetaObject::classInfo( const char* name, bool super ) const -{ - for( int i = 0; i < d->numClassInfo; ++i ) { - if ( qstrcmp( d->classInfo[i].name, name ) == 0 ) - return d->classInfo[i].value; - } - if ( !super || !superclass ) - return 0; - return superclass->classInfo( name, super ); -} - -#ifndef TQT_NO_PROPERTIES - -/*! - Returns the number of properties for this class. - - If \a super is TRUE, inherited properties are included. - - \sa propertyNames() - */ -int TQMetaObject::numProperties( bool super ) const // number of signals -{ - int n = d->numPropData; - if ( !super || !superclass ) - return n; - return n + superclass->numProperties( super ); -} - -/*! - Returns the property meta data for the property at index \a index - or 0 if no such property exists. - - If \a super is TRUE, inherited properties are included. - - \sa propertyNames() - */ -const TQMetaProperty* TQMetaObject::property( int index, bool super ) const -{ - int idx = index - ( super ? propertyOffset() : 0 ); - if ( d->propData && idx >= 0 && idx < (int)d->numPropData ) - return d->propData + idx; - if ( !super || !superclass ) - return 0; - return superclass->property( index, super ); -} - - -/*! - Returns the index for the property with name \a name or -1 if no - such property exists. - - If \a super is TRUE, inherited properties are included. - - \sa property(), propertyNames() -*/ - -int TQMetaObject::findProperty( const char *name, bool super ) const -{ - for( int i = 0; i < d->numPropData; ++i ) { - if ( d->propData[i].isValid() && qstrcmp( d->propData[i].name(), name ) == 0 ) { - return ( super ? propertyOffset() : 0 ) + i; - } - } - if ( !super || !superclass ) - return -1; - return superclass->findProperty( name, super ); -} - -/*! \internal - - Returns the index for the property \a prop - or -1 if the property can not be found. - - If \a super is TRUE, inherited properties are included. - - \sa property(), propertyNames() -*/ - -int TQMetaObject::indexOfProperty( const TQMetaProperty* prop, bool super ) const -{ - if ( *prop->meta == this ) - return ( super ? propertyOffset() : 0 ) + ( prop - d->propData); - if ( !super || !superclass ) - return -1; - return superclass->indexOfProperty( prop, super ); -} - -/*!\internal - - Returns the parent property of property \a p or 0, if the property - cannot be resolved. - - \a p has to be contained in this meta object -*/ - -const TQMetaProperty* TQMetaObject::resolveProperty( const TQMetaProperty* p ) const -{ - if ( !superclass ) - return 0; - return superclass->property( superclass->findProperty( p->n, TRUE ), TRUE ); -} - -/*!\internal - - \overload - - The version of resolveProperty that is used by moc generated code -*/ - -int TQMetaObject::resolveProperty( int index ) const -{ - if ( !superclass ) - return -1; - const TQMetaProperty* p = d->propData + ( index - propertyOffset() ); - return superclass->findProperty( p->n, TRUE ); -} - - -/*! - Returns a list with the names of all this class's properties. - - If \a super is TRUE, inherited properties are included. - - \sa property() -*/ -TQStrList TQMetaObject::propertyNames( bool super ) const -{ - TQStrList l( FALSE ); - - if ( superclass && super ) { - TQStrList sl = superclass->propertyNames( super ); - for ( TQStrListIterator slit( sl ); slit.current(); ++slit ) - l.append( slit.current() ); - } - - for( int i = 0; i < d->numPropData; ++i ) { - if ( d->propData[i].isValid() ) - l.append( d->propData[i].name() ); - } - - return l; -} - -/*! - Returns a list with the names of all this class's signals. - - If \a super is TRUE, inherited signals are included. -*/ -TQStrList TQMetaObject::signalNames( bool super ) const -{ - TQStrList l( FALSE ); - int n = numSignals( super ); - for( int i = 0; i < n; ++i ) { - l.append( signal(i, super)->name ); - } - return l; -} - -/*! - Returns a list with the names of all this class's slots. - - If \a super is TRUE, inherited slots are included. - - \sa numSlots() -*/ -TQStrList TQMetaObject::slotNames( bool super ) const -{ - TQStrList l( FALSE ); - int n = numSlots( super ); - for( int i = 0; i < n; ++i ) - l.append( slot( i, super)->name ); - return l; -} - -/*!\internal - - */ - -int TQMetaObject::numEnumerators( bool super ) const -{ - int n = 0; - if ( superclass && super ) - n += superclass->numEnumerators( super ); - return n + d->numEnumData; -} - -/*!\internal - - */ -TQStrList TQMetaObject::enumeratorNames( bool super ) const -{ - TQStrList l( FALSE ); - - if ( superclass && super ) { - TQStrList sl = superclass->enumeratorNames( super ); - for ( TQStrListIterator slit( sl ); slit.current(); ++slit ) - l.append( slit.current() ); - } - - for( int i = 0; i < d->numEnumData; ++i ) { - if ( d->enumData[i].items ) - l.append( d->enumData[i].name ); - } - - return l; -} - -/*!\internal - */ -const TQMetaEnum* TQMetaObject::enumerator( const char* name, bool super ) const -{ - for( int i = 0; i < d->numEnumData; ++i ) - if ( qstrcmp( d->enumData[i].name, name ) == 0 ) - return &(d->enumData[i]); - if ( !super || !superclass ) - return 0; - return superclass->enumerator( name, super ); -} - -#endif // TQT_NO_PROPERTIES - - -/*! - Returns TRUE if this class inherits \a clname within the meta - object inheritance chain; otherwise returns FALSE. - - (A class is considered to inherit itself.) -*/ -bool TQMetaObject::inherits( const char* clname ) const -{ - const TQMetaObject *meta = this; - while ( meta ) { - if ( qstrcmp(clname, meta->className()) == 0 ) - return TRUE; - meta = meta->superclass; - } - return FALSE; -} - -/*! \internal */ - -TQMetaObject *TQMetaObject::metaObject( const char *class_name ) -{ - if ( !qt_metaobjects ) - return 0; -#ifdef TQT_THREAD_SUPPORT - TQMutexLocker( tqt_global_mutexpool ? - tqt_global_mutexpool->get( &qt_metaobjects ) : 0 ); -#endif // TQT_THREAD_SUPPORT - TQtStaticMetaObjectFunction func = (TQtStaticMetaObjectFunction)qt_metaobjects->find( class_name ); - if ( func ) - return func(); - return 0; -} - -/*! \internal */ -bool TQMetaObject::hasMetaObject( const char *class_name ) -{ - if ( !qt_metaobjects ) - return FALSE; -#ifdef TQT_THREAD_SUPPORT - TQMutexLocker( tqt_global_mutexpool ? - tqt_global_mutexpool->get( &qt_metaobjects ) : 0 ); -#endif // TQT_THREAD_SUPPORT - return !!qt_metaobjects->find( class_name ); -} - -#ifndef TQT_NO_PROPERTIES -/*! \internal - -### this functions will go away. It exists purely for the sake of meta -### object code generated with TQt 3.1.0 -*/ -bool TQMetaObject::tqt_static_property( TQObject* o, int id, int f, TQVariant* v) -{ - if ( d->tqt_static_property ) - return d->tqt_static_property( o, id, f, v ); - else if ( o ) // compatibility - return o->tqt_property( id, f, v ); - else if ( superclass ) - return superclass->tqt_static_property( o, id, f, v ); - switch ( f ) { - case 3: case 4: case 5: - return TRUE; - default: - return FALSE; - } -} - - -/*! - \class TQMetaProperty ntqmetaobject.h - - \brief The TQMetaProperty class stores meta data about a property. - - \ingroup objectmodel - - Property meta data includes type(), name(), and whether a property - is writable(), designable() and stored(). - - The functions isSetType(), isEnumType() and enumKeys() provide - further information about a property's type. The conversion - functions keyToValue(), valueToKey(), keysToValue() and - valueToKeys() allow conversion between the integer representation - of an enumeration or set value and its literal representation. - - Actual property values are set and received through TQObject's set - and get functions. See TQObject::setProperty() and - TQObject::property() for details. - - You receive meta property data through an object's meta object. - See TQMetaObject::property() and TQMetaObject::propertyNames() for - details. -*/ - -/*! - Returns the possible enumeration keys if this property is an - enumeration type (or a set type). - - \sa isEnumType() -*/ -TQStrList TQMetaProperty::enumKeys() const -{ - TQStrList l( FALSE ); - const TQMetaEnum* ed = enumData; - if ( !enumData && meta ) - ed = (*meta)->enumerator( t, TRUE ); - if ( !ed ) - return l; - if ( ed != 0 ) { - for( uint i = 0; i < ed->count; ++i ) { - uint j = 0; - while ( j < i && - ed->items[j].value != ed->items[i].value ) - ++j; - if ( i == j ) - l.append( ed->items[i].key ); - } - } - return l; -} - -/*! - Converts the enumeration key \a key to its integer value. - - For set types, use keysToValue(). - - \sa valueToKey(), isSetType(), keysToValue() -*/ -int TQMetaProperty::keyToValue( const char* key ) const -{ - const TQMetaEnum* ed = enumData; - if ( !enumData && meta ) - ed = (*meta)->enumerator( t, TRUE ); - if ( !ed ) - return -1; - for ( uint i = 0; i < ed->count; ++i ) { - if ( !qstrcmp( key, ed->items[i].key) ) - return ed->items[i].value; - } - return -1; -} - -/*! - Converts the enumeration value \a value to its literal key. - - For set types, use valueToKeys(). - - \sa valueToKey(), isSetType(), valueToKeys() -*/ -const char* TQMetaProperty::valueToKey( int value ) const -{ - const TQMetaEnum* ed = enumData; - if ( !enumData && meta ) - ed = (*meta)->enumerator( t, TRUE ); - if ( !ed ) - return 0; - for ( uint i = 0; i < ed->count; ++i ) { - if ( value == ed->items[i].value ) - return ed->items[i].key ; - } - return 0; -} - -/*! - Converts the list of keys \a keys to their combined (OR-ed) - integer value. - - \sa isSetType(), valueToKey(), keysToValue() -*/ -int TQMetaProperty::keysToValue( const TQStrList& keys ) const -{ - const TQMetaEnum* ed = enumData; - if ( !enumData && meta ) - ed = (*meta)->enumerator( t, TRUE ); - if ( !ed ) - return -1; - int value = 0; - for ( TQStrListIterator it( keys ); it.current(); ++it ) { - uint i; - for( i = ed->count; i > 0; --i ) { - if ( !qstrcmp( it.current(), ed->items[i-1].key) ) { - value |= ed->items[i-1].value; - break; - } - } - if ( i == 0 ) - value |= -1; - } - return value; -} - -/*! - Converts the set value \a value to a list of keys. - - \sa isSetType(), valueToKey(), valueToKeys() -*/ -TQStrList TQMetaProperty::valueToKeys( int value ) const -{ - TQStrList keys; - const TQMetaEnum* ed = enumData; - if ( !enumData && meta ) - ed = (*meta)->enumerator( t, TRUE ); - if ( !ed ) - return keys; - - int v = value; - for( uint i = ed->count; i > 0; --i ) { - int k = ed->items[i-1].value; - if ( ( k != 0 && (v & k) == k ) || ( k == value) ) { - v = v & ~k; - keys.append( ed->items[i-1].key ); - } - } - return keys; -} - -bool TQMetaProperty::writable() const -{ - if ( !testFlags( Override ) || testFlags( Writable ) ) - return testFlags( Writable ); - const TQMetaObject* mo = (*meta); - const TQMetaProperty* parent = mo->resolveProperty( this ); - return parent ? parent->writable() : FALSE; -} - -/*!\internal - */ -bool TQMetaProperty::stdSet() const -{ - if ( !testFlags( Override ) || testFlags( Writable ) ) - return testFlags( StdSet ); - const TQMetaObject* mo = (*meta); - const TQMetaProperty* parent = mo->resolveProperty( this ); - return parent ? parent->stdSet() : FALSE; -} - -/*!\internal - */ -int TQMetaProperty::id() const -{ - return _id < 0 ? (*meta)->indexOfProperty( this, TRUE ) : _id; -} - -/*! \internal -*/ -void TQMetaProperty::clear() -{ - t = n = 0; - meta = 0; - enumData = 0; - _id = -1; - flags = 0; -} - -bool TQMetaProperty::isValid() const -{ - if ( testFlags( UnresolvedEnum ) ) { - if ( !enumData && (!meta || !(*meta)->enumerator( t, TRUE ) ) ) - return FALSE; - } - if ( !testFlags( Override ) || testFlags( Readable ) ) - return testFlags( Readable ); - const TQMetaObject* mo = (*meta); - const TQMetaProperty* parent = mo->resolveProperty( this ); - return parent ? parent->isValid() : FALSE; -} - -bool TQMetaProperty::isSetType() const -{ - const TQMetaEnum* ed = enumData; - if ( !enumData && meta ) - ed = (*meta)->enumerator( t, TRUE ); - return ( ed != 0 && ed->set ); -} - -bool TQMetaProperty::isEnumType() const -{ - return testFlags( EnumOrSet ); -} - - - -/*! - \fn const char* TQMetaProperty::type() const - - Returns the type of the property. -*/ - -/*! - \fn const char* TQMetaProperty::name() const - - Returns the name of the property. -*/ - -/*! - \fn bool TQMetaProperty::writable() const - - Returns TRUE if the property is writable; otherwise returns FALSE. - -*/ - -/*! \fn bool TQMetaProperty::isValid() const - - \internal - - Returns whether the property is valid. -*/ - -/*! - \fn bool TQMetaProperty::isEnumType() const - - Returns TRUE if the property's type is an enumeration value; - otherwise returns FALSE. - - \sa isSetType(), enumKeys() -*/ - -/*! - \fn bool TQMetaProperty::isSetType() const - - Returns TRUE if the property's type is an enumeration value that - is used as set, i.e. if the enumeration values can be OR-ed - together; otherwise returns FALSE. A set type is implicitly also - an enum type. - - \sa isEnumType(), enumKeys() -*/ - - -/*! Returns TRUE if the property is designable for object \a o; - otherwise returns FALSE. - - If no object \a o is given, the function returns a static - approximation. - */ -bool TQMetaProperty::designable( TQObject* o ) const -{ - if ( !isValid() || !writable() ) - return FALSE; - if ( o ) { - int idx = _id >= 0 ? _id : (*meta)->indexOfProperty( this, TRUE ); - return idx >= 0 && o->tqt_property( idx, 3, 0 ); - } - if ( testFlags( DesignableOverride ) ) { - const TQMetaObject* mo = (*meta); - const TQMetaProperty* parent = mo->resolveProperty( this ); - return parent ? parent->designable() : FALSE; - } - return !testFlags( NotDesignable ); -} - -/*! - Returns TRUE if the property is scriptable for object \a o; - otherwise returns FALSE. - - If no object \a o is given, the function returns a static - approximation. - */ -bool TQMetaProperty::scriptable( TQObject* o ) const -{ - if ( o ) { - int idx = _id >= 0 ? _id : (*meta)->indexOfProperty( this, TRUE ); - return idx >= 0 && o->tqt_property( idx, 4, 0 ); - } - if ( testFlags( ScriptableOverride ) ) { - const TQMetaObject* mo = (*meta); - const TQMetaProperty* parent = mo->resolveProperty( this ); - return parent ? parent->scriptable() : FALSE; - } - return !testFlags( NotScriptable ); -} - -/*! - Returns TRUE if the property shall be stored for object \a o; - otherwise returns FALSE. - - If no object \a o is given, the function returns a static - approximation. - */ -bool TQMetaProperty::stored( TQObject* o ) const -{ - if ( !isValid() || !writable() ) - return FALSE; - if ( o ) { - int idx = _id >= 0 ? _id : (*meta)->indexOfProperty( this, TRUE ); - return idx >= 0 && o->tqt_property( idx, 5, 0 ); - } - if ( testFlags( StoredOverride ) ) { - const TQMetaObject* mo = (*meta); - const TQMetaProperty* parent = mo->resolveProperty( this ); - return parent ? parent->stored() : FALSE; - } - return !testFlags( NotStored ); -} - - -/*! - Tries to reset the property for object \a o with a reset method. - On success, returns TRUE; otherwise returns FALSE. - - Reset methods are optional, usually only a few properties support - them. -*/ -bool TQMetaProperty::reset( TQObject* o ) const -{ - if ( !o ) - return FALSE; - int idx = _id >= 0 ? _id : (*meta)->indexOfProperty( this, TRUE ); - if ( idx < 0 ) - return 0; - return o->tqt_property( idx, 2, 0 ); -} - - -/*! \enum TQMetaProperty::Flags - - \internal -*/ - -#endif // TQT_NO_PROPERTIES - -/* - * TQMetaObjectCleanUp is used as static global object in the moc-generated cpp - * files and deletes the TQMetaObject provided with setMetaObject. It sets the - * TQObject reference to the metaObj to NULL when it is destroyed. - */ -TQMetaObjectCleanUp::TQMetaObjectCleanUp( const char *mo_name, TQtStaticMetaObjectFunction func ) - : metaObject( 0 ) -{ -#ifdef TQT_THREAD_SUPPORT - TQMutexLocker( tqt_global_mutexpool ? - tqt_global_mutexpool->get( &qt_metaobjects ) : 0 ); -#endif // TQT_THREAD_SUPPORT - if ( !qt_metaobjects ) - qt_metaobjects = new TQAsciiDict<void>( 257 ); - qt_metaobjects->insert( mo_name, (void*)func ); - - qt_metaobjects_count++; -} - -TQMetaObjectCleanUp::TQMetaObjectCleanUp() - : metaObject( 0 ) -{ -} - -/*! \fn bool TQMetaProperty::testFlags( uint f ) const - \internal -*/ - -TQMetaObjectCleanUp::~TQMetaObjectCleanUp() -{ -#ifdef TQT_THREAD_SUPPORT - TQMutexLocker( tqt_global_mutexpool ? - tqt_global_mutexpool->get( &qt_metaobjects ) : 0 ); -#endif // TQT_THREAD_SUPPORT - if ( !--qt_metaobjects_count ) { - delete qt_metaobjects; - qt_metaobjects = 0; - } - if ( metaObject ) { - delete *metaObject; - *metaObject = 0; - metaObject = 0; - } -} - -void TQMetaObjectCleanUp::setMetaObject( TQMetaObject *&mo ) -{ -#if defined(QT_CHECK_RANGE) - if (metaObject && metaObject != &mo) - tqWarning( "TQMetaObjectCleanUp::setMetaObject: Double use of TQMetaObjectCleanUp!" ); -#endif - metaObject = &mo; -} |