• Skip to content
  • Skip to link menu
KDE 4.2 API Reference
  • KDE API Reference
  • kdelibs
  • Sitemap
  • Contact Us
 

KIO

kmimetypechooser.cpp

Go to the documentation of this file.
00001 /* This file is part of the KDE libraries
00002    Copyright (C) 2001 - 2004 Anders Lund <anders@alweb.dk>
00003 
00004    This library is free software; you can redistribute it and/or
00005    modify it under the terms of the GNU Library General Public
00006    License version 2 as published by the Free Software Foundation.
00007 
00008    This library is distributed in the hope that it will be useful,
00009    but WITHOUT ANY WARRANTY; without even the implied warranty of
00010    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00011    Library General Public License for more details.
00012 
00013    You should have received a copy of the GNU Library General Public License
00014    along with this library; see the file COPYING.LIB.  If not, write to
00015    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00016    Boston, MA 02110-1301, USA.
00017 */
00018 
00019 #include "kmimetypechooser.h"
00020 
00021 #include <kconfig.h>
00022 #include <kiconloader.h>
00023 #include <klocale.h>
00024 #include <kmimetype.h>
00025 #include <kshell.h>
00026 #include <krun.h>
00027 #include <ksycoca.h>
00028 
00029 #include <QLabel>
00030 #include <QLayout>
00031 #include <QPushButton>
00032 #include <QTreeWidget>
00033 #include <kconfiggroup.h>
00034 
00035 //BEGIN KMimeTypeChooserPrivate
00036 class KMimeTypeChooserPrivate
00037 {
00038   public:
00039     KMimeTypeChooserPrivate( KMimeTypeChooser *parent )
00040       : q(parent),
00041         mimeTypeTree(0),
00042         btnEditMimeType(0)
00043     {
00044     }
00045 
00046     void loadMimeTypes( const QStringList &selected = QStringList() );
00047 
00048     void _k_editMimeType();
00049     void _k_slotCurrentChanged(QTreeWidgetItem*);
00050     void _k_slotSycocaDatabaseChanged();
00051 
00052     KMimeTypeChooser *q;
00053     QTreeWidget *mimeTypeTree;
00054     QPushButton *btnEditMimeType;
00055 
00056     QString defaultgroup;
00057     QStringList groups;
00058     int visuals;
00059 };
00060 //END
00061 
00062 //BEGIN KMimeTypeChooser
00063 KMimeTypeChooser::KMimeTypeChooser( const QString &text,
00064                               const QStringList &selMimeTypes,
00065                               const QString &defaultGroup,
00066                               const QStringList &groupsToShow,
00067                               int visuals,
00068                               QWidget *parent )
00069     : KVBox( parent ),
00070       d(new KMimeTypeChooserPrivate(this))
00071 {
00072   d->defaultgroup = defaultGroup;
00073   d->groups = groupsToShow;
00074   d->visuals = visuals;
00075 
00076   setSpacing( KDialog::spacingHint() );
00077 
00078   if ( !text.isEmpty() )
00079   {
00080     new QLabel( text, this );
00081   }
00082 
00083   d->mimeTypeTree = new QTreeWidget( this );
00084   QStringList headerLabels;
00085   headerLabels.append( i18n("Mime Type") );
00086 //   d->mimeTypeTree->setColumnWidthMode( 0, QListView::Manual );
00087 
00088   if ( visuals & Comments ) {
00089       headerLabels.append( i18n("Comment") );
00090       //d->mimeTypeTree->setColumnWidthMode( 1, Q3ListView::Manual );
00091   }
00092   if ( visuals & Patterns ) {
00093       headerLabels.append( i18n("Patterns") );
00094   }
00095 
00096 //  d->mimeTypeTree->setRootIsDecorated( true );
00097   d->mimeTypeTree->setColumnCount(headerLabels.count());
00098   d->mimeTypeTree->setHeaderLabels(headerLabels);
00099 
00100   d->loadMimeTypes( selMimeTypes );
00101 
00102   if (visuals & EditButton)
00103   {
00104     KHBox *btns = new KHBox( this );
00105     ((QBoxLayout*)btns->layout())->addStretch(1);
00106     d->btnEditMimeType = new QPushButton( i18n("&Edit..."), btns );
00107 
00108     connect( d->btnEditMimeType, SIGNAL(clicked()), this, SLOT(_k_editMimeType()) );
00109     d->btnEditMimeType->setEnabled( false );
00110     connect( d->mimeTypeTree, SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),
00111              this, SLOT(_k_editMimeType()));
00112     connect( d->mimeTypeTree, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)),
00113              this, SLOT(_k_slotCurrentChanged(QTreeWidgetItem*)) );
00114 
00115     d->btnEditMimeType->setWhatsThis(i18n(
00116         "Click this button to display the familiar KDE mime type editor.") );
00117   }
00118 }
00119 
00120 KMimeTypeChooser::~KMimeTypeChooser()
00121 {
00122   delete d;
00123 }
00124 
00125 void KMimeTypeChooserPrivate::loadMimeTypes( const QStringList &_selectedMimeTypes )
00126 {
00127   QStringList selMimeTypes;
00128 
00129   if ( !_selectedMimeTypes.isEmpty() )
00130     selMimeTypes = _selectedMimeTypes;
00131   else
00132     selMimeTypes = q->mimeTypes();
00133 
00134   mimeTypeTree->clear();
00135 
00136   QMap<QString, QTreeWidgetItem*> groupItems;
00137   const KMimeType::List mimetypes = KMimeType::allMimeTypes();
00138 
00139   bool agroupisopen = false;
00140   QTreeWidgetItem *idefault = 0; //open this, if all other fails
00141   QTreeWidgetItem *firstChecked = 0; // make this one visible after the loop
00142 
00143   foreach (const KMimeType::Ptr& mt, mimetypes)
00144   {
00145     const QString mimetype = mt->name();
00146     const int index = mimetype.indexOf('/');
00147     const QString maj = mimetype.left(index);
00148 
00149     if ( !groups.isEmpty() && !groups.contains( maj ) )
00150       continue;
00151 
00152     QTreeWidgetItem *groupItem;
00153     QMap<QString,QTreeWidgetItem*>::Iterator mit = groupItems.find( maj );
00154     if ( mit == groupItems.end() )
00155     {
00156         groupItem = new QTreeWidgetItem( mimeTypeTree, QStringList(maj) );
00157         groupItems.insert( maj, groupItem );
00158         if ( maj == defaultgroup )
00159             idefault = groupItem;
00160     }
00161     else
00162         groupItem = mit.value();
00163 
00164     const QString min = mimetype.mid(index+1);
00165     QTreeWidgetItem *item = new QTreeWidgetItem( groupItem, QStringList(min) );
00166     item->setIcon( 0, SmallIcon( mt->iconName() ) );
00167 
00168     int cl = 1;
00169 
00170     if ( visuals & KMimeTypeChooser::Comments )
00171     {
00172       item->setText( cl, mt->comment() );
00173       cl++;
00174     }
00175 
00176     if ( visuals & KMimeTypeChooser::Patterns )
00177       item->setText( cl, mt->patterns().join("; ") );
00178 
00179     if ( selMimeTypes.contains(mimetype) ) {
00180       item->setCheckState( 0, Qt::Checked );
00181       groupItem->setExpanded( true );
00182       agroupisopen = true;
00183       if ( !firstChecked )
00184         firstChecked = item;
00185     } else {
00186       item->setCheckState( 0, Qt::Unchecked );
00187     }
00188   }
00189 
00190   if ( firstChecked )
00191     mimeTypeTree->scrollToItem( firstChecked );
00192 
00193   if ( !agroupisopen && idefault )
00194   {
00195     idefault->setExpanded( true );
00196     mimeTypeTree->scrollToItem( idefault );
00197   }
00198 }
00199 
00200 void KMimeTypeChooserPrivate::_k_editMimeType()
00201 {
00202     QTreeWidgetItem* item = mimeTypeTree->currentItem();
00203     if ( !item || !item->parent() )
00204         return;
00205     QString mt = (item->parent())->text(0) + '/' + item->text(0);
00206     // thanks to libkonq/konq_operations.cc
00207     q->connect( KSycoca::self(), SIGNAL(databaseChanged()),
00208                 q, SLOT(_k_slotSycocaDatabaseChanged()) );
00209     QString keditfiletype = QString::fromLatin1("keditfiletype");
00210     KRun::runCommand( keditfiletype
00211 #ifndef Q_OS_WIN
00212                       + " --parent " + QString::number( (ulong)q->topLevelWidget()->winId())
00213 #endif
00214                       + ' ' + KShell::quoteArg(mt),
00215                       keditfiletype, keditfiletype /*unused*/, q->topLevelWidget());
00216 }
00217 
00218 void KMimeTypeChooserPrivate::_k_slotCurrentChanged(QTreeWidgetItem* item)
00219 {
00220   if ( btnEditMimeType )
00221     btnEditMimeType->setEnabled( item->parent() );
00222 }
00223 
00224 void KMimeTypeChooserPrivate::_k_slotSycocaDatabaseChanged()
00225 {
00226   if ( KSycoca::self()->isChanged("mime") )
00227     loadMimeTypes();
00228 }
00229 
00230 // recursive helper for mimeTypes()
00231 static void getCheckedItems(QList<QTreeWidgetItem *> &lst, QTreeWidgetItem* parent)
00232 {
00233     for (int i = 0; i < parent->childCount(); ++i ) {
00234         QTreeWidgetItem* item = parent->child(i);
00235         if (item->checkState(0) == Qt::Checked)
00236             lst.append(item);
00237         getCheckedItems(lst, item);
00238     }
00239 }
00240 
00241 static void getCheckedItems(QList<QTreeWidgetItem *>& lst, QTreeWidget* tree)
00242 {
00243     for (int i = 0; i < tree->topLevelItemCount(); ++i ) {
00244         QTreeWidgetItem* topItem = tree->topLevelItem(i);
00245         //if (topItem->checkState(0) == Qt::Checked)
00246         //    lst.append(topItem);
00247         getCheckedItems(lst, topItem);
00248     }
00249 }
00250 
00251 QStringList KMimeTypeChooser::mimeTypes() const
00252 {
00253     QStringList mimeList;
00254     QList<QTreeWidgetItem *> checkedItems;
00255     getCheckedItems(checkedItems, d->mimeTypeTree);
00256     foreach(QTreeWidgetItem* item, checkedItems) {
00257         mimeList.append( item->parent()->text(0) + '/' + item->text(0) );
00258     }
00259     return mimeList;
00260 }
00261 
00262 QStringList KMimeTypeChooser::patterns() const
00263 {
00264     QStringList patternList;
00265     QList<QTreeWidgetItem *> checkedItems;
00266     getCheckedItems(checkedItems, d->mimeTypeTree);
00267     foreach(QTreeWidgetItem* item, checkedItems) {
00268         KMimeType::Ptr p = KMimeType::mimeType( item->parent()->text(0) + '/' + item->text(0) );
00269         Q_ASSERT(p);
00270         patternList += p->patterns();
00271     }
00272     return patternList;
00273 }
00274 //END
00275 
00276 //BEGIN KMimeTypeChooserDialog::Private
00277 
00278 class KMimeTypeChooserDialog::Private
00279 {
00280     public:
00281         Private( KMimeTypeChooserDialog *parent )
00282             : q(parent)
00283         {
00284         }
00285 
00286         void init();
00287 
00288         KMimeTypeChooserDialog *q;
00289         KMimeTypeChooser *m_chooser;
00290 };
00291 
00292 //END
00293 
00294 //BEGIN KMimeTypeChooserDialog
00295 KMimeTypeChooserDialog::KMimeTypeChooserDialog(
00296                          const QString &caption,
00297                          const QString& text,
00298                          const QStringList &selMimeTypes,
00299                          const QString &defaultGroup,
00300                          const QStringList &groupsToShow,
00301                          int visuals,
00302                          QWidget *parent )
00303     : KDialog( parent ), d(new Private(this))
00304 {
00305   setCaption( caption );
00306   d->init();
00307 
00308   d->m_chooser = new KMimeTypeChooser( text, selMimeTypes,
00309                                        defaultGroup, groupsToShow, visuals,
00310                                        this );
00311   setMainWidget(d->m_chooser);
00312 }
00313 
00314 KMimeTypeChooserDialog::KMimeTypeChooserDialog(
00315                          const QString &caption,
00316                          const QString& text,
00317                          const QStringList &selMimeTypes,
00318                          const QString &defaultGroup,
00319                          QWidget *parent )
00320     : KDialog( parent ), d(new Private(this))
00321 {
00322   setCaption( caption );
00323   d->init();
00324 
00325   d->m_chooser = new KMimeTypeChooser( text, selMimeTypes,
00326                                        defaultGroup, QStringList(),
00327                                        KMimeTypeChooser::Comments|KMimeTypeChooser::Patterns|KMimeTypeChooser::EditButton,
00328                                        this );
00329   setMainWidget(d->m_chooser);
00330 }
00331 
00332 KMimeTypeChooser* KMimeTypeChooserDialog::chooser()
00333 {
00334     return d->m_chooser;
00335 }
00336 
00337 void KMimeTypeChooserDialog::Private::init()
00338 {
00339   q->setButtons( Cancel | Ok );
00340   q->setModal( true );
00341   q->setDefaultButton( Ok );
00342 
00343   KConfigGroup group( KGlobal::config(), "KMimeTypeChooserDialog");
00344   q->resize( group.readEntry("size", QSize(500,400)));
00345 }
00346 
00347 KMimeTypeChooserDialog::~KMimeTypeChooserDialog()
00348 {
00349   KConfigGroup group( KGlobal::config(), "KMimeTypeChooserDialog");
00350   group.writeEntry("size", size());
00351 
00352   delete d;
00353 }
00354 
00355 //END KMimeTypeChooserDialog
00356 
00357 // kate: space-indent on; indent-width 2; replace-tabs on;
00358 #include "kmimetypechooser.moc"

KIO

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

kdelibs

Skip menu "kdelibs"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • Kate
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • Kross
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver
Generated for kdelibs by doxygen 1.5.7
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal