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

List:       kfm-devel
Subject:    Re: MMB opens in new tab
From:       Doug Hanley <hanleyman () adelphia ! net>
Date:       2002-07-19 3:25:08
[Download RAW message or body]

On Monday 15 July 2002 01:10 pm, David Faure wrote:
> The point is that:
> * openURL might or might not know the mimetype. If it does, it calls
> openView. If it doesn't, it creates a KonqRun which will call openView
> later too. * openView *ALWAYS* knows the mimetype. It's been found out
> before, see above ;)

> Better yet: let openURL find the mimetype first if necessary, and then,
> in openView, create the tab around the part.
> I guess you simply need a flag that tells openView to create a tab
> instead of a normal view.
>
> All the logic for the mimetype determination is in place and works fine,
> use it, don't work around it. Thanks ;)

Heres a new patch that takes all that into account, seems to work well.  
Should I commit?

(sorry that this patch is kind of large)

-- Doug
["cvskonqtabs-071802.patch" (text/x-diff)]

Index: konq_mainwindow.cc
===================================================================
RCS file: /home/kde/kdebase/konqueror/konq_mainwindow.cc,v
retrieving revision 1.1022
diff -u -3 -p -r1.1022 konq_mainwindow.cc
--- konq_mainwindow.cc	2002/07/15 18:07:13	1.1022
+++ konq_mainwindow.cc	2002/07/19 03:19:26
@@ -111,6 +111,7 @@ KonqMainWindow::KonqMainWindow( const KU
   m_pChildFrame = 0L;
   m_pActiveChild = 0L;
   m_pWorkingTab = 0L;
+  m_bNewTabInFront = false;
   m_initialKonqRun = 0L;
   m_pBookmarkMenu = 0L;
   m_dcopObject = 0L;
@@ -355,7 +356,7 @@ void KonqMainWindow::openFilteredURL( co
 
 void KonqMainWindow::openURL( KonqView *_view, const KURL &_url,
                               const QString &_serviceType, const KonqOpenURLRequest \
                & req,
-                              bool trustedSource )
+                              bool trustedSource, bool newTab )
 {
   kdDebug(1202) << "KonqMainWindow::openURL : url = '" << _url.url() << "'  "
                 << "serviceType='" << _serviceType << "' view=" << _view << endl;
@@ -383,7 +384,7 @@ void KonqMainWindow::openURL( KonqView *
   }
 
   KonqView *view = _view;
-  if ( !view )
+  if ( !view  && !newTab)
     view = m_currentView; /* Note, this can be 0L, e.g. on startup */
 
   if ( view )
@@ -419,7 +420,7 @@ void KonqMainWindow::openURL( KonqView *
   if ( ( !serviceType.isEmpty() && serviceType != "application/octet-stream") || \
url.protocol() == "about" )  {
     // Built-in view ?
-    if ( !openView( serviceType, url, view /* can be 0L */, req ) )
+    if ( !openView( serviceType, url, view /* can be 0L */, req, newTab ) )
     {
         //kdDebug(1202) << "KonqMainWindow::openURL : openView returned false" << \
                endl;
         // Are we following another view ? Then forget about this URL. Otherwise \
fire app. @@ -455,7 +456,7 @@ void KonqMainWindow::openURL( KonqView *
   else // no known serviceType, use KonqRun
   {
       kdDebug(1202) << "Creating new konqrun for " << url.url() << " req.typedURL=" \
                << req.typedURL << endl;
-      KonqRun * run = new KonqRun( this, view /* can be 0L */, url, req, \
trustedSource ); +      KonqRun * run = new KonqRun( this, view /* can be 0L */, url, \
req, trustedSource, newTab );  if ( view )
         view->setRun( run );
       else
@@ -471,7 +472,7 @@ void KonqMainWindow::openURL( KonqView *
   }
 }
 
-bool KonqMainWindow::openView( QString serviceType, const KURL &_url, KonqView \
*childView, KonqOpenURLRequest req ) +bool KonqMainWindow::openView( QString \
serviceType, const KURL &_url, KonqView *childView, KonqOpenURLRequest req, bool \
newTab )  {
   if ( KonqRun::isExecutable( serviceType ) )
      return false; // execute, don't open
@@ -602,11 +603,31 @@ bool KonqMainWindow::openView( QString s
   bool ok = true;
   if ( !childView )
     {
-      // Create a new view
-      // Initialize always uses force auto-embed even if user setting is "separate \
                viewer",
-      // since this window has no view yet - we don't want to keep an empty \
                mainwindow.
-      // This can happen with e.g. application/pdf from a target="_blank" link, or \
                window.open.
-      childView = m_pViewManager->Initialize( serviceType, serviceName );
+      if (newTab)
+      {
+        childView = m_pViewManager->addTab( serviceType, serviceName );
+        if (m_bNewTabInFront && childView)
+        {
+          KonqFrameTabs* tabContainer = \
static_cast<KonqFrameTabs*>(m_pViewManager->docContainer()); +          \
tabContainer->setCurrentPage( tabContainer->count()-1 ); +        }
+      }
+
+      else
+      {
+        // Create a new view
+        // Initialize always uses force auto-embed even if user setting is "separate \
viewer", +        // since this window has no view yet - we don't want to keep an \
empty mainwindow. +        // This can happen with e.g. application/pdf from a \
target="_blank" link, or window.open. +        childView = \
m_pViewManager->Initialize( serviceType, serviceName ); +      
+        enableAllActions( true );
+
+        m_pViewManager->setActivePart( childView->part() );
+
+        childView->setViewName( m_initialFrameName );
+        m_initialFrameName = QString::null;
+      }
 
       if ( !childView )
         {
@@ -614,14 +635,7 @@ bool KonqMainWindow::openView( QString s
               .arg(KLibLoader::self()->lastErrorMessage()) );
           return true; // fake everything was ok, we don't want to propagate the \
error  }
-
-      enableAllActions( true );
-
-      m_pViewManager->setActivePart( childView->part() );
-
-      childView->setViewName( m_initialFrameName );
-      m_initialFrameName = QString::null;
-    }
+      }
   else // We know the child view
     {
       //childView->stop();
@@ -807,11 +821,8 @@ void KonqMainWindow::slotCreateNewWindow
     KConfig *config = KGlobal::config();
     KConfigGroupSaver cs( config, QString::fromLatin1("FMSettings") );
     if ( config->readBoolEntry( "MMBOpensTab", false ) ) {
-      KFileItem item( url, 0 /*_mimeType*/, 0 /*_mode*/ );  // FIXME with real \
                values
-      KFileItemList items;
-      items.append( &item );
-      popupItems = items;
-      popupNewTab(true);  // False opens in background tab
+      m_bNewTabInFront = true;
+      openURL( 0L, url, QString::null, KonqOpenURLRequest(), false, true );    
     }
     else
       KonqMisc::createNewWindow( url, args );
@@ -1478,6 +1489,12 @@ void KonqMainWindow::slotRunFinished()
   kdDebug(1202) << "KonqMainWindow::slotRunFinished()" << endl;
   const KonqRun *run = static_cast<const KonqRun *>( sender() );
 
+  if (run->newTab() && m_bNewTabInFront && \
m_pViewManager->docContainer()->frameType()=="Tabs") +  {
+    KonqFrameTabs* tabContainer = \
static_cast<KonqFrameTabs*>(m_pViewManager->docContainer()); +    \
tabContainer->setCurrentPage( tabContainer->count()-1 ); +  }
+  
   if ( run == m_initialKonqRun )
       m_initialKonqRun = 0L;
 
@@ -1995,37 +2012,25 @@ void KonqMainWindow::slotBreakOffTabPopu
 
 void KonqMainWindow::slotPopupNewTabAtFront()
 {
-  popupNewTab(true);
+  m_bNewTabInFront = true;
+  popupNewTab();
 }
 
 void KonqMainWindow::slotPopupNewTab()
 {
-  popupNewTab(false);
+  m_bNewTabInFront = false;
+  popupNewTab();
 }
 
-void KonqMainWindow::popupNewTab(bool infront)
+void KonqMainWindow::popupNewTab()
 {
-  KURL url;
+  kdDebug(1202) << "KonqMainWindow::popupNewTab()" << endl;
+  
   KFileItemListIterator it ( popupItems );
-  QString mimeType, mimeComment;
-  KonqView* newView = 0;
-  KonqView* lastView = 0;
   for ( ; it.current(); ++it )
   {
-    newView = 0L;
-    url = (*it)->url();
-    mimeType = (*it)->mimetype();
-    mimeComment = (*it)->mimeComment();
-    if (mimeType == "application/octet-stream") mimeType = mimeComment = "";
-    newView = m_pViewManager->addTab(mimeType, mimeComment);
-    if (newView != 0L)
-    {
-      newView->openURL( url, url.prettyURL() );
-      lastView = newView;
-    }
+    openURL( 0L, (*it)->url(), QString::null, KonqOpenURLRequest(), false, true );   \
  }
-  if (infront)
-    m_pViewManager->showTab(lastView);
 }
 
 void KonqMainWindow::slotRemoveView()
Index: konq_mainwindow.h
===================================================================
RCS file: /home/kde/kdebase/konqueror/konq_mainwindow.h,v
retrieving revision 1.363
diff -u -3 -p -r1.363 konq_mainwindow.h
--- konq_mainwindow.h	2002/07/15 18:07:13	1.363
+++ konq_mainwindow.h	2002/07/19 03:19:27
@@ -102,7 +102,8 @@ public:
    */
   void openURL( KonqView * view, const KURL & url,
                 const QString &serviceType = QString::null,
-                const KonqOpenURLRequest & req = KonqOpenURLRequest(), bool \
trustedSource = false ); +                const KonqOpenURLRequest & req = \
KonqOpenURLRequest(), +		bool trustedSource = false, bool newTab = false );
 
   /**
    * Called by openURL when it knows the service type (either directly,
@@ -111,7 +112,8 @@ public:
    * that holds it might get destroyed (by childView->stop())
    */
   bool openView( QString serviceType, const KURL &_url, KonqView *childView,
-                 KonqOpenURLRequest req = KonqOpenURLRequest() );
+                 KonqOpenURLRequest req = KonqOpenURLRequest(),
+		 bool newTab = false );
 
 
   void abortLoading();
@@ -492,7 +494,7 @@ private:
   void initCombo();
   void initActions();
 
-  void popupNewTab(bool infront);
+  void popupNewTab();
 
   /**
    * Tries to find a index.html (.kde.html) file in the specified directory
@@ -598,6 +600,7 @@ private:
   KonqFrameBase* m_pWorkingTab;
 
   KFileItemList popupItems;
+  bool m_bNewTabInFront;
 
   KonqRun *m_initialKonqRun;
 
Index: konq_run.cc
===================================================================
RCS file: /home/kde/kdebase/konqueror/konq_run.cc,v
retrieving revision 1.74
diff -u -3 -p -r1.74 konq_run.cc
--- konq_run.cc	2002/06/14 04:59:56	1.74
+++ konq_run.cc	2002/07/19 03:19:27
@@ -28,12 +28,12 @@
 #include <assert.h>
 
 KonqRun::KonqRun( KonqMainWindow* mainWindow, KonqView *_childView,
-                  const KURL & _url, const KonqOpenURLRequest & req, bool \
trustedSource ) +                  const KURL & _url, const KonqOpenURLRequest & req, \
                bool trustedSource, bool newTab )
     : KParts::BrowserRun( _url, req.args, _childView ? _childView->part() : 0L, \
                mainWindow,
                           //remove referrer if request was typed in manually.
                           // ### TODO: turn this off optionally.
                           !req.typedURL.isEmpty(), trustedSource ),
-    m_pMainWindow( mainWindow ), m_pView( _childView ), m_bFoundMimeType( false ), \
m_req( req ) +    m_pMainWindow( mainWindow ), m_pView( _childView ), \
m_bFoundMimeType( false ), m_bNewTab( newTab ), m_req( req )  {
   assert( !m_pMainWindow.isNull() );
   if (m_pView)
@@ -71,7 +71,7 @@ void KonqRun::foundMimeType( const QStri
   // Grab the args back from BrowserRun
   m_req.args = m_args;
 
-  m_bFinished = m_pMainWindow->openView( mimeType, m_strURL, m_pView, m_req );
+  m_bFinished = m_pMainWindow->openView( mimeType, m_strURL, m_pView, m_req, \
m_bNewTab );  if ( m_bFinished ) {
     m_pMainWindow = 0L;
     m_timer.start( 0, true );
Index: konq_run.h
===================================================================
RCS file: /home/kde/kdebase/konqueror/konq_run.h,v
retrieving revision 1.23
diff -u -3 -p -r1.23 konq_run.h
--- konq_run.h	2002/01/12 17:32:00	1.23
+++ konq_run.h	2002/07/19 03:19:27
@@ -38,7 +38,7 @@ public:
    */
   KonqRun( KonqMainWindow* mainWindow, KonqView *childView,
            const KURL &url, const KonqOpenURLRequest & req = KonqOpenURLRequest(),
-           bool trustedSource = false );
+           bool trustedSource = false, bool newTab = false );
 
   virtual ~KonqRun();
 
@@ -50,6 +50,8 @@ public:
   KonqView *childView() const { return m_pView; }
 
   const QString & typedURL() const { return m_req.typedURL; }
+  
+  bool newTab() const { return m_bNewTab; }
 
 protected:
   virtual void foundMimeType( const QString & _type );
@@ -59,6 +61,7 @@ protected:
   QGuardedPtr<KonqMainWindow> m_pMainWindow;
   QGuardedPtr<KonqView> m_pView;
   bool m_bFoundMimeType;
+  bool m_bNewTab;
   KonqOpenURLRequest m_req;
 };
 



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

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