You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1832 lines
62 KiB
1832 lines
62 KiB
// -*- mode: c++; c-basic-offset: 2 -*-
|
|
/* This file is part of the KDE project
|
|
Copyright (C) 1999 Simon Hausmann <hausmann@kde.org>
|
|
|
|
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.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
*/
|
|
|
|
#include "konq_viewmgr.h"
|
|
#include "konq_view.h"
|
|
#include "konq_frame.h"
|
|
#include "konq_tabs.h"
|
|
#include "konq_profiledlg.h"
|
|
#include "konq_events.h"
|
|
#include "konq_settingsxt.h"
|
|
|
|
#include <tqfileinfo.h>
|
|
#include <tqptrlist.h>
|
|
|
|
#include <kaccelgen.h>
|
|
#include <kstandarddirs.h>
|
|
#include <kdebug.h>
|
|
#include <kapplication.h>
|
|
#include <kglobalsettings.h>
|
|
#include <ktempfile.h>
|
|
#include <dcopclient.h>
|
|
#include <klocale.h>
|
|
#include <kmessagebox.h>
|
|
|
|
#include <assert.h>
|
|
#include <kpopupmenu.h>
|
|
|
|
// #define DEBUG_VIEWMGR
|
|
|
|
template class TQPtrList<KonqView>;
|
|
|
|
KonqViewManager::KonqViewManager( KonqMainWindow *mainWindow )
|
|
: KParts::PartManager( mainWindow )
|
|
{
|
|
m_pMainWindow = mainWindow;
|
|
m_pDocContainer = 0L;
|
|
|
|
m_pamProfiles = 0L;
|
|
m_bProfileListDirty = true;
|
|
m_bLoadingProfile = false;
|
|
|
|
m_activePartChangedTimer = new TQTimer(this);
|
|
connect(m_activePartChangedTimer, TQT_SIGNAL(timeout()), this, TQT_SLOT(emitActivePartChanged()));
|
|
connect( this, TQT_SIGNAL( activePartChanged ( KParts::Part * ) ), this, TQT_SLOT( slotActivePartChanged ( KParts::Part * ) ) );
|
|
}
|
|
|
|
KonqView* KonqViewManager::Initialize( const TQString &serviceType, const TQString &serviceName )
|
|
{
|
|
//kdDebug(1202) << "KonqViewManager::Initialize()" << endl;
|
|
KService::Ptr service;
|
|
KTrader::OfferList partServiceOffers, appServiceOffers;
|
|
KonqViewFactory newViewFactory = createView( serviceType, serviceName, service, partServiceOffers, appServiceOffers, true /*forceAutoEmbed*/ );
|
|
if ( newViewFactory.isNull() )
|
|
{
|
|
kdDebug(1202) << "KonqViewManager::Initialize() No suitable factory found." << endl;
|
|
return 0;
|
|
}
|
|
|
|
KonqView* childView = setupView( m_pMainWindow, newViewFactory, service, partServiceOffers, appServiceOffers, serviceType, false );
|
|
|
|
setActivePart( childView->part() );
|
|
m_pDocContainer = childView->frame();
|
|
|
|
convertDocContainer();
|
|
static_cast<KonqFrameTabs*>( m_pDocContainer )->setAlwaysTabbedMode(
|
|
KonqSettings::alwaysTabbedMode() );
|
|
|
|
m_pDocContainer->widget()->show();
|
|
return childView;
|
|
}
|
|
|
|
KonqViewManager::~KonqViewManager()
|
|
{
|
|
//kdDebug(1202) << "KonqViewManager::~KonqViewManager()" << endl;
|
|
clear();
|
|
}
|
|
|
|
KonqView* KonqViewManager::splitView ( Qt::Orientation orientation,
|
|
const TQString &serviceType,
|
|
const TQString &serviceName,
|
|
bool newOneFirst, bool forceAutoEmbed )
|
|
{
|
|
#ifdef DEBUG_VIEWMGR
|
|
kdDebug(1202) << "KonqViewManager::splitView(ServiceType)" << endl;
|
|
m_pMainWindow->dumpViewList();
|
|
printFullHierarchy( m_pMainWindow );
|
|
#endif
|
|
|
|
KonqFrame* splitFrame = m_pMainWindow->currentView()->frame();
|
|
|
|
KService::Ptr service;
|
|
KTrader::OfferList partServiceOffers, appServiceOffers;
|
|
|
|
KonqViewFactory newViewFactory = createView( serviceType, serviceName, service, partServiceOffers, appServiceOffers, forceAutoEmbed );
|
|
|
|
if( newViewFactory.isNull() )
|
|
return 0L; //do not split at all if we can't create the new view
|
|
|
|
assert( splitFrame );
|
|
|
|
KonqFrameContainerBase* parentContainer = splitFrame->parentContainer();
|
|
|
|
bool moveNewContainer = false;
|
|
TQValueList<int> splitterSizes;
|
|
int index= -1;
|
|
|
|
if (parentContainer->frameType()=="Container") {
|
|
moveNewContainer = (static_cast<KonqFrameContainer*>(parentContainer)->idAfter( splitFrame->widget() ) != 0);
|
|
splitterSizes = static_cast<KonqFrameContainer*>(parentContainer)->sizes();
|
|
}
|
|
else if (parentContainer->frameType()=="Tabs")
|
|
index = static_cast<KonqFrameTabs*>(parentContainer)->indexOf( splitFrame->widget() );
|
|
|
|
#ifndef NDEBUG
|
|
//printSizeInfo( splitFrame, parentContainer, "before split");
|
|
#endif
|
|
|
|
parentContainer->widget()->tqsetUpdatesEnabled( false );
|
|
|
|
//kdDebug(1202) << "Move out child" << endl;
|
|
TQPoint pos = splitFrame->widget()->pos();
|
|
parentContainer->removeChildFrame( splitFrame );
|
|
splitFrame->widget()->reparent( m_pMainWindow, pos );
|
|
|
|
//kdDebug(1202) << "Create new Container" << endl;
|
|
KonqFrameContainer *newContainer = new KonqFrameContainer( orientation, parentContainer->widget(), parentContainer );
|
|
connect(newContainer,TQT_SIGNAL(ctrlTabPressed()),m_pMainWindow,TQT_SLOT(slotCtrlTabPressed()));
|
|
|
|
parentContainer->insertChildFrame( newContainer, index );
|
|
if ( moveNewContainer ) {
|
|
static_cast<KonqFrameContainer*>(parentContainer)->moveToFirst( newContainer );
|
|
static_cast<KonqFrameContainer*>(parentContainer)->swapChildren();
|
|
}
|
|
|
|
//kdDebug(1202) << "Move in child" << endl;
|
|
splitFrame->widget()->reparent( newContainer, pos );
|
|
newContainer->insertChildFrame( splitFrame );
|
|
|
|
#ifndef NDEBUG
|
|
//printSizeInfo( splitFrame, parentContainer, "after reparent" );
|
|
#endif
|
|
|
|
//kdDebug(1202) << "Create new child" << endl;
|
|
KonqView *newView = setupView( newContainer, newViewFactory, service, partServiceOffers, appServiceOffers, serviceType, false );
|
|
|
|
#ifndef DEBUG
|
|
//printSizeInfo( splitFrame, parentContainer, "after child insert" );
|
|
#endif
|
|
|
|
if ( newOneFirst )
|
|
{
|
|
newContainer->moveToLast( splitFrame->widget() );
|
|
newContainer->swapChildren();
|
|
}
|
|
|
|
TQValueList<int> newSplitterSizes;
|
|
newSplitterSizes << 50 << 50;
|
|
newContainer->setSizes( newSplitterSizes );
|
|
|
|
if (parentContainer->frameType()=="Container") {
|
|
static_cast<KonqFrameContainer*>(parentContainer)->setSizes( splitterSizes );
|
|
}
|
|
else if (parentContainer->frameType()=="Tabs")
|
|
static_cast<KonqFrameTabs*>(parentContainer)->showPage( newContainer );
|
|
|
|
splitFrame->show();
|
|
//newView->frame()->show();
|
|
newContainer->show();
|
|
|
|
parentContainer->widget()->tqsetUpdatesEnabled( true );
|
|
|
|
if (m_pDocContainer == splitFrame) m_pDocContainer = newContainer;
|
|
|
|
assert( newView->frame() );
|
|
assert( newView->part() );
|
|
newContainer->setActiveChild( newView->frame() );
|
|
setActivePart( newView->part(), false );
|
|
|
|
#ifdef DEBUG_VIEWMGR
|
|
m_pMainWindow->dumpViewList();
|
|
printFullHierarchy( m_pMainWindow );
|
|
kdDebug(1202) << "KonqViewManager::splitView(ServiceType) done" << endl;
|
|
#endif
|
|
|
|
return newView;
|
|
}
|
|
|
|
KonqView* KonqViewManager::splitWindow( Qt::Orientation orientation,
|
|
const TQString &serviceType,
|
|
const TQString &serviceName,
|
|
bool newOneFirst )
|
|
{
|
|
kdDebug(1202) << "KonqViewManager::splitWindow(default)" << endl;
|
|
|
|
// Don't crash when doing things too quickly.
|
|
if (!m_pMainWindow || !m_pMainWindow->currentView())
|
|
return 0L;
|
|
|
|
KURL url = m_pMainWindow->currentView()->url();
|
|
TQString locationBarURL = m_pMainWindow->currentView()->locationBarURL();
|
|
|
|
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
|
|
|
|
KonqFrameBase* mainFrame = m_pMainWindow->childFrame();
|
|
|
|
mainFrame->widget()->tqsetUpdatesEnabled( false );
|
|
|
|
//kdDebug(1202) << "Move out child" << endl;
|
|
TQPoint pos = mainFrame->widget()->pos();
|
|
m_pMainWindow->removeChildFrame( mainFrame );
|
|
|
|
KonqFrameContainer *newContainer = new KonqFrameContainer( orientation, m_pMainWindow, 0L);
|
|
connect(newContainer,TQT_SIGNAL(ctrlTabPressed()),m_pMainWindow,TQT_SLOT(slotCtrlTabPressed()));
|
|
|
|
m_pMainWindow->insertChildFrame( newContainer );
|
|
|
|
newContainer->insertChildFrame( mainFrame );
|
|
mainFrame->widget()->reparent( newContainer, pos );
|
|
|
|
KonqView* childView = setupView( newContainer, newViewFactory, service, partServiceOffers, appServiceOffers, serviceType, true );
|
|
|
|
if( newOneFirst ) {
|
|
static_cast<KonqFrameContainer*>(newContainer)->moveToFirst( childView->frame() );
|
|
static_cast<KonqFrameContainer*>(newContainer)->swapChildren();
|
|
}
|
|
|
|
newContainer->show();
|
|
|
|
mainFrame->widget()->tqsetUpdatesEnabled( true );
|
|
|
|
if( childView )
|
|
childView->openURL( url, locationBarURL );
|
|
|
|
newContainer->setActiveChild( mainFrame );
|
|
|
|
#ifdef DEBUG_VIEWMGR
|
|
m_pMainWindow->dumpViewList();
|
|
printFullHierarchy( m_pMainWindow );
|
|
kdDebug(1202) << "KonqViewManager::splitWindow(default) done" << endl;
|
|
#endif
|
|
|
|
return childView;
|
|
}
|
|
|
|
void KonqViewManager::convertDocContainer()
|
|
{
|
|
// Must create a tab container since one is not present,
|
|
// then insert the existing frame as a tab
|
|
|
|
KonqFrameContainerBase* parentContainer = m_pDocContainer->parentContainer();
|
|
|
|
bool moveNewContainer = false;
|
|
TQValueList<int> splitterSizes;
|
|
if (parentContainer->frameType()=="Container") {
|
|
moveNewContainer = (static_cast<KonqFrameContainer*>(parentContainer)->idAfter( m_pDocContainer->widget() ) != 0);
|
|
splitterSizes = static_cast<KonqFrameContainer*>(parentContainer)->sizes();
|
|
}
|
|
|
|
parentContainer->widget()->tqsetUpdatesEnabled( false );
|
|
|
|
//kdDebug(1202) << "Move out child" << endl;
|
|
TQPoint pos = m_pDocContainer->widget()->pos();
|
|
parentContainer->removeChildFrame( m_pDocContainer );
|
|
m_pDocContainer->widget()->reparent( m_pMainWindow, pos );
|
|
|
|
KonqFrameTabs* newContainer = new KonqFrameTabs( parentContainer->widget() , parentContainer, this);
|
|
parentContainer->insertChildFrame( newContainer );
|
|
connect( newContainer, TQT_SIGNAL(ctrlTabPressed()), m_pMainWindow, TQT_SLOT(slotCtrlTabPressed()) );
|
|
|
|
m_pDocContainer->widget()->reparent( newContainer, pos );
|
|
newContainer->insertChildFrame( m_pDocContainer );
|
|
|
|
if ( moveNewContainer ) {
|
|
static_cast<KonqFrameContainer*>(parentContainer)->moveToFirst( newContainer );
|
|
static_cast<KonqFrameContainer*>(parentContainer)->swapChildren();
|
|
}
|
|
if (parentContainer->frameType()=="Container")
|
|
static_cast<KonqFrameContainer*>(parentContainer)->setSizes( splitterSizes );
|
|
|
|
newContainer->show();
|
|
|
|
parentContainer->widget()->tqsetUpdatesEnabled( true );
|
|
|
|
m_pDocContainer = newContainer;
|
|
}
|
|
|
|
KonqView* KonqViewManager::addTab(const TQString &serviceType, const TQString &serviceName, bool passiveMode, bool openAfterCurrentPage )
|
|
{
|
|
#ifdef DEBUG_VIEWMGR
|
|
kdDebug(1202) << "------------- KonqViewManager::addTab starting -------------" << endl;
|
|
m_pMainWindow->dumpViewList();
|
|
printFullHierarchy( m_pMainWindow );
|
|
#endif
|
|
|
|
if (m_pDocContainer == 0L)
|
|
{
|
|
if (m_pMainWindow &&
|
|
m_pMainWindow->currentView() &&
|
|
m_pMainWindow->currentView()->frame()) {
|
|
m_pDocContainer = m_pMainWindow->currentView()->frame();
|
|
} else {
|
|
kdDebug(1202) << "This view profile does not support tabs." << endl;
|
|
return 0L;
|
|
}
|
|
}
|
|
|
|
KService::Ptr service;
|
|
KTrader::OfferList partServiceOffers, appServiceOffers;
|
|
|
|
KonqViewFactory newViewFactory = createView( serviceType, serviceName, service, partServiceOffers, appServiceOffers, true /*forceAutoEmbed*/ );
|
|
|
|
if( newViewFactory.isNull() )
|
|
return 0L; //do not split at all if we can't create the new view
|
|
|
|
if (m_pDocContainer->frameType() != "Tabs") convertDocContainer();
|
|
|
|
KonqView* childView = setupView( static_cast<KonqFrameTabs*>(m_pDocContainer), newViewFactory, service, partServiceOffers, appServiceOffers, serviceType, passiveMode, openAfterCurrentPage );
|
|
|
|
#ifdef DEBUG_VIEWMGR
|
|
m_pMainWindow->dumpViewList();
|
|
printFullHierarchy( m_pMainWindow );
|
|
kdDebug(1202) << "------------- KonqViewManager::addTab done -------------" << endl;
|
|
#endif
|
|
|
|
return childView;
|
|
}
|
|
|
|
KonqView* KonqViewManager::addTabFromHistory( int steps, bool openAfterCurrentPage )
|
|
{
|
|
if (m_pDocContainer == 0L)
|
|
{
|
|
if (m_pMainWindow &&
|
|
m_pMainWindow->currentView() &&
|
|
m_pMainWindow->currentView()->frame()) {
|
|
m_pDocContainer = m_pMainWindow->currentView()->frame();
|
|
} else {
|
|
kdDebug(1202) << "This view profile does not support tabs." << endl;
|
|
return 0L;
|
|
}
|
|
}
|
|
if (m_pDocContainer->frameType() != "Tabs") convertDocContainer();
|
|
|
|
int oldPos = m_pMainWindow->currentView()->historyPos();
|
|
int newPos = oldPos + steps;
|
|
|
|
const HistoryEntry * he = m_pMainWindow->currentView()->historyAt(newPos);
|
|
if(!he)
|
|
return 0L;
|
|
|
|
KonqView* newView = 0L;
|
|
newView = addTab( he->strServiceType, he->strServiceName, false, openAfterCurrentPage );
|
|
|
|
if(!newView)
|
|
return 0L;
|
|
|
|
newView->copyHistory(m_pMainWindow->currentView());
|
|
newView->setHistoryPos(newPos);
|
|
newView->restoreHistory();
|
|
|
|
return newView;
|
|
}
|
|
|
|
|
|
void KonqViewManager::duplicateTab( KonqFrameBase* tab, bool openAfterCurrentPage )
|
|
{
|
|
#ifdef DEBUG_VIEWMGR
|
|
kdDebug(1202) << "---------------- KonqViewManager::duplicateTab( " << tab << " ) --------------" << endl;
|
|
m_pMainWindow->dumpViewList();
|
|
printFullHierarchy( m_pMainWindow );
|
|
#endif
|
|
|
|
if (m_pDocContainer == 0L)
|
|
{
|
|
if (m_pMainWindow &&
|
|
m_pMainWindow->currentView() &&
|
|
m_pMainWindow->currentView()->frame()) {
|
|
m_pDocContainer = m_pMainWindow->currentView()->frame();
|
|
} else {
|
|
kdDebug(1202) << "This view profile does not support tabs." << endl;
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (m_pDocContainer->frameType() != "Tabs") convertDocContainer();
|
|
|
|
KonqFrameTabs* tabContainer = static_cast<KonqFrameTabs*>(m_pDocContainer);
|
|
|
|
KonqFrameBase* currentFrame;
|
|
if ( tab == 0L )
|
|
currentFrame = tqt_dynamic_cast<KonqFrameBase*>(tabContainer->currentPage());
|
|
else
|
|
currentFrame = tab;
|
|
|
|
if (!currentFrame) {
|
|
return;
|
|
}
|
|
|
|
KTempFile tempFile;
|
|
tempFile.setAutoDelete( true );
|
|
KConfig config( tempFile.name() );
|
|
config.setGroup( "View Profile" );
|
|
|
|
TQString prefix = TQString::tqfromLatin1( currentFrame->frameType() ) + TQString::number(0);
|
|
config.writeEntry( "RootItem", prefix );
|
|
prefix.append( '_' );
|
|
currentFrame->saveConfig( &config, prefix, true, 0L, 0, 1);
|
|
|
|
TQString rootItem = config.readEntry( "RootItem", "empty" );
|
|
|
|
if (rootItem.isNull() || rootItem == "empty") return;
|
|
|
|
// This flag is used by KonqView, to distinguish manual view creation
|
|
// from profile loading (e.g. in switchView)
|
|
m_bLoadingProfile = true;
|
|
|
|
loadItem( config, tabContainer, rootItem, KURL(""), true, openAfterCurrentPage );
|
|
|
|
m_bLoadingProfile = false;
|
|
|
|
m_pMainWindow->enableAllActions(true);
|
|
|
|
// This flag disables calls to viewCountChanged while creating the views,
|
|
// so we do it once at the end :
|
|
m_pMainWindow->viewCountChanged();
|
|
|
|
if (openAfterCurrentPage)
|
|
tabContainer->setCurrentPage( tabContainer->currentPageIndex () + 1 );
|
|
else
|
|
tabContainer->setCurrentPage( tabContainer->count() - 1 );
|
|
|
|
KonqFrameBase* duplicatedFrame = tqt_dynamic_cast<KonqFrameBase*>(tabContainer->currentPage());
|
|
if (duplicatedFrame)
|
|
duplicatedFrame->copyHistory( currentFrame );
|
|
|
|
#ifdef DEBUG_VIEWMGR
|
|
m_pMainWindow->dumpViewList();
|
|
printFullHierarchy( m_pMainWindow );
|
|
kdDebug(1202) << "------------- KonqViewManager::duplicateTab done --------------" << endl;
|
|
#endif
|
|
}
|
|
|
|
void KonqViewManager::breakOffTab( KonqFrameBase* tab )
|
|
{
|
|
#ifdef DEBUG_VIEWMGR
|
|
kdDebug(1202) << "---------------- KonqViewManager::breakOffTab( " << tab << " ) --------------" << endl;
|
|
m_pMainWindow->dumpViewList();
|
|
printFullHierarchy( m_pMainWindow );
|
|
#endif
|
|
|
|
if (m_pDocContainer == 0L) return;
|
|
if (m_pDocContainer->frameType() != "Tabs") return;
|
|
|
|
KonqFrameTabs* tabContainer = static_cast<KonqFrameTabs*>(m_pDocContainer);
|
|
|
|
int width = m_pMainWindow->width();
|
|
int height = m_pMainWindow->height();
|
|
|
|
KonqFrameBase* currentFrame;
|
|
if ( tab == 0L )
|
|
currentFrame = tqt_dynamic_cast<KonqFrameBase*>(tabContainer->currentPage());
|
|
else
|
|
currentFrame = tab;
|
|
|
|
if (!currentFrame) {
|
|
return;
|
|
}
|
|
|
|
KTempFile tempFile;
|
|
tempFile.setAutoDelete( true );
|
|
KConfig config( tempFile.name() );
|
|
config.setGroup( "View Profile" );
|
|
|
|
TQString prefix = TQString::tqfromLatin1( currentFrame->frameType() ) + TQString::number(0);
|
|
config.writeEntry( "RootItem", prefix );
|
|
prefix.append( '_' );
|
|
config.writeEntry( TQString::tqfromLatin1( "docContainer" ).prepend( prefix ), true );
|
|
currentFrame->saveConfig( &config, prefix, true, 0L, 0, 1);
|
|
|
|
KonqMainWindow *mainWindow = new KonqMainWindow( KURL(), false );
|
|
if (mainWindow == 0L) return;
|
|
|
|
mainWindow->viewManager()->loadViewProfile( config, "" );
|
|
|
|
KonqFrameBase * newDocContainer = mainWindow->viewManager()->docContainer();
|
|
if( newDocContainer && newDocContainer->frameType() == "Tabs")
|
|
{
|
|
KonqFrameTabs *kft = static_cast<KonqFrameTabs *>(newDocContainer);
|
|
KonqFrameBase *newFrame = tqt_dynamic_cast<KonqFrameBase*>(kft->currentPage());
|
|
if(newFrame)
|
|
newFrame->copyHistory( currentFrame );
|
|
}
|
|
|
|
removeTab( currentFrame );
|
|
|
|
mainWindow->enableAllActions( true );
|
|
|
|
mainWindow->resize( width, height );
|
|
|
|
mainWindow->activateChild();
|
|
|
|
mainWindow->show();
|
|
|
|
#ifdef DEBUG_VIEWMGR
|
|
m_pMainWindow->dumpViewList();
|
|
printFullHierarchy( m_pMainWindow );
|
|
|
|
mainWindow->dumpViewList();
|
|
mainWindow->viewManager()->printFullHierarchy( mainWindow );
|
|
|
|
kdDebug(1202) << "------------- KonqViewManager::breakOffTab done --------------" << endl;
|
|
#endif
|
|
}
|
|
|
|
void KonqViewManager::removeTab( KonqFrameBase* tab )
|
|
{
|
|
#ifdef DEBUG_VIEWMGR
|
|
kdDebug(1202) << "---------------- KonqViewManager::removeTab( " << tab << " ) --------------" << endl;
|
|
m_pMainWindow->dumpViewList();
|
|
printFullHierarchy( m_pMainWindow );
|
|
#endif
|
|
|
|
if (m_pDocContainer == 0L)
|
|
return;
|
|
if (m_pDocContainer->frameType() != "Tabs" )
|
|
return;
|
|
|
|
KonqFrameTabs* tabContainer = static_cast<KonqFrameTabs*>(m_pDocContainer);
|
|
|
|
KonqFrameBase* currentFrame;
|
|
if ( tab != 0L ) {
|
|
currentFrame = tab;
|
|
} else {
|
|
currentFrame = tqt_dynamic_cast<KonqFrameBase*>(tabContainer->currentPage());
|
|
if (!currentFrame) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
if ( tabContainer->count() == 1 )
|
|
return;
|
|
|
|
if (currentFrame->widget() == tabContainer->currentPage())
|
|
setActivePart( 0L, true );
|
|
|
|
tabContainer->removeChildFrame(currentFrame);
|
|
|
|
TQPtrList<KonqView> viewList;
|
|
TQPtrListIterator<KonqView> it( viewList );
|
|
|
|
currentFrame->listViews( &viewList );
|
|
|
|
for ( it.toFirst(); it != 0L; ++it )
|
|
{
|
|
if (it.current() == m_pMainWindow->currentView())
|
|
setActivePart( 0L, true );
|
|
m_pMainWindow->removeChildView( it.current() );
|
|
delete it.current();
|
|
}
|
|
|
|
delete currentFrame;
|
|
|
|
tabContainer->slotCurrentChanged(tabContainer->currentPage());
|
|
|
|
#ifdef DEBUG_VIEWMGR
|
|
m_pMainWindow->dumpViewList();
|
|
printFullHierarchy( m_pMainWindow );
|
|
kdDebug(1202) << "------------- KonqViewManager::removeTab done --------------" << endl;
|
|
#endif
|
|
}
|
|
|
|
void KonqViewManager::reloadAllTabs( )
|
|
{
|
|
if (m_pDocContainer == 0L) return;
|
|
if (m_pDocContainer->frameType() != "Tabs") return;
|
|
|
|
KonqFrameTabs* tabContainer = static_cast<KonqFrameTabs*>(m_pDocContainer);
|
|
|
|
TQPtrList<KonqFrameBase> frameList = *tabContainer->childFrameList();
|
|
TQPtrListIterator<KonqFrameBase> it( frameList );
|
|
|
|
for ( it.toFirst(); it != 0L; ++it )
|
|
{
|
|
if ( it.current()->activeChildView())
|
|
{
|
|
if( !it.current()->activeChildView()->locationBarURL().isEmpty())
|
|
it.current()->activeChildView()->openURL( it.current()->activeChildView()->url(),it.current()->activeChildView()->locationBarURL());
|
|
}
|
|
}
|
|
}
|
|
|
|
void KonqViewManager::removeOtherTabs( KonqFrameBase* tab )
|
|
{
|
|
|
|
if (m_pDocContainer == 0L) return;
|
|
if (m_pDocContainer->frameType() != "Tabs") return;
|
|
|
|
KonqFrameTabs* tabContainer = static_cast<KonqFrameTabs*>(m_pDocContainer);
|
|
|
|
KonqFrameBase *currentFrame;
|
|
|
|
if ( tab == 0L )
|
|
currentFrame = tqt_dynamic_cast<KonqFrameBase*>(tabContainer->currentPage());
|
|
else
|
|
currentFrame = tab;
|
|
|
|
if (!currentFrame) {
|
|
return;
|
|
}
|
|
|
|
TQPtrList<KonqFrameBase> frameList = *tabContainer->childFrameList();
|
|
TQPtrListIterator<KonqFrameBase> it( frameList );
|
|
|
|
for ( it.toFirst(); it != 0L; ++it )
|
|
{
|
|
if( it.current() != currentFrame )
|
|
removeTab(it.current());
|
|
}
|
|
|
|
}
|
|
|
|
void KonqViewManager::moveTabBackward()
|
|
{
|
|
if (m_pDocContainer == 0L) return;
|
|
if (m_pDocContainer->frameType() != "Tabs") return;
|
|
KonqFrameTabs* tabContainer = static_cast<KonqFrameTabs*>(m_pDocContainer);
|
|
if( tabContainer->count() == 1 ) return;
|
|
|
|
int iTab = tabContainer->currentPageIndex();
|
|
kdDebug()<<" tabContainer->currentPageIndex(); :"<<iTab<<endl;
|
|
tabContainer->moveTabBackward(iTab);
|
|
}
|
|
|
|
void KonqViewManager::moveTabForward()
|
|
{
|
|
if (m_pDocContainer == 0L) return;
|
|
if (m_pDocContainer->frameType() != "Tabs") return;
|
|
KonqFrameTabs* tabContainer = static_cast<KonqFrameTabs*>(m_pDocContainer);
|
|
if( tabContainer->count() == 1 ) return;
|
|
|
|
int iTab = tabContainer->currentPageIndex();
|
|
tabContainer->moveTabForward(iTab);
|
|
}
|
|
|
|
void KonqViewManager::activateNextTab()
|
|
{
|
|
if (m_pDocContainer == 0L) return;
|
|
if (m_pDocContainer->frameType() != "Tabs") return;
|
|
|
|
KonqFrameTabs* tabContainer = static_cast<KonqFrameTabs*>(m_pDocContainer);
|
|
if( tabContainer->count() == 1 ) return;
|
|
|
|
int iTab = tabContainer->currentPageIndex();
|
|
|
|
iTab++;
|
|
|
|
if( iTab == tabContainer->count() )
|
|
iTab = 0;
|
|
|
|
tabContainer->setCurrentPage( iTab );
|
|
}
|
|
|
|
void KonqViewManager::activatePrevTab()
|
|
{
|
|
if (m_pDocContainer == 0L) return;
|
|
if (m_pDocContainer->frameType() != "Tabs") return;
|
|
|
|
KonqFrameTabs* tabContainer = static_cast<KonqFrameTabs*>(m_pDocContainer);
|
|
if( tabContainer->count() == 1 ) return;
|
|
|
|
int iTab = tabContainer->currentPageIndex();
|
|
|
|
iTab--;
|
|
|
|
if( iTab == -1 )
|
|
iTab = tabContainer->count() - 1;
|
|
|
|
tabContainer->setCurrentPage( iTab );
|
|
}
|
|
|
|
void KonqViewManager::activateTab(int position)
|
|
{
|
|
if (m_pDocContainer == 0L) return;
|
|
if (m_pDocContainer->frameType() != "Tabs") return;
|
|
|
|
KonqFrameTabs* tabContainer = static_cast<KonqFrameTabs*>(m_pDocContainer);
|
|
if (position<0 || tabContainer->count() == 1 || position>=tabContainer->count()) return;
|
|
|
|
tabContainer->setCurrentPage( position );
|
|
}
|
|
|
|
void KonqViewManager::showTab( KonqView *view )
|
|
{
|
|
KonqFrameTabs *tabContainer = static_cast<KonqFrameTabs*>( docContainer() );
|
|
if (tabContainer->currentPage() != view->frame())
|
|
{
|
|
tabContainer->showPage( view->frame() );
|
|
emitActivePartChanged();
|
|
}
|
|
}
|
|
|
|
void KonqViewManager::updatePixmaps()
|
|
{
|
|
if (m_pDocContainer == 0L) return;
|
|
if (m_pDocContainer->frameType() != "Tabs") return;
|
|
|
|
KonqFrameTabs* tabContainer = static_cast<KonqFrameTabs*>(m_pDocContainer);
|
|
|
|
TQPtrList<KonqView> viewList;
|
|
TQPtrListIterator<KonqView> it( viewList );
|
|
|
|
tabContainer->listViews( &viewList );
|
|
for ( it.toFirst(); it != 0L; ++it )
|
|
it.current()->setTabIcon( KURL::fromPathOrURL( it.current()->locationBarURL() ) );
|
|
}
|
|
|
|
void KonqViewManager::removeView( KonqView *view )
|
|
{
|
|
#ifdef DEBUG_VIEWMGR
|
|
kdDebug(1202) << "---------------- removeView --------------" << view << endl;
|
|
m_pMainWindow->dumpViewList();
|
|
printFullHierarchy( m_pMainWindow );
|
|
#endif
|
|
|
|
if (!view)
|
|
return;
|
|
|
|
KonqFrame* frame = view->frame();
|
|
KonqFrameContainerBase* parentContainer = frame->parentContainer();
|
|
|
|
kdDebug(1202) << "view=" << view << " frame=" << frame << " parentContainer=" << parentContainer << endl;
|
|
|
|
if (parentContainer->frameType()=="Container")
|
|
{
|
|
kdDebug(1202) << "parentContainer is a KonqFrameContainer" << endl;
|
|
|
|
KonqFrameContainerBase* grandParentContainer = parentContainer->parentContainer();
|
|
kdDebug(1202) << "grandParentContainer=" << grandParentContainer << endl;
|
|
|
|
setActivePart( 0L, true );
|
|
|
|
int index = -1;
|
|
TQValueList<int> splitterSizes;
|
|
bool moveOtherChild = false;
|
|
|
|
if (grandParentContainer->frameType()=="Tabs")
|
|
index = static_cast<KonqFrameTabs*>(grandParentContainer)->indexOf( parentContainer->widget() );
|
|
else if (grandParentContainer->frameType()=="Container")
|
|
{
|
|
moveOtherChild = (static_cast<KonqFrameContainer*>(grandParentContainer)->idAfter( parentContainer->widget() ) != 0);
|
|
splitterSizes = static_cast<KonqFrameContainer*>(grandParentContainer)->sizes();
|
|
}
|
|
|
|
KonqFrameBase* otherFrame = static_cast<KonqFrameContainer*>(parentContainer)->otherChild( frame );
|
|
kdDebug(1202) << "otherFrame=" << otherFrame << endl;
|
|
|
|
if( otherFrame == 0L )
|
|
{
|
|
kdWarning(1202) << "KonqViewManager::removeView: This shouldn't happen!" << endl;
|
|
return;
|
|
}
|
|
|
|
if (m_pDocContainer == parentContainer) m_pDocContainer = otherFrame;
|
|
|
|
grandParentContainer->widget()->tqsetUpdatesEnabled( false );
|
|
static_cast<KonqFrameContainer*>(parentContainer)->setAboutToBeDeleted();
|
|
|
|
//kdDebug(1202) << "--- Reparenting otherFrame to m_pMainWindow " << m_pMainWindow << endl;
|
|
TQPoint pos = otherFrame->widget()->pos();
|
|
otherFrame->reparentFrame( m_pMainWindow, pos );
|
|
|
|
//kdDebug(1202) << "--- Removing otherFrame from parentContainer" << endl;
|
|
parentContainer->removeChildFrame( otherFrame );
|
|
|
|
//kdDebug(1202) << "--- Removing parentContainer from grandParentContainer" << endl;
|
|
grandParentContainer->removeChildFrame( parentContainer );
|
|
|
|
//kdDebug(1202) << "--- Removing view from view list" << endl;
|
|
m_pMainWindow->removeChildView(view);
|
|
//kdDebug(1202) << "--- Deleting view " << view << endl;
|
|
delete view; // This deletes the view, which deletes the part, which deletes its widget
|
|
|
|
//kdDebug(1202) << "--- Deleting parentContainer " << parentContainer
|
|
// << ". Its parent is " << parentContainer->widget()->parent() << endl;
|
|
delete parentContainer;
|
|
|
|
//kdDebug(1202) << "--- Reparenting otherFrame to grandParentContainer" << grandParentContainer << endl;
|
|
otherFrame->reparentFrame( grandParentContainer->widget(), pos );
|
|
|
|
//kdDebug(1202) << "--- Inserting otherFrame into grandParentContainer" << grandParentContainer << endl;
|
|
grandParentContainer->insertChildFrame( otherFrame, index );
|
|
|
|
if( moveOtherChild )
|
|
{
|
|
static_cast<KonqFrameContainer*>(grandParentContainer)->moveToFirst( otherFrame->widget() );
|
|
static_cast<KonqFrameContainer*>(grandParentContainer)->swapChildren();
|
|
}
|
|
|
|
if (grandParentContainer->frameType()=="Container")
|
|
static_cast<KonqFrameContainer*>(grandParentContainer)->setSizes( splitterSizes );
|
|
|
|
otherFrame->widget()->show();
|
|
|
|
grandParentContainer->setActiveChild( otherFrame );
|
|
grandParentContainer->activateChild();
|
|
|
|
grandParentContainer->widget()->tqsetUpdatesEnabled( true );
|
|
}
|
|
else if (parentContainer->frameType()=="Tabs") {
|
|
kdDebug(1202) << "parentContainer " << parentContainer << " is a KonqFrameTabs" << endl;
|
|
|
|
removeTab( frame );
|
|
}
|
|
else if (parentContainer->frameType()=="MainWindow")
|
|
kdDebug(1202) << "parentContainer is a KonqMainWindow. This shouldn't be removeable, not removing." << endl;
|
|
else
|
|
kdDebug(1202) << "Unrecognized frame type, not removing." << endl;
|
|
|
|
#ifdef DEBUG_VIEWMGR
|
|
printFullHierarchy( m_pMainWindow );
|
|
m_pMainWindow->dumpViewList();
|
|
|
|
kdDebug(1202) << "------------- removeView done --------------" << view << endl;
|
|
#endif
|
|
}
|
|
|
|
// reimplemented from PartManager
|
|
void KonqViewManager::removePart( KParts::Part * part )
|
|
{
|
|
kdDebug(1202) << "KonqViewManager::removePart ( " << part << " )" << endl;
|
|
// This is called when a part auto-deletes itself (case 1), or when
|
|
// the "delete view" above deletes, in turn, the part (case 2)
|
|
|
|
kdDebug(1202) << "Calling KParts::PartManager::removePart " << part << endl;
|
|
KParts::PartManager::removePart( part );
|
|
|
|
// If we were called by PartManager::slotObjectDestroyed, then the inheritance has
|
|
// been deleted already... Can't use inherits().
|
|
|
|
KonqView * view = m_pMainWindow->childView( static_cast<KParts::ReadOnlyPart *>(part) );
|
|
if ( view ) // the child view still exists, so we are in case 1
|
|
{
|
|
kdDebug(1202) << "Found a child view" << endl;
|
|
view->partDeleted(); // tell the child view that the part auto-deletes itself
|
|
if (m_pMainWindow->mainViewsCount() == 1)
|
|
{
|
|
kdDebug(1202) << "Deleting last view -> closing the window" << endl;
|
|
clear();
|
|
kdDebug(1202) << "Closing m_pMainWindow " << m_pMainWindow << endl;
|
|
m_pMainWindow->close(); // will delete it
|
|
return;
|
|
} else { // normal case
|
|
removeView( view );
|
|
}
|
|
}
|
|
|
|
kdDebug(1202) << "KonqViewManager::removePart ( " << part << " ) done" << endl;
|
|
}
|
|
|
|
void KonqViewManager::slotPassiveModePartDeleted()
|
|
{
|
|
// Passive mode parts aren't registered to the part manager,
|
|
// so we have to handle suicidal ones ourselves
|
|
KParts::ReadOnlyPart * part = const_cast<KParts::ReadOnlyPart *>( static_cast<const KParts::ReadOnlyPart *>( sender() ) );
|
|
disconnect( part, TQT_SIGNAL( destroyed() ), this, TQT_SLOT( slotPassiveModePartDeleted() ) );
|
|
kdDebug(1202) << "KonqViewManager::slotPassiveModePartDeleted part=" << part << endl;
|
|
KonqView * view = m_pMainWindow->childView( part );
|
|
kdDebug(1202) << "view=" << view << endl;
|
|
if ( view != 0L) // the child view still exists, so the part suicided
|
|
{
|
|
view->partDeleted(); // tell the child view that the part deleted itself
|
|
removeView( view );
|
|
}
|
|
}
|
|
|
|
void KonqViewManager::viewCountChanged()
|
|
{
|
|
bool bShowActiveViewIndicator = ( m_pMainWindow->viewCount() > 1 );
|
|
bool bShowLinkedViewIndicator = ( m_pMainWindow->linkableViewsCount() > 1 );
|
|
|
|
KonqMainWindow::MapViews mapViews = m_pMainWindow->viewMap();
|
|
KonqMainWindow::MapViews::Iterator it = mapViews.begin();
|
|
KonqMainWindow::MapViews::Iterator end = mapViews.end();
|
|
for ( ; it != end ; ++it )
|
|
{
|
|
KonqFrameStatusBar* sb = it.data()->frame()->statusbar();
|
|
sb->showActiveViewIndicator( bShowActiveViewIndicator && !it.data()->isPassiveMode() );
|
|
sb->showLinkedViewIndicator( bShowLinkedViewIndicator && !it.data()->isFollowActive() );
|
|
}
|
|
}
|
|
|
|
void KonqViewManager::clear()
|
|
{
|
|
kdDebug(1202) << "KonqViewManager::clear" << endl;
|
|
setActivePart( 0L, true /* immediate */ );
|
|
|
|
if (m_pMainWindow->childFrame() == 0L) return;
|
|
|
|
TQPtrList<KonqView> viewList;
|
|
|
|
m_pMainWindow->listViews( &viewList );
|
|
|
|
kdDebug(1202) << viewList.count() << " items" << endl;
|
|
|
|
TQPtrListIterator<KonqView> it( viewList );
|
|
for ( it.toFirst(); it.current(); ++it ) {
|
|
m_pMainWindow->removeChildView( it.current() );
|
|
kdDebug(1202) << "Deleting " << it.current() << endl;
|
|
delete it.current();
|
|
}
|
|
|
|
kdDebug(1202) << "deleting mainFrame " << endl;
|
|
KonqFrameBase* frame = m_pMainWindow->childFrame();
|
|
m_pMainWindow->removeChildFrame( frame ); // will set childFrame() to NULL
|
|
delete frame;
|
|
|
|
m_pDocContainer = 0L;
|
|
}
|
|
|
|
KonqView *KonqViewManager::chooseNextView( KonqView *view )
|
|
{
|
|
//kdDebug(1202) << "KonqViewManager(" << this << ")::chooseNextView(" << view << ")" << endl;
|
|
KonqMainWindow::MapViews mapViews = m_pMainWindow->viewMap();
|
|
|
|
KonqMainWindow::MapViews::Iterator it = mapViews.begin();
|
|
KonqMainWindow::MapViews::Iterator end = mapViews.end();
|
|
if ( view ) // find it in the map - can't use the key since view->part() might be 0L
|
|
while ( it != end && it.data() != view )
|
|
++it;
|
|
|
|
// the view should always be in the list
|
|
if ( it == end ) {
|
|
if ( view )
|
|
kdWarning() << "View " << view << " is not in list !" << endl;
|
|
it = mapViews.begin();
|
|
if ( it == end )
|
|
return 0L; // We have no view at all - this used to happen with totally-empty-profiles
|
|
}
|
|
|
|
KonqMainWindow::MapViews::Iterator startIt = it;
|
|
|
|
//kdDebug(1202) << "KonqViewManager::chooseNextView: count=" << mapViews.count() << endl;
|
|
while ( true )
|
|
{
|
|
//kdDebug(1202) << "*KonqViewManager::chooseNextView going next" << endl;
|
|
if ( ++it == end ) // move to next
|
|
it = mapViews.begin(); // rewind on end
|
|
|
|
if ( it == startIt && view )
|
|
break; // no next view found
|
|
|
|
KonqView *nextView = it.data();
|
|
if ( nextView && !nextView->isPassiveMode() )
|
|
return nextView;
|
|
//kdDebug(1202) << "KonqViewManager::chooseNextView nextView=" << nextView << " passive=" << nextView->isPassiveMode() << endl;
|
|
}
|
|
|
|
//kdDebug(1202) << "KonqViewManager::chooseNextView: returning 0L" << endl;
|
|
return 0L; // no next view found
|
|
}
|
|
|
|
KonqViewFactory KonqViewManager::createView( const TQString &serviceType,
|
|
const TQString &serviceName,
|
|
KService::Ptr &service,
|
|
KTrader::OfferList &partServiceOffers,
|
|
KTrader::OfferList &appServiceOffers,
|
|
bool forceAutoEmbed )
|
|
{
|
|
kdDebug(1202) << "KonqViewManager::createView" << endl;
|
|
KonqViewFactory viewFactory;
|
|
|
|
if( serviceType.isEmpty() && m_pMainWindow->currentView() ) {
|
|
//clone current view
|
|
KonqView *cv = m_pMainWindow->currentView();
|
|
TQString _serviceType, _serviceName;
|
|
if ( cv->service()->desktopEntryName() == "konq_sidebartng" ) {
|
|
_serviceType = "text/html";
|
|
}
|
|
else {
|
|
_serviceType = cv->serviceType();
|
|
_serviceName = cv->service()->desktopEntryName();
|
|
}
|
|
|
|
viewFactory = KonqFactory::createView( _serviceType, _serviceName,
|
|
&service, &partServiceOffers, &appServiceOffers, forceAutoEmbed );
|
|
}
|
|
else {
|
|
//create view with the given servicetype
|
|
viewFactory = KonqFactory::createView( serviceType, serviceName,
|
|
&service, &partServiceOffers, &appServiceOffers, forceAutoEmbed );
|
|
}
|
|
|
|
return viewFactory;
|
|
}
|
|
|
|
KonqView *KonqViewManager::setupView( KonqFrameContainerBase *parentContainer,
|
|
KonqViewFactory &viewFactory,
|
|
const KService::Ptr &service,
|
|
const KTrader::OfferList &partServiceOffers,
|
|
const KTrader::OfferList &appServiceOffers,
|
|
const TQString &serviceType,
|
|
bool passiveMode,
|
|
bool openAfterCurrentPage )
|
|
{
|
|
kdDebug(1202) << "KonqViewManager::setupView passiveMode=" << passiveMode << endl;
|
|
|
|
TQString sType = serviceType;
|
|
|
|
if ( sType.isEmpty() )
|
|
sType = m_pMainWindow->currentView()->serviceType();
|
|
|
|
//kdDebug(1202) << "KonqViewManager::setupView creating KonqFrame with parent=" << parentContainer << endl;
|
|
KonqFrame* newViewFrame = new KonqFrame( parentContainer->widget(), parentContainer, "KonqFrame" );
|
|
newViewFrame->setGeometry( 0, 0, m_pMainWindow->width(), m_pMainWindow->height() );
|
|
|
|
//kdDebug(1202) << "Creating KonqView" << endl;
|
|
KonqView *v = new KonqView( viewFactory, newViewFrame,
|
|
m_pMainWindow, service, partServiceOffers, appServiceOffers, sType, passiveMode );
|
|
//kdDebug(1202) << "KonqView created - v=" << v << " v->part()=" << v->part() << endl;
|
|
|
|
TQObject::connect( v, TQT_SIGNAL( sigPartChanged( KonqView *, KParts::ReadOnlyPart *, KParts::ReadOnlyPart * ) ),
|
|
m_pMainWindow, TQT_SLOT( slotPartChanged( KonqView *, KParts::ReadOnlyPart *, KParts::ReadOnlyPart * ) ) );
|
|
|
|
m_pMainWindow->insertChildView( v );
|
|
|
|
|
|
int index = -1;
|
|
|
|
if (m_pDocContainer && m_pDocContainer->frameType() == "Tabs")
|
|
{
|
|
KonqFrameTabs* tabContainer = static_cast<KonqFrameTabs*>(m_pDocContainer);
|
|
if ( openAfterCurrentPage )
|
|
index = tabContainer->currentPageIndex() +1 ;
|
|
}
|
|
|
|
parentContainer->insertChildFrame( newViewFrame, index );
|
|
|
|
if (parentContainer->frameType() != "Tabs") newViewFrame->show();
|
|
|
|
// Don't register passive views to the part manager
|
|
if ( !v->isPassiveMode() ) // note that KonqView's constructor could set this to true even if passiveMode is false
|
|
addPart( v->part(), false );
|
|
else
|
|
{
|
|
// Passive views aren't registered, but we still want to detect the suicidal ones
|
|
connect( v->part(), TQT_SIGNAL( destroyed() ), this, TQT_SLOT( slotPassiveModePartDeleted() ) );
|
|
}
|
|
|
|
//kdDebug(1202) << "KonqViewManager::setupView done" << endl;
|
|
return v;
|
|
}
|
|
|
|
///////////////// Profile stuff ////////////////
|
|
|
|
void KonqViewManager::saveViewProfile( const TQString & fileName, const TQString & profileName, bool saveURLs, bool saveWindowSize )
|
|
{
|
|
|
|
TQString path = locateLocal( "data", TQString::tqfromLatin1( "konqueror/profiles/" ) +
|
|
fileName, KGlobal::instance() );
|
|
|
|
if ( TQFile::exists( path ) )
|
|
TQFile::remove( path );
|
|
|
|
KSimpleConfig cfg( path );
|
|
cfg.setGroup( "Profile" );
|
|
if ( !profileName.isEmpty() )
|
|
cfg.writePathEntry( "Name", profileName );
|
|
|
|
saveViewProfile( cfg, saveURLs, saveWindowSize );
|
|
|
|
}
|
|
|
|
void KonqViewManager::saveViewProfile( KConfig & cfg, bool saveURLs, bool saveWindowSize )
|
|
{
|
|
//kdDebug(1202) << "KonqViewManager::saveViewProfile" << endl;
|
|
if( m_pMainWindow->childFrame() != 0L ) {
|
|
TQString prefix = TQString::tqfromLatin1( m_pMainWindow->childFrame()->frameType() )
|
|
+ TQString::number(0);
|
|
cfg.writeEntry( "RootItem", prefix );
|
|
prefix.append( '_' );
|
|
m_pMainWindow->saveConfig( &cfg, prefix, saveURLs, m_pDocContainer, 0, 1);
|
|
}
|
|
|
|
cfg.writeEntry( "FullScreen", m_pMainWindow->fullScreenMode());
|
|
cfg.writeEntry("XMLUIFile", m_pMainWindow->xmlFile());
|
|
if ( saveWindowSize )
|
|
{
|
|
cfg.writeEntry( "Width", m_pMainWindow->width() );
|
|
cfg.writeEntry( "Height", m_pMainWindow->height() );
|
|
}
|
|
|
|
// Save menu/toolbar settings in profile. Relys on konq_mainwindow calling
|
|
// setAutoSaveSetting( "KongMainWindow", false ). The false is important,
|
|
// we do not want this call save size settings in the profile, because we
|
|
// do it ourselves. Save in a separate group than the rest of the profile.
|
|
TQString savedGroup = cfg.group();
|
|
m_pMainWindow->saveMainWindowSettings( &cfg, "Main Window Settings" );
|
|
cfg.setGroup( savedGroup );
|
|
|
|
cfg.sync();
|
|
}
|
|
|
|
void KonqViewManager::loadViewProfile( const TQString & path, const TQString & filename,
|
|
const KURL & forcedURL, const KonqOpenURLRequest &req,
|
|
bool resetWindow, bool openURL )
|
|
{
|
|
KConfig cfg( path, true );
|
|
cfg.setDollarExpansion( true );
|
|
cfg.setGroup( "Profile" );
|
|
loadViewProfile( cfg, filename, forcedURL, req, resetWindow, openURL );
|
|
}
|
|
|
|
void KonqViewManager::loadViewProfile( KConfig &cfg, const TQString & filename,
|
|
const KURL & forcedURL, const KonqOpenURLRequest &req,
|
|
bool resetWindow, bool openURL )
|
|
{
|
|
if ( docContainer() && docContainer()->frameType()=="Tabs" )
|
|
{
|
|
KonqFrameTabs* tabContainer = static_cast<KonqFrameTabs*>(docContainer());
|
|
if ( tabContainer->count() > 1 )
|
|
{
|
|
if ( KMessageBox::warningContinueCancel( 0,
|
|
i18n("You have multiple tabs open in this window.\n"
|
|
"Loading a view profile will close them."),
|
|
i18n("Confirmation"),
|
|
i18n("Load View Profile"),
|
|
"LoadProfileTabsConfirm" ) == KMessageBox::Cancel )
|
|
return;
|
|
}
|
|
|
|
KonqView *originalView = m_pMainWindow->currentView();
|
|
TQPtrList<KonqFrameBase> frameList = *tabContainer->childFrameList();
|
|
TQPtrListIterator<KonqFrameBase> it( frameList );
|
|
for ( it.toFirst(); it != 0L; ++it )
|
|
{
|
|
KonqView *view = it.current()->activeChildView();
|
|
if (view && view->part() && (view->part()->tqmetaObject()->findProperty("modified") != -1)) {
|
|
TQVariant prop = view->part()->property("modified");
|
|
if (prop.isValid() && prop.toBool()) {
|
|
showTab( view );
|
|
if ( KMessageBox::warningContinueCancel( 0,
|
|
i18n("This tab contains changes that have not been submitted.\nLoading a profile will discard these changes."),
|
|
i18n("Discard Changes?"), i18n("&Discard Changes"), "discardchangesloadprofile") != KMessageBox::Continue )
|
|
{
|
|
showTab( originalView );
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
showTab( originalView );
|
|
}
|
|
else
|
|
{
|
|
KonqView *view = m_pMainWindow->currentView();
|
|
if (view && view->part() && (view->part()->tqmetaObject()->findProperty("modified") != -1)) {
|
|
TQVariant prop = view->part()->property("modified");
|
|
if (prop.isValid() && prop.toBool())
|
|
if ( KMessageBox::warningContinueCancel( 0,
|
|
i18n("This page contains changes that have not been submitted.\nLoading a profile will discard these changes."),
|
|
i18n("Discard Changes?"), i18n("&Discard Changes"), "discardchangesloadprofile") != KMessageBox::Continue )
|
|
return;
|
|
}
|
|
}
|
|
|
|
bool alwaysTabbedMode = KonqSettings::alwaysTabbedMode();
|
|
|
|
m_currentProfile = filename;
|
|
m_currentProfileText = cfg.readPathEntry("Name",filename);
|
|
m_profileHomeURL = cfg.readEntry("HomeURL", TQString::null);
|
|
|
|
m_pMainWindow->currentProfileChanged();
|
|
KURL defaultURL;
|
|
if ( m_pMainWindow->currentView() )
|
|
defaultURL = m_pMainWindow->currentView()->url();
|
|
|
|
clear();
|
|
|
|
TQString rootItem = cfg.readEntry( "RootItem", "empty" );
|
|
|
|
//kdDebug(1202) << "KonqViewManager::loadViewProfile : loading RootItem " << rootItem <<
|
|
//" forcedURL " << forcedURL.url() << endl;
|
|
|
|
if ( forcedURL.url() != "about:blank" )
|
|
{
|
|
// This flag is used by KonqView, to distinguish manual view creation
|
|
// from profile loading (e.g. in switchView)
|
|
m_bLoadingProfile = true;
|
|
|
|
loadItem( cfg, m_pMainWindow, rootItem, defaultURL, openURL && forcedURL.isEmpty() );
|
|
|
|
m_bLoadingProfile = false;
|
|
|
|
m_pMainWindow->enableAllActions(true);
|
|
|
|
// This flag disables calls to viewCountChanged while creating the views,
|
|
// so we do it once at the end :
|
|
m_pMainWindow->viewCountChanged();
|
|
}
|
|
else
|
|
{
|
|
m_pMainWindow->disableActionsNoView();
|
|
m_pMainWindow->action( "clear_location" )->activate();
|
|
}
|
|
|
|
//kdDebug(1202) << "KonqViewManager::loadViewProfile : after loadItem " << endl;
|
|
|
|
if (m_pDocContainer == 0L)
|
|
{
|
|
if (m_pMainWindow &&
|
|
m_pMainWindow->currentView() &&
|
|
m_pMainWindow->currentView()->frame()) {
|
|
m_pDocContainer = m_pMainWindow->currentView()->frame();
|
|
} else {
|
|
kdDebug(1202) << "This view profile does not support tabs." << endl;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
if ( m_pDocContainer->frameType() != "Tabs")
|
|
convertDocContainer();
|
|
|
|
static_cast<KonqFrameTabs*>( m_pDocContainer )->setAlwaysTabbedMode( alwaysTabbedMode );
|
|
|
|
// Set an active part first so that we open the URL in the current view
|
|
// (to set the location bar correctly and asap)
|
|
KonqView *nextChildView = 0L;
|
|
nextChildView = m_pMainWindow->activeChildView();
|
|
if (nextChildView == 0L) nextChildView = chooseNextView( 0L );
|
|
setActivePart( nextChildView ? nextChildView->part() : 0L, true /* immediate */);
|
|
|
|
// #71164
|
|
if ( !req.args.frameName.isEmpty() && nextChildView ) {
|
|
nextChildView->setViewName( req.args.frameName );
|
|
}
|
|
|
|
if ( openURL && !forcedURL.isEmpty())
|
|
{
|
|
KonqOpenURLRequest _req(req);
|
|
_req.openAfterCurrentPage = KonqSettings::openAfterCurrentPage();
|
|
_req.forceAutoEmbed = true; // it's a new window, let's use it
|
|
|
|
m_pMainWindow->openURL( nextChildView /* can be 0 for an empty profile */,
|
|
forcedURL, _req.args.serviceType, _req, _req.args.trustedSource );
|
|
|
|
// TODO choose a linked view if any (instead of just the first one),
|
|
// then open the same URL in any non-linked one
|
|
}
|
|
else
|
|
{
|
|
if ( m_pMainWindow->locationBarURL().isEmpty() ) // No URL -> the user will want to type one
|
|
m_pMainWindow->focusLocationBar();
|
|
}
|
|
|
|
// Window size
|
|
if ( !m_pMainWindow->initialGeometrySet() )
|
|
{
|
|
if (cfg.readBoolEntry( "FullScreen" ))
|
|
{
|
|
// Full screen on
|
|
m_pMainWindow->showFullScreen();
|
|
}
|
|
else
|
|
{
|
|
// Full screen off
|
|
if( m_pMainWindow->isFullScreen())
|
|
m_pMainWindow->showNormal();
|
|
|
|
TQSize size = readConfigSize( cfg, m_pMainWindow );
|
|
if ( size.isValid() )
|
|
m_pMainWindow->resize( size );
|
|
else // no size in the profile; use last known size
|
|
m_pMainWindow->restoreWindowSize();
|
|
}
|
|
}
|
|
|
|
if( resetWindow )
|
|
{ // force default settings for the GUI
|
|
m_pMainWindow->applyMainWindowSettings( KGlobal::config(), "KonqMainWindow", true );
|
|
}
|
|
|
|
// Apply menu/toolbar settings saved in profile. Read from a separate group
|
|
// so that the window doesn't try to change the size stored in the Profile group.
|
|
// (If applyMainWindowSettings finds a "Width" or "Height" entry, it
|
|
// sets them to 0,0)
|
|
TQString savedGroup = cfg.group();
|
|
m_pMainWindow->applyMainWindowSettings( &cfg, "Main Window Settings" );
|
|
cfg.setGroup( savedGroup );
|
|
|
|
#ifdef DEBUG_VIEWMGR
|
|
printFullHierarchy( m_pMainWindow );
|
|
#endif
|
|
|
|
//kdDebug(1202) << "KonqViewManager::loadViewProfile done" << endl;
|
|
}
|
|
|
|
void KonqViewManager::setActivePart( KParts::Part *part, TQWidget * )
|
|
{
|
|
setActivePart( part, false );
|
|
}
|
|
|
|
void KonqViewManager::setActivePart( KParts::Part *part, bool immediate )
|
|
{
|
|
//kdDebug(1202) << "KonqViewManager::setActivePart " << part << endl;
|
|
//if ( part )
|
|
// kdDebug(1202) << " " << part->className() << " " << part->name() << endl;
|
|
|
|
// Due to the single-shot timer below, we need to also make sure that
|
|
// the mainwindow also has the right part active already
|
|
KParts::Part* mainWindowActivePart = (m_pMainWindow && m_pMainWindow->currentView())
|
|
? m_pMainWindow->currentView()->part() : 0;
|
|
if (part == activePart() && (!immediate || mainWindowActivePart == part))
|
|
{
|
|
if ( part )
|
|
kdDebug(1202) << "Part is already active!" << endl;
|
|
return;
|
|
}
|
|
|
|
// Don't activate when part changed in non-active tab
|
|
KonqView* partView = m_pMainWindow->childView((KParts::ReadOnlyPart*)part);
|
|
if (partView)
|
|
{
|
|
KonqFrameContainerBase* parentContainer = partView->frame()->parentContainer();
|
|
if (parentContainer->frameType()=="Tabs")
|
|
{
|
|
KonqFrameTabs* parentFrameTabs = static_cast<KonqFrameTabs*>(parentContainer);
|
|
if (partView->frame() != parentFrameTabs->currentPage())
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (m_pMainWindow && m_pMainWindow->currentView())
|
|
m_pMainWindow->currentView()->setLocationBarURL(m_pMainWindow->locationBarURL());
|
|
|
|
KParts::PartManager::setActivePart( part );
|
|
|
|
if (part && part->widget())
|
|
part->widget()->setFocus();
|
|
|
|
if (!immediate && reason() != ReasonRightClick) {
|
|
// We use a 0s single shot timer so that when left-clicking on a part,
|
|
// we process the mouse event before rebuilding the GUI.
|
|
// Otherwise, when e.g. dragging icons, the mouse pointer can already
|
|
// be very far from where it was...
|
|
m_activePartChangedTimer->start( 0, true );
|
|
// This is not done with right-clicking so that the part is activated before the
|
|
// popup appears (#75201)
|
|
} else {
|
|
emitActivePartChanged();
|
|
}
|
|
}
|
|
|
|
void KonqViewManager::slotActivePartChanged ( KParts::Part *newPart )
|
|
{
|
|
//kdDebug(1202) << "KonqViewManager::slotActivePartChanged " << newPart << endl;
|
|
if (newPart == 0L) {
|
|
//kdDebug(1202) << "newPart = 0L , returning" << endl;
|
|
return;
|
|
}
|
|
KonqView * view = m_pMainWindow->childView( static_cast<KParts::ReadOnlyPart *>(newPart) );
|
|
if (view == 0L) {
|
|
kdDebug(1202) << k_funcinfo << "No view associated with this part" << endl;
|
|
return;
|
|
}
|
|
if (view->frame()->parentContainer() == 0L) return;
|
|
if (!m_bLoadingProfile) {
|
|
view->frame()->statusbar()->updateActiveStatus();
|
|
view->frame()->parentContainer()->setActiveChild( view->frame() );
|
|
}
|
|
//kdDebug(1202) << "KonqViewManager::slotActivePartChanged done" << endl;
|
|
}
|
|
|
|
void KonqViewManager::emitActivePartChanged()
|
|
{
|
|
// prevent unnecessary multiple calls to slotPartActivated:
|
|
m_activePartChangedTimer->stop();
|
|
m_pMainWindow->slotPartActivated( activePart() );
|
|
}
|
|
|
|
|
|
TQSize KonqViewManager::readConfigSize( KConfig &cfg, TQWidget *widget )
|
|
{
|
|
bool ok;
|
|
|
|
TQString widthStr = cfg.readEntry( "Width" );
|
|
TQString heightStr = cfg.readEntry( "Height" );
|
|
|
|
int width = -1;
|
|
int height = -1;
|
|
|
|
TQRect geom = KGlobalSettings::desktopGeometry(widget);
|
|
|
|
if ( widthStr.contains( '%' ) == 1 )
|
|
{
|
|
widthStr.truncate( widthStr.length() - 1 );
|
|
int relativeWidth = widthStr.toInt( &ok );
|
|
if ( ok ) {
|
|
width = relativeWidth * geom.width() / 100;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
width = widthStr.toInt( &ok );
|
|
if ( !ok )
|
|
width = -1;
|
|
}
|
|
|
|
if ( heightStr.contains( '%' ) == 1 )
|
|
{
|
|
heightStr.truncate( heightStr.length() - 1 );
|
|
int relativeHeight = heightStr.toInt( &ok );
|
|
if ( ok ) {
|
|
height = relativeHeight * geom.height() / 100;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
height = heightStr.toInt( &ok );
|
|
if ( !ok )
|
|
height = -1;
|
|
}
|
|
|
|
return TQSize( width, height );
|
|
}
|
|
|
|
void KonqViewManager::loadItem( KConfig &cfg, KonqFrameContainerBase *parent,
|
|
const TQString &name, const KURL & defaultURL, bool openURL, bool openAfterCurrentPage )
|
|
{
|
|
TQString prefix;
|
|
if( name != "InitialView" )
|
|
prefix = name + '_';
|
|
|
|
//kdDebug(1202) << "KonqViewManager::loadItem: begin name " << name << " openURL " << openURL << endl;
|
|
|
|
if( name.startsWith("View") || name == "empty" ) {
|
|
//load view config
|
|
TQString serviceType;
|
|
TQString serviceName;
|
|
if ( name == "empty" ) {
|
|
// An empty profile is an empty KHTML part. Makes all KHTML actions available, avoids crashes,
|
|
// makes it easy to DND a URL onto it, and makes it fast to load a website from there.
|
|
serviceType = "text/html";
|
|
serviceName = "html";
|
|
} else {
|
|
serviceType = cfg.readEntry( TQString::tqfromLatin1( "ServiceType" ).prepend( prefix ), "inode/directory");
|
|
serviceName = cfg.readEntry( TQString::tqfromLatin1( "ServiceName" ).prepend( prefix ) );
|
|
}
|
|
//kdDebug(1202) << "KonqViewManager::loadItem: ServiceType " << serviceType << " " << serviceName << endl;
|
|
|
|
KService::Ptr service;
|
|
KTrader::OfferList partServiceOffers, appServiceOffers;
|
|
|
|
KonqViewFactory viewFactory = KonqFactory::createView( serviceType, serviceName, &service, &partServiceOffers, &appServiceOffers, true /*forceAutoEmbed*/ );
|
|
if ( viewFactory.isNull() )
|
|
{
|
|
kdWarning(1202) << "Profile Loading Error: View creation failed" << endl;
|
|
return; //ugh..
|
|
}
|
|
|
|
bool passiveMode = cfg.readBoolEntry( TQString::tqfromLatin1( "PassiveMode" ).prepend( prefix ), false );
|
|
|
|
//kdDebug(1202) << "KonqViewManager::loadItem: Creating View Stuff" << endl;
|
|
KonqView *childView = setupView( parent, viewFactory, service, partServiceOffers, appServiceOffers, serviceType, passiveMode, openAfterCurrentPage );
|
|
|
|
if (!childView->isFollowActive()) childView->setLinkedView( cfg.readBoolEntry( TQString::tqfromLatin1( "LinkedView" ).prepend( prefix ), false ) );
|
|
childView->setToggleView( cfg.readBoolEntry( TQString::tqfromLatin1( "ToggleView" ).prepend( prefix ), false ) );
|
|
if( !cfg.readBoolEntry( TQString::tqfromLatin1( "ShowStatusBar" ).prepend( prefix ), true ) )
|
|
childView->frame()->statusbar()->hide();
|
|
|
|
if (cfg.readBoolEntry( TQString::tqfromLatin1( "docContainer" ).prepend( prefix ), false ))
|
|
m_pDocContainer = childView->frame();
|
|
|
|
if (!m_pDocContainer)
|
|
{
|
|
if (parent->frameType() == "MainWindow")
|
|
m_pDocContainer = childView->frame(); // Child view of mainWindow
|
|
|
|
else if (parent->frameType() == "Container")
|
|
{
|
|
KonqFrameContainer* parentContainer = static_cast<KonqFrameContainer*>(parent);
|
|
KonqFrameBase* otherFrame = parentContainer->otherChild( childView->frame() );
|
|
if (otherFrame)
|
|
{
|
|
if (childView->isPassiveMode())
|
|
{
|
|
if (otherFrame->frameType() == "View")
|
|
{
|
|
KonqFrame* viewFrame = static_cast<KonqFrame*>(otherFrame);
|
|
if (viewFrame->childView()->isPassiveMode())
|
|
m_pDocContainer = parentContainer; // Both views are passive, shouldn't happen
|
|
else
|
|
m_pDocContainer = viewFrame; // This one is passive, the other is active
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (otherFrame->frameType() == "View")
|
|
{
|
|
KonqFrame* viewFrame = static_cast<KonqFrame*>(otherFrame);
|
|
if (viewFrame->childView()->isPassiveMode())
|
|
m_pDocContainer = childView->frame(); // This one is active, the other is passive
|
|
else
|
|
m_pDocContainer = parentContainer; // Both views are active
|
|
}
|
|
else
|
|
m_pDocContainer = parentContainer; // This one is active, the other is a Container
|
|
}
|
|
}
|
|
}
|
|
}
|
|
KonqConfigEvent ev( &cfg, prefix+"_", false/*load*/);
|
|
TQApplication::sendEvent( childView->part(), &ev );
|
|
|
|
childView->frame()->show();
|
|
|
|
TQString key = TQString::tqfromLatin1( "URL" ).prepend( prefix );
|
|
if ( openURL )
|
|
{
|
|
KURL url;
|
|
|
|
//kdDebug(1202) << "KonqViewManager::loadItem: key " << key << endl;
|
|
if ( cfg.hasKey( key ) )
|
|
{
|
|
TQString u = cfg.readPathEntry( key );
|
|
if ( u.isEmpty() )
|
|
u = TQString::tqfromLatin1("about:blank");
|
|
url = u;
|
|
}
|
|
else if(key == "empty_URL")
|
|
url = TQString::tqfromLatin1("about:blank");
|
|
else
|
|
url = defaultURL;
|
|
|
|
if ( !url.isEmpty() )
|
|
{
|
|
//kdDebug(1202) << "KonqViewManager::loadItem: calling openURL " << url.prettyURL() << endl;
|
|
//childView->openURL( url, url.prettyURL() );
|
|
// We need view-follows-view (for the dirtree, for instance)
|
|
KonqOpenURLRequest req;
|
|
if (url.protocol() != "about")
|
|
req.typedURL = url.prettyURL();
|
|
m_pMainWindow->openView( serviceType, url, childView, req );
|
|
}
|
|
//else kdDebug(1202) << "KonqViewManager::loadItem: url is empty" << endl;
|
|
}
|
|
// Do this after opening the URL, so that it's actually possible to open it :)
|
|
childView->setLockedLocation( cfg.readBoolEntry( TQString::tqfromLatin1( "LockedLocation" ).prepend( prefix ), false ) );
|
|
}
|
|
else if( name.startsWith("Container") ) {
|
|
//kdDebug(1202) << "KonqViewManager::loadItem Item is Container" << endl;
|
|
|
|
//load container config
|
|
TQString ostr = cfg.readEntry( TQString::tqfromLatin1( "Orientation" ).prepend( prefix ) );
|
|
//kdDebug(1202) << "Orientation: " << ostr << endl;
|
|
Qt::Orientation o;
|
|
if( ostr == "Vertical" )
|
|
o = Qt::Vertical;
|
|
else if( ostr == "Horizontal" )
|
|
o = Qt::Horizontal;
|
|
else {
|
|
kdWarning() << "Profile Loading Error: No orientation specified in " << name << endl;
|
|
o = Qt::Horizontal;
|
|
}
|
|
|
|
TQValueList<int> sizes =
|
|
cfg.readIntListEntry( TQString::tqfromLatin1( "SplitterSizes" ).prepend( prefix ));
|
|
|
|
int index = cfg.readNumEntry( TQString::tqfromLatin1( "activeChildIndex" ).prepend(prefix), -1 );
|
|
|
|
TQStrList childList;
|
|
if( cfg.readListEntry( TQString::tqfromLatin1( "Children" ).prepend( prefix ), childList ) < 2 )
|
|
{
|
|
kdWarning() << "Profile Loading Error: Less than two children in " << name << endl;
|
|
// fallback to defaults
|
|
loadItem( cfg, parent, "InitialView", defaultURL, openURL );
|
|
}
|
|
else
|
|
{
|
|
KonqFrameContainer *newContainer = new KonqFrameContainer( o, parent->widget(), parent );
|
|
connect(newContainer,TQT_SIGNAL(ctrlTabPressed()),m_pMainWindow,TQT_SLOT(slotCtrlTabPressed()));
|
|
|
|
int tabindex = -1;
|
|
if(openAfterCurrentPage && parent->frameType() == "Tabs") // Need to honor it, if possible
|
|
tabindex = static_cast<KonqFrameTabs*>(parent)->currentPageIndex() + 1;
|
|
parent->insertChildFrame( newContainer, tabindex );
|
|
|
|
|
|
if (cfg.readBoolEntry( TQString::tqfromLatin1( "docContainer" ).prepend( prefix ), false ))
|
|
m_pDocContainer = newContainer;
|
|
|
|
loadItem( cfg, newContainer, childList.tqat(0), defaultURL, openURL );
|
|
loadItem( cfg, newContainer, childList.tqat(1), defaultURL, openURL );
|
|
|
|
newContainer->setSizes( sizes );
|
|
|
|
if (index == 1)
|
|
newContainer->setActiveChild( newContainer->secondChild() );
|
|
else if (index == 0)
|
|
newContainer->setActiveChild( newContainer->firstChild() );
|
|
|
|
newContainer->show();
|
|
}
|
|
}
|
|
else if( name.startsWith("Tabs") )
|
|
{
|
|
//kdDebug(1202) << "KonqViewManager::loadItem: Item is a Tabs" << endl;
|
|
|
|
KonqFrameTabs *newContainer = new KonqFrameTabs( parent->widget(), parent, this );
|
|
connect(newContainer,TQT_SIGNAL(ctrlTabPressed()),m_pMainWindow,TQT_SLOT(slotCtrlTabPressed()));
|
|
|
|
parent->insertChildFrame( newContainer );
|
|
m_pDocContainer = newContainer;
|
|
|
|
int index = cfg.readNumEntry( TQString::tqfromLatin1( "activeChildIndex" ).prepend(prefix), 0 );
|
|
|
|
TQStringList childList = cfg.readListEntry( TQString::tqfromLatin1( "Children" ).prepend( prefix ) );
|
|
for ( TQStringList::Iterator it = childList.begin(); it != childList.end(); ++it )
|
|
{
|
|
loadItem( cfg, newContainer, *it, defaultURL, openURL );
|
|
TQWidget* currentPage = newContainer->currentPage();
|
|
if (currentPage != 0L) {
|
|
KonqView* activeChildView = tqt_dynamic_cast<KonqFrameBase*>(currentPage)->activeChildView();
|
|
if (activeChildView != 0L) {
|
|
activeChildView->setCaption( activeChildView->caption() );
|
|
activeChildView->setTabIcon( activeChildView->url() );
|
|
}
|
|
}
|
|
}
|
|
|
|
newContainer->setActiveChild( tqt_dynamic_cast<KonqFrameBase*>(newContainer->page(index)) );
|
|
newContainer->setCurrentPage( index );
|
|
|
|
newContainer->show();
|
|
}
|
|
else
|
|
kdWarning() << "Profile Loading Error: Unknown item " << name;
|
|
|
|
//kdDebug(1202) << "KonqViewManager::loadItem: end" << name << endl;
|
|
}
|
|
|
|
void KonqViewManager::setProfiles( KActionMenu *profiles )
|
|
{
|
|
m_pamProfiles = profiles;
|
|
|
|
if ( m_pamProfiles )
|
|
{
|
|
connect( m_pamProfiles->popupMenu(), TQT_SIGNAL( activated( int ) ),
|
|
this, TQT_SLOT( slotProfileActivated( int ) ) );
|
|
connect( m_pamProfiles->popupMenu(), TQT_SIGNAL( aboutToShow() ),
|
|
this, TQT_SLOT( slotProfileListAboutToShow() ) );
|
|
}
|
|
//KonqMainWindow::enableAllActions will call it anyway
|
|
//profileListDirty();
|
|
}
|
|
|
|
void KonqViewManager::showProfileDlg( const TQString & preselectProfile )
|
|
{
|
|
KonqProfileDlg dlg( this, preselectProfile, m_pMainWindow );
|
|
dlg.exec();
|
|
profileListDirty();
|
|
}
|
|
|
|
void KonqViewManager::slotProfileDlg()
|
|
{
|
|
showProfileDlg( TQString::null );
|
|
}
|
|
|
|
void KonqViewManager::profileListDirty( bool broadcast )
|
|
{
|
|
//kdDebug(1202) << "KonqViewManager::profileListDirty()" << endl;
|
|
if ( !broadcast )
|
|
{
|
|
m_bProfileListDirty = true;
|
|
#if 0
|
|
// There's always one profile at least, now...
|
|
TQStringList profiles = KonqFactory::instance()->dirs()->findAllResources( "data", "konqueror/profiles/*", false, true );
|
|
if ( m_pamProfiles )
|
|
m_pamProfiles->setEnabled( profiles.count() > 0 );
|
|
#endif
|
|
return;
|
|
}
|
|
|
|
kapp->dcopClient()->send( "konqueror*", "KonquerorIface", "updateProfileList()", TQByteArray() );
|
|
}
|
|
|
|
void KonqViewManager::slotProfileActivated( int id )
|
|
{
|
|
|
|
TQMap<TQString, TQString>::ConstIterator iter = m_mapProfileNames.begin();
|
|
TQMap<TQString, TQString>::ConstIterator end = m_mapProfileNames.end();
|
|
|
|
for(int i=0; iter != end; ++iter, ++i) {
|
|
if( i == id ) {
|
|
KURL u;
|
|
u.setPath( *iter );
|
|
loadViewProfile( *iter, u.fileName() );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void KonqViewManager::slotProfileListAboutToShow()
|
|
{
|
|
if ( !m_pamProfiles || !m_bProfileListDirty )
|
|
return;
|
|
|
|
TQPopupMenu *popup = m_pamProfiles->popupMenu();
|
|
popup->clear();
|
|
|
|
// Fetch profiles
|
|
m_mapProfileNames = KonqProfileDlg::readAllProfiles();
|
|
|
|
// Generate accelerators
|
|
TQStringList accel_strings;
|
|
KAccelGen::generateFromKeys(m_mapProfileNames, accel_strings);
|
|
|
|
// Store menu items
|
|
TQValueListIterator<TQString> iter = accel_strings.begin();
|
|
for( int id = 0;
|
|
iter != accel_strings.end();
|
|
++iter, ++id ) {
|
|
popup->insertItem( *iter, id );
|
|
}
|
|
|
|
m_bProfileListDirty = false;
|
|
}
|
|
|
|
void KonqViewManager::setLoading( KonqView *view, bool loading )
|
|
{
|
|
KonqFrameContainerBase* parentContainer = view->frame()->parentContainer();
|
|
if ( parentContainer->frameType() == "Tabs" ) {
|
|
TQColor color;
|
|
KonqFrameTabs* konqframetabs = static_cast<KonqFrameTabs*>( parentContainer );
|
|
if ( loading )
|
|
color = TQColor( (KGlobalSettings::linkColor().red() + KGlobalSettings::inactiveTextColor().red())/2,
|
|
(KGlobalSettings::linkColor().green()+ KGlobalSettings::inactiveTextColor().green())/2,
|
|
(KGlobalSettings::linkColor().blue() + KGlobalSettings::inactiveTextColor().blue())/2 );
|
|
else
|
|
{
|
|
if ( konqframetabs->currentPage() != view->frame() )
|
|
color = KGlobalSettings::linkColor();
|
|
else
|
|
color = KGlobalSettings::textColor();
|
|
}
|
|
konqframetabs->setTabColor( view->frame(), color );
|
|
}
|
|
}
|
|
|
|
void KonqViewManager::showHTML(bool b)
|
|
{
|
|
if (m_pDocContainer == 0L) return;
|
|
if (m_pDocContainer->frameType() != "Tabs") return;
|
|
|
|
KonqFrameTabs* tabContainer = static_cast<KonqFrameTabs*>(m_pDocContainer);
|
|
|
|
TQPtrList<KonqFrameBase> frameList = *tabContainer->childFrameList();
|
|
TQPtrListIterator<KonqFrameBase> it( frameList );
|
|
|
|
for ( it.toFirst(); it != 0L; ++it )
|
|
{
|
|
if ( it.current()->activeChildView() && it.current()->activeChildView() !=m_pMainWindow->currentView())
|
|
{
|
|
it.current()->activeChildView()->setAllowHTML( b );
|
|
if( !it.current()->activeChildView()->locationBarURL().isEmpty())
|
|
{
|
|
|
|
m_pMainWindow->showHTML( it.current()->activeChildView(), b, false );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
///////////////// Debug stuff ////////////////
|
|
|
|
#ifndef NDEBUG
|
|
void KonqViewManager::printSizeInfo( KonqFrameBase* frame,
|
|
KonqFrameContainerBase* parent,
|
|
const char* msg )
|
|
{
|
|
TQRect 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() );
|
|
|
|
if ( parent->frameType() == "Container" )
|
|
{
|
|
TQValueList<int> sizes;
|
|
sizes = static_cast<KonqFrameContainer*>(parent)->sizes();
|
|
printf( "Parent sizes %s :", msg );
|
|
TQValueList<int>::ConstIterator it;
|
|
for( it = sizes.begin(); it != sizes.end(); ++it )
|
|
printf( " %d", (*it) );
|
|
printf("\n");
|
|
}
|
|
}
|
|
|
|
void KonqViewManager::printFullHierarchy( KonqFrameContainerBase * container )
|
|
{
|
|
kdDebug(1202) << "currentView=" << m_pMainWindow->currentView() << endl;
|
|
kdDebug(1202) << "docContainer=" << m_pDocContainer << endl;
|
|
|
|
if (container) container->printFrameInfo(TQString::null);
|
|
else m_pMainWindow->printFrameInfo(TQString::null);
|
|
}
|
|
#endif
|
|
|
|
#include "konq_viewmgr.moc"
|