kio
kdatatool.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "kdatatool.h"
00022
00023 #include <kstandarddirs.h>
00024 #include <klibloader.h>
00025 #include <kdebug.h>
00026 #include <kinstance.h>
00027
00028 #include <ktrader.h>
00029 #include <kparts/componentfactory.h>
00030
00031 #include <qpixmap.h>
00032 #include <qfile.h>
00033
00034
00035
00036
00037
00038
00039
00040 KDataToolInfo::KDataToolInfo()
00041 {
00042 m_service = 0;
00043 }
00044
00045 KDataToolInfo::KDataToolInfo( const KService::Ptr& service, KInstance* instance )
00046 {
00047 m_service = service;
00048 m_instance = instance;
00049
00050 if ( !!m_service && !m_service->serviceTypes().contains( "KDataTool" ) )
00051 {
00052 kdDebug(30003) << "The service " << m_service->name().latin1()
00053 << " does not feature the service type KDataTool" << endl;
00054 m_service = 0;
00055 }
00056 }
00057
00058 KDataToolInfo::KDataToolInfo( const KDataToolInfo& info )
00059 {
00060 m_service = info.service();
00061 m_instance = info.instance();
00062 }
00063
00064 KDataToolInfo& KDataToolInfo::operator= ( const KDataToolInfo& info )
00065 {
00066 m_service = info.service();
00067 m_instance = info.instance();
00068 return *this;
00069 }
00070
00071 QString KDataToolInfo::dataType() const
00072 {
00073 if ( !m_service )
00074 return QString::null;
00075
00076 return m_service->property( "DataType" ).toString();
00077 }
00078
00079 QStringList KDataToolInfo::mimeTypes() const
00080 {
00081 if ( !m_service )
00082 return QStringList();
00083
00084 return m_service->property( "DataMimeTypes" ).toStringList();
00085 }
00086
00087 bool KDataToolInfo::isReadOnly() const
00088 {
00089 if ( !m_service )
00090 return true;
00091
00092 return m_service->property( "ReadOnly" ).toBool();
00093 }
00094
00095 QPixmap KDataToolInfo::icon() const
00096 {
00097 if ( !m_service )
00098 return QPixmap();
00099
00100 QPixmap pix;
00101 QStringList lst = KGlobal::dirs()->resourceDirs("icon");
00102 QStringList::ConstIterator it = lst.begin();
00103 while (!pix.load( *it + "/" + m_service->icon() ) && it != lst.end() )
00104 it++;
00105
00106 return pix;
00107 }
00108
00109 QPixmap KDataToolInfo::miniIcon() const
00110 {
00111 if ( !m_service )
00112 return QPixmap();
00113
00114 QPixmap pix;
00115 QStringList lst = KGlobal::dirs()->resourceDirs("mini");
00116 QStringList::ConstIterator it = lst.begin();
00117 while (!pix.load( *it + "/" + m_service->icon() ) && it != lst.end() )
00118 it++;
00119
00120 return pix;
00121 }
00122
00123 QString KDataToolInfo::iconName() const
00124 {
00125 if ( !m_service )
00126 return QString::null;
00127 return m_service->icon();
00128 }
00129
00130 QStringList KDataToolInfo::commands() const
00131 {
00132 if ( !m_service )
00133 return QString::null;
00134
00135 return m_service->property( "Commands" ).toStringList();
00136 }
00137
00138 QStringList KDataToolInfo::userCommands() const
00139 {
00140 if ( !m_service )
00141 return QString::null;
00142
00143 return QStringList::split( ',', m_service->comment() );
00144 }
00145
00146 KDataTool* KDataToolInfo::createTool( QObject* parent, const char* name ) const
00147 {
00148 if ( !m_service )
00149 return 0;
00150
00151 KDataTool* tool = KParts::ComponentFactory::createInstanceFromService<KDataTool>( m_service, parent, name );
00152 if ( tool )
00153 tool->setInstance( m_instance );
00154 return tool;
00155 }
00156
00157 KService::Ptr KDataToolInfo::service() const
00158 {
00159 return m_service;
00160 }
00161
00162 QValueList<KDataToolInfo> KDataToolInfo::query( const QString& datatype, const QString& mimetype, KInstance* instance )
00163 {
00164 QValueList<KDataToolInfo> lst;
00165
00166 QString constr;
00167
00168 if ( !datatype.isEmpty() )
00169 {
00170 constr = QString::fromLatin1( "DataType == '%1'" ).arg( datatype );
00171 }
00172 if ( !mimetype.isEmpty() )
00173 {
00174 QString tmp = QString::fromLatin1( "'%1' in DataMimeTypes" ).arg( mimetype );
00175 if ( constr.isEmpty() )
00176 constr = tmp;
00177 else
00178 constr = constr + " and " + tmp;
00179 }
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192 KTrader::OfferList offers = KTrader::self()->query( "KDataTool", constr );
00193
00194 KTrader::OfferList::ConstIterator it = offers.begin();
00195 for( ; it != offers.end(); ++it )
00196 {
00197
00198 if ( !instance || !(*it)->property("ExcludeFrom").toStringList()
00199 .contains( instance->instanceName() ) )
00200 lst.append( KDataToolInfo( *it, instance ) );
00201 else
00202 kdDebug() << (*it)->entryPath() << " excluded." << endl;
00203 }
00204
00205 return lst;
00206 }
00207
00208 bool KDataToolInfo::isValid() const
00209 {
00210 return( m_service );
00211 }
00212
00213
00214
00215
00216
00217
00218 KDataToolAction::KDataToolAction( const QString & text, const KDataToolInfo & info, const QString & command,
00219 QObject * parent, const char * name )
00220 : KAction( text, info.iconName(), 0, parent, name ),
00221 m_command( command ),
00222 m_info( info )
00223 {
00224 }
00225
00226 void KDataToolAction::slotActivated()
00227 {
00228 emit toolActivated( m_info, m_command );
00229 }
00230
00231 QPtrList<KAction> KDataToolAction::dataToolActionList( const QValueList<KDataToolInfo> & tools, const QObject *receiver, const char* slot )
00232 {
00233 QPtrList<KAction> actionList;
00234 if ( tools.isEmpty() )
00235 return actionList;
00236
00237 actionList.append( new KActionSeparator() );
00238 QValueList<KDataToolInfo>::ConstIterator entry = tools.begin();
00239 for( ; entry != tools.end(); ++entry )
00240 {
00241 QStringList userCommands = (*entry).userCommands();
00242 QStringList commands = (*entry).commands();
00243 Q_ASSERT(!commands.isEmpty());
00244 if ( commands.count() != userCommands.count() )
00245 kdWarning() << "KDataTool desktop file error (" << (*entry).service()->entryPath()
00246 << "). " << commands.count() << " commands and "
00247 << userCommands.count() << " descriptions." << endl;
00248 QStringList::ConstIterator uit = userCommands.begin();
00249 QStringList::ConstIterator cit = commands.begin();
00250 for (; uit != userCommands.end() && cit != commands.end(); ++uit, ++cit )
00251 {
00252
00253 KDataToolAction * action = new KDataToolAction( *uit, *entry, *cit );
00254 connect( action, SIGNAL( toolActivated( const KDataToolInfo &, const QString & ) ),
00255 receiver, slot );
00256 actionList.append( action );
00257 }
00258 }
00259
00260 return actionList;
00261 }
00262
00263
00264
00265
00266
00267
00268
00269 KDataTool::KDataTool( QObject* parent, const char* name )
00270 : QObject( parent, name ), m_instance( 0L )
00271 {
00272 }
00273
00274 KInstance* KDataTool::instance() const
00275 {
00276 return m_instance;
00277 }
00278
00279 void KDataToolAction::virtual_hook( int id, void* data )
00280 { KAction::virtual_hook( id, data ); }
00281
00282 void KDataTool::virtual_hook( int, void* )
00283 { }
00284
00285 #include "kdatatool.moc"