Implement possibility to minimize the fullscreen window:
[kdenetwork.git] / kppp / edit.cpp
blobda006adc97764fc02183696b1bfa0424aa6e05f8
1 /*
2 * kPPP: A pppd Front End for the KDE project
4 * $Id$
5 * Copyright (C) 1997 Bernd Johannes Wuebben
6 * wuebben@math.cornell.edu
8 * based on EzPPP:
9 * Copyright (C) 1997 Jay Painter
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Library General Public
13 * License as published by the Free Software Foundation; either
14 * version 2 of the License, or (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Library General Public License for more details.
21 * You should have received a copy of the GNU Library General Public
22 * License along with this program; if not, write to the Free
23 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
26 #include <string.h>
27 #include <termios.h>
28 #include <qlayout.h>
29 //Added by qt3to4:
30 #include <QGridLayout>
31 #include <QHBoxLayout>
32 #include <QLabel>
33 #include <QVBoxLayout>
34 #include <QApplication>
35 #include <kmessagebox.h>
37 #include <qregexp.h>
38 #include <kiconloader.h>
39 #include <kdialogbuttonbox.h>
40 #include <klocale.h>
41 #include <kdialog.h>
42 #include <kwindowsystem.h>
44 #include "edit.h"
45 #include "pppdata.h"
46 #include "newwidget.h"
47 #include "iplined.h"
48 #include "auth.h"
50 DialWidget::DialWidget( QWidget *parent, bool isnewaccount )
51 : QWidget(parent)
53 QGridLayout *tl = new QGridLayout(this );
54 tl->setSpacing( KDialog::spacingHint() );
56 connect_label = new QLabel(i18n("Connection &name:"), this);
57 tl->addWidget(connect_label, 0, 0);
59 connectname_l = new QLineEdit(this);
60 connectname_l->setMaxLength(ACCNAME_SIZE);
61 connect_label->setBuddy(connectname_l);
63 tl->addWidget(connectname_l, 0, 1);
64 QString tmp = i18n("Type in a unique name for this connection");
66 connect_label->setWhatsThis(tmp);
67 connectname_l->setWhatsThis(tmp);
70 number_label = new QLabel(i18n("P&hone number:"), this);
71 number_label->setAlignment(Qt::AlignTop|Qt::AlignLeft);
72 tl->addWidget(number_label, 1, 0);
74 QHBoxLayout *lpn = new QHBoxLayout();
75 lpn->setSpacing( 5 );
76 tl->addLayout(lpn, 1, 1);
77 numbers = new Q3ListBox(this);
78 number_label->setBuddy(numbers);
79 numbers->setMinimumSize(120, 70);
80 lpn->addWidget(numbers);
81 QVBoxLayout *lpn1 = new QVBoxLayout;
82 lpn->addLayout(lpn1);
83 add = new QPushButton(i18n("&Add..."), this);
84 del = new QPushButton(i18n("&Remove"), this);
86 up = new QPushButton(this);
87 up->setIconSet(BarIconSet("go-up"));
88 down = new QPushButton(this);
89 down->setIconSet(BarIconSet("go-down"));
90 lpn1->addWidget(add);
91 lpn1->addWidget(del);
92 lpn1->addStretch(1);
93 lpn1->addWidget(up);
94 lpn1->addWidget(down);
95 connect(add, SIGNAL(clicked()),
96 this, SLOT(addNumber()));
97 connect(del, SIGNAL(clicked()),
98 this, SLOT(delNumber()));
99 connect(up, SIGNAL(clicked()),
100 this, SLOT(upNumber()));
101 connect(down, SIGNAL(clicked()),
102 this, SLOT(downNumber()));
103 connect(numbers, SIGNAL(highlighted(int)),
104 this, SLOT(selectionChanged(int)));
105 numbersChanged();
107 tmp = i18n("<p>Specifies the phone numbers to dial. You\n"
108 "can supply multiple numbers here, simply\n"
109 "click on \"Add\". You can arrange the\n"
110 "order the numbers are tried by using the\n"
111 "arrow buttons.\n\n"
112 "When a number is busy or fails, <i>kppp</i> will \n"
113 "try the next number and so on");
115 number_label->setWhatsThis(tmp);
116 numbers->setWhatsThis(tmp);
118 auth_l = new QLabel(i18n("A&uthentication:"), this);
119 tl->addWidget(auth_l, 3, 0);
121 auth = new QComboBox(this);
122 auth_l->setBuddy(auth);
123 auth->addItem(i18n("Script-based"));
124 auth->addItem(i18n("PAP"));
125 auth->addItem(i18n("Terminal-based"));
126 auth->addItem(i18n("CHAP"));
127 auth->addItem(i18n("PAP/CHAP"));
128 tl->addWidget(auth, 3, 1);
129 tmp = i18n("<p>Specifies the method used to identify yourself to\n"
130 "the PPP server. Most universities still use\n"
131 "<b>Terminal</b>- or <b>Script</b>-based authentication,\n"
132 "while most ISP use <b>PAP</b> and/or <b>CHAP</b>. If\n"
133 "unsure, contact your ISP.\n"
134 "\n"
135 "If you can choose between PAP and CHAP,\n"
136 "choose CHAP, because it's much safer. If you don't know\n"
137 "whether PAP or CHAP is right, choose PAP/CHAP.");
139 auth_l->setWhatsThis(tmp);
140 auth->setWhatsThis(tmp);
142 store_password = new QCheckBox(i18n("Store &password"), this);
143 store_password->setChecked(true);
144 tl->addMultiCellWidget(store_password, 4, 4, 0, 1, Qt::AlignRight);
145 store_password->setWhatsThis(
146 i18n("<p>When this is turned on, your ISP password\n"
147 "will be saved in <i>kppp</i>'s config file, so\n"
148 "you do not need to type it in every time.\n"
149 "\n"
150 "<b><font color=\"red\">Warning:</font> your password will be stored as\n"
151 "plain text in the config file, which is\n"
152 "readable only to you. Make sure nobody\n"
153 "gains access to this file!"));
155 cbtype_l = new QLabel(i18n("&Callback type:"), this);
156 tl->addWidget(cbtype_l, 5, 0);
158 cbtype = new QComboBox(this);
159 cbtype_l->setBuddy(cbtype);
160 cbtype->addItem(i18n("None"));
161 cbtype->addItem(i18n("Administrator-defined"));
162 cbtype->addItem(i18n("User-defined"));
163 connect(cbtype, SIGNAL(highlighted(int)),
164 this, SLOT(cbtypeChanged(int)));
165 tl->addWidget(cbtype, 5, 1);
166 tmp = i18n("Callback type");
168 cbtype_l->setWhatsThis(tmp);
169 cbtype->setWhatsThis(tmp);
171 cbphone_l = new QLabel(i18n("Call&back number:"), this);
172 tl->addWidget(cbphone_l, 6, 0);
174 cbphone = new QLineEdit(this);
175 cbphone_l->setBuddy(cbphone);
176 cbphone->setMaxLength(140);
177 tl->addWidget(cbphone, 6, 1);
178 tmp = i18n("Callback phone number");
180 cbphone_l->setWhatsThis(tmp);
181 cbphone->setWhatsThis(tmp);
183 pppdargs = new QPushButton(i18n("Customize &pppd Arguments..."), this);
184 connect(pppdargs, SIGNAL(clicked()), SLOT(pppdargsbutton()));
185 tl->addMultiCellWidget(pppdargs, 7, 7, 0, 1, Qt::AlignCenter);
187 // Set defaults if editing an existing connection
188 if(!isnewaccount) {
189 connectname_l->setText(gpppdata.accname());
191 // insert the phone numbers into the listbox
192 QString n = gpppdata.phonenumber();
193 QString tmp = "";
194 int idx = 0;
195 while(idx != n.length()) {
196 if(n[idx] == ':') {
197 if(tmp.length() > 0)
198 numbers->insertItem(tmp);
199 tmp = "";
200 } else
201 tmp += n[idx];
202 idx++;
204 if(tmp.length() > 0)
205 numbers->insertItem(tmp);
207 auth->setCurrentIndex(gpppdata.authMethod());
208 store_password->setChecked(gpppdata.storePassword());
209 cbtype->setCurrentIndex(gpppdata.callbackType());
210 cbphone->setText(gpppdata.callbackPhone());
211 } else {
212 // select PAP/CHAP as default
213 auth->setCurrentIndex(AUTH_PAPCHAP);
214 // select NONE as default
215 cbtype->setCurrentIndex(CBTYPE_NONE);
218 emit cbtypeChanged(cbtype->currentIndex());
219 numbersChanged();
220 tl->activate();
224 bool DialWidget::save() {
225 //first check to make sure that the account name is unique!
226 if(connectname_l->text().isEmpty() ||
227 !gpppdata.isUniqueAccname(connectname_l->text())) {
228 return false;
229 } else {
230 gpppdata.setAccname(connectname_l->text());
232 QString number = "";
233 for(uint i = 0; i < numbers->count(); i++) {
234 if(i != 0)
235 number += ':';
236 number += numbers->text(i);
239 gpppdata.setPhonenumber(number);
240 gpppdata.setAuthMethod(auth->currentIndex());
241 gpppdata.setStorePassword(store_password->isChecked());
242 gpppdata.setCallbackType(cbtype->currentIndex());
243 gpppdata.setCallbackPhone(cbphone->text());
244 return true;
249 void DialWidget::numbersChanged() {
250 int sel = numbers->currentItem();
252 del->setEnabled(sel != -1);
253 up->setEnabled(sel != -1 && sel != 0);
254 down->setEnabled(sel != -1 && sel != (int)numbers->count()-1);
257 void DialWidget::cbtypeChanged(int value) {
258 cbphone_l->setEnabled(value == CBTYPE_USER);
259 cbphone->setEnabled(value == CBTYPE_USER);
262 void DialWidget::selectionChanged(int) {
263 numbersChanged();
267 void DialWidget::addNumber() {
268 PhoneNumberDialog dlg(this);
269 if(dlg.exec()) {
270 numbers->insertItem(dlg.phoneNumber());
271 numbersChanged();
276 void DialWidget::delNumber() {
277 if(numbers->currentItem() != -1) {
278 numbers->removeItem(numbers->currentItem());
279 numbersChanged();
284 void DialWidget::upNumber() {
285 int idx = numbers->currentItem();
286 if(idx != -1) {
287 QString item = numbers->text(idx);
288 numbers->removeItem(idx);
289 numbers->insertItem(item, idx-1);
290 numbers->setCurrentItem(idx-1);
291 numbersChanged();
296 void DialWidget::downNumber() {
297 int idx = numbers->currentItem();
298 if(idx != -1) {
299 QString item = numbers->text(idx);
300 numbers->removeItem(idx);
301 numbers->insertItem(item, idx+1);
302 numbers->setCurrentItem(idx+1);
303 numbersChanged();
308 void DialWidget::pppdargsbutton() {
309 PPPdArguments pa(this);
310 pa.exec();
315 /////////////////////////////////////////////////////////////////////////////
316 // ExecWidget
317 /////////////////////////////////////////////////////////////////////////////
318 ExecWidget::ExecWidget(QWidget *parent, bool isnewaccount) :
319 QWidget(parent)
321 QVBoxLayout *tl = new QVBoxLayout(parent);
322 tl->setSpacing(KDialog::spacingHint());
323 tl->setMargin(0);
325 QLabel *l = new QLabel(\
326 i18n("Here you can select commands to run at certain stages of the\n"
327 "connection. The commands are run with your real user id, so\n"
328 "you cannot run any commands here requiring root permissions\n"
329 "(unless, of course, you are root).\n\n"
330 "Be sure to supply the whole path to the program otherwise\n"
331 "kppp might be unable to find it."), parent);
332 l->setMinimumHeight(l->sizeHint().height());
333 tl->addWidget(l);
334 tl->addStretch(1);
336 QGridLayout *l1 = new QGridLayout( );
337 l1->setMargin( 10 );
338 tl->addLayout(l1);
339 l1->setColumnStretch(0, 0);
340 l1->setColumnStretch(1, 1);
342 before_connect_l = new QLabel(i18n("&Before connect:"), parent);
343 before_connect_l->setAlignment(Qt::AlignVCenter);
344 l1->addWidget(before_connect_l, 0, 0);
345 before_connect = new QLineEdit(parent);
346 before_connect_l->setBuddy(before_connect);
347 before_connect->setMaxLength(COMMAND_SIZE);
348 l1->addWidget(before_connect, 0, 1);
349 QString tmp = i18n("Allows you to run a program <b>before</b> a connection\n"
350 "is established. It is called immediately before\n"
351 "dialing has begun.\n\n"
352 "This might be useful, e.g. to stop HylaFAX blocking the\n"
353 "modem.");
355 before_connect_l->setWhatsThis(tmp);
356 before_connect->setWhatsThis(tmp);
358 command_label = new QLabel(i18n("&Upon connect:"), parent);
359 command_label->setAlignment(Qt::AlignVCenter);
360 l1->addWidget(command_label, 1, 0);
361 command = new QLineEdit(parent);
362 command_label->setBuddy(command);
363 command->setMaxLength(COMMAND_SIZE);
364 l1->addWidget(command, 1, 1);
365 tmp = i18n("Allows you to run a program <b>after</b> a connection\n"
366 "is established. When your program is called, all\n"
367 "preparations for an Internet connection are finished.\n"
368 "\n"
369 "Very useful for fetching mail and news");
371 command_label->setWhatsThis(tmp);
372 command->setWhatsThis(tmp);
374 predisconnect_label = new QLabel(i18n("Before &disconnect:"),
375 parent);
376 predisconnect_label->setAlignment(Qt::AlignVCenter);
377 l1->addWidget(predisconnect_label, 2, 0);
378 predisconnect = new QLineEdit(parent);
379 predisconnect_label->setBuddy(predisconnect);
380 predisconnect->setMaxLength(COMMAND_SIZE);
381 l1->addWidget(predisconnect, 2, 1);
382 tmp = i18n("Allows you to run a program <b>before</b> a connection\n"
383 "is closed. The connection will stay open until\n"
384 "the program exits.");
386 predisconnect_label->setWhatsThis(tmp);
387 predisconnect->setWhatsThis(tmp);
389 discommand_label = new QLabel(i18n("U&pon disconnect:"),
390 parent);
391 discommand_label->setAlignment(Qt::AlignVCenter);
392 l1->addWidget(discommand_label, 3, 0);
394 discommand = new QLineEdit(parent);
395 discommand_label->setBuddy(discommand);
396 discommand->setMaxLength(COMMAND_SIZE);
397 l1->addWidget(discommand, 3, 1);
398 tmp = i18n("Allows you to run a program <b>after</b> a connection\n"
399 "has been closed.");
401 discommand_label->setWhatsThis(tmp);
402 discommand->setWhatsThis(tmp);
404 // extra space between entries
405 l1->addItem(new QSpacerItem(0, 5), 1, 0);
406 l1->addItem(new QSpacerItem(0, 5), 3, 0);
408 tl->addStretch(1);
409 tl->activate();
411 // Set defaults if editing an existing connection
412 if(!isnewaccount) {
413 before_connect->setText(gpppdata.command_before_connect());
414 command->setText(gpppdata.command_on_connect());
415 discommand->setText(gpppdata.command_on_disconnect());
416 predisconnect->setText(gpppdata.command_before_disconnect());
421 bool ExecWidget::save() {
422 gpppdata.setCommand_before_connect(before_connect->text());
423 gpppdata.setCommand_on_connect(command->text());
424 gpppdata.setCommand_before_disconnect(predisconnect->text());
425 gpppdata.setCommand_on_disconnect(discommand->text());
426 return true;
431 /////////////////////////////////////////////////////////////////////////////
433 // IPWidget
435 /////////////////////////////////////////////////////////////////////////////
436 IPWidget::IPWidget( QWidget *parent, bool isnewaccount, const char *name )
437 : QWidget(parent)
439 setObjectName(name);
440 QVBoxLayout *topLayout = new QVBoxLayout(parent);
441 topLayout->setSpacing(KDialog::spacingHint());
443 box = new Q3GroupBox(1, Qt::Horizontal,i18n("C&onfiguration"), parent);
444 box->setInsideSpacing(KDialog::spacingHint());
446 rb = new Q3ButtonGroup(parent);
447 rb->hide();
448 connect(rb, SIGNAL(clicked(int)),
449 SLOT(hitIPSelect(int)));
451 dynamicadd_rb = new QRadioButton(box);
452 dynamicadd_rb->setText(i18n("Dynamic IP address"));
453 dynamicadd_rb->setWhatsThis(
454 i18n("Select this option when your computer gets an\n"
455 "internet address (IP) every time a\n"
456 "connection is made.\n"
457 "\n"
458 "Almost every Internet Service Provider uses\n"
459 "this method, so this should be turned on."));
461 staticadd_rb = new QRadioButton(box);
462 staticadd_rb->setText(i18n("Static IP address"));
463 rb->insert(dynamicadd_rb, 0);
464 rb->insert(staticadd_rb, 1);
465 staticadd_rb->setWhatsThis(
466 i18n("Select this option when your computer has a\n"
467 "fixed internet address (IP). Most computers\n"
468 "don't have this, so you should probably select\n"
469 "dynamic IP addressing unless you know what you\n"
470 "are doing."));
472 QWidget *ipWidget = new QWidget(box);
473 QGridLayout *ipLayout = new QGridLayout(ipWidget);
474 ipLayout->setSpacing(KDialog::spacingHint());
476 ipaddress_label = new QLabel(i18n("&IP address:"), ipWidget);
477 QString tmp = i18n("If your computer has a permanent internet\n"
478 "address, you must supply your IP address here.");
479 ipLayout->addWidget(ipaddress_label, 0, 0);
481 ipaddress_l = new IPLineEdit(ipWidget);
482 ipaddress_label->setBuddy(ipaddress_l);
483 ipLayout->addWidget(ipaddress_l, 0, 1);
485 ipaddress_label->setWhatsThis(tmp);
486 ipaddress_l->setWhatsThis(tmp);
488 sub_label = new QLabel(i18n("&Subnet mask:"), ipWidget);
489 tmp = i18n("<p>If your computer has a static Internet address,\n"
490 "you must supply a network mask here. In almost\n"
491 "all cases this netmask will be <b>255.255.255.0</b>,\n"
492 "but your mileage may vary.\n"
493 "\n"
494 "If unsure, contact your Internet Service Provider");
495 ipLayout->addWidget(sub_label, 1, 0);
497 subnetmask_l = new IPLineEdit(ipWidget);
498 sub_label->setBuddy(subnetmask_l);
499 ipLayout->addWidget(subnetmask_l, 1, 1);
501 sub_label->setWhatsThis(tmp);
502 subnetmask_l->setWhatsThis(tmp);
504 autoname = new QCheckBox(i18n("&Auto-configure hostname from this IP"), parent);
505 autoname->setChecked(gpppdata.autoname());
506 connect(autoname,SIGNAL(toggled(bool)),
507 this,SLOT(autoname_t(bool)));
509 autoname->setWhatsThis(
510 i18n("<p>Whenever you connect, this reconfigures\n"
511 "your hostname to match the IP address you\n"
512 "got from the PPP server. This may be useful\n"
513 "if you need to use a protocol which depends\n"
514 "on this information, but it can also cause several\n"
515 "<a href=\"kppp-7.html#autohostname\">problems</a>.\n"
516 "\n"
517 "Do not enable this unless you really need it."));
519 topLayout->addWidget(box);
520 topLayout->addWidget(autoname);
521 topLayout->addStretch();
523 //load info from gpppdata
524 if(!isnewaccount) {
525 if(gpppdata.ipaddr() == "0.0.0.0" &&
526 gpppdata.subnetmask() == "0.0.0.0") {
527 dynamicadd_rb->setChecked(true);
528 hitIPSelect(0);
529 autoname->setChecked(gpppdata.autoname());
531 else {
532 ipaddress_l->setText(gpppdata.ipaddr());
533 subnetmask_l->setText(gpppdata.subnetmask());
534 staticadd_rb->setChecked(true);
535 autoname->setChecked(false);
538 else {
539 dynamicadd_rb->setChecked(true);
540 hitIPSelect(0);
545 void IPWidget::autoname_t(bool on) {
546 static bool was_warned = false;
548 // big-fat warning when selecting the auto configure hostname option
549 if(on && !was_warned) {
550 KMessageBox::information(this,
551 i18n("Selecting this option might cause some weird "
552 "problems with the X-server and applications "
553 "while kppp is connected. Don't use it until "
554 "you know what you are doing!\n"
555 "For more information take a look at the "
556 "handbook (or help) in the section \"Frequently "
557 "asked questions\"."),
558 i18n("Warning"));
559 was_warned = true;
564 void IPWidget::save() {
565 if(dynamicadd_rb->isChecked()) {
566 gpppdata.setIpaddr("0.0.0.0");
567 gpppdata.setSubnetmask("0.0.0.0");
568 } else {
569 gpppdata.setIpaddr(ipaddress_l->text());
570 gpppdata.setSubnetmask(subnetmask_l->text());
572 gpppdata.setAutoname(autoname->isChecked());
576 void IPWidget::hitIPSelect( int i ) {
577 if(i == 0) {
578 ipaddress_label->setEnabled(false);
579 sub_label->setEnabled(false);
580 ipaddress_l->setEnabled(false);
581 subnetmask_l->setEnabled(false);
583 else {
584 ipaddress_label->setEnabled(true);
585 sub_label->setEnabled(true);
586 ipaddress_l->setEnabled(true);
587 subnetmask_l->setEnabled(true);
593 DNSWidget::DNSWidget( QWidget *parent, bool isnewaccount )
594 : QWidget(parent)
596 // box = new QGroupBox(this);
597 QGridLayout *tl = new QGridLayout(this );
598 tl->setSpacing( KDialog::spacingHint() );
600 dnsdomain_label = new QLabel(i18n("Domain &name:"), this);
601 tl->addWidget(dnsdomain_label, 0, 0);
603 dnsdomain = new QLineEdit(this);
604 dnsdomain_label->setBuddy(dnsdomain);
605 dnsdomain->setMaxLength(DOMAIN_SIZE);
606 tl->addWidget(dnsdomain, 0, 1);
607 QString tmp = i18n("If you enter a domain name here, this domain\n"
608 "name is used for your computer while you are\n"
609 "connected. When the connection is closed, the\n"
610 "original domain name of your computer is\n"
611 "restored.\n"
612 "\n"
613 "If you leave this field blank, no changes are\n"
614 "made to the domain name.");
616 dnsdomain_label->setWhatsThis(tmp);
617 dnsdomain->setWhatsThis(tmp);
619 conf_label = new QLabel(i18n("C&onfiguration:"), this);
620 tl->addWidget(conf_label, 1, 0);
622 bg = new Q3ButtonGroup("Group", this);
623 conf_label->setBuddy(bg);
624 connect(bg, SIGNAL(clicked(int)), SLOT(DNS_Mode_Selected(int)));
625 bg->hide();
627 autodns = new QRadioButton(i18n("Automatic"), this);
628 bg->insert(autodns, 0);
629 tl->addWidget(autodns, 1, 1);
630 // no automatic DNS detection for pppd < 2.3.7
631 if(!gpppdata.pppdVersionMin(2, 3, 7))
632 autodns->setEnabled(false);
634 mandns = new QRadioButton(i18n("Manual"), this);
635 bg->insert(mandns, 1);
636 tl->addWidget(mandns, 2, 1);
638 dns_label = new QLabel(i18n("DNS &IP address:"), this);
639 tl->addWidget(dns_label, 3, 0);
641 QHBoxLayout *l2 = new QHBoxLayout;
642 tl->addLayout(l2, 3, 1);
643 dnsipaddr = new IPLineEdit(this);
644 dns_label->setBuddy(dnsipaddr);
645 connect(dnsipaddr, SIGNAL(returnPressed()),
646 SLOT(adddns()));
647 connect(dnsipaddr, SIGNAL(textChanged(const QString &)),
648 SLOT(DNS_Edit_Changed(const QString &)));
649 l2->addWidget(dnsipaddr, 1);
650 l2->addStretch(1);
651 tmp = i18n("<p>Allows you to specify a new DNS server to be\n"
652 "used while you are connected. When the\n"
653 "connection is closed, this DNS entry will be\n"
654 "removed again.\n"
655 "\n"
656 "To add a DNS server, type in the IP address of\n"
657 "the DNS server here and click on <b>Add</b>");
659 dns_label->setWhatsThis( tmp);
660 dnsipaddr->setWhatsThis( tmp);
662 QHBoxLayout *l1 = new QHBoxLayout;
663 tl->addLayout(l1, 4, 1);
664 add = new QPushButton(i18n("&Add"), this);
665 connect(add, SIGNAL(clicked()), SLOT(adddns()));
666 int width = add->sizeHint().width();
667 width = qMax(width,60);
668 add->setMinimumWidth(width);
669 l1->addWidget(add);
670 l1->addStretch(1);
671 add->setWhatsThis(
672 i18n("Click this button to add the DNS server\n"
673 "specified in the field above. The entry\n"
674 "will then be added to the list below"));
676 remove = new QPushButton(i18n("&Remove"), this);
677 connect(remove, SIGNAL(clicked()), SLOT(removedns()));
678 width = remove->sizeHint().width();
679 width = qMax(width,60);
680 remove->setMinimumWidth(width);
681 l1->addWidget(remove);
682 remove->setWhatsThis(
683 i18n("Click this button to remove the selected DNS\n"
684 "server entry from the list below"));
686 servers_label = new QLabel(i18n("DNS address &list:"), this);
687 servers_label->setAlignment(Qt::AlignTop|Qt::AlignLeft);
688 tl->addWidget(servers_label, 5, 0);
690 dnsservers = new Q3ListBox(this);
691 servers_label->setBuddy(dnsservers);
692 dnsservers->setMinimumSize(150, 80);
693 connect(dnsservers, SIGNAL(highlighted(int)),
694 SLOT(DNS_Entry_Selected(int)));
695 tl->addWidget(dnsservers, 5, 1);
696 tmp = i18n("<p>This shows all defined DNS servers to use\n"
697 "while you are connected. Use the <b>Add</b> and\n"
698 "<b>Remove</b> buttons to modify the list");
700 servers_label->setWhatsThis(tmp);
701 dnsservers->setWhatsThis(tmp);
703 exdnsdisabled_toggle = new QCheckBox(i18n( \
704 "&Disable existing DNS servers during connection"),
705 this);
706 exdnsdisabled_toggle->setChecked(gpppdata.exDNSDisabled());
707 tl->addMultiCellWidget(exdnsdisabled_toggle, 6, 6, 0, 1, Qt::AlignCenter);
708 exdnsdisabled_toggle->setWhatsThis(
709 i18n("<p>When this option is selected, all DNS\n"
710 "servers specified in <tt>/etc/resolv.conf</tt> are\n"
711 "temporary disabled while the dialup connection\n"
712 "is established. After the connection is\n"
713 "closed, the servers will be re-enabled\n"
714 "\n"
715 "Typically, there is no reason to use this\n"
716 "option, but it may become useful under \n"
717 "some circumstances."));
720 // restore data if editing
721 if(!isnewaccount) {
722 dnsservers->insertStringList(gpppdata.dns());
723 dnsdomain->setText(gpppdata.domain());
726 int mode = gpppdata.autoDNS() ? 0 : 1;
727 bg->setButton(mode);
728 DNS_Mode_Selected(mode);
730 tl->activate();
733 void DNSWidget::DNS_Edit_Changed(const QString &text) {
734 QRegExp r("[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+");
735 add->setEnabled(text.contains(r));
738 void DNSWidget::DNS_Entry_Selected(int) {
739 remove->setEnabled(true);
742 void DNSWidget::DNS_Mode_Selected(int mode) {
743 bool on = (mode == 1);
744 dns_label->setEnabled(on);
745 servers_label->setEnabled(on);
746 dnsipaddr->setText("");
747 dnsipaddr->setEnabled(on);
748 add->setEnabled(false);
749 remove->setEnabled(dnsservers->count()>0 && on);
750 dnsservers->clearSelection();
751 dnsservers->setEnabled(on);
752 dnsservers->triggerUpdate(false);
755 void DNSWidget::save() {
756 gpppdata.setAutoDNS(bg->id(bg->selected()) == 0);
757 QStringList serverlist;
758 for(uint i=0; i < dnsservers->count(); i++)
759 serverlist.append(dnsservers->text(i));
760 gpppdata.setDns(serverlist);
762 // strip leading dot
763 QString s(dnsdomain->text());
764 if(s.left(1) == ".")
765 gpppdata.setDomain(s.mid(1));
766 else
767 gpppdata.setDomain(dnsdomain->text());
769 gpppdata.setExDNSDisabled(exdnsdisabled_toggle->isChecked());
773 void DNSWidget::adddns() {
774 if(dnsservers->count() < MAX_DNS_ENTRIES) {
775 dnsservers->insertItem(dnsipaddr->text());
776 dnsipaddr->setText("");
781 void DNSWidget::removedns() {
782 int i;
783 i = dnsservers->currentItem();
784 if(i != -1)
785 dnsservers->removeItem(i);
786 remove->setEnabled(dnsservers->count()>0);
791 // GatewayWidget
793 GatewayWidget::GatewayWidget( QWidget *parent, bool isnewaccount )
794 : QWidget(parent)
796 QVBoxLayout *topLayout = new QVBoxLayout(parent);
797 topLayout->setSpacing(KDialog::spacingHint());
799 box = new Q3GroupBox (1, Qt::Horizontal,i18n("C&onfiguration"), parent);
800 box->setInsideSpacing(KDialog::spacingHint());
802 rb = new Q3ButtonGroup(parent);
803 rb->hide();
804 connect(rb, SIGNAL(clicked(int)), SLOT(hitGatewaySelect(int)));
806 defaultgateway = new QRadioButton(box);
807 defaultgateway->setText(i18n("Default gateway"));
808 rb->insert(defaultgateway, 0);
809 defaultgateway->setWhatsThis(
810 i18n("This makes the PPP peer computer (the computer\n"
811 "you are connected to with your modem) to act as\n"
812 "a gateway. Your computer will send all packets not\n"
813 "going to a computer inside your local net to this\n"
814 "computer, which will route these packets.\n"
815 "\n"
816 "This is the default for most ISPs, so you should\n"
817 "probably leave this option on."));
820 staticgateway = new QRadioButton(box);
821 staticgateway->setText(i18n("Static gateway"));
822 rb->insert(staticgateway, 1);
823 staticgateway->setWhatsThis(
824 i18n("<p>Allows you to specify which computer you want\n"
825 "to use as gateway (see <i>Default Gateway</i> above)"));
827 QWidget *gateBox = new QWidget(box);
828 QHBoxLayout *hboxLayout1 = new QHBoxLayout(gateBox);
829 gateBox->setLayout(hboxLayout1);
830 gate_label = new QLabel(i18n("Gateway &IP address:"), gateBox);
831 gatewayaddr = new IPLineEdit(gateBox);
832 gate_label->setBuddy(gatewayaddr);
834 defaultroute = new QCheckBox(i18n("&Assign the default route to this gateway"),
835 parent);
836 defaultroute->setWhatsThis(
837 i18n("If this option is enabled, all packets not\n"
838 "going to the local net are routed through\n"
839 "the PPP connection.\n"
840 "\n"
841 "Normally, you should turn this on"));
843 topLayout->addWidget(box);
844 topLayout->addWidget(defaultroute);
845 topLayout->addStretch();
847 //load info from gpppdata
848 if(!isnewaccount) {
849 if(gpppdata.gateway() == "0.0.0.0") {
850 defaultgateway->setChecked(true);
851 hitGatewaySelect(0);
853 else {
854 gatewayaddr->setText(gpppdata.gateway());
855 staticgateway->setChecked(true);
857 defaultroute->setChecked(gpppdata.defaultroute());
859 else {
860 defaultgateway->setChecked(true);
861 hitGatewaySelect(0);
862 defaultroute->setChecked(true);
866 void GatewayWidget::save() {
867 gpppdata.setGateway(gatewayaddr->text());
868 gpppdata.setDefaultroute(defaultroute->isChecked());
872 void GatewayWidget::hitGatewaySelect( int i ) {
873 if(i == 0) {
874 gatewayaddr->setText("0.0.0.0");
875 gatewayaddr->setEnabled(false);
876 gate_label->setEnabled(false);
878 else {
879 gatewayaddr->setEnabled(true);
880 gatewayaddr->setText("");
881 gate_label->setEnabled(true);
887 ScriptWidget::ScriptWidget( QWidget *parent, bool isnewaccount, const char *name )
888 : QWidget(parent)
890 setObjectName(name);
891 QVBoxLayout *tl = new QVBoxLayout(parent);
892 tl->setSpacing(KDialog::spacingHint());
893 tl->setMargin(0);
894 se = new ScriptEdit(parent);
895 connect(se, SIGNAL(returnPressed()), SLOT(addButton()));
896 tl->addWidget(se);
898 // insert equal-sized buttons
899 KDialogButtonBox *bbox = new KDialogButtonBox(parent);
900 add = bbox->addButton(i18n("&Add"),QDialogButtonBox::ActionRole);
901 connect(add, SIGNAL(clicked()), SLOT(addButton()));
902 insert = bbox->addButton(i18n("&Insert"),QDialogButtonBox::ActionRole);
903 connect(insert, SIGNAL(clicked()), SLOT(insertButton()));
904 remove = bbox->addButton(i18n("&Remove"),QDialogButtonBox::ActionRole);
905 connect(remove, SIGNAL(clicked()), SLOT(removeButton()));
906 tl->addWidget(bbox);
908 QHBoxLayout *l12 = new QHBoxLayout(0);
909 tl->addLayout(l12);
910 stl = new Q3ListBox(parent);
911 stl->setVScrollBarMode( Q3ScrollView::AlwaysOff );
912 connect(stl, SIGNAL(highlighted(int)), SLOT(stlhighlighted(int)));
913 stl->setMinimumSize(QSize(70, 140));
915 sl = new Q3ListBox(parent);
916 sl->setVScrollBarMode( Q3ScrollView::AlwaysOff );
917 connect(sl, SIGNAL(highlighted(int)), SLOT(slhighlighted(int)));
918 sl->setMinimumSize(QSize(150, 140));
920 slb = new QScrollBar(parent);
921 slb->setFixedWidth(slb->sizeHint().width());
922 connect(slb, SIGNAL(valueChanged(int)), SLOT(scrolling(int)));
924 l12->addWidget(stl, 1);
925 l12->addWidget(sl, 3);
926 l12->addWidget(slb, 0);
928 //load data from gpppdata
929 if(!isnewaccount) {
930 QStringList &comlist = gpppdata.scriptType();
931 QStringList &arglist = gpppdata.script();
932 QStringList::Iterator itcom = comlist.begin();
933 QStringList::Iterator itarg = arglist.begin();
935 for ( ;
936 itcom != comlist.end() && itarg != arglist.end();
937 ++itcom, ++itarg )
939 stl->insertItem(*itcom);
940 sl->insertItem(*itarg);
944 insert->setEnabled(false);
945 remove->setEnabled(false);
946 adjustScrollBar();
947 tl->activate();
950 bool ScriptWidget::check() {
951 uint lstart = 0;
952 uint lend = 0;
953 uint errcnt = 0;
955 if(sl->count() > 0) {
956 for( uint i=0; i <= sl->count()-1; i++) {
957 if(stl->text(i) == "LoopStart") {
958 lstart++;
960 if (stl->text(i) == "LoopEnd") {
961 lend++;
963 if ( lend > lstart ) errcnt++;
965 return ( (errcnt == 0 ) && (lstart == lend) );
967 return true;
971 void ScriptWidget::save() {
972 QStringList typelist, arglist;
973 for(uint i=0; i < sl->count(); i++) {
974 typelist.append(stl->text(i));
975 arglist.append(sl->text(i));
977 gpppdata.setScriptType(typelist);
978 gpppdata.setScript(arglist);
983 void ScriptWidget::adjustScrollBar() {
984 if((int)sl->count() <= sl->numItemsVisible())
985 slb->setRange(0, 0);
986 else
987 slb->setRange(0, (sl->count() - sl->numItemsVisible())+1);
991 void ScriptWidget::scrolling(int i) {
992 sl->setTopItem(i);
993 stl->setTopItem(i);
997 void ScriptWidget::slhighlighted(int i) {
998 insert->setEnabled(true);
999 remove->setEnabled(true);
1000 stl->setCurrentItem(i);
1004 void ScriptWidget::stlhighlighted(int i) {
1005 insert->setEnabled(true);
1006 remove->setEnabled(true);
1007 sl->setCurrentItem(i);
1011 void ScriptWidget::addButton() {
1012 //don't allow more than the maximum script entries
1013 if(sl->count() == MAX_SCRIPT_ENTRIES-1)
1014 return;
1016 switch(se->type()) {
1017 case ScriptEdit::Expect:
1018 stl->insertItem("Expect");
1019 sl->insertItem(se->text());
1020 break;
1022 case ScriptEdit::Send:
1023 stl->insertItem("Send");
1024 sl->insertItem(se->text());
1025 break;
1027 case ScriptEdit::SendNoEcho:
1028 stl->insertItem("SendNoEcho");
1029 sl->insertItem(se->text());
1030 break;
1032 case ScriptEdit::Pause:
1033 stl->insertItem("Pause");
1034 sl->insertItem(se->text());
1035 break;
1037 case ScriptEdit::Hangup:
1038 stl->insertItem("Hangup");
1039 sl->insertItem("");
1040 break;
1042 case ScriptEdit::Answer:
1043 stl->insertItem("Answer");
1044 sl->insertItem("");
1045 break;
1047 case ScriptEdit::Timeout:
1048 stl->insertItem("Timeout");
1049 sl->insertItem(se->text());
1050 break;
1052 case ScriptEdit::Password:
1053 stl->insertItem("Password");
1054 sl->insertItem(se->text());
1055 break;
1057 case ScriptEdit::ID:
1058 stl->insertItem("ID");
1059 sl->insertItem(se->text());
1060 break;
1062 case ScriptEdit::Prompt:
1063 stl->insertItem("Prompt");
1064 sl->insertItem(se->text());
1065 break;
1067 case ScriptEdit::PWPrompt:
1068 stl->insertItem("PWPrompt");
1069 sl->insertItem(se->text());
1070 break;
1072 case ScriptEdit::LoopStart:
1073 stl->insertItem("LoopStart");
1074 sl->insertItem(se->text());
1075 break;
1077 case ScriptEdit::LoopEnd:
1078 stl->insertItem("LoopEnd");
1079 sl->insertItem(se->text());
1080 break;
1082 case ScriptEdit::Scan:
1083 stl->insertItem("Scan");
1084 sl->insertItem(se->text());
1085 break;
1087 case ScriptEdit::Save:
1088 stl->insertItem("Save");
1089 sl->insertItem(se->text());
1090 break;
1092 default:
1093 break;
1096 //get the scrollbar adjusted, and scroll the list so we can see what
1097 //we're adding to
1098 adjustScrollBar();
1099 slb->setValue(slb->maximum());
1101 //clear the text in the entry box
1102 se->setText("");
1106 void ScriptWidget::insertButton() {
1107 //exit if there is no highlighted item, or we've reached the
1108 //maximum entries in the script list
1109 if(sl->currentItem() < 0 || (sl->count() == MAX_SCRIPT_ENTRIES-1))
1110 return;
1112 switch(se->type()) {
1113 case ScriptEdit::Expect:
1114 stl->insertItem("Expect", stl->currentItem());
1115 sl->insertItem(se->text(), sl->currentItem());
1116 break;
1118 case ScriptEdit::Send:
1119 stl->insertItem("Send", stl->currentItem());
1120 sl->insertItem(se->text(), sl->currentItem());
1121 break;
1123 case ScriptEdit::SendNoEcho:
1124 stl->insertItem("SendNoEcho", stl->currentItem());
1125 sl->insertItem(se->text(), sl->currentItem());
1126 break;
1128 case ScriptEdit::Pause:
1129 stl->insertItem("Pause", stl->currentItem());
1130 sl->insertItem(se->text(), sl->currentItem());
1131 break;
1133 case ScriptEdit::Hangup:
1134 stl->insertItem("Hangup", stl->currentItem());
1135 sl->insertItem("", sl->currentItem());
1136 break;
1138 case ScriptEdit::Answer:
1139 stl->insertItem("Answer", stl->currentItem());
1140 sl->insertItem("", sl->currentItem());
1141 break;
1143 case ScriptEdit::Timeout:
1144 stl->insertItem("Timeout", stl->currentItem());
1145 sl->insertItem(se->text(), sl->currentItem());
1146 break;
1148 case ScriptEdit::Password:
1149 stl->insertItem("Password", stl->currentItem());
1150 sl->insertItem(se->text(), sl->currentItem());
1151 break;
1153 case ScriptEdit::ID:
1154 stl->insertItem("ID", stl->currentItem());
1155 sl->insertItem(se->text(), sl->currentItem());
1156 break;
1158 case ScriptEdit::Prompt:
1159 stl->insertItem("Prompt", stl->currentItem());
1160 sl->insertItem(se->text(), sl->currentItem());
1161 break;
1163 case ScriptEdit::PWPrompt:
1164 stl->insertItem("PWPrompt", stl->currentItem());
1165 sl->insertItem(se->text(), sl->currentItem());
1166 break;
1168 case ScriptEdit::LoopStart:
1169 stl->insertItem("LoopStart", stl->currentItem());
1170 sl->insertItem(se->text(), sl->currentItem());
1171 break;
1173 case ScriptEdit::LoopEnd:
1174 stl->insertItem("LoopEnd", stl->currentItem());
1175 sl->insertItem(se->text(), sl->currentItem());
1176 break;
1178 case ScriptEdit::Scan:
1179 stl->insertItem("Scan", stl->currentItem());
1180 sl->insertItem(se->text(), sl->currentItem());
1181 break;
1183 case ScriptEdit::Save:
1184 stl->insertItem("Save", stl->currentItem());
1185 sl->insertItem(se->text(), sl->currentItem());
1186 break;
1188 default:
1189 break;
1191 adjustScrollBar();
1192 se->setText("");
1196 void ScriptWidget::removeButton() {
1197 if(sl->currentItem() >= 0) {
1198 int stlc = stl->currentItem();
1199 sl->removeItem(sl->currentItem());
1200 stl->removeItem(stlc);
1201 adjustScrollBar();
1202 insert->setEnabled(sl->currentItem() != -1);
1203 remove->setEnabled(sl->currentItem() != -1);
1209 /////////////////////////////////////////////////////////////////////////////
1211 // Used to specify a new phone number
1213 /////////////////////////////////////////////////////////////////////////////
1214 PhoneNumberDialog::PhoneNumberDialog(QWidget *parent)
1215 : KDialog(parent) {
1216 setCaption( i18n("Add Phone Number") );
1217 setButtons( Ok|Cancel );
1218 setDefaultButton( Ok );
1219 setModal( true );
1220 KWindowSystem::setIcons(winId(), qApp->windowIcon().pixmap(IconSize(K3Icon::Desktop),IconSize(K3Icon::Desktop)), qApp->windowIcon().pixmap(IconSize(K3Icon::Small),IconSize(K3Icon::Small)));
1222 QWidget *hbox = new QWidget(this);
1223 QHBoxLayout *hboxLayout2 = new QHBoxLayout(hbox);
1224 hbox->setLayout(hboxLayout2);
1225 setMainWidget(hbox);
1227 hboxLayout2->setSpacing(KDialog::spacingHint());
1229 new QLabel(i18n("Enter a phone number:"), hbox);
1231 le = newLineEdit(14, hbox);
1232 le->setMinimumWidth(125);
1234 connect(le, SIGNAL(textChanged(const QString &)),
1235 this, SLOT(textChanged(const QString &)));
1237 le->setFocus();
1238 textChanged("");
1240 showButtonSeparator(true);
1244 QString PhoneNumberDialog::phoneNumber() {
1245 QString s = le->text();
1247 return s;
1251 void PhoneNumberDialog::textChanged(const QString &s) {
1252 enableButtonOk(s.length() > 0);
1256 #include "edit.moc"