[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kfm-devel
Subject:    [patch] Preliminary Tabbed Browsing in Konqueror
From:       Doug Hanley <hanleyman () adelphia ! net>
Date:       2001-12-12 3:41:26
[Download RAW message or body]

Hello,

After silently waiting for tabs to come into konqueror for quite a while, I \
decided that I would just try and do it myself.  After some coding, I \
decided it would be best if i released what I have done so far.  

As for the design, I started out by making a base class for all frame \
containers called KonqFrameContainerBase which had basic functions like \
addChildFrame and removeChildFrame, then I made the original \
KonqFrameContainer derive that, and I made a new class called KonqFrameTabs \
which also dervies KonqFrameContainerBase and QTabWidget.  I then went into \
KonqViewManager and made it so that m_pMainContainer is always a tab widget \
(if you're gonna use tabs, it makes sense that you would only use them at \
the top level, right?).  Then all the frame splitting and such takes place \
under that as it has always done.

I made changes to the printfullhierarchy in KonqViewManager, which only \
really applies to debuging but still its there.

I also changed the way frames are deleted.  I wasn't sure about this one \
since it changed quite a few things, but it made more sense to me.  Now \
when frames are deleted all you do is call delete on the frame you want to \
delete and through class destructors, it will hierarchially delete \
subframes of the original frame.  You still have to take care of deleting \
views but this can be done easily though the listViews function in \
KonqFrameBase.  Again, this last change is not essential to tabs, so it can \
be removed if it needs to be. 

Now, with these changes there is no need for the splitWindow function, and \
I've added the addTab and removeTab functions.

Also, to account for people who dont want tabs, when there is only one tab, \
the tab bar gets hidden, so its acts as it normally would without tabs.  \
Only problem is that there is a still a grey space where the hidden tab bar \
resides, i havent been able to fix that.  Another thing that needs work, is \
focus after the removal of a frame

Remember to add the following lines to your konqueror.rc to get the new \
menu items under the window menu (on debian its in \
/usr/share/apps/konqueror/):

  <Action name="addtab"/>
  <Action name="removecurrenttab"/>

I think thats it, if you have any more questions, which I assume you will, \
feel free to ask.  This patch works for 2.2.1 and 2.2.2.  For some reason, \
I cant compile kde3.

Oh yeah, this is very much a work in progress.  I am well aware that there \
are bugs in it, additional help would be much appreciated.

Best regards,
Doug Hanley


["konqtabs.patch" (text/x-diff)]

Common subdirectories: kdebase-2.2.2.orig/konqueror/CVS and \
kdebase-2.2.2/konqueror/CVS Common subdirectories: \
kdebase-2.2.2.orig/konqueror/about and kdebase-2.2.2/konqueror/about Common \
subdirectories: kdebase-2.2.2.orig/konqueror/client and \
kdebase-2.2.2/konqueror/client Common subdirectories: \
kdebase-2.2.2.orig/konqueror/dirtree and kdebase-2.2.2/konqueror/dirtree \
Common subdirectories: kdebase-2.2.2.orig/konqueror/history and \
kdebase-2.2.2/konqueror/history Common subdirectories: \
kdebase-2.2.2.orig/konqueror/iconview and kdebase-2.2.2/konqueror/iconview \
Common subdirectories: kdebase-2.2.2.orig/konqueror/keditbookmarks and \
kdebase-2.2.2/konqueror/keditbookmarks Common subdirectories: \
kdebase-2.2.2.orig/konqueror/kfindpart and \
kdebase-2.2.2/konqueror/kfindpart Common subdirectories: \
                kdebase-2.2.2.orig/konqueror/kfmexec and \
                kdebase-2.2.2/konqueror/kfmexec
diff -u kdebase-2.2.2.orig/konqueror/konq_frame.cc \
                kdebase-2.2.2/konqueror/konq_frame.cc
--- kdebase-2.2.2.orig/konqueror/konq_frame.cc	Mon Nov  5 21:40:29 2001
+++ kdebase-2.2.2/konqueror/konq_frame.cc	Sun Dec  9 17:56:35 2001
@@ -27,6 +27,7 @@
 #include <qtimer.h>
 #include <qpushbutton.h>
 #include <qtoolbutton.h>
+#include <qtabbar.h>
 
 #include <kapp.h>
 #include <kdebug.h>
@@ -371,8 +372,15 @@
 
 //###################################################################
 
-KonqFrame::KonqFrame( KonqFrameContainer *_parentContainer, const char \
                *_name )
-:QWidget(_parentContainer,_name)
+void KonqFrameBase::printFrameInfo(QString spaces)
+{
+	kdDebug(1202) << spaces << "KonqFrameBase " << this << ", this shouldn't \
happen!" << endl; +}
+
+//###################################################################
+
+KonqFrame::KonqFrame( KonqFrameContainerBase *_parentContainer, const char \
*_name ) +:QWidget(_parentContainer->widget(),_name)
 {
    m_pLayout = 0L;
    m_pView = 0L;
@@ -383,12 +391,14 @@
    connect(m_pStatusBar, SIGNAL(clicked()), this, \
SLOT(slotStatusBarClicked()));  connect( m_pStatusBar, SIGNAL( \
linkedViewClicked( bool ) ), this, SLOT( slotLinkedViewClicked( bool ) ) ); \
m_separator = 0; +   m_pParentContainer = _parentContainer;
 }
 
 KonqFrame::~KonqFrame()
 {
   kdDebug(1202) << "KonqFrame::~KonqFrame() " << this << endl;
   //delete m_pLayout;
+	//if (m_pView) delete m_pView;
 }
 
 bool KonqFrame::isActivePart()
@@ -421,6 +431,16 @@
     childView()->copyHistory( static_cast<KonqFrame *>( other \
)->childView() );  }
 
+void KonqFrame::printFrameInfo( QString spaces )
+{
+	kdDebug(1202) << spaces << "KonqFrame " << this << " containing view "
+  	 		        << childView()
+                << " part "
+     	          << part()
+       	        << " whose widget is a "
+         	      << part()->widget()->className() << endl;
+}
+
 KParts::ReadOnlyPart *KonqFrame::attach( const KonqViewFactory \
&viewFactory )  {
    KonqViewFactory factory( viewFactory );
@@ -493,14 +513,6 @@
    }
 };
 
-KonqFrameContainer* KonqFrame::parentContainer()
-{
-   if( parentWidget()->isA("KonqFrameContainer") )
-      return static_cast<KonqFrameContainer*>(parentWidget());
-   else
-      return 0L;
-}
-
 void KonqFrame::reparentFrame( QWidget* parent, const QPoint & p, bool \
showIt )  {
    QWidget::reparent( parent, p, showIt );
@@ -540,18 +552,31 @@
 
 //###################################################################
 
+void KonqFrameContainerBase::printFrameInfo(QString spaces)
+{
+	kdDebug(1202) << spaces << "KonqFrameContainerBase " << this << ", this \
shouldn't happen!" << endl; +}
+
+//###################################################################
+
 KonqFrameContainer::KonqFrameContainer( Orientation o,
-                                        QWidget* parent,
+                                        KonqFrameContainerBase* parent,
                                         const char * name)
-  : QSplitter( o, parent, name)
+  : QSplitter( o, parent->widget(), name)
 {
+	m_pParentContainer = parent;
   m_pFirstChild = 0L;
   m_pSecondChild = 0L;
+  setOpaqueResize( true );
 }
 
 KonqFrameContainer::~KonqFrameContainer()
 {
     kdDebug(1202) << "KonqFrameContainer::~KonqFrameContainer() " << this \
<< " - " << className() << endl; +		if ( m_pFirstChild )
+			delete m_pFirstChild;
+		if ( m_pSecondChild )
+			delete m_pSecondChild;
 }
 
 void KonqFrameContainer::listViews( ChildViewList *viewList )
@@ -620,12 +645,15 @@
    return 0L;
 }
 
-KonqFrameContainer* KonqFrameContainer::parentContainer()
+void KonqFrameContainer::printFrameInfo( QString spaces )
 {
-  if( parentWidget()->isA("KonqFrameContainer") )
-    return static_cast<KonqFrameContainer*>(parentWidget());
-  else
-    return 0L;
+	kdDebug(1202) << spaces << "KonqFrameContainer " << this << endl;
+	KonqFrameBase* child = firstChild();
+	if (child != 0L) child->printFrameInfo(spaces + "  ");
+	else kdDebug(1202) << spaces << "  Null child" << endl;
+  child = secondChild();
+	if (child != 0L) child->printFrameInfo(spaces + "  ");
+	else kdDebug(1202) << spaces << "  Null child" << endl;
 }
 
 void KonqFrameContainer::reparentFrame( QWidget* parent, const QPoint & p, \
bool showIt ) @@ -649,11 +677,13 @@
       if( !m_pFirstChild )
       {
           m_pFirstChild = frame;
+					frame->setParentContainer(this);
           kdDebug(1202) << "Setting as first child" << endl;
       }
       else if( !m_pSecondChild )
       {
           m_pSecondChild = frame;
+					frame->setParentContainer(this);
           kdDebug(1202) << "Setting as second child" << endl;
       }
       else
@@ -666,14 +696,146 @@
 void KonqFrameContainer::removeChildFrame( KonqFrameBase * frame )
 {
   kdDebug(1202) << "KonqFrameContainer::RemoveChildFrame " << this << ". \
Child " << frame << " removed" << endl; +
   if( m_pFirstChild == frame )
-    m_pFirstChild = 0L;
+	{
+		m_pFirstChild = m_pSecondChild;
+		m_pSecondChild = 0L;
+	}
 
   else if( m_pSecondChild == frame )
     m_pSecondChild = 0L;
 
   else
     kdWarning(1202) << this << " Can't find this child:" << frame << endl;
+}
+
+//###################################################################
+
+KonqFrameTabs::KonqFrameTabs(QWidget* parent, const char * name)
+  : QTabWidget(parent, name)
+{
+  m_pParentContainer = 0L;
+  m_pChildFrameList = new QList<KonqFrameBase>;
+  m_pChildFrameList->setAutoDelete(false);
+
+  tabBar()->hide();
+}
+
+KonqFrameTabs::~KonqFrameTabs()
+{
+  kdDebug(1202) << "KonqFrameTabs::~KonqFrameTabs() " << this << " - " << \
className() << endl; +  m_pChildFrameList->setAutoDelete(true);	
+  delete m_pChildFrameList;
+}
+
+void KonqFrameTabs::listViews( ChildViewList *viewList ) {
+  int childFrameCount = m_pChildFrameList->count();
+  for( int i=0 ; i<childFrameCount ; i++) \
m_pChildFrameList->at(i)->listViews(viewList); +}
+
+void KonqFrameTabs::saveConfig( KConfig* config, const QString &prefix, \
bool saveURLs, int id, int depth ) +{
+  /*  int idSecond = id + (int)pow( 2.0, depth );
+
+  //write children sizes
+  config->writeEntry( QString::fromLatin1( "SplitterSizes" ).prepend( \
prefix ), sizes() ); +
+  //write children
+  QStringList strlst;
+  if( firstChild() )
+    strlst.append( QString::fromLatin1( firstChild()->frameType() ) + \
QString::number(idSecond - 1) ); +  if( secondChild() )
+    strlst.append( QString::fromLatin1( secondChild()->frameType() ) + \
QString::number( idSecond ) ); +
+  config->writeEntry( QString::fromLatin1( "Children" ).prepend( prefix ), \
strlst ); +
+  //write orientation
+  QString o;
+  if( orientation() == Qt::Horizontal )
+    o = QString::fromLatin1("Horizontal");
+  else if( orientation() == Qt::Vertical )
+    o = QString::fromLatin1("Vertical");
+  config->writeEntry( QString::fromLatin1( "Orientation" ).prepend( prefix \
), o ); +
+
+  //write child configs
+  if( firstChild() ) {
+    QString newPrefix = QString::fromLatin1( firstChild()->frameType() ) + \
QString::number(idSecond - 1); +    newPrefix.append( '_' );
+    firstChild()->saveConfig( config, newPrefix, saveURLs, id, depth + 1 \
); +  }
+
+  if( secondChild() ) {
+    QString newPrefix = QString::fromLatin1( secondChild()->frameType() ) \
+ QString::number( idSecond ); +    newPrefix.append( '_' );
+    secondChild()->saveConfig( config, newPrefix, saveURLs, idSecond, \
depth + 1 ); +  }
+
+  */
+}
+
+void KonqFrameTabs::copyHistory( KonqFrameBase *other )
+{
+  /* assert( other->frameType() == "Tabs" );
+  KonqFramTabs* otherTabs = static_cast<KonqFrameTabs *>( other );
+  int thisCount = m_pViewList->count();
+  int otherCount = otherTabs->->count();
+  int count = thisCount;
+  if (thisCount>otherCount) count = otherCount;
+
+  for (
+    firstChild()->copyHistory( static_cast<KonqFrameTabs *>( other \
)->firstChild() ); +  if ( secondChild() )
+    secondChild()->copyHistory( static_cast<KonqFrameTabs *>( other \
)->secondChild() ); +  */
+}
+
+void KonqFrameTabs::printFrameInfo( QString spaces )
+{
+  kdDebug(1202) << spaces << "KonqFrameTabs " << this << endl;
+  KonqFrameBase* child;
+  int childFrameCount = m_pChildFrameList->count();
+  for (int i = 0 ; i < childFrameCount ; i++) {
+    child = m_pChildFrameList->at(i);
+    if (child != 0L) child->printFrameInfo(spaces + "  ");
+    else kdDebug(1202) << spaces << "  Null child" << endl;
+  }
+}
+
+void KonqFrameTabs::reparentFrame( QWidget* parent, const QPoint & p, bool \
showIt ) +{
+  QWidget::reparent( parent, p, showIt );
+}
+
+void KonqFrameTabs::insertChildFrame( KonqFrameBase* frame )
+{
+  kdDebug(1202) << "KonqFrameTabs " << this << ": insertChildFrame " << \
frame << endl; +
+  if (frame)
+  {
+    kdDebug(1202) << "Adding frame" << endl;
+    addTab(frame->widget(),"KonqFrameBaseTab");
+    frame->setParentContainer(this);
+    m_pChildFrameList->append(frame);
+    if (tabBar()->count()==2)
+      tabBar()->show();
+  } 
+  else
+    kdWarning(1202) << "KonqFrameTabs " << this << ": insertChildFrame(0L) \
!" << endl; +}
+
+void KonqFrameTabs::removeChildFrame( KonqFrameBase * frame )
+{
+  kdDebug(1202) << "KonqFrameTabs::RemoveChildFrame " << this << ". Child \
" << frame << " removed" << endl; +  if (frame) {
+    removePage(frame->widget());
+    m_pChildFrameList->remove(frame);
+    if (tabBar()->count()==1)
+      tabBar()->hide();			
+  }
+  else
+    kdWarning(1202) << "KonqFrameTabs " << this << ": removeChildFrame(0L) \
!" << endl;  }
 
 #include "konq_frame.moc"
diff -u kdebase-2.2.2.orig/konqueror/konq_frame.h \
                kdebase-2.2.2/konqueror/konq_frame.h
--- kdebase-2.2.2.orig/konqueror/konq_frame.h	Wed May 16 13:27:30 2001
+++ kdebase-2.2.2/konqueror/konq_frame.h	Sun Dec  9 17:56:35 2001
@@ -27,6 +27,7 @@
 #include <qsplitter.h>
 #include <qcheckbox.h>
 #include <qlabel.h>
+#include <qtabwidget.h>
 
 #include <kpixmap.h>
 #include <kpixmapeffect.h>
@@ -41,7 +42,9 @@
 class KonqView;
 class KonqFrameBase;
 class KonqFrame;
+class KonqFrameContainerBase;
 class KonqFrameContainer;
+class KonqFrameTabs;
 class KConfig;
 class KSeparator;
 class KProgress;
@@ -168,21 +171,28 @@
 class KonqFrameBase
 {
  public:
+  virtual ~KonqFrameBase() {}
+
   virtual void saveConfig( KConfig* config, const QString &prefix, bool \
saveURLs, int id = 0, int depth = 0 ) = 0;  virtual void copyHistory( \
KonqFrameBase *other ) = 0;  
+	virtual void printFrameInfo( QString spaces );
+
   virtual void reparentFrame( QWidget* parent,
                               const QPoint & p, bool showIt=FALSE ) = 0;
 
-  virtual KonqFrameContainer* parentContainer() = 0;
+  virtual KonqFrameContainerBase* parentContainer() { return \
m_pParentContainer; } +	virtual void \
setParentContainer(KonqFrameContainerBase* parent) { m_pParentContainer = \
parent; } +
   virtual QWidget* widget() = 0;
 
   virtual void listViews( ChildViewList *viewList ) = 0;
   virtual QCString frameType() = 0;
 
- protected:
+protected:
   KonqFrameBase() {}
-  virtual ~KonqFrameBase() {}
+
+	KonqFrameContainerBase* m_pParentContainer;
 };
 
 /**
@@ -202,7 +212,7 @@
   Q_OBJECT
 
 public:
-  KonqFrame( KonqFrameContainer *_parentContainer = 0L,
+  KonqFrame( KonqFrameContainerBase *_parentContainer = 0L,
              const char *_name = 0L );
   virtual ~KonqFrame();
 
@@ -246,10 +256,12 @@
   virtual void saveConfig( KConfig* config, const QString &prefix, bool \
saveURLs, int id = 0, int depth = 0 );  virtual void copyHistory( \
KonqFrameBase *other );  
+	virtual void printFrameInfo( QString spaces );
+
   virtual void reparentFrame(QWidget * parent,
                      const QPoint & p, bool showIt=FALSE );
 
-  virtual KonqFrameContainer* parentContainer();
+  //virtual KonqFrameContainerBase* parentContainer();
   virtual QWidget* widget() { return this; }
   virtual QCString frameType() { return QCString("View"); }
 
@@ -285,6 +297,32 @@
   KonqFrameHeader *m_pHeader;
 };
 
+class KonqFrameContainerBase : public KonqFrameBase
+{
+public:
+  virtual ~KonqFrameContainerBase() {}
+
+  /**
+   * Call this after inserting a new frame into the splitter.
+   */
+  virtual void insertChildFrame( KonqFrameBase * frame ) = 0;
+  /**
+   * Call this before deleting one of our children.
+   */
+  virtual void removeChildFrame( KonqFrameBase * frame ) = 0;
+
+  //inherited
+	virtual void printFrameInfo( QString spaces );
+
+  virtual QCString frameType() { return QCString("ContainerBase"); }
+
+  virtual void reparentFrame(QWidget * parent,
+                             const QPoint & p, bool showIt=FALSE ) = 0;
+
+protected:
+  KonqFrameContainerBase() {}
+};
+
 /**
  * With KonqFrameContainers and @refKonqFrames we can create a flexible
  * storage structure for the views. The top most element is a
@@ -294,13 +332,13 @@
  * KonqFrameContainers or, as leaves, KonqFrames.
  */
 
-class KonqFrameContainer : public QSplitter, public KonqFrameBase
+class KonqFrameContainer : public QSplitter, public KonqFrameContainerBase
 {
   Q_OBJECT
   friend class KonqFrame; //for emitting ctrlTabPressed() only, aleXXX
 public:
   KonqFrameContainer( Orientation o,
-                      QWidget* parent,
+                      KonqFrameContainerBase* parent,
                       const char * name = 0);
   virtual ~KonqFrameContainer();
 
@@ -313,9 +351,10 @@
   KonqFrameBase* secondChild() { return m_pSecondChild; }
   KonqFrameBase* otherChild( KonqFrameBase* child );
 
+	virtual void printFrameInfo( QString spaces );
+
   void swapChildren();
 
-  virtual KonqFrameContainer* parentContainer();
   virtual QWidget* widget() { return this; }
   virtual QCString frameType() { return QCString("Container"); }
 
@@ -341,6 +380,54 @@
 protected:
   KonqFrameBase* m_pFirstChild;
   KonqFrameBase* m_pSecondChild;
+};
+
+class KonqFrameTabs : public QTabWidget, public KonqFrameContainerBase
+{
+  Q_OBJECT
+  friend class KonqFrame; //for emitting ctrlTabPressed() only, aleXXX
+public:
+  KonqFrameTabs(QWidget* parent, const char * name = 0);
+  virtual ~KonqFrameTabs();
+
+  virtual void listViews( ChildViewList *viewList );
+
+  virtual void saveConfig( KConfig* config, const QString &prefix, bool \
saveURLs, int id = 0, int depth = 0 ); +  virtual void copyHistory( \
KonqFrameBase *other ); +
+	virtual void printFrameInfo( QString spaces );
+
+	QList<KonqFrameBase>* childFrameList() { return m_pChildFrameList; }
+
+  virtual KonqFrameContainerBase* parentContainer() { return 0L; }
+	virtual void setParentContainer(KonqFrameContainerBase* parent) { return; \
} +
+  virtual QWidget* widget() { return this; }
+  virtual QCString frameType() { return QCString("Tabs"); }
+
+  /**
+   * Call this after inserting a new frame into the splitter.
+   */
+  void insertChildFrame( KonqFrameBase * frame );
+  /**
+   * Call this before deleting one of our children.
+   */
+  void removeChildFrame( KonqFrameBase * frame );
+
+  //inherited
+  virtual void reparentFrame(QWidget * parent,
+                             const QPoint & p, bool showIt=FALSE );
+
+  //make this one public
+  //int idAfter( QWidget* w ){ return Q::idAfter( w ); }
+
+signals:
+  void ctrlTabPressed();
+
+protected:
+  //KonqFrameBase* m_pFirstChild;
+  //KonqFrameBase* m_pSecondChild;
+  QList<KonqFrameBase>* m_pChildFrameList;
 };
 
 #endif
diff -u kdebase-2.2.2.orig/konqueror/konq_guiclients.cc \
                kdebase-2.2.2/konqueror/konq_guiclients.cc
--- kdebase-2.2.2.orig/konqueror/konq_guiclients.cc	Sat Jul 28 23:56:40 \
                2001
+++ kdebase-2.2.2/konqueror/konq_guiclients.cc	Sun Dec  9 17:56:35 2001
@@ -228,7 +228,7 @@
 
   KonqViewManager *viewManager = m_mainWindow->viewManager();
 
-  KonqFrameContainer *mainContainer = viewManager->mainContainer();
+  KonqFrameContainerBase *mainContainer = viewManager->mainContainer();
 
   if ( toggle )
   {
@@ -245,8 +245,10 @@
     else
       newSplitterSizes << 30 << 100;
 
-    KonqFrameContainer *newContainer = \
                childView->frame()->parentContainer();
-    newContainer->setSizes( newSplitterSizes );
+    KonqFrameContainerBase *newContainer = \
childView->frame()->parentContainer(); +
+    if (newContainer->frameType()=="Container")
+      static_cast<KonqFrameContainer*>(newContainer)->setSizes( \
newSplitterSizes );  
     if ( m_mainWindow->currentView() )
     {
diff -u kdebase-2.2.2.orig/konqueror/konq_mainwindow.cc \
                kdebase-2.2.2/konqueror/konq_mainwindow.cc
--- kdebase-2.2.2.orig/konqueror/konq_mainwindow.cc	Mon Nov  5 21:40:29 \
                2001
+++ kdebase-2.2.2/konqueror/konq_mainwindow.cc	Sun Dec  9 17:56:36 2001
@@ -560,7 +560,7 @@
   if ( !childView )
     {
       // Create a new view
-      childView = m_pViewManager->splitView( Qt::Horizontal, serviceType, \
serviceName ); +      childView = m_pViewManager->addTab( serviceType, \
serviceName );  
       if ( !childView )
         {
@@ -1808,12 +1808,23 @@
   newView->openURL( m_currentView->url(), m_currentView->locationBarURL() \
);  }
 
+void KonqMainWindow::slotAddTab()
+{
+  KonqView* newView = m_pViewManager->addTab();
+  newView->openURL( m_currentView->url(), m_currentView->locationBarURL() \
); +}
+
 void KonqMainWindow::slotRemoveView()
 {
   // takes care of choosing the new active view
   m_pViewManager->removeView( m_currentView );
 }
 
+void KonqMainWindow::slotRemoveCurrentTab()
+{
+	m_pViewManager->removeCurrentTab();
+}
+
 void KonqMainWindow::slotSaveViewPropertiesLocally()
 {
   m_bSaveViewPropertiesLocally = !m_bSaveViewPropertiesLocally;
@@ -2663,7 +2674,9 @@
   // Window menu
   m_paSplitViewHor = new KAction( i18n( "Split View &Left/Right" ), \
"view_left_right", CTRL+SHIFT+Key_L, this, SLOT( slotSplitViewHorizontal() \
), actionCollection(), "splitviewh" );  m_paSplitViewVer = new KAction( \
i18n( "Split View &Top/Bottom" ), "view_top_bottom", CTRL+SHIFT+Key_T, \
this, SLOT( slotSplitViewVertical() ), actionCollection(), "splitviewv" ); \
+  m_paAddTab = new KAction( i18n( "Add Tab" ), "view_add_tab", 0, this, \
SLOT( slotAddTab() ), actionCollection(), "addtab" );  m_paRemoveView = new \
KAction( i18n( "&Remove Active View" ),"view_remove", CTRL+SHIFT+Key_R, \
this, SLOT( slotRemoveView() ), actionCollection(), "removeview" ); +  \
m_paRemoveCurrentTab = new KAction( i18n( "Remove Current Tab" ), \
"view_remove_current_tab", 0, this, SLOT( slotRemoveCurrentTab() ), \
actionCollection(), "removecurrenttab" );  
   m_paSaveRemoveViewProfile = new KAction( i18n( "&Configure View \
Profiles..." ), 0, m_pViewManager, SLOT( slotProfileDlg() ), \
actionCollection(), "saveremoveviewprofile" );  m_pamLoadViewProfile = new \
KActionMenu( i18n( "Load &View Profile" ), actionCollection(), \
                "loadviewprofile" );
diff -u kdebase-2.2.2.orig/konqueror/konq_mainwindow.h \
                kdebase-2.2.2/konqueror/konq_mainwindow.h
--- kdebase-2.2.2.orig/konqueror/konq_mainwindow.h	Fri May 11 07:13:54 2001
+++ kdebase-2.2.2/konqueror/konq_mainwindow.h	Sun Dec  9 17:56:36 2001
@@ -306,7 +306,9 @@
 
   void slotSplitViewHorizontal();
   void slotSplitViewVertical();
+  void slotAddTab();
   void slotRemoveView();
+	void slotRemoveCurrentTab();
 
   void slotSaveViewProfile();
   void slotSaveViewPropertiesLocally();
@@ -451,7 +453,9 @@
 
   KAction *m_paSplitViewHor;
   KAction *m_paSplitViewVer;
+  KAction *m_paAddTab;
   KAction *m_paRemoveView;
+	KAction *m_paRemoveCurrentTab;
 
   KAction *m_paSaveRemoveViewProfile;
   KActionMenu *m_pamLoadViewProfile;
diff -u kdebase-2.2.2.orig/konqueror/konq_view.cc \
                kdebase-2.2.2/konqueror/konq_view.cc
--- kdebase-2.2.2.orig/konqueror/konq_view.cc	Wed Jun 20 15:21:06 2001
+++ kdebase-2.2.2/konqueror/konq_view.cc	Sun Dec  9 17:56:36 2001
@@ -95,8 +95,10 @@
   if ( isPassiveMode() && m_pPart )
       disconnect( m_pPart, SIGNAL( destroyed() ), \
m_pMainWindow->viewManager(), SLOT( slotObjectDestroyed() ) );  
+	partDeleted();
   delete m_pPart;
   delete (KonqRun *)m_pRun;
+	//m_pMainWindow->removeChildView(this);
   //kdDebug(1202) << "KonqView::~KonqView " << this << " done" << endl;
 }
 
@@ -136,6 +138,11 @@
   m_pPart->openURL( url );
 
   sendOpenURLEvent( url, args );
+
+  KonqFrameContainerBase* frameContainer = frame()->parentContainer();
+  if (frameContainer)
+    if (frameContainer->frameType()=="Tabs")
+      static_cast<KonqFrameTabs*>(frameContainer)->changeTab(frame(),locationBarURL);
  
   updateHistoryEntry(false /* don't save location bar URL yet */);
   // add pending history entry
diff -u kdebase-2.2.2.orig/konqueror/konq_viewmgr.cc \
                kdebase-2.2.2/konqueror/konq_viewmgr.cc
--- kdebase-2.2.2.orig/konqueror/konq_viewmgr.cc	Tue Sep  4 18:16:55 2001
+++ kdebase-2.2.2/konqueror/konq_viewmgr.cc	Sun Dec  9 17:56:36 2001
@@ -51,7 +51,10 @@
 {
   m_pMainWindow = mainWindow;
 
-  m_pMainContainer = 0L;
+  m_pMainContainer = new KonqFrameTabs( m_pMainWindow );
+  m_pMainWindow->setCentralWidget( m_pMainContainer );
+  m_pMainContainer->setGeometry( 0, 0, m_pMainWindow->width(), \
m_pMainWindow->height() ); +  \
connect(m_pMainContainer,SIGNAL(ctrlTabPressed()),m_pMainWindow,SLOT(slotCtrlTabPressed()));
  
   m_pamProfiles = 0L;
   m_bProfileListDirty = true;
@@ -69,17 +72,16 @@
                                        bool newOneFirst)
 {
   kdDebug(1202) << "KonqViewManager::splitView(ServiceType)" << endl;
+	printFullHierarchy( m_pMainContainer );
 
   KonqFrame* viewFrame = 0L;
-  if( m_pMainContainer )
+
+  if ( m_pMainWindow->currentView() )
+    viewFrame = m_pMainWindow->currentView()->frame();
+  else
   {
-    if ( m_pMainWindow->currentView() )
-      viewFrame = m_pMainWindow->currentView()->frame();
-    else
-    {
-      kdWarning(1202) << "splitView called, but no current view!" << endl;
-      return 0L; // if we go on, we'll hit the assert in split()
-    }
+    kdWarning(1202) << "splitView called, but no current view!" << endl;
+    return 0L; // if we go on, we'll hit the assert in split()
   }
 
   KonqFrameContainer *newContainer;
@@ -87,10 +89,13 @@
 
   if ( newOneFirst )
   {
-      newContainer->moveToLast( viewFrame->widget() );
-      newContainer->swapChildren();
+    newContainer->moveToLast( viewFrame->widget() );
+    newContainer->swapChildren();
   }
 
+  printFullHierarchy( m_pMainContainer );
+  kdDebug(1202) << "KonqViewManager::splitView(ServiceType) done" << endl;
+
   return childView;
 }
 
@@ -101,13 +106,17 @@
 {
   kdDebug(1202) << "KonqViewManager::splitWindow(default)" << endl;
 
+  return 0L;
+
+  /*
   KURL url = m_pMainWindow->currentView()->url();
 
   QString locationBarURL;
   KonqFrameBase* splitFrame = 0L;
   if( m_pMainContainer )
   {
-    splitFrame = m_pMainContainer->firstChild();
+    if (m_pMainContainer->frameType()=="Tabs") return 0L;
+    splitFrame = static_cast<KonqFrameContainer*>(m_pMainContainer)->firstChild();
  locationBarURL = m_pMainWindow->currentView()->locationBarURL();
     if ( !splitFrame )
     {
@@ -129,6 +138,29 @@
     childView->openURL( url, locationBarURL );
 
   return childView;
+
+  */
+}
+
+KonqView* KonqViewManager::addTab(const QString &serviceType, const \
QString &serviceName, bool passiveMode) +{
+  kdDebug(1202) << "------------- KonqViewManager::splitTab starting \
-------------" << endl; +  printFullHierarchy( m_pMainContainer );
+
+  KService::Ptr service;
+  KTrader::OfferList partServiceOffers, appServiceOffers;
+
+  KonqViewFactory newViewFactory = createView( serviceType, serviceName, \
service, partServiceOffers, appServiceOffers ); +
+  if( newViewFactory.isNull() )
+    return 0L; //do not split at all if we can't create the new view
+
+  KonqView* childView = setupView( m_pMainContainer, newViewFactory, \
service, partServiceOffers, appServiceOffers, serviceType, passiveMode ); +
+  printFullHierarchy( m_pMainContainer );
+  kdDebug(1202) << "------------- KonqViewManager::splitTab done \
-------------" << endl; +
+  return childView;
 }
 
 KonqView* KonqViewManager::split (KonqFrameBase* splitFrame,
@@ -148,19 +180,18 @@
     return 0L; //do not split at all if we can't create the new view
 
   KonqView *childView;
-  if( m_pMainContainer )
+  if( m_pMainWindow->currentView() )
   {
     assert( splitFrame );
 
-    KonqFrameContainer* parentContainer = splitFrame->parentContainer();
-    bool moveNewContainer = (parentContainer->idAfter( \
splitFrame->widget() ) != 0); +    KonqFrameContainerBase* parentContainer \
= splitFrame->parentContainer();  
 #ifndef NDEBUG
     printSizeInfo( splitFrame, parentContainer, "before split");
 #endif
 
     splitFrame->widget()->setUpdatesEnabled( false );
-    parentContainer->setUpdatesEnabled( false );
+    parentContainer->widget()->setUpdatesEnabled( false );
 
     QPoint pos = splitFrame->widget()->pos();
 
@@ -174,12 +205,9 @@
     KonqFrameContainer *newContainer = new KonqFrameContainer( \
                orientation, parentContainer );
     connect(newContainer,SIGNAL(ctrlTabPressed()),m_pMainWindow,SLOT(slotCtrlTabPressed()));
  newContainer->setUpdatesEnabled( false );
-    newContainer->setOpaqueResize( true );
     newContainer->show();
 
     parentContainer->insertChildFrame( newContainer );
-    if( moveNewContainer )
-      parentContainer->moveToFirst( newContainer );
 
     //kdDebug(1202) << "Move in child" << endl;
     splitFrame->widget()->reparent( newContainer, pos, true /*showIt*/ );
@@ -198,7 +226,7 @@
 
     splitFrame->widget()->setUpdatesEnabled( true );
     newContainer->setUpdatesEnabled( true );
-    parentContainer->setUpdatesEnabled( true );
+    parentContainer->widget()->setUpdatesEnabled( true );
 
     if ( newFrameContainer )
       *newFrameContainer = newContainer;
@@ -206,21 +234,15 @@
   }
   else // We had no main container, create one
   {
-    m_pMainContainer = new KonqFrameContainer( orientation, m_pMainWindow \
                );
-    kdDebug(1202) << "Created main container " << m_pMainContainer << \
                endl;
-    connect(m_pMainContainer,SIGNAL(ctrlTabPressed()),m_pMainWindow,SLOT(slotCtrlTabPressed()));
                
-    m_pMainWindow->setCentralWidget( m_pMainContainer );
-    m_pMainContainer->setOpaqueResize();
-    m_pMainContainer->setGeometry( 0, 0, m_pMainWindow->width(), \
                m_pMainWindow->height() );
-
-    childView = setupView( m_pMainContainer, newViewFactory, service, \
                partServiceOffers, appServiceOffers, serviceType, \
                passiveMode );
-
-    //m_pMainContainer->show();
+    KonqFrameContainer* newContainer = new KonqFrameContainer( \
orientation, m_pMainContainer ); +    kdDebug(1202) << "Created new \
container, child of m_pMainContainer" << newContainer << endl; +    \
connect(newContainer,SIGNAL(ctrlTabPressed()),m_pMainWindow,SLOT(slotCtrlTabPressed()));
 +    m_pMainContainer->insertChildFrame( newContainer);
 
-    //childView->frame()->statusbar()->hideStuff();
+    childView = setupView( newContainer, newViewFactory, service, \
partServiceOffers, appServiceOffers, serviceType, passiveMode );  
     if ( newFrameContainer )
-      *newFrameContainer = m_pMainContainer;
+      *newFrameContainer = newContainer;
   }
 
 #ifndef NDEBUG
@@ -230,9 +252,37 @@
   return childView;
 }
 
+void KonqViewManager::removeCurrentTab() {
+  kdDebug(1202) << "---------------- KonqViewManager::removeCurrentTab \
--------------" << endl; +  printFullHierarchy( m_pMainContainer );
+
+  KonqFrameBase* currentFrame = \
dynamic_cast<KonqFrameBase*>(m_pMainContainer->currentPage()); +  \
m_pMainContainer->removeChildFrame(currentFrame); +  \
currentFrame->widget()->hide(); +  \
//currentFrame->widget()->setUpdatesEnabled(false); +
+  QList<KonqView> viewList;
+  QListIterator<KonqView> it( viewList );
+
+  currentFrame->listViews( &viewList );
+
+  for ( it.toFirst(); it.current(); ++it )
+  {
+    m_pMainWindow->removeChildView( it.current() );
+    delete it.current();
+  }
+
+  delete currentFrame;
+
+  printFullHierarchy( m_pMainContainer );
+  kdDebug(1202) << "------------- KonqViewManager::removeCurrentTab done \
--------------" << endl; +}	
+
 void KonqViewManager::removeView( KonqView *view )
 {
-  kdDebug(1202) << "---------------- removeView " << view << endl;
+  kdDebug(1202) << "---------------- removeView --------------" << view << \
endl; +  printFullHierarchy( m_pMainContainer );
+
   if ( activePart() == view->part() )
   {
     KonqView *nextView = chooseNextView( view );
@@ -246,53 +296,67 @@
       setActivePart( nextView->part(), true /*immediate */ );
   }
 
-  KonqFrameContainer* parentContainer = view->frame()->parentContainer();
-  KonqFrameContainer* grandParentContainer = \
                parentContainer->parentContainer();
-  kdDebug(1202) << "view=" << view << " parentContainer=" << \
                parentContainer
-                << " grandParentContainer=" << grandParentContainer << \
                endl;
-  bool moveOtherChild = (grandParentContainer->idAfter( parentContainer ) \
!= 0); +  KonqFrame* frame = view->frame();
+  KonqFrameContainerBase* parentContainer = frame->parentContainer();
+	
+  kdDebug(1202) << parentContainer->frameType() << endl;
 
-  KonqFrameBase* otherFrame = parentContainer->otherChild( view->frame() \
); +  if (parentContainer->frameType()=="Container")
+  {
+    kdDebug(1202) << "parentContainer " << parentContainer << " is a \
KonqFrameContainer" << endl;  
-  if( otherFrame == 0L ) {
-    kdWarning(1202) << "KonqViewManager::removeView: This shouldn't \
                happen!" << endl;
-    return;
+    KonqFrameContainerBase* grandParentContainer = \
parentContainer->parentContainer(); +    KonqFrameBase* otherFrame = \
static_cast<KonqFrameContainer*>(parentContainer)->otherChild( frame ); +
+    kdDebug(1202) << "view=" << view << " parentContainer=" << \
parentContainer +                  << " grandParentContainer=" << \
grandParentContainer << endl; +
+    if( otherFrame == 0L )
+    {
+      kdWarning(1202) << "KonqViewManager::removeView: This shouldn't \
happen!" << endl; +      return;
+    }
+
+    kdDebug(1202) << "KonqViewManager::removeView reparenting other frame \
" << otherFrame << " widget=" << otherFrame->widget() << endl; +    QPoint \
pos = otherFrame->widget()->pos(); +
+    otherFrame->reparentFrame( m_pMainWindow, pos );
+    otherFrame->widget()->hide(); // Can't hide before, but after is \
better than nothing +    otherFrame->widget()->resize( 100, 30 ); // bring \
it to the QWidget defaultsize +
+    kdDebug(1202) << "--- Removing otherFrame from parentContainer" << \
endl; +    parentContainer->removeChildFrame( otherFrame );
+
+    kdDebug(1202) << "--- Removing parentContainer from \
grandParentContainer" << endl; +    grandParentContainer->removeChildFrame( \
parentContainer ); +
+    m_pMainWindow->removeChildView(view);
+
+    kdDebug(1202) << "--- Deleting parentContainer " << parentContainer
+                  << ". Its parent is " << \
parentContainer->widget()->parent() << endl; +    delete parentContainer;
+
+    otherFrame->reparentFrame( grandParentContainer->widget(), pos, true \
/*showIt*/ ); +
+    kdDebug(1202) << "--- Inserting otherFrame into grandParentContainer" \
<< endl;		 +    grandParentContainer->insertChildFrame( otherFrame );
   }
+  else {
+    kdDebug(1202) << "parentContainer " << parentContainer << " is a \
KonqFrameTabs" << endl; +
+    m_pMainContainer->removeChildFrame( frame );
+
+    // This deletes the widgets inside, including the part's widget, so \
tell the child view +    //view->partDeleted();
 
-  kdDebug(1202) << "KonqViewManager::removeView reparenting other frame " \
                << otherFrame << " widget=" << otherFrame->widget() << \
                endl;
-  QPoint pos = otherFrame->widget()->pos();
+    m_pMainWindow->removeChildView(view);
 
-  otherFrame->reparentFrame( m_pMainWindow, pos );
-  otherFrame->widget()->hide(); // Can't hide before, but after is better \
                than nothing
-  otherFrame->widget()->resize( 100, 30 ); // bring it to the QWidget \
                defaultsize
-  parentContainer->removeChildFrame( otherFrame );
-
-  m_pMainWindow->removeChildView( view );
-
-  parentContainer->removeChildFrame( view->frame() );
-
-  // We did so ourselves for passive views - doesn't really matter, but \
                saves a call to slotPassiveModePartDeleted
-  if ( view->isPassiveMode() && view->part() )
-      disconnect( view->part(), SIGNAL( destroyed() ), this, SLOT( \
                slotPassiveModePartDeleted() ) );
-
-  kdDebug(1202) << "Deleting view frame " << view->frame() << endl;
-  delete view->frame();
-  // This deletes the widgets inside, including the part's widget, so tell \
                the child view
-  view->partDeleted();
-  kdDebug(1202) << "Deleting view " << view << endl;
-  delete view;
-
-  grandParentContainer->removeChildFrame( parentContainer );
-  kdDebug(1202) << "Deleting parentContainer " << parentContainer
-                << ". Its parent is " << parentContainer->parent() << \
                endl;
-  delete parentContainer;
-
-  otherFrame->reparentFrame( grandParentContainer, pos, true/*showIt*/ );
-  grandParentContainer->insertChildFrame( otherFrame );
-  if( moveOtherChild )
-    grandParentContainer->moveToFirst( otherFrame->widget() );
+    kdDebug(1202) << "Deleting view frame " << frame << endl;
+    delete frame;
+  }
+
+  kdDebug(1202) << "------------- removeView done --------------" << view \
<< endl;  
-  kdDebug(1202) << "------------- removeView done " << view << endl;
 #ifndef NDEBUG
   printFullHierarchy( m_pMainContainer );
 #endif
@@ -318,10 +382,6 @@
         kdDebug(1202) << "Deleting last view -> closing the window" << \
endl;  setActivePart( 0L, true );
         m_pMainWindow->removeChildView( view );
-        kdDebug(1202) << "Deleting frame " << view << endl;
-        delete view->frame(); // This deletes the widgets inside, \
                including the part's widget
-        kdDebug(1202) << "Deleting view " << view << endl;
-        delete view;
         kdDebug(1202) << "Deleting m_pMainContainer " << m_pMainContainer \
<< endl;  delete m_pMainContainer;
         m_pMainContainer = 0L;
@@ -378,18 +438,18 @@
   QList<KonqView> viewList;
   QListIterator<KonqView> it( viewList );
 
-  if (m_pMainContainer) {
-    m_pMainContainer->listViews( &viewList );
+  if ( !m_pMainWindow->currentView() ) return;
 
-    for ( it.toFirst(); it.current(); ++it ) {
-      m_pMainWindow->removeChildView( it.current() );
-      delete it.current();
-    }
+  m_pMainContainer->listViews( &viewList );
 
-    kdDebug(1202) << "deleting m_pMainContainer " << endl;
-    delete m_pMainContainer;
-    m_pMainContainer = 0L;
+  for ( it.toFirst(); it.current(); ++it ) {
+    m_pMainWindow->removeChildView( it.current() );
+    delete it.current();
   }
+
+  kdDebug(1202) << "deleting m_pMainContainer " << endl;
+  delete m_pMainContainer;
+  m_pMainContainer = 0L;
 }
 
 KonqView *KonqViewManager::chooseNextView( KonqView *view )
@@ -459,7 +519,7 @@
   return viewFactory;
 }
 
-KonqView *KonqViewManager::setupView( KonqFrameContainer *parentContainer,
+KonqView *KonqViewManager::setupView( KonqFrameContainerBase \
*parentContainer,  KonqViewFactory &viewFactory,
                                       const KService::Ptr &service,
                                       const KTrader::OfferList \
&partServiceOffers, @@ -526,14 +586,14 @@
 void KonqViewManager::saveViewProfile( KConfig & cfg, bool saveURLs, bool \
saveWindowSize )  {
   kdDebug(1202) << "KonqViewManager::saveViewProfile" << endl;
-  if( m_pMainContainer && m_pMainContainer->firstChild() ) {
-    cfg.writeEntry( "RootItem", QString::fromLatin1( \
                m_pMainContainer->firstChild()->frameType() )
-                    + QString::number(0) );
-    QString prefix = QString::fromLatin1( \
                m_pMainContainer->firstChild()->frameType() )
-                     + QString::number(0);
-    prefix.append( '_' );
-    m_pMainContainer->firstChild()->saveConfig( &cfg, prefix, saveURLs, 0, \
                1 );
-  }
+  //if( m_pMainContainer && m_pMainContainer->firstChild() ) {
+  //  cfg.writeEntry( "RootItem", QString::fromLatin1( \
m_pMainContainer->firstChild()->frameType() ) +  //                  + \
QString::number(0) ); +  //  QString prefix = QString::fromLatin1( \
m_pMainContainer->firstChild()->frameType() ) +  //                   + \
QString::number(0); +  //  prefix.append( '_' );
+  //  m_pMainContainer->firstChild()->saveConfig( &cfg, prefix, saveURLs, \
0, 1 ); +  //}
 
   if ( saveWindowSize )
   {
@@ -583,12 +643,11 @@
 
   if ( rootItem != "empty" && forcedURL.url() != "about:blank" )
   {
-      m_pMainContainer = new KonqFrameContainer( Qt::Horizontal, \
                m_pMainWindow );
-      connect(m_pMainContainer,SIGNAL(ctrlTabPressed()),m_pMainWindow,SLOT(slotCtrlTabPressed()));
                
-      m_pMainWindow->setCentralWidget( m_pMainContainer );
-      m_pMainContainer->setOpaqueResize();
-      m_pMainContainer->setGeometry( 0, 0, m_pMainWindow->width(), \
                m_pMainWindow->height() );
-      m_pMainContainer->show();
+    //m_pMainContainer = new KonqFrameContainer( Qt::Horizontal, \
m_pMainWindow ); +    \
//connect(m_pMainContainer->widget(),SIGNAL(ctrlTabPressed()),m_pMainWindow,SLOT(slotCtrlTabPressed()));
 +    //m_pMainWindow->setCentralWidget( m_pMainContainer->widget() );
+    //m_pMainContainer->widget()->setGeometry( 0, 0, \
m_pMainWindow->width(), m_pMainWindow->height() ); +    \
//m_pMainContainer->widget()->show();  
       // This flag is used by KonqView, to distinguish manual view \
creation  // from profile loading (e.g. in switchView)
@@ -726,7 +785,7 @@
     return QSize( width, height );
 }
 
-void KonqViewManager::loadItem( KConfig &cfg, KonqFrameContainer *parent,
+void KonqViewManager::loadItem( KConfig &cfg, KonqFrameContainerBase \
                *parent,
                                 const QString &name, const KURL & \
defaultURL, bool openURL )  {
   QString prefix;
@@ -813,7 +872,6 @@
       KonqFrameContainer *newContainer = new KonqFrameContainer( o, parent \
                );
       connect(newContainer,SIGNAL(ctrlTabPressed()),m_pMainWindow,SLOT(slotCtrlTabPressed()));
  parent->insertChildFrame( newContainer );
-      newContainer->setOpaqueResize();
       newContainer->show();
 
       loadItem( cfg, newContainer, childList.at(0), defaultURL, openURL );
@@ -919,57 +977,30 @@
 ///////////////// Debug stuff ////////////////
 
 void KonqViewManager::printSizeInfo( KonqFrameBase* frame,
-                                     KonqFrameContainer* parent,
+                                     KonqFrameContainerBase* parent,
                                      const char* msg )
 {
+  /*
   QRect r;
   r = frame->widget()->geometry();
   qDebug("Child size %s : x: %d, y: %d, w: %d, h: %d", msg, \
r.x(),r.y(),r.width(),r.height() );  
   QValueList<int> sizes;
-  sizes = parent->sizes();
+  sizes = static_cast<KonqFrameContainer*>(parent)->sizes();
   printf( "Parent sizes %s :", msg );
   QValueList<int>::ConstIterator it;
   for( it = sizes.begin(); it != sizes.end(); ++it )
     printf( " %d", (*it) );
   printf("\n");
+  */
 }
 
-void KonqViewManager::printFullHierarchy( KonqFrameContainer * container, \
int ident ) +void KonqViewManager::printFullHierarchy( \
KonqFrameContainerBase * container )  {
-    if (container)
-    {
-        QString spaces;
-        for ( int i = 0 ; i < ident ; i++ )
-            spaces += " ";
-        kdDebug(1202) << spaces << "Container " << container << endl;
-        KonqFrameBase * child = container->firstChild();
-        if ( !child )
-            kdDebug(1202) << spaces << "  Null child" << endl;
-        else if ( child->widget()->isA("KonqFrameContainer") )
-            printFullHierarchy( static_cast<KonqFrameContainer *>(child), \
                ident + 2 );
-        else
-            kdDebug(1202) << spaces << "  " << "KonqFrame containing view \
                "
-                          << static_cast<KonqFrame *>(child)->childView()
-                          << " part "
-                          << static_cast<KonqFrame *>(child)->part()
-                          << " whose widget is a "
-                          << static_cast<KonqFrame \
                *>(child)->part()->widget()->className() << endl;
-        child = container->secondChild();
-        if ( !child )
-            kdDebug(1202) << spaces << "  Null child" << endl;
-        else if ( child->widget()->isA("KonqFrameContainer") )
-            printFullHierarchy( static_cast<KonqFrameContainer *>(child), \
                ident + 2 );
-        else
-            kdDebug(1202) << spaces << "  " << "KonqFrame " << child << " \
                containing view "
-                          << static_cast<KonqFrame *>(child)->childView()
-                          << " part "
-                          << static_cast<KonqFrame *>(child)->part()
-                          << " whose widget is a "
-                          << static_cast<KonqFrame \
                *>(child)->part()->widget()->className() << endl;
-    }
-    else
-        kdDebug(1202) << "Null container" << endl;
+  kdDebug(1202) << m_pMainWindow->currentView();
+
+  if (container) container->printFrameInfo(QString::null);
+  else kdDebug(1202) << "Null Container" << endl;
 }
 
 #include "konq_viewmgr.moc"
diff -u kdebase-2.2.2.orig/konqueror/konq_viewmgr.h \
                kdebase-2.2.2/konqueror/konq_viewmgr.h
--- kdebase-2.2.2.orig/konqueror/konq_viewmgr.h	Sat Jul 28 23:56:40 2001
+++ kdebase-2.2.2/konqueror/konq_viewmgr.h	Sun Dec  9 17:56:36 2001
@@ -38,6 +38,8 @@
 class KonqMainWindow;
 class KonqFrameBase;
 class KonqFrameContainer;
+class KonqFrameContainerBase;
+class KonqFrameTabs;
 class KonqView;
 class BrowserView;
 class KActionMenu;
@@ -81,6 +83,14 @@
                          const QString & serviceName = QString::null,
                          bool newOneFirst = false);
 
+	/**
+	 * Adds a tab to m_pMainContainer
+	 */
+
+  KonqView* addTab(const QString &serviceType = QString::null,
+		     					 const QString &serviceName = QString::null,
+							     bool passiveMode = false);
+
   /**
    * Do the actual splitting. The new View will be created from \
                serviceType.
    * Returns the newly created view or 0L if the new view couldn't be \
created. @@ -99,6 +109,12 @@
   void removeView( KonqView *view );
 
   /**
+   * Guess Again!:->
+   * Also takes care of setting another view as active if the active view \
was in this tab +   */
+	void removeCurrentTab();
+
+  /**
    * Saves the current view layout to a config file.
    * Remove config file before saving, especially if saveURLs is false.
    * @param cfg the config file
@@ -174,7 +190,7 @@
 
   void profileListDirty( bool broadcast = true );
 
-  KonqFrameContainer *mainContainer() const { return m_pMainContainer; }
+  KonqFrameTabs *mainContainer() const { return m_pMainContainer; }
 
   KonqMainWindow *mainWindow() const { return m_pMainWindow; }
 
@@ -216,7 +232,7 @@
    * @param openURL whether to open urls at all (from the profile or using \
                @p defaultURL).
    *  (this is set to false when we have a forcedURL to open)
    */
-  void loadItem( KConfig &cfg, KonqFrameContainer *parent,
+  void loadItem( KConfig &cfg, KonqFrameContainerBase *parent,
                  const QString &name, const KURL & defaultURL, bool \
openURL );  
   // Disabled - we do it ourselves
@@ -239,7 +255,7 @@
    * Mainly creates the backend structure(KonqView) for a view and
    * connects it
    */
-  KonqView *setupView( KonqFrameContainer *parentContainer,
+  KonqView *setupView( KonqFrameContainerBase *parentContainer,
                        KonqViewFactory &viewFactory,
                        const KService::Ptr &service,
                        const KTrader::OfferList &partServiceOffers,
@@ -249,13 +265,14 @@
 
   //just for debugging
   void printSizeInfo( KonqFrameBase* frame,
-                      KonqFrameContainer* parent,
+                      KonqFrameContainerBase* parent,
                       const char* msg );
-  void printFullHierarchy( KonqFrameContainer * container, int ident = 0 \
); +
+  void printFullHierarchy( KonqFrameContainerBase * container );
 
   KonqMainWindow *m_pMainWindow;
 
-  KonqFrameContainer *m_pMainContainer;
+  KonqFrameTabs *m_pMainContainer;
 
   QGuardedPtr<KActionMenu> m_pamProfiles;
   bool m_bProfileListDirty;
diff -u kdebase-2.2.2.orig/konqueror/konqueror.rc \
                kdebase-2.2.2/konqueror/konqueror.rc
--- kdebase-2.2.2.orig/konqueror/konqueror.rc	Sat Jul 28 23:56:40 2001
+++ kdebase-2.2.2/konqueror/konqueror.rc	Tue Dec 11 21:49:56 2001
@@ -87,6 +87,9 @@
   <Action name="splitviewv"/>
   <Action name="removeview"/>
   <Separator/>
+  <Action name="addtab"/>
+  <Action name="removecurrenttab"/>
+  <Separator/>    
   <ActionList name="toggleview" />
   <Separator/>
   <Action name="saveviewprofile"/>
Common subdirectories: kdebase-2.2.2.orig/konqueror/listview and \
kdebase-2.2.2/konqueror/listview Common subdirectories: \
kdebase-2.2.2.orig/konqueror/pics and kdebase-2.2.2/konqueror/pics Common \
subdirectories: kdebase-2.2.2.orig/konqueror/shellcmdplugin and \
kdebase-2.2.2/konqueror/shellcmdplugin Common subdirectories: \
kdebase-2.2.2.orig/konqueror/sidebar and kdebase-2.2.2/konqueror/sidebar



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic