diff --git a/CMakeLists.txt b/CMakeLists.txt index 55174e3f9..ca746f805 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -157,6 +157,7 @@ if (KDEPIM_BUILD_DESKTOP) job/removeduplicatemailjob.cpp job/createfollowupreminderonexistingmessagejob.cpp job/manageserversidesubscriptionjob.cpp + job/manageserversidesubscriptionjob.cpp ) set(kmailprivate_widgets_LIB_SRCS @@ -188,6 +189,7 @@ if (KDEPIM_BUILD_DESKTOP) messageactions.cpp foldershortcutactionmanager.cpp kmconfigureagent.cpp + manageshowcollectionproperties.cpp ${kmailprivate_attributes_LIB_SRCS} ${kmailprivate_tag_LIB_SRCS} ${kmailprivate_job_LIB_SRCS} diff --git a/job/manageserversidesubscriptionjob.h b/job/manageserversidesubscriptionjob.h index 2cb779522..760a18651 100644 --- a/job/manageserversidesubscriptionjob.h +++ b/job/manageserversidesubscriptionjob.h @@ -22,7 +22,6 @@ #include #include class QDBusPendingCallWatcher; - class ManageServerSideSubscriptionJob : public QObject { Q_OBJECT diff --git a/kmmainwidget.cpp b/kmmainwidget.cpp index 2cfe14337..ebf0ab7d2 100644 --- a/kmmainwidget.cpp +++ b/kmmainwidget.cpp @@ -41,6 +41,7 @@ #include "tag/tagactionmanager.h" #include "foldershortcutactionmanager.h" #include "widgets/collectionpane.h" +#include "manageshowcollectionproperties.h" #if !defined(NDEBUG) #include using KSieveUi::SieveDebugDialog; @@ -228,7 +229,8 @@ KMMainWidget::KMMainWidget(QWidget *parent, KXMLGUIClient *aGUIClient, mGoToFirstUnreadMessageInSelectedFolder(false), mDisplayMessageFormatMenu(0), mFolderDisplayFormatPreference(MessageViewer::Viewer::UseGlobalSetting), - mSearchMessages(0) + mSearchMessages(0), + mManageShowCollectionProperties(new ManageShowCollectionProperties(this, this)) { mConfigAgent = new KMConfigureAgent(this, this); // must be the first line of the constructor: @@ -1121,7 +1123,7 @@ void KMMainWidget::createWidgets() } mAkonadiStandardActionManager->interceptAction(Akonadi::StandardActionManager::CollectionProperties); - connect(mAkonadiStandardActionManager->action(Akonadi::StandardActionManager::CollectionProperties), SIGNAL(triggered(bool)), this, SLOT(slotCollectionProperties())); + connect(mAkonadiStandardActionManager->action(Akonadi::StandardActionManager::CollectionProperties), SIGNAL(triggered(bool)), mManageShowCollectionProperties, SLOT(slotCollectionProperties())); // // Create all kinds of actions @@ -1458,19 +1460,6 @@ void KMMainWidget::slotPostToML() slotCompose(); } -//----------------------------------------------------------------------------- -void KMMainWidget::slotFolderMailingListProperties() -{ - showCollectionProperties(QLatin1String("KMail::CollectionMailingListPage")); -} - -//----------------------------------------------------------------------------- -void KMMainWidget::slotShowFolderShortcutDialog() -{ - showCollectionProperties(QLatin1String("KMail::CollectionShortcutPage")); -} - -//----------------------------------------------------------------------------- void KMMainWidget::slotExpireFolder() { if (!mCurrentFolder) { @@ -3166,14 +3155,13 @@ void KMMainWidget::setupActions() mFolderMailingListPropertiesAction = new QAction(i18n("&Mailing List Management..."), this); actionCollection()->addAction(QLatin1String("folder_mailinglist_properties"), mFolderMailingListPropertiesAction); - connect(mFolderMailingListPropertiesAction, &QAction::triggered, this, &KMMainWidget::slotFolderMailingListProperties); + connect(mFolderMailingListPropertiesAction, &QAction::triggered, mManageShowCollectionProperties, &ManageShowCollectionProperties::slotFolderMailingListProperties); // mFolderMailingListPropertiesAction->setIcon(QIcon::fromTheme("document-properties-mailing-list")); mShowFolderShortcutDialogAction = new QAction(QIcon::fromTheme(QLatin1String("configure-shortcuts")), i18n("&Assign Shortcut..."), this); actionCollection()->addAction(QLatin1String("folder_shortcut_command"), mShowFolderShortcutDialogAction); - connect(mShowFolderShortcutDialogAction, SIGNAL(triggered(bool)), + connect(mShowFolderShortcutDialogAction, SIGNAL(triggered(bool)), mManageShowCollectionProperties, SLOT(slotShowFolderShortcutDialog())); - // FIXME: this action is not currently enabled in the rc file, but even if // it were there is inconsistency between the action name and action. // "Expiration Settings" implies that this will lead to a settings dialogue @@ -3188,7 +3176,7 @@ void KMMainWidget::setupActions() // slotExpireFolder() and FolderViewItem::slotShowExpiryProperties(). mExpireFolderAction = new QAction(i18n("&Expiration Settings"), this); actionCollection()->addAction(QLatin1String("expire"), mExpireFolderAction); - connect(mExpireFolderAction, &QAction::triggered, this, &KMMainWidget::slotExpireFolder); + connect(mExpireFolderAction, SIGNAL(triggered(bool)), mManageShowCollectionProperties, SLOT(slotExpireFolder())); mAkonadiStandardActionManager->interceptAction(Akonadi::StandardMailActionManager::MoveToTrash); connect(mAkonadiStandardActionManager->action(Akonadi::StandardMailActionManager::MoveToTrash), SIGNAL(triggered(bool)), this, SLOT(slotTrashSelectedMessages())); @@ -3506,7 +3494,7 @@ void KMMainWidget::setupActions() { mExpireConfigAction = new QAction(i18n("Expire..."), this); actionCollection()->addAction(QLatin1String("expire_settings"), mExpireConfigAction); - connect(mExpireConfigAction, &QAction::triggered, this, &KMMainWidget::slotShowExpiryProperties); + connect(mExpireConfigAction, SIGNAL(triggered(bool)), this, SLOT(slotShowExpiryProperties())); } { @@ -3713,11 +3701,6 @@ void KMMainWidget::slotEditNotifications() notifyDlg.exec(); } -void KMMainWidget::slotShowExpiryProperties() -{ - showCollectionProperties(QLatin1String("MailCommon::CollectionExpiryPage")); -} - //----------------------------------------------------------------------------- void KMMainWidget::slotReadOn() { @@ -4572,141 +4555,6 @@ QAction *KMMainWidget::akonadiStandardAction(Akonadi::StandardMailActionManager: return mAkonadiStandardActionManager->action(type); } -void KMMainWidget::slotCollectionProperties() -{ - showCollectionProperties(QString()); -} - -void KMMainWidget::showCollectionProperties(const QString &pageToShow) -{ - if (!mCurrentFolder) { - return; - } - - if (Solid::Networking::status() == Solid::Networking::Unconnected) { - KMessageBox::information( - this, - i18n("Network is unconnected. Folder information cannot be updated.")); - showCollectionPropertiesContinued(pageToShow, QPointer()); - } else { - const Akonadi::AgentInstance agentInstance = Akonadi::AgentManager::self()->instance(mCurrentFolder->collection().resource()); - bool isOnline = agentInstance.isOnline(); - if (!isOnline) { - showCollectionPropertiesContinued(pageToShow, QPointer()); - } else { - QPointer progressItem(KPIM::ProgressManager::createProgressItem(i18n("Retrieving folder properties"))); - progressItem->setUsesBusyIndicator(true); - progressItem->setCryptoStatus(KPIM::ProgressItem::Unknown); - - Akonadi::CollectionAttributesSynchronizationJob *sync - = new Akonadi::CollectionAttributesSynchronizationJob(mCurrentFolder->collection()); - sync->setProperty("collectionId", mCurrentFolder->collection().id()); - sync->setProperty("pageToShow", pageToShow); // note for dialog later - sync->setProperty("progressItem", QVariant::fromValue(progressItem)); - connect(sync, SIGNAL(result(KJob*)), - this, SLOT(slotCollectionPropertiesContinued(KJob*))); - connect(progressItem, SIGNAL(progressItemCanceled(KPIM::ProgressItem*)), - sync, SLOT(kill())); - connect(progressItem, SIGNAL(progressItemCanceled(KPIM::ProgressItem*)), - KPIM::ProgressManager::instance(), SLOT(slotStandardCancelHandler(KPIM::ProgressItem*))); - sync->start(); - } - } -} - -void KMMainWidget::slotCollectionPropertiesContinued(KJob *job) -{ - QString pageToShow; - QPointer progressItem; - - if (job) { - Akonadi::CollectionAttributesSynchronizationJob *sync - = dynamic_cast(job); - Q_ASSERT(sync); - if (sync->property("collectionId") != mCurrentFolder->collection().id()) { - return; - } - pageToShow = sync->property("pageToShow").toString(); - progressItem = sync->property("progressItem").value< QPointer >(); - if (progressItem) { - disconnect(progressItem, SIGNAL(progressItemCanceled(KPIM::ProgressItem*)), - sync, SLOT(kill())); - } else { - // progressItem does not exist anymore, operation has been canceled - return; - } - } - - showCollectionPropertiesContinued(pageToShow, progressItem); -} - -void KMMainWidget::showCollectionPropertiesContinued(const QString &pageToShow, QPointer progressItem) -{ - if (!progressItem) { - progressItem = KPIM::ProgressManager::createProgressItem(i18n("Retrieving folder properties")); - progressItem->setUsesBusyIndicator(true); - progressItem->setCryptoStatus(KPIM::ProgressItem::Unknown); - connect(progressItem, SIGNAL(progressItemCanceled(KPIM::ProgressItem*)), - KPIM::ProgressManager::instance(), SLOT(slotStandardCancelHandler(KPIM::ProgressItem*))); - } - - Akonadi::CollectionFetchJob *fetch = new Akonadi::CollectionFetchJob(mCurrentFolder->collection(), - Akonadi::CollectionFetchJob::Base); - connect(progressItem, SIGNAL(progressItemCanceled(KPIM::ProgressItem*)), fetch, SLOT(kill())); - fetch->fetchScope().setIncludeStatistics(true); - fetch->setProperty("pageToShow", pageToShow); - fetch->setProperty("progressItem", QVariant::fromValue(progressItem)); - connect(fetch, SIGNAL(result(KJob*)), - this, SLOT(slotCollectionPropertiesFinished(KJob*))); - connect(progressItem, SIGNAL(progressItemCanceled(KPIM::ProgressItem*)), - fetch, SLOT(kill())); -} - -void KMMainWidget::slotCollectionPropertiesFinished(KJob *job) -{ - if (!job) { - return; - } - - QPointer progressItem = job->property("progressItem").value< QPointer >(); - // progressItem does not exist anymore, operation has been canceled - if (!progressItem) { - return; - } - - progressItem->setComplete(); - progressItem->setStatus(i18n("Done")); - - Akonadi::CollectionFetchJob *fetch = dynamic_cast(job); - Q_ASSERT(fetch); - if (fetch->collections().isEmpty()) { - qWarning() << "no collection"; - return; - } - - const Akonadi::Collection collection = fetch->collections().first(); - - const QStringList pages = QStringList() << QLatin1String("MailCommon::CollectionGeneralPage") - << QLatin1String("KMail::CollectionViewPage") - << QLatin1String("Akonadi::CachePolicyPage") - << QLatin1String("KMail::CollectionTemplatesPage") - << QLatin1String("MailCommon::CollectionExpiryPage") - << QLatin1String("PimCommon::CollectionAclPage") - << QLatin1String("KMail::CollectionMailingListPage") - << QLatin1String("KMail::CollectionQuotaPage") - << QLatin1String("KMail::CollectionShortcutPage") - << QLatin1String("KMail::CollectionMaintenancePage"); - - Akonadi::CollectionPropertiesDialog *dlg = new Akonadi::CollectionPropertiesDialog(collection, pages, this); - dlg->setWindowTitle(i18nc("@title:window", "Properties of Folder %1", collection.name())); - - const QString pageToShow = fetch->property("pageToShow").toString(); - if (!pageToShow.isEmpty()) { // show a specific page - dlg->setCurrentPage(pageToShow); - } - dlg->show(); -} - void KMMainWidget::slotRemoveDuplicates() { RemoveDuplicateMailJob *job = new RemoveDuplicateMailJob(mFolderTreeWidget->folderTreeView()->selectionModel(), this, this); diff --git a/kmmainwidget.h b/kmmainwidget.h index a2cfa53f6..38d467e26 100644 --- a/kmmainwidget.h +++ b/kmmainwidget.h @@ -61,7 +61,7 @@ class CollectionPane; class KMCommand; class KMMoveCommand; class KRecentFilesAction; -class QDBusPendingCallWatcher; +class ManageShowCollectionProperties; template class QMap; namespace KIO @@ -295,7 +295,6 @@ public slots: void slotStartCheckMail(); void slotEndCheckMail(); - void slotCollectionProperties(); void slotRemoveDuplicates(); void slotSelectCollectionFolder(const Akonadi::Collection &col); @@ -341,8 +340,6 @@ protected slots: void slotImport(); void slotCompose(); void slotPostToML(); - void slotFolderMailingListProperties(); - void slotShowFolderShortcutDialog(); void slotExpireFolder(); void slotExpireAll(); void slotArchiveFolder(); @@ -457,7 +454,6 @@ protected slots: void showResourceOfflinePage(); void updateVacationScriptStatus(bool active , const QString &serverName = QString()); - void slotShowExpiryProperties(); void slotItemAdded(const Akonadi::Item &, const Akonadi::Collection &col); void slotItemRemoved(const Akonadi::Item &); void slotItemMoved(const Akonadi::Item &item, const Akonadi::Collection &from, const Akonadi::Collection &to); @@ -536,8 +532,6 @@ private: void showMessagePopup(const Akonadi::Item &msg , const KUrl &aUrl, const KUrl &imageUrl, const QPoint &aPoint, bool contactAlreadyExists, bool uniqueContactFound); - void showCollectionProperties(const QString &pageToShow); - void showCollectionPropertiesContinued(const QString &pageToShow, QPointer progressItem); private slots: void slotMoveMessageToTrash(); @@ -563,8 +557,6 @@ private slots: void itemsReceived(const Akonadi::Item::List &list); void itemsFetchDone(KJob *job); - void slotCollectionPropertiesContinued(KJob *job); - void slotCollectionPropertiesFinished(KJob *job); void slotDeletionCollectionResult(KJob *job); void slotServerSideSubscription(); void slotFetchItemsForFolderDone(KJob *job); @@ -666,6 +658,7 @@ private: MessageViewer::Viewer::DisplayFormatMessage mFolderDisplayFormatPreference; QAction *mSearchMessages; KMConfigureAgent *mConfigAgent; + ManageShowCollectionProperties *mManageShowCollectionProperties; }; #endif diff --git a/manageshowcollectionproperties.cpp b/manageshowcollectionproperties.cpp new file mode 100644 index 000000000..b1163e731 --- /dev/null +++ b/manageshowcollectionproperties.cpp @@ -0,0 +1,197 @@ +/* + Copyright (c) 2014 Montel Laurent + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License, version 2, as + published by the Free Software Foundation. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "manageshowcollectionproperties.h" +#include "kmmainwidget.h" +#include +#include +#include +#include + + +#include +#include +#include +#include +#include + +Q_DECLARE_METATYPE(KPIM::ProgressItem*) +Q_DECLARE_METATYPE(Akonadi::Job*) +Q_DECLARE_METATYPE(QPointer) + +ManageShowCollectionProperties::ManageShowCollectionProperties(KMMainWidget *mainWidget, QObject *parent) + : QObject(parent), + mMainWidget(mainWidget) +{ + +} + +ManageShowCollectionProperties::~ManageShowCollectionProperties() +{ + +} + +void ManageShowCollectionProperties::slotCollectionProperties() +{ + showCollectionProperties( QString() ); +} + +void ManageShowCollectionProperties::slotShowExpiryProperties() +{ + showCollectionProperties( QLatin1String( "MailCommon::CollectionExpiryPage" ) ); +} + +void ManageShowCollectionProperties::slotFolderMailingListProperties() +{ + showCollectionProperties( QLatin1String( "KMail::CollectionMailingListPage" ) ); +} + +void ManageShowCollectionProperties::slotShowFolderShortcutDialog() +{ + showCollectionProperties( QLatin1String( "KMail::CollectionShortcutPage" ) ); +} + + +void ManageShowCollectionProperties::showCollectionProperties( const QString &pageToShow ) +{ + if ( !mMainWidget->currentFolder() ) + return; + + if ( Solid::Networking::status() == Solid::Networking::Unconnected ) { + + KMessageBox::information( + mMainWidget, + i18n( "Network is unconnected. Folder information cannot be updated." ) ); + showCollectionPropertiesContinued( pageToShow, QPointer() ); + } else { + const Akonadi::AgentInstance agentInstance = Akonadi::AgentManager::self()->instance( mMainWidget->currentFolder()->collection().resource() ); + bool isOnline = agentInstance.isOnline(); + if (!isOnline) { + showCollectionPropertiesContinued( pageToShow, QPointer() ); + } else { + QPointer progressItem( KPIM::ProgressManager::createProgressItem( i18n( "Retrieving folder properties" ) ) ); + progressItem->setUsesBusyIndicator( true ); + progressItem->setCryptoStatus(KPIM::ProgressItem::Unknown); + + Akonadi::CollectionAttributesSynchronizationJob *sync + = new Akonadi::CollectionAttributesSynchronizationJob( mMainWidget->currentFolder()->collection() ); + sync->setProperty( "collectionId", mMainWidget->currentFolder()->collection().id() ); + sync->setProperty( "pageToShow", pageToShow ); // note for dialog later + sync->setProperty( "progressItem", QVariant::fromValue( progressItem ) ); + connect( sync, SIGNAL(result(KJob*)), + this, SLOT(slotCollectionPropertiesContinued(KJob*)) ); + connect( progressItem, SIGNAL(progressItemCanceled(KPIM::ProgressItem*)), + sync, SLOT(kill()) ); + connect( progressItem, SIGNAL(progressItemCanceled(KPIM::ProgressItem*)), + KPIM::ProgressManager::instance(), SLOT(slotStandardCancelHandler(KPIM::ProgressItem*)) ); + sync->start(); + } + } +} + +void ManageShowCollectionProperties::slotCollectionPropertiesContinued( KJob* job ) +{ + QString pageToShow; + QPointer progressItem; + + if ( job ) { + Akonadi::CollectionAttributesSynchronizationJob *sync + = dynamic_cast( job ); + Q_ASSERT( sync ); + if ( sync->property( "collectionId" ) != mMainWidget->currentFolder()->collection().id() ) + return; + pageToShow = sync->property( "pageToShow" ).toString(); + progressItem = sync->property( "progressItem" ).value< QPointer >(); + if ( progressItem ) { + disconnect( progressItem, SIGNAL(progressItemCanceled(KPIM::ProgressItem*)), + sync, SLOT(kill()) ); + } else { + // progressItem does not exist anymore, operation has been canceled + return; + } + } + + showCollectionPropertiesContinued( pageToShow, progressItem ); +} + +void ManageShowCollectionProperties::showCollectionPropertiesContinued( const QString &pageToShow, QPointer progressItem ) +{ + if ( !progressItem ) { + progressItem = KPIM::ProgressManager::createProgressItem( i18n( "Retrieving folder properties" ) ); + progressItem->setUsesBusyIndicator( true ); + progressItem->setCryptoStatus(KPIM::ProgressItem::Unknown); + connect( progressItem, SIGNAL(progressItemCanceled(KPIM::ProgressItem*)), + KPIM::ProgressManager::instance(), SLOT(slotStandardCancelHandler(KPIM::ProgressItem*)) ); + } + + Akonadi::CollectionFetchJob *fetch = new Akonadi::CollectionFetchJob( mMainWidget->currentFolder()->collection(), + Akonadi::CollectionFetchJob::Base ); + connect( progressItem, SIGNAL(progressItemCanceled(KPIM::ProgressItem*)), fetch, SLOT(kill()) ); + fetch->fetchScope().setIncludeStatistics( true ); + fetch->setProperty( "pageToShow", pageToShow ); + fetch->setProperty( "progressItem", QVariant::fromValue( progressItem ) ); + connect( fetch, SIGNAL(result(KJob*)), + this, SLOT(slotCollectionPropertiesFinished(KJob*)) ); + connect( progressItem, SIGNAL(progressItemCanceled(KPIM::ProgressItem*)), + fetch, SLOT(kill()) ); +} + +void ManageShowCollectionProperties::slotCollectionPropertiesFinished( KJob *job ) +{ + if ( !job ) + return; + + QPointer progressItem = job->property( "progressItem" ).value< QPointer >(); + // progressItem does not exist anymore, operation has been canceled + if ( !progressItem ) { + return; + } + + progressItem->setComplete(); + progressItem->setStatus( i18n( "Done" ) ); + + Akonadi::CollectionFetchJob *fetch = dynamic_cast( job ); + Q_ASSERT( fetch ); + if ( fetch->collections().isEmpty() ) + { + qWarning() << "no collection"; + return; + } + + const Akonadi::Collection collection = fetch->collections().first(); + + const QStringList pages = QStringList() << QLatin1String( "MailCommon::CollectionGeneralPage" ) + << QLatin1String( "KMail::CollectionViewPage" ) + << QLatin1String( "Akonadi::CachePolicyPage" ) + << QLatin1String( "KMail::CollectionTemplatesPage" ) + << QLatin1String( "MailCommon::CollectionExpiryPage" ) + << QLatin1String( "PimCommon::CollectionAclPage" ) + << QLatin1String( "KMail::CollectionMailingListPage" ) + << QLatin1String( "KMail::CollectionQuotaPage" ) + << QLatin1String( "KMail::CollectionShortcutPage" ) + << QLatin1String( "KMail::CollectionMaintenancePage" ); + + Akonadi::CollectionPropertiesDialog *dlg = new Akonadi::CollectionPropertiesDialog( collection, pages, mMainWidget ); + dlg->setWindowTitle( i18nc( "@title:window", "Properties of Folder %1", collection.name() ) ); + + + const QString pageToShow = fetch->property( "pageToShow" ).toString(); + if ( !pageToShow.isEmpty() ) { // show a specific page + dlg->setCurrentPage( pageToShow ); + } + dlg->show(); +} diff --git a/manageshowcollectionproperties.h b/manageshowcollectionproperties.h new file mode 100644 index 000000000..3f4132f06 --- /dev/null +++ b/manageshowcollectionproperties.h @@ -0,0 +1,53 @@ +/* + Copyright (c) 2014 Montel Laurent + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License, version 2, as + published by the Free Software Foundation. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef MANAGESHOWCOLLECTIONPROPERTIES_H +#define MANAGESHOWCOLLECTIONPROPERTIES_H + +#include +#include +#include + +#include +class KJob; +class KMMainWidget; +class ManageShowCollectionProperties : public QObject +{ + Q_OBJECT +public: + explicit ManageShowCollectionProperties(KMMainWidget *mainWidget, QObject *parent = 0); + ~ManageShowCollectionProperties(); + +public slots: + void slotFolderMailingListProperties(); + void slotShowFolderShortcutDialog(); + void slotShowExpiryProperties(); + void slotCollectionProperties(); + +private slots: + void slotCollectionPropertiesContinued(KJob *job); + void slotCollectionPropertiesFinished(KJob *job); + +private: + void showCollectionProperties(const QString &pageToShow); + void showCollectionPropertiesContinued(const QString &pageToShow, QPointer progressItem); + +private: + KMMainWidget *mMainWidget; +}; + +#endif // MANAGESHOWCOLLECTIONPROPERTIES_H