00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
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
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
00061
00062
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
00087
00088 if ( visuals & Comments ) {
00089 headerLabels.append( i18n("Comment") );
00090
00091 }
00092 if ( visuals & Patterns ) {
00093 headerLabels.append( i18n("Patterns") );
00094 }
00095
00096
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;
00141 QTreeWidgetItem *firstChecked = 0;
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
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 , 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
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
00246
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
00275
00276
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
00293
00294
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
00356
00357
00358 #include "kmimetypechooser.moc"