You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdebase/konqueror/listview/konq_infolistviewwidget.cc

384 lines
12 KiB

/* This file is part of the KDE project
Copyright (C) 2002 Rolf Magnus <ramagnus@kde.org>
Copyright (C) 2003 Waldo Bastian <bastian@kde.org>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation version 2.0
This program 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#include "konq_infolistviewwidget.h"
#include "konq_infolistviewwidget.moc"
#include "konq_infolistviewitem.h"
#include "konq_listview.h"
#include <klocale.h>
#include <kfilemetainfo.h>
#include <kdebug.h>
#include <kaction.h>
#include <kservicetype.h>
#include <kuserprofile.h>
#include <kio/metainfojob.h>
#include <tqstringlist.h>
KonqInfoListViewWidget::KonqInfoListViewWidget( KonqListView* parent,
TQWidget* parentWidget)
: KonqBaseListViewWidget(parent, parentWidget)
{
m_metaInfoJob = 0;
m_mtSelector = new KSelectAction(i18n("View &As"), 0, TQT_TQOBJECT(this),
TQT_SLOT(slotSelectMimeType()),
parent->actionCollection(), "view_as" );
kdDebug(1203) << "created info list view\n";
}
KonqInfoListViewWidget::~KonqInfoListViewWidget()
{
delete m_mtSelector;
delete m_metaInfoJob;
}
void KonqInfoListViewWidget::slotSelectMimeType()
{
TQString comment = m_mtSelector->currentText();
// find the mime type by comment
TQMapIterator<TQString, KonqILVMimeType> it;
for (it = m_counts.begin(); it!=m_counts.end(); ++it)
{
if ((*it).mimetype->comment() == comment)
{
m_favorite = *it;
createFavoriteColumns();
rebuildView();
break;
}
}
}
void KonqInfoListViewWidget::createColumns()
{
if (columns()<1)
{
// we can only create the minimum columns here, because we don't get the
// items, from which we determine the columns yet.
addColumn(i18n("Filename"), m_filenameColumnWidth);
}
}
void KonqInfoListViewWidget::createFavoriteColumns()
{
while (columns()>1)
{
kdDebug(1203) << "removing column " << columnText(columns()-1) << endl;
removeColumn(columns()-1);
}
// we need to get the preferred keys of the favorite
const KFileMimeTypeInfo* mimeTypeInfo;
if (m_favorite.mimetype &&
(mimeTypeInfo = KFileMetaInfoProvider::self()
->mimeTypeInfo(m_favorite.mimetype->name())))
{
TQStringList preferredCols = mimeTypeInfo->preferredKeys();
m_columnKeys.clear(); //We create the columnKeys as we're creating
//the actual columns, to make sure they're synced
// get the translations
TQStringList groups = mimeTypeInfo->preferredGroups();
if (groups.isEmpty()) groups = mimeTypeInfo->supportedGroups();
TQStringList::Iterator prefKey = preferredCols.begin();
for (; prefKey != preferredCols.end(); ++prefKey)
{
TQStringList::Iterator group = groups.begin();
for (; group != groups.end(); ++group)
{
const KFileMimeTypeInfo::GroupInfo* groupInfo =
mimeTypeInfo->groupInfo(*group);
if(groupInfo)
{
TQStringList keys = groupInfo->supportedKeys();
TQStringList::Iterator key = keys.begin();
for (; key != keys.end(); ++key)
{
if ( *key == *prefKey )
{
const KFileMimeTypeInfo::ItemInfo* itemInfo =
groupInfo->itemInfo(*key);
addColumn(itemInfo->translatedKey());
m_columnKeys.append(*key);
}
}
}
}
}
}
else
{
KonqBaseListViewWidget::createColumns();
}
}
bool KonqInfoListViewWidget::openURL( const KURL &url )
{
bool ret = KonqBaseListViewWidget::openURL(url);
m_bTopLevelComplete = true;
return ret;
}
void KonqInfoListViewWidget::rebuildView()
{
// make a KFileItemList from all our Items
KFileItemList list;
TQListViewItemIterator it(this);
for (; it.current(); ++it)
{
list.append(static_cast<KonqInfoListViewItem*>(it.current())->item());
}
// now we can remove all the listview items
clear();
// and rebuild them
for (TQPtrListIterator<KFileItem> kit(list); kit.current(); ++kit)
{
KonqInfoListViewItem* tmp = new KonqInfoListViewItem( this, *kit );
// if (m_goToFirstItem==false)
// if (m_itemFound==false)
// if (tmp->text(0)==m_itemToGoTo)
// {
//kdDebug() << "Line " << __LINE__ << endl;
// setCurrentItem(tmp);
//kdDebug() << "Line " << __LINE__ << endl;
// ensureItemVisible(tmp);
//kdDebug() << "Line " << __LINE__ << endl;
// emit selectionChanged();
//selectCurrentItemAndEnableSelectedBySimpleMoveMode();
// m_itemFound=true;
//kdDebug() << "Line " << __LINE__ << endl;
// };
tmp->gotMetaInfo();
}
if ( !viewport()->isUpdatesEnabled() )
{
viewport()->setUpdatesEnabled( true );
setUpdatesEnabled( true );
triggerUpdate();
}
}
void KonqInfoListViewWidget::slotNewItems( const KFileItemList& list)
{
slotStarted(); // ############# WHY?
for (TQPtrListIterator<KFileItem> kit ( list ); kit.current(); ++kit )
{
KonqInfoListViewItem * tmp = new KonqInfoListViewItem( this, *kit );
if (!m_itemFound && tmp->text(0)==m_itemToGoTo)
{
setCurrentItem(tmp);
m_itemFound=true;
}
if ( !m_itemsToSelect.isEmpty() ) {
TQStringList::Iterator tsit = m_itemsToSelect.find( (*kit)->name() );
if ( tsit != m_itemsToSelect.end() ) {
m_itemsToSelect.remove( tsit );
setSelected( tmp, true );
}
}
if ( !(*kit)->isMimeTypeKnown() )
m_pBrowserView->lstPendingMimeIconItems().append( tmp );
}
m_pBrowserView->newItems( list );
if ( !viewport()->isUpdatesEnabled() )
{
viewport()->setUpdatesEnabled( true );
setUpdatesEnabled( true );
triggerUpdate();
}
slotUpdateBackground();
if ( !m_favorite.mimetype )
determineCounts(list);
kdDebug(1203) << " ------------------------ startin metainfo job ------\n";
// start getting metainfo from the files
if (m_metaInfoJob)
{
for (TQPtrListIterator<KFileItem> kit ( list ); kit.current(); ++kit )
m_metaInfoTodo.append(kit.current());
}
else
{
m_metaInfoJob = KIO::fileMetaInfo(list);
connect( m_metaInfoJob, TQT_SIGNAL( gotMetaInfo( const KFileItem*)),
this, TQT_SLOT( slotMetaInfo( const KFileItem*)));
connect( m_metaInfoJob, TQT_SIGNAL( result( KIO::Job*)),
this, TQT_SLOT( slotMetaInfoResult()));
}
}
void KonqInfoListViewWidget::slotRefreshItems( const KFileItemList& list)
{
kdDebug(1203) << " ------------------------ startin metainfo job ------\n";
// start getting metainfo from the files
if (m_metaInfoJob)
{
for (TQPtrListIterator<KFileItem> kit ( list ); kit.current(); ++kit )
m_metaInfoTodo.append(kit.current());
}
else
{
m_metaInfoJob = KIO::fileMetaInfo(list);
connect( m_metaInfoJob, TQT_SIGNAL( gotMetaInfo( const KFileItem*)),
this, TQT_SLOT( slotMetaInfo( const KFileItem*)));
connect( m_metaInfoJob, TQT_SIGNAL( result( KIO::Job*)),
this, TQT_SLOT( slotMetaInfoResult()));
}
KonqBaseListViewWidget::slotRefreshItems(list);
}
void KonqInfoListViewWidget::slotDeleteItem( KFileItem * item )
{
m_metaInfoTodo.removeRef(item);
if (m_metaInfoJob)
m_metaInfoJob->removeItem(item);
KonqBaseListViewWidget::slotDeleteItem(item);
}
void KonqInfoListViewWidget::slotClear()
{
m_metaInfoTodo.clear();
delete m_metaInfoJob;
m_metaInfoJob = 0;
m_favorite = KonqILVMimeType();
KonqBaseListViewWidget::slotClear();
}
void KonqInfoListViewWidget::slotMetaInfo(const KFileItem* item)
{
// need to search for the item (any better way?)
TQListViewItemIterator it(this);
for (; it.current(); ++it)
{
if (static_cast<KonqInfoListViewItem*>(it.current())->item()==item)
{
static_cast<KonqInfoListViewItem*>(it.current())->gotMetaInfo();
return;
}
}
// we should never reach this place
Q_ASSERT(false);
}
void KonqInfoListViewWidget::slotMetaInfoResult()
{
m_metaInfoJob = 0;
if (m_metaInfoTodo.isEmpty())
{
m_bTopLevelComplete = false;
kdDebug(1203) << "emitting completed!!!!!!!!!!!!!!!!\n";
slotCompleted();
}
else
{
m_metaInfoJob = KIO::fileMetaInfo(m_metaInfoTodo);
connect( m_metaInfoJob, TQT_SIGNAL( gotMetaInfo( const KFileItem*)),
this, TQT_SLOT( slotMetaInfo( const KFileItem*)));
connect( m_metaInfoJob, TQT_SIGNAL( result( KIO::Job*)),
this, TQT_SLOT( slotMetaInfoResult()));
m_metaInfoTodo.clear();
}
}
void KonqInfoListViewWidget::determineCounts(const KFileItemList& list)
{
m_counts.clear();
m_favorite = KonqILVMimeType();
// get the counts
for (KFileItemListIterator it(list); it.current(); ++it)
{
TQString mt = it.current()->mimetype();
m_counts[mt].count++;
if (!m_counts[mt].mimetype)
m_counts[mt].mimetype = it.current()->determineMimeType();
}
// and look for the plugins
kdDebug(1203) << "counts are:\n";
KFileMetaInfoProvider* prov = KFileMetaInfoProvider::self();
TQStringList mtlist;
TQMapIterator<TQString, KonqILVMimeType> it;
for (it = m_counts.begin(); it!=m_counts.end(); ++it)
{
// look if there is a plugin for this mimetype
// and look for the "favorite" mimetype
#ifdef _GNUC
#warning ### change this
#endif
// this will load the plugin which we don't need because we delegate
// the job to the kioslave
(*it).hasPlugin = prov->plugin(it.key());
if ( (*it).hasPlugin)
{
mtlist << (*it).mimetype->comment();
if (m_favorite.count <= (*it).count)
m_favorite = *it;
}
kdDebug(1203) << it.key() << " -> " << (*it).count
<< " item(s) / plugin: "
<< ((*it).hasPlugin ? "yes" : "no ") << endl;
}
m_mtSelector->setItems(mtlist);
// TQPopupMenu* menu = m_mtSelector->popupMenu();
// insert the icons
// for (int i=0; i<menu->count(); ++i)
// {
// menu->changeItem(i, TQIconSet(blah));
// }
if (m_favorite.mimetype)
{
m_mtSelector->setCurrentItem(mtlist.findIndex(m_favorite.mimetype->comment()));
kdDebug(1203) << "favorite mimetype is " << m_favorite.mimetype->name() << endl;
}
createFavoriteColumns();
}