compile
[kdegraphics.git] / okular / ui / formwidgets.cpp
blob7ee659c302b9c4cd559c76583737505038f2bf2a
1 /***************************************************************************
2 * Copyright (C) 2007 by Pino Toscano <pino@kde.org> *
3 * *
4 * This program is free software; you can redistribute it and/or modify *
5 * it under the terms of the GNU General Public License as published by *
6 * the Free Software Foundation; either version 2 of the License, or *
7 * (at your option) any later version. *
8 ***************************************************************************/
10 #include "formwidgets.h"
12 #include <qbuttongroup.h>
13 #include <klineedit.h>
14 #include <klocale.h>
16 // local includes
17 #include "core/form.h"
19 FormWidgetsController::FormWidgetsController( QObject *parent )
20 : QObject( parent )
24 FormWidgetsController::~FormWidgetsController()
28 void FormWidgetsController::signalChanged( FormWidgetIface *w )
30 emit changed( w );
33 void FormWidgetsController::signalAction( Okular::Action *a )
35 emit action( a );
38 QButtonGroup* FormWidgetsController::registerRadioButton( FormWidgetIface* widget, const QList< int >& siblings )
40 if ( !widget->button() )
41 return 0;
43 QList< RadioData >::iterator it = m_radios.begin(), itEnd = m_radios.end();
44 const int id = widget->formField()->id();
45 for ( ; it != itEnd; ++it )
47 const QList< int >::const_iterator idsIt = qFind( (*it).ids, id );
48 if ( idsIt != (*it).ids.end() )
50 (*it).group->addButton( widget->button() );
51 return (*it).group;
54 RadioData newdata;
55 newdata.ids = siblings;
56 newdata.ids.append( id );
57 newdata.group = new QButtonGroup();
58 newdata.group->addButton( widget->button() );
59 connect( newdata.group, SIGNAL( buttonClicked( QAbstractButton * ) ),
60 this, SLOT( slotButtonClicked( QAbstractButton * ) ) );
61 m_radios.append( newdata );
62 return newdata.group;
65 void FormWidgetsController::dropRadioButtons()
67 QList< RadioData >::iterator it = m_radios.begin(), itEnd = m_radios.end();
68 for ( ; it != itEnd; ++it )
70 delete (*it).group;
72 m_radios.clear();
75 void FormWidgetsController::slotButtonClicked( QAbstractButton *button )
77 if ( CheckBoxEdit *check = qobject_cast< CheckBoxEdit * >( button ) )
78 emit changed( check );
79 else if ( RadioButtonEdit *radio = qobject_cast< RadioButtonEdit * >( button ) )
80 emit changed( radio );
84 FormWidgetIface * FormWidgetFactory::createWidget( Okular::FormField * ff, QWidget * parent )
86 FormWidgetIface * widget = 0;
87 switch ( ff->type() )
89 case Okular::FormField::FormButton:
91 Okular::FormFieldButton * ffb = static_cast< Okular::FormFieldButton * >( ff );
92 switch ( ffb->buttonType() )
94 case Okular::FormFieldButton::Push:
95 widget = new PushButtonEdit( ffb, parent );
96 break;
97 case Okular::FormFieldButton::CheckBox:
98 widget = new CheckBoxEdit( ffb, parent );
99 break;
100 case Okular::FormFieldButton::Radio:
101 widget = new RadioButtonEdit( ffb, parent );
102 break;
103 default: ;
105 break;
107 case Okular::FormField::FormText:
109 Okular::FormFieldText * fft = static_cast< Okular::FormFieldText * >( ff );
110 switch ( fft->textType() )
112 case Okular::FormFieldText::Multiline:
113 widget = new TextAreaEdit( fft, parent );
114 break;
115 case Okular::FormFieldText::Normal:
116 widget = new FormLineEdit( fft, parent );
117 break;
118 case Okular::FormFieldText::FileSelect:
119 widget = new FileEdit( fft, parent );
120 break;
122 break;
124 case Okular::FormField::FormChoice:
126 Okular::FormFieldChoice * ffc = static_cast< Okular::FormFieldChoice * >( ff );
127 switch ( ffc->choiceType() )
129 case Okular::FormFieldChoice::ListBox:
130 widget = new ListEdit( ffc, parent );
131 break;
132 case Okular::FormFieldChoice::ComboBox:
133 widget = new ComboEdit( ffc, parent );
134 break;
136 break;
138 default: ;
140 return widget;
144 FormWidgetIface::FormWidgetIface( QWidget * w, Okular::FormField * ff )
145 : m_controller( 0 ), m_widget( w ), m_ff( ff ), m_pageItem( 0 )
149 FormWidgetIface::~FormWidgetIface()
153 Okular::NormalizedRect FormWidgetIface::rect() const
155 return m_ff->rect();
158 void FormWidgetIface::setWidthHeight( int w, int h )
160 m_widget->resize( w, h );
163 void FormWidgetIface::moveTo( int x, int y )
165 m_widget->move( x, y );
168 bool FormWidgetIface::setVisibility( bool visible )
170 if ( !m_ff->isVisible() )
171 return false;
173 bool hadfocus = m_widget->hasFocus();
174 if ( hadfocus )
175 m_widget->clearFocus();
176 m_widget->setVisible( visible );
177 return hadfocus;
180 void FormWidgetIface::setCanBeFilled( bool fill )
182 if ( m_widget->isEnabled() )
184 m_widget->setEnabled( fill );
188 void FormWidgetIface::setPageItem( PageViewItem *pageItem )
190 m_pageItem = pageItem;
193 Okular::FormField* FormWidgetIface::formField() const
195 return m_ff;
198 PageViewItem* FormWidgetIface::pageItem() const
200 return m_pageItem;
203 void FormWidgetIface::setFormWidgetsController( FormWidgetsController *controller )
205 m_controller = controller;
208 QAbstractButton* FormWidgetIface::button()
210 return 0;
214 PushButtonEdit::PushButtonEdit( Okular::FormFieldButton * button, QWidget * parent )
215 : QPushButton( parent ), FormWidgetIface( this, button ), m_form( button )
217 setText( m_form->caption() );
218 setEnabled( !m_form->isReadOnly() );
219 setVisible( m_form->isVisible() );
221 connect( this, SIGNAL( clicked() ), this, SLOT( slotClicked() ) );
224 void PushButtonEdit::slotClicked()
226 if ( m_form->activationAction() )
227 m_controller->signalAction( m_form->activationAction() );
231 CheckBoxEdit::CheckBoxEdit( Okular::FormFieldButton * button, QWidget * parent )
232 : QCheckBox( parent ), FormWidgetIface( this, button ), m_form( button )
234 setText( m_form->caption() );
235 setEnabled( !m_form->isReadOnly() );
237 setVisible( m_form->isVisible() );
240 void CheckBoxEdit::setFormWidgetsController( FormWidgetsController *controller )
242 FormWidgetIface::setFormWidgetsController( controller );
244 const QList< int > siblings = m_form->siblings();
245 if ( !siblings.isEmpty() )
246 m_controller->registerRadioButton( this, siblings );
248 setCheckState( m_form->state() ? Qt::Checked : Qt::Unchecked );
250 connect( this, SIGNAL( stateChanged( int ) ), this, SLOT( slotStateChanged( int ) ) );
253 QAbstractButton* CheckBoxEdit::button()
255 return this;
258 void CheckBoxEdit::slotStateChanged( int state )
260 m_form->setState( state == Qt::Checked );
262 if ( !group() )
263 m_controller->signalChanged( this );
267 RadioButtonEdit::RadioButtonEdit( Okular::FormFieldButton * button, QWidget * parent )
268 : QRadioButton( parent ), FormWidgetIface( this, button ), m_form( button )
270 setText( m_form->caption() );
271 setEnabled( !m_form->isReadOnly() );
273 setVisible( m_form->isVisible() );
276 void RadioButtonEdit::setFormWidgetsController( FormWidgetsController *controller )
278 FormWidgetIface::setFormWidgetsController( controller );
280 m_controller->registerRadioButton( this, m_form->siblings() );
282 setChecked( m_form->state() );
284 connect( this, SIGNAL( toggled( bool ) ), this, SLOT( slotToggled( bool ) ) );
287 QAbstractButton* RadioButtonEdit::button()
289 return this;
292 void RadioButtonEdit::slotToggled( bool checked )
294 m_form->setState( checked );
296 if ( !group() )
297 m_controller->signalChanged( this );
301 FormLineEdit::FormLineEdit( Okular::FormFieldText * text, QWidget * parent )
302 : QLineEdit( parent ), FormWidgetIface( this, text ), m_form( text )
304 int maxlen = m_form->maximumLength();
305 if ( maxlen >= 0 )
306 setMaxLength( maxlen );
307 setAlignment( m_form->textAlignment() );
308 setText( m_form->text() );
309 if ( m_form->isPassword() )
310 setEchoMode( QLineEdit::Password );
311 setReadOnly( m_form->isReadOnly() );
313 connect( this, SIGNAL( textEdited( const QString& ) ), this, SLOT( textEdited( const QString& ) ) );
314 setVisible( m_form->isVisible() );
317 void FormLineEdit::textEdited( const QString& )
319 m_form->setText( text() );
321 m_controller->signalChanged( this );
325 TextAreaEdit::TextAreaEdit( Okular::FormFieldText * text, QWidget * parent )
326 : KTextEdit( parent ), FormWidgetIface( this, text ), m_form( text )
328 setAcceptRichText( m_form->isRichText() );
329 setCheckSpellingEnabled( m_form->canBeSpellChecked() );
330 setAlignment( m_form->textAlignment() );
331 setPlainText( m_form->text() );
332 setReadOnly( m_form->isReadOnly() );
334 connect( this, SIGNAL( textChanged() ), this, SLOT( slotChanged() ) );
335 setVisible( m_form->isVisible() );
338 void TextAreaEdit::slotChanged()
340 m_form->setText( toPlainText() );
342 m_controller->signalChanged( this );
346 FileEdit::FileEdit( Okular::FormFieldText * text, QWidget * parent )
347 : KUrlRequester( parent ), FormWidgetIface( this, text ), m_form( text )
349 setMode( KFile::File | KFile::ExistingOnly | KFile::LocalOnly );
350 setFilter( i18n( "*|All Files" ) );
351 setPath( m_form->text() );
352 lineEdit()->setAlignment( m_form->textAlignment() );
353 setEnabled( !m_form->isReadOnly() );
355 connect( this, SIGNAL( textChanged( const QString& ) ), this, SLOT( slotChanged( const QString& ) ) );
356 setVisible( m_form->isVisible() );
359 void FileEdit::slotChanged( const QString& )
361 m_form->setText( url().path() );
363 m_controller->signalChanged( this );
367 ListEdit::ListEdit( Okular::FormFieldChoice * choice, QWidget * parent )
368 : QListWidget( parent ), FormWidgetIface( this, choice ), m_form( choice )
370 addItems( m_form->choices() );
371 setSelectionMode( m_form->multiSelect() ? QAbstractItemView::ExtendedSelection : QAbstractItemView::SingleSelection );
372 setVerticalScrollMode( QAbstractItemView::ScrollPerPixel );
373 QList< int > selectedItems = m_form->currentChoices();
374 if ( m_form->multiSelect() )
376 foreach ( int index, selectedItems )
377 if ( index >= 0 && index < count() )
378 item( index )->setSelected( true );
380 else
382 if ( selectedItems.count() == 1 && selectedItems.at(0) >= 0 && selectedItems.at(0) < count() )
384 setCurrentRow( selectedItems.at(0) );
385 scrollToItem( item( selectedItems.at(0) ) );
388 setEnabled( !m_form->isReadOnly() );
390 connect( this, SIGNAL( itemSelectionChanged() ), this, SLOT( slotSelectionChanged() ) );
391 setVisible( m_form->isVisible() );
394 void ListEdit::slotSelectionChanged()
396 QList< QListWidgetItem * > selection = selectedItems();
397 QList< int > rows;
398 foreach( const QListWidgetItem * item, selection )
399 rows.append( row( item ) );
400 m_form->setCurrentChoices( rows );
402 m_controller->signalChanged( this );
406 ComboEdit::ComboEdit( Okular::FormFieldChoice * choice, QWidget * parent )
407 : QComboBox( parent ), FormWidgetIface( this, choice ), m_form( choice )
409 addItems( m_form->choices() );
410 setEditable( true );
411 lineEdit()->setReadOnly( !m_form->isEditable() );
412 QList< int > selectedItems = m_form->currentChoices();
413 if ( selectedItems.count() == 1 && selectedItems.at(0) >= 0 && selectedItems.at(0) < count() )
414 setCurrentIndex( selectedItems.at(0) );
415 setEnabled( !m_form->isReadOnly() );
417 connect( this, SIGNAL( currentIndexChanged( int ) ), this, SLOT( indexChanged( int ) ) );
418 setVisible( m_form->isVisible() );
421 void ComboEdit::indexChanged( int index )
423 m_form->setCurrentChoices( QList< int >() << index );
425 m_controller->signalChanged( this );
429 #include "formwidgets.moc"