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.
tdevelop/buildtools/autotools/kfilednddetailview.cpp

213 lines
6.7 KiB

/***************************************************************************
* kfilednddetailview.cpp - description
* -------------------
* begin : Wed Nov 1 2000
* copyright : (C) 2000 by Bj<42>n Sahlstr<74>
* email : kbjorn@users.sourceforge.net
***************************************************************************/
/***************************************************************************
* *
* 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; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
//////////////////////////////////////////////////////
// Qt specific includes
#include <tqptrlist.h>
#include <tqapplication.h>
//////////////////////////////////////////////////////
// KDE specific includes
#include <kfileitem.h>
#include <kiconloader.h>
#include <kdebug.h>
//////////////////////////////////////////////////////
// Application specific includes
#include "kfilednddetailview.h"
#ifndef AUTO_OPEN_TIME
#define AUTO_OPEN_TIME
static int autoOpenTime = 750;
#endif
//-----------------------------------------------
KFileDnDDetailView::KFileDnDDetailView(TQWidget *parent, const char *name )
: KFileDetailView(parent,name), m_autoOpenTimer( this ),
m_autoOpenTime( autoOpenTime ), m_useAutoOpenTimer( true ),
m_dropItem(0), m_dndEnabled( true )
{
setAutoUpdate( true );
setDnDEnabled( true );
useAutoOpenTimer( true );
}
//-----------------------------------------------
KFileDnDDetailView::~KFileDnDDetailView(){
}
//-----------------------------------------------
void KFileDnDDetailView::readConfig( KConfig* config, const TQString& group ) {
KConfigGroupSaver cs( config, group );
bool dnd = config->readBoolEntry("DragAndDrop", true );
setDnDEnabled( dnd );
KFileDetailView::readConfig( config, group );
}
//-----------------------------------------------
void KFileDnDDetailView::writeConfig( KConfig* config, const TQString& group ) {
KConfigGroupSaver cs( config, group );
config->writeEntry("DragAndDrop", m_dndEnabled );
KFileDetailView::writeConfig( config, group );
}
//-----------------------------------------------
void KFileDnDDetailView::slotOpenFolder(){
if( m_useAutoOpenTimer ) {
m_autoOpenTimer.stop();
if( !m_dropItem )
return;
}
KFileItemListIterator it( * KFileView::items() );
for( ; it.current() ;++it ){
if( (*it)->name() == m_dropItem->text(0) ) {
if( (*it)->isFile() )
return;
else if( (*it)->isDir() || (*it)->isLink()) {
sig->activate( (*it) );
return;
}
}
}
}
//-----------------------------------------------
void KFileDnDDetailView::contentsDragEnterEvent( TQDragEnterEvent *e ) {
kdDebug (9020) << "KFileDnDDetailView::contentsDragEnterEvent" << endl;
if ( ! acceptDrag( e ) ) {
e->accept( false );
return;
}
e->acceptAction();
TQListViewItem *i = itemAt( contentsToViewport( e->pos() ) );
if ( i && m_useAutoOpenTimer ) {
m_dropItem = i;
m_autoOpenTimer.start( m_autoOpenTime );
}
}
//-----------------------------------------------
void KFileDnDDetailView::contentsDragMoveEvent( TQDragMoveEvent *e ) {
kdDebug (9020) << "KFileDnDDetailView::contentsDragMoveEvent" << endl;
if ( ! acceptDrag( e ) ) {
e->accept( false );
return;
}
e->acceptAction();
TQListViewItem *i = itemAt( contentsToViewport( e->pos() ) );
if( ! m_useAutoOpenTimer )
return;
if ( i ) {
if ( i != m_dropItem ) {
m_autoOpenTimer.stop();
m_dropItem = i;
m_autoOpenTimer.start( m_autoOpenTime );
}
}
else
m_autoOpenTimer.stop();
}
//-----------------------------------------------
void KFileDnDDetailView::contentsDragLeaveEvent( TQDragLeaveEvent* ) {
kdDebug (9020) << "KFileDnDDetailView::contentsDragLeaveEvent" << endl;
if( m_useAutoOpenTimer ) {
m_autoOpenTimer.stop();
m_dropItem = 0L;
}
}
//-----------------------------------------------
void KFileDnDDetailView::contentsDropEvent( TQDropEvent* e ) {
kdDebug (9020) << "KFileDndDetailView::contentsDropEvent" << endl;
if( m_useAutoOpenTimer ) {
m_autoOpenTimer.stop();
m_dropItem = 0L;
}
if( ! acceptDrag( e ) ) {
e->acceptAction( false );
return;
}
e->acceptAction();
// the drop was accepted so lets emit this to the outside world
KURL::List urls;
KURLDrag::decode( e, urls );
emit dropped( e );
emit dropped( this, e );
emit dropped( this, urls );
}
//-----------------------------------------------
void KFileDnDDetailView::startDrag(){
kdDebug (9020) << "KFileDnDDetailView::startDrag()" << endl;
// create a list of the URL:s that we want to drag
KURL::List urls;
KFileItemListIterator it( * KFileView::selectedItems() );
for ( ; it.current(); ++it ){
urls.append( (*it)->url() );
}
TQPixmap pixmap;
if( urls.count() > 1 ){
pixmap = DesktopIcon( "kmultiple", 16 );
}
if( pixmap.isNull() )
pixmap = currentFileItem()->pixmap( 16 );
TQPoint hotspot;
hotspot.setX( pixmap.width() / 2 );
hotspot.setY( pixmap.height() / 2 );
m_dragObject = KURLDrag::newDrag( urls, widget() );
m_dragObject->setPixmap( pixmap, hotspot );
m_dragObject->drag(); // start the drag
}
//-----------------------------------------------
TQDragObject* KFileDnDDetailView::dragObject() const {
return m_dragObject;
}
//-----------------------------------------------
bool KFileDnDDetailView::acceptDrag(TQDropEvent* e ) const {
return KURLDrag::canDecode( e ) &&
( e->action() == TQDropEvent::Copy
|| e->action() == TQDropEvent::Move
|| e->action() == TQDropEvent::Link );
}
//-----------------------------------------------
void KFileDnDDetailView::setAutoOpenTime( const int& time ){
m_autoOpenTime = time;
useAutoOpenTimer();
}
//-----------------------------------------------
void KFileDnDDetailView::useAutoOpenTimer( bool use ){
m_useAutoOpenTimer = use;
if( use )
connect( &m_autoOpenTimer, TQT_SIGNAL( timeout() ),this, TQT_SLOT( slotOpenFolder() ) );
else {
disconnect( &m_autoOpenTimer, TQT_SIGNAL( timeout() ),this, TQT_SLOT( slotOpenFolder() ) );
m_dropItem = 0L;
m_autoOpenTimer.stop();
}
}
//-----------------------------------------------
void KFileDnDDetailView::setDnDEnabled( bool useDnD ){
m_dndEnabled = useDnD;
setDragEnabled( useDnD );
setDropVisualizer( useDnD );
setAcceptDrops( useDnD );
viewport()->setAcceptDrops( useDnD );
}
//-----------------------------------------------
#ifndef NO_INCLUDE_MOCFILES
#include "kfilednddetailview.moc"
#endif