00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "filemanager.h"
00021
00022 #include <QtGui/QVBoxLayout>
00023
00024 #include <KDE/KMimeType>
00025 #include <KDE/KMimeTypeTrader>
00026 #include <KDE/KRun>
00027 #include <KDE/KService>
00028 #include <KDE/KTabWidget>
00029 #include <KDE/KToolBar>
00030
00031 #include <KDE/KParts/ReadWritePart>
00032 #include <KDE/KParts/PartManager>
00033
00034 #include <core/debughelper.h>
00035 #include <engine/asset.h>
00036 #include <KActionCollection>
00037 #include <qactiongroup.h>
00038
00039 using namespace GluonCreator;
00040
00041 template<> GLUON_CREATOR_VISIBILITY FileManager* GluonCore::Singleton<FileManager>::m_instance = 0;
00042
00043 class FileManager::FileManagerPrivate
00044 {
00045 public:
00046 KTabWidget* tabWidget;
00047
00048 KToolBar* mainToolBar;
00049 KParts::PartManager* partManager;
00050
00051 QHash<QString, KParts::ReadOnlyPart*> parts;
00052 QHash<QString, int> tabs;
00053 };
00054
00055 KTabWidget* FileManager::tabWidget()
00056 {
00057 return d->tabWidget;
00058 }
00059
00060 KParts::PartManager* FileManager::partManager()
00061 {
00062 return d->partManager;
00063 }
00064
00065 void FileManager::openAsset( GluonEngine::Asset* asset )
00066 {
00067 if( !asset )
00068 return;
00069
00070 openFile( asset->absolutePath(), asset->name() );
00071 }
00072
00073 void FileManager::openFile( const QString& fileName, const QString& name )
00074 {
00075 if( fileName.isEmpty() )
00076 return;
00077
00078 QString tabName = name.isEmpty() ? KUrl( fileName ).fileName() : name;
00079 if( d->parts.contains( tabName ) )
00080 {
00081 d->tabWidget->setCurrentIndex( d->tabs.value( tabName ) );
00082 return;
00083 }
00084
00085 KMimeType::Ptr mime = KMimeType::findByPath( fileName );
00086
00087
00088 KParts::ReadOnlyPart* part = 0;
00089 KService::List parts = KMimeTypeTrader::self()->query( mime->name(), "KParts/ReadWritePart" );
00090 if( parts.count() > 0 )
00091 {
00092 part = parts.first()->createInstance<KParts::ReadWritePart>( qobject_cast<QObject*>( d->tabWidget ) );
00093 }
00094 else
00095 {
00096
00097 parts = KMimeTypeTrader::self()->query( mime->name(), "KParts/ReadOnlyPart" );
00098
00099
00100
00101 if( mime->name().contains( "audio" ) && parts.count() == 0 )
00102 parts.prepend( KService::serviceByDesktopPath( "dragonplayer_part.desktop" ) );
00103
00104 if( parts.count() > 0 )
00105 {
00106 part = parts.first()->createInstance<KParts::ReadOnlyPart>( qobject_cast<QObject*>( d->tabWidget ) );
00107 }
00108 }
00109
00110 if( part )
00111 {
00112
00113 KUrl url( fileName );
00114 part->openUrl( url );
00115 d->parts.insert( tabName, part );
00116 d->partManager->addPart( part, false );
00117
00118 KToolBar* toolBar = addTab( part->widget(), tabName );
00119
00120 QDomNodeList actions;
00121 QDomNodeList toolBars = part->domDocument().elementsByTagName( "ToolBar" );
00122
00123
00124 if( toolBars.count() == 0 && part->childClients().count() > 0 )
00125 toolBars = part->childClients().at( 0 )->domDocument().elementsByTagName( "ToolBar" );
00126
00127 int i = -1;
00128 while( ++i < toolBars.count() )
00129 {
00130 if( toolBars.at( i ).attributes().namedItem( "name" ).nodeValue() == "mainToolBar" )
00131 {
00132 actions = toolBars.at( i ).childNodes();
00133 }
00134 }
00135
00136 DEBUG_BLOCK
00137 i = -1;
00138 while( ++i < actions.count() )
00139 {
00140 if( actions.at( i ).nodeName() == "Action" )
00141 {
00142 toolBar->addAction( part->action( actions.at( i ).attributes().namedItem( "name" ).nodeValue().toUtf8() ) );
00143 }
00144 }
00145
00146 return;
00147 }
00148
00149
00150
00151 KRun* runner = new KRun( KUrl( fileName ), d->tabWidget );
00152 Q_UNUSED( runner );
00153
00154 }
00155
00156 void FileManager::setTabWidget( KTabWidget* widget )
00157 {
00158 d->tabWidget = widget;
00159 connect( d->tabWidget, SIGNAL( closeRequest( QWidget* ) ), SLOT( closeTab( QWidget* ) ) );
00160 connect( d->tabWidget, SIGNAL( currentChanged( int ) ), SLOT( tabChanged( int ) ) );
00161
00162 d->partManager = new KParts::PartManager( d->tabWidget );
00163 }
00164
00165 void FileManager::closeTab( QWidget* widget )
00166 {
00167
00168
00169
00170 int tab = d->tabWidget->indexOf( widget );
00171 QString partName = d->tabs.key( tab );
00172
00173 d->parts.remove( partName );
00174 d->tabs.remove( partName );
00175
00176 widget->deleteLater();
00177 }
00178
00179 void FileManager::tabChanged( int index )
00180 {
00181 QString partName = d->tabs.key( index );
00182 d->partManager->setActivePart( d->parts.value( partName ) );
00183 }
00184
00185 FileManager::FileManager()
00186 : d( new FileManagerPrivate )
00187 {
00188
00189 }
00190
00191 FileManager::~FileManager()
00192 {
00193 delete d;
00194 }
00195
00196 KToolBar* FileManager::addTab( QWidget* widget, const QString& name )
00197 {
00198 Q_ASSERT( widget );
00199
00200 QWidget* base = new QWidget();
00201 base->setObjectName( name );
00202 QVBoxLayout* layout = new QVBoxLayout();
00203 base->setLayout( layout );
00204
00205 KToolBar* toolBar = new KToolBar( base );
00206 toolBar->setIconDimensions( 16 );
00207 layout->addWidget( toolBar );
00208 layout->addWidget( widget );
00209
00210 int id = d->tabWidget->addTab( base, name );
00211 d->tabs.insert( name, id );
00212 d->tabWidget->setCurrentIndex( id );
00213
00214 return toolBar;
00215 }
00216