/****************************************************************************
**
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the Qt Designer of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this
** file. Please review the following information to ensure the GNU Lesser
** General Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU General
** Public License version 3.0 as published by the Free Software Foundation
** and appearing in the file LICENSE.GPL included in the packaging of this
** file. Please review the following information to ensure the GNU General
** Public License version 3.0 requirements will be met:
** http://www.gnu.org/copyleft/gpl.html.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/

#include "abstractintrospection_p.h"

QT_BEGIN_NAMESPACE

/*!
    \class QDesignerMetaEnumInterface
    \internal
    \since 4.4

    \brief QDesignerMetaEnumInterface is part of \QD's introspection interface and represents an enumeration.

    \inmodule QtDesigner

    The QDesignerMetaEnumInterface class provides meta-data about an enumerator.

    \sa QDesignerMetaObjectInterface
*/

/*!
    Constructs a QDesignerMetaEnumInterface object.
*/

QDesignerMetaEnumInterface::QDesignerMetaEnumInterface()
{
}

/*!
    Destroys the QDesignerMetaEnumInterface object.
*/
QDesignerMetaEnumInterface::~QDesignerMetaEnumInterface()
{
}

/*!
    \fn bool QDesignerMetaEnumInterface::isFlag() const

    Returns true if this enumerator is used as a flag.
*/

/*!
    \fn QString QDesignerMetaEnumInterface::key(int index) const

    Returns the key with the given \a index.
*/

/*!
    \fn int QDesignerMetaEnumInterface::keyCount() const

    Returns the number of keys.
*/

/*!
    \fn int QDesignerMetaEnumInterface::keyToValue(const QString &key) const

    Returns the integer value of the given enumeration \a key, or -1 if \a key is not defined.
*/

/*!
    \fn int QDesignerMetaEnumInterface::keysToValue(const QString &keys) const

    Returns the value derived from combining together the values of the \a keys using the OR operator, or -1 if keys is not defined. Note that the strings in \a keys must be '|'-separated.
*/

/*!
    \fn QString QDesignerMetaEnumInterface::name() const

    Returns the name of the enumerator (without the scope).
*/

/*!
    \fn QString QDesignerMetaEnumInterface::scope() const

    Returns the scope this enumerator was declared in.
*/

/*!
    \fn QString QDesignerMetaEnumInterface::separator() const

    Returns the separator to be used when building enumeration names.
*/

/*!
    \fn int QDesignerMetaEnumInterface::value(int index) const

    Returns the value with the given \a index; or returns -1 if there is no such value.
*/

/*!
    \fn QString QDesignerMetaEnumInterface::valueToKey(int value) const

    Returns the string that is used as the name of the given enumeration \a value, or QString::null if value is not defined.
*/

/*!
    \fn QString QDesignerMetaEnumInterface::valueToKeys(int value) const

    Returns a byte array of '|'-separated keys that represents the given \a value.
*/

/*!
    \class QDesignerMetaPropertyInterface
    \internal
    \since 4.4

    \brief QDesignerMetaPropertyInterface is part of \QD's introspection interface and represents a property.

    \inmodule QtDesigner

    The QDesignerMetaPropertyInterface class provides meta-data about a property.

    \sa QDesignerMetaObjectInterface
*/

/*!
    Constructs a QDesignerMetaPropertyInterface object.
*/

QDesignerMetaPropertyInterface::QDesignerMetaPropertyInterface()
{
}

/*!
    Destroys the QDesignerMetaPropertyInterface object.
*/

QDesignerMetaPropertyInterface::~QDesignerMetaPropertyInterface()
{
}

/*!
    \enum QDesignerMetaPropertyInterface::Kind

   This enum indicates whether the property is of a special type.

    \value EnumKind      The property is of an enumeration type
    \value FlagKind      The property is of an flag type
    \value OtherKind     The property is of another type
 */

/*!
    \enum QDesignerMetaPropertyInterface::AccessFlag

    These flags specify the access the property provides.

    \value  ReadAccess   Property can be read
    \value  WriteAccess  Property can be written
    \value  ResetAccess  Property can be reset to a default value
 */

/*!
    \enum QDesignerMetaPropertyInterface::Attribute

    Various attributes of the  property.

    \value DesignableAttribute  Property is designable (visible  in \QD)
    \value ScriptableAttribute  Property is scriptable
    \value StoredAttribute      Property is stored, that is, not calculated
    \value UserAttribute        Property is the property that the user can edit for the QObject
 */

/*!
    \fn const QDesignerMetaEnumInterface *QDesignerMetaPropertyInterface::enumerator() const

     Returns the enumerator if this property's type is an enumerator type;
*/

/*!
    \fn Kind QDesignerMetaPropertyInterface::kind() const

     Returns the type of the property.
*/

/*!
    \fn AccessFlags QDesignerMetaPropertyInterface::accessFlags() const

     Returns a combination of access flags.
*/

/*!
    \fn Attributes QDesignerMetaPropertyInterface::attributes(const QObject *object) const

     Returns the attributes of the property for the gives \a object.
*/

/*!
    \fn QVariant::Type QDesignerMetaPropertyInterface::type() const

    Returns the type of the property.
*/

/*!
    \fn QString QDesignerMetaPropertyInterface::name() const

    Returns the name of the property.
*/

/*!
    \fn QString QDesignerMetaPropertyInterface::typeName() const

    Returns the name of this property's type.
*/


/*!
    \fn int QDesignerMetaPropertyInterface::userType() const

    Returns this property's user type.
*/

/*!
    \fn bool QDesignerMetaPropertyInterface::hasSetter() const

    Returns whether getter and setter methods exist for this property.
*/

/*!
    \fn QVariant QDesignerMetaPropertyInterface::read(const QObject *object) const

    Reads the property's value from the given \a object. Returns the value if it was able to read it; otherwise returns an invalid variant.
*/

/*!
    \fn bool QDesignerMetaPropertyInterface::reset(QObject *object) const

    Resets the property for the given \a object with a reset method. Returns true if the reset worked; otherwise returns false.
*/

/*!
    \fn bool QDesignerMetaPropertyInterface::write(QObject *object, const QVariant &value) const

    Writes \a value as the property's value to the given \a object. Returns true if the write succeeded; otherwise returns false.
*/

/*!
    \class QDesignerMetaMethodInterface
    \internal
    \since 4.4

    \brief QDesignerMetaMethodInterface is part of \QD's introspection interface and represents a member function.

    \inmodule QtDesigner

    The QDesignerMetaMethodInterface class provides meta-data about a member function.

    \sa QDesignerMetaObjectInterface
*/

/*!
    Constructs a QDesignerMetaMethodInterface object.
*/

QDesignerMetaMethodInterface::QDesignerMetaMethodInterface()
{
}

/*!
    Destroys the QDesignerMetaMethodInterface object.
*/

QDesignerMetaMethodInterface::~QDesignerMetaMethodInterface()
{
}

/*!
    \enum QDesignerMetaMethodInterface::MethodType

    This enum specifies the type of the method

    \value Method  The function is a plain member function.
    \value Signal  The function is a signal.
    \value Slot    The function is a slot.
    \value Constructor The function is a constructor.

*/

/*!
    \enum QDesignerMetaMethodInterface::Access

    This enum represents the access specification of the method

    \value Private   A private member function
    \value Protected A protected member function
    \value Public    A public member function
*/

/*!
    \fn  QDesignerMetaMethodInterface::Access  QDesignerMetaMethodInterface::access() const

     Returns the access specification of this method.
*/


/*!
    \fn  QDesignerMetaMethodInterface::MethodType  QDesignerMetaMethodInterface::methodType() const

    Returns the type of this method.
*/

/*!
    \fn QStringList QDesignerMetaMethodInterface::parameterNames() const

    Returns a list of parameter names.
*/

/*!
    \fn QStringList QDesignerMetaMethodInterface::parameterTypes() const

    Returns a list of parameter types.
*/

/*!
    \fn QString QDesignerMetaMethodInterface::signature() const

    Returns the signature of this method.
*/

/*!
    \fn QString QDesignerMetaMethodInterface::normalizedSignature() const

     Returns the normalized signature of this method (suitable as signal/slot specification).
*/


/*!
    \fn QString QDesignerMetaMethodInterface::tag() const

    Returns the tag associated with this method.
*/

/*!
    \fn QString QDesignerMetaMethodInterface::typeName() const

    Returns the return type of this method, or an empty string if the return type is void.
*/

/*!
    \class QDesignerMetaObjectInterface
    \internal
    \since 4.4

    \brief QDesignerMetaObjectInterface is part of \QD's introspection interface and provides meta-information about Qt objects

    \inmodule QtDesigner

    The QDesignerMetaObjectInterface class provides meta-data about Qt objects. For a given object, it can be obtained
    by querying QDesignerIntrospectionInterface.

    \sa QDesignerIntrospectionInterface
*/

/*!
    Constructs a QDesignerMetaObjectInterface object.
*/

QDesignerMetaObjectInterface::QDesignerMetaObjectInterface()
{
}

/*!
    Destroys the QDesignerMetaObjectInterface object.
*/

QDesignerMetaObjectInterface::~QDesignerMetaObjectInterface()
{
}

/*!
    \fn QString QDesignerMetaObjectInterface::className() const

    Returns the class name.
*/

/*!
    \fn const QDesignerMetaEnumInterface *QDesignerMetaObjectInterface::enumerator(int index) const

    Returns the meta-data for the enumerator with the given \a index.
*/

/*!
    \fn int QDesignerMetaObjectInterface::enumeratorCount() const

    Returns the number of enumerators in this class.
*/

/*!
    \fn int QDesignerMetaObjectInterface::enumeratorOffset() const

    Returns the enumerator offset for this class; i.e. the index position of this class's first enumerator.
*/

/*!
    \fn int QDesignerMetaObjectInterface::indexOfEnumerator(const QString &name) const

    Finds enumerator \a name and returns its index; otherwise returns -1.
*/

/*!
    \fn int QDesignerMetaObjectInterface::indexOfMethod(const QString &method) const

    Finds \a method and returns its index; otherwise returns -1.
*/

/*!
    \fn int QDesignerMetaObjectInterface::indexOfProperty(const QString &name) const

    Finds property \a name and returns its index; otherwise returns -1.
*/

/*!
    \fn int QDesignerMetaObjectInterface::indexOfSignal(const QString &signal) const

    Finds \a signal and returns its index; otherwise returns -1.
*/

/*!
    \fn int QDesignerMetaObjectInterface::indexOfSlot(const QString &slot) const

    Finds \a slot and returns its index; otherwise returns -1.
*/

/*!
    \fn const QDesignerMetaMethodInterface *QDesignerMetaObjectInterface::method(int index) const

    Returns the meta-data for the method with the given \a index.
*/

/*!
    \fn int QDesignerMetaObjectInterface::methodCount() const

    Returns the number of methods in this class. These include ordinary methods, signals, and slots.
*/

/*!
    \fn int QDesignerMetaObjectInterface::methodOffset() const

    Returns the method offset for this class; i.e. the index position of this class's first member function.
*/

/*!
    \fn const  QDesignerMetaPropertyInterface *QDesignerMetaObjectInterface::property(int index) const

    Returns the meta-data for the property with the given \a index.
*/
/*!
    \fn int QDesignerMetaObjectInterface::propertyCount() const

    Returns the number of properties in this class.
*/
/*!
    \fn int QDesignerMetaObjectInterface::propertyOffset() const

    Returns the property offset for this class; i.e. the index position of this class's first property.
*/

/*!
    \fn const QDesignerMetaObjectInterface *QDesignerMetaObjectInterface::superClass() const

    Returns the meta-object of the superclass, or 0 if there is no such object.
*/

/*!
    \fn const QDesignerMetaPropertyInterface *QDesignerMetaObjectInterface::userProperty() const

    Returns the property that has the USER flag set to true.
*/

/*!
    \class QDesignerIntrospectionInterface
    \internal
    \since 4.4

    \brief QDesignerIntrospectionInterface provides access to a QDesignerMetaObjectInterface for a given Qt object.

    \inmodule QtDesigner

    QDesignerIntrospectionInterface is the main class of \QD's introspection interface. These
    interfaces provide a layer of abstraction around QMetaObject and related classes to allow for the integration
    of other programming languages.

    An instance of QDesignerIntrospectionInterface can be obtained from the core.

    \sa QDesignerMetaObjectInterface
*/

/*!
    Constructs a QDesignerIntrospectionInterface object.
*/

QDesignerIntrospectionInterface::QDesignerIntrospectionInterface()
{
}

/*!
    Destroys the QDesignerIntrospectionInterface object.
*/

QDesignerIntrospectionInterface::~QDesignerIntrospectionInterface()
{
}

/*!
   \fn const QDesignerMetaObjectInterface* QDesignerIntrospectionInterface::metaObject(const QObject *object) const

   Returns the meta object of this \a object.
*/

QT_END_NAMESPACE
