[rkward-cvs] SF.net SVN: rkward: [761] trunk/rkward/rkward

tfry at users.sourceforge.net tfry at users.sourceforge.net
Mon Sep 25 15:16:00 UTC 2006


Revision: 761
          http://svn.sourceforge.net/rkward/?rev=761&view=rev
Author:   tfry
Date:     2006-09-25 08:15:42 -0700 (Mon, 25 Sep 2006)

Log Message:
-----------
Started using RKWorkplace.
This is all still very buggy (last stable revision was 759)
Probably we need to add a base class for all RKWard document windows?

Modified Paths:
--------------
    trunk/rkward/rkward/Makefile.am
    trunk/rkward/rkward/agents/rkloadagent.cpp
    trunk/rkward/rkward/agents/rksaveagent.cpp
    trunk/rkward/rkward/agents/showedittextfileagent.cpp
    trunk/rkward/rkward/dataeditor/rkeditor.h
    trunk/rkward/rkward/dataeditor/rkeditordataframe.cpp
    trunk/rkward/rkward/misc/rkworkplace.cpp
    trunk/rkward/rkward/misc/rkworkplace.h
    trunk/rkward/rkward/rkglobals.cpp
    trunk/rkward/rkward/rkglobals.h
    trunk/rkward/rkward/rkward.cpp
    trunk/rkward/rkward/rkward.h
    trunk/rkward/rkward/robjectbrowser.cpp
    trunk/rkward/rkward/windows/detachedwindowcontainer.cpp
    trunk/rkward/rkward/windows/detachedwindowcontainer.h
    trunk/rkward/rkward/windows/rkcommandeditorwindow.cpp
    trunk/rkward/rkward/windows/rkcommandeditorwindow.h
    trunk/rkward/rkward/windows/rkhtmlwindow.cpp
    trunk/rkward/rkward/windows/rkhtmlwindow.h

Modified: trunk/rkward/rkward/Makefile.am
===================================================================
--- trunk/rkward/rkward/Makefile.am	2006-09-25 13:13:16 UTC (rev 760)
+++ trunk/rkward/rkward/Makefile.am	2006-09-25 15:15:42 UTC (rev 761)
@@ -22,11 +22,11 @@
 bin_PROGRAMS = rkward.bin
 
 rkward_bin_SOURCES = rkwatch.cpp rkward.cpp main.cpp \
-	rkglobals.cpp robjectbrowser.cpp rkeditormanager.cpp robjectviewer.cpp \
+	rkglobals.cpp robjectbrowser.cpp robjectviewer.cpp \
 	khelpdlg.cpp rkconsole.cpp rkward.skel
 
 noinst_HEADERS = rkwatch.h rkward.h debug.h \
-	rkglobals.h robjectbrowser.h rkeditormanager.h robjectviewer.h \
+	rkglobals.h robjectbrowser.h robjectviewer.h \
 	khelpdlg.h rkconsole.h
 
 rkward_bin_LDADD = $(top_builddir)/rkward/windows/libwindows.a \

Modified: trunk/rkward/rkward/agents/rkloadagent.cpp
===================================================================
--- trunk/rkward/rkward/agents/rkloadagent.cpp	2006-09-25 13:13:16 UTC (rev 760)
+++ trunk/rkward/rkward/agents/rkloadagent.cpp	2006-09-25 15:15:42 UTC (rev 761)
@@ -26,8 +26,8 @@
 #include "../rkglobals.h"
 #include "../core/robjectlist.h"
 #include "../rbackend/rinterface.h"
-#include "../rkeditormanager.h"
 #include "../rkward.h"
+#include "../misc/rkworkplace.h"
 
 #include "../debug.h"
 
@@ -87,7 +87,7 @@
 		RKGlobals::rObjectList ()->updateFromR ();
 		return;
 	}
-	RKGlobals::editorManager ()->restoreEditors ();
+	RKWorkplace::mainWorkplace ()->restoreWorkplace ();
 
 	delete this;
 }

Modified: trunk/rkward/rkward/agents/rksaveagent.cpp
===================================================================
--- trunk/rkward/rkward/agents/rksaveagent.cpp	2006-09-25 13:13:16 UTC (rev 760)
+++ trunk/rkward/rkward/agents/rksaveagent.cpp	2006-09-25 15:15:42 UTC (rev 761)
@@ -25,6 +25,7 @@
 #include "../rbackend/rinterface.h"
 #include "../rkglobals.h"
 #include "../rkward.h"
+#include "../misc/rkworkplace.h"
 #include "../rkeditormanager.h"
 
 #include "../debug.h"
@@ -39,7 +40,7 @@
 		if (!askURL ()) return;
 	}
 	
-	RKGlobals::editorManager ()->flushAll ();
+	RKWorkplace::mainWorkplace ()->flushAllData ();
 	save_chain = RKGlobals::rInterface ()->startChain (0);
 	
 	RKGlobals::rInterface ()->issueCommand (new RCommand ("save.image (\"" + save_url.path () + "\")", RCommand::App, QString::null, this), save_chain);

Modified: trunk/rkward/rkward/agents/showedittextfileagent.cpp
===================================================================
--- trunk/rkward/rkward/agents/showedittextfileagent.cpp	2006-09-25 13:13:16 UTC (rev 760)
+++ trunk/rkward/rkward/agents/showedittextfileagent.cpp	2006-09-25 15:15:42 UTC (rev 761)
@@ -27,6 +27,7 @@
 #include "../windows/rkcommandeditorwindow.h"
 #include "../rbackend/rinterface.h"
 #include "../rbackend/rembedinternal.h"
+#include "../misc/rkworkplace.h"
 #include "../rkglobals.h"
 #include "../rkward.h"
 
@@ -66,14 +67,9 @@
 		for (int n = 0; n < args->int_a; ++n) {
 			message.append (args->chars_a[n]).append (" (\"").append (args->chars_b[n]).append ("\")\n");
 
-			RKCommandEditorWindow *window = new RKCommandEditorWindow (0, false);
-			bool ok = window->openURL (KURL (args->chars_a[n]), false, true);
+			bool ok = RKWorkplace::mainWorkplace ()->openScriptEditor (KURL (args->chars_a[n]), false, true, QString (*(args->chars_c)));
 
-			if (ok) {
-				if (qstrlen (*(args->chars_c))) window->setTabCaption (*(args->chars_c));
-				RKGlobals::rkApp ()->addWindow (window);
-			} else {
-				delete (window);
+			if (!ok)  {
 				bad_files_list.append ("- ").append (args->chars_a[n]).append (" (\"").append (args->chars_b[n]).append ("\")\n");
 			}
 		}
@@ -84,14 +80,9 @@
 		for (int n = 0; n < args->int_a; ++n) {
 			message.append (args->chars_a[n]).append (" (\"").append (args->chars_b[n]).append ("\")\n");
 
-			RKCommandEditorWindow *window = new RKCommandEditorWindow (0, false);
-			bool ok = window->openURL (KURL (args->chars_a[n]), true, false);
+			bool ok = RKWorkplace::mainWorkplace ()->openScriptEditor (KURL (args->chars_a[n]), true, false, QString (args->chars_b[n]));
 
-			if (ok) {
-				if (qstrlen (args->chars_b[n])) window->setTabCaption (args->chars_b[n]);
-				RKGlobals::rkApp ()->addWindow (window);
-			} else {
-				delete (window);
+			if (!ok) {
 				bad_files_list.append ("- ").append (args->chars_a[n]).append (" (\"").append (args->chars_b[n]).append ("\")\n");
 			}
 		}

Modified: trunk/rkward/rkward/dataeditor/rkeditor.h
===================================================================
--- trunk/rkward/rkward/dataeditor/rkeditor.h	2006-09-25 13:13:16 UTC (rev 760)
+++ trunk/rkward/rkward/dataeditor/rkeditor.h	2006-09-25 15:15:42 UTC (rev 761)
@@ -66,7 +66,7 @@
 
 	KParts::Part *getPart () { return part; };
 protected:
-friend class RKEditorManager;
+friend class RKWorkplace;
 /// opens the given object. Implement in the child-classes
 	virtual void openObject (RObject *object, bool initialize_to_empty=false) = 0;
 

Modified: trunk/rkward/rkward/dataeditor/rkeditordataframe.cpp
===================================================================
--- trunk/rkward/rkward/dataeditor/rkeditordataframe.cpp	2006-09-25 13:13:16 UTC (rev 760)
+++ trunk/rkward/rkward/dataeditor/rkeditordataframe.cpp	2006-09-25 15:15:42 UTC (rev 761)
@@ -28,6 +28,7 @@
 #include "../rkeditormanager.h"
 #include "../core/rkmodificationtracker.h"
 #include "rkeditordataframepart.h"
+#include "../misc/rkworkplace.h"
 
 #include "../debug.h"
 
@@ -64,7 +65,6 @@
 
 RKEditorDataFrame::~RKEditorDataFrame () {
 	RK_TRACE (EDITOR);
-	RKGlobals::editorManager ()->closedEditor (this);
 }
 
 void RKEditorDataFrame::flushChanges () {
@@ -258,7 +258,8 @@
 	RK_TRACE (EDITOR);
 	
 	if (object == getObject ()) {
-		RKGlobals::editorManager ()->setEditorName (this, object->getShortName ());
+		setCaption (object->getShortName ());
+		RKWorkplace::mainWorkplace ()->updateWindowCaption (this);
 		return;
 	}
 

Modified: trunk/rkward/rkward/misc/rkworkplace.cpp
===================================================================
--- trunk/rkward/rkward/misc/rkworkplace.cpp	2006-09-25 13:13:16 UTC (rev 760)
+++ trunk/rkward/rkward/misc/rkworkplace.cpp	2006-09-25 15:15:42 UTC (rev 761)
@@ -34,10 +34,14 @@
 
 #include "../debug.h"
 
+// static
+RKWorkplace *RKWorkplace::main_workplace = 0;
 
 RKWorkplace::RKWorkplace (QWidget *parent) : QObject (parent) {
 	RK_TRACE (APP);
+	RK_ASSERT (main_workplace == 0);
 
+	main_workplace = this;
 	wview = new RKWorkplaceView (parent);
 	connect (wview, SIGNAL (currentChanged (QWidget *)), this, SLOT (activeAttachedChanged (QWidget *)));
 	part_manager = new KParts::PartManager (view ());
@@ -80,9 +84,7 @@
 void RKWorkplace::addWindow (QWidget *window, RKWorkplaceObjectType type) {
 	RK_TRACE (APP);
 
-	connect (window, SIGNAL (destroyed (QWidget *)), this, SLOT (windowDestroyed (QWidget *)));
-	// TODO: most views do not emit that signal, yet
-	connect (window, SIGNAL (captionChanged (QWidget *)), this, SLOT (updateWindowCaption (QWidget *)));
+	connect (window, SIGNAL (destroyed (QObject *)), this, SLOT (windowDestroyed (QObject *)));
 
 	RKWorkplaceObjectInfo *info = new RKWorkplaceObjectInfo;
 	info->part = 0;
@@ -90,23 +92,35 @@
 	info->type = type;
 	windows.insert (window, info);
 
+	window->show ();
 	view ()->addTab (window, window->caption ());
+	view ()->setCurrentPage (view ()->indexOf (window));
+	window->setFocus ();
 }
 
-bool RKWorkplace::openScriptEditor (const KURL &url) {
+void RKWorkplace::registerPart (QWidget *window, KParts::Part *part) {
 	RK_TRACE (APP);
+	RK_ASSERT (windows.find (window) != windows.end ());
 
-	RKCommandEditorWindow *editor = new RKCommandEditorWindow (view ());
+	windows[window]->part = part;
+}
 
+bool RKWorkplace::openScriptEditor (const KURL &url, bool use_r_highlighting, bool read_only, const QString &force_caption) {
+	RK_TRACE (APP);
+
+	RKCommandEditorWindow *editor = new RKCommandEditorWindow (view (), use_r_highlighting);
+
 	if (!url.isEmpty ()) {
-		if (!editor->openURL (url)) {
+		if (!editor->openURL (url, use_r_highlighting, read_only)) {
 			delete editor;
 			KMessageBox::messageBox (view (), KMessageBox::Error, i18n ("Unable to open \"%1\"").arg (url.prettyURL ()), i18n ("Could not open command file"));
 			return false;
 		}
 	}
 
+	if (!force_caption.isEmpty ()) editor->setCaption (force_caption);
 	addWindow (editor, CommandEditorWindow);
+	registerPart (editor, editor->getPart ());
 	return true;
 }
 
@@ -198,9 +212,17 @@
 	RK_TRACE (APP);
 	RK_ASSERT (windows.find (window) != windows.end ());
 
-	delete window;		// all the rest should happen in windowDestroyed ()
+	window->close (true);		// all the rest should happen in windowDestroyed ()
 }
 
+void RKWorkplace::closeActiveWindow () {
+	RK_TRACE (APP);
+
+	QWidget *w = activeAttachedWindow ();
+	if (w) closeWindow (w);
+	else RK_ASSERT (false);		// this is benign, and maybe even ok, but I'd like to see when this happens
+}
+
 void RKWorkplace::closeAll (int type, int state) {
 	RK_TRACE (APP);
 
@@ -216,8 +238,9 @@
 	}
 }
 
-void RKWorkplace::windowDestroyed (QWidget *window) {
+void RKWorkplace::windowDestroyed (QObject *object) {
 	RK_TRACE (APP);
+	QWidget *window = static_cast<QWidget *> (object);
 
 	RK_ASSERT (windows.find (window) != windows.end ());
 	delete windows[window];
@@ -229,14 +252,17 @@
 
 	RK_ASSERT (windows.find (window) != windows.end ());
 	view ()->changeTab (window, window->caption ());
-	if (window == activeAttachedWindow ()) emit (changeCaption (window->caption ()));
+	if (window == activeAttachedWindow ()) emit (changeCaption ());
 }
 
 void RKWorkplace::activeAttachedChanged (QWidget *window) {
 	RK_TRACE (APP);
+	RK_ASSERT (windows.find (window) != windows.end ());
 	RK_ASSERT (window);
 
-	emit (changeCaption (window->caption ()));
+	emit (changeCaption ());
+	// do we need to force an update of the active Part?
+	emit (changeGUI (windows[window]->part));
 }
 
 QWidget *RKWorkplace::activeAttachedWindow () {
@@ -251,7 +277,6 @@
 	window->raise ();		// Does this do the trick?
 }
 
-
 void RKWorkplace::saveWorkplace (RCommandChain *chain) {
 	RK_TRACE (APP);
 

Modified: trunk/rkward/rkward/misc/rkworkplace.h
===================================================================
--- trunk/rkward/rkward/misc/rkworkplace.h	2006-09-25 13:13:16 UTC (rev 760)
+++ trunk/rkward/rkward/misc/rkworkplace.h	2006-09-25 15:15:42 UTC (rev 761)
@@ -77,7 +77,7 @@
 	QWidget *activeAttachedWindow ();
 	void activateWindow (QWidget *window);
 
-	bool openScriptEditor (const KURL &url=KURL ());
+	bool openScriptEditor (const KURL &url=KURL (), bool use_r_highlighting=true, bool read_only=false, const QString &force_caption = QString::null);
 	void openHelpWindow (const KURL &url=KURL ());
 	void openOutputWindow (const KURL &url=KURL ());
 
@@ -87,6 +87,7 @@
 /** tell all DataEditorWindow s to syncronize changes to the R backend
 // TODO: add RCommandChain parameter */
 	void flushAllData ();
+	void closeActiveWindow ();
 	void closeWindow (QWidget *window);
 /** Closes all windows of the given type(s). Default call (no arguments) closes all windows
 @param type: A bitwise OR of RKWorkplaceObjectType
@@ -95,31 +96,34 @@
 
 	void saveWorkplace (RCommandChain *chain=0);
 	void restoreWorkplace (RCommandChain *chain=0);
+
+	static RKWorkplace *mainWorkplace () { return main_workplace; };
 signals:
 	void lastWindowClosed ();
 	void changeGUI (KParts::Part *active_part);
-	void changeCaption (const QString &caption);
+	void changeCaption ();
 public slots:
-	void windowDestroyed (QWidget *window);
+	void windowDestroyed (QObject *window);
 	void updateWindowCaption (QWidget *window);
 	void activeAttachedChanged (QWidget *window);
 
-	void registerPart (QWidget *widget, KParts::Part *part);
+	void registerPart (QWidget *window, KParts::Part *part);
 protected:
 	void rCommandDone (RCommand *command);
 private:
 	RKWorkplaceObjectMap windows;
 	RKWorkplaceView *wview;
 	void addWindow (QWidget *window, RKWorkplaceObjectType type);
-
+	static RKWorkplace *main_workplace;
+friend class RKwardApp;
 	KParts::PartManager *part_manager;
 };
 
 /** This is a separate class mostly for future extension. right now, it's just a QTabWidget */
 class RKWorkplaceView : public QTabWidget {
 public:
-	RKWorkplaceView (QWidget *parent);
-	~RKWorkplaceView ();
+	RKWorkplaceView (QWidget *parent) : QTabWidget (parent) {};
+	~RKWorkplaceView () {};
 };
 
 #endif

Modified: trunk/rkward/rkward/rkglobals.cpp
===================================================================
--- trunk/rkward/rkward/rkglobals.cpp	2006-09-25 13:13:16 UTC (rev 760)
+++ trunk/rkward/rkward/rkglobals.cpp	2006-09-25 15:15:42 UTC (rev 761)
@@ -21,7 +21,6 @@
 RKwardApp *RKGlobals::app;
 RInterface *RKGlobals::rinter;
 RObjectList *RKGlobals::list;
-RKEditorManager *RKGlobals::manager;
 RKModificationTracker *RKGlobals::mtracker;
 RKComponentMap *RKGlobals::cmap;
 KHelpDlg *RKGlobals::helpdlg;

Modified: trunk/rkward/rkward/rkglobals.h
===================================================================
--- trunk/rkward/rkward/rkglobals.h	2006-09-25 13:13:16 UTC (rev 760)
+++ trunk/rkward/rkward/rkglobals.h	2006-09-25 15:15:42 UTC (rev 761)
@@ -20,7 +20,6 @@
 class RKwardApp;
 class RInterface;
 class RObjectList;
-class RKEditorManager;
 class RKModificationTracker;
 class RKComponentMap;
 class KHelpDlg;
@@ -47,8 +46,6 @@
 	static RInterface *rInterface () { return rinter; };
 /// static pointer to the RObjectList
 	static RObjectList *rObjectList () { return list; };
-/// static pointer to the RKEditorManager
-	static RKEditorManager *editorManager () { return manager; };
 /// static pointer to the RKModificationTracker
 	static RKModificationTracker *tracker () { return mtracker; };
 /// static pointer to the RKComponentMap
@@ -73,7 +70,6 @@
 	static RKwardApp *app;
 	static RInterface *rinter;
 	static RObjectList *list;
-	static RKEditorManager *manager;
 	static RKModificationTracker *mtracker;
 	static RKComponentMap *cmap;
 	static KHelpDlg *helpdlg;

Modified: trunk/rkward/rkward/rkward.cpp
===================================================================
--- trunk/rkward/rkward/rkward.cpp	2006-09-25 13:13:16 UTC (rev 760)
+++ trunk/rkward/rkward/rkward.cpp	2006-09-25 15:15:42 UTC (rev 761)
@@ -50,8 +50,6 @@
 
 // application specific includes
 #include "rkward.h"
-#include "rkeditormanager.h"
-#include "rkdocmanager.h" 
 #include "core/rkmodificationtracker.h"
 #include "rkwatch.h"
 #include "plugin/rkcomponentmap.h"
@@ -67,21 +65,24 @@
 #include "dialogs/rkloadlibsdialog.h"
 #include "agents/rksaveagent.h"
 #include "agents/rkloadagent.h"
-#include "windows/rkcommandeditorwindow.h"
-#include "windows/rkhtmlwindow.h"
 #include "windows/rcontrolwindow.h"
-#include "windows/detachedwindowcontainer.h"
+#include "windows/rkhtmlwindow.h"
+#include "misc/rkworkplace.h"
 #include "khelpdlg.h"
 #include "rkconsole.h"
 #include "debug.h"
 
 #include "agents/showedittextfileagent.h"	// TODO: see below: needed purely for linking!
 #include "dialogs/rkreadlinedialog.h"	// TODO: see below: needed purely for linking!
+#include "windows/detachedwindowcontainer.h"	// TODO: see below: needed purely for linking!
+#include "dataeditor/rkeditordataframepart.h"	// TODO: see below: needed purely for linking!
 
 // This nevers gets called. It's needed to trick ld into linking correctly. Nothing else.
 void bogusCalls () {
 	ShowEditTextFileAgent::showEditFiles (0);		// TODO: AAAAAAAARGGGH!!!! It won't link without this bogus line!!!
 	RKReadLineDialog::readLine (0, QString(), QString(), 0, 0);	// TODO: see above
+	new RKEditorDataFramePart (0);
+	DetachedWindowContainer (0, 0);
 }
 
 RKwardApp::RKwardApp (KURL *load_url) : DCOPObject ("rkwardapp"), KMdiMainFrm (0, 0, KMdi::IDEAlMode) {
@@ -108,8 +109,6 @@
 	setXMLFile( "rkwardui.rc" );
 	createShellGUI ( true );
 
-	RKGlobals::manager = new RKEditorManager ();
-
 	connect (this, SIGNAL (childWindowCloseRequest (KMdiChildView *)), this, SLOT (slotChildWindowCloseRequest (KMdiChildView *)));
 
 	RKGlobals::mtracker = new RKModificationTracker (this);
@@ -120,14 +119,24 @@
 	startup_timer = new QTimer (this);
 	startup_timer->start (50);
 	connect (startup_timer, SIGNAL (timeout ()), this, SLOT (doPostInit ()));
+
+	KMdiChildView *dummy = new KMdiChildView (this);
+	QVBoxLayout *layout = new QVBoxLayout (dummy);
+	addWindow (dummy);
+	new RKWorkplace (dummy);
+	layout->addWidget (RKWorkplace::mainWorkplace ()->view ());
+	connect (RKWorkplace::mainWorkplace ()->part_manager, SIGNAL (partAdded (KParts::Part *)), this, SLOT (partAdded (KParts::Part *)));
+	connect (RKWorkplace::mainWorkplace ()->part_manager, SIGNAL (partRemoved (KParts::Part *)), this, SLOT (partRemoved (KParts::Part *)));
+	connect (RKWorkplace::mainWorkplace (), SIGNAL (changeGUI (KParts::Part *)), this, SLOT (createGUI (KParts::Part *)));
+	connect (RKWorkplace::mainWorkplace (), SIGNAL (changeCaption (const QString &)), this, SLOT (setCaption (const QString &)));
 	
 
-	m_manager = new KParts::PartManager( this );
+	toolviews_manager = new KParts::PartManager( this );
 	// When the manager says the active part changes,
 	// the builder updates (recreates) the GUI
-	connect (m_manager, SIGNAL (activePartChanged (KParts::Part *)), this, SLOT (createGUI (KParts::Part *)));
-	connect (m_manager, SIGNAL (partAdded (KParts::Part *)), this, SLOT (partAdded (KParts::Part *)));
-	connect (m_manager, SIGNAL (partRemoved (KParts::Part *)), this, SLOT (partRemoved (KParts::Part *)));
+	connect (toolviews_manager, SIGNAL (activePartChanged (KParts::Part *)), this, SLOT (createGUI (KParts::Part *)));
+	connect (toolviews_manager, SIGNAL (partAdded (KParts::Part *)), this, SLOT (partAdded (KParts::Part *)));
+	connect (toolviews_manager, SIGNAL (partRemoved (KParts::Part *)), this, SLOT (partRemoved (KParts::Part *)));
 	// a few calls to setCaption too many result from the lines below, but it seems to be the only way to catch all cases where the caption should be changed
 	connect (this, SIGNAL (viewActivated (KMdiChildView *)), this, SLOT (viewChanged (KMdiChildView *)));
 	connect (this, SIGNAL (viewDeactivated (KMdiChildView *)), this, SLOT (viewChanged (KMdiChildView *)));
@@ -152,7 +161,6 @@
 	delete RKGlobals::rObjectList ();
 	delete object_browser;
 	delete RKGlobals::tracker ();
-	delete RKGlobals::editorManager ();
 }
 
 void RKwardApp::doPostInit () {
@@ -191,7 +199,7 @@
 	consolepart->widget ()->setIcon (SmallIcon ("konsole"));
 	consolepart->widget ()->setName ("r_console");
 	addToolWindow (consolepart->widget (), KDockWidget::DockBottom, getMainDockWidget (), 10);
-	m_manager->addPart (consolepart, false);
+	toolviews_manager->addPart (consolepart, false);
 	
 	RKGlobals::helpdlg = new KHelpDlg (0);
 	RKGlobals::helpDialog ()->setIcon (SmallIcon ("help"));
@@ -210,7 +218,7 @@
 		} else if (result->result == StartupDialog::EmptyTable) {
 			RObject *object = RKGlobals::rObjectList ()->createNewChild (i18n ("my.data"), 0, true, true);
 			// usually an explicit call to activateView should not be necessary. Somehow however, here, it is.
-			RKGlobals::editorManager ()->editObject (object, true);
+			RKWorkplace::mainWorkplace ()->editObject (object, true);
 		}
 		delete result;
 	}
@@ -469,19 +477,9 @@
 		}
 	}
 
-// generate a (copy) list of all child views (detached or not)
-	QValueList<KMdiChildView *> child_copy;
-	for (KMdiChildView *w = m_pDocumentViews->first ();w;w= m_pDocumentViews->next ()){
-		child_copy.append (w);
-	}
-	for (KMdiChildView *w = DetachedWindowContainer::detachedWindows ()->first (); w; w = DetachedWindowContainer::detachedWindows ()->next ()) {
-		child_copy.append (w);
-	}
-
-// try to close all the children
-	QValueListIterator<KMdiChildView *> childIt;
-	for (childIt = child_copy.begin (); childIt != child_copy.end (); ++childIt) {
-		if (!(*childIt)->close ()) {
+	RKWorkplace::RKWorkplaceObjectMap map = RKWorkplace::mainWorkplace ()->getObjectList ();
+	for (RKWorkplace::RKWorkplaceObjectMap::const_iterator it = map.constBegin (); it != map.constEnd (); ++it){
+		if (!it.key ()->close ()) {
 			// If a child refuses to close, we return false.
 			slotSetStatusReady ();
 			return false;
@@ -522,7 +520,7 @@
 		QString valid = RKGlobals::rObjectList ()->validizeName (name);
 		if (valid != name) KMessageBox::sorry (this, i18n ("The name you specified was already in use or not valid. Renamed to %1").arg (valid), i18n ("Invalid Name"));
 		RObject *object = RKGlobals::rObjectList ()->createNewChild (valid, 0, true, true);
-		RKGlobals::editorManager ()->editObject (object, true);
+		RKWorkplace::mainWorkplace ()->editObject (object, true);
 	}
 	
 }
@@ -602,37 +600,25 @@
 void RKwardApp::slotCloseWindow () {
 	RK_TRACE (APP);
 
-	closeActiveView ();
+	RKWorkplace::mainWorkplace ()->closeActiveWindow ();
 }
 
 void RKwardApp::slotCloseAllWindows () {
 	RK_TRACE (APP);
 
-	closeAllViews ();
+	RKWorkplace::mainWorkplace ()->closeAll ();
 }
 
 void RKwardApp::slotCloseAllEditors () {
 	RK_TRACE (APP);
 
-	RKGlobals::editorManager ()->closeAll ();
+	RKWorkplace::mainWorkplace ()->closeAll (RKWorkplace::DataEditorWindow);
 }
 
 void RKwardApp::slotDetachWindow () {
 	RK_TRACE (APP);
 
-	KMdiChildView *window = activeWindow ();
-	if (window) {
-		KParts::Part *part = m_manager->activePart ();
-		if (part) {
-			m_manager->removePart (part);
-			removeWindowFromMdi (window);
-			m_pDocumentViews->remove (window);			// WORKAROUND: shouldn't this happen automatically in the above call? Apparently not so.
-			DetachedWindowContainer *detached = new DetachedWindowContainer (part, window);
-			detached->show ();
-		} else{
-			RK_ASSERT (false);
-		}
-	}
+	RKWorkplace::mainWorkplace ()->detachWindow (RKWorkplace::mainWorkplace ()->activeAttachedWindow ());
 }
 
 void RKwardApp::newOutput () {
@@ -654,31 +640,19 @@
 
 void RKwardApp::slotNewCommandEditor () {
 	RK_TRACE (APP);
-	RKCommandEditorWindow *editor = new RKCommandEditorWindow;
-	addWindow (editor);
-	editor->activate ();
+
+	slotOpenCommandEditor (KURL ());
 }
 
 void RKwardApp::slotOpenCommandEditor (const KURL &url) {
 	RK_TRACE (APP);
-	RKCommandEditorWindow *editor;
 
-	editor = new RKCommandEditorWindow;
-
-	if (!editor->openURL (url)) {
-		QString errstr = i18n ("Unable to open \"%1\"").arg (url.prettyURL ());
-
-		KMessageBox::messageBox (this, KMessageBox::Error, errstr, i18n ("Could not open command file"));
-		delete editor;
-		return;
+	if (RKWorkplace::mainWorkplace ()->openScriptEditor (url)) {
+		fileOpenRecent->addURL (url);
 	}
-
-	fileOpenRecent->addURL (url);
-	addWindow (editor);
-	editor->activate ();
 };
 
-void RKwardApp::slotOpenCommandEditor (){
+void RKwardApp::slotOpenCommandEditor () {
 	RK_TRACE (APP);
 	KURL::List urls;
 	KURL::List::const_iterator it;
@@ -696,10 +670,10 @@
 	closeWindow (window);
 }
 
-void RKwardApp::openHTML(const KURL &url) {
+void RKwardApp::openHTML (const KURL &url) {
 	RK_TRACE (APP);
-	RKHelpWindow *hw = new RKHelpWindow (this);
-	hw->openURL (url);
+
+	RKWorkplace::mainWorkplace ()->openHelpWindow (url);
 }
 
 void RKwardApp::openHTMLHelp (const QString & url) {
@@ -718,8 +692,9 @@
 	QString wcaption = RKGlobals::rObjectList ()->getWorkspaceURL ().fileName ();
 	if (wcaption.isEmpty ()) wcaption = RKGlobals::rObjectList ()->getWorkspaceURL ().prettyURL ();
 	if (wcaption.isEmpty ()) wcaption = i18n ("[Unnamed Workspace]");
-	if (activeWindow ()) {
-		wcaption.append (" - " + activeWindow ()->caption ());
+	QWidget *aw = RKWorkplace::mainWorkplace ()->activeAttachedWindow ();
+	if (aw) {
+		wcaption.append (" - " + aw->caption ());
 	}
 	KMdiMainFrm::setCaption (wcaption);
 }

Modified: trunk/rkward/rkward/rkward.h
===================================================================
--- trunk/rkward/rkward/rkward.h	2006-09-25 13:13:16 UTC (rev 760)
+++ trunk/rkward/rkward/rkward.h	2006-09-25 15:15:42 UTC (rev 761)
@@ -103,7 +103,7 @@
 /** returns a pointer to the menu-list (in essence the menu-bar) */
 	RKMenuList* getMenuList () { return menu_list; };
 
-	KParts::PartManager *m_manager;
+	KParts::PartManager *toolviews_manager;
 protected:
 	void openWorkspace (const KURL &url);
 	/** save Options/Settings. Includes general Options like all bar positions and status as well as the geometry and the recent file list */
@@ -136,7 +136,9 @@
 	// TODO: defunct!! Find out what this is really for.
 	*/
 	virtual void readProperties(KConfig *_cfg);
-
+signals:
+/** no idea, why we have to declare this explicitly, but somehow we do. */
+       void childWindowCloseRequest (KMdiChildView *);
 public slots:
 	/** Raise the help search window */
 	void showHelpSearch ();
@@ -253,14 +255,6 @@
 	friend class RInterface;
 /** set the R status message ("R engine idel/busy") to idle or busy */
 	void setRStatus (bool busy);
-
-	/** refreshes the output.
-	@param show if set to true, the output-window will be shown / raised. If set to false, the visibility will not be changed
-	@param raise like show. If set to true, the output-window - if already shown - will additionally be raised */
-	void refreshOutput (bool show, bool raise);
-signals:
-/** no idea, why we have to declare this explicitly, but somehow we do. */
-	void childWindowCloseRequest (KMdiChildView *);
 };
 
 #endif // RKWARD_H

Modified: trunk/rkward/rkward/robjectbrowser.cpp
===================================================================
--- trunk/rkward/rkward/robjectbrowser.cpp	2006-09-25 13:13:16 UTC (rev 760)
+++ trunk/rkward/rkward/robjectbrowser.cpp	2006-09-25 15:15:42 UTC (rev 761)
@@ -32,6 +32,7 @@
 #include "core/robjectlist.h"
 #include "core/rkmodificationtracker.h"
 #include "misc/rkobjectlistview.h"
+#include "misc/rkworkplace.h"
 #include "dataeditor/rkeditor.h"
 #include "robjectviewer.h"
 
@@ -76,11 +77,11 @@
 }
 
 void RObjectBrowser::popupEdit () {
-	if (list_view->menuObject ()) RKGlobals::editorManager ()->editObject (list_view->menuObject ());
+	if (list_view->menuObject ()) RKWorkplace::mainWorkplace ()->editObject (list_view->menuObject ());
 }
 
 void RObjectBrowser::popupView () {
-	RKGlobals::editorManager ()->flushAll ();
+	RKWorkplace::mainWorkplace ()->flushAllData ();
 	new RObjectViewer (0, list_view->menuObject ());
 }
 
@@ -113,22 +114,22 @@
 	}
 
 	menu->setItemVisible (Edit, true);
-	menu->setItemEnabled (Edit, RKGlobals::editorManager ()->canEditObject (object));
+	menu->setItemEnabled (Edit, RKWorkplace::mainWorkplace ()->canEditObject (object));
 	menu->setItemVisible (View, true);
 	menu->setItemVisible (Rename, true);
 	menu->setItemVisible (Delete, true);
 }
 
-void RObjectBrowser::slotListDoubleClicked (QListViewItem *item, const QPoint &, int)
-{
+void RObjectBrowser::slotListDoubleClicked (QListViewItem *item, const QPoint &, int) {
 	RObject *object = list_view->findItemObject (static_cast<RKListViewItem*> (item));
 	
 	if (!object) return;
 	if (object == RKGlobals::rObjectList ()) return;
-	if (!RKGlobals::rkApp ()->activeWindow ()) return;	// yes, apparently this can happen!
+	QWidget *w = RKWorkplace::mainWorkplace ()->activeAttachedWindow ();
+	if (!w) return;
 	
-	if ((RKGlobals::rkApp ()->activeWindow ())->inherits ("RKCommandEditorWindow")) {
-		static_cast<RKCommandEditorWindow*> (RKGlobals::rkApp ()->activeWindow ())->insertText (object->getFullName ());
+	if (w->inherits ("RKCommandEditorWindow")) {
+		static_cast<RKCommandEditorWindow*> (w)->insertText (object->getFullName ());
 	}
 }
 

Modified: trunk/rkward/rkward/windows/detachedwindowcontainer.cpp
===================================================================
--- trunk/rkward/rkward/windows/detachedwindowcontainer.cpp	2006-09-25 13:13:16 UTC (rev 760)
+++ trunk/rkward/rkward/windows/detachedwindowcontainer.cpp	2006-09-25 15:15:42 UTC (rev 761)
@@ -17,20 +17,18 @@
 
 #include "detachedwindowcontainer.h"
 
-#include <kmdichildview.h>
 #include <klocale.h>
 #include <kstdaction.h>
 
 #include <qlayout.h>
+#include <qwidget.h>
 
 #include "../rkward.h"
+#include "../misc/rkworkplace.h"
 #include "../rkglobals.h"
 #include "../debug.h"
 
-//static
-QPtrList<KMdiChildView> DetachedWindowContainer::detached_windows;
-
-DetachedWindowContainer::DetachedWindowContainer (KParts::Part *part_to_capture, KMdiChildView *widget_to_capture) : KParts::MainWindow  (RKGlobals::rkApp ()) {
+DetachedWindowContainer::DetachedWindowContainer (KParts::Part *part_to_capture, QWidget *widget_to_capture) : KParts::MainWindow  (RKGlobals::rkApp ()) {
 	RK_TRACE (APP);
 
 // create own GUI
@@ -45,20 +43,14 @@
 	setCentralWidget (widget_to_capture);
 	createGUI (part_to_capture);
 
-// add widget to list of detached windows
-	detached_windows.append (widget_to_capture);
 // should self-destruct, when child widget is destroyed
 	connect (widget_to_capture, SIGNAL (destroyed (QObject *)), this, SLOT (viewDestroyed (QObject *)));
-	connect (widget_to_capture, SIGNAL (windowCaptionChanged (const QString&)), this, SLOT (setCaption (const QString&)));
+	connect (widget_to_capture, SIGNAL (captionChanged (QWidget *)), this, SLOT (updateCaption (QWidget *)));
 	setCaption (widget_to_capture->caption ());	// has to come after createGUI!
-
-	emit (detached (widget_to_capture));
 }
 
 DetachedWindowContainer::~DetachedWindowContainer () {
 	RK_TRACE (APP);
-
-	detached_windows.remove (static_cast<KMdiChildView*> (centralWidget ()));
 }
 
 void DetachedWindowContainer::viewDestroyed (QObject *) {
@@ -67,18 +59,19 @@
 	delete this;
 }
 
-void DetachedWindowContainer::slotReattach () {
+void DetachedWindowContainer::updateCaption (QWidget *widget) {
 	RK_TRACE (APP);
+	RK_ASSERT (widget = centralWidget ());
 
-	KMdiChildView *view = static_cast<KMdiChildView *> (centralWidget ());
+	setCaption (widget->caption ());
+}
 
-	view->reparent (0, QPoint (0, 0));
-	RKGlobals::rkApp ()->addWindow (view);
-	RKGlobals::rkApp ()->m_manager->addPart (part);
-	view->show ();
-	view->setFocus ();
+void DetachedWindowContainer::slotReattach () {
+	RK_TRACE (APP);
 
-	emit (reattached (view));
+	QWidget *window = centralWidget ();
+	window->reparent (0, QPoint (0, 0));
+	RKWorkplace::mainWorkplace ()->attachWindow (window);
 
 	delete this;
 }

Modified: trunk/rkward/rkward/windows/detachedwindowcontainer.h
===================================================================
--- trunk/rkward/rkward/windows/detachedwindowcontainer.h	2006-09-25 13:13:16 UTC (rev 760)
+++ trunk/rkward/rkward/windows/detachedwindowcontainer.h	2006-09-25 15:15:42 UTC (rev 761)
@@ -21,10 +21,8 @@
 #include <kparts/part.h>
 #include <kparts/mainwindow.h>
 
-#include <qptrlist.h>
+class QWidget;
 
-class KMdiChildView;
-
 /** This class can be used host a (part) window detached from the main window. @see RKwardApp::slotDetachWindow ().
 
 @author Thomas Friedrichsmeier
@@ -35,22 +33,17 @@
 /** constructor.
 @param part_to_capture The part to use to create the GUI in the detached window
 @param widget_to_capture The view to reparent into the detached window */
-	DetachedWindowContainer (KParts::Part *part_to_capture, KMdiChildView *widget_to_capture);
+	DetachedWindowContainer (KParts::Part *part_to_capture, QWidget *widget_to_capture);
 /** destructor. Usually you don't call this explicitely, but rather delete/close the child view. The DetachedWindowContainer will then self destruct */
 	~DetachedWindowContainer ();
 
-/** static list of all detached windows */
-	static QPtrList<KMdiChildView> *detachedWindows () { return &detached_windows; };
-signals:
-	void detached (KMdiChildView *widget);
-	void reattached (KMdiChildView *widget);
 public slots:
 /** self-destruct, when child view is destroyed */
 	void viewDestroyed (QObject *view);
 /** re-attach to the main window */
 	void slotReattach ();
+	void updateCaption (QWidget *);
 private:
-	static QPtrList<KMdiChildView> detached_windows;
 	KParts::Part *part;
 };
 

Modified: trunk/rkward/rkward/windows/rkcommandeditorwindow.cpp
===================================================================
--- trunk/rkward/rkward/windows/rkcommandeditorwindow.cpp	2006-09-25 13:13:16 UTC (rev 760)
+++ trunk/rkward/rkward/windows/rkcommandeditorwindow.cpp	2006-09-25 15:15:42 UTC (rev 761)
@@ -47,6 +47,7 @@
 
 #include "../rkeditormanager.h"
 #include "../misc/rkcommonfunctions.h"
+#include "../misc/rkworkplace.h"
 #include "../rkglobals.h"
 #include "../rkward.h"
 #include "../khelpdlg.h"
@@ -56,7 +57,7 @@
 
 #define GET_HELP_URL 1
 
-RKCommandEditorWindow::RKCommandEditorWindow (QWidget *parent, bool use_r_highlighting) : KMdiChildView (parent) {
+RKCommandEditorWindow::RKCommandEditorWindow (QWidget *parent, bool use_r_highlighting) : QWidget (parent) {
 	RK_TRACE (COMMANDEDITOR);
 
 	KLibFactory *factory = KLibLoader::self()->factory( "libkatepart" );
@@ -73,8 +74,6 @@
 
 	m_doc->insertChildClient (new RKCommandEditorWindowPart (m_view, this));
 
-	RKGlobals::rkApp()->m_manager->addPart(m_doc, false);
-
 	QHBoxLayout *pLayout = new QHBoxLayout( this, 0, -1, "layout");
 	pLayout->addWidget(m_view);
 
@@ -92,7 +91,7 @@
 
 void RKCommandEditorWindow::closeEvent (QCloseEvent *e) {
 	if (isModified ()) {
-		int status = KMessageBox::warningYesNo (this, i18n ("The document \"%1\" has been modified. Close it anyway?").arg (tabCaption ()), i18n ("File not saved"));
+		int status = KMessageBox::warningYesNo (this, i18n ("The document \"%1\" has been modified. Close it anyway?").arg (caption ()), i18n ("File not saved"));
 	
 		if (status != KMessageBox::Yes) {
 			e->ignore ();
@@ -100,7 +99,7 @@
 		}
 	}
 
-	KMdiChildView::closeEvent (e);
+	QWidget::closeEvent (e);
 }
 
 void RKCommandEditorWindow::setRHighlighting () {
@@ -178,7 +177,8 @@
 	if (name.isEmpty ()) name = i18n ("Unnamed");
 	if (isModified ()) name.append (i18n (" [modified]"));
 
-	setMDICaption (name);
+	setCaption (name);
+	RKWorkplace::mainWorkplace ()->updateWindowCaption (this);
 }
 
 void RKCommandEditorWindow::showHelp () {

Modified: trunk/rkward/rkward/windows/rkcommandeditorwindow.h
===================================================================
--- trunk/rkward/rkward/windows/rkcommandeditorwindow.h	2006-09-25 13:13:16 UTC (rev 760)
+++ trunk/rkward/rkward/windows/rkcommandeditorwindow.h	2006-09-25 15:15:42 UTC (rev 761)
@@ -23,7 +23,6 @@
 #include <kate/view.h>
 #include <kate/document.h>
 #include <kurl.h>
-#include <kmdichildview.h>
 
 /**
 	\brief Provides an editor window for R-commands, as well as a text-editor window in general.
@@ -32,7 +31,7 @@
 
 @author Pierre Ecochard
 */
-class RKCommandEditorWindow : public KMdiChildView {
+class RKCommandEditorWindow : public QWidget {
 // we need the Q_OBJECT thing for some inherits ("RKCommandEditorWindow")-calls in rkward.cpp.
 	Q_OBJECT
 public:
@@ -61,6 +60,8 @@
 	void setText (const QString &text);
 /** copy current selection. Wrapper for use by external classes */
 	void copy ();
+
+	KParts::Part *getPart () { return m_doc; };
 public slots:
 /** update Tab caption according to the current url. Display the filename-component of the URL, or - if not available - a more elaborate description of the url. Also appends a "[modified]" if approriate */
 	void updateCaption ();

Modified: trunk/rkward/rkward/windows/rkhtmlwindow.cpp
===================================================================
--- trunk/rkward/rkward/windows/rkhtmlwindow.cpp	2006-09-25 13:13:16 UTC (rev 760)
+++ trunk/rkward/rkward/windows/rkhtmlwindow.cpp	2006-09-25 15:15:42 UTC (rev 761)
@@ -34,6 +34,7 @@
 #include "../rkward.h"
 #include "../settings/rksettingsmodulegeneral.h"
 #include "../misc/rkcommonfunctions.h"
+#include "../misc/rkworkplace.h"
 #include "../debug.h"
 
 RKHTMLWindow::RKHTMLWindow (QWidget *parent) : KMdiChildView (parent) {
@@ -173,7 +174,7 @@
 	print->setText (i18n ("Print Output"));
 	addCommonActions (actionCollection ());
 
-	RKGlobals::rkApp ()->m_manager->addPart (khtmlpart);
+	emit (partCreated (this, khtmlpart));
 
 	KAction *action = khtmlpart->action ("saveDocument");
 	if (action) action->setText (i18n ("Save Output as HTML"));
@@ -231,7 +232,8 @@
 	RK_TRACE (APP);
 	
 	if (!current_output) {
-		current_output = new RKOutputWindow (RKGlobals::rkApp ());
+		current_output = new RKOutputWindow (RKWorkplace::mainWorkplace ()->view ());
+#warning need to register the window!
 
 		KURL url (RKSettingsModuleGeneral::filesPath () + "/rk_out.html");
 		current_output->openURL (url);
@@ -290,7 +292,7 @@
 	setMDICaption (i18n ("R Help"));
 	RKGlobals::rkApp ()->addWindow (this);
 
-	RKGlobals::rkApp ()->m_manager->addPart (khtmlpart);
+	emit (partCreated (this, khtmlpart));
 }
 
 RKHelpWindow::~RKHelpWindow () {

Modified: trunk/rkward/rkward/windows/rkhtmlwindow.h
===================================================================
--- trunk/rkward/rkward/windows/rkhtmlwindow.h	2006-09-25 13:13:16 UTC (rev 760)
+++ trunk/rkward/rkward/windows/rkhtmlwindow.h	2006-09-25 15:15:42 UTC (rev 761)
@@ -53,6 +53,8 @@
 /** Add common actions to the given action collection (currently only "copy")
 @param action_collection A KActionCollection to insert actions in. */
 	void addCommonActions (KActionCollection *action_collection);
+signals:
+	void partCreated (QWidget *widget, KParts::Part *part);
 public slots:
 /** this is used for browsing only. Use openURL instead, when calling from outside. */
 	void slotOpenURLRequest (const KURL &url, const KParts::URLArgs &);


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