moved the old Changelog, which only contained log from the old centericq
[centerim.git] / src / icqdialogs.cc
blob3e15d82f3a12a3c78159106d63df4f66a43469af
1 /*
3 * centerim user interface class, dialogs related part
4 * $Id: icqdialogs.cc,v 1.151 2005/05/23 14:16:52 konst Exp $
6 * Copyright (C) 2001-2004 by Konstantin Klyagin <k@thekonst.net>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or (at
11 * your option) any later version.
13 * This program is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
21 * USA
25 #include "icqface.h"
26 #include "icqconf.h"
27 #include "centerim.h"
28 #include "icqcontact.h"
29 #include "icqcontacts.h"
30 #include "icqmlist.h"
31 #include "icqgroups.h"
32 #include "abstracthook.h"
33 #include "ljhook.h"
34 #include "impgp.h"
36 #include <libicq2000/constants.h>
37 #include <stdint.h> /* for intptr_t */
39 const char *stragerange(ICQ2000::AgeRange r) {
40 switch(r) {
41 case ICQ2000::RANGE_18_22: return "18-22";
42 case ICQ2000::RANGE_23_29: return "23-29";
43 case ICQ2000::RANGE_30_39: return "30-39";
44 case ICQ2000::RANGE_40_49: return "40-49";
45 case ICQ2000::RANGE_50_59: return "50-59";
46 case ICQ2000::RANGE_60_ABOVE: return _("60-above");
47 case ICQ2000::RANGE_NORANGE: return _("unknown");
50 return "";
53 const char *strrandomgroup(short unsigned int gr) {
54 switch((ICQ2000::RandomChatGroup) gr) {
55 case ICQ2000::GROUP_GENERALCHAT: return _("General Chat");
56 case ICQ2000::GROUP_ROMANCE: return _("Romance");
57 case ICQ2000::GROUP_GAMES: return _("Games");
58 case ICQ2000::GROUP_STUDENTS: return _("Students");
59 case ICQ2000::GROUP_20: return _("20 Something");
60 case ICQ2000::GROUP_30: return _("30 Something");
61 case ICQ2000::GROUP_40: return _("40 Something");
62 case ICQ2000::GROUP_50PLUS: return _("50 Plus");
63 case ICQ2000::GROUP_SEEKINGWOMEN: return _("Seeking Women");
64 case ICQ2000::GROUP_SEEKINGMEN: return _("Seeking Men");
67 return "";
70 const char *strsortmode(icqconf::sortmode smode) {
71 switch(smode) {
72 case icqconf::sort_by_status_and_activity: return _("Status and Activity");
73 case icqconf::sort_by_status_and_name: return _("Status and Name");
74 case icqconf::sort_by_activity: return _("Activity");
75 case icqconf::sort_by_name: return _("Name");
78 return "";
81 bool icqface::sprofmanager(string &name, string &act) {
82 dialogbox db;
83 string buf, tname;
84 bool finished, r;
85 int n, b, dx, dy;
87 map<string, imsearchparams> profiles;
88 map<string, imsearchparams>::iterator ip;
90 string pfname = conf.getconfigfname("search-profiles");
92 ifstream f(pfname.c_str());
94 if(f.is_open()) {
95 while(!f.eof()) {
96 getstring(f, buf);
97 tname = getword(buf, "\t");
99 if(!tname.empty())
100 profiles[tname] = imsearchparams(tname);
103 f.close();
106 dx = (COLS-sizeDlg.width)/2+sizeDlg.width;
107 dy = (LINES-sizeDlg.height)/2+sizeDlg.height;
109 db.setwindow(new textwindow(dx-(int) (sizeDlg.width*0.6), dy-(int) (sizeDlg.height*0.6),
110 dx, dy, conf.getcolor(cp_dialog_frame), 0, conf.getcolor(cp_dialog_highlight),
111 _(" Search profiles ")));
113 db.setmenu(new verticalmenu(conf.getcolor(cp_dialog_text),
114 conf.getcolor(cp_dialog_selected)));
116 db.setbar(new horizontalbar(conf.getcolor(cp_dialog_text),
117 conf.getcolor(cp_dialog_selected), _("Remove"), _("Load"), (char*)0));
119 db.addkey(KEY_DC, 0);
121 db.addautokeys();
122 db.idle = &dialogidle;
123 verticalmenu &m = *db.getmenu();
124 db.getbar()->item = 1;
126 finished = r = false;
128 while(!finished) {
129 m.clear();
131 for(ip = profiles.begin(); ip != profiles.end(); ++ip) {
132 m.additemf(0, (void *) ip->first.c_str(), " %s: %s",
133 conf.getprotocolname(ip->second.pname).c_str(),
134 ip->first.c_str());
137 finished = !db.open(n, b);
139 if(!finished) {
140 if(!profiles.empty()) {
141 tname = (char *) m.getref(n-1);
142 ip = profiles.find(tname);
143 } else {
144 ip = profiles.end();
147 switch(b) {
148 case 0:
149 if(ip != profiles.end())
150 profiles.erase(ip);
151 break;
153 case 1:
154 if(ip != profiles.end()) {
155 finished = r = true;
156 name = tname;
157 act = "load";
159 break;
164 db.close();
166 unlink(conf.getconfigfname("search-profiles").c_str());
168 for(ip = profiles.begin(); ip != profiles.end(); ++ip) {
169 ip->second.save(ip->first);
172 return r;
175 bool icqface::finddialog(imsearchparams &s, findsubject subj) {
176 int n, b, i;
177 //Not used - int nuin, ninfo, nloc, nwork, nonl;
178 bool finished, ret, proceed;
179 dialogbox db;
181 vector<protocolname> penabled;
182 vector<protocolname>::iterator ipname, ipfname;
184 vector<string> services;
185 vector<string>::iterator iservice;
187 string tname, act;
188 imsearchparams ts;
190 if(subj != fsrss) {
191 for(protocolname apname = icq; apname != protocolname_size; apname++) {
192 if(subj == fschannel)
193 if(!gethook(apname).getCapabs().count(hookcapab::conferencing))
194 continue;
196 if(gethook(apname).logged() || apname == infocard) {
197 penabled.push_back(apname);
201 if(penabled.empty()) {
202 log(_("+ you must be logged in first"));
203 return false;
206 if((ipname = find(penabled.begin(), penabled.end(), s.pname)) == penabled.end()) {
207 ipname = penabled.begin();
208 s.pname = *ipname;
212 blockmainscreen();
213 finished = ret = false;
215 db.setwindow(new textwindow(0, 0, sizeDlg.width, sizeDlg.height,
216 conf.getcolor(cp_dialog_frame), TW_CENTERED));
218 db.settree(new treeview(conf.getcolor(cp_dialog_text),
219 conf.getcolor(cp_dialog_selected),
220 conf.getcolor(cp_dialog_highlight),
221 conf.getcolor(cp_dialog_text)));
223 switch(subj) {
224 case fsuser:
225 db.setbar(new horizontalbar(conf.getcolor(cp_dialog_text), conf.getcolor(cp_dialog_selected),
226 _("lOad"), _("sAve"), _("cLear"), _("Change"), _("Search/Add"), (char*)0));
227 break;
229 case fschannel:
230 db.setbar(new horizontalbar(conf.getcolor(cp_dialog_text), conf.getcolor(cp_dialog_selected),
231 _("cLear"), _("Change"), _("Join/Create"), (char*)0));
232 break;
234 case fsrss:
235 db.setbar(new horizontalbar(conf.getcolor(cp_dialog_text), conf.getcolor(cp_dialog_selected),
236 _("cLear"), _("Change"), _("lInk"), (char*)0));
237 break;
240 struct {
241 char *title;
242 int item;
244 } dlgparam[fs_size] = {
245 { _(" Find/add user(s) "), 3 },
246 { _(" Join/create a channel/conference "), 1 },
247 { _(" Link an RSS feed "), 1 }
251 db.getwindow()->set_title(conf.getcolor(cp_dialog_highlight), dlgparam[subj].title);
252 db.getbar()->item = dlgparam[subj].item;
254 db.addautokeys();
255 db.idle = &dialogidle;
256 treeview &tree = *db.gettree();
258 bool protchanged = true;
260 while(!finished) {
261 tree.clear();
263 if(protchanged) {
264 switch(subj) {
265 case fsuser:
266 services = gethook(s.pname).getservices(servicetype::search);
268 if((iservice = find(services.begin(), services.end(), s.service)) == services.end())
269 s.service = "";
271 if(s.service.empty())
272 if((iservice = services.begin()) != services.end()) {
273 s.service = *iservice;
274 s.flexparams = gethook(s.pname).getsearchparameters(s.service);
276 break;
278 case fschannel:
279 services = gethook(s.pname).getservices(servicetype::groupchat);
281 if((iservice = find(services.begin(), services.end(), s.service)) == services.end())
282 s.service = "";
284 if(s.service.empty())
285 if((iservice = services.begin()) != services.end()) {
286 s.service = *iservice;
287 s.flexparams = gethook(s.pname).getsearchparameters(s.service);
289 break;
292 protchanged = false;
295 if(subj != fsrss) {
296 i = tree.addnode(_(" Network "));
297 tree.addleaf(i, 0, 1, " " + conf.getprotocolname(s.pname) + " ");
300 if(subj != fschannel)
301 switch(s.pname) {
302 case icq:
303 case gadu:
304 i = tree.addnode(_(" UIN "));
305 tree.addleaff(i, 0, 10, " %s ", strint(s.uin));
307 if(!s.uin && !s.randomgroup && s.kwords.empty()) {
308 i = tree.addnode(_(" Details "));
309 tree.addleaff(i, 0, 11, _(" Nickname : %s "), s.nick.c_str());
311 if(s.pname == icq) {
312 tree.addleaff(i, 0, 12, _(" E-Mail : %s "), s.email.c_str());
315 tree.addleaff(i, 0, 13, _(" First name : %s "), s.firstname.c_str());
316 tree.addleaff(i, 0, 14, _(" Last name : %s "), s.lastname.c_str());
318 if(s.pname == icq) {
319 tree.addleaff(i, 0, 15, _(" Age range : %s "), stragerange(s.agerange));
322 tree.addleaff(i, 0, 17, _(" Gender : %s "), strgender(s.gender));
324 if(s.pname == icq) {
325 tree.addleaff(i, 0, 18, _(" Language : %s "),
326 abstracthook::getLanguageIDtoString(s.language).c_str());
329 i = tree.addnode(_(" Location "));
330 tree.addleaff(i, 0, 19, _(" City : %s "), s.city.c_str());
332 if(s.pname == icq) {
333 tree.addleaff(i, 0, 20, _(" State : %s "), s.state.c_str());
334 tree.addleaff(i, 0, 21, _(" Country : %s "),
335 abstracthook::getCountryIDtoString(s.country).c_str());
337 i = tree.addnode(_(" Work "));
338 tree.addleaff(i, 0, 22, _(" Company : %s "), s.company.c_str());
339 tree.addleaff(i, 0, 23, _(" Department : %s "), s.department.c_str());
340 tree.addleaff(i, 0, 24, _(" Position : %s "), s.position.c_str());
343 i = tree.addnode(_(" Online only "));
344 tree.addleaff(i, 0, 25, " %s ", stryesno(s.onlineonly));
347 if(s.pname == icq) {
348 if(!s.uin && s.kwords.empty()) {
349 i = tree.addnode(_(" Random chat group "));
350 tree.addleaff(i, 0, 28, " %s ", strrandomgroup(s.randomgroup));
353 if(!s.uin && !s.randomgroup) {
354 i = tree.addnode(_(" Keywords "));
355 tree.addleaff(i, 0, 29, " %s ", s.kwords.c_str());
358 break;
360 default:
361 if((s.pname == msn && !s.reverse)
362 || (s.pname != msn)) {
363 i = tree.addnode(_(" Nickname "));
364 tree.addleaf(i, 0, 11, " " + s.nick + " ");
367 if(s.pname == jabber)
368 if(s.nick.empty() && !services.empty()) {
369 i = tree.addnode(_(" Search service "));
370 tree.addleaff(i, 0, 31, " %s ", s.service.c_str());
372 i = tree.addnode(_(" Search parameters "));
374 int id = 100;
375 vector<pair<string, string> >::const_iterator
376 ifp = s.flexparams.begin();
378 while(ifp != s.flexparams.end()) {
379 tree.addleaff(i, 0, id++, " %s : %s ",
380 ifp->first.c_str(), ifp->second.c_str());
381 ++ifp;
384 break;
387 if(subj == fsrss) {
388 i = tree.addnode(_(" Feed Parameters "));
389 tree.addleaff(i, 0, 33, _(" XML export URL : %s "), s.url.c_str());
390 tree.addleaff(i, 0, 34, _(" Check frequency (minutes) : %lu "), s.checkfrequency);
393 if((subj == fsuser) && s.pname == irc && s.nick.empty()) {
394 i = tree.addnode(_(" Details "));
395 tree.addleaff(i, 0, 26, _(" Channel : %s "), s.room.c_str());
397 if(!s.room.empty()) {
398 tree.addleaff(i, 0, 27, _(" Name : %s "), s.firstname.c_str());
401 tree.addleaff(i, 0, 12, _(" E-Mail : %s "), s.email.c_str());
403 if(!s.room.empty()) {
404 i = tree.addnode(_(" Joined since the last check only "));
405 tree.addleaff(i, 0, 16, " %s ", stryesno(s.sincelast));
409 if((subj == fsuser) && s.pname == yahoo && s.nick.empty()) {
410 i = tree.addnode(_(" Details "));
412 if(s.kwords.empty()) tree.addleaff(i, 0, 27, _(" Name : %s "), s.firstname.c_str());
413 if(s.firstname.empty()) tree.addleaff(i, 0, 29, _(" Keywords : %s "), s.kwords.c_str());
415 i = tree.addnode(_(" Options "));
417 tree.addleaff(i, 0, 17, _(" Gender : %s "), strgender(s.gender));
418 tree.addleaff(i, 0, 15, _(" Age range : %s "), stragerange(s.agerange));
419 tree.addleaff(i, 0, 35, _(" Users with photos only : %s "), stryesno(s.photo));
420 tree.addleaff(i, 0, 25, _(" Look for online only : %s "), stryesno(s.onlineonly));
423 if((subj == fsuser) && s.nick.empty()
424 && (s.pname == msn || s.pname == livejournal)) {
425 i = tree.addnode(_(" Show users who have you on their list "));
426 tree.addleaff(i, 0, 30, " %s ", stryesno(s.reverse));
429 if(subj == fschannel) {
430 i = tree.addnode(_(" Name/Title "));
431 tree.addleaf(i, 0, 11, " " + s.nick + " ");
433 if(!s.nick.empty()) {
434 if(gethook(s.pname).getCapabs().count(hookcapab::channelpasswords)) {
435 i = tree.addnode(_(" Password "));
436 tree.addleaf(i, 0, 32, " " + string(s.password.size(), '*') + " ");
439 if(gethook(s.pname).getCapabs().count(hookcapab::groupchatservices)) {
440 i = tree.addnode(_(" Service "));
441 tree.addleaf(i, 0, 31, " " + s.service + " ");
446 finished = !db.open(n, b, (void **) &i);
448 if(subj != fsuser)
449 b += 2;
451 if(!finished)
452 switch(b) {
453 case 0:
454 if(sprofmanager(tname, act)) {
455 if(act == "load") {
456 imsearchparams ts(tname);
458 if((ipfname = find(penabled.begin(), penabled.end(),
459 ts.pname)) != penabled.end()) {
460 s = ts;
461 ipname = ipfname;
462 protchanged = true;
466 break;
468 case 1:
469 tname = inputstr(_("New profile name: "));
471 if(proceed = !tname.empty())
472 if(ts.load(tname))
473 proceed = ask(_("The profile with this name already exists. Do you want to overwrite it?"),
474 ASK_YES | ASK_NO, ASK_NO) == ASK_YES;
476 if(proceed)
477 s.save(tname);
478 break;
480 case 2:
481 s = imsearchparams();
482 s.pname = *ipname;
483 protchanged = true;
484 break;
486 case 3:
487 switch(i) {
488 case 1:
489 if(++ipname == penabled.end())
490 ipname = penabled.begin();
492 if(protchanged = s.pname != *ipname) {
493 s.service = "";
494 s.flexparams.clear();
497 s.pname = *ipname;
498 break;
500 case 10: s.uin = atol(inputstr(_("UIN: "), strint(s.uin)).c_str()); break;
501 case 11: s.nick = inputstr(subj != fschannel ? _("Nickname: ") : _("Name/Title: "), s.nick); break;
502 case 12: s.email = inputstr(_("E-Mail: "), s.email); break;
503 case 13: s.firstname = inputstr(_("First name: "), s.firstname); break;
504 case 14: s.lastname = inputstr(_("Last name: "), s.lastname); break;
505 case 15: selectagerange(s.agerange); break;
506 case 16: s.sincelast = !s.sincelast; break;
507 case 17: selectgender(s.gender); break;
508 case 18: selectlanguage(s.language); break;
509 case 19: s.city = inputstr(_("City: "), s.city); break;
510 case 20: s.state = inputstr(_("State: "), s.state); break;
511 case 21: selectcountry(s.country); break;
512 case 22: s.company = inputstr(_("Company: "), s.company); break;
513 case 23: s.department = inputstr(_("Department: "), s.department); break;
514 case 24: s.position = inputstr(_("Position: "), s.position); break;
515 case 25: s.onlineonly = !s.onlineonly; break;
516 case 26: s.room = inputstr(_("Channel: "), s.room); break;
517 case 27: s.firstname = inputstr(_("Name: "), s.firstname); break;
518 case 28: selectrandomgroup(s.randomgroup); break;
519 case 29: s.kwords = inputstr(_("Keywords: "), s.kwords); break;
520 case 30: s.reverse = !s.reverse; break;
521 case 31:
522 if(services.size()) {
523 if(++iservice == services.end())
524 iservice = services.begin();
525 s.service = *iservice;
526 s.flexparams = gethook(s.pname).getsearchparameters(s.service);
528 break;
529 case 32: s.password = inputstr(_("Password: "), s.password, '*'); break;
530 case 33: s.url = inputstr(_("URL: "), s.url); break;
531 case 34: s.checkfrequency = atol(inputstr(_("Check frequency: "), strint(s.checkfrequency)).c_str()); break;
532 case 35: s.photo = !s.photo;
535 if(i >= 100) {
536 vector<pair<string, string> >::iterator ifp = s.flexparams.begin()+i-100;
537 ifp->second = inputstr(ifp->first + ": ", ifp->second);
539 break;
541 case 4:
542 if ((s.pname == jabber) && ((s.service.empty() && (s.nick.find("@") == -1)) || (s.nick.empty() && s.flexparams.empty()))) {
543 status(_("Wrong Jabber ID!"));
544 } else {
545 ret = finished = true;
547 break;
551 db.close();
552 unblockmainscreen();
554 return ret;
557 #define CHECKGENERAL if(!i) i = tree->addnode(_(" General "));
559 void icqface::gendetails(treeview *tree, icqcontact *c) {
560 int saveitem, savefirst, i;
562 if(!c) c = clist.get(contactroot);
564 icqcontact::basicinfo bi = c->getbasicinfo();
565 icqcontact::moreinfo mi = c->getmoreinfo();
566 icqcontact::workinfo wi = c->getworkinfo();
567 icqcontact::reginfo ri = c->getreginfo();
569 string about = c->getabout();
570 bool ourdetails = c->getdesc() == contactroot;
572 abstracthook &h = gethook(passinfo.pname);
573 set<hookcapab::enumeration> capab = h.getCapabs();
575 tree->menu.getpos(saveitem, savefirst);
576 tree->clear();
578 i = 0;
580 if(capab.count(hookcapab::flexiblereg) && ourdetails) {
581 if(ri.service.empty()) {
582 vector<string> servs = h.getservices(servicetype::registration);
583 if(!servs.empty()) ri.service = servs[0]; else return;
586 if(ri.params.empty()) {
587 ri.params = h.getregparameters(ri.service);
590 c->setreginfo(ri);
592 i = tree->addnode(_(" Registration service "));
593 tree->addleaff(i, 0, 46, " %s ", ri.service.c_str());
595 if(!ri.params.empty()) {
596 i = tree->addnode(_(" Registration parameters "));
598 vector<pair<string, string> >::const_iterator ir = ri.params.begin();
600 while(ir != ri.params.end()) {
601 tree->addleaff(i, 0, 100+(ir-ri.params.begin()), " %s : %s ",
602 ir->first.c_str(), ir->second.c_str());
603 ++ir;
607 i = 0;
611 if(passinfo.pname == infocard || capab.count(hookcapab::changenick) || !ourdetails)
612 if((capab.count(hookcapab::flexiblereg) && ri.params.empty()) || !capab.count(hookcapab::flexiblereg)) {
613 CHECKGENERAL;
614 tree->addleaff(i, 0, 10, _(" Nickname : %s "), c->getnick().c_str());
617 if(capab.count(hookcapab::changepassword) && ourdetails) {
618 CHECKGENERAL;
619 tree->addleaff(i, 0, 47, _(" Change password : %s "),
620 string(ri.password.size(), '*').c_str());
623 if(passinfo.pname != rss)
624 if(passinfo.pname == icq && c->getdesc() == contactroot || !ourdetails ||
625 (ourdetails && capab.count(hookcapab::flexiblereg) && ri.params.empty())) {
626 CHECKGENERAL;
628 tree->addleaff(i, 0, 11, _(" First name : %s "), bi.fname.c_str());
629 tree->addleaff(i, 0, 12, _(" Last name : %s "), bi.lname.c_str());
630 tree->addleaff(i, 0, 13, _(" E-mail : %s "), bi.email.c_str());
632 tree->addleaff(i, 0, 14, _(" Gender : %s "), strgender(mi.gender));
633 tree->addleaff(i, 0, 15, _(" Birthdate : %s "), mi.strbirthdate().c_str());
634 tree->addleaff(i, 0, 16, _(" Age : %s "), strint(mi.age));
636 i = tree->addnode(_(" Home "));
637 tree->addleaff(i, 0, 17, _(" City : %s "), bi.city.c_str());
638 tree->addleaff(i, 0, 18, _(" State : %s "), bi.state.c_str());
639 tree->addleaff(i, 0, 19, _(" Country : %s "),
640 abstracthook::getCountryIDtoString(bi.country).c_str());
642 tree->addleaff(i, 0, 20, _(" Street address : %s "), bi.street.c_str());
643 tree->addleaff(i, 0, 21, _(" Zip code : %s "), bi.zip.c_str());
644 tree->addleaff(i, 0, 22, _(" Phone : %s "), bi.phone.c_str());
645 tree->addleaff(i, 0, 23, _(" Fax : %s "), bi.fax.c_str());
646 tree->addleaff(i, 0, 24, _(" Cellular phone : %s "), bi.cellular.c_str());
648 i = tree->addnode(_(" Work "));
649 tree->addleaff(i, 0, 25, _(" City : %s "), wi.city.c_str());
650 tree->addleaff(i, 0, 26, _(" State : %s "), wi.state.c_str());
651 tree->addleaff(i, 0, 27, _(" Country : %s "),
652 abstracthook::getCountryIDtoString(wi.country).c_str());
654 tree->addleaff(i, 0, 28, _(" Street address : %s "), wi.street.c_str());
655 tree->addleaff(i, 0, 41, _(" Zip code : %s "), wi.zip.c_str());
656 tree->addleaff(i, 0, 29, _(" Company : %s "), wi.company.c_str());
657 tree->addleaff(i, 0, 30, _(" Department : %s "), wi.dept.c_str());
658 tree->addleaff(i, 0, 31, _(" Position : %s "), wi.position.c_str());
659 tree->addleaff(i, 0, 32, _(" Homepage : %s "), wi.homepage.c_str());
660 tree->addleaff(i, 0, 33, _(" Phone : %s "), wi.phone.c_str());
661 tree->addleaff(i, 0, 34, _(" Fax : %s "), wi.fax.c_str());
663 i = tree->addnode(_(" More "));
664 tree->addleaff(i, 0, 35, _(" Homepage : %s "), mi.homepage.c_str());
666 if(passinfo.pname == icq) {
667 tree->addleaff(i, 0, 36, _(" 1st language : %s "),
668 abstracthook::getLanguageIDtoString(mi.lang1).c_str());
670 tree->addleaff(i, 0, 37, _(" 2nd language : %s "),
671 abstracthook::getLanguageIDtoString(mi.lang2).c_str());
673 tree->addleaff(i, 0, 38, _(" 3rd language : %s "),
674 abstracthook::getLanguageIDtoString(mi.lang3).c_str());
676 i = tree->addnode(_(" Miscellaneous "));
677 if(ourdetails) {
678 tree->addleaff(i, 0, 43, _(" Enable web status indicator : %s "), stryesno(bi.webaware));
679 tree->addleaff(i, 0, 42, _(" Random chat group : %s "), strrandomgroup(bi.randomgroup));
680 } else {
681 tree->addleaff(i, 0, 44, _(" Authorization required : %s "), stryesno(bi.requiresauth));
684 } else if(passinfo.pname == gadu) {
685 CHECKGENERAL;
687 tree->addleaff(i, 0, 11, _(" First name : %s "), bi.fname.c_str());
688 tree->addleaff(i, 0, 12, _(" Last name : %s "), bi.lname.c_str());
689 tree->addleaff(i, 0, 17, _(" City : %s "), bi.city.c_str());
690 tree->addleaff(i, 0, 14, _(" Gender : %s "), strgender(mi.gender));
693 if(passinfo.pname == rss) {
694 i = tree->addnode(_(" Feed Parameters "));
695 tree->addleaff(i, 0, 48, _(" XML export URL : %s "), wi.homepage.c_str());
696 tree->addleaff(i, 0, 49, _(" Check frequency (minutes) : %lu "), mi.checkfreq);
699 if(capab.count(hookcapab::changeabout))
700 if((capab.count(hookcapab::flexiblereg) && ri.params.empty()) || !capab.count(hookcapab::flexiblereg)) {
701 i = tree->addnode(_(" About "));
702 tree->addleaff(i, 0, 39, " %s ", about.c_str());
705 tree->menu.setpos(saveitem, savefirst);
708 bool icqface::updatedetails(icqcontact *c, protocolname upname) {
709 string about, tmp;
710 icqcontact::basicinfo bi;
711 icqcontact::workinfo wi;
712 icqcontact::moreinfo mi;
713 icqcontact::reginfo ri;
714 bool finished = false, ret = false, msb;
715 int n, b, citem;
716 dialogbox db;
718 if(!c) {
719 status(_("Fetching your details"));
720 c = clist.get(contactroot);
723 if(!(msb = mainscreenblock)) {
724 blockmainscreen();
727 passinfo.pname = upname;
729 textwindow w(0, 0, sizeDlg.width, sizeDlg.height,
730 conf.getcolor(cp_dialog_frame), TW_CENTERED);
732 if(c->getdesc() == contactroot) {
733 w.set_titlef(conf.getcolor(cp_dialog_highlight), _(" Your %s details "),
734 conf.getprotocolname(upname).c_str());
735 } else {
736 w.set_titlef(conf.getcolor(cp_dialog_highlight), _(" %s: details "),
737 c->getdesc().totext().c_str());
740 detailsfetched = (c->getdesc() != contactroot);
742 db.setwindow(&w, false);
744 db.settree(new treeview(conf.getcolor(cp_dialog_text),
745 conf.getcolor(cp_dialog_selected), conf.getcolor(cp_dialog_highlight),
746 conf.getcolor(cp_dialog_text)));
748 db.setbar(new horizontalbar(conf.getcolor(cp_dialog_text),
749 conf.getcolor(cp_dialog_selected), _("Change"), _("Done"), (char*)0));
751 db.idle = &detailsidle;
752 db.addautokeys();
754 while(!finished) {
755 gendetails(db.gettree(), c);
756 finished = !db.open(n, b, (void **) &citem);
757 if(finished) continue;
759 bi = c->getbasicinfo();
760 mi = c->getmoreinfo();
761 wi = c->getworkinfo();
762 ri = c->getreginfo();
763 about = c->getabout();
765 if(!b) {
766 if((c->getdesc() == contactroot) && !c->updated()) {
767 status(_("Wait a moment. Your details haven't been fetched yet"));
768 continue;
769 } else
770 switch(citem) {
771 case 10:
772 c->setnick(inputstr(_("Nickname: "), c->getnick()));
773 switch(c->getdesc().pname) {
774 case infocard:
775 case livejournal:
776 case rss:
777 c->setdispnick(c->getnick());
778 break;
780 break;
781 case 11: bi.fname = inputstr(_("First name: "), bi.fname); break;
782 case 12: bi.lname = inputstr(_("Last name: "), bi.lname); break;
783 case 13: bi.email = inputstr(_("E-mail: "), bi.email); break;
784 case 14: selectgender(mi.gender); break;
785 case 15:
786 if(mi.birth_day || mi.birth_month || mi.birth_year) {
787 tmp = i2str(mi.birth_day) + "-" +
788 i2str(mi.birth_month) + "-" +
789 i2str(mi.birth_year);
790 } else {
791 tmp = "";
794 tmp = inputstr(_("Enter birthdate (DD-MM-YYYY): "), tmp);
796 if(tmp.size()) {
797 int d, m, y;
798 sscanf(tmp.c_str(), "%d-%d-%d", &d, &m, &y);
800 if(y >= 1900)
801 if((d > 0) && (d <= 31))
802 if((m > 0) && (m <= 12)) {
803 mi.birth_day = d;
804 mi.birth_month = m;
805 mi.birth_year = y;
807 } else {
808 mi.birth_day = mi.birth_month = mi.birth_year = 0;
810 break;
812 case 16: mi.age = atoi(inputstr(_("Age: "), strint(mi.age)).c_str()); break;
814 case 17: bi.city = inputstr(_("City: "), bi.city); break;
815 case 18: bi.state = inputstr(_("State: "), bi.state); break;
816 case 19: selectcountry(bi.country); break;
817 case 20: bi.street = inputstr(_("Street address: "), bi.street); break;
818 case 21: bi.zip = inputstr(_("Zip code: "), bi.zip); break;
819 case 22: bi.phone = inputstr(_("Phone: "), bi.phone); break;
820 case 23: bi.fax = inputstr(_("Fax: "), bi.fax); break;
821 case 24: bi.cellular = inputstr(_("Cellular phone: "), bi.cellular); break;
823 case 25: wi.city = inputstr(_("City: "), wi.city); break;
824 case 26: wi.state = inputstr(_("State: "), wi.state); break;
825 case 27: selectcountry(wi.country); break;
826 case 28: wi.street = inputstr(_("Street address: "), wi.street); break;
827 case 29: wi.company = inputstr(_("Company: "), wi.company); break;
828 case 30: wi.dept = inputstr(_("Department: "), wi.dept); break;
829 case 31: wi.position = inputstr(_("Position: "), wi.position); break;
830 case 32: wi.homepage = inputstr(_("Homepage: "), wi.homepage); break;
831 case 33: wi.phone = inputstr(_("Phone: "), wi.phone); break;
832 case 34: wi.fax = inputstr(_("Fax: "), wi.fax); break;
834 case 35: mi.homepage = inputstr(_("Homepage: "), mi.homepage); break;
836 case 36: selectlanguage(mi.lang1); break;
837 case 37: selectlanguage(mi.lang2); break;
838 case 38: selectlanguage(mi.lang3); break;
840 case 39: edit(about, _("About")); break;
841 case 40: bi.requiresauth = !bi.requiresauth; break;
842 case 41: wi.zip = inputstr(_("Zip code: "), wi.zip); break;
843 case 42: selectrandomgroup(bi.randomgroup); break;
844 case 43: bi.webaware = !bi.webaware; break;
845 case 44: bi.requiresauth = !bi.requiresauth; break;
846 case 46: {
847 abstracthook &h = gethook(passinfo.pname);
848 vector<string> servs = h.getservices(servicetype::registration);
849 vector<string>::const_iterator is = find(servs.begin(), servs.end(), ri.service);
851 if(is != servs.end()) {
852 if(++is == servs.end()) is = servs.begin();
853 if(*is != ri.service) {
854 ri.service = *is;
855 ri.params.clear();
859 } break;
860 case 47:
861 ri.password = inputstr(_("New password: "), ri.password, '*');
863 if(!ri.password.empty())
864 if(inputstr(_("Check the new password: "), "", '*') != ri.password)
865 ri.password = "";
866 break;
867 case 48: wi.homepage = inputstr(_("URL: "), wi.homepage); break;
868 case 49: mi.checkfreq = atol(inputstr(_("Check frequency: "), strint(mi.checkfreq)).c_str()); break;
869 default:
870 if(citem >= 100) {
871 vector<pair<string, string> >::iterator ifp = ri.params.begin()+citem-100;
872 ifp->second = inputstr(ifp->first + ": ", ifp->second);
874 break;
877 c->setbasicinfo(bi);
878 c->setmoreinfo(mi);
879 c->setworkinfo(wi);
880 c->setreginfo(ri);
881 c->setabout(about);
882 } else {
883 ret = (c->getdesc() != contactroot) || c->updated();
884 finished = true;
888 db.close();
890 if(!msb) {
891 unblockmainscreen();
894 return ret;
897 void icqface::selectcountry(unsigned short &f) {
898 int i;
900 verticalmenu m(conf.getcolor(cp_dialog_menu), conf.getcolor(cp_dialog_selected));
901 m.setwindow(textwindow(4, LINES-16, 30, LINES-3, conf.getcolor(cp_dialog_menu)));
902 m.idle = &menuidle;
904 for(i = 0; i < abstracthook::Country_table_size; i++) {
905 m.additem(0, (int) abstracthook::Country_table[i].code,
906 (string) " " + abstracthook::Country_table[i].name);
908 if(abstracthook::Country_table[i].code == f) {
909 m.setpos(i);
913 i = m.open();
914 m.close();
916 if(i) f = (unsigned short) ((intptr_t) m.getref(i-1));
919 void icqface::selectlanguage(unsigned short &f) {
920 int i;
921 verticalmenu m(conf.getcolor(cp_dialog_menu), conf.getcolor(cp_dialog_selected));
922 m.setwindow(textwindow(4, LINES-13, 20, LINES-4, conf.getcolor(cp_dialog_menu)));
923 m.idle = &menuidle;
925 for(i = 0; i < abstracthook::Language_table_size; i++) {
926 m.additemf(" %s", abstracthook::Language_table[i]);
929 m.setpos(f);
930 i = m.open();
931 m.close();
933 if(i) f = i-1;
936 void icqface::selectrandomgroup(unsigned short &f) {
937 int i;
938 verticalmenu m(conf.getcolor(cp_dialog_menu), conf.getcolor(cp_dialog_selected));
939 m.setwindow(textwindow(4, LINES-15, 20, LINES-3, conf.getcolor(cp_dialog_menu)));
940 m.idle = &menuidle;
942 m.additemf(" %s", _("none"));
944 for(i = 1; i <= ((int) ICQ2000::GROUP_SEEKINGMEN); i++) {
945 m.additemf(" %s", strrandomgroup(i));
948 m.setpos(f);
949 i = m.open();
950 m.close();
952 if(i) f = i-1;
955 void icqface::selectgender(imgender &f) {
956 verticalmenu m(conf.getcolor(cp_dialog_menu), conf.getcolor(cp_dialog_selected));
957 m.setwindow(textwindow(4, LINES-8, 20, LINES-4, conf.getcolor(cp_dialog_menu)));
958 m.idle = &menuidle;
960 for(imgender i = genderUnspec; i != imgender_size; i++) {
961 m.additemf(0, (int) i, " %s", strgender(i));
962 if(i == f) m.setpos(m.getcount()-1);
965 int i = m.open();
966 m.close();
968 if(i) f = (imgender) ((intptr_t) m.getref(i-1));
971 void icqface::selectagerange(ICQ2000::AgeRange &r) {
972 verticalmenu m(conf.getcolor(cp_dialog_menu), conf.getcolor(cp_dialog_selected));
973 m.setwindow(textwindow(4, LINES-8, 18, LINES-3, conf.getcolor(cp_dialog_menu)));
974 m.idle = &menuidle;
976 for(ICQ2000::AgeRange i = ICQ2000::RANGE_NORANGE; i <= ICQ2000::RANGE_60_ABOVE; i = ICQ2000::AgeRange(i+1)) {
977 const char *p = stragerange(i);
979 if(i == ICQ2000::RANGE_NORANGE)
980 p = _("none");
982 m.additemf(0, (int) i, " %s", p);
983 if(i == r) m.setpos(m.getcount()-1);
986 int i = m.open();
987 m.close();
989 if(i) r = (ICQ2000::AgeRange) ((intptr_t) m.getref(i-1));
992 bool icqface::edit(string &txt, const string &header) {
993 bool msb = mainscreenblock;
994 if(!msb) blockmainscreen();
996 texteditor se;
997 textwindow w(0, 0, sizeDlg.width, sizeDlg.height, conf.getcolor(cp_dialog_frame), TW_CENTERED);
998 w.set_title(conf.getcolor(cp_dialog_highlight), (string) " " + header + _(" [Ctrl-X save, Esc cancel] "));
999 w.open();
1001 editdone = false;
1002 se.setcoords(w.x1+1, w.y1+1, w.x2, w.y2);
1003 se.addscheme(cp_dialog_text, cp_dialog_text, 0, 0);
1004 se.idle = &editidle;
1005 se.otherkeys = &editaboutkeys;
1006 se.wrap = true;
1007 se.smarttab = false;
1009 se.load(txt, "");
1010 se.open();
1012 if(editdone) {
1013 char *ctext = se.save("\r\n");
1014 txt = ctext;
1015 delete ctext;
1018 w.close();
1019 if(!msb) unblockmainscreen();
1021 return editdone;
1024 bool icqface::sendfiles(const imcontact &cinfo, string &msg, linkedlist &flist) {
1025 int n, i, b;
1026 bool finished = false;
1027 string fname;
1028 dialogbox db;
1030 flist.freeitem = &charpointerfree;
1031 flist.empty();
1033 blockmainscreen();
1035 textwindow w(0, 0, sizeDlg.width, sizeDlg.height, conf.getcolor(cp_dialog_frame), TW_CENTERED);
1037 w.set_titlef(conf.getcolor(cp_dialog_highlight),
1038 _(" Send file(s) to %s, %lu "),
1039 clist.get(cinfo)->getdispnick().c_str(), cinfo.uin);
1041 db.setwindow(&w, false);
1042 db.settree(new treeview(conf.getcolor(cp_dialog_text),
1043 conf.getcolor(cp_dialog_selected), conf.getcolor(cp_dialog_highlight),
1044 conf.getcolor(cp_dialog_text)));
1046 db.setbar(new horizontalbar(conf.getcolor(cp_dialog_text),
1047 conf.getcolor(cp_dialog_selected),
1048 _("Add"), _("Remove"), _("Comment"), _("Send"), (char*)0));
1050 db.addkey(KEY_IC, 0);
1051 db.addkey(KEY_DC, 1);
1052 db.addautokeys();
1053 db.idle = &dialogidle;
1055 while(!finished) {
1056 db.gettree()->clear();
1058 int nfiles = db.gettree()->addnode(_(" Files "));
1059 int ncomment = db.gettree()->addnode(_(" Comment "));
1061 for(i = 0; i < flist.count; i++)
1062 db.gettree()->addleaf(nfiles, 0, 0, " " +
1063 justfname((char *) flist.at(i)) + " ");
1065 db.gettree()->addleaf(ncomment, 0, 0, " " + msg + " ");
1066 finished = !db.open(n, b);
1068 if(!finished)
1069 switch(b) {
1070 case 0:
1071 fname = inputfile(_("filename: "));
1072 if(fname.size()) flist.add(strdup(fname.c_str()));
1073 break;
1074 case 1:
1075 flist.remove(n-2);
1076 break;
1077 case 2:
1078 msg = inputstr(_("comment: "), msg);
1079 break;
1080 case 3:
1081 finished = true;
1082 break;
1083 } else {
1084 flist.empty();
1088 db.close();
1089 unblockmainscreen();
1090 return flist.count;
1093 void icqface::multichange(bool conv[], bool newstate) {
1094 protocolname pname;
1096 for(pname = icq; pname != protocolname_size; pname++)
1097 if((!conf.getourid(pname).empty() || pname == rss) && conv[pname]) break;
1099 if(pname == protocolname_size || !newstate) {
1100 for(pname = icq; pname != protocolname_size; pname++)
1101 if(!conf.getourid(pname).empty() || pname == rss)
1102 conv[pname] = newstate;
1106 bool icqface::updateconf(icqconf::regsound &s, icqconf::regcolor &c) {
1107 bool finished, success, hasany;
1108 int nopt, n, i, b, aaway, ana;
1109 bool needredraw = false;
1110 protocolname pname;
1111 string tmp, phidden;
1113 string smtp = conf.getsmtphost() + ":" + i2str(conf.getsmtpport());
1114 string browser = conf.getbrowser();
1115 string screensocketpath = conf.getscreensocketpath();
1117 bool screenna = conf.getscreenna();
1118 bool quote = conf.getquote();
1119 bool savepwd = conf.getsavepwd();
1120 bool hideoffl = conf.gethideoffline();
1121 bool antispam = conf.getantispam();
1122 bool dropauthreq = conf.getdropauthreq();
1123 bool usingcaptcha = conf.getusingcaptcha();
1124 bool mailcheck = conf.getmailcheck();
1125 bool makelog = conf.getmakelog();
1126 bool askaway = conf.getaskaway();
1127 bool bidi = conf.getbidi();
1128 bool askquit = conf.getaskquit();
1129 bool emacs = conf.getemacs();
1130 bool proxyconnect = conf.getproxyconnect();
1131 bool timestampstothesecond = conf.gettimestampstothesecond();
1132 bool logtimestamps, logonline;
1133 conf.getlogoptions(logtimestamps, logonline);
1135 int ptpmin, ptpmax;
1136 conf.getpeertopeer(ptpmin, ptpmax);
1137 bool ptp = ptpmax;
1139 string httpproxy;
1140 if (!conf.gethttpproxyuser().empty()) {
1141 httpproxy = conf.gethttpproxyuser();
1142 if(!httpproxy.empty())
1143 httpproxy += ":" + conf.gethttpproxypasswd() + "@" + conf.gethttpproxyhost() + ":" + i2str(conf.gethttpproxyport());
1144 } else {
1145 httpproxy = conf.gethttpproxyhost();
1146 if(!httpproxy.empty())
1147 httpproxy += ":" + i2str(conf.gethttpproxyport());
1150 vector<string> convlanguages;
1151 convlanguages.push_back(_("None"));
1152 convlanguages.push_back(_("Russian"));
1153 convlanguages.push_back(_("Polish"));
1154 convlanguages.push_back(_("German UTF-8"));
1155 vector<string>::const_iterator iconvlang = convlanguages.begin();
1157 string convertfrom = conf.getconvertfrom();
1158 string convertto = conf.getconvertto();
1160 icqconf::groupmode gmode = conf.getgroupmode();
1161 icqconf::colormode cm = conf.getcolormode();
1162 icqconf::sortmode smode = conf.getsortmode();
1164 bool chatmode[protocolname_size], conv[protocolname_size],
1165 entersends[protocolname_size], nonimonline[protocolname_size];
1167 for(pname = icq; pname != protocolname_size; pname++) {
1168 chatmode[pname] = conf.getchatmode(pname);
1169 entersends[pname] = conf.getentersends(pname);
1170 conv[pname] = conf.getcpconvert(pname);
1171 nonimonline[pname] = conf.getnonimonline(pname);
1174 for(hasany = false, pname = icq; pname != protocolname_size && !hasany; pname++)
1175 hasany = !conf.getourid(pname).empty();
1177 dialogbox db;
1179 finished = success = false;
1181 conf.getauto(aaway, ana);
1183 textwindow w(0, 0, sizeBigDlg.width, sizeBigDlg.height,
1184 conf.getcolor(cp_dialog_frame), TW_CENTERED);
1186 w.set_title(conf.getcolor(cp_dialog_highlight), _(" CenterIM configuration "));
1188 db.setwindow(&w, false);
1190 db.settree(new treeview(conf.getcolor(cp_dialog_text),
1191 conf.getcolor(cp_dialog_selected), conf.getcolor(cp_dialog_highlight),
1192 conf.getcolor(cp_dialog_text)));
1194 db.setbar(new horizontalbar(conf.getcolor(cp_dialog_text),
1195 conf.getcolor(cp_dialog_selected), _("Change"), _("Done"), (char*)0));
1197 db.idle = &dialogidle;
1198 db.addautokeys();
1200 blockmainscreen();
1201 treeview &t = *db.gettree();
1203 while(!finished) {
1204 t.clear();
1206 i = t.addnode(_(" User interface "));
1207 t.addleaff(i, 0, 1, _(" Change sound device to : %s "), strregsound(s));
1208 t.addleaff(i, 0, 2, _(" Change color scheme to : %s "), strregcolor(c));
1209 t.addleaff(i, 0, 32, _(" Left panel width : %d "), conf.getleftpanelwidth());
1210 t.addleaff(i, 0, 33, _(" Log panel height : %d "), conf.getlogpanelheight());
1211 t.addleaff(i, 0, 34, _(" Chat panel height : %d "), conf.getchatpanelheight());
1213 #ifdef USE_FRIBIDI
1214 t.addleaff(i, 0, 20, _( " Enable bidirectional languages support : %s "), stryesno(bidi));
1215 #endif
1216 t.addleaff(i, 0, 23, _(" Enable emacs bindings in text editor : %s "), stryesno(emacs));
1217 t.addleaff(i, 0, 53, _(" Ask before quit : %s "), stryesno(askquit));
1219 i = t.addnode(_(" Codepages conversion "));
1221 for(tmp = "", pname = icq; pname != protocolname_size; pname++)
1222 if(conv[pname])
1223 if(!conf.getourid(pname).empty() || pname == rss)
1224 tmp += conf.getprotocolname(pname) + " ";
1226 t.addleaff(i, 0, 26, _(" Switch to language preset : %s "), iconvlang->c_str());
1227 t.addleaff(i, 0, 27, _(" Remote charset : %s "), convertfrom.c_str());
1228 t.addleaff(i, 0, 28, _(" Local charset : %s "), convertto.c_str());
1230 if(hasany) {
1231 t.addleaff(i, 0, 3, _(" For protocols : %s"), tmp.c_str());
1234 i = t.addnode(_(" Contact list "));
1235 t.addleaff(i, 0, 17, _(" Arrange contacts into groups : %s "), strgroupmode(gmode));
1236 t.addleaff(i, 0, 54, _(" Sort contacts by : %s "), strsortmode(smode));
1237 t.addleaff(i, 0, 6, _(" Hide offline users : %s "), stryesno(hideoffl));
1238 t.addleaff(i, 0, 14, _(" Anti-spam: kill msgs from users not on the list : %s "), stryesno(antispam));
1239 t.addleaff(i, 0, 51, _(" Anti-spam: ignore authorization requests: %s "), stryesno(dropauthreq));
1240 t.addleaff(i, 0, 52, _(" Anti-spam: use captcha to identify bots: %s "), stryesno(usingcaptcha));
1241 t.addleaff(i, 0, 8, _(" Quote a message on reply : %s "), stryesno(quote));
1242 t.addleaff(i, 0, 15, _(" Check the local mailbox : %s "), stryesno(mailcheck));
1243 t.addleaff(i, 0, 13, _(" Remember passwords : %s "), stryesno(savepwd));
1244 t.addleaff(i, 0, 7, _(" Edit away message on status change : %s "), stryesno(askaway));
1246 if(hasany) {
1247 for(tmp = "", pname = icq; pname != protocolname_size; pname++)
1248 if(chatmode[pname] && !conf.getourid(pname).empty())
1249 tmp += conf.getprotocolname(pname) + " ";
1251 t.addleaff(i, 0, 16, _(" Chat messaging mode for : %s"), tmp.c_str());
1253 for(tmp = "", pname = icq; pname != protocolname_size; pname++)
1254 if(entersends[pname] && !conf.getourid(pname).empty())
1255 tmp += conf.getprotocolname(pname) + " ";
1257 t.addleaff(i, 0, 25, _(" Enter key sends message for : %s"), tmp.c_str());
1259 } else {
1260 t.addleaff(i, 0, 16, _(" Chat messaging mode : %s "), stryesno(chatmode[icq]));
1261 t.addleaff(i, 0, 25, _(" Enter key sends message : %s "), stryesno(entersends[icq]));
1265 for(tmp = "", pname = icq; pname != protocolname_size; pname++)
1266 if(nonimonline[pname]) tmp += conf.getprotocolname(pname) + " ";
1268 t.addleaff(i, 0, 29, _(" Always online non-IM contacts for : %s"), tmp.c_str());
1269 t.addleaff(i, 0, 30, _(" Color contacts according to: %s "), strcolormode(cm));
1271 i = t.addnode(_(" Communications "));
1272 t.addleaff(i, 0, 19, _(" SMTP server : %s "), smtp.c_str());
1273 t.addleaff(i, 0, 31, _(" HTTP browser : %s "), browser.c_str());
1274 t.addleaff(i, 0, 24, _(" HTTP proxy server : %s "), httpproxy.c_str());
1276 if(!httpproxy.empty())
1277 t.addleaff(i, 0, 11, _(" Proxy only for HTTP (rss and lj) : %s "), stryesno(!proxyconnect));
1279 t.addleaff(i, 0, 21, _(" Enable peer-to-peer communications : %s "), stryesno(ptp));
1281 if(ptp)
1282 t.addleaff(i, 0, 22, _(" Port range to use for peer-to-peer : %s "), (i2str(ptpmin) + "-" + i2str(ptpmax)).c_str());
1284 i = t.addnode(_(" Logging "));
1285 t.addleaff(i, 0, 9, _(" Timestamps in the log window : %s "), stryesno(logtimestamps));
1286 t.addleaff(i, 0, 48, _(" Timestamps include seconds : %s "), stryesno(timestampstothesecond));
1287 t.addleaff(i, 0, 10, _(" Online/offile events in the log window : %s "), stryesno(logonline));
1288 t.addleaff(i, 0, 18, _(" Detailed IM events log in ~/.centerim/log : %s "), stryesno(makelog));
1290 i = t.addnode(_(" Auto Presence Status "));
1291 t.addleaff(i, 0, 4, _(" Automatically set Away period (min) : %d "), aaway);
1292 t.addleaff(i, 0, 5, _(" Automatically set N/A period (min) : %d "), ana);
1293 t.addleaff(i, 0, 49, _(" Automatically set N/A when screen is detached : %s "), stryesno(screenna));
1294 if (screenna)
1295 t.addleaff(i, 0, 50, _(" Screen socket path : %s "), screensocketpath.c_str());
1297 void *p;
1298 finished = !db.open(n, b, &p);
1299 i = (intptr_t) p;
1301 if(!finished)
1302 switch(b) {
1303 case 0:
1304 switch(i) {
1305 case 1:
1306 s = s == icqconf::rsdontchange ? icqconf::rscard :
1307 s == icqconf::rscard ? icqconf::rsspeaker :
1308 s == icqconf::rsspeaker ? icqconf::rsdisable :
1309 icqconf::rsdontchange;
1310 break;
1311 case 2:
1312 c = c == icqconf::rcdontchange ? icqconf::rcdark :
1313 c == icqconf::rcdark ? icqconf::rcblue :
1314 icqconf::rcdontchange;
1315 break;
1316 case 3:
1317 if(hasany) selectproto(conv, spIMplusRSS); else
1318 for(pname = icq; pname != protocolname_size; pname++)
1319 conv[pname] = !conv[pname];
1320 break;
1321 case 4:
1322 tmp = inputstr(_("Auto Away period (0 - disable): "), i2str(aaway));
1323 if(!tmp.empty()) aaway = atol(tmp.c_str());
1324 break;
1325 case 5:
1326 tmp = inputstr(_("Auto N/A period (0 - disable): "), i2str(ana));
1327 if(!tmp.empty()) ana = atol(tmp.c_str());
1328 break;
1329 case 6: hideoffl = !hideoffl; break;
1330 case 7: askaway = !askaway; break;
1331 case 8: quote = !quote; break;
1332 case 9: logtimestamps = !logtimestamps; break;
1333 case 10: logonline = !logonline; break;
1334 case 11: proxyconnect = !proxyconnect; break;
1335 case 13: savepwd = !savepwd; break;
1336 case 14: antispam = !antispam; break;
1337 case 15: mailcheck = !mailcheck; break;
1338 case 16:
1339 if(hasany) selectproto(chatmode); else
1340 for(pname = icq; pname != protocolname_size; pname++)
1341 chatmode[pname] = !chatmode[pname];
1342 break;
1344 case 17:
1345 gmode =
1346 gmode == icqconf::group1 ? icqconf::group2 :
1347 gmode == icqconf::group2 ? icqconf::nogroups :
1348 icqconf::group1;
1349 break;
1350 case 18: makelog = !makelog; break;
1351 case 19:
1352 tmp = inputstr(_("SMTP server hostname: "), smtp);
1353 if(!tmp.empty()) smtp = tmp;
1354 break;
1355 case 20: bidi = !bidi; break;
1356 case 21:
1357 ptp = !ptp;
1358 if(ptp && !ptpmax)
1359 ptpmin = 0, ptpmax = 65535;
1360 break;
1361 case 22:
1362 tmp = inputstr(_("Peer-to-peer port range (min-max): "),
1363 (i2str(ptpmin) + "-" + i2str(ptpmax)).c_str());
1365 if(tmp.size()) {
1366 int tptpmin = atoi(getword(tmp, "-").c_str());
1367 int tptpmax = atoi(tmp.c_str());
1369 if(tptpmax)
1370 if(tptpmin < tptpmax)
1371 ptpmin = tptpmin, ptpmax = tptpmax;
1373 break;
1374 case 23: emacs = !emacs; break;
1375 case 24:
1376 httpproxy = inputstr(_("HTTP proxy server hostname: "), httpproxy);
1377 break;
1378 case 25:
1379 if(hasany) selectproto(entersends); else
1380 for(pname = icq; pname != protocolname_size; pname++)
1381 entersends[pname] = !entersends[pname];
1382 break;
1383 case 26:
1384 iconvlang++;
1385 if(iconvlang == convlanguages.end())
1386 iconvlang = convlanguages.begin();
1388 switch(iconvlang-convlanguages.begin()) {
1389 case 0:
1390 convertto = convertfrom = "";
1391 // multichange(conv, false);
1392 break;
1394 case 1:
1395 convertfrom = "cp1251";
1396 convertto = "koi8-r";
1397 multichange(conv, true);
1398 break;
1400 case 2:
1401 convertfrom = "cp1250";
1402 convertto = "iso-8859-2";
1403 multichange(conv, true);
1404 break;
1406 case 3:
1407 convertfrom = "iso-8859-15";
1408 convertto = "utf-8";
1409 multichange(conv, true);
1410 break;
1412 break;
1413 case 27:
1414 convertfrom = inputstr(_("Charset to convert messages from: "), convertfrom);
1415 if(input.getlastkey() == '\r') iconvlang = convlanguages.begin();
1416 break;
1417 case 28:
1418 convertto = inputstr(_("Charset to convert messages to: "), convertto);
1419 if(input.getlastkey() == '\r') iconvlang = convlanguages.begin();
1420 break;
1421 case 29:
1422 selectproto(nonimonline, spnonIM);
1423 break;
1424 case 30:
1425 cm = (cm == icqconf::cmproto ? icqconf::cmstatus : icqconf::cmproto );
1426 break;
1427 case 31:
1428 tmp = inputstr(_("HTTP browser to use: "), browser);
1429 if(!tmp.empty()) browser = tmp;
1430 break;
1431 case 32:
1432 conf.setleftpanelwidth(atol(inputstr(_("Left panel width: "),
1433 strint(conf.getleftpanelwidth())).c_str()));
1434 needredraw = true;
1435 break;
1436 case 33:
1437 conf.setlogpanelheight(atol(inputstr(_("Log panel height: "),
1438 strint(conf.getlogpanelheight())).c_str()));
1439 needredraw = true;
1440 break;
1441 case 34:
1442 conf.setchatpanelheight(atol(inputstr(_("Chat panel height: "),
1443 strint(conf.getchatpanelheight())).c_str()));
1444 needredraw = true;
1445 break;
1447 case 48:
1448 timestampstothesecond = !timestampstothesecond; break;
1450 case 49:
1451 screenna = !screenna; break;
1452 case 50:
1453 screensocketpath = inputstr(_("Screen socket path: "), screensocketpath);
1454 if (screensocketpath.empty() || access(screensocketpath.c_str(), X_OK)) {
1455 status(_("Choosen screen socket path doesn't exist!"));
1456 screenna = false;
1458 break;
1459 case 51:
1460 dropauthreq = !dropauthreq;
1461 if (dropauthreq && usingcaptcha)
1462 usingcaptcha = false;
1463 break;
1464 case 52:
1465 usingcaptcha = !usingcaptcha;
1466 /* captcha overrides droping auth requests */
1467 if (dropauthreq && usingcaptcha)
1468 dropauthreq = false;
1469 break;
1470 case 53:
1471 askquit = !askquit;
1472 break;
1473 case 54:
1474 smode =
1475 smode == icqconf::sort_by_status_and_activity ? icqconf::sort_by_status_and_name :
1476 smode == icqconf::sort_by_status_and_name ? icqconf::sort_by_activity :
1477 smode == icqconf::sort_by_activity ? icqconf::sort_by_name :
1478 icqconf::sort_by_status_and_activity;
1479 break;
1481 break;
1482 case 1:
1483 finished = success = true;
1484 conf.setquote(quote);
1485 conf.setsavepwd(savepwd);
1486 conf.setauto(aaway, ana);
1487 conf.setscreenna(screenna);
1488 conf.setscreensocketpath(screensocketpath);
1489 conf.sethideoffline(hideoffl);
1490 conf.setemacs(emacs);
1491 conf.setantispam(antispam);
1492 conf.setdropauthreq(dropauthreq);
1493 conf.setusingcaptcha(usingcaptcha);
1494 conf.setmailcheck(mailcheck);
1495 conf.setmakelog(makelog);
1496 conf.setaskaway(askaway);
1497 conf.setproxyconnect(proxyconnect);
1498 conf.settimestampstothesecond(timestampstothesecond);
1499 conf.setcharsets(convertfrom, convertto);
1501 for(pname = icq; pname != protocolname_size; pname++) {
1502 conf.setchatmode(pname, chatmode[pname]);
1503 conf.setentersends(pname, entersends[pname]);
1504 conf.setnonimonline(pname, nonimonline[pname]);
1506 bool bconv = conv[pname] && (!convertfrom.empty() || !convertto.empty());
1507 conf.setcpconvert(pname, bconv || !hasany);
1510 conf.setbidi(bidi);
1511 conf.setaskquit(askquit);
1512 conf.setlogoptions(logtimestamps, logonline);
1514 if(ptp) conf.setpeertopeer(ptpmin, ptpmax);
1515 else conf.setpeertopeer(0, 0);
1517 if(conf.getgroupmode() != gmode) {
1518 conf.setgroupmode(gmode);
1519 clist.rearrange();
1521 conf.setcolormode(cm);
1522 if (conf.getsortmode() != smode){
1523 conf.setsortmode(smode);
1526 conf.setsmtphost(smtp);
1527 conf.setbrowser(browser);
1528 conf.sethttpproxyhost(httpproxy);
1529 conf.save();
1530 break;
1534 db.close();
1536 unblockmainscreen();
1538 if(needredraw) {
1539 icqface::redraw();
1542 return success;
1545 void icqface::selectproto(bool prots[], spmode mode) {
1546 static int saveelem = 0;
1547 int i, protmax;
1548 bool finished = false;
1550 protocolname pname;
1551 protocolname tempprots[protocolname_size];
1552 bool aprots[protocolname_size];
1554 i = 0;
1555 memcpy(aprots, prots, sizeof(aprots));
1557 for(pname = icq; pname != protocolname_size; pname++) {
1558 if(mode == spnonIM) {
1559 if(pname != infocard)
1560 if(!gethook(pname).getCapabs().count(hookcapab::nochat))
1561 continue;
1563 if(pname == livejournal)
1564 continue;
1566 } else {
1567 if(mode != spIMplusRSS || pname != rss)
1568 if(pname != livejournal || mode == spIMonly) {
1569 if(gethook(pname).getCapabs().count(hookcapab::nochat))
1570 continue;
1572 if(conf.getourid(pname).empty())
1573 continue;
1577 if(!gethook(pname).enabled())
1578 continue;
1581 tempprots[i++] = pname;
1584 protmax = i;
1586 vector<imstatus> mst;
1587 vector<imstatus>::iterator im;
1589 verticalmenu m(conf.getcolor(cp_dialog_menu), conf.getcolor(cp_dialog_selected));
1590 m.setwindow(textwindow(4, LINES-5-protmax, 18, LINES-4, conf.getcolor(cp_dialog_menu)));
1592 m.idle = &menuidle;
1593 m.otherkeys = &multiplekeys;
1594 m.setpos(saveelem);
1596 while(!finished) {
1597 saveelem = m.getpos();
1598 m.clear();
1600 for(i = 0; i < protmax; i++)
1601 m.additemf(0, i, "[%c] %s", aprots[tempprots[i]] ? 'x' : ' ',
1602 conf.getprotocolname(tempprots[i]).c_str());
1604 m.setpos(saveelem);
1606 switch(m.open()) {
1607 case -2:
1608 aprots[tempprots[m.getpos()]] = !aprots[tempprots[m.getpos()]];
1609 break;
1611 default:
1612 finished = true;
1613 break;
1617 m.close();
1619 if(m.getlastkey() != KEY_ESC)
1620 memcpy(prots, aprots, sizeof(aprots));
1623 int icqface::editaboutkeys(texteditor &e, int k) {
1624 switch(k) {
1625 case CTRL('x'): face.editdone = true; return -1;
1626 case 27: return -1;
1629 return 0;
1632 void icqface::detailsidle(dialogbox &db) {
1633 icqcontact *c;
1635 if(!face.detailsfetched)
1636 if(c = clist.get(contactroot))
1637 if(c->updated()) {
1638 face.gendetails(db.gettree());
1639 db.gettree()->redraw();
1640 face.status(_("Your details have been fetched"));
1641 face.detailsfetched = true;
1644 cicq.idle(HIDL_SOCKEXIT);
1647 int icqface::selectgroup(const string &text) {
1648 return groupmanager(text, true);
1651 void icqface::organizegroups() {
1652 groupmanager(_("Organize contact groups"), false);
1655 int icqface::groupmanager(const string &text, bool sel) {
1656 dialogbox db;
1657 static int n = 0;
1658 int r, ngrp, b, id;
1659 vector<icqgroup>::iterator i;
1660 string gname;
1661 bool touched = false;
1663 textwindow w(0, 0, sizeDlg.width, sizeDlg.height,
1664 conf.getcolor(cp_dialog_frame), TW_CENTERED);
1666 w.set_title(conf.getcolor(cp_dialog_highlight), " " + text + " ");
1668 db.setwindow(&w, false);
1670 db.settree(new treeview(conf.getcolor(cp_dialog_text),
1671 conf.getcolor(cp_dialog_selected), conf.getcolor(cp_dialog_highlight),
1672 conf.getcolor(cp_dialog_text)));
1674 db.setbar(new horizontalbar(conf.getcolor(cp_dialog_text),
1675 conf.getcolor(cp_dialog_selected),
1676 _("Add"), _("Rename"), _("rEmove"), _("move Up"), _("move Down"),
1677 sel ? _("Select") : _("Done"), (char*)0));
1679 db.addautokeys();
1680 db.getbar()->item = 5;
1682 r = 0;
1683 db.idle = &dialogidle;
1684 blockmainscreen();
1685 treeview &t = *db.gettree();
1687 db.addkey(KEY_IC, 0);
1688 db.addkey(KEY_DC, 2);
1690 for(bool fin = false; !fin && !r; ) {
1691 t.clear();
1692 ngrp = t.addnode(_(" Groups "));
1694 sort(groups.begin(), groups.end());
1696 for(i = groups.begin(); i != groups.end(); ++i) {
1697 b = i-groups.begin()+1;
1698 id = t.addleaff(ngrp, 0, b, " %s ", i->getname().c_str());
1699 if(n == b) t.setcur(id);
1702 fin = !db.open(n, b, (void **) &n);
1704 if(!fin)
1705 switch(b) {
1706 case 0:
1707 gname = inputstr(_("Name for a group to be created: "), "");
1708 if(!gname.empty()) {
1709 groups.add(gname);
1710 touched = true;
1712 break;
1714 case 1:
1715 if(n) {
1716 i = groups.begin()+n-1;
1717 gname = inputstr(_("New name for the group: "), i->getname());
1719 if(input.getlastkey() != KEY_ESC)
1720 if(!gname.empty()) {
1721 i->rename(gname);
1722 touched = true;
1725 break;
1727 case 2:
1728 if(n) {
1729 i = groups.begin()+n-1;
1731 if(i->getid() != 1) {
1732 if(ask(_("Are you sure want to remove the group?"), ASK_YES | ASK_NO, ASK_NO) == ASK_YES) {
1733 groups.remove(i->getid());
1734 clist.rearrange();
1735 touched = true;
1739 break;
1741 case 3:
1742 if(n) {
1743 i = groups.begin()+n-1;
1744 i->moveup();
1745 n--;
1746 touched = true;
1748 break;
1750 case 4:
1751 if(n) {
1752 i = groups.begin()+n-1;
1753 i->movedown();
1754 n++;
1755 touched = true;
1757 break;
1759 case 5:
1760 if(n) {
1761 i = groups.begin()+n-1;
1762 r = i->getid();
1763 } else if(!sel) {
1764 fin = true;
1766 break;
1770 if(touched) groups.save();
1772 db.close();
1773 unblockmainscreen();
1774 return r;
1777 void icqface::transfermonitor() {
1778 dialogbox db;
1779 int n, b, np, cid;
1780 vector<filetransferitem>::iterator it;
1781 string fitem;
1783 vector< pair< pair<imcontact, imevent::imdirection>, int> > nodes;
1784 vector< pair< pair<imcontact, imevent::imdirection>, int> >::iterator in;
1786 textwindow w(0, 0, sizeDlg.width, sizeDlg.height,
1787 conf.getcolor(cp_dialog_frame), TW_CENTERED);
1789 w.set_titlef(conf.getcolor(cp_dialog_highlight), " %s ", _("File transfer status"));
1791 db.setwindow(&w, false);
1793 db.settree(new treeview(conf.getcolor(cp_dialog_text),
1794 conf.getcolor(cp_dialog_selected), conf.getcolor(cp_dialog_highlight),
1795 conf.getcolor(cp_dialog_text)));
1797 db.setbar(new horizontalbar(conf.getcolor(cp_dialog_text),
1798 conf.getcolor(cp_dialog_selected), _("Cancel"), _("Remove"), (char*)0));
1800 db.getbar()->item = 1;
1801 db.addautokeys();
1803 db.idle = &transferidle;
1804 blockmainscreen();
1805 treeview &t = *db.gettree();
1807 db.addkey(KEY_DC, 1);
1809 for(bool fin = false; !fin; ) {
1810 t.clear();
1811 nodes.clear();
1813 for(it = transfers.begin(); it != transfers.end(); ++it) {
1814 pair<imcontact, imevent::imdirection>
1815 contdir(it->fr.getcontact(), it->fr.getdirection());
1817 for(in = nodes.begin(); in != nodes.end(); ++in)
1818 if(in->first.first == contdir.first
1819 && in->first.second == contdir.second)
1820 break;
1822 if(in != nodes.end()) {
1823 cid = in->second;
1825 } else {
1826 if(contdir.second == imevent::incoming) {
1827 cid = t.addnodef(_(" Incoming from %s "), contdir.first.totext().c_str());
1828 } else {
1829 cid = t.addnodef(_(" Outgoing to %s "), contdir.first.totext().c_str());
1832 nodes.push_back(make_pair(contdir, cid));
1836 switch(it->status) {
1837 case icqface::tsInit: fitem = _("init"); break;
1838 case icqface::tsStart: fitem = _("start"); break;
1839 case icqface::tsProgress: fitem = _("work"); break;
1840 case icqface::tsFinish: fitem = _("done"); break;
1841 case icqface::tsError: fitem = _("err"); break;
1842 case icqface::tsCancel: fitem = _("abort"); break;
1845 fitem = (string) "[" + fitem + "] " + it->fname + ", " +
1846 i2str(it->bdone);
1848 if(it->btotal > 0)
1849 fitem += (string) _(" of ") + i2str(it->btotal);
1851 int limit = sizeDlg.width-9;
1853 if(fitem.size() > limit) {
1854 int pos = fitem.find("] ");
1855 fitem.erase(pos+2, fitem.size()-limit+2);
1856 fitem.insert(pos+2, "..");
1859 t.addleaff(cid, 0, it-transfers.begin(), " %s ", fitem.c_str());
1862 fin = !db.open(np, b, (void **) &n);
1864 if(!fin && !db.gettree()->menu.getaborted()) {
1865 it = transfers.end();
1867 if(!db.gettree()->isnode(db.gettree()->getid(np-1)))
1868 it = transfers.begin() + (intptr_t) db.getmenu()->getref(n-1);
1870 switch(b) {
1871 case 0:
1872 if(it != transfers.end())
1873 gethook(it->fr.getcontact().pname).aborttransfer(it->fr);
1874 break;
1876 case 1:
1877 if(it != transfers.end())
1878 switch(it->status) {
1879 case icqface::tsInit:
1880 case icqface::tsStart:
1881 case icqface::tsProgress:
1882 status(_("Cannot remove a transfer which is in progress now"));
1883 break;
1885 case icqface::tsFinish:
1886 case icqface::tsError:
1887 case icqface::tsCancel:
1888 transfers.erase(it);
1889 break;
1891 break;
1896 db.close();
1897 unblockmainscreen();
1900 void icqface::transferupdate(const string &fname, const imfile &fr,
1901 transferstatus st, int btotal, int bdone) {
1902 vector<filetransferitem>::iterator i = transfers.begin();
1904 while(i != transfers.end()) {
1905 if(i->fr.getcontact() == fr.getcontact()
1906 && i->fr.getdirection() == fr.getdirection()
1907 && i->fname == fname)
1908 break;
1909 ++i;
1912 if(i == transfers.end()) {
1913 transfers.push_back(filetransferitem(fr));
1914 i = transfers.end()-1;
1915 i->fname = fname;
1918 if(btotal) i->btotal = btotal;
1919 if(bdone) i->bdone = bdone;
1920 i->status = st;
1923 void icqface::invokelist(string &s, vector<string> &v, const string &def, textwindow *w) {
1924 int delems = (int) ((w->y2-w->y1)/2);
1925 int vmax = v.size() > delems ? delems : v.size();
1926 if(vmax < 2) return;
1927 vmax++;
1929 verticalmenu m(conf.getcolor(cp_dialog_menu), conf.getcolor(cp_dialog_selected));
1930 m.setwindow(textwindow(w->x1, w->y2-vmax, w->x1+30, w->y2, conf.getcolor(cp_dialog_menu)));
1931 m.idle = &menuidle;
1933 vector<string>::const_iterator iv = v.begin();
1934 while(iv != v.end()) {
1935 string cs = *iv;
1936 if(cs.empty()) cs = def;
1937 m.additem((string) " " + cs);
1938 if(cs == s) m.setpos(iv-v.begin());
1939 ++iv;
1942 int i = m.open();
1943 m.close();
1945 if(i) s = v[i-1];
1948 bool icqface::setljparams(imxmlevent *ev) {
1949 bool r = false;
1951 #ifdef BUILD_LJ
1953 #define LJP_LIST(x, l, d) \
1954 tmp = ev->getfield(x); \
1955 invokelist(tmp, l, d, db.getwindow()); \
1956 ev->setfield(x, tmp);
1958 #define LJP_STR(x, m) \
1959 ev->setfield(x, inputstr(m, ev->getfield(x)));
1961 #define LJP_BOOL(x) \
1962 ev->setfield(x, ev->getfield(x) == "1" ? "" : "1");
1964 int i, n, b;
1965 dialogbox db;
1967 vector<string> journals, moods, pictures;
1968 vector<string>::iterator im;
1969 string tmp;
1970 bool custmood;
1972 static vector<string> snames, svalues;
1974 journals = lhook.getjournals();
1975 pictures = lhook.getpictures();
1976 moods = lhook.getmoods();
1978 ev->setfield("_eventkind", "posting");
1980 if(ev->field_empty("journal") && !journals.empty())
1981 ev->setfield("journal", journals.front());
1983 if(ev->field_empty("mood") && !moods.empty())
1984 ev->setfield("mood", moods.front());
1986 if(ev->field_empty("picture") && !pictures.empty())
1987 ev->setfield("picture", pictures.front());
1989 if(ev->field_empty("security"))
1990 ev->setfield("security", "public");
1992 if(snames.empty()) {
1993 snames.push_back(_("public (visible to all)"));
1994 svalues.push_back("public");
1995 snames.push_back(_("private"));
1996 svalues.push_back("private");
1997 snames.push_back(_("friends only"));
1998 svalues.push_back("usemask");
2001 ev->setfield("taglist", "");
2003 textwindow w(0, 0, sizeDlg.width, sizeDlg.height, conf.getcolor(cp_dialog_frame), TW_CENTERED);
2004 w.set_title(conf.getcolor(cp_dialog_highlight), _(" LiveJournal posting: attributes "));
2005 db.setwindow(&w, false);
2007 db.settree(new treeview(conf.getcolor(cp_dialog_text),
2008 conf.getcolor(cp_dialog_selected), conf.getcolor(cp_dialog_highlight),
2009 conf.getcolor(cp_dialog_text)));
2011 db.setbar(new horizontalbar(conf.getcolor(cp_dialog_text), conf.getcolor(cp_dialog_selected),
2012 _("Change"), _("Detect music"), _("Post"), _("cAncel"), (char*)0));
2014 db.addautokeys();
2015 db.idle = &dialogidle;
2017 blockmainscreen();
2018 treeview &t = *db.gettree();
2020 for(bool fin = false; !fin && !r; ) {
2021 t.clear();
2023 i = t.addnode(_(" General "));
2024 t.addleaff(i, 0, 10, _(" Post to journal : %s "), ev->getfield("journal").c_str());
2025 t.addleaff(i, 0, 11, _(" Subject : %s "), ev->getfield("subject").c_str());
2027 vector<string>::iterator is = find(svalues.begin(), svalues.end(), ev->getfield("security"));
2028 if(is == svalues.end()) is = svalues.begin();
2029 tmp = is != svalues.end() ? snames[is-svalues.begin()] : "";
2030 t.addleaff(i, 0, 12, _(" Security : %s "), tmp.c_str());
2032 i = t.addnode(_(" Fancy stuff "));
2034 custmood = find(moods.begin(), moods.end(), ev->getfield("mood")) == moods.end() || ev->getfield("mood").empty();
2035 t.addleaff(i, 0, 20, _(" Mood : %s "), custmood ? _("(none/custom)") : ev->getfield("mood").c_str());
2036 if(custmood) t.addleaff(i, 0, 23, _(" Custom mood : %s "), ev->getfield("mood").c_str());
2038 t.addleaff(i, 0, 21, _(" Music : %s "), ev->getfield("music").c_str());
2039 t.addleaff(i, 0, 22, _(" Picture : %s "), ev->getfield("picture").empty() ? _("(default)") : ev->getfield("picture").c_str());
2040 t.addleaff(i, 0, 25, _(" Tags : %s "), ev->getfield("taglist").c_str());
2042 i = t.addnode(_(" Options "));
2043 t.addleaff(i, 0, 30, _(" Disable auto-formatting : %s "), stryesno(ev->getfield("preformatted") == "1"));
2044 t.addleaff(i, 0, 31, _(" Disable sending comments by e-mail : %s "), stryesno(ev->getfield("noemail") == "1"));
2045 t.addleaff(i, 0, 32, _(" Disallow comments : %s "), stryesno(ev->getfield("nocomments") == "1"));
2046 t.addleaff(i, 0, 33, _(" Backdated entry : %s "), stryesno(ev->getfield("backdated") == "1"));
2048 fin = !db.open(n, b, (void **) &n);
2050 if(!fin) {
2051 if(b == 0) {
2052 switch(n) {
2053 case 10: LJP_LIST("journal", journals, ""); break;
2054 case 11: LJP_STR("subject", _("Posting subject: ")); break;
2055 case 12:
2056 tmp = snames[find(svalues.begin(), svalues.end(), ev->getfield("security"))-svalues.begin()];
2057 invokelist(tmp, snames, "", db.getwindow());
2058 tmp = svalues[find(snames.begin(), snames.end(), tmp)-snames.begin()];
2059 ev->setfield("security", tmp);
2060 break;
2062 case 20: LJP_LIST("mood", moods, _("(none/custom)")); break;
2063 case 21: LJP_STR("music", _("Currently playing: ")); break;
2064 case 22: LJP_LIST("picture", pictures, _("(default)")); break;
2065 case 23: LJP_STR("mood", _("Current mood: ")); break;
2066 case 25: LJP_STR("taglist", _("Tags for the entry: ")); break;
2067 case 30: LJP_BOOL("preformatted"); break;
2068 case 31: LJP_BOOL("noemail"); break;
2069 case 32: LJP_BOOL("nocomments"); break;
2070 case 33: LJP_BOOL("backdated"); break;
2073 } else if(b == 1) {
2074 ev->setfield("music", conf.execaction("detectmusic"));
2076 } else if(b == 2) {
2077 r = true;
2079 } else if(b == 3) {
2080 r = false;
2081 fin = true;
2087 db.close();
2088 unblockmainscreen();
2090 #endif
2092 return r;
2095 void icqface::findpgpkey(dialogbox &db, const vector<string> &items) {
2096 bool fin;
2097 string sub, upsub;
2098 int k, i;
2100 xtermtitle(_("pgp key quick search"));
2102 status(_("PGP key search: type to find, %s find again, Enter finish"),
2103 getstatkey(key_quickfind, section_contact).c_str());
2105 textwindow *w = db.getwindow();
2106 verticalmenu *cm = db.getmenu();
2108 for(fin = false; !fin; ) {
2109 attrset(conf.getcolor(cp_dialog_frame));
2110 mvhline(w->y2-2, w->x1+1, HLINE, w->x2-w->x1-2);
2111 kwriteatf(w->x1+2, w->y2-2, conf.getcolor(cp_dialog_highlight), "[ %s ]", sub.c_str());
2112 kgotoxy(w->x1+4+sub.size(), w->y2-2);
2113 refresh();
2115 if(cicq.idle())
2116 switch(k = getkey()) {
2117 case KEY_ESC:
2118 case '\r':
2119 fin = true;
2120 break;
2122 case KEY_BACKSPACE:
2123 case CTRL('h'):
2124 if(!sub.empty()) sub.resize(sub.size()-1);
2125 else fin = true;
2126 break;
2128 default:
2129 if(isprint(k) || key2action(k, section_contact) == key_quickfind) {
2130 i = cm->getpos()+1;
2132 if(isprint(k)) {
2133 i--;
2134 sub += k;
2137 if(i <= items.size()) {
2138 upsub = up(sub);
2139 vector<string>::const_iterator it = items.begin()+i;
2140 bool passed = false;
2142 while(1) {
2143 if(it == items.end()) {
2144 if(!passed) {
2145 passed = true;
2146 it = items.begin();
2147 continue;
2148 } else {
2149 break;
2153 if(it->find(upsub) != -1) {
2154 cm->setpos(it-items.begin());
2155 break;
2157 ++it;
2160 cm->redraw();
2163 break;
2167 attrset(conf.getcolor(cp_dialog_frame));
2168 mvhline(w->y2-2, w->x1+1, HLINE, w->x2-w->x1-2);
2169 refresh();
2172 bool icqface::selectpgpkey(string &keyid, bool secretonly) {
2173 bool r = false;
2175 #ifdef HAVE_GPGME
2176 int n, b;
2177 dialogbox db;
2178 bool msb;
2179 string buf;
2180 vector<string> items;
2182 textwindow w(0, 0, sizeDlg.width, sizeDlg.height, conf.getcolor(cp_dialog_frame), TW_CENTERED);
2183 w.set_title(conf.getcolor(cp_dialog_highlight), _(" Select PGP key to use "));
2184 db.setwindow(&w, false);
2186 db.setmenu(new verticalmenu(conf.getcolor(cp_dialog_text),
2187 conf.getcolor(cp_dialog_selected)));
2189 db.setbar(new horizontalbar(conf.getcolor(cp_dialog_text),
2190 conf.getcolor(cp_dialog_selected), _("Select"), 0));
2192 db.addautokeys();
2194 db.idle = &dialogidle;
2195 db.otherkeys = &findpgpkeys;
2197 verticalmenu &m = *db.getmenu();
2199 if(!(msb = mainscreenblock)) blockmainscreen();
2201 vector<string> keys = pgp.getkeys(secretonly);
2202 vector<string>::const_iterator i = keys.begin();
2204 m.additemf(0, 0, _(" Use no key"));
2205 items.push_back("");
2207 while(i != keys.end()) {
2208 buf = pgp.getkeyinfo(*i, secretonly);
2209 m.additem(0, 0, (string) " " + buf);
2210 items.push_back(up(buf));
2211 if(*i == keyid) m.setpos(m.getcount()-1);
2212 ++i;
2215 keys.insert(keys.begin(), "");
2217 for(bool fin = false; !fin && !r; ) {
2218 xtermtitle(_("pgp key selection"));
2220 status(_("PGP key selection: %s for quick lookup"),
2221 getstatkey(key_quickfind, section_contact).c_str());
2223 fin = !db.open(n, b);
2225 if(!fin) {
2226 if(n < 1) {
2227 if(n == -3)
2228 findpgpkey(db, items);
2230 } else if(!b) {
2231 keyid = keys[n-1];
2232 r = fin = true;
2237 db.close();
2238 if(!msb) unblockmainscreen();
2240 #endif
2242 return r;