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.
tdebase/konqueror/konq_viewmgr.cc

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"