[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