kio Library API Documentation

kfilefiltercombo.cpp

00001 /* This file is part of the KDE libraries 00002 Copyright (C) Stephan Kulow <coolo@kde.org> 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 as published by the Free Software Foundation; either 00007 version 2 of the License, or (at your option) any later version. 00008 00009 This library is distributed in the hope that it will be useful, 00010 but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00012 Library General Public License for more details. 00013 00014 You should have received a copy of the GNU Library General Public License 00015 along with this library; see the file COPYING.LIB. If not, write to 00016 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 00017 Boston, MA 02111-1307, USA. 00018 */ 00019 00020 #include <klocale.h> 00021 #include <kdebug.h> 00022 #include <kstaticdeleter.h> 00023 #include <config-kfile.h> 00024 00025 #include "kfilefiltercombo.h" 00026 00027 class KFileFilterCombo::KFileFilterComboPrivate 00028 { 00029 public: 00030 KFileFilterComboPrivate() { 00031 hasAllSupportedFiles = false; 00032 defaultFilter = i18n("*|All Files"); 00033 isMimeFilter = false; 00034 } 00035 00036 // when we have more than 3 mimefilters and no default-filter, 00037 // we don't show the comments of all mimefilters in one line, 00038 // instead we show "All supported files". We have to translate 00039 // that back to the list of mimefilters in currentFilter() tho. 00040 bool hasAllSupportedFiles; 00041 // true when setMimeFilter was called 00042 bool isMimeFilter; 00043 QString lastFilter; 00044 QString defaultFilter; 00045 }; 00046 00047 KFileFilterCombo::KFileFilterCombo( QWidget *parent, const char *name) 00048 : KComboBox(true, parent, name), d( new KFileFilterComboPrivate ) 00049 { 00050 setTrapReturnKey( true ); 00051 setInsertionPolicy(NoInsertion); 00052 connect( this, SIGNAL( activated( int )), this, SIGNAL( filterChanged() )); 00053 connect( this, SIGNAL( returnPressed() ), this, SIGNAL( filterChanged() )); 00054 connect( this, SIGNAL( filterChanged() ), SLOT( slotFilterChanged() )); 00055 m_allTypes = false; 00056 } 00057 00058 KFileFilterCombo::~KFileFilterCombo() 00059 { 00060 delete d; 00061 } 00062 00063 void KFileFilterCombo::setFilter(const QString& filter) 00064 { 00065 clear(); 00066 filters.clear(); 00067 d->hasAllSupportedFiles = false; 00068 00069 if (!filter.isEmpty()) { 00070 QString tmp = filter; 00071 int index = tmp.find('\n'); 00072 while (index > 0) { 00073 filters.append(tmp.left(index)); 00074 tmp = tmp.mid(index + 1); 00075 index = tmp.find('\n'); 00076 } 00077 filters.append(tmp); 00078 } 00079 else 00080 filters.append( d->defaultFilter ); 00081 00082 QStringList::ConstIterator it; 00083 for (it = filters.begin(); it != filters.end(); it++) { 00084 int tab = (*it).find('|'); 00085 insertItem((tab < 0) ? *it : 00086 (*it).mid(tab + 1)); 00087 } 00088 00089 d->lastFilter = currentText(); 00090 d->isMimeFilter = false; 00091 } 00092 00093 QString KFileFilterCombo::currentFilter() const 00094 { 00095 QString f = currentText(); 00096 if (f == text(currentItem())) { // user didn't edit the text 00097 f = *filters.at(currentItem()); 00098 if ( d->isMimeFilter || (currentItem() == 0 && d->hasAllSupportedFiles) ) { 00099 return f; // we have a mimetype as filter 00100 } 00101 } 00102 00103 int tab = f.find('|'); 00104 if (tab < 0) 00105 return f; 00106 else 00107 return f.left(tab); 00108 } 00109 00110 void KFileFilterCombo::setMimeFilter( const QStringList& types, 00111 const QString& defaultType ) 00112 { 00113 clear(); 00114 filters.clear(); 00115 QString delim = QString::fromLatin1(", "); 00116 d->hasAllSupportedFiles = false; 00117 00118 m_allTypes = defaultType.isEmpty() && (types.count() > 1); 00119 00120 QString allComments, allTypes; 00121 int i = 0; 00122 for(QStringList::ConstIterator it = types.begin(); it != types.end(); ++it, ++i) 00123 { 00124 if ( m_allTypes && it != types.begin() ) { 00125 allComments += delim; 00126 allTypes += ' '; 00127 } 00128 00129 kdDebug(kfile_area) << *it << endl; 00130 KMimeType::Ptr type = KMimeType::mimeType( *it ); 00131 filters.append( type->name() ); 00132 if ( m_allTypes ) 00133 { 00134 allTypes += type->name(); 00135 allComments += type->comment(); 00136 } 00137 insertItem( type->comment() ); 00138 if ( type->name() == defaultType ) 00139 setCurrentItem( i ); 00140 } 00141 00142 if ( m_allTypes ) 00143 { 00144 if ( i < 3 ) // show the mime-comments of at max 3 types 00145 insertItem( allComments, 0 ); 00146 else { 00147 insertItem( i18n("All Supported Files"), 0 ); 00148 d->hasAllSupportedFiles = true; 00149 } 00150 00151 filters.prepend( allTypes ); 00152 } 00153 00154 d->lastFilter = currentText(); 00155 d->isMimeFilter = true; 00156 } 00157 00158 void KFileFilterCombo::slotFilterChanged() 00159 { 00160 d->lastFilter = currentText(); 00161 } 00162 00163 bool KFileFilterCombo::eventFilter( QObject *o, QEvent *e ) 00164 { 00165 if ( o == lineEdit() && e->type() == QEvent::FocusOut ) { 00166 if ( currentText() != d->lastFilter ) 00167 emit filterChanged(); 00168 } 00169 00170 return KComboBox::eventFilter( o, e ); 00171 } 00172 00173 void KFileFilterCombo::setDefaultFilter( const QString& filter ) 00174 { 00175 d->defaultFilter = filter; 00176 } 00177 00178 QString KFileFilterCombo::defaultFilter() const 00179 { 00180 return d->defaultFilter; 00181 } 00182 00183 void KFileFilterCombo::virtual_hook( int id, void* data ) 00184 { KComboBox::virtual_hook( id, data ); } 00185 00186 #include "kfilefiltercombo.moc"
KDE Logo
This file is part of the documentation for kio Library Version 3.2.3.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Sun Oct 10 18:55:26 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003