22 #include "holidayregionselector.h"
23 #include "ui_holidayregionselector.h"
25 #include "holidayregion.h"
31 using namespace KHolidays;
33 class HolidayRegionSelector::Private
36 Private( HolidayRegionSelector *q_ptr )
54 void clearSelection();
55 QTreeWidgetItem *findItem(
const QString &holidayRegionCode );
56 void initItem( QTreeWidgetItem *listItem, HolidayRegion *region );
57 QString itemRegion( QTreeWidgetItem *item );
58 QString itemLanguage( QTreeWidgetItem *item );
59 SelectionStatus itemSelectionStatus( QTreeWidgetItem *item );
60 void setItemStatus( QTreeWidgetItem *item, SelectionStatus status );
61 KComboBox *itemCombo( QTreeWidgetItem *item );
62 void setItemRegionUseFlags( QTreeWidgetItem *item, RegionUseFlags regionUseFlags );
63 HolidayRegionSelector::RegionUseFlags itemRegionUseFlags( QTreeWidgetItem *item );
65 QAbstractItemView::SelectionMode m_selectionMode;
66 bool m_enableRegionUseFlags;
67 QStringList m_languageFilter;
68 QStringList m_holidayRegionCodes;
69 Ui::holidayRegionSelector m_ui;
70 HolidayRegionSelector *q;
73 void HolidayRegionSelector::Private::clearSelection()
75 m_ui.regionTreeWidget->blockSignals(
true );
76 QTreeWidgetItemIterator it( m_ui.regionTreeWidget, QTreeWidgetItemIterator::Checked );
78 ( *it )->setCheckState( Private::SelectColumn, Qt::Unchecked );
79 ( *it )->setData( Private::SelectColumn, Qt::UserRole, RegionAvailable );
80 itemCombo( ( *it ) )->setCurrentIndex( 0 );
81 ( *it )->setData( Private::ComboColumn, Qt::UserRole, NotUsed );
84 m_ui.regionTreeWidget->blockSignals(
false );
87 QTreeWidgetItem *HolidayRegionSelector::Private::findItem(
const QString &holidayRegionCode )
89 QTreeWidgetItemIterator it( m_ui.regionTreeWidget );
91 if ( ( *it )->data( HolidayRegionSelector::Private::RegionColumn, Qt::UserRole ) ==
100 void HolidayRegionSelector::Private::initItem( QTreeWidgetItem *listItem, HolidayRegion *region )
102 m_ui.regionTreeWidget->blockSignals(
true );
103 QString languageName = KGlobal::locale()->languageCodeToName( region->languageCode() );
104 listItem->setCheckState( Private::SelectColumn, Qt::Unchecked );
105 QString text = i18n(
"<p>Select to use Holiday Region</p>" );
106 listItem->setToolTip( Private::SelectColumn, text );
107 listItem->setToolTip( Private::ComboColumn, text );
108 text = i18n(
"<p>Select to use Holiday Region</p>" );
109 listItem->setToolTip( Private::SelectColumn, text );
110 listItem->setToolTip( Private::ComboColumn, text );
111 listItem->setText( Private::RegionColumn, region->name() );
112 QString toolTip = i18n(
"<p><b>Region:</b> %1<br/>"
113 "<b>Language:</b> %2<br/>"
114 "<b>Description:</b> %3</p>",
115 region->name(), languageName, region->description() );
116 listItem->setToolTip( Private::RegionColumn, toolTip );
117 listItem->setData( Private::RegionColumn, Qt::UserRole, region->regionCode() );
118 listItem->setText( Private::LanguageColumn, languageName );
119 listItem->setData( Private::LanguageColumn, Qt::UserRole, region->languageCode() );
120 listItem->setText( Private::DescriptionColumn, region->description() );
121 listItem->setToolTip( Private::DescriptionColumn, region->description() );
122 KComboBox *combo =
new KComboBox();
123 combo->setAutoFillBackground(
true );
124 QString comboText = i18n(
"<p>You can choose to display the Holiday Region for information only, "
125 "or to use the Holiday Region when displaying or calculating days off "
126 "such as Public Holidays. If you choose to use the Holiday Region for "
127 "Days Off, then only those Holiday Events marked in the Holiday Region "
128 "as Days Off will be used for non-work days, Holiday Events that are "
129 "not marked in the Holiday Region as Days Off will continue to be "
131 combo->setToolTip( comboText );
132 comboText = i18nc(
"Combobox label, Holiday Region not used",
"Not Used" );
133 combo->addItem( comboText, QVariant( NotUsed ) );
134 comboText = i18nc(
"Combobox label, use Holiday Region for information only",
"Information" );
135 combo->addItem( comboText, QVariant( UseInformationOnly ) );
136 comboText = i18nc(
"Combobox label, use Holiday Region for days off",
"Days Off" );
137 combo->addItem( comboText, QVariant( UseDaysOff ) );
138 combo->setCurrentIndex( 0 );
139 listItem->setData( Private::ComboColumn, Qt::UserRole, NotUsed );
140 m_ui.regionTreeWidget->setItemWidget( listItem, ComboColumn, combo );
141 connect( combo, SIGNAL(currentIndexChanged(
int)),
142 q, SLOT(itemChanged(
int)) );
143 m_ui.regionTreeWidget->blockSignals(
false );
146 QString HolidayRegionSelector::Private::itemRegion( QTreeWidgetItem *item )
148 return item->data( Private::RegionColumn, Qt::UserRole ).toString();
151 QString HolidayRegionSelector::Private::itemLanguage( QTreeWidgetItem *item )
153 return item->data( Private::LanguageColumn, Qt::UserRole ).toString();
156 HolidayRegionSelector::SelectionStatus
157 HolidayRegionSelector::Private::itemSelectionStatus( QTreeWidgetItem *item )
160 ( HolidayRegionSelector::SelectionStatus )
161 item->data( Private::SelectColumn, Qt::UserRole ).toInt();
164 void HolidayRegionSelector::Private::setItemRegionUseFlags( QTreeWidgetItem *item,
165 RegionUseFlags regionUseFlags )
168 item->setData( ComboColumn, Qt::UserRole, QVariant( regionUseFlags ) );
169 if ( regionUseFlags & UseDaysOff ) {
170 setItemStatus( item, RegionSelected );
171 itemCombo( item )->setCurrentIndex( 2 );
172 }
else if ( regionUseFlags & UseInformationOnly ) {
173 setItemStatus( item, RegionSelected );
174 itemCombo( item )->setCurrentIndex( 1 );
176 setItemStatus( item, RegionAvailable );
177 itemCombo( item )->setCurrentIndex( 0 );
181 HolidayRegionSelector::RegionUseFlags
182 HolidayRegionSelector::Private::itemRegionUseFlags( QTreeWidgetItem *item )
184 return (RegionUseFlags) item->data( ComboColumn, Qt::UserRole ).toInt();
187 KComboBox *HolidayRegionSelector::Private::itemCombo( QTreeWidgetItem *item )
189 return static_cast<KComboBox*
>( m_ui.regionTreeWidget->itemWidget( item, ComboColumn ) );
192 void HolidayRegionSelector::Private::setItemStatus( QTreeWidgetItem *item, SelectionStatus status )
194 if ( m_selectionMode == QAbstractItemView::SingleSelection &&
195 status == RegionSelected ) {
199 Qt::CheckState selectStatus = Qt::Unchecked;
201 bool disabled =
false;
211 case RegionAvailable:
215 if ( m_selectionMode != QAbstractItemView::NoSelection ) {
216 selectStatus = Qt::Checked;
224 m_ui.regionTreeWidget->blockSignals(
true );
225 item->setData( Private::SelectColumn, Qt::UserRole, status );
226 item->setCheckState( Private::SelectColumn, selectStatus );
227 item->setHidden( hidden );
228 item->setDisabled( disabled );
229 m_ui.regionTreeWidget->blockSignals(
false );
232 HolidayRegionSelector::HolidayRegionSelector( QWidget *parent ) :
233 QWidget( parent ), d( new Private( this ) )
235 d->m_ui.setupUi(
this );
238 d->m_ui.regionTreeWidget->setColumnCount( 5 );
239 QTreeWidgetItem *headerItem = d->m_ui.regionTreeWidget->headerItem();
240 QString header = i18nc(
"Header for Select column",
"Select" );
241 QString text = i18n(
"<p>This column selects to use the Holiday Region</p>" );
242 headerItem->setText( Private::SelectColumn, header );
243 headerItem->setToolTip( Private::SelectColumn, text );
244 headerItem->setWhatsThis( Private::SelectColumn, text );
245 headerItem->setText( Private::ComboColumn, header );
246 headerItem->setToolTip( Private::ComboColumn, text );
247 headerItem->setWhatsThis( Private::ComboColumn, text );
248 header = i18nc(
"Header for Holiday Region column",
"Region" );
249 text = i18n(
"<p>This column displays the name of the Holiday Region</p>" );
250 headerItem->setText( Private::RegionColumn, header );
251 headerItem->setToolTip( Private::RegionColumn, text );
252 headerItem->setWhatsThis( Private::RegionColumn, text );
253 header = i18nc(
"Header for Language column",
"Language" );
254 text = i18n(
"<p>This column displays the language of the Holiday Region</p>" );
255 headerItem->setText( Private::LanguageColumn, header );
256 headerItem->setToolTip( Private::LanguageColumn, text );
257 headerItem->setWhatsThis( Private::LanguageColumn, text );
258 header = i18nc(
"Header for Description column",
"Description" );
259 text = i18n(
"<p>This column displays the description of the Holiday Region</p>" );
260 headerItem->setText( Private::DescriptionColumn, header );
261 headerItem->setToolTip( Private::DescriptionColumn, text );
262 headerItem->setWhatsThis( Private::DescriptionColumn, text );
264 d->m_ui.regionTreeWidget->setSelectionMode( QAbstractItemView::NoSelection );
265 d->m_ui.regionTreeWidget->setItemsExpandable(
true );
266 d->m_ui.regionTreeWidget->setUniformRowHeights(
true );
267 d->m_ui.regionTreeWidget->setAllColumnsShowFocus(
true );
268 connect( d->m_ui.regionTreeWidget, SIGNAL(itemChanged(QTreeWidgetItem*,
int)),
269 this, SLOT(itemChanged(QTreeWidgetItem*,
int)) );
271 QMap<QString, QStringList> regionCodeMap;
272 QMap<QString, HolidayRegion*> regionMap;
273 foreach (
const QString ®ionCode, HolidayRegion::regionCodes() ) {
274 regionMap[regionCode] =
new HolidayRegion( regionCode );
275 QString country = regionMap[regionCode]->countryCode().split(
'-' ).at( 0 );
276 regionCodeMap[country].append( regionCode );
279 QMapIterator<QString, QStringList> it( regionCodeMap );
280 while ( it.hasNext() ) {
284 QTreeWidgetItem *rootItem =
new QTreeWidgetItem( d->m_ui.regionTreeWidget );
285 QString country = it.key();
286 if ( it.value().count() == 1 && regionMap[it.value().at( 0 )]->countryCode() == country ) {
287 d->initItem( rootItem, regionMap[ it.value().at( 0 ) ] );
289 rootItem->setText( Private::RegionColumn,
290 KGlobal::locale()->countryCodeToName( country ) );
291 d->m_ui.regionTreeWidget->setFirstItemColumnSpanned ( rootItem,
true );
292 foreach (
const QString ®ionCode, it.value() ) {
293 QTreeWidgetItem *childItem =
new QTreeWidgetItem( rootItem );
294 d->initItem( childItem, regionMap[ regionCode ] );
299 QMapIterator<QString, HolidayRegion*> i( regionMap );
300 while ( i.hasNext() ) {
305 d->m_ui.regionTreeWidget->expandAll();
306 d->m_ui.regionTreeWidget->sortItems( Private::RegionColumn, Qt::AscendingOrder );
307 d->m_ui.regionTreeWidget->resizeColumnToContents( Private::SelectColumn );
308 d->m_ui.regionTreeWidget->resizeColumnToContents( Private::ComboColumn );
309 d->m_ui.regionTreeWidget->resizeColumnToContents( Private::RegionColumn );
310 d->m_ui.regionTreeWidget->resizeColumnToContents( Private::LanguageColumn );
313 d->m_ui.searchLineWidget->searchLine()->addTreeWidget( d->m_ui.regionTreeWidget );
316 setSelectionMode( QAbstractItemView::MultiSelection );
317 setRegionUseFlagsEnabled(
true );
320 HolidayRegionSelector::~HolidayRegionSelector()
325 QStringList HolidayRegionSelector::holidayRegions()
const
327 return d->m_holidayRegionCodes;
330 void HolidayRegionSelector::setSelectionMode( QAbstractItemView::SelectionMode selectionMode )
332 d->m_selectionMode = selectionMode;
334 if ( selectionMode == QAbstractItemView::NoSelection ) {
335 setRegionUseFlagsEnabled(
false );
339 QAbstractItemView::SelectionMode HolidayRegionSelector::selectionMode()
const
341 return d->m_selectionMode;
344 void HolidayRegionSelector::setRegionUseFlagsEnabled(
bool enableRegionUseFlags )
346 d->m_enableRegionUseFlags = enableRegionUseFlags;
347 d->m_ui.regionTreeWidget->setColumnHidden( Private::SelectColumn, enableRegionUseFlags );
348 d->m_ui.regionTreeWidget->setColumnHidden( Private::ComboColumn, !enableRegionUseFlags );
351 bool HolidayRegionSelector::regionUseFlagsEnabled()
const
353 return d->m_enableRegionUseFlags;
356 void HolidayRegionSelector::setSelectionStatus(
const QString &holidayRegionCode,
357 HolidayRegionSelector::SelectionStatus status )
359 QTreeWidgetItem *item = d->findItem( holidayRegionCode );
361 d->setItemStatus( item, status );
365 HolidayRegionSelector::SelectionStatus
366 HolidayRegionSelector::selectionStatus(
const QString &holidayRegionCode )
const
368 QTreeWidgetItem *item = d->findItem( holidayRegionCode );
370 return d->itemSelectionStatus( item );
372 return HolidayRegionSelector::RegionHidden;
375 QHash<QString, HolidayRegionSelector::SelectionStatus>
376 HolidayRegionSelector::selectionStatus()
const
378 QHash<QString, HolidayRegionSelector::SelectionStatus> selection;
379 QTreeWidgetItemIterator it( d->m_ui.regionTreeWidget );
381 selection.insert( d->itemRegion( ( *it ) ), d->itemSelectionStatus( ( *it ) ) );
388 HolidayRegionSelector::selection( HolidayRegionSelector::SelectionStatus selectionStatus )
const
390 if ( selectionMode() == QAbstractItemView::NoSelection ) {
391 return QStringList();
394 QStringList selection;
395 QTreeWidgetItemIterator it( d->m_ui.regionTreeWidget );
397 if ( d->itemSelectionStatus( ( *it ) ) == selectionStatus ) {
398 selection.append( d->itemRegion( ( *it ) ) );
406 HolidayRegionSelector::selection( HolidayRegionSelector::RegionUseFlags regionUseFlags )
const
408 if ( selectionMode() == QAbstractItemView::NoSelection ) {
409 return QStringList();
412 QStringList selection;
413 QTreeWidgetItemIterator it( d->m_ui.regionTreeWidget );
415 if ( d->itemRegionUseFlags( ( *it ) ) & regionUseFlags ) {
416 selection.append( d->itemRegion( ( *it ) ) );
424 HolidayRegionSelector::setRegionUseFlags(
const QString &holidayRegionCode,
425 HolidayRegionSelector::RegionUseFlags regionUseFlags )
427 QTreeWidgetItem *item = d->findItem( holidayRegionCode );
429 d->setItemRegionUseFlags( item, regionUseFlags );
433 HolidayRegionSelector::RegionUseFlags
434 HolidayRegionSelector::regionUseFlags(
const QString &holidayRegionCode )
const
436 QTreeWidgetItem *item = d->findItem( holidayRegionCode );
438 return d->itemRegionUseFlags( item );
440 return HolidayRegionSelector::NotUsed;
443 QHash<QString, HolidayRegionSelector::RegionUseFlags> HolidayRegionSelector::regionUseFlags()
const
445 QHash<QString, HolidayRegionSelector::RegionUseFlags> selection;
446 QTreeWidgetItemIterator it( d->m_ui.regionTreeWidget );
448 selection.insert( d->itemRegion( ( *it ) ), d->itemRegionUseFlags( ( *it ) ) );
454 void HolidayRegionSelector::itemChanged( QTreeWidgetItem *item,
int column )
456 if ( column == Private::SelectColumn ) {
457 if ( item->checkState( Private::SelectColumn ) == Qt::Unchecked ) {
458 d->setItemStatus( item, RegionAvailable );
460 d->setItemStatus( item, RegionSelected );
463 emit selectionChanged();
467 void HolidayRegionSelector::itemChanged(
int index )
469 KComboBox *combo =
static_cast<KComboBox*
>( sender() );
470 QTreeWidgetItemIterator it( d->m_ui.regionTreeWidget );
472 while ( *it && !found ) {
473 if ( d->itemCombo( ( *it ) ) == combo ) {
475 Private::ComboColumn, Qt::UserRole, d->itemCombo( ( *it ) )->itemData( index ) );
476 if ( d->itemRegionUseFlags( ( *it ) ) == NotUsed ) {
477 d->setItemStatus( ( *it ), RegionAvailable );
479 d->setItemStatus( ( *it ), RegionSelected );
487 void HolidayRegionSelector::clearSelection()
492 void HolidayRegionSelector::setLanguageFilter(
const QStringList &languages )
495 QTreeWidgetItemIterator it( d->m_ui.regionTreeWidget );
497 if ( !d->m_languageFilter.contains(
498 ( *it )->data( Private::LanguageColumn, Qt::UserRole ).toString() ) ) {
499 d->setItemStatus( ( *it ), RegionAvailable );
504 d->m_languageFilter = languages;
505 QTreeWidgetItemIterator it2( d->m_ui.regionTreeWidget );
507 QString language = ( *it2 )->data( Private::LanguageColumn, Qt::UserRole ).toString();
508 if ( d->m_languageFilter.contains( language ) ) {
510 if ( ( *it2 )->parent() &&
511 ( *it2 )->parent() != d->m_ui.regionTreeWidget->invisibleRootItem() ) {
512 d->setItemStatus( ( *it2 )->parent(), RegionAvailable );
515 d->setItemStatus( ( *it2 ), RegionHidden );
521 QStringList HolidayRegionSelector::languageFilter()
const
523 return d->m_languageFilter;
526 void HolidayRegionSelector::setSearchHidden(
bool hideSearch )
528 d->m_ui.searchLineWidget->setHidden( hideSearch );
531 bool HolidayRegionSelector::searchHidden()
const
533 return d->m_ui.searchLineWidget->isHidden();
536 void HolidayRegionSelector::setLanguageHidden(
bool hideLanguage )
538 d->m_ui.regionTreeWidget->setColumnHidden( Private::LanguageColumn, hideLanguage );
541 bool HolidayRegionSelector::languageHidden()
const
543 return d->m_ui.regionTreeWidget->isColumnHidden( Private::LanguageColumn );
546 void HolidayRegionSelector::setDescriptionHidden(
bool hideDescription )
548 d->m_ui.regionTreeWidget->setColumnHidden( Private::DescriptionColumn, hideDescription );
551 bool HolidayRegionSelector::descriptionHidden()
const
553 return d->m_ui.regionTreeWidget->isColumnHidden( Private::DescriptionColumn );