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