/**************************************************************************** ** ** Implementation of TQDialogButtons class ** ** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved. ** ** This file is part of the widgets module of the TQt GUI Toolkit. ** ** This file may be used under the terms of the GNU General ** Public License versions 2.0 or 3.0 as published by the Free ** Software Foundation and appearing in the files LICENSE.GPL2 ** and LICENSE.GPL3 included in the packaging of this file. ** Alternatively you may (at your option) use any later version ** of the GNU General Public License if such license has been ** publicly approved by Trolltech ASA (or its successors, if any) ** and the KDE Free TQt Foundation. ** ** Please review the following information to ensure GNU General ** Public Licensing requirements will be met: ** http://trolltech.com/products/qt/licenses/licensing/opensource/. ** If you are unsure which license is appropriate for your use, please ** review the following information: ** http://trolltech.com/products/qt/licenses/licensing/licensingoverview ** or contact the sales department at sales@trolltech.com. ** ** This file may be used under the terms of the Q Public License as ** defined by Trolltech ASA and appearing in the file LICENSE.TQPL ** included in the packaging of this file. Licensees holding valid TQt ** Commercial licenses may use this file in accordance with the TQt ** Commercial License Agreement provided with the Software. ** ** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, ** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted ** herein. ** **********************************************************************/ #include "qdialogbuttons_p.h" #ifndef TQT_NO_DIALOGBUTTONS #include #include #include #include #include #ifndef TQT_NO_DIALOG #include #endif // TQT_NO_DIALOG #include #include #include struct TQDialogButtonsPrivate { TQMap text; TQMap buttons; TQGuardedPtr custom; TQ_UINT32 enabled, visible; TQDialogButtons::Button def; TQt::Orientation orient; bool questionMode; }; #ifndef TQT_NO_DIALOG TQDialogButtons::TQDialogButtons(TQDialog *parent, bool autoConnect, TQ_UINT32 buttons, Orientation orient, const char *name ) : TQWidget(parent, name) { init(buttons, orient); if(parent && autoConnect) { TQObject::connect(this, SIGNAL(acceptClicked()), parent, SLOT(accept())); TQObject::connect(this, SIGNAL(rejectClicked()), parent, SLOT(reject())); } } #endif // TQT_NO_DIALOG TQDialogButtons::TQDialogButtons(TQWidget *parent, TQ_UINT32 buttons, Orientation orient, const char *name ) : TQWidget(parent, name) { init(buttons, orient); } void TQDialogButtons::init(TQ_UINT32 buttons, Orientation orient) { if(buttons == All) { tqWarning("TQDialogButtons: cannot specify All by itself!"); buttons = None; } d = new TQDialogButtonsPrivate; d->questionMode = FALSE; d->orient = orient; d->def = (Button)style().styleHint(TQStyle::SH_DialogButtons_DefaultButton, this); d->enabled = d->visible = buttons; } TQDialogButtons::~TQDialogButtons() { delete (TQWidget *)d->custom; delete d; } void TQDialogButtons::setQuestionMode(bool b) { d->questionMode = b; } bool TQDialogButtons::questionMode() const { return d->questionMode; } void TQDialogButtons::setButtonEnabled(Button button, bool enabled) { if(enabled) d->enabled |= button; else d->enabled ^= button; if(d->buttons.contains(button)) d->buttons[button]->setEnabled(enabled); } bool TQDialogButtons::isButtonEnabled(Button button) const { return ((int)(d->enabled & button)) == button; } void TQDialogButtons::setButtonVisible(Button button, bool visible) { if(visible) { if(d->buttons.contains(button)) d->buttons[button]->show(); d->visible |= button; } else { if(d->buttons.contains(button)) d->buttons[button]->hide(); d->visible ^= button; } layoutButtons(); } bool TQDialogButtons::isButtonVisible(Button button) const { return ((int)(d->visible & button)) == button; } TQ_UINT32 TQDialogButtons::visibleButtons() const { return d->visible; } void TQDialogButtons::addWidget(TQWidget *w) { TQBoxLayout *lay = NULL; if(!d->custom) { d->custom = new TQWidget(this, "dialog_custom_area"); if(orientation() == Horizontal) lay = new TQHBoxLayout(d->custom); else lay = new TQVBoxLayout(d->custom); layoutButtons(); } else { lay = (TQBoxLayout*)d->custom->layout(); } if(w->parent() != d->custom) w->reparent(d->custom, 0, TQPoint(0, 0), TRUE); lay->addWidget(w); } void TQDialogButtons::setDefaultButton(Button button) { if(!((int)(d->visible & button) == button)) { tqWarning("TQDialogButtons: Button '%d' is not visible (so cannot be default)", button); return; } if(d->def != button) { #ifndef TQT_NO_PROPERTIES if(d->buttons.contains(d->def)) d->buttons[d->def]->setProperty("default", TQVariant(false)); #endif d->def = button; #ifndef TQT_NO_PROPERTIES if(d->buttons.contains(d->def)) d->buttons[d->def]->setProperty("default", TQVariant(false)); #endif } } TQDialogButtons::Button TQDialogButtons::defaultButton() const { return d->def; } void TQDialogButtons::setButtonText(Button button, const TQString &str) { d->text[button] = str; #ifndef TQT_NO_PROPERTIES if(d->buttons.contains(button)) d->buttons[button]->setProperty("text", TQVariant(str)); #endif layoutButtons(); } TQString TQDialogButtons::buttonText(Button b) const { if(d->text.contains(b)) return d->text[b]; return TQString(); //null if it is default.. } void TQDialogButtons::setOrientation(Orientation orient) { if(d->orient != orient) { d->orient = orient; if(d->custom && d->custom->layout()) ((TQBoxLayout*)d->custom->layout())->setDirection(orient == Horizontal ? TQBoxLayout::LeftToRight : TQBoxLayout::TopToBottom); layoutButtons(); } } TQt::Orientation TQDialogButtons::orientation() const { return d->orient; } TQWidget * TQDialogButtons::createButton(Button b) { TQPushButton *ret = new TQPushButton(this, "qdialog_button"); TQObject::connect(ret, SIGNAL(clicked()), this, SLOT(handleClicked())); if(d->text.contains(b)) { ret->setText(d->text[b]); } else { switch(b) { case All: { TQString txt = buttonText(defaultButton()); if(txt.isNull()) { if(defaultButton() == Accept) { if(questionMode()) txt = tr("Yes to All"); else txt = tr("OK to All"); } else { if(questionMode()) txt = tr("No to All"); else txt = tr("Cancel All"); } } else { txt += tr(" to All"); //ick, I can't really do this!! } ret->setText(txt); break; } case Accept: if(questionMode()) ret->setText(tr("Yes")); else ret->setText(tr("OK")); break; case Reject: if(questionMode()) ret->setText(tr("No")); else ret->setText(tr("Cancel")); break; case Apply: ret->setText(tr("Apply")); break; case Ignore: ret->setText(tr("Ignore")); break; case Retry: ret->setText(tr("Retry")); break; case Abort: ret->setText(tr("Abort")); break; case Help: ret->setText(tr("Help")); break; default: break; } } return ret; } void TQDialogButtons::handleClicked() { const TQObject *s = sender(); if(!s) return; for(TQMapIterator it = d->buttons.begin(); it != d->buttons.end(); ++it) { if(it.data() == s) { emit clicked((TQDialogButtons::Button)it.key()); switch(it.key()) { case Retry: emit retryClicked(); break; case Ignore: emit ignoreClicked(); break; case Abort: emit abortClicked(); break; case All: emit allClicked(); break; case Accept: emit acceptClicked(); break; case Reject: emit rejectClicked(); break; case Apply: emit applyClicked(); break; case Help: emit helpClicked(); break; default: break; } return; } } } void TQDialogButtons::resizeEvent(TQResizeEvent *) { layoutButtons(); } void TQDialogButtons::showEvent(TQShowEvent *) { layoutButtons(); } void TQDialogButtons::styleChanged(TQStyle &old) { layoutButtons(); TQWidget::styleChange(old); } void TQDialogButtons::layoutButtons() { if(!isVisible()) //nah.. return; TQStyle::SubRect rects[] = { TQStyle::SR_DialogButtonAccept, TQStyle::SR_DialogButtonReject, TQStyle::SR_DialogButtonApply, TQStyle::SR_DialogButtonHelp, TQStyle::SR_DialogButtonCustom, TQStyle::SR_DialogButtonAll, TQStyle::SR_DialogButtonRetry, TQStyle::SR_DialogButtonIgnore, TQStyle::SR_DialogButtonAbort }; for(unsigned int i = 0; i < (sizeof(rects) / sizeof(rects[0])); i++) { TQWidget *w = NULL; if(rects[i] == TQStyle::SR_DialogButtonCustom) { w = d->custom; } else { Button b = None; if(rects[i] == TQStyle::SR_DialogButtonApply) b = Apply; else if(rects[i] == TQStyle::SR_DialogButtonAll) b = All; else if(rects[i] == TQStyle::SR_DialogButtonAccept) b = Accept; else if(rects[i] == TQStyle::SR_DialogButtonReject) b = Reject; else if(rects[i] == TQStyle::SR_DialogButtonHelp) b = Help; else if(rects[i] == TQStyle::SR_DialogButtonRetry) b = Retry; else if(rects[i] == TQStyle::SR_DialogButtonAbort) b = Abort; else if(rects[i] == TQStyle::SR_DialogButtonIgnore) b = Ignore; if(b != None) { if(d->buttons.contains(b)) { w = d->buttons[b]; if(!(d->visible & b)) { w->hide(); continue; } } else if(d->visible & b) { w = createButton(b); d->buttons.insert(b, w); } else { continue; } if(w) { if(b == d->def) { w->setFocus(); #ifndef TQT_NO_PROPERTIES w->setProperty("default", TQVariant(true)); #endif } w->setEnabled(d->enabled & b); } } } if(w) { w->show(); w->setGeometry(style().subRect(rects[i], this)); } } } TQSize TQDialogButtons::sizeHint() const { constPolish(); TQSize s; if(d->custom) s = d->custom->sizeHint(); return (style().sizeFromContents(TQStyle::CT_DialogButtons, this, s. expandedTo(TQApplication::globalStrut()))); } TQSize TQDialogButtons::sizeHint(TQDialogButtons::Button button) const { TQWidget *w = NULL; if(d->visible & button) { if(!d->buttons.contains(button)) { TQDialogButtons *that = (TQDialogButtons*)this; //ick, constness.. w = that->createButton(button); that->d->buttons.insert(button, w); } else { w = d->buttons[button]; } } return w->sizeHint(); } TQSize TQDialogButtons::minimumSizeHint() const { return sizeHint(); } #endif