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.
tdegraphics/kpovmodeler/pmlibraryiconview.cpp

329 lines
9.6 KiB

//-*-C++-*-
/*
**************************************************************************
description
--------------------
copyright : (C) 2003 by Luis Carvalho
email : lpassos@oninetspeed.pt
**************************************************************************
**************************************************************************
* *
* 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. *
* *
**************************************************************************/
#include "pmlibraryiconview.h"
#include <unistd.h>
#include <tqstring.h>
#include <tqdir.h>
#include <kurl.h>
#include <kio/job.h>
#include <kmessagebox.h>
#include <klocale.h>
#include <stdlib.h>
#include "pmlibraryhandle.h"
#include "pmlibraryobject.h"
#include "pmdebug.h"
const char* PMLibraryIconDrag::format( int i ) const
{
switch( i )
{
case 0:
return "application/x-qiconlist";
break;
case 1:
return "text/sublib-list";
break;
default:
return 0;
break;
}
}
TQByteArray PMLibraryIconDrag::tqencodedData( const char* mime ) const
{
TQByteArray a;
if ( TQString( mime ) == "application/x-qiconlist" )
a = TQIconDrag::tqencodedData( mime );
else if ( TQString( mime ) == "text/sublib-list" )
{
TQString s , l;
for( unsigned i = 0; i < m_paths.count( ); ++i )
{
if( m_subLibs[i] )
l = "true";
else
l = "false";
s += m_paths[i] + "\r" + l + "\n";
}
a.resize( s.length( ) );
memcpy( a.data( ), s.latin1( ), s.length( ) );
}
return a;
}
bool PMLibraryIconDrag::canDecode( TQMimeSource* e )
{
return e->provides( "application/x-qiconlist" ) ||
e->provides( "text/sublib-list" );
}
bool PMLibraryIconDrag::decode( TQMimeSource* e, TQStringList& strList, TQValueList<bool>& subLibList )
{
TQByteArray a = e->tqencodedData( "text/sublib-list" );
if( a.isEmpty( ) )
return false;
TQStringList list = TQStringList::split( "\n", TQString( a ) );
for( unsigned i = 0; i < list.count( ); ++i )
{
strList.append( list[i].section( "\r", 0, 0 ) );
if( list[i].section( "\r", 1, 1 ) == "true" )
subLibList.append( true );
else
subLibList.append( false );
}
return true;
}
void PMLibraryIconDrag::append( const TQIconDragItem &item, const TQRect &pr,
const TQRect &tr, const TQString &path, bool isSubLibrary )
{
TQIconDrag::append( item, pr, tr );
m_paths << path;
m_subLibs.append( isSubLibrary );
}
PMLibraryIconView::PMLibraryIconView( TQWidget* parent, const char* name )
: KIconView( parent, name )
{
m_pLibrary = NULL;
m_pCurrentLibrary = NULL;
setSelectionMode( Single );
setMode( Execute );
}
void PMLibraryIconView::setLibrary( PMLibraryHandle* h )
{
m_pLibrary = h;
refresh( );
}
void PMLibraryIconView::refresh( )
{
// Clear all the icons
clear( );
PMLibraryHandle::EntryIterator* it;
// Scan all the library objects and load them into the view
// First let's add the libraries
it = m_pLibrary->createSubLibraryIterator( );
for( ; it->current( ); ++(*it) )
{
TQString f_name = *( it->current( ) );
PMLibraryHandle h( f_name );
new PMLibraryIconViewItem( this, h.name( ), f_name, true );
}
delete it;
// Then the objects
it = m_pLibrary->createObjectIterator( );
for( ; it->current( ); ++(*it) )
{
TQString f_name = *( it->current( ) );
PMLibraryObject obj( f_name );
if( obj.preview( ) )
new PMLibraryIconViewItem( this, obj.name( ), obj.preview( )->copy( ), f_name, false );
else
new PMLibraryIconViewItem( this, obj.name( ), f_name, false );
}
delete it;
}
void PMLibraryIconView::slotDropped( TQDropEvent *e, const TQValueList<TQIconDragItem> & )
{
e->ignore( );
}
TQDragObject* PMLibraryIconView::dragObject( )
{
if ( !currentItem( ) )
return 0;
TQPoint orig = viewportToContents( viewport( )->mapFromGlobal( TQCursor::pos( ) ) );
PMLibraryIconDrag *drag = new PMLibraryIconDrag( viewport( ) );
drag->setPixmap( *currentItem( )->pixmap( ),
TQPoint( currentItem( )->pixmapRect( ).width( ) / 2,
currentItem( )->pixmapRect( ).height( ) / 2 ) );
for ( PMLibraryIconViewItem *item = (PMLibraryIconViewItem*)firstItem( );
item; item = ( PMLibraryIconViewItem* )item->nextItem( ) )
{
if ( item->isSelected( ) )
{
TQIconDragItem id;
id.setData( TQCString( item->path( ).latin1( ) ) );
drag->append( id,
TQRect( item->pixmapRect( FALSE ).x( ) - orig.x( ),
item->pixmapRect( FALSE ).y( ) - orig.y( ),
item->pixmapRect( ).width( ),
item->pixmapRect( ).height( ) ),
TQRect( item->textRect( FALSE ).x( ) - orig.x( ),
item->textRect( FALSE ).y( ) - orig.y( ),
item->textRect().width( ),
item->textRect( ).height( ) ),
item->path( ),
item->isSubLibrary( ) );
}
}
return drag;
}
PMLibraryIconViewItem::PMLibraryIconViewItem( TQIconView *parent, const TQString &text, const TQString& path, bool isSubLibrary )
: KIconViewItem( parent, text )
{
m_path = path;
m_isSubLibrary = isSubLibrary;
}
PMLibraryIconViewItem::PMLibraryIconViewItem( TQIconView *parent, const TQString &text, const TQImage& image, const TQString& path, bool isSubLibrary )
: KIconViewItem( parent, text, image )
{
m_path = path;
m_isSubLibrary = isSubLibrary;
}
bool PMLibraryIconViewItem::acceptDrop( const TQMimeSource *e ) const
{
if ( m_isSubLibrary && e->provides( "text/sublib-list" ) )
return true;
return false;
}
void PMLibraryIconViewItem::dropped( TQDropEvent *e, const TQValueList<TQIconDragItem> & )
{
TQStringList pathList;
TQValueList<bool> subLibList;
if( m_isSubLibrary && PMLibraryIconDrag::decode( e, pathList, subLibList ) )
{
PMLibraryIconView* source = static_cast<PMLibraryIconView*>( e->source( )->parentWidget( ) );
PMLibraryHandle* parentLib = source->library( );
PMLibraryHandle newParentLib = PMLibraryHandle( m_path );
if ( parentLib->isReadOnly() || newParentLib.isReadOnly() )
{
e->ignore();
return;
}
for( unsigned i = 0; i < pathList.count( ); ++i )
{
bool success = true;
TQString path = pathList[i];
if( path != ( m_path +"/" + path.section( '/', -1 ) ) )
{
if( subLibList[i] )
{
TQString newpath = newPath( path, true );
if( parentLib->deleteSubLibrary( path ) == PMLibraryHandle::Ok )
{
PMLibraryHandle lib = PMLibraryHandle( path );
if( newParentLib.addSubLibrary( newpath, lib.name() ) == PMLibraryHandle::Ok )
{
lib.changeParentLibrary( m_path );
KIO::move( path, newpath );
}
else
{
success = false;
parentLib->addSubLibrary( path, lib.name( ) );
}
}
else
success = false;
}
else
{
TQString newpath = newPath( path, false );
if( parentLib->deleteObject( path ) == PMLibraryHandle::Ok )
{
PMLibraryObject obj = PMLibraryObject( path );
if( newParentLib.addObject( newpath, obj.name() ) == PMLibraryHandle::Ok )
{
KIO::move( path, newpath );
}
else
{
success = false;
parentLib->addObject( path, obj.name( ) );
}
}
else
success = false;
}
if( !success )
{
KMessageBox::error( 0, i18n( "Error moving \"%1\" to \"%2\"" ).tqarg( path ).tqarg( m_path ) );
e->ignore( );
return;
}
}
}
e->acceptAction( );
source->refresh( );
}
else
{
e->ignore( );
}
}
TQString PMLibraryIconViewItem::newPath( const TQString oldPath, bool /*subLib*/ )
{
/// @todo Need to replace mkdtemp and mkstemps before enabling libs
return oldPath;
/*
TQString path = m_path + "/" + oldPath.section( '/', -1 );
if( subLib )
{
TQString test = path + "/library_index.xml";
if( TQFile::exists( test ) )
{
TQCString s = m_path.latin1();
s+= "/libXXXXXX";
char* dirname = mkdtemp( s.data() );
rmdir( dirname );
path = dirname;
}
}
else if( TQFile::exists( path ) )
{
// we need to rename it.
TQCString s = m_path.latin1();
s += "/objXXXXXX.kpml";
int fh = mkstemps( s.data( ), 5 );
close( fh );
unlink( s.data() );
path = s;
}
return path;
*/
}
#include "pmlibraryiconview.moc"