00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "holidayregionselector.h"
00023 #include "ui_holidayregionselector.h"
00024
00025 #include "holidayregion.h"
00026
00027 #include <KDebug>
00028 #include <KLocale>
00029 #include <KComboBox>
00030
00031 using namespace KHolidays;
00032
00033 class HolidayRegionSelector::Private
00034 {
00035 public:
00036 Private( HolidayRegionSelector *q_ptr )
00037 {
00038 q = q_ptr;
00039 }
00040
00041 ~Private()
00042 {
00043 }
00044
00045
00046 enum Column {
00047 RegionColumn = 0,
00048 LanguageColumn,
00049 DescriptionColumn,
00050 SelectColumn,
00051 ComboColumn
00052 };
00053
00054 void clearSelection();
00055 QTreeWidgetItem *findItem( const QString &holidayRegionCode );
00056 void initItem( QTreeWidgetItem *listItem, HolidayRegion *region );
00057 QString itemRegion( QTreeWidgetItem *item );
00058 QString itemLanguage( QTreeWidgetItem *item );
00059 SelectionStatus itemSelectionStatus( QTreeWidgetItem *item );
00060 void setItemStatus( QTreeWidgetItem *item, SelectionStatus status );
00061 KComboBox *itemCombo( QTreeWidgetItem *item );
00062 void setItemRegionUseFlags( QTreeWidgetItem *item, RegionUseFlags regionUseFlags );
00063 HolidayRegionSelector::RegionUseFlags itemRegionUseFlags( QTreeWidgetItem *item );
00064
00065 QAbstractItemView::SelectionMode m_selectionMode;
00066 bool m_enableRegionUseFlags;
00067 QStringList m_languageFilter;
00068 QStringList m_holidayRegionCodes;
00069 Ui::holidayRegionSelector m_ui;
00070 HolidayRegionSelector *q;
00071 };
00072
00073 void HolidayRegionSelector::Private::clearSelection()
00074 {
00075 m_ui.regionTreeWidget->blockSignals( true );
00076 QTreeWidgetItemIterator it( m_ui.regionTreeWidget, QTreeWidgetItemIterator::Checked );
00077 while ( *it ) {
00078 (*it)->setCheckState( Private::SelectColumn, Qt::Unchecked );
00079 (*it)->setData( Private::SelectColumn, Qt::UserRole, RegionAvailable );
00080 itemCombo( (*it) )->setCurrentIndex( 0 );
00081 (*it)->setData( Private::ComboColumn, Qt::UserRole, NotUsed );
00082 ++it;
00083 }
00084 m_ui.regionTreeWidget->blockSignals( false );
00085 }
00086
00087 QTreeWidgetItem *HolidayRegionSelector::Private::findItem( const QString &holidayRegionCode )
00088 {
00089 QTreeWidgetItemIterator it( m_ui.regionTreeWidget );
00090 while ( *it ) {
00091 if ( (*it)->data( HolidayRegionSelector::Private::RegionColumn, Qt::UserRole ) == holidayRegionCode ) {
00092 return (*it);
00093 }
00094 ++it;
00095 }
00096 return 0;
00097 }
00098
00099 void HolidayRegionSelector::Private::initItem( QTreeWidgetItem *listItem, HolidayRegion *region )
00100 {
00101 m_ui.regionTreeWidget->blockSignals( true );
00102 QString languageName = KGlobal::locale()->languageCodeToName( region->languageCode() );
00103 listItem->setCheckState( Private::SelectColumn, Qt::Unchecked );
00104 QString text = i18n("<p>Select to use Holiday Region</p>");
00105 listItem->setToolTip( Private::SelectColumn, text );
00106 listItem->setToolTip( Private::ComboColumn, text );
00107 text = i18n("<p>Select to use Holiday Region</p>");
00108 listItem->setToolTip( Private::SelectColumn, text );
00109 listItem->setToolTip( Private::ComboColumn, text );
00110 listItem->setText( Private::RegionColumn, region->name() );
00111 QString toolTip = i18n("<p><b>Region:</b> %1<br/>"
00112 "<b>Language:</b> %2<br/>"
00113 "<b>Description:</b> %3</p>",
00114 region->name(), languageName, region->description() );
00115 listItem->setToolTip( Private::RegionColumn, toolTip );
00116 listItem->setData( Private::RegionColumn, Qt::UserRole, region->regionCode() );
00117 listItem->setText( Private::LanguageColumn, languageName );
00118 listItem->setData( Private::LanguageColumn, Qt::UserRole, region->languageCode() );
00119 listItem->setText( Private::DescriptionColumn, region->description() );
00120 listItem->setToolTip( Private::DescriptionColumn, region->description() );
00121 KComboBox *combo = new KComboBox();
00122 combo->setAutoFillBackground( true );
00123 QString comboText = i18n("<p>You can choose to display the Holiday Region for information only, or to use the Holiday Region when displaying or calculating days off such as Public Holidays. If you choose to use the Holiday Region for Days Off, then only those Holiday Events marked in the Holiday Region as Days Off will be used for non-work days, Holiday Events that are not marked in the Holiday Region as Days Off will continue to be work days.</p>");
00124 combo->setToolTip( comboText );
00125 comboText = i18nc("Combobox label, Holiday Region not used", "Not Used");
00126 combo->addItem( comboText, QVariant( NotUsed ) );
00127 comboText = i18nc("Combobox label, use Holiday Region for information only", "Information");
00128 combo->addItem( comboText, QVariant( UseInformationOnly ) );
00129 comboText = i18nc("Combobox label, use Holiday Region for days off", "Days Off");
00130 combo->addItem( comboText, QVariant( UseDaysOff ) );
00131 combo->setCurrentIndex( 0 );
00132 listItem->setData( Private::ComboColumn, Qt::UserRole, NotUsed );
00133 m_ui.regionTreeWidget->setItemWidget( listItem, ComboColumn, combo );
00134 connect( combo, SIGNAL( currentIndexChanged( int ) ),
00135 q, SLOT( itemChanged( int ) ) );
00136 m_ui.regionTreeWidget->blockSignals( false );
00137 }
00138
00139 QString HolidayRegionSelector::Private::itemRegion( QTreeWidgetItem *item )
00140 {
00141 return item->data( Private::RegionColumn, Qt::UserRole ).toString();
00142 }
00143
00144 QString HolidayRegionSelector::Private::itemLanguage( QTreeWidgetItem *item )
00145 {
00146 return item->data( Private::LanguageColumn, Qt::UserRole ).toString();
00147 }
00148
00149 HolidayRegionSelector::SelectionStatus HolidayRegionSelector::Private::itemSelectionStatus( QTreeWidgetItem *item )
00150 {
00151 return (HolidayRegionSelector::SelectionStatus)
00152 item->data( Private::SelectColumn, Qt::UserRole ).toInt();
00153 }
00154
00155 void HolidayRegionSelector::Private::setItemRegionUseFlags( QTreeWidgetItem *item, RegionUseFlags regionUseFlags )
00156 {
00157
00158 item->setData( ComboColumn, Qt::UserRole, QVariant( regionUseFlags ) );
00159 if ( regionUseFlags & UseDaysOff ){
00160 setItemStatus( item, RegionSelected );
00161 itemCombo( item )->setCurrentIndex( 2 );
00162 } else if ( regionUseFlags & UseInformationOnly ) {
00163 setItemStatus( item, RegionSelected );
00164 itemCombo( item )->setCurrentIndex( 1 );
00165 } else {
00166 setItemStatus( item, RegionAvailable );
00167 itemCombo( item )->setCurrentIndex( 0 );
00168 }
00169 }
00170
00171 HolidayRegionSelector::RegionUseFlags HolidayRegionSelector::Private::itemRegionUseFlags( QTreeWidgetItem *item )
00172 {
00173 return (RegionUseFlags) item->data( ComboColumn, Qt::UserRole ).toInt();
00174 }
00175
00176 KComboBox *HolidayRegionSelector::Private::itemCombo( QTreeWidgetItem *item )
00177 {
00178 return static_cast<KComboBox*> (m_ui.regionTreeWidget->itemWidget( item, ComboColumn ) );
00179 }
00180
00181 void HolidayRegionSelector::Private::setItemStatus( QTreeWidgetItem *item, SelectionStatus status )
00182 {
00183 if ( m_selectionMode == QAbstractItemView::SingleSelection &&
00184 status == RegionSelected ) {
00185 clearSelection();
00186 }
00187
00188 Qt::CheckState selectStatus = Qt::Unchecked;
00189 bool hidden = false;
00190 bool disabled = false;
00191
00192 switch ( status ) {
00193 case RegionHidden:
00194 hidden = true;
00195 disabled = true;
00196 break;
00197 case RegionDisabled:
00198 disabled = true;
00199 break;
00200 case RegionAvailable:
00201 break;
00202 case RegionSelected:
00203 {
00204 if ( m_selectionMode != QAbstractItemView::NoSelection ) {
00205 selectStatus = Qt::Checked;
00206 }
00207 break;
00208 }
00209 default:
00210 break;
00211 }
00212
00213 m_ui.regionTreeWidget->blockSignals( true );
00214 item->setData( Private::SelectColumn, Qt::UserRole, status );
00215 item->setCheckState( Private::SelectColumn, selectStatus );
00216 item->setHidden( hidden );
00217 item->setDisabled( disabled );
00218 m_ui.regionTreeWidget->blockSignals( false );
00219 }
00220
00221 HolidayRegionSelector::HolidayRegionSelector( QWidget *parent )
00222 : QWidget( parent ),
00223 d( new Private( this ) )
00224 {
00225 d->m_ui.setupUi( this );
00226
00227
00228 d->m_ui.regionTreeWidget->setColumnCount( 5 );
00229 QTreeWidgetItem *headerItem = d->m_ui.regionTreeWidget->headerItem();
00230 QString header = i18nc( "Header for Select column", "Select" );
00231 QString text = i18n("<p>This column selects to use the Holiday Region</p>");
00232 headerItem->setText( Private::SelectColumn, header );
00233 headerItem->setToolTip( Private::SelectColumn, text );
00234 headerItem->setWhatsThis( Private::SelectColumn, text );
00235 headerItem->setText( Private::ComboColumn, header );
00236 headerItem->setToolTip( Private::ComboColumn, text );
00237 headerItem->setWhatsThis( Private::ComboColumn, text );
00238 header = i18nc( "Header for Holiday Region column", "Region" );
00239 text = i18n("<p>This column displays the name of the Holiday Region</p>");
00240 headerItem->setText( Private::RegionColumn, header );
00241 headerItem->setToolTip( Private::RegionColumn, text );
00242 headerItem->setWhatsThis( Private::RegionColumn, text );
00243 header = i18nc( "Header for Language column", "Language" );
00244 text = i18n("<p>This column displays the language of the Holiday Region</p>");
00245 headerItem->setText( Private::LanguageColumn, header );
00246 headerItem->setToolTip( Private::LanguageColumn, text );
00247 headerItem->setWhatsThis( Private::LanguageColumn, text );
00248 header = i18nc( "Header for Description column", "Description" );
00249 text = i18n("<p>This column displays the description of the Holiday Region</p>");
00250 headerItem->setText( Private::DescriptionColumn, header );
00251 headerItem->setToolTip( Private::DescriptionColumn, text );
00252 headerItem->setWhatsThis( Private::DescriptionColumn, text );
00253
00254 d->m_ui.regionTreeWidget->setSelectionMode( QAbstractItemView::NoSelection );
00255 d->m_ui.regionTreeWidget->setItemsExpandable( false );
00256 d->m_ui.regionTreeWidget->setUniformRowHeights( true );
00257 d->m_ui.regionTreeWidget->setAllColumnsShowFocus( true );
00258 connect( d->m_ui.regionTreeWidget, SIGNAL( itemChanged( QTreeWidgetItem*, int ) ),
00259 this, SLOT( itemChanged( QTreeWidgetItem*, int ) ) );
00260
00261 QMap<QString, QStringList> regionCodeMap;
00262 QMap<QString, HolidayRegion*> regionMap;
00263 foreach ( const QString ®ionCode, HolidayRegion::regionCodes() ) {
00264 regionMap[regionCode] = new HolidayRegion( regionCode );
00265 QString country = regionMap[regionCode]->countryCode().split('-').at(0);
00266 regionCodeMap[country].append( regionCode );
00267 }
00268
00269 QMapIterator<QString, QStringList> it( regionCodeMap );
00270 while ( it.hasNext() ) {
00271 it.next();
00272
00273
00274 QTreeWidgetItem *rootItem = new QTreeWidgetItem( d->m_ui.regionTreeWidget );
00275 QString country = it.key();
00276 if ( it.value().count() == 1 && regionMap[it.value().at( 0 )]->countryCode() == country ) {
00277 d->initItem( rootItem, regionMap[ it.value().at( 0 ) ] );
00278 } else {
00279 rootItem->setText( Private::RegionColumn,
00280 KGlobal::locale()->countryCodeToName( country ) );
00281 d->m_ui.regionTreeWidget->setFirstItemColumnSpanned ( rootItem, true );
00282 foreach ( const QString ®ionCode, it.value() ) {
00283 QTreeWidgetItem *childItem = new QTreeWidgetItem( rootItem );
00284 d->initItem( childItem, regionMap[ regionCode ] );
00285 }
00286 }
00287 }
00288
00289 QMapIterator<QString, HolidayRegion*> i( regionMap );
00290 while ( i.hasNext() ) {
00291 i.next();
00292 delete i.value();
00293 }
00294
00295 d->m_ui.regionTreeWidget->expandAll();
00296 d->m_ui.regionTreeWidget->sortItems( Private::RegionColumn, Qt::AscendingOrder );
00297 d->m_ui.regionTreeWidget->resizeColumnToContents( Private::SelectColumn );
00298 d->m_ui.regionTreeWidget->resizeColumnToContents( Private::ComboColumn );
00299 d->m_ui.regionTreeWidget->resizeColumnToContents( Private::RegionColumn );
00300 d->m_ui.regionTreeWidget->resizeColumnToContents( Private::LanguageColumn );
00301
00302
00303 d->m_ui.searchLineWidget->searchLine()->addTreeWidget( d->m_ui.regionTreeWidget );
00304
00305
00306 setSelectionMode( QAbstractItemView::MultiSelection );
00307 setRegionUseFlagsEnabled( true );
00308 }
00309
00310 HolidayRegionSelector::~HolidayRegionSelector()
00311 {
00312 delete d;
00313 }
00314
00315 QStringList HolidayRegionSelector::holidayRegions() const
00316 {
00317 return d->m_holidayRegionCodes;
00318 }
00319
00320 void HolidayRegionSelector::setSelectionMode( QAbstractItemView::SelectionMode selectionMode )
00321 {
00322 d->m_selectionMode = selectionMode;
00323
00324 if ( selectionMode == QAbstractItemView::NoSelection ) {
00325 setRegionUseFlagsEnabled( false );
00326 }
00327 }
00328
00329 QAbstractItemView::SelectionMode HolidayRegionSelector::selectionMode() const
00330 {
00331 return d->m_selectionMode;
00332 }
00333
00334 void HolidayRegionSelector::setRegionUseFlagsEnabled( bool enableRegionUseFlags )
00335 {
00336 d->m_enableRegionUseFlags = enableRegionUseFlags;
00337 d->m_ui.regionTreeWidget->setColumnHidden( Private::SelectColumn, enableRegionUseFlags );
00338 d->m_ui.regionTreeWidget->setColumnHidden( Private::ComboColumn, !enableRegionUseFlags );
00339 }
00340
00341 bool HolidayRegionSelector::regionUseFlagsEnabled() const
00342 {
00343 return d->m_enableRegionUseFlags;
00344 }
00345
00346 void HolidayRegionSelector::setSelectionStatus( const QString &holidayRegionCode,
00347 HolidayRegionSelector::SelectionStatus status )
00348 {
00349 QTreeWidgetItem *item = d->findItem( holidayRegionCode );
00350 if ( item ) {
00351 d->setItemStatus( item, status );
00352 }
00353 }
00354
00355 HolidayRegionSelector::SelectionStatus HolidayRegionSelector::selectionStatus( const QString &holidayRegionCode ) const
00356 {
00357 QTreeWidgetItem *item = d->findItem( holidayRegionCode );
00358 if ( item ) {
00359 return d->itemSelectionStatus( item );
00360 }
00361 return HolidayRegionSelector::RegionHidden;
00362 }
00363
00364 QHash<QString, HolidayRegionSelector::SelectionStatus> HolidayRegionSelector::selectionStatus() const
00365 {
00366 QHash<QString, HolidayRegionSelector::SelectionStatus> selection;
00367 QTreeWidgetItemIterator it( d->m_ui.regionTreeWidget );
00368 while ( *it ) {
00369 selection.insert( d->itemRegion( (*it) ), d->itemSelectionStatus( (*it) ) );
00370 ++it;
00371 }
00372 return selection;
00373 }
00374
00375 QStringList HolidayRegionSelector::selection( HolidayRegionSelector::SelectionStatus selectionStatus ) const
00376 {
00377 if ( selectionMode() == QAbstractItemView::NoSelection ) {
00378 return QStringList();
00379 }
00380
00381 QStringList selection;
00382 QTreeWidgetItemIterator it( d->m_ui.regionTreeWidget );
00383 while ( *it ) {
00384 if ( d->itemSelectionStatus( (*it) ) == selectionStatus ) {
00385 selection.append( d->itemRegion( (*it) ) );
00386 }
00387 ++it;
00388 }
00389 return selection;
00390 }
00391
00392 QStringList HolidayRegionSelector::selection( HolidayRegionSelector::RegionUseFlags regionUseFlags ) const
00393 {
00394 if ( selectionMode() == QAbstractItemView::NoSelection ) {
00395 return QStringList();
00396 }
00397
00398 QStringList selection;
00399 QTreeWidgetItemIterator it( d->m_ui.regionTreeWidget );
00400 while ( *it ) {
00401 if ( d->itemRegionUseFlags( (*it) ) & regionUseFlags ) {
00402 selection.append( d->itemRegion( (*it) ) );
00403 }
00404 ++it;
00405 }
00406 return selection;
00407 }
00408
00409 void HolidayRegionSelector::setRegionUseFlags( const QString &holidayRegionCode,
00410 HolidayRegionSelector::RegionUseFlags regionUseFlags )
00411 {
00412 QTreeWidgetItem *item = d->findItem( holidayRegionCode );
00413 if ( item ) {
00414 d->setItemRegionUseFlags( item, regionUseFlags );
00415 }
00416 }
00417
00418 HolidayRegionSelector::RegionUseFlags HolidayRegionSelector::regionUseFlags( const QString &holidayRegionCode ) const
00419 {
00420 QTreeWidgetItem *item = d->findItem( holidayRegionCode );
00421 if ( item ) {
00422 return d->itemRegionUseFlags( item );
00423 }
00424 return HolidayRegionSelector::NotUsed;
00425 }
00426
00427 QHash<QString, HolidayRegionSelector::RegionUseFlags> HolidayRegionSelector::regionUseFlags() const
00428 {
00429 QHash<QString, HolidayRegionSelector::RegionUseFlags> selection;
00430 QTreeWidgetItemIterator it( d->m_ui.regionTreeWidget );
00431 while ( *it ) {
00432 selection.insert( d->itemRegion( (*it) ), d->itemRegionUseFlags( (*it) ) );
00433 ++it;
00434 }
00435 return selection;
00436 }
00437
00438 void HolidayRegionSelector::itemChanged( QTreeWidgetItem *item, int column )
00439 {
00440 if ( column == Private::SelectColumn ) {
00441 if ( item->checkState( Private::SelectColumn ) == Qt::Unchecked ) {
00442 d->setItemStatus( item, RegionAvailable );
00443 } else {
00444 d->setItemStatus( item, RegionSelected );
00445 }
00446 }
00447 }
00448
00449
00450 void HolidayRegionSelector::itemChanged( int index )
00451 {
00452 KComboBox *combo = static_cast<KComboBox*> (sender());
00453 QTreeWidgetItemIterator it( d->m_ui.regionTreeWidget );
00454 bool found = false;
00455 while ( *it && !found ) {
00456 if ( d->itemCombo( (*it) ) == combo ) {
00457 (*it)->setData( Private::ComboColumn, Qt::UserRole, d->itemCombo( (*it) )->itemData( index ) );
00458 if ( d->itemRegionUseFlags( (*it) ) == NotUsed ) {
00459 d->setItemStatus( (*it), RegionAvailable );
00460 } else {
00461 d->setItemStatus( (*it), RegionSelected );
00462 }
00463 found = true;
00464 }
00465 ++it;
00466 }
00467 }
00468
00469 void HolidayRegionSelector::clearSelection()
00470 {
00471 d->clearSelection();
00472 }
00473
00474 void HolidayRegionSelector::setLanguageFilter( const QStringList &languages )
00475 {
00476
00477 QTreeWidgetItemIterator it( d->m_ui.regionTreeWidget );
00478 while ( *it ) {
00479 if ( !d->m_languageFilter.contains( (*it)->data( Private::LanguageColumn, Qt::UserRole ).toString() ) ) {
00480 d->setItemStatus( (*it), RegionAvailable );
00481 }
00482 ++it;
00483 }
00484
00485 d->m_languageFilter = languages;
00486 QTreeWidgetItemIterator it2( d->m_ui.regionTreeWidget );
00487 while ( *it2 ) {
00488 QString language = (*it2)->data( Private::LanguageColumn, Qt::UserRole ).toString();
00489 if ( d->m_languageFilter.contains( language ) ) {
00490
00491 if ( (*it2)->parent() && (*it2)->parent() != d->m_ui.regionTreeWidget->invisibleRootItem() ) {
00492 d->setItemStatus( (*it2)->parent(), RegionAvailable );
00493 }
00494 } else {
00495 d->setItemStatus( (*it2), RegionHidden );
00496 }
00497 ++it2;
00498 }
00499 }
00500
00501 QStringList HolidayRegionSelector::languageFilter() const
00502 {
00503 return d->m_languageFilter;
00504 }
00505
00506 void HolidayRegionSelector::setSearchHidden( bool hideSearch )
00507 {
00508 d->m_ui.searchLineWidget->setHidden( hideSearch );
00509 }
00510
00511 bool HolidayRegionSelector::searchHidden() const
00512 {
00513 return d->m_ui.searchLineWidget->isHidden();
00514 }
00515
00516 void HolidayRegionSelector::setLanguageHidden( bool hideLanguage )
00517 {
00518 d->m_ui.regionTreeWidget->setColumnHidden( Private::LanguageColumn, hideLanguage );
00519 }
00520
00521 bool HolidayRegionSelector::languageHidden() const
00522 {
00523 return d->m_ui.regionTreeWidget->isColumnHidden( Private::LanguageColumn );
00524 }
00525
00526 void HolidayRegionSelector::setDescriptionHidden( bool hideDescription )
00527 {
00528 d->m_ui.regionTreeWidget->setColumnHidden( Private::DescriptionColumn, hideDescription );
00529 }
00530
00531 bool HolidayRegionSelector::descriptionHidden() const
00532 {
00533 return d->m_ui.regionTreeWidget->isColumnHidden( Private::DescriptionColumn );
00534 }
00535
00536 #include "holidayregionselector.moc"