123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252 |
- /****************************************************************************
- ** Copyright (c) 2006 - 2011, the LibQxt project.
- ** See the Qxt AUTHORS file for a list of authors and copyright holders.
- ** All rights reserved.
- **
- ** Redistribution and use in source and binary forms, with or without
- ** modification, are permitted provided that the following conditions are met:
- ** * Redistributions of source code must retain the above copyright
- ** notice, this list of conditions and the following disclaimer.
- ** * Redistributions in binary form must reproduce the above copyright
- ** notice, this list of conditions and the following disclaimer in the
- ** documentation and/or other materials provided with the distribution.
- ** * Neither the name of the LibQxt project nor the
- ** names of its contributors may be used to endorse or promote products
- ** derived from this software without specific prior written permission.
- **
- ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- ** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- ** DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
- ** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- ** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- ** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- ** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- ** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- **
- ** <http://libqxt.org> <foundation@libqxt.org>
- *****************************************************************************/
- #include "qxtglobal.h"
- /*!
- \headerfile <QxtGlobal>
- \title Global Qxt Declarations
- \inmodule QxtCore
- \brief The <QxtGlobal> header provides basic declarations and
- is included by all other Qxt headers.
- */
- /*!
- \macro QXT_VERSION
- \relates <QxtGlobal>
- This macro expands a numeric value of the form 0xMMNNPP (MM =
- major, NN = minor, PP = patch) that specifies Qxt's version
- number. For example, if you compile your application against Qxt
- 0.4.0, the QXT_VERSION macro will expand to 0x000400.
- You can use QXT_VERSION to use the latest Qt features where
- available. For example:
- \code
- #if QXT_VERSION >= 0x000400
- qxtTabWidget->setTabMovementMode(QxtTabWidget::InPlaceMovement);
- #endif
- \endcode
- \sa QXT_VERSION_STR, qxtVersion()
- */
- /*!
- \macro QXT_VERSION_STR
- \relates <QxtGlobal>
- This macro expands to a string that specifies Qxt's version number
- (for example, "0.4.0"). This is the version against which the
- application is compiled.
- \sa qxtVersion(), QXT_VERSION
- */
- /*!
- \relates <QxtGlobal>
- Returns the version number of Qxt at run-time as a string (for
- example, "0.4.0"). This may be a different version than the
- version the application was compiled against.
- \sa QXT_VERSION_STR
- */
- const char * qxtVersion()
- {
- return QXT_VERSION_STR;
- }
- /*!
- \headerfile <QxtPimpl>
- \title The Qxt private implementation
- \inmodule QxtCore
- \brief The <QxtPimpl> header provides tools for hiding
- details of a class.
- Application code generally doesn't have to be concerned about hiding its
- implementation details, but when writing library code it is important to
- maintain a constant interface, both source and binary. Maintaining a constant
- source interface is easy enough, but keeping the binary interface constant
- means moving implementation details into a private class. The PIMPL, or
- d-pointer, idiom is a common method of implementing this separation. QxtPimpl
- offers a convenient way to connect the public and private sides of your class.
- \section1 Getting Started
- Before you declare the public class, you need to make a forward declaration
- of the private class. The private class must have the same name as the public
- class, followed by the word Private. For example, a class named MyTest would
- declare the private class with:
- \code
- class MyTestPrivate;
- \endcode
- \section1 The Public Class
- Generally, you shouldn't keep any data members in the public class without a
- good reason. Functions that are part of the public interface should be declared
- in the public class, and functions that need to be available to subclasses (for
- calling or overriding) should be in the protected section of the public class.
- To connect the private class to the public class, include the
- QXT_DECLARE_PRIVATE macro in the private section of the public class. In the
- example above, the private class is connected as follows:
- \code
- private:
- QXT_DECLARE_PRIVATE(MyTest)
- \endcode
- Additionally, you must include the QXT_INIT_PRIVATE macro in the public class's
- constructor. Continuing with the MyTest example, your constructor might look
- like this:
- \code
- MyTest::MyTest() {
- // initialization
- QXT_INIT_PRIVATE(MyTest);
- }
- \endcode
- \section1 The Private Class
- As mentioned above, data members should usually be kept in the private class.
- This allows the memory layout of the private class to change without breaking
- binary compatibility for the public class. Functions that exist only as
- implementation details, or functions that need access to private data members,
- should be implemented here.
- To define the private class, inherit from the template QxtPrivate class, and
- include the QXT_DECLARE_PUBLIC macro in its public section. The template
- parameter should be the name of the public class. For example:
- \code
- class MyTestPrivate : public QxtPrivate<MyTest> {
- public:
- MyTestPrivate();
- QXT_DECLARE_PUBLIC(MyTest)
- };
- \endcode
- \section1 Accessing Private Members
- Use the qxt_d() function (actually a function-like object) from functions in
- the public class to access the private class. Similarly, functions in the
- private class can invoke functions in the public class by using the qxt_p()
- function (this one's actually a function).
- For example, assume that MyTest has methods named getFoobar and doBaz(),
- and MyTestPrivate has a member named foobar and a method named doQuux().
- The code might resemble this example:
- \code
- int MyTest::getFoobar() {
- return qxt_d().foobar;
- }
- void MyTestPrivate::doQuux() {
- qxt_p().doBaz(foobar);
- }
- \endcode
- */
- /*!
- * \macro QXT_DECLARE_PRIVATE(PUB)
- * \relates <QxtPimpl>
- * Declares that a public class has a related private class.
- *
- * This shuold be put in the private section of the public class. The
- * parameter \a PUB must be the name of the public class.
- */
- /*!
- * \macro QXT_DECLARE_PUBLIC(PUB)
- * \relates <QxtPimpl>
- * Declares that a private class has a related public class named \a PUB.
- *
- * This may be put anywhere in the declaration of the private class. The parameter is the name of the public class.
- */
- /*!
- * \macro QXT_INIT_PRIVATE(PUB)
- * \relates <QxtPimpl>
- * Initializes resources owned by the private class.
- *
- * This should be called from the public class's constructor,
- * before qxt_d() is used for the first time. The parameter \a PUB must be
- * the name of the public class.
- */
- /*!
- * \macro QXT_D(PUB)
- * \relates <QxtPimpl>
- * Returns a reference in the current scope named "d" to the private class
- * associated with the public class \a PUB.
- *
- * This function is only available in a class using QXT_DECLARE_PRIVATE().
- */
- /*!
- * \macro QXT_P(PUB)
- * \relates <QxtPimpl>
- * Creates a reference in the current scope named "q" to the public class
- * named \a PUB.
- *
- * This macro only works in a class using QXT_DECLARE_PUBLIC().
- */
- /*!
- * \fn QxtPrivate<PUB>& PUB::qxt_d()
- * \relates <QxtPimpl>
- * Returns a reference to the private class.
- *
- * This function is only available in a class using \a QXT_DECLARE_PRIVATE.
- */
- /*!
- * \fn const QxtPrivate<PUB>& PUB::qxt_d() const
- * \relates <QxtPimpl>
- * Returns a const reference to the private class.
- *
- * This function is only available in a class using \a QXT_DECLARE_PRIVATE.
- * This overload will be automatically used in const functions.
- */
- /*!
- * \fn PUB& QxtPrivate::qxt_p()
- * \relates <QxtPimpl>
- * Returns a reference to the public class.
- *
- * This function is only available in a class using QXT_DECLARE_PUBLIC().
- */
- /*!
- * \fn const PUB& QxtPrivate::qxt_p() const
- * \relates <QxtPimpl>
- * Returns a const reference to the public class.
- *
- * This function is only available in a class using QXT_DECLARE_PUBLIC().
- * This overload will be automatically used in const functions.
- */
|