Statistics
| Branch: | Tag: | Revision:

root / kadu-core / status / status-container-manager.cpp @ 673213a7

History | View | Annotate | Download (8.5 kB)

1
/*
2
 * %kadu copyright begin%
3
 * Copyright 2009, 2010, 2010, 2011 Piotr Galiszewski (piotr.galiszewski@kadu.im)
4
 * Copyright 2010 Wojciech Treter (juzefwt@gmail.com)
5
 * Copyright 2010, 2011 Piotr Dąbrowski (ultr@ultr.pl)
6
 * Copyright 2009, 2009, 2010, 2011 Rafał Malinowski (rafal.przemyslaw.malinowski@gmail.com)
7
 * Copyright 2010, 2011 Bartosz Brachaczek (b.brachaczek@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 "configuration/main-configuration-holder.h"
27
#include "core/core.h"
28
#include "icons/icons-manager.h"
29
#include "icons/kadu-icon.h"
30
#include "identities/identity-manager.h"
31
#include "protocols/protocol.h"
32
#include "status/all-accounts-status-container.h"
33
#include "status/status-container-aware-object.h"
34
#include "status/status-type-manager.h"
35
#include "status/status-type.h"
36
37
#include "status-container-manager.h"
38
39
StatusContainerManager * StatusContainerManager::Instance = 0;
40
41
StatusContainerManager * StatusContainerManager::instance()
42
{
43
        if (!Instance)
44
                Instance = new StatusContainerManager();
45
        return Instance;
46
}
47
48
StatusContainerManager::StatusContainerManager() :
49
                StatusContainer(0), DefaultStatusContainer(0)
50
{
51
        AllAccountsContainer = new AllAccountsStatusContainer(this);
52
53
        if (MainConfigurationHolder::instance()->isSetStatusPerIdentity())
54
                triggerAllIdentitiesAdded();
55
        else if (MainConfigurationHolder::instance()->isSetStatusPerAccount())
56
                triggerAllAccountsRegistered();
57
        else
58
                registerStatusContainer(AllAccountsContainer);
59
60
        connect(MainConfigurationHolder::instance(), SIGNAL(setStatusModeChanged()), this, SLOT(setStatusModeChanged()));
61
        connect(AccountManager::instance(), SIGNAL(accountUpdated(Account)), this, SLOT(updateIdentities()));
62
}
63
64
StatusContainerManager::~StatusContainerManager()
65
{
66
        disconnect(AccountManager::instance(), 0, this, 0);
67
        disconnect(MainConfigurationHolder::instance(), 0, this, 0);
68
69
        if (MainConfigurationHolder::instance()->isSetStatusPerIdentity())
70
                triggerAllIdentitiesRemoved();
71
        else if (MainConfigurationHolder::instance()->isSetStatusPerAccount())
72
                triggerAllAccountsUnregistered();
73
        else
74
                unregisterStatusContainer(AllAccountsContainer);
75
}
76
77
void StatusContainerManager::updateIdentities()
78
{
79
        if (!MainConfigurationHolder::instance()->isSetStatusPerIdentity())
80
                return;
81
82
        foreach (const Identity &identity, IdentityManager::instance()->items())
83
                if (StatusContainers.contains(identity) && !identity.hasAnyAccountWithDetails())
84
                        unregisterStatusContainer(identity);
85
                else if (!StatusContainers.contains(identity) && identity.hasAnyAccountWithDetails())
86
                        registerStatusContainer(identity);
87
}
88
89
void StatusContainerManager::accountRegistered(Account account)
90
{
91
        if (MainConfigurationHolder::instance()->isSetStatusPerAccount() && !StatusContainers.contains(account.statusContainer()))
92
                registerStatusContainer(account.statusContainer());
93
94
        if (MainConfigurationHolder::instance()->isSetStatusPerIdentity() && !StatusContainers.contains(account.accountIdentity()))
95
                updateIdentities();
96
}
97
98
void StatusContainerManager::accountUnregistered(Account account)
99
{
100
        if (MainConfigurationHolder::instance()->isSetStatusPerAccount() && StatusContainers.contains(account.statusContainer()))
101
                unregisterStatusContainer(account.statusContainer());
102
103
        if (MainConfigurationHolder::instance()->isSetStatusPerIdentity())
104
                updateIdentities();
105
}
106
107
void StatusContainerManager::identityAdded(Identity identity)
108
{
109
        if (MainConfigurationHolder::instance()->isSetStatusPerIdentity() && !StatusContainers.contains(identity) && identity.hasAnyAccountWithDetails())
110
                registerStatusContainer(identity);
111
}
112
113
void StatusContainerManager::identityRemoved(Identity identity)
114
{
115
        if (MainConfigurationHolder::instance()->isSetStatusPerIdentity() && StatusContainers.contains(identity))
116
                unregisterStatusContainer(identity);
117
}
118
119
void StatusContainerManager::cleanStatusContainers()
120
{
121
        while (!StatusContainers.isEmpty())
122
                unregisterStatusContainer(StatusContainers.at(0));
123
}
124
125
void StatusContainerManager::addAllAccounts()
126
{
127
        foreach (Account account, AccountManager::instance()->items())
128
                registerStatusContainer(account.statusContainer());
129
}
130
131
void StatusContainerManager::addAllIdentities()
132
{
133
        updateIdentities();
134
}
135
136
void StatusContainerManager::setDefaultStatusContainer(StatusContainer *defaultStatusContainer)
137
{
138
        if (defaultStatusContainer == DefaultStatusContainer)
139
                return;
140
141
        if (DefaultStatusContainer)
142
                disconnect(DefaultStatusContainer, 0, this, 0);
143
144
        if (this != defaultStatusContainer)
145
                DefaultStatusContainer = defaultStatusContainer;
146
        else
147
                DefaultStatusContainer = 0;
148
149
        if (DefaultStatusContainer)
150
                connect(DefaultStatusContainer, SIGNAL(statusUpdated()), this, SIGNAL(statusUpdated()));
151
152
        emit statusUpdated();
153
}
154
155
void StatusContainerManager::setStatusModeChanged()
156
{
157
        cleanStatusContainers();
158
        if (MainConfigurationHolder::instance()->isSetStatusPerIdentity())
159
                addAllIdentities();
160
        else if (MainConfigurationHolder::instance()->isSetStatusPerAccount())
161
                addAllAccounts();
162
        else
163
                registerStatusContainer(AllAccountsContainer);
164
}
165
166
void StatusContainerManager::registerStatusContainer(StatusContainer *statusContainer)
167
{
168
        if (StatusContainers.isEmpty())
169
                setDefaultStatusContainer(statusContainer);
170
171
        emit statusContainerAboutToBeRegistered(statusContainer);
172
        StatusContainers.append(statusContainer);
173
        emit statusContainerRegistered(statusContainer);
174
        StatusContainerAwareObject::notifyStatusContainerRegistered(statusContainer);
175
176
        connect(statusContainer, SIGNAL(statusUpdated()), this, SIGNAL(statusUpdated()));
177
}
178
179
void StatusContainerManager::unregisterStatusContainer(StatusContainer *statusContainer)
180
{
181
        emit statusContainerAboutToBeUnregistered(statusContainer);
182
        StatusContainers.removeAll(statusContainer);
183
        emit statusContainerUnregistered(statusContainer);
184
        StatusContainerAwareObject::notifyStatusContainerUnregistered(statusContainer);
185
186
        if (statusContainer == DefaultStatusContainer)
187
        {
188
                if (StatusContainers.isEmpty())
189
                        setDefaultStatusContainer(0);
190
                else
191
                        setDefaultStatusContainer(StatusContainers.at(0));
192
        }
193
194
        disconnect(statusContainer, 0, this, 0);
195
}
196
197
bool StatusContainerManager::allStatusOfType(StatusType type)
198
{
199
        if (StatusTypeNone == type)
200
                return false;
201
202
        foreach (StatusContainer *container, StatusContainers)
203
                if (container->status().type() != type)
204
                        return false;
205
        return true;
206
}
207
208
QString StatusContainerManager::statusContainerName()
209
{
210
        return tr("All");
211
}
212
213
void StatusContainerManager::setStatus(Status status, StatusChangeSource source)
214
{
215
        foreach (StatusContainer *container, StatusContainers)
216
                container->setStatus(status, source);
217
}
218
219
Status StatusContainerManager::status()
220
{
221
        return DefaultStatusContainer
222
                        ? DefaultStatusContainer->status()
223
                        : Status();
224
}
225
226
bool StatusContainerManager::isStatusSettingInProgress()
227
{
228
        return DefaultStatusContainer
229
                        ? DefaultStatusContainer->isStatusSettingInProgress()
230
                        : false;
231
}
232
233
KaduIcon StatusContainerManager::statusIcon()
234
{
235
        return statusIcon(status());
236
}
237
238
KaduIcon StatusContainerManager::statusIcon(const Status &status)
239
{
240
        if (!DefaultStatusContainer)
241
                return StatusTypeManager::instance()->statusIcon("common", StatusTypeOffline);
242
243
        return StatusTypeManager::instance()->statusIcon("common", status);
244
}
245
246
QList<StatusType> StatusContainerManager::supportedStatusTypes()
247
{
248
        return DefaultStatusContainer
249
                        ? DefaultStatusContainer->supportedStatusTypes()
250
                        : QList<StatusType>();
251
}
252
253
int StatusContainerManager::maxDescriptionLength()
254
{
255
        return DefaultStatusContainer
256
                        ? DefaultStatusContainer->maxDescriptionLength()
257
                        : -1;
258
}
259
260
QString StatusContainerManager::statusNamePrefix()
261
{
262
        return tr("All") + ' ';
263
}
264
265
Status StatusContainerManager::loadStatus()
266
{
267
        return DefaultStatusContainer
268
                        ? DefaultStatusContainer->loadStatus()
269
                        : Status();
270
}
271
272
void StatusContainerManager::storeStatus(Status status)
273
{
274
        foreach (StatusContainer *statusContainer, StatusContainers)
275
                statusContainer->storeStatus(status);
276
}
277
278
QList<StatusContainer *> StatusContainerManager::subStatusContainers()
279
{
280
        return StatusContainers;
281
}