1 /*
2 * %kadu copyright begin%
3 * Copyright 2009, 2010, 2011 Piotr Galiszewski (piotr.galiszewski@kadu.im)
4 * Copyright 2010, 2012 Wojciech Treter (juzefwt@gmail.com)
5 * Copyright 2010, 2011, 2012 Piotr Dąbrowski (ultr@ultr.pl)
6 * Copyright 2010, 2011, 2012, 2013 Bartosz Brachaczek (b.brachaczek@gmail.com)
7 * Copyright 2009, 2010, 2011, 2012, 2013, 2014 Rafał Przemysław Malinowski (rafal.przemyslaw.malinowski@gmail.com)
8 * %kadu copyright end%
9 *
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License as
12 * published by the Free Software Foundation; either version 2 of
13 * the License, or (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program. If not, see <http://www.gnu.org/licenses/>.
22 */
23
24 #include "accounts/account-manager.h"
25 #include "accounts/account.h"
26 #include "icons/icons-manager.h"
27 #include "icons/kadu-icon.h"
28 #include "identities/identity-manager.h"
29 #include "protocols/protocol.h"
30 #include "status/all-accounts-status-container.h"
31 #include "status/status-configuration-holder.h"
32 #include "status/status-container-aware-object.h"
33 #include "status/status-type-manager.h"
34 #include "status/status-type.h"
35
36 #include "status-container-manager.h"
37
StatusContainerManager(QObject * parent)38 StatusContainerManager::StatusContainerManager(QObject *parent) :
39 StatusContainer(parent), DefaultStatusContainer(0)
40 {
41 }
42
~StatusContainerManager()43 StatusContainerManager::~StatusContainerManager()
44 {
45 }
46
setAccountManager(AccountManager * accountManager)47 void StatusContainerManager::setAccountManager(AccountManager *accountManager)
48 {
49 m_accountManager = accountManager;
50 }
51
setIdentityManager(IdentityManager * identityManager)52 void StatusContainerManager::setIdentityManager(IdentityManager *identityManager)
53 {
54 m_identityManager = identityManager;
55 }
56
setStatusConfigurationHolder(StatusConfigurationHolder * statusConfigurationHolder)57 void StatusContainerManager::setStatusConfigurationHolder(StatusConfigurationHolder *statusConfigurationHolder)
58 {
59 m_statusConfigurationHolder = statusConfigurationHolder;
60 }
61
setStatusTypeManager(StatusTypeManager * statusTypeManager)62 void StatusContainerManager::setStatusTypeManager(StatusTypeManager *statusTypeManager)
63 {
64 m_statusTypeManager = statusTypeManager;
65 }
66
init()67 void StatusContainerManager::init()
68 {
69 if (m_statusConfigurationHolder->isSetStatusPerIdentity())
70 triggerAllIdentitiesAdded(m_identityManager);
71 else if (m_statusConfigurationHolder->isSetStatusPerAccount())
72 triggerAllAccountsRegistered(m_accountManager);
73 else
74 registerStatusContainer(m_allAccountsStatusContainer);
75
76 connect(m_statusConfigurationHolder, SIGNAL(setStatusModeChanged()), this, SLOT(setStatusModeChanged()));
77 connect(m_accountManager, SIGNAL(accountUpdated(Account)), this, SLOT(updateIdentities()));
78 }
79
done()80 void StatusContainerManager::done()
81 {
82 if (m_statusConfigurationHolder)
83 {
84 if (m_statusConfigurationHolder->isSetStatusPerIdentity())
85 triggerAllIdentitiesRemoved(m_identityManager);
86 else if (m_statusConfigurationHolder->isSetStatusPerAccount())
87 triggerAllAccountsUnregistered(m_accountManager);
88 else
89 unregisterStatusContainer(m_allAccountsStatusContainer);
90 }
91 }
92
updateIdentities()93 void StatusContainerManager::updateIdentities()
94 {
95 if (!m_statusConfigurationHolder->isSetStatusPerIdentity())
96 return;
97
98 foreach (const Identity &identity, m_identityManager->items())
99 if (StatusContainers.contains(identity.statusContainer()) && !identity.hasAnyAccountWithDetails())
100 unregisterStatusContainer(identity.statusContainer());
101 else if (!StatusContainers.contains(identity.statusContainer()) && identity.hasAnyAccountWithDetails())
102 registerStatusContainer(identity.statusContainer());
103 }
104
accountRegistered(Account account)105 void StatusContainerManager::accountRegistered(Account account)
106 {
107 if (m_statusConfigurationHolder->isSetStatusPerAccount() && !StatusContainers.contains(account.statusContainer()))
108 registerStatusContainer(account.statusContainer());
109
110 if (m_statusConfigurationHolder->isSetStatusPerIdentity() && !StatusContainers.contains(account.accountIdentity().statusContainer()))
111 updateIdentities();
112 }
113
accountUnregistered(Account account)114 void StatusContainerManager::accountUnregistered(Account account)
115 {
116 if (m_statusConfigurationHolder->isSetStatusPerAccount() && StatusContainers.contains(account.statusContainer()))
117 unregisterStatusContainer(account.statusContainer());
118
119 if (m_statusConfigurationHolder->isSetStatusPerIdentity())
120 updateIdentities();
121 }
122
identityAdded(Identity identity)123 void StatusContainerManager::identityAdded(Identity identity)
124 {
125 if (m_statusConfigurationHolder->isSetStatusPerIdentity() && !StatusContainers.contains(identity.statusContainer()) && identity.hasAnyAccountWithDetails())
126 registerStatusContainer(identity.statusContainer());
127 }
128
identityRemoved(Identity identity)129 void StatusContainerManager::identityRemoved(Identity identity)
130 {
131 if (m_statusConfigurationHolder->isSetStatusPerIdentity() && StatusContainers.contains(identity.statusContainer()))
132 unregisterStatusContainer(identity.statusContainer());
133 }
134
cleanStatusContainers()135 void StatusContainerManager::cleanStatusContainers()
136 {
137 while (!StatusContainers.isEmpty())
138 unregisterStatusContainer(StatusContainers.at(0));
139 }
140
addAllAccounts()141 void StatusContainerManager::addAllAccounts()
142 {
143 foreach (Account account, m_accountManager->items())
144 registerStatusContainer(account.statusContainer());
145 }
146
addAllIdentities()147 void StatusContainerManager::addAllIdentities()
148 {
149 updateIdentities();
150 }
151
setAllAccountsStatusContainer(AllAccountsStatusContainer * allAccountsStatusContainer)152 void StatusContainerManager::setAllAccountsStatusContainer(AllAccountsStatusContainer *allAccountsStatusContainer)
153 {
154 m_allAccountsStatusContainer = allAccountsStatusContainer;
155 }
156
setDefaultStatusContainer(StatusContainer * defaultStatusContainer)157 void StatusContainerManager::setDefaultStatusContainer(StatusContainer *defaultStatusContainer)
158 {
159 if (defaultStatusContainer == DefaultStatusContainer)
160 return;
161
162 if (DefaultStatusContainer)
163 disconnect(DefaultStatusContainer, 0, this, 0);
164
165 if (this != defaultStatusContainer)
166 DefaultStatusContainer = defaultStatusContainer;
167 else
168 DefaultStatusContainer = 0;
169
170 if (DefaultStatusContainer)
171 connect(DefaultStatusContainer, SIGNAL(statusUpdated(StatusContainer *)), this, SIGNAL(statusUpdated(StatusContainer *)));
172
173 emit statusUpdated(this);
174 }
175
setStatusModeChanged()176 void StatusContainerManager::setStatusModeChanged()
177 {
178 cleanStatusContainers();
179 if (m_statusConfigurationHolder->isSetStatusPerIdentity())
180 addAllIdentities();
181 else if (m_statusConfigurationHolder->isSetStatusPerAccount())
182 addAllAccounts();
183 else
184 registerStatusContainer(m_allAccountsStatusContainer);
185 }
186
registerStatusContainer(StatusContainer * statusContainer)187 void StatusContainerManager::registerStatusContainer(StatusContainer *statusContainer)
188 {
189 if (StatusContainers.isEmpty())
190 setDefaultStatusContainer(statusContainer);
191
192 emit statusContainerAboutToBeRegistered(statusContainer);
193 StatusContainers.append(statusContainer);
194 emit statusContainerRegistered(statusContainer);
195 StatusContainerAwareObject::notifyStatusContainerRegistered(statusContainer);
196
197 connect(statusContainer, SIGNAL(statusUpdated(StatusContainer *)), this, SIGNAL(statusUpdated(StatusContainer *)));
198 }
199
unregisterStatusContainer(StatusContainer * statusContainer)200 void StatusContainerManager::unregisterStatusContainer(StatusContainer *statusContainer)
201 {
202 emit statusContainerAboutToBeUnregistered(statusContainer);
203 StatusContainers.removeAll(statusContainer);
204 emit statusContainerUnregistered(statusContainer);
205 StatusContainerAwareObject::notifyStatusContainerUnregistered(statusContainer);
206
207 if (statusContainer == DefaultStatusContainer)
208 {
209 if (StatusContainers.isEmpty())
210 setDefaultStatusContainer(0);
211 else
212 setDefaultStatusContainer(StatusContainers.at(0));
213 }
214
215 disconnect(statusContainer, 0, this, 0);
216 }
217
allStatusOfType(StatusType type)218 bool StatusContainerManager::allStatusOfType(StatusType type)
219 {
220 if (StatusType::None == type)
221 return false;
222
223 foreach (StatusContainer *container, StatusContainers)
224 if (container->status().type() != type)
225 return false;
226 return true;
227 }
228
statusContainerName()229 QString StatusContainerManager::statusContainerName()
230 {
231 return tr("All");
232 }
233
setStatus(Status status,StatusChangeSource source)234 void StatusContainerManager::setStatus(Status status, StatusChangeSource source)
235 {
236 foreach (StatusContainer *container, StatusContainers)
237 container->setStatus(status, source);
238 }
239
status()240 Status StatusContainerManager::status()
241 {
242 return DefaultStatusContainer
243 ? DefaultStatusContainer->status()
244 : Status();
245 }
246
isStatusSettingInProgress()247 bool StatusContainerManager::isStatusSettingInProgress()
248 {
249 return DefaultStatusContainer
250 ? DefaultStatusContainer->isStatusSettingInProgress()
251 : false;
252 }
253
statusIcon()254 KaduIcon StatusContainerManager::statusIcon()
255 {
256 return statusIcon(status());
257 }
258
statusIcon(const Status & status)259 KaduIcon StatusContainerManager::statusIcon(const Status &status)
260 {
261 if (!DefaultStatusContainer)
262 return m_statusTypeManager->statusIcon("common", Status{StatusType::Offline});
263
264 return m_statusTypeManager->statusIcon("common", status);
265 }
266
supportedStatusTypes()267 QList<StatusType> StatusContainerManager::supportedStatusTypes()
268 {
269 return DefaultStatusContainer
270 ? DefaultStatusContainer->supportedStatusTypes()
271 : QList<StatusType>();
272 }
273
maxDescriptionLength()274 int StatusContainerManager::maxDescriptionLength()
275 {
276 return DefaultStatusContainer
277 ? DefaultStatusContainer->maxDescriptionLength()
278 : -1;
279 }
280
statusNamePrefix()281 QString StatusContainerManager::statusNamePrefix()
282 {
283 return tr("All") + ' ';
284 }
285
loadStatus()286 Status StatusContainerManager::loadStatus()
287 {
288 return DefaultStatusContainer
289 ? DefaultStatusContainer->loadStatus()
290 : Status();
291 }
292
storeStatus(Status status)293 void StatusContainerManager::storeStatus(Status status)
294 {
295 foreach (StatusContainer *statusContainer, StatusContainers)
296 statusContainer->storeStatus(status);
297 }
298
subStatusContainers()299 QList<StatusContainer *> StatusContainerManager::subStatusContainers()
300 {
301 return StatusContainers;
302 }
303
statusContainerForAccount(Account account) const304 StatusContainer * StatusContainerManager::statusContainerForAccount(Account account) const
305 {
306 if (m_statusConfigurationHolder->isSetStatusPerAccount())
307 return account.statusContainer();
308 if (m_statusConfigurationHolder->isSetStatusPerIdentity())
309 return account.accountIdentity().statusContainer();
310 return m_allAccountsStatusContainer;
311 }
312
313 #include "moc_status-container-manager.cpp"
314