From 90825e2392b2d70e43c7a25b8a3752299a933894 Mon Sep 17 00:00:00 2001 From: toma Date: Wed, 25 Nov 2009 17:56:58 +0000 Subject: Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features. BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdebindings@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- kjsembed/jsconsolewidget.cpp | 242 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 242 insertions(+) create mode 100644 kjsembed/jsconsolewidget.cpp (limited to 'kjsembed/jsconsolewidget.cpp') diff --git a/kjsembed/jsconsolewidget.cpp b/kjsembed/jsconsolewidget.cpp new file mode 100644 index 00000000..4816e335 --- /dev/null +++ b/kjsembed/jsconsolewidget.cpp @@ -0,0 +1,242 @@ +/* + * Copyright (C) 2001-2003, Richard J. Moore + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "jsbinding.h" +#include "kjsembedpart.h" + +#include "jsconsolewidget.h" +#include "jsconsolewidget.moc" + +namespace KJSEmbed { + +class JSConsoleWidgetPrivate +{ +}; + +JSConsoleWidget::JSConsoleWidget( KJSEmbedPart *jspart, QWidget *parent, const char *name ) + : QFrame( parent, name ? name : "jsconsole_widget" ), + js(jspart), proc(0), d(0) +{ + setFocusPolicy( QWidget::StrongFocus ); + createView(); +} + +JSConsoleWidget::~JSConsoleWidget() +{ +} + +void JSConsoleWidget::createView() +{ + QPixmap px( KGlobal::iconLoader()->loadIcon("konsole", KIcon::NoGroup, KIcon::SizeSmall) ); + QPixmap pxl( KGlobal::iconLoader()->loadIcon("konsole", KIcon::NoGroup, KIcon::SizeLarge) ); + setIcon( px ); + KWin::setIcons( winId(), pxl, px ); + + ttl = new KPopupTitle( this, "title" ); + ttl->setText( i18n("JavaScript Console") ); + ttl->setIcon( px ); + + log = new KTextEdit( this, "log_widget" ); + log->setReadOnly( true ); + log->setUndoRedoEnabled( false ); + log->setTextFormat( Qt::RichText ); + log->setWrapPolicy( QTextEdit::Anywhere ); + log->setText( "
" );
+    log->setFocusPolicy( QWidget::NoFocus );
+
+    // Command entry section
+    cmdBox = new QHBox( this, "cmd_box" );
+    cmdBox->setSpacing( KDialog::spacingHint() );
+
+    QLabel *prompt = new QLabel( i18n("&KJS>"), cmdBox, "prompt" );
+    cmd = new KLineEdit( cmdBox, "cmd_edit" );
+    cmd->setFocusPolicy( QWidget::StrongFocus );
+    cmd->setFocus();
+    prompt->setBuddy( cmd );
+
+    go = new QPushButton( i18n("&Run"), cmdBox, "run_button" );
+    go->setFixedSize( go->sizeHint() );
+
+    connect( cmd, SIGNAL(returnPressed(const QString&)), go, SLOT( animateClick() ) );
+    connect( go, SIGNAL( clicked() ), SLOT( invoke() ) );
+
+    // Setup completion
+    KCompletion *comp = cmd->completionObject();
+    connect( cmd, SIGNAL(returnPressed(const QString&)), comp, SLOT(addItem(const QString&)) );
+
+    // Layout
+    QVBoxLayout *vert = new QVBoxLayout( this, KDialog::marginHint(), KDialog::spacingHint() );
+    vert->addWidget( ttl );
+    vert->addWidget( log );
+    vert->addWidget( cmdBox );
+}
+
+void JSConsoleWidget::invoke()
+{
+    QString code( cmd->text() );
+    println( QString( "KJS> %1" ).arg( code ) );
+    execute( code );
+}
+
+bool JSConsoleWidget::execute( const QString &cmd )
+{
+    return execute( cmd, KJS::Null() );
+}
+
+bool JSConsoleWidget::execute( const QString &cmd, const KJS::Value &self )
+{
+    KJS::Completion jsres;
+    bool ok = js->execute( jsres, cmd, self );
+
+    // Executed ok
+    if ( ok ) {
+
+	// No return value
+	if ( !jsres.isValueCompletion() )
+	    return ok;
+
+	// Return value
+	KJS::Value ret = jsres.value();
+	KJS::UString s = ret.toString( js->globalExec() );
+
+	if ( s.isNull() ) {
+	    warn( i18n("Success, but return value cannot be displayed") );
+	    return ok;
+	}
+
+	QString txt = s.qstring();
+	txt = txt.replace( QChar('\n'), "
" ); + println( txt ); + + return ok; + } + + // Handle errors + KJS::ComplType ct = jsres.complType(); + if ( (ct == KJS::Throw) || (ct == KJS::Break) || ct == KJS::Continue ) { + + KJS::UString s = jsres.value().toString( js->globalExec() ); + if ( !s.isNull() ) + warn( s.qstring() ); + else + warn( i18n("Unspecified error") ); + } + else { + kdDebug(80001) << "jsconsolewidget: Unknown completion error, " << ct << endl; + warn( i18n("Unknown error returned, completion type %1").arg(ct) ); + } + + return ok; +} + +void JSConsoleWidget::println( const QString &msg ) +{ + log->append( msg ); + log->scrollToBottom(); +} + +void JSConsoleWidget::warn( const QString &msg ) +{ + QString err( "%1" ); + println( err.arg(msg) ); +} + +// +// Process Handling +// + +bool JSConsoleWidget::run( const QString &cmd ) +{ + kdDebug(80001) << "JSConsoleWidget::run(" << cmd << ")" << endl; + + if ( proc ) + return false; + + proc = new KShellProcess("/bin/sh"); + *proc << cmd; + + connect( proc, SIGNAL( processExited(KProcess *) ), SLOT( childExited() ) ); + connect( proc, SIGNAL( receivedStdout(KProcess *, char *, int) ), + this, SLOT( receivedStdOutput(KProcess *, char *, int) ) ); + connect( proc, SIGNAL( receivedStderr(KProcess *, char *, int) ), + this, SLOT( receivedStdError(KProcess *, char *, int) ) ); + + return proc->start( KProcess::NotifyOnExit, + KProcess::Communication( KProcess::Stdout|KProcess::Stderr )); +} + + +void JSConsoleWidget::childExited() +{ + QString s; + if ( proc->normalExit() ) { + if ( proc->exitStatus() ) + s = i18n( "[Exited with status %1]\n" ).arg( proc->exitStatus() ); + else + s = i18n( "[Finished]\n" ); + println( s ); + } + else { + s = i18n("[Aborted]\n"); + warn( s ); + } + + delete proc; + proc = 0; +} + +void JSConsoleWidget::receivedStdOutput( KProcess *, char *buffer, int buflen ) +{ + QCString buf = QCString( buffer, buflen+1 ); + println( QString(buf) ); +} + +void JSConsoleWidget::receivedStdError( KProcess *, char *buffer, int buflen ) +{ + QCString buf = QCString( buffer, buflen+1 ); + warn( QString(buf) ); +} + + +} // namespace KJSEmbed + +// Local Variables: +// c-basic-offset: 4 +// End: -- cgit v1.2.3