kmimetypechooser.cpp
/* This file is part of the KDE libraries
Copyright (C) 2001 - 2004 Anders Lund <anders@alweb.dk>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License version 2 as published by the Free Software Foundation.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#include "kmimetypechooser.h"
#include <kconfig.h>
#include <kiconloader.h>
#include <klistview.h>
#include <klocale.h>
#include <kmimetype.h>
#include <kprocess.h>
#include <krun.h>
#include <ksycoca.h>
#include <qlabel.h>
#include <qlayout.h>
#include <qlineedit.h>
#include <qpushbutton.h>
#include <qwhatsthis.h>
//BEGIN KMimeTypeChooserPrivate
class KMimeTypeChooserPrivate
{
public:
KListView *lvMimeTypes;
QPushButton *btnEditMimeType;
QString defaultgroup;
QStringList groups;
int visuals;
};
//END
//BEGIN KMimeTypeChooser
KMimeTypeChooser::KMimeTypeChooser( const QString &text,
const QStringList &selMimeTypes,
const QString &defaultGroup,
const QStringList &groupsToShow,
int visuals,
QWidget *parent,
const char *name )
: QVBox( parent, name )
{
d = new KMimeTypeChooserPrivate();
d->lvMimeTypes = 0;
d->btnEditMimeType = 0;
d->defaultgroup = defaultGroup;
d->groups = groupsToShow;
d->visuals = visuals;
setSpacing( KDialogBase::spacingHint() );
if ( !text.isEmpty() )
{
new QLabel( text, this );
}
d->lvMimeTypes = new KListView( this );
d->lvMimeTypes->addColumn( i18n("Mime Type") );
// d->lvMimeTypes->setColumnWidthMode( 0, QListView::Manual );
if ( visuals & Comments )
{
d->lvMimeTypes->addColumn( i18n("Comment") );
d->lvMimeTypes->setColumnWidthMode( 1, QListView::Manual );
}
if ( visuals & Patterns )
d->lvMimeTypes->addColumn( i18n("Patterns") );
d->lvMimeTypes->setRootIsDecorated( true );
loadMimeTypes( selMimeTypes );
if (visuals & KMimeTypeChooser::EditButton)
{
QHBox *btns = new QHBox( this );
((QBoxLayout*)btns->layout())->addStretch(1);
d->btnEditMimeType = new QPushButton( i18n("&Edit..."), btns );
connect( d->btnEditMimeType, SIGNAL(clicked()), this, SLOT(editMimeType()) );
d->btnEditMimeType->setEnabled( false );
connect( d->lvMimeTypes, SIGNAL( doubleClicked ( QListViewItem * )),
this, SLOT( editMimeType()));
connect( d->lvMimeTypes, SIGNAL(currentChanged(QListViewItem*)),
this, SLOT(slotCurrentChanged(QListViewItem*)) );
QWhatsThis::add( d->btnEditMimeType, i18n(
"Click this button to display the familiar KDE mime type editor.") );
}
}
KMimeTypeChooser::~KMimeTypeChooser()
{
delete d;
}
void KMimeTypeChooser::loadMimeTypes( const QStringList &_selectedMimeTypes )
{
QStringList selMimeTypes;
if ( !_selectedMimeTypes.isEmpty() )
selMimeTypes = _selectedMimeTypes;
else
selMimeTypes = mimeTypes();
d->lvMimeTypes->clear();
QMap<QString,QListViewItem*> groups;
// thanks to kdebase/kcontrol/filetypes/filetypesview
KMimeType::List mimetypes = KMimeType::allMimeTypes();
QValueListIterator<KMimeType::Ptr> it(mimetypes.begin());
QListViewItem *groupItem;
bool agroupisopen = false;
QListViewItem *idefault = 0; //open this, if all other fails
QListViewItem *firstChecked = 0; // make this one visible after the loop
for (; it != mimetypes.end(); ++it)
{
QString mimetype = (*it)->name();
int index = mimetype.find("/");
QString maj = mimetype.left(index);
if ( d->groups.count() && !d->groups.contains( maj ) )
continue;
QString min = mimetype.right(mimetype.length() - (index+1));
QMapIterator<QString,QListViewItem*> mit = groups.find( maj );
if ( mit == groups.end() )
{
groupItem = new QListViewItem( d->lvMimeTypes, maj );
groups.insert( maj, groupItem );
if ( maj == d->defaultgroup )
idefault = groupItem;
}
else
groupItem = mit.data();
QCheckListItem *item = new QCheckListItem( groupItem, min, QCheckListItem::CheckBox );
item->setPixmap( 0, SmallIcon( (*it)->icon(QString::null,false) ) );
int cl = 1;
if ( d->visuals & Comments )
{
item->setText( cl, (*it)->comment(QString::null, false) );
cl++;
}
if ( d->visuals & Patterns )
item->setText( cl, (*it)->patterns().join("; ") );
if ( selMimeTypes.contains(mimetype) )
{
item->setOn( true );
groupItem->setOpen( true );
agroupisopen = true;
if ( !firstChecked )
firstChecked = item;
}
}
if ( firstChecked )
d->lvMimeTypes->ensureItemVisible( firstChecked );
if ( !agroupisopen && idefault )
{
idefault->setOpen( true );
d->lvMimeTypes->ensureItemVisible( idefault );
}
}
void KMimeTypeChooser::editMimeType()
{
if ( !(d->lvMimeTypes->currentItem() && (d->lvMimeTypes->currentItem())->parent()) )
return;
QString mt = (d->lvMimeTypes->currentItem()->parent())->text( 0 ) + "/" + (d->lvMimeTypes->currentItem())->text( 0 );
// thanks to libkonq/konq_operations.cc
connect( KSycoca::self(), SIGNAL(databaseChanged()),
this, SLOT(slotSycocaDatabaseChanged()) );
QString keditfiletype = QString::fromLatin1("keditfiletype");
KRun::runCommand( keditfiletype
+ " --parent " + QString::number( (ulong)topLevelWidget()->winId())
+ " " + KProcess::quote(mt),
keditfiletype, keditfiletype /*unused*/);
}
void KMimeTypeChooser::slotCurrentChanged(QListViewItem* i)
{
if ( d->btnEditMimeType )
d->btnEditMimeType->setEnabled( i->parent() );
}
void KMimeTypeChooser::slotSycocaDatabaseChanged()
{
if ( KSycoca::self()->isChanged("mime") )
loadMimeTypes();
}
QStringList KMimeTypeChooser::mimeTypes() const
{
QStringList l;
QListViewItemIterator it( d->lvMimeTypes );
for (; it.current(); ++it)
{
if ( it.current()->parent() && ((QCheckListItem*)it.current())->isOn() )
l << it.current()->parent()->text(0) + "/" + it.current()->text(0); // FIXME uncecked, should be Ok unless someone changes mimetypes during this!
}
return l;
}
QStringList KMimeTypeChooser::patterns() const
{
QStringList l;
KMimeType::Ptr p;
QString defMT = KMimeType::defaultMimeType();
QListViewItemIterator it( d->lvMimeTypes );
for (; it.current(); ++it)
{
if ( it.current()->parent() && ((QCheckListItem*)it.current())->isOn() )
{
p = KMimeType::mimeType( it.current()->parent()->text(0) + "/" + it.current()->text(0) );
if ( p->name() != defMT )
l += p->patterns();
}
}
return l;
}
//END
//BEGIN KMimeTypeChooserDialog
KMimeTypeChooserDialog::KMimeTypeChooserDialog(
const QString &caption,
const QString& text,
const QStringList &selMimeTypes,
const QString &defaultGroup,
const QStringList &groupsToShow,
int visuals,
QWidget *parent, const char *name )
: KDialogBase(parent, name, true, caption, Cancel|Ok, Ok)
{
m_chooser = new KMimeTypeChooser( text, selMimeTypes,
defaultGroup, groupsToShow, visuals,
this, "chooser" );
setMainWidget(m_chooser);
KConfigGroup group( KGlobal::config(), "KMimeTypeChooserDialog");
QSize defaultSize( 400, 300 );
resize( group.readSizeEntry("size", &defaultSize) );
}
KMimeTypeChooserDialog::KMimeTypeChooserDialog(
const QString &caption,
const QString& text,
const QStringList &selMimeTypes,
const QString &defaultGroup,
QWidget *parent, const char *name )
: KDialogBase(parent, name, true, caption, Cancel|Ok, Ok)
{
m_chooser = new KMimeTypeChooser( text, selMimeTypes,
defaultGroup, QStringList(),
KMimeTypeChooser::Comments|KMimeTypeChooser::Patterns|KMimeTypeChooser::EditButton,
this, "chooser" );
setMainWidget(m_chooser);
KConfigGroup group( KGlobal::config(), "KMimeTypeChooserDialog");
QSize defaultSize( 400, 300 );
resize( group.readSizeEntry("size", &defaultSize) );
}
KMimeTypeChooserDialog::~KMimeTypeChooserDialog()
{
KConfigGroup group( KGlobal::config(), "KMimeTypeChooserDialog");
group.writeEntry("size", size());
}
//END KMimeTypeChooserDialog
// kate: space-indent on; indent-width 2; replace-tabs on;
#include "kmimetypechooser.moc"
KMimeTypeChooser::KMimeTypeChooser
KMimeTypeChooser(const QString &text=QString::null, const QStringList &selectedMimeTypes=0, const QString &defaultGroup=QString::null, const QStringList &groupsToShow=QStringList(), int visuals=Comments|Patterns|EditButton, QWidget *parent=0, const char *name=0)
Create a new KMimeTypeChooser.
Definition: kmimetypechooser.cpp:50
KMimeTypeChooser::Comments
Show the Mimetypes Comment field in a column ("HTML Document").
Definition: kmimetypechooser.h:43
KMimeTypeChooser::Patterns
Show the Mimetypes Patterns field in a column ("*.html;*.htm").
Definition: kmimetypechooser.h:44
KIO::mimetype
KIO_EXPORT MimetypeJob * mimetype(const KURL &url, bool showProgressInfo=true)
Find mimetype for one file or directory.
Definition: job.cpp:1509
KMimeTypeChooser::editMimeType
void editMimeType()
edit the current mimetype Uses KRun to start the KDE mimetype editor for editing the currently select...
Definition: kmimetypechooser.cpp:190
KRun::runCommand
static pid_t runCommand(QString cmd)
Run the given shell command and notifies kicker of the starting of the application.
Definition: krun.cpp:801
KMimeTypeChooser::mimeTypes
QStringList mimeTypes() const
Definition: kmimetypechooser.cpp:217
KMimeTypeChooser::EditButton
Show the "Edit" button, allowing to edit the selected type.
Definition: kmimetypechooser.h:45
KMimeType::allMimeTypes
static List allMimeTypes()
Get all the mimetypes.
Definition: kmimetype.cpp:160
KMimeType::mimeType
static Ptr mimeType(const QString &_name)
Retrieve a pointer to the mime type _name or a pointer to the default mime type "application/octet-st...
Definition: kmimetype.cpp:141
KMimeTypeChooserDialog::KMimeTypeChooserDialog
KMimeTypeChooserDialog(const QString &caption=QString::null, const QString &text=QString::null, const QStringList &selectedMimeTypes=QStringList(), const QString &defaultGroup=QString::null, const QStringList &groupsToShow=QStringList(), int visuals=KMimeTypeChooser::Comments|KMimeTypeChooser::Patterns|KMimeTypeChooser::EditButton, QWidget *parent=0, const char *name=0)
Create a KMimeTypeChooser dialog.
Definition: kmimetypechooser.cpp:249
KMimeTypeChooser::patterns
QStringList patterns() const
Definition: kmimetypechooser.cpp:229
KMimeTypeChooser
This widget provides a checkable list of all available mimetypes, and a list of selected ones...
Definition: kmimetypechooser.h:34
KMimeType::defaultMimeType
static const QString & defaultMimeType()
Returns the name of the default mimetype.
Definition: kmimetype.cpp:1154

KDE Home | KDE Accessibility Home | Description of Access Keys