@ -199,11 +199,18 @@ DirFilterPlugin::DirFilterPlugin (QObject* parent, const char* name,
KWidgetAction * filterAction = new KWidgetAction ( hbox , i18n ( " Filter Field " ) ,
0 , 0 , 0 , actionCollection ( ) , " toolbar_filter_field " ) ;
filterAction - > setShortcutConfigurable ( false ) ;
m_refreshTimer = new QTimer ( this ) ;
connect ( m_refreshTimer , SIGNAL ( timeout ( ) ) , this , SLOT ( activateSearch ( ) ) ) ;
m_refreshTimer - > start ( 200 , FALSE ) ; // 200 millisecond continuous timer
}
DirFilterPlugin : : ~ DirFilterPlugin ( )
{
m_refreshTimer - > stop ( ) ;
delete m_pFilterMenu ;
delete m_refreshTimer ;
}
void DirFilterPlugin : : slotOpenURL ( )
@ -396,7 +403,6 @@ void DirFilterPlugin::slotItemsAdded (const KFileItemList& list)
{
static_cast < KIconViewSearchLine * > ( m_searchWidget ) - > updateSearch ( ) ;
}
//m_searchWidget->updateSearch();
// Make sure the filter menu is enabled once a named
// filter is removed.
@ -415,8 +421,7 @@ void DirFilterPlugin::slotItemsAdded (const KFileItemList& list)
{
MimeInfo & mimeInfo = m_pMimeInfo [ mimeType ] ;
QStringList filters = m_part - > mimeFilter ( ) ;
mimeInfo . useAsFilter = ( ! filters . isEmpty ( ) & &
filters . contains ( mimeType ) ) ;
mimeInfo . useAsFilter = ( ! filters . isEmpty ( ) & & filters . contains ( mimeType ) ) ;
mimeInfo . mimeComment = mime - > comment ( ) ;
mimeInfo . iconName = mime - > icon ( KURL ( ) , false ) ;
mimeInfo . filenames . insert ( name , false ) ;
@ -430,30 +435,50 @@ void DirFilterPlugin::slotItemsAdded (const KFileItemList& list)
void DirFilterPlugin : : slotItemRemoved ( const KFileItem * item )
{
if ( ! item | | ! m_part )
return ;
QString mimeType = item - > mimetype ( ) . stripWhiteSpace ( ) ;
if ( m_pMimeInfo . contains ( mimeType ) )
{
MimeInfo info = m_pMimeInfo [ mimeType ] ;
if ( ! item | | ! m_part )
return ;
// Due to the poor implementation of qiconviewitem, there is no way for it to know if an item on the hidden list was deleted
// This *will* eventually cause the kiconviewsearchline to attempt to reference a deleted object, resulting in a crash
// This is illustrated well with two Konqueror windows. Open one, set the filter bar to filter out a file, then delete the filtered file from another window.
// Now clear the search bar (forcing injection of the deleted iconview object pointer from the hidden list). Konqueror will crash!
// If iconDeleted is called, it allows kiconviewsearchline to temporarily add the affected qiconviewitem(s) (by filename) to the iconview so that as far as
// qiconview is concerned the qiconviewitem objects never left.
// NOTE: This bug is NOT present in qlistviewitem
// HACK around it here...
if ( : : qt_cast < QIconView * > ( m_part - > scrollWidget ( ) ) ) {
static_cast < KIconViewSearchLine * > ( m_searchWidget ) - > iconDeleted ( item - > name ( ) ) ;
}
QString mimeType = item - > mimetype ( ) . stripWhiteSpace ( ) ;
if ( m_pMimeInfo . contains ( mimeType ) ) {
MimeInfo info = m_pMimeInfo [ mimeType ] ;
if ( info . filenames . size ( ) > 1 )
m_pMimeInfo [ mimeType ] . filenames . remove ( item - > name ( ) ) ;
else {
if ( info . useAsFilter ) {
QStringList filters = m_part - > mimeFilter ( ) ;
filters . remove ( mimeType ) ;
m_part - > setMimeFilter ( filters ) ;
SessionManager : : self ( ) - > save ( m_part - > url ( ) , filters ) ;
QTimer : : singleShot ( 0 , this , SLOT ( slotTimeout ( ) ) ) ;
}
m_pMimeInfo . remove ( mimeType ) ;
}
}
}
if ( info . filenames . size ( ) > 1 )
m_pMimeInfo [ mimeType ] . filenames . remove ( item - > name ( ) ) ;
else
{
if ( info . useAsFilter )
{
QStringList filters = m_part - > mimeFilter ( ) ;
filters . remove ( mimeType ) ;
m_part - > setMimeFilter ( filters ) ;
SessionManager : : self ( ) - > save ( m_part - > url ( ) , filters ) ;
QTimer : : singleShot ( 0 , this , SLOT ( slotTimeout ( ) ) ) ;
}
m_pMimeInfo . remove ( mimeType ) ;
}
}
void DirFilterPlugin : : activateSearch ( )
{
if ( : : qt_cast < KListView * > ( m_part - > scrollWidget ( ) ) ) {
static_cast < KListViewSearchLine * > ( m_searchWidget ) - > updateSearch ( ) ;
}
else if ( : : qt_cast < QIconView * > ( m_part - > scrollWidget ( ) ) ) {
static_cast < KIconViewSearchLine * > ( m_searchWidget ) - > updateSearch ( ) ;
}
}
void DirFilterPlugin : : slotReset ( )