00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <qmap.h>
00026 #include <qstylesheet.h>
00027
00028 #include <klocale.h>
00029 #include <kstaticdeleter.h>
00030
00031 #include <libkdepim/progressmanager.h>
00032
00033 #include "feedlist.h"
00034 #include "feed.h"
00035 #include "treenode.h"
00036
00037 #include "progressmanager.h"
00038
00039
00040
00041 namespace Akregator {
00042
00043 class ProgressManager::ProgressManagerPrivate
00044 {
00045 public:
00046 FeedList* feedList;
00047 QMap<Feed*, ProgressItemHandler*> handlers;
00048
00049 };
00050
00051 static KStaticDeleter<ProgressManager> progressmanagersd;
00052 ProgressManager* ProgressManager::m_self = 0;
00053
00054 ProgressManager* ProgressManager::self()
00055 {
00056 if (!m_self)
00057 m_self = progressmanagersd.setObject(m_self, new ProgressManager);
00058 return m_self;
00059 }
00060
00061 ProgressManager::ProgressManager() : d(new ProgressManagerPrivate)
00062 {
00063 d->feedList = 0;
00064 }
00065
00066 ProgressManager::~ProgressManager()
00067 {
00068 delete d;
00069 d = 0;
00070 }
00071
00072 void ProgressManager::setFeedList(FeedList* feedList)
00073 {
00074 if (feedList == d->feedList)
00075 return;
00076
00077 if (d->feedList != 0)
00078 {
00079 for (QMap<Feed*, ProgressItemHandler*>::ConstIterator it = d->handlers.begin(); it != d->handlers.end(); ++it)
00080 delete *it;
00081 d->handlers.clear();
00082
00083 disconnect(d->feedList, SIGNAL(signalNodeAdded(TreeNode*)), this, SLOT(slotNodeAdded(TreeNode*)));
00084 disconnect(d->feedList, SIGNAL(signalNodeRemoved(TreeNode*)), this, SLOT(slotNodeRemoved(TreeNode*)));
00085 }
00086
00087 d->feedList = feedList;
00088
00089 if (feedList != 0)
00090 {
00091 QValueList<TreeNode*> list = feedList->asFlatList();
00092
00093 for (QValueList<TreeNode*>::ConstIterator it = list.begin(); it != list.end(); ++it)
00094 slotNodeAdded(*it);
00095 connect(feedList, SIGNAL(signalNodeAdded(TreeNode*)), this, SLOT(slotNodeAdded(TreeNode*)));
00096 connect(feedList, SIGNAL(signalNodeRemoved(TreeNode*)), this, SLOT(slotNodeRemoved(TreeNode*)));
00097 }
00098 }
00099
00100 void ProgressManager::slotNodeAdded(TreeNode* node)
00101 {
00102 Feed* feed = dynamic_cast<Feed*>(node);
00103 if (feed)
00104 {
00105 if (!d->handlers.contains(feed))
00106 d->handlers[feed] = new ProgressItemHandler(feed);
00107 connect(feed, SIGNAL(signalDestroyed(TreeNode*)), this, SLOT(slotNodeDestroyed(TreeNode*)));
00108 }
00109 }
00110
00111 void ProgressManager::slotNodeRemoved(TreeNode* node)
00112 {
00113 Feed* feed = dynamic_cast<Feed*>(node);
00114 if (feed)
00115 {
00116 disconnect(feed, SIGNAL(signalDestroyed(TreeNode*)), this, SLOT(slotNodeDestroyed(TreeNode*)));
00117 delete d->handlers[feed];
00118 d->handlers.remove(feed);
00119 }
00120 }
00121
00122 void ProgressManager::slotNodeDestroyed(TreeNode* node)
00123 {
00124 Feed* feed = dynamic_cast<Feed*>(node);
00125 if (feed)
00126 {
00127 delete d->handlers[feed];
00128 d->handlers.remove(feed);
00129 }
00130 }
00131
00132 class ProgressItemHandler::ProgressItemHandlerPrivate
00133 {
00134 public:
00135
00136 Feed* feed;
00137 KPIM::ProgressItem* progressItem;
00138 };
00139
00140 ProgressItemHandler::ProgressItemHandler(Feed* feed) : d(new ProgressItemHandlerPrivate)
00141 {
00142 d->feed = feed;
00143 d->progressItem = 0;
00144
00145 connect(feed, SIGNAL(fetchStarted(Feed*)), this, SLOT(slotFetchStarted()));
00146 connect(feed, SIGNAL(fetched(Feed*)), this, SLOT(slotFetchCompleted()));
00147 connect(feed, SIGNAL(fetchError(Feed*)), this, SLOT(slotFetchError()));
00148 connect(feed, SIGNAL(fetchAborted(Feed*)), this, SLOT(slotFetchAborted()));
00149 }
00150
00151 ProgressItemHandler::~ProgressItemHandler()
00152 {
00153 if (d->progressItem)
00154 {
00155 d->progressItem->setComplete();
00156 d->progressItem = 0;
00157 }
00158
00159 delete d;
00160 d = 0;
00161 }
00162
00163 void ProgressItemHandler::slotFetchStarted()
00164 {
00165 if (d->progressItem)
00166 {
00167 d->progressItem->setComplete();
00168 d->progressItem = 0;
00169 }
00170
00171 d->progressItem = KPIM::ProgressManager::createProgressItem(KPIM::ProgressManager::getUniqueID(), QStyleSheet::escape( d->feed->title() ), QString::null, true);
00172
00173 connect(d->progressItem, SIGNAL(progressItemCanceled(KPIM::ProgressItem*)), d->feed, SLOT(slotAbortFetch()));
00174 }
00175
00176
00177 void ProgressItemHandler::slotFetchCompleted()
00178 {
00179 if (d->progressItem)
00180 {
00181 d->progressItem->setStatus(i18n("Fetch completed"));
00182 d->progressItem->setComplete();
00183 d->progressItem = 0;
00184 }
00185 }
00186
00187 void ProgressItemHandler::slotFetchError()
00188 {
00189 if (d->progressItem)
00190 {
00191 d->progressItem->setStatus(i18n("Fetch error"));
00192 d->progressItem->setComplete();
00193 d->progressItem = 0;
00194 }
00195 }
00196
00197 void ProgressItemHandler::slotFetchAborted()
00198 {
00199 if (d->progressItem)
00200 {
00201 d->progressItem->setStatus(i18n("Fetch aborted"));
00202 d->progressItem->setComplete();
00203 d->progressItem = 0;
00204 }
00205 }
00206
00207 }
00208
00209 #include "progressmanager.moc"