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

tfry at users.sourceforge.net tfry at users.sourceforge.net
Tue Sep 26 16:53:44 UTC 2006


Revision: 763
          http://svn.sourceforge.net/rkward/?rev=763&view=rev
Author:   tfry
Date:     2006-09-26 09:53:29 -0700 (Tue, 26 Sep 2006)

Log Message:
-----------
More work on new document MDI

Modified Paths:
--------------
    trunk/rkward/rkward/dataeditor/rkeditor.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/rkward.cpp
    trunk/rkward/rkward/windows/Makefile.am
    trunk/rkward/rkward/windows/rkcommandeditorwindow.cpp
    trunk/rkward/rkward/windows/rkcommandeditorwindow.h
    trunk/rkward/rkward/windows/rkhtmlwindow.cpp
    trunk/rkward/rkward/windows/rkhtmlwindow.h

Added Paths:
-----------
    trunk/rkward/rkward/windows/rkmdiwindow.cpp
    trunk/rkward/rkward/windows/rkmdiwindow.h
    trunk/rkward/rkward/windows/rkworkplaceview.cpp
    trunk/rkward/rkward/windows/rkworkplaceview.h

Modified: trunk/rkward/rkward/dataeditor/rkeditor.cpp
===================================================================
--- trunk/rkward/rkward/dataeditor/rkeditor.cpp	2006-09-25 17:57:13 UTC (rev 762)
+++ trunk/rkward/rkward/dataeditor/rkeditor.cpp	2006-09-26 16:53:29 UTC (rev 763)
@@ -16,7 +16,7 @@
  ***************************************************************************/
 #include "rkeditor.h"
 
-RKEditor::RKEditor (QWidget *parent) : RKMDIWindow (parent, RKWorkplace::DataEditorWindow) {
+RKEditor::RKEditor (QWidget *parent) : RKMDIWindow (parent, RKMDIWindow::DataEditorWindow) {
 }
 
 

Modified: trunk/rkward/rkward/dataeditor/rkeditor.h
===================================================================
--- trunk/rkward/rkward/dataeditor/rkeditor.h	2006-09-25 17:57:13 UTC (rev 762)
+++ trunk/rkward/rkward/dataeditor/rkeditor.h	2006-09-26 16:53:29 UTC (rev 763)
@@ -24,7 +24,7 @@
 #include <kparts/part.h>
 #include <kmdichildview.h>
 
-#include "../misc/rkworkplace.h"
+#include "../windows/rkmdiwindow.h"
 
 class RCommandChain;
 class RKDrag;

Modified: trunk/rkward/rkward/dataeditor/rkeditordataframe.cpp
===================================================================
--- trunk/rkward/rkward/dataeditor/rkeditordataframe.cpp	2006-09-25 17:57:13 UTC (rev 762)
+++ trunk/rkward/rkward/dataeditor/rkeditordataframe.cpp	2006-09-26 16:53:29 UTC (rev 763)
@@ -259,7 +259,6 @@
 	
 	if (object == getObject ()) {
 		setCaption (object->getShortName ());
-		RKWorkplace::mainWorkplace ()->updateWindowCaption (this);
 		return;
 	}
 

Modified: trunk/rkward/rkward/misc/rkworkplace.cpp
===================================================================
--- trunk/rkward/rkward/misc/rkworkplace.cpp	2006-09-25 17:57:13 UTC (rev 762)
+++ trunk/rkward/rkward/misc/rkworkplace.cpp	2006-09-26 16:53:29 UTC (rev 763)
@@ -25,6 +25,7 @@
 #include "../windows/detachedwindowcontainer.h"
 #include "../windows/rkcommandeditorwindow.h"
 #include "../windows/rkhtmlwindow.h"
+#include "../windows/rkworkplaceview.h"
 #include "../core/robject.h"
 #include "../core/rcontainerobject.h"
 #include "../core/robjectlist.h"
@@ -45,29 +46,22 @@
 
 	main_workplace = this;
 	wview = new RKWorkplaceView (parent);
-	connect (wview, SIGNAL (currentChanged (QWidget *)), this, SLOT (activeAttachedChanged (QWidget *)));
 	part_manager = new KParts::PartManager (RKGlobals::rkApp ());
 }
 
 RKWorkplace::~RKWorkplace () {
 	RK_TRACE (APP);
 
-	closeAll ();
+//	closeAll ();	// not needed, as the windows will autodelete themselves using QObject mechanism. Of course, closeAll () should be called *before* quitting.
 }
 
 void RKWorkplace::attachWindow (RKMDIWindow *window) {
 	RK_TRACE (APP);
 	RK_ASSERT (windows.find (window) != windows.end ());		// This should not happen for now.
 
-	connect (window, SIGNAL (captionChanged (RKMDIWindow *)), this, SLOT (updateWindowCaption (RKMDIWindow *)));
-	window->state = Attached;
+	window->state = RKMDIWindow::Attached;
+	view ()->addPage (window);
 
-	window->reparent (view (), QPoint (0, 0));
-	view ()->addTab (window, *(window->icon ()), window->shortCaption ());
-	window->show ();
-	view ()->setCurrentPage (view ()->indexOf (window));
-	window->setFocus ();
-
 	RK_ASSERT (window->getPart ());
 	part_manager->addPart (window->getPart ());
 }
@@ -76,8 +70,7 @@
 	RK_TRACE (APP);
 	RK_ASSERT (windows.find (window) != windows.end ());		// Can't detach a window that is not attached
 
-	disconnect (window, SIGNAL (captionChanged (RKMDIWindow *)), this, SLOT (updateWindowCaption (RKMDIWindow *)));
-	window->state = Detached;
+	window->state = RKMDIWindow::Detached;
 
 	RK_ASSERT (window->getPart ());
 	part_manager->removePart (window->getPart ());
@@ -90,9 +83,8 @@
 void RKWorkplace::addWindow (RKMDIWindow *window) {
 	RK_TRACE (APP);
 
-	connect (window, SIGNAL (destroyed (QObject *)), this, SLOT (windowDestroyed (QObject *)));
-
 	windows.append (window);
+	connect (window, SIGNAL (destroyed (QObject *)), this, SLOT (windowDestroyed (QObject *)));
 	attachWindow (window);
 }
 
@@ -191,7 +183,7 @@
 	RK_TRACE (APP);
 
 	for (RKWorkplaceObjectList::const_iterator it = windows.constBegin (); it != windows.constEnd (); ++it) {
-		if ((*it)->type == DataEditorWindow) {
+		if ((*it)->type == RKMDIWindow::DataEditorWindow) {
 			static_cast<RKEditor *> (*it)->flushChanges ();
 		}
 	}
@@ -232,30 +224,14 @@
 	RKMDIWindow *window = static_cast<RKMDIWindow *> (object);
 
 	RK_ASSERT (windows.find (window) != windows.end ());
+	view ()->removePage (window, true);
 	windows.remove (window);
 }
 
-void RKWorkplace::updateWindowCaption (RKMDIWindow *window) {
-	RK_TRACE (APP);
-
-	RK_ASSERT (windows.find (window) != windows.end ());
-	view ()->changeTab (window, window->shortCaption ());
-	if (window == activeAttachedWindow ()) emit (changeCaption ());
-}
-
-void RKWorkplace::activeAttachedChanged (QWidget *window) {
-	RK_TRACE (APP);
-	RKMDIWindow *w = static_cast<RKMDIWindow *>(window);
-	RK_ASSERT (windows.find (w) != windows.end ());
-	RK_ASSERT (window);
-
-	emit (changeCaption ());
-}
-
 RKMDIWindow *RKWorkplace::activeAttachedWindow () {
 	RK_TRACE (APP);
 
-	return (static_cast<RKMDIWindow *> (view ()->currentPage ()));
+	return (static_cast<RKMDIWindow *> (view ()->activePage ()));
 }
 
 void RKWorkplace::activateWindow (RKMDIWindow *window) {

Modified: trunk/rkward/rkward/misc/rkworkplace.h
===================================================================
--- trunk/rkward/rkward/misc/rkworkplace.h	2006-09-25 17:57:13 UTC (rev 762)
+++ trunk/rkward/rkward/misc/rkworkplace.h	2006-09-26 16:53:29 UTC (rev 763)
@@ -25,6 +25,7 @@
 #include <kurl.h>
 #include <kparts/part.h>
 
+#include "../windows/rkmdiwindow.h"
 #include "../rbackend/rcommandreceiver.h"
 
 class RObject;
@@ -32,7 +33,6 @@
 class RKWorkplaceView;
 class KParts::PartManager;
 class RKEditor;
-class RKMDIWindow;
 
 /** This class (only one instance will probably be around) keeps track of which windows are opened in the
 workplace, which are detached, etc. Will replace RKEditorManager.
@@ -46,20 +46,6 @@
 	RKWorkplace (QWidget *parent);
 	~RKWorkplace ();
 
-	enum ObjectType {
-		DataEditorWindow=1,
-		CommandEditorWindow=2,
-		OutputWindow=4,
-		HelpWindow=8,
-		AnyType=DataEditorWindow | CommandEditorWindow | OutputWindow | HelpWindow
-	};
-	
-	enum ObjectState {
-		Attached=1,
-		Detached=2,
-		AnyState=Attached | Detached
-	};
-
 	RKWorkplaceView *view () { return wview; };
 
 	typedef QValueList<RKMDIWindow *> RKWorkplaceObjectList;
@@ -86,19 +72,16 @@
 /** Closes all windows of the given type(s). Default call (no arguments) closes all windows
 @param type: A bitwise OR of RKWorkplaceObjectType
 @param state: A bitwise OR of RKWorkplaceObjectState */
-	void closeAll (int type=AnyType, int state=AnyState);
+	void closeAll (int type=RKMDIWindow::AnyType, int state=RKMDIWindow::AnyState);
 
 	void saveWorkplace (RCommandChain *chain=0);
 	void restoreWorkplace (RCommandChain *chain=0);
 
 	static RKWorkplace *mainWorkplace () { return main_workplace; };
 signals:
-	void lastWindowClosed ();
-	void changeCaption ();
+	void lastWindowClosed ();		// TODO: unused so far
 public slots:
 	void windowDestroyed (QObject *window);
-	void updateWindowCaption (RKMDIWindow *window);
-	void activeAttachedChanged (QWidget *window);
 protected:
 	void rCommandDone (RCommand *command);
 private:
@@ -110,32 +93,4 @@
 	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) : QTabWidget (parent) {};
-	~RKWorkplaceView () {};
-};
-
-class RKMDIWindow : public QWidget {
-	Q_OBJECT
-protected:
-	RKMDIWindow (QWidget *parent, RKWorkplace::ObjectType type) : QWidget (parent) { RKMDIWindow::type=type; state=RKWorkplace::Attached; };
-	~RKMDIWindow () {};
-public:
-	virtual bool isModified () = 0;
-	virtual QString fullCaption () { return shortCaption (); };
-	virtual QString shortCaption () { return caption (); };
-	virtual KParts::Part *getPart () = 0;
-	void setCaption (const QString &caption) { QWidget::setCaption (caption); emit (captionChanged (this)); };
-	virtual QWidget *getWindow () { return getPart ()->widget (); };
-signals:
-	void captionChanged (RKMDIWindow *);
-protected:
-friend class RKWorkplace;
-	RKWorkplace::ObjectType type;
-private:
-	RKWorkplace::ObjectState state;
-};
-
 #endif

Modified: trunk/rkward/rkward/rkward.cpp
===================================================================
--- trunk/rkward/rkward/rkward.cpp	2006-09-25 17:57:13 UTC (rev 762)
+++ trunk/rkward/rkward/rkward.cpp	2006-09-26 16:53:29 UTC (rev 763)
@@ -67,6 +67,7 @@
 #include "agents/rkloadagent.h"
 #include "windows/rcontrolwindow.h"
 #include "windows/rkhtmlwindow.h"
+#include "windows/rkworkplaceview.h"
 #include "misc/rkworkplace.h"
 #include "khelpdlg.h"
 #include "rkconsole.h"
@@ -83,6 +84,7 @@
 	RKReadLineDialog::readLine (0, QString(), QString(), 0, 0);	// TODO: see above
 	new RKEditorDataFramePart (0);
 	DetachedWindowContainer (0);
+	new RKWorkplaceView (0);
 }
 
 RKwardApp::RKwardApp (KURL *load_url) : DCOPObject ("rkwardapp"), KMdiMainFrm (0, 0, KMdi::IDEAlMode) {
@@ -128,7 +130,7 @@
 	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 ()->part_manager, SIGNAL (activePartChanged (KParts::Part *)), this, SLOT (createGUI (KParts::Part *)));
-	connect (RKWorkplace::mainWorkplace (), SIGNAL (changeCaption (const QString &)), this, SLOT (setCaption (const QString &)));
+	connect (RKWorkplace::mainWorkplace ()->view (), SIGNAL (captionChanged (const QString &)), this, SLOT (setCaption (const QString &)));
 	
 
 	toolviews_manager = new KParts::PartManager( this );
@@ -147,6 +149,7 @@
 	}
 }
 
+#warning Obsolete, remove
 void RKwardApp::addWindow (KMdiChildView *view, int flags) {
 	RK_TRACE (APP);
 
@@ -612,7 +615,7 @@
 void RKwardApp::slotCloseAllEditors () {
 	RK_TRACE (APP);
 
-	RKWorkplace::mainWorkplace ()->closeAll (RKWorkplace::DataEditorWindow);
+	RKWorkplace::mainWorkplace ()->closeAll (RKMDIWindow::DataEditorWindow);
 }
 
 void RKwardApp::slotDetachWindow () {
@@ -692,10 +695,7 @@
 	QString wcaption = RKGlobals::rObjectList ()->getWorkspaceURL ().fileName ();
 	if (wcaption.isEmpty ()) wcaption = RKGlobals::rObjectList ()->getWorkspaceURL ().prettyURL ();
 	if (wcaption.isEmpty ()) wcaption = i18n ("[Unnamed Workspace]");
-	QWidget *aw = RKWorkplace::mainWorkplace ()->activeAttachedWindow ();
-	if (aw) {
-		wcaption.append (" - " + aw->caption ());
-	}
+	wcaption.append (" - " + RKWorkplace::mainWorkplace ()->view ()->activeCaption ());
 	KMdiMainFrm::setCaption (wcaption);
 }
 

Modified: trunk/rkward/rkward/windows/Makefile.am
===================================================================
--- trunk/rkward/rkward/windows/Makefile.am	2006-09-25 17:57:13 UTC (rev 762)
+++ trunk/rkward/rkward/windows/Makefile.am	2006-09-26 16:53:29 UTC (rev 763)
@@ -2,8 +2,8 @@
 METASOURCES = AUTO
 noinst_LIBRARIES =  libwindows.a
 noinst_HEADERS = rkcommandeditorwindow.h rkcommandeditorwindowpart.h \
-	rkhtmlwindow.h rcontrolwindow.h detachedwindowcontainer.h
+	rkhtmlwindow.h rcontrolwindow.h detachedwindowcontainer.h rkmdiwindow.h rkworkplaceview.h
 libwindows_a_SOURCES = rkcommandeditorwindow.cpp rkcommandeditorwindowpart.cpp \
-	rkhtmlwindow.cpp rcontrolwindow.cpp detachedwindowcontainer.cpp
+	rkhtmlwindow.cpp rcontrolwindow.cpp detachedwindowcontainer.cpp rkmdiwindow.cpp rkworkplaceview.cpp
 rcdir = $(kde_datadir)/rkward
 rc_DATA = rkcommandeditorwindowpart.rc rkoutputwindow.rc rkhelpwindow.rc detachedwindowcontainer.rc

Modified: trunk/rkward/rkward/windows/rkcommandeditorwindow.cpp
===================================================================
--- trunk/rkward/rkward/windows/rkcommandeditorwindow.cpp	2006-09-25 17:57:13 UTC (rev 762)
+++ trunk/rkward/rkward/windows/rkcommandeditorwindow.cpp	2006-09-26 16:53:29 UTC (rev 763)
@@ -56,7 +56,7 @@
 
 #define GET_HELP_URL 1
 
-RKCommandEditorWindow::RKCommandEditorWindow (QWidget *parent, bool use_r_highlighting) : RKMDIWindow (parent, RKWorkplace::CommandEditorWindow) {
+RKCommandEditorWindow::RKCommandEditorWindow (QWidget *parent, bool use_r_highlighting) : RKMDIWindow (parent, RKMDIWindow::CommandEditorWindow) {
 	RK_TRACE (COMMANDEDITOR);
 
 	KLibFactory *factory = KLibLoader::self()->factory( "libkatepart" );
@@ -81,6 +81,8 @@
 	connect (m_doc, SIGNAL (fileNameChanged ()), this, SLOT (updateCaption ()));
 	connect (m_doc, SIGNAL (modifiedChanged ()), this, SLOT (updateCaption ()));		// of course most of the time this causes a redundant call to updateCaption. Not if a modification is undone, however.
 	if (use_r_highlighting) setRHighlighting ();
+
+	updateCaption ();	// initialize
 }
 
 RKCommandEditorWindow::~RKCommandEditorWindow () {
@@ -177,7 +179,6 @@
 	if (isModified ()) name.append (i18n (" [modified]"));
 
 	setCaption (name);
-	emit (captionChanged (this));
 }
 
 void RKCommandEditorWindow::showHelp () {

Modified: trunk/rkward/rkward/windows/rkcommandeditorwindow.h
===================================================================
--- trunk/rkward/rkward/windows/rkcommandeditorwindow.h	2006-09-25 17:57:13 UTC (rev 762)
+++ trunk/rkward/rkward/windows/rkcommandeditorwindow.h	2006-09-26 16:53:29 UTC (rev 763)
@@ -24,7 +24,7 @@
 #include <kate/document.h>
 #include <kurl.h>
 
-#include "../misc/rkworkplace.h"
+#include "../windows/rkmdiwindow.h"
 
 /**
 	\brief Provides an editor window for R-commands, as well as a text-editor window in general.

Modified: trunk/rkward/rkward/windows/rkhtmlwindow.cpp
===================================================================
--- trunk/rkward/rkward/windows/rkhtmlwindow.cpp	2006-09-25 17:57:13 UTC (rev 762)
+++ trunk/rkward/rkward/windows/rkhtmlwindow.cpp	2006-09-26 16:53:29 UTC (rev 763)
@@ -34,9 +34,11 @@
 #include "../rkward.h"
 #include "../settings/rksettingsmodulegeneral.h"
 #include "../misc/rkcommonfunctions.h"
+#include "../misc/rkworkplace.h"
+#include "../windows/rkworkplaceview.h"
 #include "../debug.h"
 
-RKHTMLWindow::RKHTMLWindow (QWidget *parent) : RKMDIWindow (parent, RKWorkplace::HelpWindow) {
+RKHTMLWindow::RKHTMLWindow (QWidget *parent) : RKMDIWindow (parent, RKMDIWindow::HelpWindow) {
 	RK_TRACE (APP);
 	scroll_position=0;
 	
@@ -164,7 +166,7 @@
 RKOutputWindow::RKOutputWindow (QWidget *parent) : RKHTMLWindow (parent), KXMLGUIClient () {
 	RK_TRACE (APP);
 
-	type = RKWorkplace::OutputWindow;
+	type = RKMDIWindow::OutputWindow;
 	// strip down the khtmlpart's GUI. remove some stuff we definitely don't need.
 	RKCommonFunctions::removeContainers (khtmlpart, QStringList::split (',', "tools,security,extraToolBar,saveBackground,saveFrame,printFrame,kget_menu"), true);
 

Modified: trunk/rkward/rkward/windows/rkhtmlwindow.h
===================================================================
--- trunk/rkward/rkward/windows/rkhtmlwindow.h	2006-09-25 17:57:13 UTC (rev 762)
+++ trunk/rkward/rkward/windows/rkhtmlwindow.h	2006-09-26 16:53:29 UTC (rev 763)
@@ -25,7 +25,7 @@
 
 #include <qptrlist.h>
 
-#include "../misc/rkworkplace.h"
+#include "../windows/rkmdiwindow.h"
 
 class KHTMLPart;
 class KActionCollection;

Added: trunk/rkward/rkward/windows/rkmdiwindow.cpp
===================================================================
--- trunk/rkward/rkward/windows/rkmdiwindow.cpp	                        (rev 0)
+++ trunk/rkward/rkward/windows/rkmdiwindow.cpp	2006-09-26 16:53:29 UTC (rev 763)
@@ -0,0 +1,60 @@
+/***************************************************************************
+                          rkmdiwindow  -  description
+                             -------------------
+    begin                : Tue Sep 26 2006
+    copyright            : (C) 2006 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 "rkmdiwindow.h"
+
+#include "../misc/rkworkplace.h"
+
+#include "../debug.h"
+
+RKMDIWindow::RKMDIWindow (QWidget *parent, Type type) : QWidget (parent) {
+	RK_TRACE (APP);
+
+	RKMDIWindow::type = type;
+	state = Attached;
+}
+
+RKMDIWindow::~RKMDIWindow () {
+	RK_TRACE (APP);
+}
+
+//virtual
+QString RKMDIWindow::fullCaption () {
+	RK_TRACE (APP);
+	return shortCaption ();
+}
+
+//virtual
+QString RKMDIWindow::shortCaption () {
+	RK_TRACE (APP);
+	return caption ();
+}
+
+// virtual from QWidget
+void RKMDIWindow::setCaption (const QString &caption) {
+	RK_TRACE (APP);
+	QWidget::setCaption (caption);
+	emit (captionChanged (this));
+}
+
+//virtual
+QWidget *RKMDIWindow::getWindow () {
+	RK_TRACE (APP);
+	return getPart ()->widget ();
+}
+
+#include "rkmdiwindow.moc"

Added: trunk/rkward/rkward/windows/rkmdiwindow.h
===================================================================
--- trunk/rkward/rkward/windows/rkmdiwindow.h	                        (rev 0)
+++ trunk/rkward/rkward/windows/rkmdiwindow.h	2006-09-26 16:53:29 UTC (rev 763)
@@ -0,0 +1,66 @@
+/***************************************************************************
+                          rkmdiwindow  -  description
+                             -------------------
+    begin                : Tue Sep 26 2006
+    copyright            : (C) 2006 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 RKMDIWINDOW_H
+#define RKMDIWINDOW_H
+
+#include <qwidget.h>
+
+#include <kparts/part.h>
+
+class RKWorkplace;
+
+/** Base class for rkward document mdi windows */
+class RKMDIWindow : public QWidget {
+	Q_OBJECT
+public:
+	enum Type {
+		DataEditorWindow=1,
+		CommandEditorWindow=2,
+		OutputWindow=4,
+		HelpWindow=8,
+		AnyType=DataEditorWindow | CommandEditorWindow | OutputWindow | HelpWindow
+	};
+
+	enum State {
+		Attached=1,
+		Detached=2,
+		AnyState=Attached | Detached
+	};
+protected:
+/** constructor
+ at param parent parent widget
+ at param type Type of window */
+	RKMDIWindow (QWidget *parent, Type type);
+	~RKMDIWindow ();
+public:
+	virtual bool isModified () = 0;
+	virtual QString fullCaption ();
+	virtual QString shortCaption ();
+	virtual KParts::Part *getPart () = 0;
+	void setCaption (const QString &caption);
+	virtual QWidget *getWindow ();
+signals:
+	void captionChanged (RKMDIWindow *);
+protected:
+friend class RKWorkplace;
+	Type type;
+private:
+	State state;
+};
+
+#endif

Added: trunk/rkward/rkward/windows/rkworkplaceview.cpp
===================================================================
--- trunk/rkward/rkward/windows/rkworkplaceview.cpp	                        (rev 0)
+++ trunk/rkward/rkward/windows/rkworkplaceview.cpp	2006-09-26 16:53:29 UTC (rev 763)
@@ -0,0 +1,160 @@
+/***************************************************************************
+                          rkworkplaceview  -  description
+                             -------------------
+    begin                : Tue Sep 26 2006
+    copyright            : (C) 2006 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 "rkworkplaceview.h"
+
+#include <qtabbar.h>
+#include <qwidgetstack.h>
+#include <qlayout.h>
+#include <qiconset.h>
+
+#include "rkmdiwindow.h"
+
+#include "../debug.h"
+
+RKWorkplaceView::RKWorkplaceView (QWidget *parent) : QWidget (parent) {
+	RK_TRACE (APP);
+
+	QVBoxLayout *vbox = new QVBoxLayout (this);
+	tabs = new QTabBar (this);
+	tabs->hide ();
+	connect (tabs, SIGNAL (selected (int)), this, SLOT (setPage (int)));
+	vbox->addWidget (tabs);
+
+	widgets = new QWidgetStack (this);
+	vbox->addWidget (widgets);
+}
+
+RKWorkplaceView::~RKWorkplaceView () {
+	RK_TRACE (APP);
+}
+
+void RKWorkplaceView::addPage (RKMDIWindow *widget) {
+	RK_TRACE (APP);
+
+	widgets->addWidget (widget);
+	int id = tabs->addTab (new QTab (*(widget->icon ()), widget->shortCaption ()));
+	pages.insert (id, widget);
+	connect (widget, SIGNAL (captionChanged (RKMDIWindow *)), this, SLOT (childCaptionChanged (RKMDIWindow *)));
+	widget->show ();
+
+	if (!tabs->isShown ()) {
+		if (tabs->count () > 1) tabs->show ();
+	}
+
+	tabs->setCurrentTab (id);	// activates the newly added window
+}
+
+void RKWorkplaceView::removePage (RKMDIWindow *widget, bool destroyed) {
+	RK_TRACE (APP);
+
+	int id = idOfWidget (widget);
+	RK_DO (if (id == -1) qDebug ("did not find page in RKWorkplaceView::removePage"), APP, DL_WARNING);
+	pages.remove (id);
+	if (!destroyed) disconnect (widget, SIGNAL (captionChanged (RKMDIWindow *)), this, SLOT (childCaptionChanged (RKMDIWindow *)));
+
+	int oldindex = tabs->indexOf (tabs->currentTab ());
+	int oldcount = tabs->count ();
+	QTab *new_tab = tabs->tab (oldindex);
+	if (widget == activePage ()) {
+		if (oldindex >= 1) {
+			new_tab = tabs->tabAt (oldindex - 1);
+		} else if (oldindex < (oldcount - 1)) {
+			new_tab = tabs->tabAt (oldindex + 1);
+		} else {
+			new_tab = 0;
+		}
+	}
+	if (new_tab == 0) RK_ASSERT (oldcount == 1);
+
+	if (new_tab) tabs->setCurrentTab (new_tab);
+	else emit (pageChanged (0));
+
+	if (oldcount <= 2) tabs->hide ();
+
+	widgets->removeWidget (widget);
+	tabs->removeTab (tabs->tab (oldindex));
+}
+
+void RKWorkplaceView::setActivePage (RKMDIWindow *widget) {
+	RK_TRACE (APP);
+
+	int id = idOfWidget (widget);
+	RK_DO (if (id == -1) qDebug ("did not find page in RKWorkplaceView::setActivePage"), APP, DL_WARNING);
+
+	tabs->setCurrentTab (id);
+}
+
+RKMDIWindow *RKWorkplaceView::activePage () {
+	RK_TRACE (APP);
+
+	if (tabs->currentTab () == -1) return 0;
+	RK_ASSERT (pages[tabs->currentTab ()] == widgets->visibleWidget ());
+	return (pages[tabs->currentTab ()]);
+}
+
+QString RKWorkplaceView::activeCaption () {
+	RK_TRACE (APP);
+
+	RKMDIWindow *window = activePage ();
+	if (!window) return QString ();
+	return window->shortCaption ();
+}
+
+void RKWorkplaceView::setPage (int page) {
+	RK_TRACE (APP);
+	RK_ASSERT (pages.find (page) != pages.end ());
+
+	if (tabs->currentTab () != page) {
+		tabs->setCurrentTab (page);
+		return;		// will get here again via signal from tabs
+	}
+
+	RKMDIWindow *window = pages[page];
+	widgets->raiseWidget (window);
+	window->setFocus ();
+	setCaption (window->shortCaption ());
+}
+
+void RKWorkplaceView::childCaptionChanged (RKMDIWindow *widget) {
+	RK_TRACE (APP);
+
+	int id = idOfWidget (widget);
+	QTab *tab = tabs->tab (id);
+	RK_ASSERT (tab);
+	tab->setText (widget->shortCaption ());
+	if (id == tabs->currentTab ()) setCaption (widget->shortCaption ());
+}
+
+int RKWorkplaceView::idOfWidget (RKMDIWindow *widget) {
+	RK_TRACE (APP);
+
+	for (PageMap::const_iterator it = pages.constBegin (); it != pages.constEnd (); ++it) {
+		if (it.data () == widget) return it.key ();
+	}
+
+	return -1;
+}
+
+void RKWorkplaceView::setCaption (const QString &caption) {
+	RK_TRACE (APP);
+
+	QWidget::setCaption (caption);
+	emit (captionChanged (caption));
+}
+
+#include "rkworkplaceview.moc"

Added: trunk/rkward/rkward/windows/rkworkplaceview.h
===================================================================
--- trunk/rkward/rkward/windows/rkworkplaceview.h	                        (rev 0)
+++ trunk/rkward/rkward/windows/rkworkplaceview.h	2006-09-26 16:53:29 UTC (rev 763)
@@ -0,0 +1,56 @@
+/***************************************************************************
+                          rkworkplaceview  -  description
+                             -------------------
+    begin                : Tue Sep 26 2006
+    copyright            : (C) 2006 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 RKWORKPLACEVIEW_H
+#define RKWORKPLACEVIEW_H
+
+#include <qwidget.h>
+#include <qmap.h>
+
+class QTabBar;
+class QWidgetStack;
+class RKMDIWindow;
+
+/** The widget containing all the MDI document windows. Right now it mostly acts as a QTabWidget (is not one, as unfortunately, QTabWidget always has a sunken frame), but might be extended to allow switching between different view modes */
+class RKWorkplaceView : public QWidget {
+	Q_OBJECT
+public:
+	RKWorkplaceView (QWidget *parent);
+	~RKWorkplaceView ();
+
+	void addPage (RKMDIWindow *widget);
+	void removePage (RKMDIWindow *widget, bool destroyed=false);
+
+	void setActivePage (RKMDIWindow *widget);
+	RKMDIWindow *activePage ();
+	QString activeCaption ();
+	void setCaption (const QString &caption);
+signals:
+	void pageChanged (RKMDIWindow *widget);
+	void captionChanged (const QString &new_caption);
+public slots:
+	void setPage (int page);
+	void childCaptionChanged (RKMDIWindow *widget);
+private:
+	QTabBar *tabs;
+	QWidgetStack *widgets;
+	typedef QMap<int, RKMDIWindow*> PageMap;
+	PageMap pages;
+	int idOfWidget (RKMDIWindow *widget);
+};
+
+#endif


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