• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdepimlibs API Reference
  • KDE Home
  • Contact Us
 

KHolidays Library

  • sources
  • kde-4.12
  • kdepimlibs
  • kholidays
holidayregionselector.cpp
1 /*
2  This file is part of the kholidays library.
3 
4  Copyright 2010 John Layt <john@layt.net>
5 
6  This library is free software; you can redistribute it and/or
7  modify it under the terms of the GNU Library General Public
8  License as published by the Free Software Foundation; either
9  version 2 of the License, or (at your option) any later version.
10 
11  This library is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU Library General Public License for more details.
15 
16  You should have received a copy of the GNU Library General Public License
17  along with this library; see the file COPYING.LIB. If not, write to the
18  Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19  Boston, MA 02110-1301, USA.
20 */
21 
22 #include "holidayregionselector.h"
23 #include "ui_holidayregionselector.h"
24 
25 #include "holidayregion.h"
26 
27 #include <KDebug>
28 #include <KLocale>
29 #include <KLocalizedString>
30 #include <KGlobal>
31 #include <KComboBox>
32 
33 using namespace KHolidays;
34 
35 class HolidayRegionSelector::Private
36 {
37  public:
38  Private( HolidayRegionSelector *q_ptr )
39  {
40  q = q_ptr;
41  }
42 
43  ~Private()
44  {
45  }
46 
47  // Reorder this to change column order
48  enum Column {
49  RegionColumn = 0,
50  LanguageColumn,
51  DescriptionColumn,
52  SelectColumn,
53  ComboColumn
54  };
55 
56  void clearSelection();
57  QTreeWidgetItem *findItem( const QString &holidayRegionCode );
58  void initItem( QTreeWidgetItem *listItem, HolidayRegion *region );
59  QString itemRegion( QTreeWidgetItem *item );
60  QString itemLanguage( QTreeWidgetItem *item );
61  SelectionStatus itemSelectionStatus( QTreeWidgetItem *item );
62  void setItemStatus( QTreeWidgetItem *item, SelectionStatus status );
63  KComboBox *itemCombo( QTreeWidgetItem *item );
64  void setItemRegionUseFlags( QTreeWidgetItem *item, RegionUseFlags regionUseFlags );
65  HolidayRegionSelector::RegionUseFlags itemRegionUseFlags( QTreeWidgetItem *item );
66 
67  QAbstractItemView::SelectionMode m_selectionMode;
68  bool m_enableRegionUseFlags;
69  QStringList m_languageFilter;
70  QStringList m_holidayRegionCodes;
71  Ui::holidayRegionSelector m_ui;
72  HolidayRegionSelector *q;
73 };
74 
75 void HolidayRegionSelector::Private::clearSelection()
76 {
77  m_ui.regionTreeWidget->blockSignals( true );
78  QTreeWidgetItemIterator it( m_ui.regionTreeWidget, QTreeWidgetItemIterator::Checked );
79  while ( *it ) {
80  ( *it )->setCheckState( Private::SelectColumn, Qt::Unchecked );
81  ( *it )->setData( Private::SelectColumn, Qt::UserRole, RegionAvailable );
82  itemCombo( ( *it ) )->setCurrentIndex( 0 );
83  ( *it )->setData( Private::ComboColumn, Qt::UserRole, NotUsed );
84  ++it;
85  }
86  m_ui.regionTreeWidget->blockSignals( false );
87 }
88 
89 QTreeWidgetItem *HolidayRegionSelector::Private::findItem( const QString &holidayRegionCode )
90 {
91  QTreeWidgetItemIterator it( m_ui.regionTreeWidget );
92  while ( *it ) {
93  if ( ( *it )->data( HolidayRegionSelector::Private::RegionColumn, Qt::UserRole ) ==
94  holidayRegionCode ) {
95  return ( *it );
96  }
97  ++it;
98  }
99  return 0;
100 }
101 
102 void HolidayRegionSelector::Private::initItem( QTreeWidgetItem *listItem, HolidayRegion *region )
103 {
104  m_ui.regionTreeWidget->blockSignals( true );
105  QString languageName = KGlobal::locale()->languageCodeToName( region->languageCode() );
106  listItem->setCheckState( Private::SelectColumn, Qt::Unchecked );
107  QString text = i18n( "<p>Select to use Holiday Region</p>" );
108  listItem->setToolTip( Private::SelectColumn, text );
109  listItem->setToolTip( Private::ComboColumn, text );
110  text = i18n( "<p>Select to use Holiday Region</p>" );
111  listItem->setToolTip( Private::SelectColumn, text );
112  listItem->setToolTip( Private::ComboColumn, text );
113  listItem->setText( Private::RegionColumn, region->name() );
114  QString toolTip = i18n( "<p><b>Region:</b> %1<br/>"
115  "<b>Language:</b> %2<br/>"
116  "<b>Description:</b> %3</p>",
117  region->name(), languageName, region->description() );
118  listItem->setToolTip( Private::RegionColumn, toolTip );
119  listItem->setData( Private::RegionColumn, Qt::UserRole, region->regionCode() );
120  listItem->setText( Private::LanguageColumn, languageName );
121  listItem->setData( Private::LanguageColumn, Qt::UserRole, region->languageCode() );
122  listItem->setText( Private::DescriptionColumn, region->description() );
123  listItem->setToolTip( Private::DescriptionColumn, region->description() );
124  KComboBox *combo = new KComboBox();
125  combo->setAutoFillBackground( true );
126  QString comboText = i18n( "<p>You can choose to display the Holiday Region for information only, "
127  "or to use the Holiday Region when displaying or calculating days off "
128  "such as Public Holidays. If you choose to use the Holiday Region for "
129  "Days Off, then only those Holiday Events marked in the Holiday Region "
130  "as Days Off will be used for non-work days, Holiday Events that are "
131  "not marked in the Holiday Region as Days Off will continue to be "
132  "work days.</p>" );
133  combo->setToolTip( comboText );
134  comboText = i18nc( "Combobox label, Holiday Region not used", "Not Used" );
135  combo->addItem( comboText, QVariant( NotUsed ) );
136  comboText = i18nc( "Combobox label, use Holiday Region for information only", "Information" );
137  combo->addItem( comboText, QVariant( UseInformationOnly ) );
138  comboText = i18nc( "Combobox label, use Holiday Region for days off", "Days Off" );
139  combo->addItem( comboText, QVariant( UseDaysOff ) );
140  combo->setCurrentIndex( 0 );
141  listItem->setData( Private::ComboColumn, Qt::UserRole, NotUsed );
142  m_ui.regionTreeWidget->setItemWidget( listItem, ComboColumn, combo );
143  connect( combo, SIGNAL(currentIndexChanged(int)),
144  q, SLOT(itemChanged(int)) );
145  m_ui.regionTreeWidget->blockSignals( false );
146 }
147 
148 QString HolidayRegionSelector::Private::itemRegion( QTreeWidgetItem *item )
149 {
150  return item->data( Private::RegionColumn, Qt::UserRole ).toString();
151 }
152 
153 QString HolidayRegionSelector::Private::itemLanguage( QTreeWidgetItem *item )
154 {
155  return item->data( Private::LanguageColumn, Qt::UserRole ).toString();
156 }
157 
158 HolidayRegionSelector::SelectionStatus
159 HolidayRegionSelector::Private::itemSelectionStatus( QTreeWidgetItem *item )
160 {
161  return
162  ( HolidayRegionSelector::SelectionStatus )
163  item->data( Private::SelectColumn, Qt::UserRole ).toInt();
164 }
165 
166 void HolidayRegionSelector::Private::setItemRegionUseFlags( QTreeWidgetItem *item,
167  RegionUseFlags regionUseFlags )
168 {
169  // Just do simple flags for now, cheat on the index
170  item->setData( ComboColumn, Qt::UserRole, QVariant( regionUseFlags ) );
171  if ( regionUseFlags & UseDaysOff ) {
172  setItemStatus( item, RegionSelected );
173  itemCombo( item )->setCurrentIndex( 2 );
174  } else if ( regionUseFlags & UseInformationOnly ) {
175  setItemStatus( item, RegionSelected );
176  itemCombo( item )->setCurrentIndex( 1 );
177  } else { // NotUsed
178  setItemStatus( item, RegionAvailable );
179  itemCombo( item )->setCurrentIndex( 0 );
180  }
181 }
182 
183 HolidayRegionSelector::RegionUseFlags
184 HolidayRegionSelector::Private::itemRegionUseFlags( QTreeWidgetItem *item )
185 {
186  return (RegionUseFlags) item->data( ComboColumn, Qt::UserRole ).toInt();
187 }
188 
189 KComboBox *HolidayRegionSelector::Private::itemCombo( QTreeWidgetItem *item )
190 {
191  return static_cast<KComboBox*>( m_ui.regionTreeWidget->itemWidget( item, ComboColumn ) );
192 }
193 
194 void HolidayRegionSelector::Private::setItemStatus( QTreeWidgetItem *item, SelectionStatus status )
195 {
196  if ( m_selectionMode == QAbstractItemView::SingleSelection &&
197  status == RegionSelected ) {
198  clearSelection();
199  }
200 
201  Qt::CheckState selectStatus = Qt::Unchecked;
202  bool hidden = false;
203  bool disabled = false;
204 
205  switch ( status ) {
206  case RegionHidden:
207  hidden = true;
208  disabled = true;
209  break;
210  case RegionDisabled:
211  disabled = true;
212  break;
213  case RegionAvailable:
214  break;
215  case RegionSelected:
216  {
217  if ( m_selectionMode != QAbstractItemView::NoSelection ) {
218  selectStatus = Qt::Checked;
219  }
220  break;
221  }
222  default:
223  break;
224  }
225 
226  m_ui.regionTreeWidget->blockSignals( true );
227  item->setData( Private::SelectColumn, Qt::UserRole, status );
228  item->setCheckState( Private::SelectColumn, selectStatus );
229  item->setHidden( hidden );
230  item->setDisabled( disabled );
231  m_ui.regionTreeWidget->blockSignals( false );
232 }
233 
234 HolidayRegionSelector::HolidayRegionSelector( QWidget *parent ) :
235  QWidget( parent ), d( new Private( this ) )
236 {
237  d->m_ui.setupUi( this );
238 
239  // Setup the columns
240  d->m_ui.regionTreeWidget->setColumnCount( 5 );
241  QTreeWidgetItem *headerItem = d->m_ui.regionTreeWidget->headerItem();
242  QString header = i18nc( "Header for Select column", "Select" );
243  QString text = i18n( "<p>This column selects to use the Holiday Region</p>" );
244  headerItem->setText( Private::SelectColumn, header );
245  headerItem->setToolTip( Private::SelectColumn, text );
246  headerItem->setWhatsThis( Private::SelectColumn, text );
247  headerItem->setText( Private::ComboColumn, header );
248  headerItem->setToolTip( Private::ComboColumn, text );
249  headerItem->setWhatsThis( Private::ComboColumn, text );
250  header = i18nc( "Header for Holiday Region column", "Region" );
251  text = i18n( "<p>This column displays the name of the Holiday Region</p>" );
252  headerItem->setText( Private::RegionColumn, header );
253  headerItem->setToolTip( Private::RegionColumn, text );
254  headerItem->setWhatsThis( Private::RegionColumn, text );
255  header = i18nc( "Header for Language column", "Language" );
256  text = i18n( "<p>This column displays the language of the Holiday Region</p>" );
257  headerItem->setText( Private::LanguageColumn, header );
258  headerItem->setToolTip( Private::LanguageColumn, text );
259  headerItem->setWhatsThis( Private::LanguageColumn, text );
260  header = i18nc( "Header for Description column", "Description" );
261  text = i18n( "<p>This column displays the description of the Holiday Region</p>" );
262  headerItem->setText( Private::DescriptionColumn, header );
263  headerItem->setToolTip( Private::DescriptionColumn, text );
264  headerItem->setWhatsThis( Private::DescriptionColumn, text );
265 
266  d->m_ui.regionTreeWidget->setSelectionMode( QAbstractItemView::NoSelection );
267  d->m_ui.regionTreeWidget->setItemsExpandable( true ); //per bug 271628
268  d->m_ui.regionTreeWidget->setUniformRowHeights( true );
269  d->m_ui.regionTreeWidget->setAllColumnsShowFocus( true );
270  connect( d->m_ui.regionTreeWidget, SIGNAL(itemChanged(QTreeWidgetItem*,int)),
271  this, SLOT(itemChanged(QTreeWidgetItem*,int)) );
272 
273  QMap<QString, QStringList> regionCodeMap;
274  QMap<QString, HolidayRegion*> regionMap;
275  foreach ( const QString &regionCode, HolidayRegion::regionCodes() ) {
276  regionMap[regionCode] = new HolidayRegion( regionCode );
277  QString country = regionMap[regionCode]->countryCode().split( QLatin1Char('-') ).at( 0 );
278  regionCodeMap[country].append( regionCode );
279  }
280 
281  QMapIterator<QString, QStringList> it( regionCodeMap );
282  while ( it.hasNext() ) {
283  it.next();
284  // if only 1 region for country and that region is the country, then only show the country line
285  // Otherwise show a non-selectable country header and list all regions below it
286  QTreeWidgetItem *rootItem = new QTreeWidgetItem( d->m_ui.regionTreeWidget );
287  QString country = it.key();
288  if ( it.value().count() == 1 && regionMap[it.value().at( 0 )]->countryCode() == country ) {
289  d->initItem( rootItem, regionMap[ it.value().at( 0 ) ] );
290  } else {
291  rootItem->setText( Private::RegionColumn,
292  KGlobal::locale()->countryCodeToName( country ) );
293  d->m_ui.regionTreeWidget->setFirstItemColumnSpanned ( rootItem, true );
294  foreach ( const QString &regionCode, it.value() ) {
295  QTreeWidgetItem *childItem = new QTreeWidgetItem( rootItem );
296  d->initItem( childItem, regionMap[ regionCode ] );
297  }
298  }
299  }
300 
301  QMapIterator<QString, HolidayRegion*> i( regionMap );
302  while ( i.hasNext() ) {
303  i.next();
304  delete i.value();
305  }
306 
307  d->m_ui.regionTreeWidget->expandAll();
308  d->m_ui.regionTreeWidget->sortItems( Private::RegionColumn, Qt::AscendingOrder );
309  d->m_ui.regionTreeWidget->resizeColumnToContents( Private::SelectColumn );
310  d->m_ui.regionTreeWidget->resizeColumnToContents( Private::ComboColumn );
311  d->m_ui.regionTreeWidget->resizeColumnToContents( Private::RegionColumn );
312  d->m_ui.regionTreeWidget->resizeColumnToContents( Private::LanguageColumn );
313 
314  // Setup search widget
315  d->m_ui.searchLineWidget->searchLine()->addTreeWidget( d->m_ui.regionTreeWidget );
316 
317  // Default to MultiSelection mode with Region Use Flags
318  setSelectionMode( QAbstractItemView::MultiSelection );
319  setRegionUseFlagsEnabled( true );
320 }
321 
322 HolidayRegionSelector::~HolidayRegionSelector()
323 {
324  delete d;
325 }
326 
327 QStringList HolidayRegionSelector::holidayRegions() const
328 {
329  return d->m_holidayRegionCodes;
330 }
331 
332 void HolidayRegionSelector::setSelectionMode( QAbstractItemView::SelectionMode selectionMode )
333 {
334  d->m_selectionMode = selectionMode;
335 
336  if ( selectionMode == QAbstractItemView::NoSelection ) {
337  setRegionUseFlagsEnabled( false );
338  }
339 }
340 
341 QAbstractItemView::SelectionMode HolidayRegionSelector::selectionMode() const
342 {
343  return d->m_selectionMode;
344 }
345 
346 void HolidayRegionSelector::setRegionUseFlagsEnabled( bool enableRegionUseFlags )
347 {
348  d->m_enableRegionUseFlags = enableRegionUseFlags;
349  d->m_ui.regionTreeWidget->setColumnHidden( Private::SelectColumn, enableRegionUseFlags );
350  d->m_ui.regionTreeWidget->setColumnHidden( Private::ComboColumn, !enableRegionUseFlags );
351 }
352 
353 bool HolidayRegionSelector::regionUseFlagsEnabled() const
354 {
355  return d->m_enableRegionUseFlags;
356 }
357 
358 void HolidayRegionSelector::setSelectionStatus( const QString &holidayRegionCode,
359  HolidayRegionSelector::SelectionStatus status )
360 {
361  QTreeWidgetItem *item = d->findItem( holidayRegionCode );
362  if ( item ) {
363  d->setItemStatus( item, status );
364  }
365 }
366 
367 HolidayRegionSelector::SelectionStatus
368 HolidayRegionSelector::selectionStatus( const QString &holidayRegionCode ) const
369 {
370  QTreeWidgetItem *item = d->findItem( holidayRegionCode );
371  if ( item ) {
372  return d->itemSelectionStatus( item );
373  }
374  return HolidayRegionSelector::RegionHidden;
375 }
376 
377 QHash<QString, HolidayRegionSelector::SelectionStatus>
378 HolidayRegionSelector::selectionStatus() const
379 {
380  QHash<QString, HolidayRegionSelector::SelectionStatus> selection;
381  QTreeWidgetItemIterator it( d->m_ui.regionTreeWidget );
382  while ( *it ) {
383  selection.insert( d->itemRegion( ( *it ) ), d->itemSelectionStatus( ( *it ) ) );
384  ++it;
385  }
386  return selection;
387 }
388 
389 QStringList
390 HolidayRegionSelector::selection( HolidayRegionSelector::SelectionStatus selectionStatus ) const
391 {
392  if ( selectionMode() == QAbstractItemView::NoSelection ) {
393  return QStringList();
394  }
395 
396  QStringList selection;
397  QTreeWidgetItemIterator it( d->m_ui.regionTreeWidget );
398  while ( *it ) {
399  if ( d->itemSelectionStatus( ( *it ) ) == selectionStatus ) {
400  selection.append( d->itemRegion( ( *it ) ) );
401  }
402  ++it;
403  }
404  return selection;
405 }
406 
407 QStringList
408 HolidayRegionSelector::selection( HolidayRegionSelector::RegionUseFlags regionUseFlags ) const
409 {
410  if ( selectionMode() == QAbstractItemView::NoSelection ) {
411  return QStringList();
412  }
413 
414  QStringList selection;
415  QTreeWidgetItemIterator it( d->m_ui.regionTreeWidget );
416  while ( *it ) {
417  if ( d->itemRegionUseFlags( ( *it ) ) & regionUseFlags ) {
418  selection.append( d->itemRegion( ( *it ) ) );
419  }
420  ++it;
421  }
422  return selection;
423 }
424 
425 void
426 HolidayRegionSelector::setRegionUseFlags( const QString &holidayRegionCode,
427  HolidayRegionSelector::RegionUseFlags regionUseFlags )
428 {
429  QTreeWidgetItem *item = d->findItem( holidayRegionCode );
430  if ( item ) {
431  d->setItemRegionUseFlags( item, regionUseFlags );
432  }
433 }
434 
435 HolidayRegionSelector::RegionUseFlags
436 HolidayRegionSelector::regionUseFlags( const QString &holidayRegionCode ) const
437 {
438  QTreeWidgetItem *item = d->findItem( holidayRegionCode );
439  if ( item ) {
440  return d->itemRegionUseFlags( item );
441  }
442  return HolidayRegionSelector::NotUsed;
443 }
444 
445 QHash<QString, HolidayRegionSelector::RegionUseFlags> HolidayRegionSelector::regionUseFlags() const
446 {
447  QHash<QString, HolidayRegionSelector::RegionUseFlags> selection;
448  QTreeWidgetItemIterator it( d->m_ui.regionTreeWidget );
449  while ( *it ) {
450  selection.insert( d->itemRegion( ( *it ) ), d->itemRegionUseFlags( ( *it ) ) );
451  ++it;
452  }
453  return selection;
454 }
455 
456 void HolidayRegionSelector::itemChanged( QTreeWidgetItem *item, int column )
457 {
458  if ( column == Private::SelectColumn ) {
459  if ( item->checkState( Private::SelectColumn ) == Qt::Unchecked ) {
460  d->setItemStatus( item, RegionAvailable );
461  } else {
462  d->setItemStatus( item, RegionSelected );
463  }
464  }
465  emit selectionChanged();
466 }
467 
468 // The slot for the combo box when changed
469 void HolidayRegionSelector::itemChanged( int index )
470 {
471  KComboBox *combo = static_cast<KComboBox*>( sender() );
472  QTreeWidgetItemIterator it( d->m_ui.regionTreeWidget );
473  bool found = false;
474  while ( *it && !found ) {
475  if ( d->itemCombo( ( *it ) ) == combo ) {
476  ( *it )->setData(
477  Private::ComboColumn, Qt::UserRole, d->itemCombo( ( *it ) )->itemData( index ) );
478  if ( d->itemRegionUseFlags( ( *it ) ) == NotUsed ) {
479  d->setItemStatus( ( *it ), RegionAvailable );
480  } else {
481  d->setItemStatus( ( *it ), RegionSelected );
482  }
483  found = true;
484  }
485  ++it;
486  }
487 }
488 
489 void HolidayRegionSelector::clearSelection()
490 {
491  d->clearSelection();
492 }
493 
494 void HolidayRegionSelector::setLanguageFilter( const QStringList &languages )
495 {
496  // First reset to visible those languages previously hidden
497  QTreeWidgetItemIterator it( d->m_ui.regionTreeWidget );
498  while ( *it ) {
499  if ( !d->m_languageFilter.contains(
500  ( *it )->data( Private::LanguageColumn, Qt::UserRole ).toString() ) ) {
501  d->setItemStatus( ( *it ), RegionAvailable );
502  }
503  ++it;
504  }
505  // Now hide those languages not in the new list
506  d->m_languageFilter = languages;
507  QTreeWidgetItemIterator it2( d->m_ui.regionTreeWidget );
508  while ( *it2 ) {
509  QString language = ( *it2 )->data( Private::LanguageColumn, Qt::UserRole ).toString();
510  if ( d->m_languageFilter.contains( language ) ) {
511  // Make sure the parent is always visible, otherwise the child is not visible
512  if ( ( *it2 )->parent() &&
513  ( *it2 )->parent() != d->m_ui.regionTreeWidget->invisibleRootItem() ) {
514  d->setItemStatus( ( *it2 )->parent(), RegionAvailable );
515  }
516  } else {
517  d->setItemStatus( ( *it2 ), RegionHidden );
518  }
519  ++it2;
520  }
521 }
522 
523 QStringList HolidayRegionSelector::languageFilter() const
524 {
525  return d->m_languageFilter;
526 }
527 
528 void HolidayRegionSelector::setSearchHidden( bool hideSearch )
529 {
530  d->m_ui.searchLineWidget->setHidden( hideSearch );
531 }
532 
533 bool HolidayRegionSelector::searchHidden() const
534 {
535  return d->m_ui.searchLineWidget->isHidden();
536 }
537 
538 void HolidayRegionSelector::setLanguageHidden( bool hideLanguage )
539 {
540  d->m_ui.regionTreeWidget->setColumnHidden( Private::LanguageColumn, hideLanguage );
541 }
542 
543 bool HolidayRegionSelector::languageHidden() const
544 {
545  return d->m_ui.regionTreeWidget->isColumnHidden( Private::LanguageColumn );
546 }
547 
548 void HolidayRegionSelector::setDescriptionHidden( bool hideDescription )
549 {
550  d->m_ui.regionTreeWidget->setColumnHidden( Private::DescriptionColumn, hideDescription );
551 }
552 
553 bool HolidayRegionSelector::descriptionHidden() const
554 {
555  return d->m_ui.regionTreeWidget->isColumnHidden( Private::DescriptionColumn );
556 }
557 
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 23:00:06 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

KHolidays Library

Skip menu "KHolidays Library"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • Related Pages

kdepimlibs API Reference

Skip menu "kdepimlibs API Reference"
  • akonadi
  •   contact
  •   kmime
  •   socialutils
  • kabc
  • kalarmcal
  • kblog
  • kcal
  • kcalcore
  • kcalutils
  • kholidays
  • kimap
  • kldap
  • kmbox
  • kmime
  • kpimidentities
  • kpimtextedit
  • kresources
  • ktnef
  • kxmlrpcclient
  • microblog

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal