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
28 #include "icqcontact.h"
29 #include "icqcontacts.h"
31 #include "icqgroups.h"
32 #include "abstracthook.h"
36 #include <libicq2000/constants.h>
37 #include <stdint.h> /* for intptr_t */
39 const char *stragerange(ICQ2000::AgeRange 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");
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");
70 const char *strsortmode(icqconf::sortmode 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");
81 bool icqface::sprofmanager(string
&name
, string
&act
) {
87 map
<string
, imsearchparams
> profiles
;
88 map
<string
, imsearchparams
>::iterator ip
;
90 string pfname
= conf
.getconfigfname("search-profiles");
92 ifstream
f(pfname
.c_str());
97 tname
= getword(buf
, "\t");
100 profiles
[tname
] = imsearchparams(tname
);
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);
122 db
.idle
= &dialogidle
;
123 verticalmenu
&m
= *db
.getmenu();
124 db
.getbar()->item
= 1;
126 finished
= r
= false;
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(),
137 finished
= !db
.open(n
, b
);
140 if(!profiles
.empty()) {
141 tname
= (char *) m
.getref(n
-1);
142 ip
= profiles
.find(tname
);
149 if(ip
!= profiles
.end())
154 if(ip
!= profiles
.end()) {
166 unlink(conf
.getconfigfname("search-profiles").c_str());
168 for(ip
= profiles
.begin(); ip
!= profiles
.end(); ++ip
) {
169 ip
->second
.save(ip
->first
);
175 bool icqface::finddialog(imsearchparams
&s
, findsubject subj
) {
177 //Not used - int nuin, ninfo, nloc, nwork, nonl;
178 bool finished
, ret
, proceed
;
181 vector
<protocolname
> penabled
;
182 vector
<protocolname
>::iterator ipname
, ipfname
;
184 vector
<string
> services
;
185 vector
<string
>::iterator iservice
;
191 for(protocolname apname
= icq
; apname
!= protocolname_size
; apname
++) {
192 if(subj
== fschannel
)
193 if(!gethook(apname
).getCapabs().count(hookcapab::conferencing
))
196 if(gethook(apname
).logged() || apname
== infocard
) {
197 penabled
.push_back(apname
);
201 if(penabled
.empty()) {
202 log(_("+ you must be logged in first"));
206 if((ipname
= find(penabled
.begin(), penabled
.end(), s
.pname
)) == penabled
.end()) {
207 ipname
= penabled
.begin();
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
)));
225 db
.setbar(new horizontalbar(conf
.getcolor(cp_dialog_text
), conf
.getcolor(cp_dialog_selected
),
226 _("lOad"), _("sAve"), _("cLear"), _("Change"), _("Search/Add"), (char*)0));
230 db
.setbar(new horizontalbar(conf
.getcolor(cp_dialog_text
), conf
.getcolor(cp_dialog_selected
),
231 _("cLear"), _("Change"), _("Join/Create"), (char*)0));
235 db
.setbar(new horizontalbar(conf
.getcolor(cp_dialog_text
), conf
.getcolor(cp_dialog_selected
),
236 _("cLear"), _("Change"), _("lInk"), (char*)0));
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
;
255 db
.idle
= &dialogidle
;
256 treeview
&tree
= *db
.gettree();
258 bool protchanged
= true;
266 services
= gethook(s
.pname
).getservices(servicetype::search
);
268 if((iservice
= find(services
.begin(), services
.end(), s
.service
)) == services
.end())
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
);
279 services
= gethook(s
.pname
).getservices(servicetype::groupchat
);
281 if((iservice
= find(services
.begin(), services
.end(), s
.service
)) == services
.end())
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
);
296 i
= tree
.addnode(_(" Network "));
297 tree
.addleaf(i
, 0, 1, " " + conf
.getprotocolname(s
.pname
) + " ");
300 if(subj
!= fschannel
)
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());
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());
319 tree
.addleaff(i
, 0, 15, _(" Age range : %s "), stragerange(s
.agerange
));
322 tree
.addleaff(i
, 0, 17, _(" Gender : %s "), strgender(s
.gender
));
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());
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
));
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());
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 "));
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());
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
);
454 if(sprofmanager(tname
, act
)) {
456 imsearchparams
ts(tname
);
458 if((ipfname
= find(penabled
.begin(), penabled
.end(),
459 ts
.pname
)) != penabled
.end()) {
469 tname
= inputstr(_("New profile name: "));
471 if(proceed
= !tname
.empty())
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
;
481 s
= imsearchparams();
489 if(++ipname
== penabled
.end())
490 ipname
= penabled
.begin();
492 if(protchanged
= s
.pname
!= *ipname
) {
494 s
.flexparams
.clear();
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;
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
);
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
;
536 vector
<pair
<string
, string
> >::iterator ifp
= s
.flexparams
.begin()+i
-100;
537 ifp
->second
= inputstr(ifp
->first
+ ": ", ifp
->second
);
542 if ((s
.pname
== jabber
) && ((s
.service
.empty() && (s
.nick
.find("@") == -1)) || (s
.nick
.empty() && s
.flexparams
.empty()))) {
543 status(_("Wrong Jabber ID!"));
545 ret
= finished
= true;
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
);
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
);
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());
611 if(passinfo
.pname
== infocard
|| capab
.count(hookcapab::changenick
) || !ourdetails
)
612 if((capab
.count(hookcapab::flexiblereg
) && ri
.params
.empty()) || !capab
.count(hookcapab::flexiblereg
)) {
614 tree
->addleaff(i
, 0, 10, _(" Nickname : %s "), c
->getnick().c_str());
617 if(capab
.count(hookcapab::changepassword
) && ourdetails
) {
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())) {
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 "));
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
));
681 tree
->addleaff(i
, 0, 44, _(" Authorization required : %s "), stryesno(bi
.requiresauth
));
684 } else if(passinfo
.pname
== gadu
) {
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
) {
710 icqcontact::basicinfo bi
;
711 icqcontact::workinfo wi
;
712 icqcontact::moreinfo mi
;
713 icqcontact::reginfo ri
;
714 bool finished
= false, ret
= false, msb
;
719 status(_("Fetching your details"));
720 c
= clist
.get(contactroot
);
723 if(!(msb
= mainscreenblock
)) {
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());
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
;
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();
766 if((c
->getdesc() == contactroot
) && !c
->updated()) {
767 status(_("Wait a moment. Your details haven't been fetched yet"));
772 c
->setnick(inputstr(_("Nickname: "), c
->getnick()));
773 switch(c
->getdesc().pname
) {
777 c
->setdispnick(c
->getnick());
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;
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
);
794 tmp
= inputstr(_("Enter birthdate (DD-MM-YYYY): "), tmp
);
798 sscanf(tmp
.c_str(), "%d-%d-%d", &d
, &m
, &y
);
801 if((d
> 0) && (d
<= 31))
802 if((m
> 0) && (m
<= 12)) {
808 mi
.birth_day
= mi
.birth_month
= mi
.birth_year
= 0;
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;
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
) {
861 ri
.password
= inputstr(_("New password: "), ri
.password
, '*');
863 if(!ri
.password
.empty())
864 if(inputstr(_("Check the new password: "), "", '*') != ri
.password
)
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;
871 vector
<pair
<string
, string
> >::iterator ifp
= ri
.params
.begin()+citem
-100;
872 ifp
->second
= inputstr(ifp
->first
+ ": ", ifp
->second
);
883 ret
= (c
->getdesc() != contactroot
) || c
->updated();
897 void icqface::selectcountry(unsigned short &f
) {
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
)));
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
) {
916 if(i
) f
= (unsigned short) ((intptr_t) m
.getref(i
-1));
919 void icqface::selectlanguage(unsigned short &f
) {
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
)));
925 for(i
= 0; i
< abstracthook::Language_table_size
; i
++) {
926 m
.additemf(" %s", abstracthook::Language_table
[i
]);
936 void icqface::selectrandomgroup(unsigned short &f
) {
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
)));
942 m
.additemf(" %s", _("none"));
944 for(i
= 1; i
<= ((int) ICQ2000::GROUP_SEEKINGMEN
); i
++) {
945 m
.additemf(" %s", strrandomgroup(i
));
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
)));
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);
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
)));
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
)
982 m
.additemf(0, (int) i
, " %s", p
);
983 if(i
== r
) m
.setpos(m
.getcount()-1);
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();
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] "));
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
;
1007 se
.smarttab
= false;
1013 char *ctext
= se
.save("\r\n");
1019 if(!msb
) unblockmainscreen();
1024 bool icqface::sendfiles(const imcontact
&cinfo
, string
&msg
, linkedlist
&flist
) {
1026 bool finished
= false;
1030 flist
.freeitem
= &charpointerfree
;
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);
1053 db
.idle
= &dialogidle
;
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
);
1071 fname
= inputfile(_("filename: "));
1072 if(fname
.size()) flist
.add(strdup(fname
.c_str()));
1078 msg
= inputstr(_("comment: "), msg
);
1089 unblockmainscreen();
1093 void icqface::multichange(bool conv
[], bool newstate
) {
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;
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
);
1136 conf
.getpeertopeer(ptpmin
, ptpmax
);
1140 if (!conf
.gethttpproxyuser().empty()) {
1141 httpproxy
= conf
.gethttpproxyuser();
1142 if(!httpproxy
.empty())
1143 httpproxy
+= ":" + conf
.gethttpproxypasswd() + "@" + conf
.gethttpproxyhost() + ":" + i2str(conf
.gethttpproxyport());
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();
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
;
1201 treeview
&t
= *db
.gettree();
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());
1214 t
.addleaff(i
, 0, 20, _( " Enable bidirectional languages support : %s "), stryesno(bidi
));
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
++)
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());
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
));
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());
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
));
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
));
1295 t
.addleaff(i
, 0, 50, _(" Screen socket path : %s "), screensocketpath
.c_str());
1298 finished
= !db
.open(n
, b
, &p
);
1306 s
= s
== icqconf::rsdontchange
? icqconf::rscard
:
1307 s
== icqconf::rscard
? icqconf::rsspeaker
:
1308 s
== icqconf::rsspeaker
? icqconf::rsdisable
:
1309 icqconf::rsdontchange
;
1312 c
= c
== icqconf::rcdontchange
? icqconf::rcdark
:
1313 c
== icqconf::rcdark
? icqconf::rcblue
:
1314 icqconf::rcdontchange
;
1317 if(hasany
) selectproto(conv
, spIMplusRSS
); else
1318 for(pname
= icq
; pname
!= protocolname_size
; pname
++)
1319 conv
[pname
] = !conv
[pname
];
1322 tmp
= inputstr(_("Auto Away period (0 - disable): "), i2str(aaway
));
1323 if(!tmp
.empty()) aaway
= atol(tmp
.c_str());
1326 tmp
= inputstr(_("Auto N/A period (0 - disable): "), i2str(ana
));
1327 if(!tmp
.empty()) ana
= atol(tmp
.c_str());
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;
1339 if(hasany
) selectproto(chatmode
); else
1340 for(pname
= icq
; pname
!= protocolname_size
; pname
++)
1341 chatmode
[pname
] = !chatmode
[pname
];
1346 gmode
== icqconf::group1
? icqconf::group2
:
1347 gmode
== icqconf::group2
? icqconf::nogroups
:
1350 case 18: makelog
= !makelog
; break;
1352 tmp
= inputstr(_("SMTP server hostname: "), smtp
);
1353 if(!tmp
.empty()) smtp
= tmp
;
1355 case 20: bidi
= !bidi
; break;
1359 ptpmin
= 0, ptpmax
= 65535;
1362 tmp
= inputstr(_("Peer-to-peer port range (min-max): "),
1363 (i2str(ptpmin
) + "-" + i2str(ptpmax
)).c_str());
1366 int tptpmin
= atoi(getword(tmp
, "-").c_str());
1367 int tptpmax
= atoi(tmp
.c_str());
1370 if(tptpmin
< tptpmax
)
1371 ptpmin
= tptpmin
, ptpmax
= tptpmax
;
1374 case 23: emacs
= !emacs
; break;
1376 httpproxy
= inputstr(_("HTTP proxy server hostname: "), httpproxy
);
1379 if(hasany
) selectproto(entersends
); else
1380 for(pname
= icq
; pname
!= protocolname_size
; pname
++)
1381 entersends
[pname
] = !entersends
[pname
];
1385 if(iconvlang
== convlanguages
.end())
1386 iconvlang
= convlanguages
.begin();
1388 switch(iconvlang
-convlanguages
.begin()) {
1390 convertto
= convertfrom
= "";
1391 // multichange(conv, false);
1395 convertfrom
= "cp1251";
1396 convertto
= "koi8-r";
1397 multichange(conv
, true);
1401 convertfrom
= "cp1250";
1402 convertto
= "iso-8859-2";
1403 multichange(conv
, true);
1407 convertfrom
= "iso-8859-15";
1408 convertto
= "utf-8";
1409 multichange(conv
, true);
1414 convertfrom
= inputstr(_("Charset to convert messages from: "), convertfrom
);
1415 if(input
.getlastkey() == '\r') iconvlang
= convlanguages
.begin();
1418 convertto
= inputstr(_("Charset to convert messages to: "), convertto
);
1419 if(input
.getlastkey() == '\r') iconvlang
= convlanguages
.begin();
1422 selectproto(nonimonline
, spnonIM
);
1425 cm
= (cm
== icqconf::cmproto
? icqconf::cmstatus
: icqconf::cmproto
);
1428 tmp
= inputstr(_("HTTP browser to use: "), browser
);
1429 if(!tmp
.empty()) browser
= tmp
;
1432 conf
.setleftpanelwidth(atol(inputstr(_("Left panel width: "),
1433 strint(conf
.getleftpanelwidth())).c_str()));
1437 conf
.setlogpanelheight(atol(inputstr(_("Log panel height: "),
1438 strint(conf
.getlogpanelheight())).c_str()));
1442 conf
.setchatpanelheight(atol(inputstr(_("Chat panel height: "),
1443 strint(conf
.getchatpanelheight())).c_str()));
1448 timestampstothesecond
= !timestampstothesecond
; break;
1451 screenna
= !screenna
; break;
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!"));
1460 dropauthreq
= !dropauthreq
;
1461 if (dropauthreq
&& usingcaptcha
)
1462 usingcaptcha
= false;
1465 usingcaptcha
= !usingcaptcha
;
1466 /* captcha overrides droping auth requests */
1467 if (dropauthreq
&& usingcaptcha
)
1468 dropauthreq
= false;
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
;
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
);
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
);
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
);
1536 unblockmainscreen();
1545 void icqface::selectproto(bool prots
[], spmode mode
) {
1546 static int saveelem
= 0;
1548 bool finished
= false;
1551 protocolname tempprots
[protocolname_size
];
1552 bool aprots
[protocolname_size
];
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
))
1563 if(pname
== livejournal
)
1567 if(mode
!= spIMplusRSS
|| pname
!= rss
)
1568 if(pname
!= livejournal
|| mode
== spIMonly
) {
1569 if(gethook(pname
).getCapabs().count(hookcapab::nochat
))
1572 if(conf
.getourid(pname
).empty())
1577 if(!gethook(pname
).enabled())
1581 tempprots
[i
++] = pname
;
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
)));
1593 m
.otherkeys
= &multiplekeys
;
1597 saveelem
= m
.getpos();
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());
1608 aprots
[tempprots
[m
.getpos()]] = !aprots
[tempprots
[m
.getpos()]];
1619 if(m
.getlastkey() != KEY_ESC
)
1620 memcpy(prots
, aprots
, sizeof(aprots
));
1623 int icqface::editaboutkeys(texteditor
&e
, int k
) {
1625 case CTRL('x'): face
.editdone
= true; return -1;
1632 void icqface::detailsidle(dialogbox
&db
) {
1635 if(!face
.detailsfetched
)
1636 if(c
= clist
.get(contactroot
))
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
) {
1659 vector
<icqgroup
>::iterator i
;
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));
1680 db
.getbar()->item
= 5;
1683 db
.idle
= &dialogidle
;
1685 treeview
&t
= *db
.gettree();
1687 db
.addkey(KEY_IC
, 0);
1688 db
.addkey(KEY_DC
, 2);
1690 for(bool fin
= false; !fin
&& !r
; ) {
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
);
1707 gname
= inputstr(_("Name for a group to be created: "), "");
1708 if(!gname
.empty()) {
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()) {
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());
1743 i
= groups
.begin()+n
-1;
1752 i
= groups
.begin()+n
-1;
1761 i
= groups
.begin()+n
-1;
1770 if(touched
) groups
.save();
1773 unblockmainscreen();
1777 void icqface::transfermonitor() {
1780 vector
<filetransferitem
>::iterator it
;
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;
1803 db
.idle
= &transferidle
;
1805 treeview
&t
= *db
.gettree();
1807 db
.addkey(KEY_DC
, 1);
1809 for(bool fin
= false; !fin
; ) {
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
)
1822 if(in
!= nodes
.end()) {
1826 if(contdir
.second
== imevent::incoming
) {
1827 cid
= t
.addnodef(_(" Incoming from %s "), contdir
.first
.totext().c_str());
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
+ ", " +
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);
1872 if(it
!= transfers
.end())
1873 gethook(it
->fr
.getcontact().pname
).aborttransfer(it
->fr
);
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"));
1885 case icqface::tsFinish
:
1886 case icqface::tsError
:
1887 case icqface::tsCancel
:
1888 transfers
.erase(it
);
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
)
1912 if(i
== transfers
.end()) {
1913 transfers
.push_back(filetransferitem(fr
));
1914 i
= transfers
.end()-1;
1918 if(btotal
) i
->btotal
= btotal
;
1919 if(bdone
) i
->bdone
= bdone
;
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;
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
)));
1933 vector
<string
>::const_iterator iv
= v
.begin();
1934 while(iv
!= v
.end()) {
1936 if(cs
.empty()) cs
= def
;
1937 m
.additem((string
) " " + cs
);
1938 if(cs
== s
) m
.setpos(iv
-v
.begin());
1948 bool icqface::setljparams(imxmlevent
*ev
) {
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");
1967 vector
<string
> journals
, moods
, pictures
;
1968 vector
<string
>::iterator im
;
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));
2015 db
.idle
= &dialogidle
;
2018 treeview
&t
= *db
.gettree();
2020 for(bool fin
= false; !fin
&& !r
; ) {
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
);
2053 case 10: LJP_LIST("journal", journals
, ""); break;
2054 case 11: LJP_STR("subject", _("Posting subject: ")); break;
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
);
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;
2074 ev
->setfield("music", conf
.execaction("detectmusic"));
2088 unblockmainscreen();
2095 void icqface::findpgpkey(dialogbox
&db
, const vector
<string
> &items
) {
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);
2116 switch(k
= getkey()) {
2124 if(!sub
.empty()) sub
.resize(sub
.size()-1);
2129 if(isprint(k
) || key2action(k
, section_contact
) == key_quickfind
) {
2137 if(i
<= items
.size()) {
2139 vector
<string
>::const_iterator it
= items
.begin()+i
;
2140 bool passed
= false;
2143 if(it
== items
.end()) {
2153 if(it
->find(upsub
) != -1) {
2154 cm
->setpos(it
-items
.begin());
2167 attrset(conf
.getcolor(cp_dialog_frame
));
2168 mvhline(w
->y2
-2, w
->x1
+1, HLINE
, w
->x2
-w
->x1
-2);
2172 bool icqface::selectpgpkey(string
&keyid
, bool secretonly
) {
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));
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);
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
);
2228 findpgpkey(db
, items
);
2238 if(!msb
) unblockmainscreen();