1 //=============================================================================
2 //
3 //   File : KviIconManager.cpp
4 //   Creation date : Sat Jun 24 2000 14:50:11 by Szymon Stefanek
5 //
6 //   This file is part of the KVIrc IRC client distribution
7 //   Copyright (C) 2000-2010 Szymon Stefanek (pragma at kvirc dot net)
8 //
9 //   This program is FREE software. You can redistribute it and/or
10 //   modify it under the terms of the GNU General Public License
11 //   as published by the Free Software Foundation; either version 2
12 //   of the License, or (at your option) any later version.
13 //
14 //   This program is distributed in the HOPE that it will be USEFUL,
15 //   but WITHOUT ANY WARRANTY; without even the implied warranty of
16 //   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 //   See the GNU General Public License for more details.
18 //
19 //   You should have received a copy of the GNU General Public License
20 //   along with this program. If not, write to the Free Software Foundation,
21 //   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22 //
23 //=============================================================================
24 
25 #define _KVI_ICONMANAGER_CPP_
26 
27 #include "KviIconManager.h"
28 #include "KviApplication.h"
29 #include "kvi_settings.h"
30 #include "kvi_defaults.h"
31 #include "KviLocale.h"
32 #include "KviFileUtils.h"
33 #include "KviOptions.h"
34 
35 #include <QCloseEvent>
36 #include <QCursor>
37 #include <QDir>
38 #include <QDrag>
39 #include <QEvent>
40 #include <QIcon>
41 #include <QLabel>
42 #include <QLayout>
43 #include <QMimeData>
44 
45 /*
46 	@doc: image_id
47 	@title:
48 		The image identifier
49 	@keyterms:
50 		image identifier, using builtin images, how KVIrc locates image files
51 	@type:
52 		language
53 	@short:
54 		Semantics of the <image_id> parameter
55 	@body:
56 		Some KVIrc commands and functions accept
57 		the <image_id> as a parameter.
58 		The <image_id> indicates an image to be displayed
59 		by some GUI element. Since KVIrc has a set of
60 		builtin icons, we want the user to be able to use it :).[br]
61 		The <image_id> can be either a signed integer number
62 		or a filename.[br]
63 		If it is a signed integer it is interpreted as
64 		index of the internal KVIrc image to use:
65 		positive integers (starting at 0) indicate
66 		small (16x16) icons (the ones used in the view widget).[br]
67 		If <image_id> is anything else than a signed integer,
68 		it is interpreted as a filename.
69 		The filename can be an absolute file path or a relative one.
70 		In this last case KVIrc will look for the file in a predefined set
71 		of directories: First in the local [i]pics[/i] directory (usually
72 		in ~/kvirc-version/pics/), then in the local [i]incoming[/i] directory,
73 		then in the global [i]pics[/i] directory, then in the user home (~)
74 		and in the current directory.[br]
75 */
76 
77 // KviApplication.cpp
78 extern QPixmap * g_pUserChanStatePixmap;
79 extern QPixmap * g_pActivityMeterPixmap;
80 
81 KviIconManager * g_pIconManager = nullptr;
82 
83 static const char * g_szIconNames[KviIconManager::IconCount] = {
84 	"none",                 // 0
85 	"close",                // 1
86 	"history",              // 2
87 	"historyoff",           // 3
88 	"usermode",             // 4
89 	"defaulticon",          // 5
90 	"dock",                 // 6
91 	"undock",               // 7
92 	"quitapp",              // 8
93 	"console",              // 9
94 	"save",                 // 10
95 	"parsererror",          // 11
96 	"parserwarning",        // 12
97 	"server",               // 13
98 	"world",                // 14
99 	"proxy",                // 15
100 	"kvirc",                // 16
101 	"cut",                  // 17
102 	"copy",                 // 18
103 	"paste",                // 19
104 	"options",              // 20
105 	"socketmessage",        // 21
106 	"socketwarning",        // 22
107 	"socketerror",          // 23
108 	"systemerror",          // 24
109 	"raw",                  // 25
110 	"systemwarning",        // 26
111 	"systemmessage",        // 27
112 	"unhandled",            // 28
113 	"serverinfo",           // 29
114 	"motd",                 // 30
115 	"channel",              // 31
116 	"hidedoubleview",       // 32
117 	"showdoubleview",       // 33
118 	"op",                   // 34
119 	"voice",                // 35
120 	"serverping",           // 36
121 	"showlistview",         // 37
122 	"hidelistview",         // 38
123 	"join",                 // 39
124 	"part",                 // 40
125 	"unrecognized",         // 41
126 	"topic",                // 42
127 	"accept",               // 43
128 	"discard",              // 44
129 	"ownprivmsg",           // 45
130 	"chanprivmsg",          // 46
131 	"query",                // 48
132 	"queryprivmsg",         // 49
133 	"help",                 // 49
134 	"questionmark",         // 50
135 	"ctcpreply",            // 51
136 	"ctcprequestreplied",   // 52
137 	"ctcprequestignored",   // 53
138 	"ctcprequestflood",     // 54
139 	"ctcprequestunknown",   // 55
140 	"action",               // 56
141 	"avatar",               // 57
142 	"quit",                 // 58
143 	"split",                // 59
144 	"quitsplit",            // 60
145 	"nick",                 // 61
146 	"deop",                 // 62
147 	"devoice",              // 63
148 	"mode",                 // 64
149 	"key",                  // 65
150 	"limit",                // 66
151 	"ban",                  // 67
152 	"unban",                // 68
153 	"banexcept",            // 69
154 	"banunexcept",          // 70
155 	"inviteexcept",         // 71
156 	"inviteunexcept",       // 72
157 	"chanmode",             // 73
158 	"chanmodehide",         // 74
159 	"who",                  // 75
160 	"editor",               // 76
161 	"dccrequest",           // 77
162 	"dccmsg",               // 78
163 	"dccerror",             // 79
164 	"iconmanager",          // 80
165 	"scriptcenter",         // 81
166 	"bomb",                 // 82
167 	"event",                // 83
168 	"eventnohandlers",      // 84
169 	"handler",              // 85
170 	"handlerdisabled",      // 86
171 	"nicknameproblem",      // 87
172 	"whoisuser",            // 88
173 	"whoischannels",        // 89
174 	"whoisidle",            // 90
175 	"whoisserver",          // 91
176 	"whoisother",           // 92
177 	"time",                 // 93
178 	"notifyonline",         // 94
179 	"notifyoffline",        // 95
180 	"locked",               // 96
181 	"unlocked",             // 97
182 	"lockedoff",            // 98
183 	"unlockedoff",          // 99
184 	"ownprivmsgcrypted",    // 100
185 	"chanprivmsgcrypted",   // 101
186 	"queryprivmsgcrypted",  // 102
187 	"dccchatmsg",           // 103
188 	"dccchatmsgcrypted",    // 104
189 	"irc",                  // 105
190 	"folder",               // 106
191 	"home",                 // 107
192 	"bookmarks",            // 108
193 	"spy",                  // 109
194 	"kick",                 // 110
195 	"linux",                // 111
196 	"links",                // 112
197 	"regusers",             // 113
198 	"trayicon",             // 114
199 	"unsetmode",            // 115
200 	"favorite",             // 116
201 	"toolbar",              // 117
202 	"serverfavorite",       // 118
203 	"log",                  // 119
204 	"remove",               // 120
205 	"file",                 // 121
206 	"icq",                  // 122
207 	"icqyellow",            // 123
208 	"icqred",               // 124
209 	"icqblue",              // 125
210 	"icqlightgreen",        // 126
211 	"icqlightyellow",       // 127
212 	"message",              // 128
213 	"messagesent",          // 129
214 	"bluesquare",           // 130
215 	"violetsquare",         // 131
216 	"yellowsquare",         // 132
217 	"greensquare",          // 133
218 	"blacksquare",          // 134
219 	"redsquare",            // 135
220 	"cyansquare",           // 136
221 	"dkgreensquare",        // 137
222 	"terminal",             // 138
223 	"wallops",              // 139
224 	"invisible",            // 140
225 	"servernotice",         // 141
226 	"gnutella",             // 142
227 	"search",               // 143
228 	"files",                // 144
229 	"newnetwork",           // 145
230 	"package",              // 146
231 	"newserver",            // 147
232 	"idea",                 // 148
233 	"colors",               // 149
234 	"gui",                  // 150
235 	"ircview",              // 151
236 	"alias",                // 152
237 	"channelnotice",        // 153
238 	"channelnoticecrypted", // 154
239 	"querynotice",          // 155
240 	"querynoticecrypted",   // 156
241 	"menubar",              // 157
242 	"popup",                // 158
243 	"prologue",             // 159
244 	"epilogue",             // 160
245 	"sharedfiles",          // 161
246 	"ctcpreplyunknown",     // 162
247 	"canvas",               // 163
248 	"nickserv",             // 164
249 	"chanserv",             // 165
250 	"dccvoice",             // 166
251 	"play",                 // 167
252 	"record",               // 168
253 	"kickoff",              // 169
254 	"away",                 // 170
255 	"ident",                // 171
256 	"homepage",             // 172
257 	"list",                 // 173
258 	"halfop",               // 174
259 	"halfdeop",             // 175
260 	"invite",               // 176
261 	"multimedia",           // 177
262 	"user",                 // 178
263 	"input",                // 179
264 	"messages",             // 180
265 	"querytrace",           // 181
266 	"nochannel",            // 182
267 	"broadcastprivmsg",     // 183
268 	"broadcastnotice",      // 184
269 	"url",                  // 185
270 	"rawevent",             // 186
271 	"raweventnohandlers",   // 187
272 	"mekick",               // 188
273 	"meop",                 // 189
274 	"mevoice",              // 190
275 	"medeop",               // 191
276 	"medevoice",            // 192
277 	"mehalfop",             // 193
278 	"medehalfop",           // 194
279 	"meban",                // 195
280 	"meunban",              // 196
281 	"mebanexcept",          // 197
282 	"mebanunexcept",        // 198
283 	"meinviteexcept",       // 199
284 	"meinviteunexcept",     // 200
285 	"classicwindowlist",    // 201
286 	"treewindowlist",       // 202
287 	"ignore",               // 203
288 	"userlist",             // 204
289 	"stats",                // 205
290 	"popupmenu",            // 206
291 	"serverconfiguration",  // 207
292 	"irc0",                 // 208
293 	"irc1",                 // 209
294 	"irc2",                 // 210
295 	"irc3",                 // 211
296 	"irc4",                 // 212
297 	"irc5",                 // 213
298 	"heart",                // 214
299 	"heartbroken",          // 215
300 	"rose",                 // 215
301 	"biggrin",              // 217
302 	"biggringlasses",       // 218
303 	"biggrineyes",          // 219
304 	"textexclamative",      // 220
305 	"textpoints",           // 221
306 	"kiss",                 // 222
307 	"surprised1",           // 223
308 	"ugly",                 // 224
309 	"angry",                // 225
310 	"surprised2",           // 226
311 	"smile",                // 227
312 	"tongue",               // 228
313 	"ssl",                  // 229
314 	"cry",                  // 230
315 	"eye",                  // 231
316 	"deadchannel",          // 232
317 	"deadquery",            // 233
318 	"sound",                // 234
319 	"toolbareditor",        // 235
320 	"textencoding",         // 236
321 	"newitem",              // 237
322 	"newitembywizard",      // 238
323 	"deleteitem",           // 239
324 	"edititem",             // 240
325 	"filetransfer",         // 241
326 	"chanadmin",            // 242
327 	"chanunadmin",          // 243
328 	"mechanadmin",          // 244
329 	"mechanunadmin",        // 245
330 	"userop",               // 246
331 	"deuserop",             // 247
332 	"meuserop",             // 248
333 	"medeuserop",           // 249
334 	"applet",               // 250
335 	"spam",                 // 251
336 	"transparent",          // 252
337 	"notifier",             // 253
338 	"userwindow",           // 254
339 	"statusbar",            // 255
340 	"notaway",              // 256
341 	"plus",                 // 257
342 	"minus",                // 258
343 	"binarytext",           // 259
344 	"chanowner",            // 260
345 	"chanunowner",          // 261
346 	"mechanowner",          // 262
347 	"mechanunowner",        // 263
348 	"afraid",               // 264
349 	"teeth",                // 265
350 	"sysmonitor",           // 266
351 	"saycolors",            // 267
352 	"finger",               // 268
353 	"highlighttext",        // 269
354 	"tearsmile",            // 270
355 	"shy",                  // 271
356 	"servererror",          // 272
357 	"cafe",                 // 273
358 	"addons",               // 274
359 	"chanowneraway",        // 275
360 	"opaway",               // 276
361 	"voiceaway",            // 277
362 	"chanadminaway",        // 278
363 	"useropaway",           // 279
364 	"halfopaway",           // 280
365 	"classeditor",          // 281
366 	"demoralized",          // 282
367 	"slurp",                // 283
368 	"namespace",            // 284
369 	"saysmile",             // 285
370 	"saykvs",               // 286
371 	"themeoptions",         // 287
372 	"bug",                  // 288
373 	"refresh",              // 289
374 	"theme",                // 290
375 	"screenshot",           // 291
376 	"update",               // 292
377 	"notupdate",            // 293
378 	"failupdate",           // 294
379 	"unreadtext",           // 295
380 	"ircop",                // 296
381 	"ircopaway",            // 297
382 	"deircop",              // 298
383 	"meircop",              // 299
384 	"medeircop",            // 300
385 	"angel",                // 301
386 	"clown",                // 302
387 	"devil",                // 303
388 	"inlove",               // 304
389 	"ninja",                // 305
390 	"pirate",               // 306
391 	"puke",                 // 307
392 	"rage",                 // 308
393 	"class",                // 309
394 	"classnotbuilt",        // 310
395 	"function",             // 311
396 	"sexmale",              // 312
397 	"sexfemale",            // 313
398 	"ircbot",               // 314
399 	"alienircop",           // 315
400 	"memoserv",             // 316
401 	"info",                 // 317
402 	"warning",              // 318
403 	"shield",               // 319
404 	"raweventeditor",       // 320
405 	"eventeditor",          // 321
406 	"actioneditor",         // 322
407 	"aliaseditor",          // 323
408 	"popupeditor",          // 324
409 	"dcc",                  // 325
410 	"socket",               // 326
411 	"cake",                 // 327
412 	"handily",              // 328
413 	"thumbdown",            // 329
414 	"thumbup",              // 330
415 	"facepalm",             // 331
416 	"identity",             // 332
417 	"nickpopup",            // 333
418 	"tools",                // 334
419 	"favoriteoff",          // 335
420 	"newproxy",             // 336
421 	"actioncrypted",        // 337
422 	"topiccrypted",         // 338
423 	"ctcpcrypted",          // 339
424 	"ownaction",            // 340
425 	"ownactioncrypted"      // 341
426 };
427 
KviIconWidget(QWidget * pPar)428 KviIconWidget::KviIconWidget(QWidget * pPar)
429     : QWidget(pPar)
430 {
431 	setObjectName("global_icon_widget");
432 	init();
433 }
434 
init()435 void KviIconWidget::init()
436 {
437 	setWindowTitle(__tr2qs("Icon Table - KVIrc"));
438 	setWindowIcon(QIcon(*(g_pIconManager->getSmallIcon(KviIconManager::IconManager))));
439 
440 	int iRows = KviIconManager::IconCount / 20;
441 	if((iRows * 20) < KviIconManager::IconCount)
442 		iRows++;
443 
444 	QGridLayout * pLayout = new QGridLayout(this);
445 	for(int i = 0; i < 20; i++)
446 	{
447 		KviCString szTmp(KviCString::Format, "%d", i);
448 		QLabel * pLabel = new QLabel(szTmp.ptr(), this);
449 		pLayout->addWidget(pLabel, 0, i + 1);
450 	}
451 	for(int i = 0; i < iRows; i++)
452 	{
453 		KviCString szTmp(KviCString::Format, "%d", i * 20);
454 		QLabel * pLabel = new QLabel(szTmp.ptr(), this);
455 		pLayout->addWidget(pLabel, i + 1, 0);
456 	}
457 	for(int i = 0; i < KviIconManager::IconCount; i++)
458 	{
459 		KviCString szTmp(KviCString::Format, "%d", i);
460 		QLabel * pLabel = new QLabel(this);
461 		pLabel->setObjectName(szTmp.ptr());
462 		pLabel->setPixmap(*(g_pIconManager->getSmallIcon(i)));
463 		pLabel->installEventFilter(this);
464 		pLabel->setAcceptDrops(true);
465 		pLayout->addWidget(pLabel, (i / 20) + 1, (i % 20) + 1);
466 	}
467 }
468 
469 KviIconWidget::~KviIconWidget()
470     = default;
471 
closeEvent(QCloseEvent * pEvent)472 void KviIconWidget::closeEvent(QCloseEvent * pEvent)
473 {
474 	pEvent->ignore();
475 	emit closed();
476 }
477 
eventFilter(QObject * pObject,QEvent * pEvent)478 bool KviIconWidget::eventFilter(QObject * pObject, QEvent * pEvent)
479 {
480 	if(pEvent->type() == QEvent::MouseButtonPress)
481 	{
482 		if(pObject->inherits("QLabel"))
483 		{
484 			KviCString szName = ((QLabel *)pObject)->objectName();
485 			bool bOk;
486 			KviIconManager::SmallIcon eIcon = (KviIconManager::SmallIcon)szName.toInt(&bOk);
487 			if(bOk)
488 				emit selected(eIcon);
489 
490 			if(parentWidget() && isVisible() && parentWidget()->inherits("QMenu"))
491 			{
492 				parentWidget()->close();
493 				return true;
494 			}
495 			else
496 			{
497 				if(const QPixmap * pPix = ((QLabel *)pObject)->pixmap())
498 				{
499 					QDrag * pDrag = new QDrag(this);
500 					QMimeData * pMime = new QMimeData;
501 
502 					pMime->setText(pObject->objectName());
503 					pMime->setImageData(*pPix);
504 					pDrag->setMimeData(pMime);
505 					pDrag->setPixmap(*pPix);
506 				}
507 			}
508 		}
509 	}
510 	else if(pEvent->type() == QEvent::DragEnter)
511 	{
512 		((QDragEnterEvent *)pEvent)->setAccepted(true);
513 		return true;
514 	}
515 	return QWidget::eventFilter(pObject, pEvent);
516 }
517 
KviCachedPixmap(QPixmap * pPix,const QString & szPath)518 KviCachedPixmap::KviCachedPixmap(QPixmap * pPix, const QString & szPath)
519 {
520 	m_szPath = szPath;
521 	m_tLastAccess = kvi_unixTime();
522 	m_pPixmap = pPix;
523 	m_uSize = m_pPixmap->width() * m_pPixmap->height() * (m_pPixmap->depth() / 8);
524 }
525 
~KviCachedPixmap()526 KviCachedPixmap::~KviCachedPixmap()
527 {
528 	delete m_pPixmap;
529 }
530 
updateLastAccessTime()531 void KviCachedPixmap::updateLastAccessTime()
532 {
533 	m_tLastAccess = kvi_unixTime();
534 }
535 
KviIconManager()536 KviIconManager::KviIconManager()
537 {
538 	initQResourceBackend();
539 
540 	m_pCachedImages = new KviPointerHashTable<QString, KviCachedPixmap>(21, true);
541 	m_pCachedImages->setAutoDelete(true);
542 
543 	QString szBuffer;
544 
545 	// Load the userchanstate image
546 	g_pApp->findImage(szBuffer, KVI_USERCHANSTATE_IMAGE_NAME);
547 	g_pUserChanStatePixmap = new QPixmap(szBuffer);
548 
549 	g_pApp->findImage(szBuffer, KVI_ACTIVITYMETER_IMAGE_NAME);
550 	g_pActivityMeterPixmap = new QPixmap(szBuffer);
551 }
552 
~KviIconManager()553 KviIconManager::~KviIconManager()
554 {
555 	delete g_pUserChanStatePixmap;
556 	delete g_pActivityMeterPixmap;
557 
558 	if(m_pIconWidget)
559 		delete m_pIconWidget;
560 
561 	for(int i = 0; i < KviIconManager::IconCount; i++)
562 	{
563 		if(m_smallIcons[i])
564 			delete m_smallIcons[i];
565 	}
566 	delete m_pCachedImages;
567 	if(m_pIconNames)
568 		delete m_pIconNames;
569 }
570 
initQResourceBackend()571 void KviIconManager::initQResourceBackend()
572 {
573 	QString szPath;
574 
575 	g_pApp->getLocalKvircDirectory(szPath, KviApplication::Pics);
576 	QDir::addSearchPath("icons", szPath);
577 
578 	g_pApp->getGlobalKvircDirectory(szPath, KviApplication::Pics);
579 	QDir::addSearchPath("icons", szPath);
580 
581 	g_pApp->getLocalKvircDirectory(szPath, KviApplication::SmallIcons);
582 	QDir::addSearchPath("smallicons", szPath);
583 
584 	g_pApp->getGlobalKvircDirectory(szPath, KviApplication::SmallIcons);
585 	QDir::addSearchPath("smallicons", szPath);
586 }
587 
getSmallIconResourceName(SmallIcon eIcon)588 QString KviIconManager::getSmallIconResourceName(SmallIcon eIcon)
589 {
590 	QString szName("smallicons:kcs_");
591 	szName.append(g_szIconNames[eIcon]);
592 	szName.append(".png");
593 	return szName;
594 }
595 
iconName(int iIcon)596 KviIconManager::SmallIcon KviIconManager::iconName(int iIcon)
597 {
598 	switch(iIcon)
599 	{
600 		case 1:
601 			return KviIconManager::Close;
602 			break;
603 		case 2:
604 			return KviIconManager::History;
605 			break;
606 		case 3:
607 			return KviIconManager::HistoryOff;
608 			break;
609 		case 4:
610 			return KviIconManager::UserMode;
611 			break;
612 		case 5:
613 			return KviIconManager::DefaultIcon;
614 			break;
615 		case 6:
616 			return KviIconManager::Dock;
617 			break;
618 		case 7:
619 			return KviIconManager::UnDock;
620 			break;
621 		case 8:
622 			return KviIconManager::QuitApp;
623 			break;
624 		case 9:
625 			return KviIconManager::Console;
626 			break;
627 		case 10:
628 			return KviIconManager::Save;
629 			break;
630 		case 11:
631 			return KviIconManager::ParserError;
632 			break;
633 		case 12:
634 			return KviIconManager::ParserWarning;
635 			break;
636 		case 13:
637 			return KviIconManager::Server;
638 			break;
639 		case 14:
640 			return KviIconManager::World;
641 			break;
642 		case 15:
643 			return KviIconManager::Proxy;
644 			break;
645 		case 16:
646 			return KviIconManager::KVIrc;
647 			break;
648 		case 17:
649 			return KviIconManager::Cut;
650 			break;
651 		case 18:
652 			return KviIconManager::Copy;
653 			break;
654 		case 19:
655 			return KviIconManager::Paste;
656 			break;
657 		case 20:
658 			return KviIconManager::Options;
659 			break;
660 		case 21:
661 			return KviIconManager::SocketMessage;
662 			break;
663 		case 22:
664 			return KviIconManager::SocketWarning;
665 			break;
666 		case 23:
667 			return KviIconManager::SocketError;
668 			break;
669 		case 24:
670 			return KviIconManager::SystemError;
671 			break;
672 		case 25:
673 			return KviIconManager::Raw;
674 			break;
675 		case 26:
676 			return KviIconManager::SystemWarning;
677 			break;
678 		case 27:
679 			return KviIconManager::SystemMessage;
680 			break;
681 		case 28:
682 			return KviIconManager::UnHandled;
683 			break;
684 		case 29:
685 			return KviIconManager::ServerInfo;
686 			break;
687 		case 30:
688 			return KviIconManager::Motd;
689 			break;
690 		case 31:
691 			return KviIconManager::Channel;
692 			break;
693 		case 32:
694 			return KviIconManager::HideDoubleView;
695 			break;
696 		case 33:
697 			return KviIconManager::ShowDoubleView;
698 			break;
699 		case 34:
700 			return KviIconManager::Op;
701 			break;
702 		case 35:
703 			return KviIconManager::Voice;
704 			break;
705 		case 36:
706 			return KviIconManager::ServerPing;
707 			break;
708 		case 37:
709 			return KviIconManager::ShowListView;
710 			break;
711 		case 38:
712 			return KviIconManager::HideListView;
713 			break;
714 		case 39:
715 			return KviIconManager::Join;
716 			break;
717 		case 40:
718 			return KviIconManager::Part;
719 			break;
720 		case 41:
721 			return KviIconManager::Unrecognized;
722 			break;
723 		case 42:
724 			return KviIconManager::Topic;
725 			break;
726 		case 43:
727 			return KviIconManager::Accept;
728 			break;
729 		case 44:
730 			return KviIconManager::Discard;
731 			break;
732 		case 45:
733 			return KviIconManager::OwnPrivMsg;
734 			break;
735 		case 46:
736 			return KviIconManager::ChanPrivMsg;
737 			break;
738 		case 47:
739 			return KviIconManager::Query;
740 			break;
741 		case 48:
742 			return KviIconManager::QueryPrivMsg;
743 			break;
744 		case 49:
745 			return KviIconManager::Help;
746 			break;
747 		case 50:
748 			return KviIconManager::QuestionMark;
749 			break;
750 		case 51:
751 			return KviIconManager::CtcpReply;
752 			break;
753 		case 52:
754 			return KviIconManager::CtcpRequestReplied;
755 			break;
756 		case 53:
757 			return KviIconManager::CtcpRequestIgnored;
758 			break;
759 		case 54:
760 			return KviIconManager::CtcpRequestFlood;
761 			break;
762 		case 55:
763 			return KviIconManager::CtcpRequestUnknown;
764 			break;
765 		case 56:
766 			return KviIconManager::Action;
767 			break;
768 		case 57:
769 			return KviIconManager::Avatar;
770 			break;
771 		case 58:
772 			return KviIconManager::Quit;
773 			break;
774 		case 59:
775 			return KviIconManager::Split;
776 			break;
777 		case 60:
778 			return KviIconManager::QuitSplit;
779 			break;
780 		case 61:
781 			return KviIconManager::Nick;
782 			break;
783 		case 62:
784 			return KviIconManager::DeOp;
785 			break;
786 		case 63:
787 			return KviIconManager::DeVoice;
788 			break;
789 		case 64:
790 			return KviIconManager::Mode;
791 			break;
792 		case 65:
793 			return KviIconManager::Key;
794 			break;
795 		case 66:
796 			return KviIconManager::Limit;
797 			break;
798 		case 67:
799 			return KviIconManager::Ban;
800 			break;
801 		case 68:
802 			return KviIconManager::UnBan;
803 			break;
804 		case 69:
805 			return KviIconManager::BanExcept;
806 			break;
807 		case 70:
808 			return KviIconManager::BanUnExcept;
809 			break;
810 		case 71:
811 			return KviIconManager::InviteExcept;
812 			break;
813 		case 72:
814 			return KviIconManager::InviteUnExcept;
815 			break;
816 		case 73:
817 			return KviIconManager::ChanMode;
818 			break;
819 		case 74:
820 			return KviIconManager::ChanModeHide;
821 			break;
822 		case 75:
823 			return KviIconManager::Who;
824 			break;
825 		case 76:
826 			return KviIconManager::Editor;
827 			break;
828 		case 77:
829 			return KviIconManager::DccRequest;
830 			break;
831 		case 78:
832 			return KviIconManager::DccMsg;
833 			break;
834 		case 79:
835 			return KviIconManager::DccError;
836 			break;
837 		case 80:
838 			return KviIconManager::IconManager;
839 			break;
840 		case 81:
841 			return KviIconManager::ScriptCenter;
842 			break;
843 		case 82:
844 			return KviIconManager::Bomb;
845 			break;
846 		case 83:
847 			return KviIconManager::Event;
848 			break;
849 		case 84:
850 			return KviIconManager::EventNoHandlers;
851 			break;
852 		case 85:
853 			return KviIconManager::Handler;
854 			break;
855 		case 86:
856 			return KviIconManager::HandlerDisabled;
857 			break;
858 		case 87:
859 			return KviIconManager::NickNameProblem;
860 			break;
861 		case 88:
862 			return KviIconManager::WhoisUser;
863 			break;
864 		case 89:
865 			return KviIconManager::WhoisChannels;
866 			break;
867 		case 90:
868 			return KviIconManager::WhoisIdle;
869 			break;
870 		case 91:
871 			return KviIconManager::WhoisServer;
872 			break;
873 		case 92:
874 			return KviIconManager::WhoisOther;
875 			break;
876 		case 93:
877 			return KviIconManager::Time;
878 			break;
879 		case 94:
880 			return KviIconManager::NotifyOnLine;
881 			break;
882 		case 95:
883 			return KviIconManager::NotifyOffLine;
884 			break;
885 		case 96:
886 			return KviIconManager::Locked;
887 			break;
888 		case 97:
889 			return KviIconManager::UnLocked;
890 			break;
891 		case 98:
892 			return KviIconManager::LockedOff;
893 			break;
894 		case 99:
895 			return KviIconManager::UnLockedOff;
896 			break;
897 		case 100:
898 			return KviIconManager::OwnPrivMsgCrypted;
899 			break;
900 		case 101:
901 			return KviIconManager::ChanPrivMsgCrypted;
902 			break;
903 		case 102:
904 			return KviIconManager::QueryPrivMsgCrypted;
905 			break;
906 		case 103:
907 			return KviIconManager::DccChatMsg;
908 			break;
909 		case 104:
910 			return KviIconManager::DccChatMsgCrypted;
911 			break;
912 		case 105:
913 			return KviIconManager::Irc;
914 			break;
915 		case 106:
916 			return KviIconManager::Folder;
917 			break;
918 		case 107:
919 			return KviIconManager::Home;
920 			break;
921 		case 108:
922 			return KviIconManager::BookMarks;
923 			break;
924 		case 109:
925 			return KviIconManager::Spy;
926 			break;
927 		case 110:
928 			return KviIconManager::Kick;
929 			break;
930 		case 111:
931 			return KviIconManager::Linux;
932 			break;
933 		case 112:
934 			return KviIconManager::Links;
935 			break;
936 		case 113:
937 			return KviIconManager::RegUsers;
938 			break;
939 		case 114:
940 			return KviIconManager::TrayIcon;
941 			break;
942 		case 115:
943 			return KviIconManager::UnsetMode;
944 			break;
945 		case 116:
946 			return KviIconManager::Favorite;
947 			break;
948 		case 117:
949 			return KviIconManager::Toolbar;
950 			break;
951 		case 118:
952 			return KviIconManager::ServerFavorite;
953 			break;
954 		case 119:
955 			return KviIconManager::Log;
956 			break;
957 		case 120:
958 			return KviIconManager::Remove;
959 			break;
960 		case 121:
961 			return KviIconManager::File;
962 			break;
963 		case 122:
964 			return KviIconManager::Icq;
965 			break;
966 		case 123:
967 			return KviIconManager::IcqYellow;
968 			break;
969 		case 124:
970 			return KviIconManager::IcqRed;
971 			break;
972 		case 125:
973 			return KviIconManager::IcqBlue;
974 			break;
975 		case 126:
976 			return KviIconManager::IcqLightGreen;
977 			break;
978 		case 127:
979 			return KviIconManager::IcqLightYellow;
980 			break;
981 		case 128:
982 			return KviIconManager::Message;
983 			break;
984 		case 129:
985 			return KviIconManager::MessageSent;
986 			break;
987 		case 130:
988 			return KviIconManager::BlueSquare;
989 			break;
990 		case 131:
991 			return KviIconManager::VioletSquare;
992 			break;
993 		case 132:
994 			return KviIconManager::YellowSquare;
995 			break;
996 		case 133:
997 			return KviIconManager::GreenSquare;
998 			break;
999 		case 134:
1000 			return KviIconManager::BlackSquare;
1001 			break;
1002 		case 135:
1003 			return KviIconManager::RedSquare;
1004 			break;
1005 		case 136:
1006 			return KviIconManager::CyanSquare;
1007 			break;
1008 		case 137:
1009 			return KviIconManager::DarkGreenSquare;
1010 			break;
1011 		case 138:
1012 			return KviIconManager::Terminal;
1013 			break;
1014 		case 139:
1015 			return KviIconManager::WallOps;
1016 			break;
1017 		case 140:
1018 			return KviIconManager::Invisible;
1019 			break;
1020 		case 141:
1021 			return KviIconManager::ServerNotice;
1022 			break;
1023 		case 142:
1024 			return KviIconManager::Gnutella;
1025 			break;
1026 		case 143:
1027 			return KviIconManager::Search;
1028 			break;
1029 		case 144:
1030 			return KviIconManager::Files;
1031 			break;
1032 		case 145:
1033 			return KviIconManager::NewNetwork;
1034 			break;
1035 		case 146:
1036 			return KviIconManager::Package;
1037 			break;
1038 		case 147:
1039 			return KviIconManager::NewServer;
1040 			break;
1041 		case 148:
1042 			return KviIconManager::Idea;
1043 			break;
1044 		case 149:
1045 			return KviIconManager::Colors;
1046 			break;
1047 		case 150:
1048 			return KviIconManager::Gui;
1049 			break;
1050 		case 151:
1051 			return KviIconManager::IrcView;
1052 			break;
1053 		case 152:
1054 			return KviIconManager::Alias;
1055 			break;
1056 		case 153:
1057 			return KviIconManager::ChannelNotice;
1058 			break;
1059 		case 154:
1060 			return KviIconManager::ChannelNoticeCrypted;
1061 			break;
1062 		case 155:
1063 			return KviIconManager::QueryNotice;
1064 			break;
1065 		case 156:
1066 			return KviIconManager::QueryNoticeCrypted;
1067 			break;
1068 		case 157:
1069 			return KviIconManager::MenuBar;
1070 			break;
1071 		case 158:
1072 			return KviIconManager::Popup;
1073 			break;
1074 		case 159:
1075 			return KviIconManager::Prologue;
1076 			break;
1077 		case 160:
1078 			return KviIconManager::Epilogue;
1079 			break;
1080 		case 161:
1081 			return KviIconManager::SharedFiles;
1082 			break;
1083 		case 162:
1084 			return KviIconManager::CtcpReplyUnknown;
1085 			break;
1086 		case 163:
1087 			return KviIconManager::Canvas;
1088 			break;
1089 		case 164:
1090 			return KviIconManager::NickServ;
1091 			break;
1092 		case 165:
1093 			return KviIconManager::ChanServ;
1094 			break;
1095 		case 166:
1096 			return KviIconManager::DccVoice;
1097 			break;
1098 		case 167:
1099 			return KviIconManager::Play;
1100 			break;
1101 		case 168:
1102 			return KviIconManager::Record;
1103 			break;
1104 		case 169:
1105 			return KviIconManager::KickOff;
1106 			break;
1107 		case 170:
1108 			return KviIconManager::Away;
1109 			break;
1110 		case 171:
1111 			return KviIconManager::Ident;
1112 			break;
1113 		case 172:
1114 			return KviIconManager::HomePage;
1115 			break;
1116 		case 173:
1117 			return KviIconManager::List;
1118 			break;
1119 		case 174:
1120 			return KviIconManager::HalfOp;
1121 			break;
1122 		case 175:
1123 			return KviIconManager::HalfDeOp;
1124 			break;
1125 		case 176:
1126 			return KviIconManager::Invite;
1127 			break;
1128 		case 177:
1129 			return KviIconManager::MultiMedia;
1130 			break;
1131 		case 178:
1132 			return KviIconManager::User;
1133 			break;
1134 		case 179:
1135 			return KviIconManager::Input;
1136 			break;
1137 		case 180:
1138 			return KviIconManager::Messages;
1139 			break;
1140 		case 181:
1141 			return KviIconManager::QueryTrace;
1142 			break;
1143 		case 182:
1144 			return KviIconManager::NoChannel;
1145 			break;
1146 		case 183:
1147 			return KviIconManager::BroadcastPrivMsg;
1148 			break;
1149 		case 184:
1150 			return KviIconManager::BroadcastNotice;
1151 			break;
1152 		case 185:
1153 			return KviIconManager::Url;
1154 			break;
1155 		case 186:
1156 			return KviIconManager::RawEvent;
1157 			break;
1158 		case 187:
1159 			return KviIconManager::RawEventNoHandlers;
1160 			break;
1161 		case 188:
1162 			return KviIconManager::MeKick;
1163 			break;
1164 		case 189:
1165 			return KviIconManager::MeOp;
1166 			break;
1167 		case 190:
1168 			return KviIconManager::MeVoice;
1169 			break;
1170 		case 191:
1171 			return KviIconManager::MeDeOp;
1172 			break;
1173 		case 192:
1174 			return KviIconManager::MeDeVoice;
1175 			break;
1176 		case 193:
1177 			return KviIconManager::MeHalfOp;
1178 			break;
1179 		case 194:
1180 			return KviIconManager::MeDeHalfOp;
1181 			break;
1182 		case 195:
1183 			return KviIconManager::MeBan;
1184 			break;
1185 		case 196:
1186 			return KviIconManager::MeUnBan;
1187 			break;
1188 		case 197:
1189 			return KviIconManager::MeBanExcept;
1190 			break;
1191 		case 198:
1192 			return KviIconManager::MeBanUnExcept;
1193 			break;
1194 		case 199:
1195 			return KviIconManager::MeInviteExcept;
1196 			break;
1197 		case 200:
1198 			return KviIconManager::MeInviteUnExcept;
1199 			break;
1200 		case 201:
1201 			return KviIconManager::ClassicWindowList;
1202 			break;
1203 		case 202:
1204 			return KviIconManager::TreeWindowList;
1205 			break;
1206 		case 203:
1207 			return KviIconManager::Ignore;
1208 			break;
1209 		case 204:
1210 			return KviIconManager::UserList;
1211 			break;
1212 		case 205:
1213 			return KviIconManager::Stats;
1214 			break;
1215 		case 206:
1216 			return KviIconManager::PopupMenu;
1217 			break;
1218 		case 207:
1219 			return KviIconManager::ServerConfiguration;
1220 			break;
1221 		case 208:
1222 			return KviIconManager::Irc0;
1223 			break;
1224 		case 209:
1225 			return KviIconManager::Irc1;
1226 			break;
1227 		case 210:
1228 			return KviIconManager::Irc2;
1229 			break;
1230 		case 211:
1231 			return KviIconManager::Irc3;
1232 			break;
1233 		case 212:
1234 			return KviIconManager::Irc4;
1235 			break;
1236 		case 213:
1237 			return KviIconManager::Irc5;
1238 			break;
1239 		case 214:
1240 			return KviIconManager::Heart;
1241 			break;
1242 		case 215:
1243 			return KviIconManager::HeartBroken;
1244 			break;
1245 		case 216:
1246 			return KviIconManager::Rose;
1247 			break;
1248 		case 217:
1249 			return KviIconManager::BigGrin;
1250 			break;
1251 		case 218:
1252 			return KviIconManager::BigGrinGlasses;
1253 			break;
1254 		case 219:
1255 			return KviIconManager::BigGrinEyes;
1256 			break;
1257 		case 220:
1258 			return KviIconManager::TextExclamative;
1259 			break;
1260 		case 221:
1261 			return KviIconManager::TextPoints;
1262 			break;
1263 		case 222:
1264 			return KviIconManager::Kiss;
1265 			break;
1266 		case 223:
1267 			return KviIconManager::Surprised1;
1268 			break;
1269 		case 224:
1270 			return KviIconManager::Ugly;
1271 			break;
1272 		case 225:
1273 			return KviIconManager::Angry;
1274 			break;
1275 		case 226:
1276 			return KviIconManager::Surprised2;
1277 			break;
1278 		case 227:
1279 			return KviIconManager::Smile;
1280 			break;
1281 		case 228:
1282 			return KviIconManager::Tongue;
1283 			break;
1284 		case 229:
1285 			return KviIconManager::Ssl;
1286 			break;
1287 		case 230:
1288 			return KviIconManager::Cry;
1289 			break;
1290 		case 231:
1291 			return KviIconManager::Eye;
1292 			break;
1293 		case 232:
1294 			return KviIconManager::DeadChannel;
1295 			break;
1296 		case 233:
1297 			return KviIconManager::DeadQuery;
1298 			break;
1299 		case 234:
1300 			return KviIconManager::Sound;
1301 			break;
1302 		case 235:
1303 			return KviIconManager::ToolBarEditor;
1304 			break;
1305 		case 236:
1306 			return KviIconManager::TextEncoding;
1307 			break;
1308 		case 237:
1309 			return KviIconManager::NewItem;
1310 			break;
1311 		case 238:
1312 			return KviIconManager::NewItemByWizard;
1313 			break;
1314 		case 239:
1315 			return KviIconManager::DeleteItem;
1316 			break;
1317 		case 240:
1318 			return KviIconManager::EditItem;
1319 			break;
1320 		case 241:
1321 			return KviIconManager::FileTransfer;
1322 			break;
1323 		case 242:
1324 			return KviIconManager::ChanAdmin;
1325 			break;
1326 		case 243:
1327 			return KviIconManager::ChanUnAdmin;
1328 			break;
1329 		case 244:
1330 			return KviIconManager::MeChanAdmin;
1331 			break;
1332 		case 245:
1333 			return KviIconManager::MeChanUnAdmin;
1334 			break;
1335 		case 246:
1336 			return KviIconManager::UserOp;
1337 			break;
1338 		case 247:
1339 			return KviIconManager::DeUserOp;
1340 			break;
1341 		case 248:
1342 			return KviIconManager::MeUserOp;
1343 			break;
1344 		case 249:
1345 			return KviIconManager::MeDeUserOp;
1346 			break;
1347 		case 250:
1348 			return KviIconManager::Applet;
1349 			break;
1350 		case 251:
1351 			return KviIconManager::Spam;
1352 			break;
1353 		case 252:
1354 			return KviIconManager::Transparent;
1355 			break;
1356 		case 253:
1357 			return KviIconManager::Notifier;
1358 			break;
1359 		case 254:
1360 			return KviIconManager::UserWindow;
1361 			break;
1362 		case 255:
1363 			return KviIconManager::StatusBar;
1364 			break;
1365 		case 256:
1366 			return KviIconManager::NotAway;
1367 			break;
1368 		case 257:
1369 			return KviIconManager::Plus;
1370 			break;
1371 		case 258:
1372 			return KviIconManager::Minus;
1373 			break;
1374 		case 259:
1375 			return KviIconManager::BinaryText;
1376 			break;
1377 		case 260:
1378 			return KviIconManager::ChanOwner;
1379 			break;
1380 		case 261:
1381 			return KviIconManager::ChanUnOwner;
1382 			break;
1383 		case 262:
1384 			return KviIconManager::MeChanOwner;
1385 			break;
1386 		case 263:
1387 			return KviIconManager::MeChanUnOwner;
1388 			break;
1389 		case 264:
1390 			return KviIconManager::Afraid;
1391 			break;
1392 		case 265:
1393 			return KviIconManager::Teeth;
1394 			break;
1395 		case 266:
1396 			return KviIconManager::SysMonitor;
1397 			break;
1398 		case 267:
1399 			return KviIconManager::SayColors;
1400 			break;
1401 		case 268:
1402 			return KviIconManager::Finger;
1403 			break;
1404 		case 269:
1405 			return KviIconManager::HighlightText;
1406 			break;
1407 		case 270:
1408 			return KviIconManager::TearSmile;
1409 			break;
1410 		case 271:
1411 			return KviIconManager::Shy;
1412 			break;
1413 		case 272:
1414 			return KviIconManager::ServerError;
1415 			break;
1416 		case 273:
1417 			return KviIconManager::Cafe;
1418 			break;
1419 		case 274:
1420 			return KviIconManager::Addons;
1421 			break;
1422 		case 275:
1423 			return KviIconManager::ChanOwnerAway;
1424 			break;
1425 		case 276:
1426 			return KviIconManager::OpAway;
1427 			break;
1428 		case 277:
1429 			return KviIconManager::VoiceAway;
1430 			break;
1431 		case 278:
1432 			return KviIconManager::ChanAdminAway;
1433 			break;
1434 		case 279:
1435 			return KviIconManager::UserOpAway;
1436 			break;
1437 		case 280:
1438 			return KviIconManager::HalfOpAway;
1439 			break;
1440 		case 281:
1441 			return KviIconManager::ClassEditor;
1442 			break;
1443 		case 282:
1444 			return KviIconManager::Demoralized;
1445 			break;
1446 		case 283:
1447 			return KviIconManager::Slurp;
1448 			break;
1449 		case 284:
1450 			return KviIconManager::NameSpace;
1451 			break;
1452 		case 285:
1453 			return KviIconManager::SaySmile;
1454 			break;
1455 		case 286:
1456 			return KviIconManager::SayKvs;
1457 			break;
1458 		case 287:
1459 			return KviIconManager::ThemeOptions;
1460 			break;
1461 		case 288:
1462 			return KviIconManager::Bug;
1463 			break;
1464 		case 289:
1465 			return KviIconManager::Refresh;
1466 			break;
1467 		case 290:
1468 			return KviIconManager::Theme;
1469 			break;
1470 		case 291:
1471 			return KviIconManager::ScreenShot;
1472 			break;
1473 		case 292:
1474 			return KviIconManager::Update;
1475 			break;
1476 		case 293:
1477 			return KviIconManager::NotUpdate;
1478 			break;
1479 		case 294:
1480 			return KviIconManager::FailUpdate;
1481 			break;
1482 		case 295:
1483 			return KviIconManager::UnreadText;
1484 			break;
1485 		case 296:
1486 			return KviIconManager::IrcOp;
1487 			break;
1488 		case 297:
1489 			return KviIconManager::IrcOpAway;
1490 			break;
1491 		case 298:
1492 			return KviIconManager::DeIrcOp;
1493 			break;
1494 		case 299:
1495 			return KviIconManager::MeIrcOp;
1496 			break;
1497 		case 300:
1498 			return KviIconManager::MeDeIrcOp;
1499 			break;
1500 		case 301:
1501 			return KviIconManager::Angel;
1502 			break;
1503 		case 302:
1504 			return KviIconManager::Clown;
1505 			break;
1506 		case 303:
1507 			return KviIconManager::Devil;
1508 			break;
1509 		case 304:
1510 			return KviIconManager::InLove;
1511 			break;
1512 		case 305:
1513 			return KviIconManager::Ninja;
1514 			break;
1515 		case 306:
1516 			return KviIconManager::Pirate;
1517 			break;
1518 		case 307:
1519 			return KviIconManager::Puke;
1520 			break;
1521 		case 308:
1522 			return KviIconManager::Rage;
1523 			break;
1524 		case 309:
1525 			return KviIconManager::Class;
1526 			break;
1527 		case 310:
1528 			return KviIconManager::ClassNotBuilt;
1529 			break;
1530 		case 311:
1531 			return KviIconManager::Function;
1532 			break;
1533 		case 312:
1534 			return KviIconManager::SexMale;
1535 			break;
1536 		case 313:
1537 			return KviIconManager::SexFemale;
1538 			break;
1539 		case 314:
1540 			return KviIconManager::IrcBot;
1541 			break;
1542 		case 315:
1543 			return KviIconManager::AlienIrcOp;
1544 			break;
1545 		case 316:
1546 			return KviIconManager::MemoServ;
1547 			break;
1548 		case 317:
1549 			return KviIconManager::Info;
1550 			break;
1551 		case 318:
1552 			return KviIconManager::Warning;
1553 			break;
1554 		case 319:
1555 			return KviIconManager::Shield;
1556 			break;
1557 		case 320:
1558 			return KviIconManager::RawEventEditor;
1559 			break;
1560 		case 321:
1561 			return KviIconManager::EventEditor;
1562 			break;
1563 		case 322:
1564 			return KviIconManager::ActionEditor;
1565 			break;
1566 		case 323:
1567 			return KviIconManager::AliasEditor;
1568 			break;
1569 		case 324:
1570 			return KviIconManager::PopupEditor;
1571 			break;
1572 		case 325:
1573 			return KviIconManager::Dcc;
1574 			break;
1575 		case 326:
1576 			return KviIconManager::Socket;
1577 			break;
1578 		case 327:
1579 			return KviIconManager::Cake;
1580 			break;
1581 		case 328:
1582 			return KviIconManager::HandIly;
1583 			break;
1584 		case 329:
1585 			return KviIconManager::ThumbDown;
1586 			break;
1587 		case 330:
1588 			return KviIconManager::ThumbUp;
1589 			break;
1590 		case 331:
1591 			return KviIconManager::FacePalm;
1592 			break;
1593 		case 332:
1594 			return KviIconManager::Identity;
1595 			break;
1596 		case 333:
1597 			return KviIconManager::NickPopup;
1598 			break;
1599 		case 334:
1600 			return KviIconManager::Tools;
1601 			break;
1602 		case 335:
1603 			return KviIconManager::FavoriteOff;
1604 			break;
1605 		case 336:
1606 			return KviIconManager::NewProxy;
1607 			break;
1608 		case 337:
1609 			return KviIconManager::ActionCrypted;
1610 			break;
1611 		case 338:
1612 			return KviIconManager::TopicCrypted;
1613 			break;
1614 		case 339:
1615 			return KviIconManager::CtcpCrypted;
1616 			break;
1617 		case 340:
1618 			return KviIconManager::OwnAction;
1619 			break;
1620 		case 341:
1621 			return KviIconManager::OwnActionCrypted;
1622 			break;
1623 		case 0:
1624 		case KviIconManager::IconCount:
1625 		default:
1626 			return KviIconManager::None;
1627 			break;
1628 	}
1629 }
1630 
getSmallIconName(SmallIcon eIcon)1631 const char * KviIconManager::getSmallIconName(SmallIcon eIcon)
1632 {
1633 	return g_szIconNames[eIcon];
1634 }
1635 
getSmallIconName(int iIcon)1636 const char * KviIconManager::getSmallIconName(int iIcon)
1637 {
1638 	return g_szIconNames[iIcon];
1639 }
1640 
getSmallIconIdFromName(const QString & szName)1641 int KviIconManager::getSmallIconIdFromName(const QString & szName)
1642 {
1643 	if(!m_pIconNames)
1644 	{
1645 		m_pIconNames = new KviPointerHashTable<QString, int>(257, false);
1646 		m_pIconNames->setAutoDelete(true);
1647 
1648 		for(int i = 0; i < IconCount; i++)
1649 		{
1650 			int * pInt = new int;
1651 			*pInt = i;
1652 			m_pIconNames->replace(QString(g_szIconNames[i]), pInt);
1653 		}
1654 	}
1655 	int * pInt = m_pIconNames->find(szName);
1656 	if(!pInt)
1657 		return 0;
1658 	return *pInt;
1659 }
1660 
showIconWidget()1661 void KviIconManager::showIconWidget()
1662 {
1663 	if(!m_pIconWidget)
1664 	{
1665 		m_pIconWidget = new KviIconWidget();
1666 		connect(m_pIconWidget, SIGNAL(closed()), this, SLOT(iconWidgetClosed()));
1667 	}
1668 	m_pIconWidget->show();
1669 	m_pIconWidget->raise();
1670 	m_pIconWidget->setFocus();
1671 }
1672 
iconWidgetClosed()1673 void KviIconManager::iconWidgetClosed()
1674 {
1675 	delete m_pIconWidget;
1676 	m_pIconWidget = nullptr;
1677 }
1678 
getPixmapWithCache(const QString & szName)1679 KviCachedPixmap * KviIconManager::getPixmapWithCache(const QString & szName)
1680 {
1681 	if(szName.isEmpty())
1682 		return nullptr;
1683 
1684 	KviCachedPixmap * pCache = m_pCachedImages->find(szName);
1685 
1686 	if(pCache)
1687 	{
1688 		pCache->updateLastAccessTime();
1689 		return pCache;
1690 	}
1691 
1692 	QPixmap * pPix = nullptr;
1693 
1694 	QString szRetPath;
1695 
1696 	if(!g_pApp->findImage(szRetPath, szName))
1697 		return nullptr;
1698 
1699 	pPix = new QPixmap(szRetPath);
1700 	if(pPix->isNull())
1701 	{
1702 		delete pPix; // it is not an valid image!!! (really bad situation...)
1703 		pPix = nullptr;
1704 		return nullptr;
1705 	}
1706 
1707 	pCache = new KviCachedPixmap(pPix, QString(szRetPath));
1708 	addToCache(szName, pCache);
1709 
1710 	return pCache;
1711 }
1712 
getPixmapWithCacheScaleOnLoad(const QString & szName,int iMaxWidth,int iMaxHeight)1713 KviCachedPixmap * KviIconManager::getPixmapWithCacheScaleOnLoad(const QString & szName, int iMaxWidth, int iMaxHeight)
1714 {
1715 	if(szName.isEmpty())
1716 		return nullptr;
1717 
1718 	KviCachedPixmap * pCache = m_pCachedImages->find(szName);
1719 
1720 	if(pCache)
1721 	{
1722 		pCache->updateLastAccessTime();
1723 		return pCache;
1724 	}
1725 
1726 	QPixmap * pPix = nullptr;
1727 
1728 	QString szRetPath;
1729 
1730 	if(!g_pApp->findImage(szRetPath, szName))
1731 		return nullptr;
1732 
1733 	pPix = new QPixmap(szRetPath);
1734 	if(pPix->isNull())
1735 	{
1736 		delete pPix; // it is not an valid image!!! (really bad situation...)
1737 		pPix = nullptr;
1738 		return nullptr;
1739 	}
1740 	if((pPix->width() > iMaxWidth) || (pPix->height() > iMaxHeight))
1741 	{
1742 		// scale to fit
1743 		int scaleW = iMaxWidth;
1744 		int scaleH;
1745 		scaleH = (pPix->height() * iMaxWidth) / pPix->width();
1746 		if(scaleH > iMaxHeight)
1747 		{
1748 			scaleH = iMaxHeight;
1749 			scaleW = (scaleH * pPix->width()) / pPix->height();
1750 		}
1751 
1752 		QImage img = pPix->toImage();
1753 		*pPix = QPixmap::fromImage(img.scaled(scaleW, scaleH, Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
1754 	}
1755 
1756 	pCache = new KviCachedPixmap(pPix, QString(szRetPath));
1757 	addToCache(szName, pCache);
1758 
1759 	return pCache;
1760 }
1761 
addToCache(const QString & szName,KviCachedPixmap * pCache)1762 void KviIconManager::addToCache(const QString & szName, KviCachedPixmap * pCache)
1763 {
1764 	//if((m_uCacheTotalSize + pCache->size()) >= m_uCacheMaxSize)
1765 	//	cacheCleanup();
1766 
1767 	m_pCachedImages->insert(szName, pCache);
1768 	m_uCacheTotalSize += pCache->size();
1769 }
1770 
getImage(const QString & szId,bool bCanBeNumber,QString * pszRetPath)1771 QPixmap * KviIconManager::getImage(const QString & szId, bool bCanBeNumber, QString * pszRetPath)
1772 {
1773 	if(szId.isEmpty())
1774 		return nullptr;
1775 
1776 	if(bCanBeNumber)
1777 	{
1778 		bool bOk;
1779 		int iIdx = szId.toInt(&bOk);
1780 		if(bOk)
1781 		{
1782 			// was a number : this is not a filename
1783 			if(iIdx >= 0)
1784 				return getSmallIcon(iIdx % KviIconManager::IconCount);
1785 		}
1786 		else
1787 		{
1788 			if(szId.startsWith("$icon"))
1789 			{
1790 				QString szTmp = szId.trimmed();
1791 				szTmp.replace("$icon(", "");
1792 				szTmp.replace(")", "");
1793 				szTmp = szTmp.trimmed();
1794 				szTmp.replace("\"", "");
1795 				iIdx = getSmallIconIdFromName(szTmp.trimmed());
1796 				if(iIdx >= 0)
1797 					return getSmallIcon(iIdx % KviIconManager::IconCount);
1798 			}
1799 		}
1800 	}
1801 
1802 	KviCachedPixmap * pCache = getPixmapWithCache(szId);
1803 	if(!pCache)
1804 		return nullptr;
1805 
1806 	if(pszRetPath)
1807 		*pszRetPath = pCache->path();
1808 
1809 	return pCache->pixmap();
1810 }
1811 
getBigIcon(const QString & szName)1812 QPixmap * KviIconManager::getBigIcon(const QString & szName)
1813 {
1814 	QPixmap * pPix = getPixmap(szName);
1815 	if(pPix)
1816 		return pPix;
1817 
1818 	bool bOk;
1819 	int iIdx = szName.toInt(&bOk);
1820 	if(bOk && (iIdx >= 0))
1821 	{
1822 		// was a number : this is not a filename
1823 		// it was a small icon: scale it and cache it
1824 		QString szTmpName = szName;
1825 		szTmpName += ".scaled16to32";
1826 		pPix = getPixmap(szTmpName);
1827 		if(pPix)
1828 			return pPix;
1829 		pPix = getSmallIcon(iIdx % KviIconManager::IconCount);
1830 		if(pPix)
1831 		{
1832 			QImage tmp = pPix->toImage();
1833 			QImage tmp2 = tmp.scaled(32, 32, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
1834 			QPixmap * pPix2 = new QPixmap();
1835 			*pPix2 = QPixmap::fromImage(tmp2);
1836 			KviCachedPixmap * pCache = new KviCachedPixmap(pPix2, QString());
1837 			addToCache(szTmpName, pCache);
1838 			return pCache->pixmap();
1839 		}
1840 	}
1841 
1842 	pPix = getPixmap("kvi_bigicon_unknown.png");
1843 	if(pPix)
1844 		return pPix;
1845 	KviCachedPixmap * pCache = new KviCachedPixmap(new QPixmap(32, 32), QString());
1846 	addToCache(szName, pCache);
1847 	return pCache->pixmap();
1848 }
1849 
urlToCachedFileName(QString & szName)1850 void KviIconManager::urlToCachedFileName(QString & szName)
1851 {
1852 	szName.replace(":", "_");
1853 	szName.replace(";", "_");
1854 	szName.replace("/", "_");
1855 	szName.replace("\\", "_");
1856 	szName.replace("\"", "_");
1857 	szName.replace("\'", "_");
1858 	szName.replace("(", "_");
1859 	szName.replace(")", "_");
1860 	szName.replace("?", "_");
1861 	szName.replace("___", ".");
1862 	//cut filenames to 255 chars, trying to preserve file name/extension (bug #616)
1863 	if(szName.size() > 255)
1864 	{
1865 		QString szExt = szName.right(55);
1866 		szName.truncate(200);
1867 		szName.append(szExt);
1868 	}
1869 }
1870 
getAvatar(const QString & szLocalPath,const QString & szName)1871 KviAvatar * KviIconManager::getAvatar(const QString & szLocalPath, const QString & szName)
1872 {
1873 	QString szP, szN;
1874 
1875 	if(szLocalPath.isEmpty())
1876 	{
1877 		//both path and name empty => fail
1878 		if(szName.isEmpty())
1879 			return nullptr;
1880 		if(KviQString::equalCIN("http://", szName, 7) || KviQString::equalCIN("https://", szName, 8))
1881 		{
1882 			// it's a URL, cache it locally
1883 			szN = szName;
1884 			urlToCachedFileName(szN);
1885 			g_pApp->getLocalKvircDirectory(szP, KviApplication::Avatars, szN);
1886 			szN = szName; // keep the remote URL as name
1887 		}
1888 		else
1889 		{
1890 			//locally cached avatar, called only by its szName
1891 			szN = KviFileUtils::extractFileName(szName);
1892 			g_pApp->getLocalKvircDirectory(szP, KviApplication::Avatars, szN);
1893 		}
1894 	}
1895 	else if(szName.isEmpty())
1896 	{
1897 		if(szLocalPath.isEmpty())
1898 			return nullptr;
1899 		szP = szLocalPath;
1900 		szN = KviFileUtils::extractFileName(szLocalPath);
1901 	}
1902 	else
1903 	{
1904 		szP = szLocalPath;
1905 		szN = szName;
1906 	}
1907 
1908 	KviAvatar * pResult = nullptr;
1909 
1910 	if(KviFileUtils::fileExists(szP))
1911 	{
1912 		if(KVI_OPTION_BOOL(KviOption_boolScaleAvatarsOnLoad))
1913 		{
1914 			pResult = new KviAvatar(szP, szN,
1915 			    QSize(
1916 			                            KVI_OPTION_UINT(KviOption_uintScaleAvatarsOnLoadWidth),
1917 			                            KVI_OPTION_UINT(KviOption_uintScaleAvatarsOnLoadHeight)));
1918 		}
1919 		else
1920 		{
1921 			pResult = new KviAvatar(szP, szN);
1922 		}
1923 	}
1924 
1925 	//Can't load it
1926 	if(pResult && !pResult->isValid())
1927 	{
1928 		delete pResult;
1929 		pResult = nullptr;
1930 	}
1931 
1932 	return pResult;
1933 }
1934 
clearCache()1935 void KviIconManager::clearCache()
1936 {
1937 	m_pCachedImages->clear();
1938 }
1939 
reloadImages()1940 void KviIconManager::reloadImages()
1941 {
1942 	clearCache();
1943 	for(auto & m_smallIcon : m_smallIcons)
1944 	{
1945 		if(m_smallIcon)
1946 			delete m_smallIcon;
1947 		m_smallIcon = nullptr;
1948 	}
1949 }
1950 
loadSmallIcon(int iIdx)1951 QPixmap * KviIconManager::loadSmallIcon(int iIdx)
1952 {
1953 	if(iIdx >= KviIconManager::IconCount)
1954 		return nullptr;
1955 	if(iIdx < 0)
1956 		return nullptr;
1957 
1958 	QString szPath = QString(KVI_SMALLICONS_PREFIX "%1.png").arg(g_szIconNames[iIdx]);
1959 	//KviQString::sprintf(szPath,KVI_SMALLICONS_PREFIX "%s.png",g_szIconNames[iIdx]);
1960 	QString szBuffer;
1961 
1962 	g_pApp->findSmallIcon(szBuffer, szPath);
1963 	m_smallIcons[iIdx] = new QPixmap(szBuffer);
1964 
1965 	return m_smallIcons[iIdx];
1966 }
1967 
1968 #ifdef __GNUC__
1969 //#warning IMPLEMENT CLEANUP
1970 #endif
1971 /*
1972 void KviIconManager::cacheCleanup()
1973 {
1974 	QStringList l;
1975 	KviPointerHashTableIterator<QString,KviCachedPixmap> it(*m_pCachedImages);
1976 
1977 	while(it.current())
1978 	{
1979 		kvi_time_t curTime = kvi_unixTime();
1980 
1981 		if((((unsigned int)it.current()->timestamp) - ((unsigned int)curTime)) > 120)
1982 		{
1983 			// unused since 2 minutes
1984 			// time to cleanup it...
1985 			l.append(new KviCString(it.currentKey()));
1986 		}
1987 		++it;
1988 	}
1989 
1990 	for(QStringList::Iterator it = l.begin();it != l.end();++it)
1991 	{
1992 		m_pCachedImages->remove(*it);
1993 	}
1994 
1995 	for(KviCString * p =l.first();p;p = l.next())
1996 	{
1997 		m_pCachedImages->remove(p->ptr());
1998 	}
1999 	if(m_pCachedImages->isEmpty())m_pCleanupTimer->stop();
2000 }
2001 */
2002