mirror of
https://invent.kde.org/graphics/okular
synced 2024-08-25 02:45:38 +00:00
Add a Live Connect extension to be able to react to the very tiny bit of exposed JavaScript API for host containers.
The current implementation is very very very simple and minimal, and misses a bit of stuff (eg the queue'ing for messages, errors, etc), but for now seems working. Many thanks to Maksim for his precious help with the extension working :) svn path=/trunk/KDE/kdegraphics/okular/; revision=792030
This commit is contained in:
parent
872d380582
commit
d3e7460947
87
part.cpp
87
part.cpp
|
@ -147,6 +147,8 @@ m_cliPresentation(false), m_generatorGuiClient(0)
|
|||
|
||||
// create browser extension (for printing when embedded into browser)
|
||||
m_bExtension = new BrowserExtension(this);
|
||||
// create live connect extension (for integrating with browser scripting)
|
||||
new OkularLiveConnectExtension( this );
|
||||
|
||||
// we need an instance
|
||||
setComponentData(okularPartFactory::componentData());
|
||||
|
@ -1911,6 +1913,91 @@ void BrowserExtension::print()
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
* OkularLiveConnectExtension class
|
||||
*/
|
||||
#define OKULAR_EVAL_RES_OBJ_NAME "__okular_object"
|
||||
#define OKULAR_EVAL_RES_OBJ "this." OKULAR_EVAL_RES_OBJ_NAME
|
||||
|
||||
OkularLiveConnectExtension::OkularLiveConnectExtension( Part *parent )
|
||||
: KParts::LiveConnectExtension( parent ), m_inEval( false )
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
bool OkularLiveConnectExtension::get( const unsigned long objid, const QString &field,
|
||||
KParts::LiveConnectExtension::Type &type,
|
||||
unsigned long &retobjid, QString &value )
|
||||
{
|
||||
Q_UNUSED( value )
|
||||
retobjid = objid;
|
||||
bool result = false;
|
||||
if ( field == QLatin1String( "postMessage" ) )
|
||||
{
|
||||
type = KParts::LiveConnectExtension::TypeFunction;
|
||||
result = true;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
bool OkularLiveConnectExtension::put( const unsigned long objid, const QString &field, const QString &value )
|
||||
{
|
||||
Q_UNUSED( objid )
|
||||
if ( m_inEval )
|
||||
{
|
||||
if ( field == QLatin1String( OKULAR_EVAL_RES_OBJ_NAME ) )
|
||||
m_evalRes = value;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool OkularLiveConnectExtension::call( const unsigned long objid, const QString &func, const QStringList &args,
|
||||
KParts::LiveConnectExtension::Type &type, unsigned long &retobjid, QString &value )
|
||||
{
|
||||
retobjid = objid;
|
||||
bool result = false;
|
||||
if ( func == QLatin1String( "postMessage" ) )
|
||||
{
|
||||
type = KParts::LiveConnectExtension::TypeVoid;
|
||||
postMessage( args );
|
||||
value = QString();
|
||||
result = true;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
QString OkularLiveConnectExtension::eval( const QString &script )
|
||||
{
|
||||
KParts::LiveConnectExtension::ArgList args;
|
||||
args.append( qMakePair( KParts::LiveConnectExtension::TypeString, script ) );
|
||||
m_evalRes.clear();
|
||||
m_inEval = true;
|
||||
emit partEvent( 0, "eval", args );
|
||||
m_inEval = false;
|
||||
return m_evalRes;
|
||||
}
|
||||
|
||||
|
||||
void OkularLiveConnectExtension::postMessage( const QStringList &args )
|
||||
{
|
||||
QStringList arrayargs;
|
||||
Q_FOREACH ( const QString &arg, args )
|
||||
{
|
||||
QString newarg = arg;
|
||||
newarg.replace( '\'', "\\'" );
|
||||
arrayargs.append( "\"" + newarg + "\"" );
|
||||
}
|
||||
const QString arrayarg = "[" + arrayargs.join( ", " ) + "]";
|
||||
eval( "if (this.messageHandler && typeof this.messageHandler.onMessage == 'function') "
|
||||
"{ this.messageHandler.onMessage(" + arrayarg + ") }" );
|
||||
}
|
||||
|
||||
|
||||
#include "part.moc"
|
||||
|
||||
/* kate: replace-tabs on; indent-width 4; */
|
||||
|
|
22
part.h
22
part.h
|
@ -267,6 +267,28 @@ class BrowserExtension : public KParts::BrowserExtension
|
|||
private:
|
||||
Part *m_part;
|
||||
};
|
||||
|
||||
class OkularLiveConnectExtension : public KParts::LiveConnectExtension
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
OkularLiveConnectExtension( Part *parent );
|
||||
|
||||
// from LiveConnectExtension
|
||||
virtual bool get( const unsigned long objid, const QString &field, Type &type,
|
||||
unsigned long &retobjid, QString &value );
|
||||
virtual bool put( const unsigned long objid, const QString &field, const QString &value );
|
||||
virtual bool call( const unsigned long objid, const QString &func, const QStringList &args,
|
||||
Type &type, unsigned long &retobjid, QString &value );
|
||||
|
||||
private:
|
||||
QString eval( const QString &script );
|
||||
void postMessage( const QStringList &args );
|
||||
|
||||
bool m_inEval;
|
||||
QString m_evalRes;
|
||||
};
|
||||
#endif
|
||||
|
||||
/* kate: replace-tabs on; indent-width 4; */
|
||||
|
|
Loading…
Reference in a new issue