##// END OF EJS Templates
Fixed animation to work when adding a new series....
Fixed animation to work when adding a new series. Change-Id: I698e4143213e49d07ef69c802eed051912af7532 Reviewed-by: Mika Salmela <mika.salmela@digia.com>

File last commit:

r2432:53927f716a3d
r2478:5245fa8e4b16
Show More
qvalueaxis.cpp
427 lines | 10.6 KiB | text/x-c | CppLexer
Michal Klocek
Adds new API classes...
r1540 /****************************************************************************
**
Miikka Heikkinen
Fixed the copyright year 2012 -> 2013
r2432 ** Copyright (C) 2013 Digia Plc
Michal Klocek
Adds new API classes...
r1540 ** All rights reserved.
** For any questions to Digia, please use contact form at http://qt.digia.com
**
** This file is part of the Qt Commercial Charts Add-on.
**
** $QT_BEGIN_LICENSE$
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia.
**
** If you have questions regarding the use of this file, please use
** contact form at http://qt.digia.com
** $QT_END_LICENSE$
**
****************************************************************************/
Marek Rosa
renamed QValueAxis related files
r1805 #include "qvalueaxis.h"
#include "qvalueaxis_p.h"
#include "chartvalueaxisx_p.h"
#include "chartvalueaxisy_p.h"
Marek Rosa
Domains added
r2275 #include "abstractdomain_p.h"
Michal Klocek
Implements qbarcategoriesaxis logic...
r1725 #include "chartdataset_p.h"
Michal Klocek
Refactors internals...
r2273 #include "chartpresenter_p.h"
#include "charttheme_p.h"
Michal Klocek
Implements qbarcategoriesaxis logic...
r1725
Michal Klocek
Adds new API classes...
r1540
QTCOMMERCIALCHART_BEGIN_NAMESPACE
Marek Rosa
Some docs to QValuesAxis
r1547 /*!
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 \class QValueAxis
\brief The QValueAxis class is used for manipulating chart's axis.
Marek Rosa
Some docs to QValuesAxis
r1547 \mainclass
Marek Rosa
Docs update after classes renaming
r1812 ValueAxis can be setup to show axis line with tick marks, grid lines and shades.
Marek Rosa
QValueAxis docs: added usage snippet
r1881 Values of axis are drawn to position of ticks.
Example code on how to use QValueAxis.
\code
QChartView *chartView = new QChartView;
QLineSeries *series = new QLineSeries;
// ...
Marek Rosa
QDateTimeAxis: added snippet on how to use it
r1882 chartView->chart()->addSeries(series);
Marek Rosa
QValueAxis docs: added usage snippet
r1881 QValueAxis *axisX = new QValueAxis;
axisX->setRange(10, 20.5);
axisX->setTickCount(10);
axisX->setLabelFormat("%.2f");
Marek Rosa
Docs fixes for axes code snippets
r2108 chartView->chart()->setAxisX(axisX, series);
Marek Rosa
QValueAxis docs: added usage snippet
r1881 \endcode
Marek Rosa
Some docs to QValuesAxis
r1547 */
/*!
Marek Rosa
Docs update after classes renaming
r1812 \qmlclass ValueAxis QValueAxis
Tero Ahola
Fixed minor issues in QML axes documentation
r1869 \inherits AbstractAxis
Marek Rosa
Docs update after classes renaming
r1812 \brief The ValueAxis element is used for manipulating chart's axes
Marek Rosa
Some docs to QValuesAxis
r1547
sauimone
qml doc update
r1639 ValueAxis can be setup to show axis line with tick marks, grid lines and shades.
Values of axis are drawn to position of ticks
Marek Rosa
Some docs to QValuesAxis
r1547
To access Axes you can use ChartView API. For example:
\code
ChartView {
Marek Rosa
Docs update after classes renaming
r1812 ValueAxis {
sauimone
qml doc update
r1639 id: xAxis
min: 0
max: 10
}
// Add a few series...
Marek Rosa
Some docs to QValuesAxis
r1547 }
\endcode
*/
/*!
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 \property QValueAxis::min
Marek Rosa
Some docs to QValuesAxis
r1547 Defines the minimum value on the axis.
Marek Rosa
Updated min, max properties of values and datetime axes descriptions with information about maintaining the range validity
r1730 When setting this property the max is adjusted if necessary, to ensure that the range remains valid.
Marek Rosa
Some docs to QValuesAxis
r1547 */
/*!
Marek Rosa
Docs update after classes renaming
r1812 \qmlproperty real ValueAxis::min
Marek Rosa
Some docs to QValuesAxis
r1547 Defines the minimum value on the axis.
Marek Rosa
Updated min, max properties of values and datetime axes descriptions with information about maintaining the range validity
r1730 When setting this property the max is adjusted if necessary, to ensure that the range remains valid.
Marek Rosa
Some docs to QValuesAxis
r1547 */
/*!
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 \property QValueAxis::max
Marek Rosa
Some docs to QValuesAxis
r1547 Defines the maximum value on the axis.
Marek Rosa
Updated min, max properties of values and datetime axes descriptions with information about maintaining the range validity
r1730 When setting this property the min is adjusted if necessary, to ensure that the range remains valid.
Marek Rosa
Some docs to QValuesAxis
r1547 */
/*!
Marek Rosa
Docs update after classes renaming
r1812 \qmlproperty real ValueAxis::max
Marek Rosa
Some docs to QValuesAxis
r1547 Defines the maximum value on the axis.
Marek Rosa
Updated min, max properties of values and datetime axes descriptions with information about maintaining the range validity
r1730 When setting this property the min is adjusted if necessary, to ensure that the range remains valid.
Marek Rosa
Some docs to QValuesAxis
r1547 */
Michal Klocek
Adds proper docs for tickCount on valueaxis
r2308 /*!
\property QValueAxis::tickCount
Defines the number of ticks on the axis. This indicates how many grid lines are draw on the chart.
The default value is 5, and it can not be below 2.
*/
/*!
\qmlproperty real ValueAxis::tickCount
Defines the number of ticks on the axis. This indicates how many grid lines are draw on the chart.
The default value is 5, and it can not be below 2.
*/
Marek Rosa
Added docs for labelFormat in QValueAxis
r1855 /*!
\property QValueAxis::labelFormat
Marek Rosa
Few axes docs fixes
r2339 Defines the label format of the axis.
Marek Rosa
setLabelFormat bug fixed in QValueAxis
r2268 Supported specifiers are: d, i, o, x, X, f, F, e, E, g, G, c
See QString::sprintf() for additional details.
Marek Rosa
Added docs for labelFormat in QValueAxis
r1855 */
/*!
\qmlproperty real ValueAxis::labelFormat
Marek Rosa
Few axes docs fixes
r2339 Defines the label format of the axis.
Marek Rosa
setLabelFormat bug fixed in QValueAxis
r2268 Supported specifiers are: d, i, o, x, X, f, F, e, E, g, G, c
See QString::sprintf() for additional details.
Marek Rosa
Added docs for labelFormat in QValueAxis
r1855 */
Marek Rosa
Some docs to QValuesAxis
r1547 /*!
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 \fn void QValueAxis::minChanged(qreal min)
Marek Rosa
Some docs to QValuesAxis
r1547 Axis emits signal when \a min of axis has changed.
*/
sauimone
abstract axis qml documentation. bug fix to setArrowVisible
r1654 /*!
Marek Rosa
Docs update after classes renaming
r1812 \qmlsignal ValueAxis::onMinChanged(real min)
sauimone
abstract axis qml documentation. bug fix to setArrowVisible
r1654 Axis emits signal when \a min of axis has changed.
*/
Marek Rosa
Some docs to QValuesAxis
r1547
/*!
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 \fn void QValueAxis::maxChanged(qreal max)
Marek Rosa
Some docs to QValuesAxis
r1547 Axis emits signal when \a max of axis has changed.
*/
sauimone
abstract axis qml documentation. bug fix to setArrowVisible
r1654 /*!
Marek Rosa
Docs update after classes renaming
r1812 \qmlsignal ValueAxis::onMaxChanged(real max)
sauimone
abstract axis qml documentation. bug fix to setArrowVisible
r1654 Axis emits signal when \a max of axis has changed.
*/
Marek Rosa
Some docs to QValuesAxis
r1547
/*!
Michal Klocek
Adds proper docs for tickCount on valueaxis
r2308 \fn void QValueAxis::tickCountChanged(int tickCount)
Marek Rosa
Few axes docs fixes
r2339 Axis emits signal when \a tickCount number on axis have changed.
Marek Rosa
Some docs to QValuesAxis
r1547 */
sauimone
fixed documentation errors
r1575 /*!
Michal Klocek
Adds proper docs for tickCount on valueaxis
r2308 \qmlsignal ValueAxis::tickCountChanged(int tickCount)
Marek Rosa
Few axes docs fixes
r2339 Axis emits signal when \a tickCount number on axis have changed.
sauimone
fixed documentation errors
r1575 */
/*!
Michal Klocek
Adds proper docs for tickCount on valueaxis
r2308 \fn void QValueAxis::rangeChanged(qreal min, qreal max)
Axis emits signal when \a min or \a max of axis has changed.
sauimone
fixed documentation errors
r1575 */
Marek Rosa
Few axes docs fixes
r2339 /*!
\fn void QValueAxis::labelFormatChanged(const QString &format)
Axis emits signal when \a format of axis labels has changed.
*/
/*!
\qmlsignal ValueAxis::labelFormatChanged(const QString &format)
Axis emits signal when \a format of axis labels has changed.
*/
sauimone
fixed documentation errors
r1575 /*!
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 \property QValueAxis::niceNumbersEnabled
Michal Klocek
Add docs for nice number algorithm
r2325 \obsolete
Using this function can lead to unexpected behavior. Use applyNiceNumbers() instead.
sauimone
fixed documentation errors
r1575 */
/*!
Marek Rosa
Docs update after classes renaming
r1812 \qmlproperty bool ValueAxis::niceNumbersEnabled
Michal Klocek
Add docs for nice number algorithm
r2325 \obsolete
Using this function can lead to unexpected behavior. Use applyNiceNumbers() instead.
sauimone
fixed documentation errors
r1575 */
Marek Rosa
Axes docs update
r1636 /*!
Constructs an axis object which is a child of \a parent.
*/
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 QValueAxis::QValueAxis(QObject *parent) :
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 QAbstractAxis(*new QValueAxisPrivate(this), parent)
Michal Klocek
Adds new API classes...
r1540 {
}
Marek Rosa
Various docs fixes
r1638 /*!
\internal
*/
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 QValueAxis::QValueAxis(QValueAxisPrivate &d, QObject *parent)
: QAbstractAxis(d, parent)
Michal Klocek
Adds new API classes...
r1540 {
}
Marek Rosa
Various docs fixes
r1638 /*!
Destroys the object
*/
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 QValueAxis::~QValueAxis()
Michal Klocek
Adds new API classes...
r1540 {
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 Q_D(QValueAxis);
Michal Klocek
Refactors internals...
r2273 if (d->m_chart)
d->m_chart->removeAxis(this);
Michal Klocek
Adds new API classes...
r1540 }
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 void QValueAxis::setMin(qreal min)
Michal Klocek
Adds new API classes...
r1540 {
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 Q_D(QValueAxis);
Marek Rosa
Ranges on values, intervals and datatime axes cannot be set to be invalid
r1728 setRange(min, qMax(d->m_max, min));
Michal Klocek
Adds new API classes...
r1540 }
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 qreal QValueAxis::min() const
Michal Klocek
Adds new API classes...
r1540 {
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 Q_D(const QValueAxis);
Michal Klocek
Adds new API classes...
r1540 return d->m_min;
}
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 void QValueAxis::setMax(qreal max)
Michal Klocek
Adds new API classes...
r1540 {
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 Q_D(QValueAxis);
Marek Rosa
Ranges on values, intervals and datatime axes cannot be set to be invalid
r1728 setRange(qMin(d->m_min, max), max);
Michal Klocek
Adds new API classes...
r1540 }
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 qreal QValueAxis::max() const
Michal Klocek
Adds new API classes...
r1540 {
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 Q_D(const QValueAxis);
Michal Klocek
Adds new API classes...
r1540 return d->m_max;
}
/*!
Sets range from \a min to \a max on the axis.
Marek Rosa
Updated min, max properties of values and datetime axes descriptions with information about maintaining the range validity
r1730 If min is greater than max then this function returns without making any changes.
Michal Klocek
Adds new API classes...
r1540 */
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 void QValueAxis::setRange(qreal min, qreal max)
Michal Klocek
Adds new API classes...
r1540 {
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 Q_D(QValueAxis);
Michal Klocek
Refactors internals...
r2273 d->setRange(min,max);
Michal Klocek
Adds new API classes...
r1540 }
Marek Rosa
QValueAxis ticksCount to tickCount
r1807 void QValueAxis::setTickCount(int count)
Michal Klocek
Adds new API classes...
r1540 {
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 Q_D(QValueAxis);
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 if (d->m_tickCount != count && count >= 2) {
Michal Klocek
Refactors Domain and Axis...
r1698 d->m_tickCount = count;
Michal Klocek
Refactors internals...
r2273 emit tickCountChanged(count);
Michal Klocek
Adds new API classes...
r1540 }
}
Marek Rosa
QValueAxis ticksCount to tickCount
r1807 int QValueAxis::tickCount() const
Michal Klocek
Adds new API classes...
r1540 {
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 Q_D(const QValueAxis);
Michal Klocek
Refactors Domain and Axis...
r1698 return d->m_tickCount;
Michal Klocek
Adds new API classes...
r1540 }
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 void QValueAxis::setNiceNumbersEnabled(bool enable)
Michal Klocek
Adds new API classes...
r1540 {
Michal Klocek
Fix niceNumbers legacy support
r2314 Q_D(QValueAxis);
Michal Klocek
Add docs for nice number algorithm
r2325 qWarning()<<"This function is depreciated, it can lead to unexpected behavior.Use applyNiceNumbers(). ";
Michal Klocek
Fix niceNumbers legacy support
r2314 if(enable) {
QObject::connect(this,SIGNAL(rangeChanged(qreal,qreal)),this,SLOT(applyNiceNumbers()));
QObject::connect(this,SIGNAL(tickCountChanged(int)),this,SLOT(applyNiceNumbers()));
applyNiceNumbers();
}
else {
QObject::disconnect(this,SIGNAL(rangeChanged(qreal,qreal)),this,SLOT(applyNiceNumbers()));
QObject::disconnect(this,SIGNAL(tickCountChanged(int)),this,SLOT(applyNiceNumbers()));
}
Michal Klocek
bugfxi minor. wrong return value for niceNumberEnabled
r2315 d->m_niceNumbersEnabled=enable;
Michal Klocek
Adds new API classes...
r1540 }
Michal Klocek
Refactors internals...
r2273 bool QValueAxis::niceNumbersEnabled() const
Michal Klocek
Adds new API classes...
r1540 {
Michal Klocek
Fix niceNumbers legacy support
r2314 Q_D(const QValueAxis);
Michal Klocek
Refactors internals...
r2273 qWarning()<<"This function is depreciated.Use applyNiceNumbers().";
Michal Klocek
Fix niceNumbers legacy support
r2314 return d->m_niceNumbersEnabled;
Michal Klocek
Adds new API classes...
r1540 }
Marek Rosa
QValueAxis: added posibility to specify label format
r1854 void QValueAxis::setLabelFormat(const QString &format)
{
Q_D(QValueAxis);
d->m_format = format;
Marek Rosa
Added missing properties and NOTIFY's to logvalue and value axes
r2319 emit labelFormatChanged(format);
Marek Rosa
QValueAxis: added posibility to specify label format
r1854 }
QString QValueAxis::labelFormat() const
{
Q_D(const QValueAxis);
return d->m_format;
}
Marek Rosa
Few more axes docs updates
r1637 /*!
Returns the type of the axis
*/
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 QAbstractAxis::AxisType QValueAxis::type() const
Michal Klocek
Adds new API classes...
r1540 {
Marek Rosa
updated AxisType names
r1818 return AxisTypeValue;
Michal Klocek
Adds new API classes...
r1540 }
Michal Klocek
Add docs for nice number algorithm
r2325 /*!
This method modifies range and number of ticks on the axis to look "nice". Algorithm considers numbers that
can be expressed as form of 1*10^n, 2* 10^n or 5*10^n as a nice numbers. These numbers are used for spacing the ticks.
This method will modify the current range and number of ticks.
Marek Rosa
Few axes docs fixes
r2339 \sa setRange(), setTickCount()
Michal Klocek
Add docs for nice number algorithm
r2325 */
Michal Klocek
Refactors internals...
r2273 void QValueAxis::applyNiceNumbers()
{
Q_D(QValueAxis);
Michal Klocek
Fix niceNumbers legacy support
r2314 if(d->m_applying) return;
Michal Klocek
Refactors internals...
r2273 qreal min = d->m_min;
qreal max = d->m_max;
int ticks = d->m_tickCount;
Marek Rosa
Domains added
r2275 AbstractDomain::looseNiceNumbers(min,max,ticks);
Michal Klocek
Fix niceNumbers legacy support
r2314 d->m_applying=true;
Michal Klocek
Refactors internals...
r2273 d->setRange(min,max);
setTickCount(ticks);
Michal Klocek
Fix niceNumbers legacy support
r2314 d->m_applying=false;
Michal Klocek
Refactors internals...
r2273 }
Michal Klocek
Adds new API classes...
r1540 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Jani Honkonen
more coding style fixes for src-folder...
r2104 QValueAxisPrivate::QValueAxisPrivate(QValueAxis *q)
: QAbstractAxisPrivate(q),
m_min(0),
m_max(0),
m_tickCount(5),
Michal Klocek
Fix niceNumbers legacy support
r2314 m_format(QString::null),
m_applying(false),
m_niceNumbersEnabled(false)
Michal Klocek
Adds new API classes...
r1540 {
}
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 QValueAxisPrivate::~QValueAxisPrivate()
Michal Klocek
Adds new API classes...
r1540 {
}
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 void QValueAxisPrivate::setMin(const QVariant &min)
Michal Klocek
Refactors setMin setMax setRange to be pure viritual on private implementation
r1544 {
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 Q_Q(QValueAxis);
sauimone
QAbstractAxis: variants strike back.
r1578 bool ok;
qreal value = min.toReal(&ok);
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 if (ok)
q->setMin(value);
Michal Klocek
Refactors setMin setMax setRange to be pure viritual on private implementation
r1544 }
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 void QValueAxisPrivate::setMax(const QVariant &max)
Michal Klocek
Refactors setMin setMax setRange to be pure viritual on private implementation
r1544 {
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 Q_Q(QValueAxis);
sauimone
QAbstractAxis: variants strike back.
r1578 bool ok;
qreal value = max.toReal(&ok);
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 if (ok)
q->setMax(value);
Michal Klocek
Refactors setMin setMax setRange to be pure viritual on private implementation
r1544 }
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 void QValueAxisPrivate::setRange(const QVariant &min, const QVariant &max)
Michal Klocek
Refactors setMin setMax setRange to be pure viritual on private implementation
r1544 {
Marek Rosa
class QValuesAxis renamed to QValueAxis
r1804 Q_Q(QValueAxis);
sauimone
QAbstractAxis: variants strike back.
r1578 bool ok1;
bool ok2;
qreal value1 = min.toReal(&ok1);
qreal value2 = max.toReal(&ok2);
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 if (ok1 && ok2)
q->setRange(value1, value2);
Michal Klocek
Refactors setMin setMax setRange to be pure viritual on private implementation
r1544 }
Michal Klocek
Refactors internals...
r2273 void QValueAxisPrivate::setRange(qreal min, qreal max)
Michal Klocek
Refactors core to support mulitpile axis and domains...
r1556 {
Michal Klocek
Refactors internals...
r2273 Q_Q(QValueAxis);
bool changed = false;
Michal Klocek
Refactors core to support mulitpile axis and domains...
r1556
Michal Klocek
Refactors internals...
r2273 if (min > max)
return;
if (!qFuzzyCompare(m_min,min)) {
m_min = min;
changed = true;
emit q->minChanged(min);
}
if (!qFuzzyCompare(m_max,max)) {
m_max = max;
changed = true;
emit q->maxChanged(max);
Michal Klocek
Creates default initalization of axes
r1661 }
Michal Klocek
Refactors internals...
r2273 if (changed) {
emit rangeChanged(min,max);
Michal Klocek
Fix niceNumbers legacy support
r2314 emit q->rangeChanged(min, max);
Michal Klocek
Refactors internals...
r2273 }
}
Michal Klocek
Refactors Domain and Axis...
r1698
Michal Klocek
Refactors internals...
r2273 void QValueAxisPrivate::initializeGraphics(QGraphicsItem* parent)
Michal Klocek
Refactors Domain and Axis...
r1698 {
Michal Klocek
Refactors internals...
r2273 Q_Q(QValueAxis);
ChartAxis* axis(0);
if (orientation() == Qt::Vertical)
axis = new ChartValueAxisY(q,parent);
if (orientation() == Qt::Horizontal)
axis = new ChartValueAxisX(q,parent);
m_item.reset(axis);
QAbstractAxisPrivate::initializeGraphics(parent);
Michal Klocek
Refactors Domain and Axis...
r1698 }
Marek Rosa
Domains added
r2275 void QValueAxisPrivate::initializeDomain(AbstractDomain *domain)
Michal Klocek
Refactors Domain and Axis...
r1698 {
Michal Klocek
Refactors internals...
r2273 if (orientation() == Qt::Vertical) {
if(!qFuzzyIsNull(m_max - m_min)) {
domain->setRangeY(m_min, m_max);
}
else {
setRange(domain->minY(), domain->maxY());
}
}
if (orientation() == Qt::Horizontal) {
if(!qFuzzyIsNull(m_max - m_min)) {
domain->setRangeX(m_min, m_max);
}
else {
setRange(domain->minX(), domain->maxX());
}
Michal Klocek
Refactors Domain and Axis...
r1698 }
}
Marek Rosa
renamed QValueAxis related files
r1805 #include "moc_qvalueaxis.cpp"
#include "moc_qvalueaxis_p.cpp"
Michal Klocek
Adds new API classes...
r1540
QTCOMMERCIALCHART_END_NAMESPACE