nsSize nsSprocketLayout::GetPrefSize(nsIFrame* aBox, nsBoxLayoutState& aState) { nsSize vpref (0, 0); bool isHorizontal = IsHorizontal(aBox); nscoord biggestPref = 0; // run through all the children and get their min, max, and preferred sizes // return us the size of the box nsIFrame* child = nsBox::GetChildBox(aBox); nsFrameState frameState = nsFrameState(0); GetFrameState(aBox, frameState); bool isEqual = !!(frameState & NS_STATE_EQUAL_SIZE); int32_t count = 0; while (child) { // ignore collapsed children if (!child->IsCollapsed()) { nsSize pref = child->GetPrefSize(aState); AddMargin(child, pref); if (isEqual) { if (isHorizontal) { if (pref.width > biggestPref) biggestPref = pref.width; } else { if (pref.height > biggestPref) biggestPref = pref.height; } } AddLargestSize(vpref, pref, isHorizontal); count++; } child = nsBox::GetNextBox(child); } if (isEqual) { if (isHorizontal) vpref.width = biggestPref*count; else vpref.height = biggestPref*count; } // now add our border and padding AddBorderAndPadding(aBox, vpref); return vpref; }
KDMConvenienceWidget::KDMConvenienceWidget(QWidget *parent) : QWidget(parent) { QString wtstr; QLabel *paranoia = new QLabel( i18n("<big><b><center>Attention<br/>" "Read help</center></b></big>"), this); QPalette p; p.setBrush(QPalette::WindowText, KColorScheme(QPalette::Active, KColorScheme::Window) .foreground(KColorScheme::NegativeText)); paranoia->setPalette(p); QSizePolicy vpref(QSizePolicy::Minimum, QSizePolicy::Fixed); alGroup = new QGroupBox(i18n("Enable Au&to-Login"), this); alGroup->setCheckable(true); alGroup->setSizePolicy(vpref); QVBoxLayout *laygroup2 = new QVBoxLayout(alGroup); laygroup2->setSpacing(KDialog::spacingHint()); alGroup->setWhatsThis(i18n("Turn on the auto-login feature." " This applies only to KDM's graphical login." " Think twice before enabling this!")); connect(alGroup, SIGNAL(toggled(bool)), SIGNAL(changed())); userlb = new KComboBox(alGroup); QLabel *u_label = new QLabel(i18n("Use&r:"), alGroup); u_label->setBuddy(userlb); QHBoxLayout *hlpl1 = new QHBoxLayout(); laygroup2->addItem(hlpl1); hlpl1->setSpacing(KDialog::spacingHint()); hlpl1->addWidget(u_label); hlpl1->addWidget(userlb); hlpl1->addStretch(1); connect(userlb, SIGNAL(highlighted(int)), SIGNAL(changed())); wtstr = i18n("Select the user to be logged in automatically."); u_label->setWhatsThis(wtstr); userlb->setWhatsThis(wtstr); autoLockCheck = new QCheckBox(i18n("Loc&k session"), alGroup); laygroup2->addWidget(autoLockCheck); connect(autoLockCheck, SIGNAL(toggled(bool)), SIGNAL(changed())); autoLockCheck->setWhatsThis(i18n( "The automatically started session " "will be locked immediately (provided it is a KDE session). This can " "be used to obtain a super-fast login restricted to one user.")); puGroup = new QGroupBox(i18nc("@title:group", "Preselect User"), this); puGroup->setSizePolicy(vpref); npRadio = new QRadioButton(i18nc("@option:radio preselected user", "&None"), puGroup); ppRadio = new QRadioButton(i18nc("@option:radio preselected user", "Prev&ious"), puGroup); ppRadio->setWhatsThis(i18n( "Preselect the user that logged in previously. " "Use this if this computer is usually used several consecutive times by one user.")); spRadio = new QRadioButton(i18nc("@option:radio preselected user", "Specifi&ed:"), puGroup); spRadio->setWhatsThis(i18n( "Preselect the user specified in the combo box to the right. " "Use this if this computer is predominantly used by a certain user.")); QButtonGroup *buttonGroup = new QButtonGroup(puGroup); connect(buttonGroup, SIGNAL(buttonClicked(int)), SLOT(slotPresChanged())); connect(buttonGroup, SIGNAL(buttonClicked(int)), SIGNAL(changed())); buttonGroup->addButton(npRadio); buttonGroup->addButton(ppRadio); buttonGroup->addButton(spRadio); QVBoxLayout *laygroup5 = new QVBoxLayout(puGroup); laygroup5->setSpacing(KDialog::spacingHint()); laygroup5->addWidget(npRadio); laygroup5->addWidget(ppRadio); puserlb = new KComboBox(true, puGroup); connect(puserlb, SIGNAL(editTextChanged(QString)), SIGNAL(changed())); wtstr = i18n( "Select the user to be preselected for login. " "This box is editable, so you can specify an arbitrary non-existent " "user to mislead possible attackers."); puserlb->setWhatsThis(wtstr); QBoxLayout *hlpl = new QHBoxLayout(); laygroup5->addItem(hlpl); hlpl->setSpacing(KDialog::spacingHint()); hlpl->setMargin(0); hlpl->addWidget(spRadio); hlpl->addWidget(puserlb); hlpl->addStretch(1); // This is needed before the abuse below to ensure the combo is enabled in time connect(spRadio, SIGNAL(clicked(bool)), SLOT(slotPresChanged())); // Abuse the radio button text as a label for the combo connect(spRadio, SIGNAL(clicked(bool)), puserlb, SLOT(setFocus())); cbjumppw = new QCheckBox(i18nc("@option:check action", "Focus pass&word"), puGroup); laygroup5->addWidget(cbjumppw); cbjumppw->setWhatsThis(i18n( "When this option is on, KDM will place the cursor " "in the password field instead of the user field after preselecting a user. " "Use this to save one key press per login, if the preselection usually " "does not need to be changed.")); connect(cbjumppw, SIGNAL(toggled(bool)), SIGNAL(changed())); npGroup = new QGroupBox(i18n("Enable Password-&Less Logins"), this); QVBoxLayout *laygroup3 = new QVBoxLayout(npGroup); laygroup3->setSpacing(KDialog::spacingHint()); npGroup->setCheckable(true); npGroup->setWhatsThis(i18n( "When this option is checked, the checked users from " "the list below will be allowed to log in without entering their " "password. This applies only to KDM's graphical login. " "Think twice before enabling this!")); connect(npGroup, SIGNAL(toggled(bool)), SIGNAL(changed())); QLabel *pl_label = new QLabel(i18n("No password re&quired for:"), npGroup); laygroup3->addWidget(pl_label); npuserlv = new QListWidget(npGroup); laygroup3->addWidget(npuserlv); pl_label->setBuddy(npuserlv); npuserlv->setWhatsThis(i18n( "Check all users you want to allow a password-less login for. " "Entries denoted with '@' are user groups. Checking a group is like " "checking all users in that group.")); btGroup = new QGroupBox(i18nc("@title:group", "Miscellaneous"), this); QVBoxLayout *laygroup4 = new QVBoxLayout(btGroup); laygroup4->setSpacing(KDialog::spacingHint()); cbarlen = new QCheckBox(i18n("Automatically log in again after &X server crash"), btGroup); cbarlen->setWhatsThis(i18n( "When this option is on, a user will be " "logged in again automatically when their session is interrupted by an " "X server crash; note that this can open a security hole: if you use " "a screen locker than KDE's integrated one, this will make " "circumventing a password-secured screen lock possible.")); //TODO a screen locker _other_ than laygroup4->addWidget(cbarlen); connect(cbarlen, SIGNAL(toggled(bool)), SIGNAL(changed())); QGridLayout *main = new QGridLayout(this); main->setSpacing(10); main->addWidget(paranoia, 0, 0); main->addWidget(alGroup, 1, 0); main->addWidget(puGroup, 2, 0); main->addWidget(npGroup, 0, 1, 4, 1); main->addWidget(btGroup, 4, 0, 1, 2); main->setColumnStretch(0, 1); main->setColumnStretch(1, 2); main->setRowStretch(3, 1); connect(userlb, SIGNAL(activated(QString)), SLOT(slotSetAutoUser(QString))); connect(puserlb, SIGNAL(editTextChanged(QString)), SLOT(slotSetPreselUser(QString))); connect(npuserlv, SIGNAL(itemClicked(QListWidgetItem*)), SLOT(slotUpdateNoPassUser(QListWidgetItem*))); }