[rkward-cvs] SF.net SVN: rkward:[4474] trunk/rkward
tfry at users.sourceforge.net
tfry at users.sourceforge.net
Mon Dec 3 19:07:32 UTC 2012
Revision: 4474
http://rkward.svn.sourceforge.net/rkward/?rev=4474&view=rev
Author: tfry
Date: 2012-12-03 19:07:31 +0000 (Mon, 03 Dec 2012)
Log Message:
-----------
Add in-app debug message viewer
Modified Paths:
--------------
trunk/rkward/ChangeLog
trunk/rkward/rkward/main.cpp
trunk/rkward/rkward/rkward.cpp
trunk/rkward/rkward/windows/CMakeLists.txt
trunk/rkward/rkward/windows/rkmdiwindow.h
trunk/rkward/rkward/windows/rktoplevelwindowgui.rc
Added Paths:
-----------
trunk/rkward/rkward/windows/rkdebugmessagewindow.cpp
trunk/rkward/rkward/windows/rkdebugmessagewindow.h
Modified: trunk/rkward/ChangeLog
===================================================================
--- trunk/rkward/ChangeLog 2012-11-30 09:46:37 UTC (rev 4473)
+++ trunk/rkward/ChangeLog 2012-12-03 19:07:31 UTC (rev 4474)
@@ -1,3 +1,4 @@
+- Add in-application debug message viewer (targetted at (plugin) developers) TODO: mention in docs
- Add setting to customize initial working directory
- Windows only: Add UI-checkbox for R's "internet2"-option
- New functions getString(), getList() and getBoolean() for fetching data in plugin scripts TODO: more testing, convert at least some plugins
Modified: trunk/rkward/rkward/main.cpp
===================================================================
--- trunk/rkward/rkward/main.cpp 2012-11-30 09:46:37 UTC (rev 4473)
+++ trunk/rkward/rkward/main.cpp 2012-12-03 19:07:31 UTC (rev 4474)
@@ -66,6 +66,7 @@
#include "rkward.h"
#include "rkwardapplication.h"
#include "settings/rksettingsmoduledebug.h"
+#include "windows/rkdebugmessagewindow.h"
#ifdef Q_WS_WIN
// these are needed for the exit hack.
@@ -98,8 +99,6 @@
* any other noise, coming from Qt / kdelibs. Also it allows us to retain info on flags and level. Eventually, this could
* be made available in a tool window, esp. for debugging plugins. */
void RKDebug (int flags, int level, const char *fmt, ...) {
- Q_UNUSED (flags);
- Q_UNUSED (level);
const int bufsize = 1024*8;
char buffer[bufsize];
@@ -108,6 +107,7 @@
vsnprintf (buffer, bufsize-1, fmt, ap);
va_end (ap);
RKDebugMessageOutput (QtDebugMsg, buffer);
+ RKDebugMessageWindow::newMessage (flags, level, QString (buffer));
}
int main(int argc, char *argv[]) {
Modified: trunk/rkward/rkward/rkward.cpp
===================================================================
--- trunk/rkward/rkward/rkward.cpp 2012-11-30 09:46:37 UTC (rev 4473)
+++ trunk/rkward/rkward/rkward.cpp 2012-12-03 19:07:31 UTC (rev 4474)
@@ -84,6 +84,7 @@
#include "windows/rktoolwindowlist.h"
#include "windows/rkdebugconsole.h"
#include "windows/rkcallstackviewer.h"
+#include "windows/rkdebugmessagewindow.h"
#include "rkconsole.h"
#include "debug.h"
#include "version.h"
@@ -363,6 +364,10 @@
RKDebugConsole::instance ()->setCaption (i18n ("Debugger Console"));
RKToolWindowList::registerToolWindow (RKDebugConsole::instance (), "debugconsole", RKToolWindowList::Nowhere, Qt::AltModifier + Qt::Key_7);
+ RKDebugMessageWindow::_instance = new RKDebugMessageWindow (0, true);
+ RKDebugMessageWindow::instance ()->setCaption (i18n ("RKWard Debug Messages"));
+ RKToolWindowList::registerToolWindow (RKDebugMessageWindow::instance (), "rkdebugmessages", RKToolWindowList::Nowhere, 0);
+
RKWorkplace::mainWorkplace ()->placeToolWindows ();
}
Modified: trunk/rkward/rkward/windows/CMakeLists.txt
===================================================================
--- trunk/rkward/rkward/windows/CMakeLists.txt 2012-11-30 09:46:37 UTC (rev 4473)
+++ trunk/rkward/rkward/windows/CMakeLists.txt 2012-12-03 19:07:31 UTC (rev 4474)
@@ -20,6 +20,7 @@
rktoolwindowbar.cpp
rktoolwindowlist.cpp
robjectbrowser.cpp
+ rkdebugmessagewindow.cpp
)
QT4_AUTOMOC(${windows_STAT_SRCS})
Added: trunk/rkward/rkward/windows/rkdebugmessagewindow.cpp
===================================================================
--- trunk/rkward/rkward/windows/rkdebugmessagewindow.cpp (rev 0)
+++ trunk/rkward/rkward/windows/rkdebugmessagewindow.cpp 2012-12-03 19:07:31 UTC (rev 4474)
@@ -0,0 +1,161 @@
+/***************************************************************************
+ rkdebugmessagewindow - description
+ -------------------
+ begin : Sat Dec 01 2012
+ copyright : (C) 2012 by Thomas Friedrichsmeier
+ email : tfry at users.sourceforge.net
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "rkdebugmessagewindow.h"
+
+#include <QShowEvent>
+#include <QHideEvent>
+#include <QVBoxLayout>
+#include <QTreeWidget>
+#include <QTreeWidgetItem>
+
+#include <kvbox.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+
+#include "../misc/rkdummypart.h"
+
+#include "../debug.h"
+
+RKDebugMessageWindow* RKDebugMessageWindow::_instance = 0;
+
+RKDebugMessageWindow::RKDebugMessageWindow (QWidget* parent, bool tool_window, const char* name) : RKMDIWindow (parent, RKMDIWindow::DebugMessageWindow, tool_window, name) {
+ RK_TRACE (APP);
+ RK_ASSERT (!_instance);
+ real_widget = 0;
+ first = true;
+
+ QVBoxLayout *layout = new QVBoxLayout (this);
+ layout->setContentsMargins (0, 0, 0, 0);
+ layout_widget = new KVBox (this);
+ layout->addWidget (layout_widget);
+ layout_widget->setFocusPolicy (Qt::StrongFocus);
+
+ setPart (new RKDummyPart (this, layout_widget));
+ initializeActivationSignals ();
+}
+
+RKDebugMessageWindow::~RKDebugMessageWindow () {
+ RK_TRACE (APP);
+}
+
+void RKDebugMessageWindow::showEvent (QShowEvent *e) {
+ RK_TRACE (APP);
+
+ if (!e->spontaneous ()) createWidget ();
+ RKMDIWindow::showEvent (e);
+}
+
+void RKDebugMessageWindow::hideEvent (QHideEvent *e) {
+ RK_TRACE (APP);
+
+ if (!e->spontaneous ()) discardWidget ();
+ RKMDIWindow::hideEvent (e);
+}
+
+void RKDebugMessageWindow::createWidget () {
+ RK_TRACE (APP);
+
+ if (!real_widget) {
+ RK_DEBUG (APP, DL_INFO, "creating debug message viewer");
+ real_widget = new RKDebugMessageWindowWidget (layout_widget);
+ setFocusProxy (real_widget);
+
+ if (first) {
+ KMessageBox::information (this, i18n ("<p>This window is used for displaying RKWard related debug messages. It is targetted primarily at (plugin) developers. It does <b>not</b> offer any features for debugging R code.</p>"
+ "<p>Note that the list of message is cleared everytime you close the window.</p><p>Type and severity level of messages can be controlled from Settings->Configure RKWard->Debug</p>"), i18n ("About this window"), "inforkdebugmessagewindow");
+ first = false;
+ }
+ }
+}
+
+void RKDebugMessageWindow::discardWidget () {
+ RK_TRACE (APP);
+
+ if (real_widget) {
+ RK_DEBUG (APP, DL_INFO, "discarding debug message viewer");
+ delete real_widget;
+ real_widget = 0;
+ }
+}
+
+void RKDebugMessageWindow::newMessage (const int flags, const int level, const QString &message) {
+ // Not tracing this! That might lead to infinite recursion!
+ if (_instance && _instance->real_widget) _instance->real_widget->newMessage (flags, level, message);
+}
+
+
+
+RKDebugMessageWindowWidget::RKDebugMessageWindowWidget (QWidget *parent) : QWidget (parent) {
+ RK_TRACE (APP);
+
+ QVBoxLayout *v_layout = new QVBoxLayout (this);
+ v_layout->setContentsMargins (0, 0, 0, 0);
+ message_viewer = new QTreeWidget (this);
+ message_viewer->setHeaderLabels (QStringList () << i18nc ("Severity level of debug message: Info, Warning, Error, etc. Keep this short.", "Level") << i18n ("Message"));
+ v_layout->addWidget (message_viewer);
+}
+
+RKDebugMessageWindowWidget::~RKDebugMessageWindowWidget () {
+ RK_TRACE (APP);
+}
+
+void RKDebugMessageWindowWidget::newMessage (const int flags, const int level, const QString &message) {
+ Q_UNUSED (flags);
+ // Not tracing this! That might lead to infinite recursion!
+ QTreeWidgetItem *item = new QTreeWidgetItem (message_viewer);
+ if (level == DL_TRACE) {
+ item->setForeground (0, Qt::lightGray);
+ item->setText (0, "TRACE");
+ } else if (level == DL_DEBUG) {
+ item->setForeground (0, Qt::gray);
+ item->setText (0, "DEBUG");
+ } else if (level == DL_INFO) {
+ item->setText (0, "INFO");
+ } else if (level == DL_WARNING) {
+ item->setForeground (0, Qt::yellow);
+ item->setText (0, "WARNING");
+ } else {
+ item->setForeground (0, Qt::red);
+ item->setText (0, "ERROR");
+ }
+
+ // totally arbitrary and crude fuzzy wrapping
+ QString wrapped;
+ wrapped.reserve (message.size ());
+ int linelength = 0;
+ for (int i = 0; i < message.size (); ++i) {
+ if ((linelength > 100 && (message[i].isSpace()))
+ || (linelength > 160 && (!message[i].isLetterOrNumber()))
+ || (linelength > 200)) {
+ wrapped.append ('\n');
+ linelength = -1;
+ }
+
+ wrapped.append (message[i]);
+ linelength++;
+ }
+ QString wrapped_short = wrapped;
+ if (wrapped.size () > 1500) {
+ wrapped_short = wrapped.mid (0, 1500) + "...";
+ }
+
+ item->setText (1, wrapped);
+ item->setToolTip (1, wrapped_short);
+ item->setTextAlignment (1, Qt::AlignTop | Qt::AlignLeft);
+}
+
Added: trunk/rkward/rkward/windows/rkdebugmessagewindow.h
===================================================================
--- trunk/rkward/rkward/windows/rkdebugmessagewindow.h (rev 0)
+++ trunk/rkward/rkward/windows/rkdebugmessagewindow.h 2012-12-03 19:07:31 UTC (rev 4474)
@@ -0,0 +1,61 @@
+/***************************************************************************
+ rkdebugmessagewindow - description
+ -------------------
+ begin : Sat Dec 01 2012
+ copyright : (C) 2012 by Thomas Friedrichsmeier
+ email : tfry at users.sourceforge.net
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef RKDEBUGMESSAGEWINDOW_H
+#define RKDEBUGMESSAGEWINDOW_H
+
+#include "rkmdiwindow.h"
+
+class RKDebugMessageWindowWidget;
+class QTreeWidget;
+
+/** Tool window for displaying RKWard debug messages. Mainly targetted at plugin
+ * developers. */
+class RKDebugMessageWindow : public RKMDIWindow {
+public:
+ RKDebugMessageWindow (QWidget *parent, bool tool_window, const char *name=0);
+ ~RKDebugMessageWindow ();
+
+/** reimplemented to create the real widget only when the viewer is shown */
+ void showEvent (QShowEvent *e);
+/** reimplemented to discard the real widget only when the viewer is hidden */
+ void hideEvent (QHideEvent *e);
+ static RKDebugMessageWindow *instance () { return _instance; };
+ static void newMessage (const int flags, const int level, const QString &message);
+private:
+ void createWidget ();
+ void discardWidget ();
+ RKDebugMessageWindowWidget *real_widget;
+ bool first;
+ QWidget *layout_widget;
+friend class RKWardMainWindow;
+ static RKDebugMessageWindow *_instance;
+};
+
+/** The internal widget used in RKDebugMessageWindow
+*/
+class RKDebugMessageWindowWidget : public QWidget {
+public:
+ RKDebugMessageWindowWidget (QWidget *parent);
+ ~RKDebugMessageWindowWidget ();
+
+ void newMessage (const int flags, const int level, const QString &message);
+private:
+ QTreeWidget *message_viewer;
+};
+
+#endif
Modified: trunk/rkward/rkward/windows/rkmdiwindow.h
===================================================================
--- trunk/rkward/rkward/windows/rkmdiwindow.h 2012-11-30 09:46:37 UTC (rev 4473)
+++ trunk/rkward/rkward/windows/rkmdiwindow.h 2012-12-03 19:07:31 UTC (rev 4474)
@@ -55,6 +55,7 @@
FileBrowserWindow=1 << 15,
DebugConsoleWindow=1 << 16,
CallstackViewerWindow=1 << 17,
+ DebugMessageWindow=1 << 18,
DocumentWindow=1 << 29,
ToolWindow=1 << 30,
Modified: trunk/rkward/rkward/windows/rktoplevelwindowgui.rc
===================================================================
--- trunk/rkward/rkward/windows/rktoplevelwindowgui.rc 2012-11-30 09:46:37 UTC (rev 4473)
+++ trunk/rkward/rkward/windows/rktoplevelwindowgui.rc 2012-12-03 19:07:31 UTC (rev 4474)
@@ -1,5 +1,5 @@
<!DOCTYPE kpartgui>
-<kpartgui name="rkward_toplevel" version="581">
+<kpartgui name="rkward_toplevel" version="610">
<MenuBar>
<Merge/>
<Menu name="window"><text>&Window</text>
@@ -18,6 +18,7 @@
<Action name="window_show_helpsearch"/>
<Action name="window_show_debugconsole"/>
<Action name="window_show_debugframes"/>
+ <Action name="window_show_rkdebugmessages"/>
<Separator/>
<Action name="window_activate_docview"/>
</Menu>
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the rkward-tracker
mailing list