-rw-r--r-- | qtcompat/qinputdialog.cpp | 495 |
1 files changed, 495 insertions, 0 deletions
diff --git a/qtcompat/qinputdialog.cpp b/qtcompat/qinputdialog.cpp new file mode 100644 index 0000000..770b281 --- a/dev/null +++ b/qtcompat/qinputdialog.cpp | |||
@@ -0,0 +1,495 @@ | |||
1 | /**************************************************************************** | ||
2 | ** $Id$ | ||
3 | ** | ||
4 | ** Implementation of QInputDialog class | ||
5 | ** | ||
6 | ** Created : 991212 | ||
7 | ** | ||
8 | ** Copyright (C) 1992-2000 Trolltech AS. All rights reserved. | ||
9 | ** | ||
10 | ** This file is part of the dialogs module of the Qt GUI Toolkit. | ||
11 | ** | ||
12 | ** This file may be distributed under the terms of the Q Public License | ||
13 | ** as defined by Trolltech AS of Norway and appearing in the file | ||
14 | ** LICENSE.QPL included in the packaging of this file. | ||
15 | ** | ||
16 | ** This file may be distributed and/or modified under the terms of the | ||
17 | ** GNU General Public License version 2 as published by the Free Software | ||
18 | ** Foundation and appearing in the file LICENSE.GPL included in the | ||
19 | ** packaging of this file. | ||
20 | ** | ||
21 | ** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition | ||
22 | ** licenses may use this file in accordance with the Qt Commercial License | ||
23 | ** Agreement provided with the Software. | ||
24 | ** | ||
25 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE | ||
26 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. | ||
27 | ** | ||
28 | ** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for | ||
29 | ** information about Qt Commercial License Agreements. | ||
30 | ** See http://www.trolltech.com/qpl/ for QPL licensing information. | ||
31 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | ||
32 | ** | ||
33 | ** Contact info@trolltech.com if any conditions of this licensing are | ||
34 | ** not clear to you. | ||
35 | ** | ||
36 | **********************************************************************/ | ||
37 | |||
38 | #include "qinputdialog.h" | ||
39 | |||
40 | #include <qlayout.h> | ||
41 | #include <qlabel.h> | ||
42 | #include <qlineedit.h> | ||
43 | #include <qpushbutton.h> | ||
44 | #include <qspinbox.h> | ||
45 | #include <qcombobox.h> | ||
46 | #include <qwidgetstack.h> | ||
47 | #include <qvalidator.h> | ||
48 | #include <qapplication.h> | ||
49 | |||
50 | class QInputDialogPrivate | ||
51 | { | ||
52 | public: | ||
53 | friend class QInputDialog; | ||
54 | QLineEdit *lineEdit; | ||
55 | QSpinBox *spinBox; | ||
56 | QComboBox *comboBox, *editComboBox; | ||
57 | QPushButton *ok; | ||
58 | QWidgetStack *stack; | ||
59 | QInputDialog::Type type; | ||
60 | }; | ||
61 | |||
62 | /*! | ||
63 | \class QInputDialog qinputdialog.h | ||
64 | \brief A convenience dialog to get a simple input from the user | ||
65 | \ingroup dialogs | ||
66 | |||
67 | The QInputDialog is a simple dialog which can be used if you | ||
68 | need a simple input from the user. This can be text, a number or | ||
69 | an item from a list. Also a label has to be set to tell the user | ||
70 | what he/she should input. | ||
71 | |||
72 | In this Qt version only the 4 static convenience functions | ||
73 | getText(), getInteger(), getDouble() and getItem() of QInputDialog | ||
74 | are available. | ||
75 | |||
76 | Use it like this: | ||
77 | |||
78 | \code | ||
79 | bool ok = FALSE; | ||
80 | QString text = QInputDialog::getText( tr( "Make an input" ), tr( "Please enter your name" ), QString::null, &ok, this ); | ||
81 | if ( ok && !text.isEmpty() ) | ||
82 | ;// user entered something and pressed ok | ||
83 | else | ||
84 | ;// user entered nothing or pressed cancel | ||
85 | \endcode | ||
86 | |||
87 | There are more static convenience methods! | ||
88 | |||
89 | \sa getText(), getInteger(), getDouble(), getItem() | ||
90 | */ | ||
91 | |||
92 | /*! | ||
93 | \enum QInputDialog::Type | ||
94 | |||
95 | This enum type specifies the type of the dialog | ||
96 | (which kind of input can be done): | ||
97 | |||
98 | <ul> | ||
99 | <li>\c LineEdit - A QLineEdit is used for taking the input, so a textual or | ||
100 | (e.g. using a QValidator) a numerical input can be done. Using lineEdit() | ||
101 | the QLineEdit can be accessed. | ||
102 | <li>\c SpinBox - A QSpinBox is used for taking the input, so a decimal | ||
103 | input can be done. Using spinBox() the QSpinBox can be accessed. | ||
104 | <li>\c ComboBox - A read-only QComboBox is used for taking the input, | ||
105 | so one item of a list can be chosen. Using comboBox() the QComboBox | ||
106 | can be accessed. | ||
107 | <li>\c EditableComboBox - An editable QComboBox is used for taking the input, | ||
108 | so either one item of a list can be chosen or a text can be entered. Using | ||
109 | editableComboBox() the QComboBox can be accessed. | ||
110 | </ul> | ||
111 | */ | ||
112 | |||
113 | /*! | ||
114 | Constructs the dialog. \a label is the text which is shown to the user (it should mention | ||
115 | to the user what he/she should input), \a parent the parent widget of the dialog, \a name | ||
116 | the name of it and if you set \a modal to TRUE, the dialog pops up modally, else it pops | ||
117 | up modeless. With \a type you specify the type of the dialog. | ||
118 | |||
119 | \sa getText(), getInteger(), getDouble(), getItem() | ||
120 | */ | ||
121 | |||
122 | QInputDialog::QInputDialog( const QString &label, QWidget* parent, const char* name, | ||
123 | bool modal, Type type) | ||
124 | : QDialog( parent, name, modal ) | ||
125 | { | ||
126 | if ( parent && parent->icon() &&!parent->icon()->isNull() ) | ||
127 | setIcon( *parent->icon() ); | ||
128 | else if ( qApp->mainWidget() && qApp->mainWidget()->icon() && !qApp->mainWidget()->icon()->isNull() ) | ||
129 | QDialog::setIcon( *qApp->mainWidget()->icon() ); | ||
130 | |||
131 | d = new QInputDialogPrivate; | ||
132 | d->lineEdit = 0; | ||
133 | d->spinBox = 0; | ||
134 | d->comboBox = 0; | ||
135 | |||
136 | QVBoxLayout *vbox = new QVBoxLayout( this, 6, 6 ); | ||
137 | |||
138 | QLabel* l = new QLabel( label, this ); | ||
139 | vbox->addWidget( l ); | ||
140 | |||
141 | d->stack = new QWidgetStack( this ); | ||
142 | vbox->addWidget( d->stack ); | ||
143 | d->lineEdit = new QLineEdit( d->stack ); | ||
144 | d->spinBox = new QSpinBox( d->stack ); | ||
145 | d->comboBox = new QComboBox( FALSE, d->stack ); | ||
146 | d->editComboBox = new QComboBox( TRUE, d->stack ); | ||
147 | |||
148 | QHBoxLayout *hbox = new QHBoxLayout( 6 ); | ||
149 | vbox->addLayout( hbox, AlignRight ); | ||
150 | |||
151 | d->ok = new QPushButton( tr( "&OK" ), this ); | ||
152 | d->ok->setDefault( TRUE ); | ||
153 | QPushButton *cancel = new QPushButton( tr( "&Cancel" ), this ); | ||
154 | |||
155 | QSize bs( d->ok->sizeHint() ); | ||
156 | if ( cancel->sizeHint().width() > bs.width() ) | ||
157 | bs.setWidth( cancel->sizeHint().width() ); | ||
158 | |||
159 | d->ok->setFixedSize( bs ); | ||
160 | cancel->setFixedSize( bs ); | ||
161 | |||
162 | hbox->addWidget( new QWidget( this ) ); | ||
163 | hbox->addWidget( d->ok ); | ||
164 | hbox->addWidget( cancel ); | ||
165 | |||
166 | connect( d->lineEdit, SIGNAL( returnPressed() ), | ||
167 | this, SLOT( tryAccept() ) ); | ||
168 | connect( d->lineEdit, SIGNAL( textChanged( const QString & ) ), | ||
169 | this, SLOT( textChanged( const QString & ) ) ); | ||
170 | |||
171 | connect( d->ok, SIGNAL( clicked() ), this, SLOT( accept() ) ); | ||
172 | connect( cancel, SIGNAL( clicked() ), this, SLOT( reject() ) ); | ||
173 | |||
174 | //US ToDo make size dependent of targetplatform | ||
175 | //US resize( QMAX( sizeHint().width(), 400 ), sizeHint().height() ); | ||
176 | resize( sizeHint().width(), sizeHint().height() ); | ||
177 | |||
178 | setType( type ); | ||
179 | } | ||
180 | |||
181 | /*! | ||
182 | Returns the line edit, which is used in the LineEdit mode | ||
183 | */ | ||
184 | |||
185 | QLineEdit *QInputDialog::lineEdit() const | ||
186 | { | ||
187 | return d->lineEdit; | ||
188 | } | ||
189 | |||
190 | /*! | ||
191 | Returns the spinbox, which is used in the SpinBox mode | ||
192 | */ | ||
193 | |||
194 | QSpinBox *QInputDialog::spinBox() const | ||
195 | { | ||
196 | return d->spinBox; | ||
197 | } | ||
198 | |||
199 | /*! | ||
200 | Returns the combobox, which is used in the ComboBox mode | ||
201 | */ | ||
202 | |||
203 | QComboBox *QInputDialog::comboBox() const | ||
204 | { | ||
205 | return d->comboBox; | ||
206 | } | ||
207 | |||
208 | /*! | ||
209 | Returns the combobox, which is used in the EditableComboBox mode | ||
210 | */ | ||
211 | |||
212 | QComboBox *QInputDialog::editableComboBox() const | ||
213 | { | ||
214 | return d->editComboBox; | ||
215 | } | ||
216 | |||
217 | /*! | ||
218 | Sets the input type of the dialog to \a t. | ||
219 | */ | ||
220 | |||
221 | void QInputDialog::setType( Type t ) | ||
222 | { | ||
223 | switch ( t ) { | ||
224 | case LineEdit: | ||
225 | d->stack->raiseWidget( d->lineEdit ); | ||
226 | d->lineEdit->setFocus(); | ||
227 | break; | ||
228 | case SpinBox: | ||
229 | d->stack->raiseWidget( d->spinBox ); | ||
230 | d->spinBox->setFocus(); | ||
231 | break; | ||
232 | case ComboBox: | ||
233 | d->stack->raiseWidget( d->comboBox ); | ||
234 | d->comboBox->setFocus(); | ||
235 | break; | ||
236 | case EditableComboBox: | ||
237 | d->stack->raiseWidget( d->editComboBox ); | ||
238 | d->editComboBox->setFocus(); | ||
239 | break; | ||
240 | } | ||
241 | |||
242 | d->type = t; | ||
243 | } | ||
244 | |||
245 | /*! | ||
246 | Returns the input type of the dialog. | ||
247 | |||
248 | \sa setType() | ||
249 | */ | ||
250 | |||
251 | QInputDialog::Type QInputDialog::type() const | ||
252 | { | ||
253 | return d->type; | ||
254 | } | ||
255 | |||
256 | /*! | ||
257 | Destructor. | ||
258 | */ | ||
259 | |||
260 | QInputDialog::~QInputDialog() | ||
261 | { | ||
262 | delete d; | ||
263 | } | ||
264 | |||
265 | /*! | ||
266 | Static convenience function to get a textual input from the user. \a caption is the text | ||
267 | which is displayed in the title bar of the dialog. \a label is the text which | ||
268 | is shown to the user (it should mention to the user what he/she should input), \a text | ||
269 | the default text which will be initially set to the line edit, \a ok a pointer to | ||
270 | a bool which will be (if not 0!) set to TRUE if the user pressed ok or to FALSE if the | ||
271 | user pressed cancel, \a parent the parent widget of the dialog and \a name | ||
272 | the name of it. The dialogs pops up modally! | ||
273 | |||
274 | This method returns the text which has been entered in the line edit. | ||
275 | |||
276 | You will use this static method like this: | ||
277 | |||
278 | \code | ||
279 | bool ok = FALSE; | ||
280 | QString text = QInputDialog::getText( tr( "Please enter your name" ), QString::null, &ok, this ); | ||
281 | if ( ok && !text.isEmpty() ) | ||
282 | ;// user entered something and pressed ok | ||
283 | else | ||
284 | ;// user entered nothing or pressed cancel | ||
285 | \endcode | ||
286 | */ | ||
287 | |||
288 | QString QInputDialog::getText( const QString &caption, const QString &label, const QString &text, | ||
289 | bool *ok, QWidget *parent, const char *name ) | ||
290 | { | ||
291 | return getText( caption, label, QLineEdit::Normal, text, ok, parent, name ); | ||
292 | } | ||
293 | |||
294 | /*! | ||
295 | Like above, but accepts an a \a mode which the line edit will use to display text. | ||
296 | |||
297 | \sa getText() | ||
298 | */ | ||
299 | |||
300 | QString QInputDialog::getText( const QString &caption, const QString &label, QLineEdit::EchoMode mode, | ||
301 | const QString &text, bool *ok, QWidget *parent, const char *name ) | ||
302 | { | ||
303 | QInputDialog *dlg = new QInputDialog( label, parent, name, TRUE, LineEdit ); | ||
304 | dlg->setCaption( caption ); | ||
305 | dlg->lineEdit()->setText( text ); | ||
306 | dlg->lineEdit()->setEchoMode( mode ); | ||
307 | if ( !text.isEmpty() ) | ||
308 | dlg->lineEdit()->selectAll(); | ||
309 | |||
310 | bool ok_ = FALSE; | ||
311 | QString result; | ||
312 | ok_ = dlg->exec() == QDialog::Accepted; | ||
313 | if ( ok ) | ||
314 | *ok = ok_; | ||
315 | if ( ok_ ) | ||
316 | result = dlg->lineEdit()->text(); | ||
317 | |||
318 | delete dlg; | ||
319 | return result; | ||
320 | } | ||
321 | |||
322 | /*! | ||
323 | Static convenience function to get an integral input from the user. \a caption is the text | ||
324 | which is displayed in the title bar of the dialog. \a label is the text which | ||
325 | is shown to the user (it should mention to the user what he/she should input), \a num | ||
326 | the default number which will be initially set to the spinbox, \a from and \a to the | ||
327 | range in which the entered number has to be, \a step the step in which the number can | ||
328 | be increased/decreased by the spinbox, \a ok a pointer to | ||
329 | a bool which will be (if not 0!) set to TRUE if the user pressed ok or to FALSE if the | ||
330 | user pressed cancel, \a parent the parent widget of the dialog and \a name | ||
331 | the name of it. The dialogs pops up modally! | ||
332 | |||
333 | This method returns the number which has been entered by the user. | ||
334 | |||
335 | You will use this static method like this: | ||
336 | |||
337 | \code | ||
338 | bool ok = FALSE; | ||
339 | int res = QInputDialog::getInteger( tr( "Please enter a number" ), 22, 0, 1000, 2, &ok, this ); | ||
340 | if ( ok ) | ||
341 | ;// user entered something and pressed ok | ||
342 | else | ||
343 | ;// user pressed cancel | ||
344 | \endcode | ||
345 | */ | ||
346 | |||
347 | int QInputDialog::getInteger( const QString &caption, const QString &label, int num, int from, int to, int step, | ||
348 | bool *ok, QWidget *parent, const char *name ) | ||
349 | { | ||
350 | QInputDialog *dlg = new QInputDialog( label, parent, name, TRUE, SpinBox ); | ||
351 | dlg->setCaption( caption ); | ||
352 | dlg->spinBox()->setRange( from, to ); | ||
353 | dlg->spinBox()->setSteps( step, 0 ); | ||
354 | dlg->spinBox()->setValue( num ); | ||
355 | |||
356 | bool ok_ = FALSE; | ||
357 | int result; | ||
358 | ok_ = dlg->exec() == QDialog::Accepted; | ||
359 | if ( ok ) | ||
360 | *ok = ok_; | ||
361 | result = dlg->spinBox()->value(); | ||
362 | |||
363 | delete dlg; | ||
364 | return result; | ||
365 | } | ||
366 | |||
367 | /*! | ||
368 | Static convenience function to get a decimal input from the user. \a caption is the text | ||
369 | which is displayed in the title bar of the dialog. \a label is the text which | ||
370 | is shown to the user (it should mention to the user what he/she should input), \a num | ||
371 | the default decimal number which will be initially set to the line edit, \a from and \a to the | ||
372 | range in which the entered number has to be, \a decimals the number of decimal which | ||
373 | the number may have, \a ok a pointer to | ||
374 | a bool which will be (if not 0!) set to TRUE if the user pressed ok or to FALSE if the | ||
375 | user pressed cancel, \a parent the parent widget of the dialog and \a name | ||
376 | the name of it. The dialogs pops up modally! | ||
377 | |||
378 | This method returns the number which has been entered by the user. | ||
379 | |||
380 | You will use this static method like this: | ||
381 | |||
382 | \code | ||
383 | bool ok = FALSE; | ||
384 | double res = QInputDialog::getDouble( tr( "Please enter a decimal number" ), 33.7, 0, 1000, 2, &ok, this ); | ||
385 | if ( ok ) | ||
386 | ;// user entered something and pressed ok | ||
387 | else | ||
388 | ;// user pressed cancel | ||
389 | \endcode | ||
390 | */ | ||
391 | |||
392 | double QInputDialog::getDouble( const QString &caption, const QString &label, double num, | ||
393 | double from, double to, int decimals, | ||
394 | bool *ok, QWidget *parent, const char *name ) | ||
395 | { | ||
396 | QInputDialog *dlg = new QInputDialog( label, parent, name, TRUE, LineEdit ); | ||
397 | dlg->setCaption( caption ); | ||
398 | dlg->lineEdit()->setValidator( new QDoubleValidator( from, to, decimals, dlg->lineEdit() ) ); | ||
399 | dlg->lineEdit()->setText( QString::number( num, 'f', decimals ) ); | ||
400 | dlg->lineEdit()->selectAll(); | ||
401 | |||
402 | bool accepted = ( dlg->exec() == QDialog::Accepted ); | ||
403 | if ( ok ) | ||
404 | *ok = accepted; | ||
405 | |||
406 | double result = dlg->lineEdit()->text().toDouble(); | ||
407 | |||
408 | delete dlg; | ||
409 | return result; | ||
410 | } | ||
411 | |||
412 | /*! | ||
413 | Static convenience function to let the user select an item from a string list. \a caption is the text | ||
414 | which is displayed in the title bar of the dialog. \a label is the text which | ||
415 | is shown to the user (it should mention to the user what he/she should input), \a list the | ||
416 | string list which is inserted into the combobox, \a current the number of the item which should | ||
417 | be initially the current item, \a editable specifies if the combobox should be editable (if it is TRUE) | ||
418 | or read-only (if \a editable is FALSE), \a ok a pointer to | ||
419 | a bool which will be (if not 0!) set to TRUE if the user pressed ok or to FALSE if the | ||
420 | user pressed cancel, \a parent the parent widget of the dialog and \a name | ||
421 | the name of it. The dialogs pops up modally! | ||
422 | |||
423 | This method returns the text of the current item, or if \a editable was TRUE, the current | ||
424 | text of the combobox. | ||
425 | |||
426 | You will use this static method like this: | ||
427 | |||
428 | \code | ||
429 | QStringList lst; | ||
430 | lst << "First" << "Second" << "Third" << "Fourth" << "Fifth"; | ||
431 | bool ok = FALSE; | ||
432 | QString res = QInputDialog::getItem( tr( "Please select an item" ), lst, 1, TRUE, &ok, this ); | ||
433 | if ( ok ) | ||
434 | ;// user selected an item and pressed ok | ||
435 | else | ||
436 | ;// user pressed cancel | ||
437 | \endcode | ||
438 | */ | ||
439 | |||
440 | QString QInputDialog::getItem( const QString &caption, const QString &label, const QStringList &list, | ||
441 | int current, bool editable, | ||
442 | bool *ok, QWidget *parent, const char *name ) | ||
443 | { | ||
444 | QInputDialog *dlg = new QInputDialog( label, parent, name, TRUE, editable ? EditableComboBox : ComboBox ); | ||
445 | dlg->setCaption( caption ); | ||
446 | if ( editable ) { | ||
447 | dlg->editableComboBox()->insertStringList( list ); | ||
448 | dlg->editableComboBox()->setCurrentItem( current ); | ||
449 | } else { | ||
450 | dlg->comboBox()->insertStringList( list ); | ||
451 | dlg->comboBox()->setCurrentItem( current ); | ||
452 | } | ||
453 | |||
454 | bool ok_ = FALSE; | ||
455 | QString result; | ||
456 | ok_ = dlg->exec() == QDialog::Accepted; | ||
457 | if ( ok ) | ||
458 | *ok = ok_; | ||
459 | if ( editable ) | ||
460 | result = dlg->editableComboBox()->currentText(); | ||
461 | else | ||
462 | result = dlg->comboBox()->currentText(); | ||
463 | |||
464 | delete dlg; | ||
465 | return result; | ||
466 | } | ||
467 | |||
468 | /*! | ||
469 | \internal | ||
470 | */ | ||
471 | |||
472 | void QInputDialog::textChanged( const QString &s ) | ||
473 | { | ||
474 | bool on; | ||
475 | if ( d->lineEdit->validator() ) { | ||
476 | QString str = d->lineEdit->text(); | ||
477 | int index = d->lineEdit->cursorPosition(); | ||
478 | on = ( d->lineEdit->validator()->validate(str, index) == | ||
479 | QValidator::Acceptable ); | ||
480 | } else { | ||
481 | on = !s.isEmpty(); | ||
482 | } | ||
483 | d->ok->setEnabled( on ); | ||
484 | } | ||
485 | |||
486 | /*! | ||
487 | \internal | ||
488 | */ | ||
489 | |||
490 | void QInputDialog::tryAccept() | ||
491 | { | ||
492 | if ( !d->lineEdit->text().isEmpty() ) | ||
493 | accept(); | ||
494 | } | ||
495 | |||