diff options
author | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
---|---|---|
committer | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
commit | 4aed2c8219774f5d797760606b8489a92ddc5163 (patch) | |
tree | 3f8c130f7d269626bf6a9447407ef6c35954426a /konqueror/konq_guiclients.cc | |
download | tdebase-4aed2c8219774f5d797760606b8489a92ddc5163.tar.gz tdebase-4aed2c8219774f5d797760606b8489a92ddc5163.zip |
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdebase@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'konqueror/konq_guiclients.cc')
-rw-r--r-- | konqueror/konq_guiclients.cc | 358 |
1 files changed, 358 insertions, 0 deletions
diff --git a/konqueror/konq_guiclients.cc b/konqueror/konq_guiclients.cc new file mode 100644 index 000000000..7a3dbaca8 --- /dev/null +++ b/konqueror/konq_guiclients.cc @@ -0,0 +1,358 @@ +/* This file is part of the KDE project + Copyright (C) 1998, 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; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include <kdebug.h> +#include <klocale.h> +#include <kmenubar.h> +#include "konq_view.h" +#include "konq_settingsxt.h" +#include "konq_frame.h" +#include "konq_guiclients.h" +#include "konq_viewmgr.h" +#include <kiconloader.h> + +PopupMenuGUIClient::PopupMenuGUIClient( KonqMainWindow *mainWindow, + const KTrader::OfferList &embeddingServices, + bool showEmbeddingServices, bool doTabHandling ) +{ + //giving a name to each guiclient: just for debugging + // (needs delete instance() in the dtor if enabled for good) + //setInstance( new KInstance( "PopupMenuGUIClient" ) ); + + m_mainWindow = mainWindow; + + m_doc = QDomDocument( "kpartgui" ); + QDomElement root = m_doc.createElement( "kpartgui" ); + root.setAttribute( "name", "konqueror" ); + m_doc.appendChild( root ); + + QDomElement menu = m_doc.createElement( "Menu" ); + root.appendChild( menu ); + menu.setAttribute( "name", "popupmenu" ); + + if ( !mainWindow->menuBar()->isVisible() ) + { + QDomElement showMenuBarElement = m_doc.createElement( "action" ); + showMenuBarElement.setAttribute( "name", "options_show_menubar" ); + menu.appendChild( showMenuBarElement ); + + menu.appendChild( m_doc.createElement( "separator" ) ); + } + + if ( mainWindow->fullScreenMode() ) + { + QDomElement stopFullScreenElement = m_doc.createElement( "action" ); + stopFullScreenElement.setAttribute( "name", "fullscreen" ); + menu.appendChild( stopFullScreenElement ); + + menu.appendChild( m_doc.createElement( "separator" ) ); + } + + if ( showEmbeddingServices ) + { + KTrader::OfferList::ConstIterator it = embeddingServices.begin(); + KTrader::OfferList::ConstIterator end = embeddingServices.end(); + + if ( embeddingServices.count() == 1 ) + { + KService::Ptr service = *embeddingServices.begin(); + addEmbeddingService( menu, 0, i18n( "Preview in %1" ).arg( service->name() ), service ); + } + else if ( embeddingServices.count() > 1 ) + { + int idx = 0; + QDomElement subMenu = m_doc.createElement( "menu" ); + menu.appendChild( subMenu ); + QDomElement text = m_doc.createElement( "text" ); + subMenu.appendChild( text ); + text.appendChild( m_doc.createTextNode( i18n( "Preview In" ) ) ); + subMenu.setAttribute( "group", "preview" ); + subMenu.setAttribute( "name", "preview submenu" ); + + bool inserted = false; + + for (; it != end; ++it, ++idx ) + { + addEmbeddingService( subMenu, idx, (*it)->name(), *it ); + inserted = true; + } + + if ( !inserted ) // oops, if empty then remove the menu :-] + menu.removeChild( menu.namedItem( "menu" ) ); + } + } + + if ( doTabHandling ) + { + QDomElement openInSameWindow = m_doc.createElement( "action" ); + openInSameWindow.setAttribute( "name", "sameview" ); + openInSameWindow.setAttribute( "group", "tabhandling" ); + menu.appendChild( openInSameWindow ); + + QDomElement openInWindow = m_doc.createElement( "action" ); + openInWindow.setAttribute( "name", "newview" ); + openInWindow.setAttribute( "group", "tabhandling" ); + menu.appendChild( openInWindow ); + + QDomElement openInTabElement = m_doc.createElement( "action" ); + openInTabElement.setAttribute( "name", "openintab" ); + openInTabElement.setAttribute( "group", "tabhandling" ); + menu.appendChild( openInTabElement ); + + QDomElement separatorElement = m_doc.createElement( "separator" ); + separatorElement.setAttribute( "group", "tabhandling" ); + menu.appendChild( separatorElement ); + } + + //kdDebug() << k_funcinfo << m_doc.toString() << endl; + + setDOMDocument( m_doc ); +} + +PopupMenuGUIClient::~PopupMenuGUIClient() +{ +} + +KAction *PopupMenuGUIClient::action( const QDomElement &element ) const +{ + KAction *res = KXMLGUIClient::action( element ); + + if ( !res ) + res = m_mainWindow->action( element ); + + return res; +} + +void PopupMenuGUIClient::addEmbeddingService( QDomElement &menu, int idx, const QString &name, const KService::Ptr &service ) +{ + QDomElement action = m_doc.createElement( "action" ); + menu.appendChild( action ); + + QCString actName; + actName.setNum( idx ); + + action.setAttribute( "name", QString::number( idx ) ); + + action.setAttribute( "group", "preview" ); + + (void)new KAction( name, service->pixmap( KIcon::Small ), 0, + m_mainWindow, SLOT( slotOpenEmbedded() ), actionCollection(), actName ); +} + +ToggleViewGUIClient::ToggleViewGUIClient( KonqMainWindow *mainWindow ) +: QObject( mainWindow ) +{ + m_mainWindow = mainWindow; + m_actions.setAutoDelete( true ); + + KTrader::OfferList offers = KTrader::self()->query( "Browser/View" ); + KTrader::OfferList::Iterator it = offers.begin(); + while ( it != offers.end() ) + { + QVariant prop = (*it)->property( "X-KDE-BrowserView-Toggable" ); + QVariant orientation = (*it)->property( "X-KDE-BrowserView-ToggableView-Orientation" ); + + if ( !prop.isValid() || !prop.toBool() || + !orientation.isValid() || orientation.toString().isEmpty() ) + { + offers.remove( it ); + it = offers.begin(); + } + else + ++it; + } + + m_empty = ( offers.count() == 0 ); + + if ( m_empty ) + return; + + KTrader::OfferList::ConstIterator cIt = offers.begin(); + KTrader::OfferList::ConstIterator cEnd = offers.end(); + for (; cIt != cEnd; ++cIt ) + { + QString description = i18n( "Show %1" ).arg( (*cIt)->name() ); + QString name = (*cIt)->desktopEntryName(); + //kdDebug(1202) << "ToggleViewGUIClient: name=" << name << endl; + KToggleAction *action = new KToggleAction( description, 0, mainWindow->actionCollection(), name.latin1() ); + action->setCheckedState( i18n( "Hide %1" ).arg( (*cIt)->name() ) ); + + // HACK + if ( (*cIt)->icon() != "unknown" ) + action->setIcon( (*cIt)->icon() ); + + connect( action, SIGNAL( toggled( bool ) ), + this, SLOT( slotToggleView( bool ) ) ); + + m_actions.insert( name, action ); + + QVariant orientation = (*cIt)->property( "X-KDE-BrowserView-ToggableView-Orientation" ); + bool horizontal = orientation.toString().lower() == "horizontal"; + m_mapOrientation.insert( name, horizontal ); + } + + connect( m_mainWindow, SIGNAL( viewAdded( KonqView * ) ), + this, SLOT( slotViewAdded( KonqView * ) ) ); + connect( m_mainWindow, SIGNAL( viewRemoved( KonqView * ) ), + this, SLOT( slotViewRemoved( KonqView * ) ) ); +} + +ToggleViewGUIClient::~ToggleViewGUIClient() +{ +} + +QPtrList<KAction> ToggleViewGUIClient::actions() const +{ + QPtrList<KAction> res; + + QDictIterator<KAction> it( m_actions ); + for (; it.current(); ++it ) + res.append( it.current() ); + + return res; +} + +void ToggleViewGUIClient::slotToggleView( bool toggle ) +{ + QString serviceName = QString::fromLatin1( sender()->name() ); + + bool horizontal = m_mapOrientation[ serviceName ]; + + KonqViewManager *viewManager = m_mainWindow->viewManager(); + + if ( toggle ) + { + + KonqView *childView = viewManager->splitWindow( horizontal ? Qt::Vertical : Qt::Horizontal, + QString::fromLatin1( "Browser/View" ), + serviceName, + !horizontal /* vertical = make it first */); + + QValueList<int> newSplitterSizes; + + if ( horizontal ) + newSplitterSizes << 100 << 30; + else + newSplitterSizes << 30 << 100; + + if (!childView || !childView->frame()) + return; + + // Toggleviews don't need their statusbar + childView->frame()->statusbar()->hide(); + + KonqFrameContainerBase *newContainer = childView->frame()->parentContainer(); + + if (newContainer->frameType()=="Container") + static_cast<KonqFrameContainer*>(newContainer)->setSizes( newSplitterSizes ); + +#if 0 // already done by splitWindow + if ( m_mainWindow->currentView() ) + { + QString locBarURL = m_mainWindow->currentView()->url().prettyURL(); // default one in case it doesn't set it + childView->openURL( m_mainWindow->currentView()->url(), locBarURL ); + } +#endif + + // If not passive, set as active :) + if (!childView->isPassiveMode()) + viewManager->setActivePart( childView->part() ); + + kdDebug() << "ToggleViewGUIClient::slotToggleView setToggleView(true) on " << childView << endl; + childView->setToggleView( true ); + + m_mainWindow->viewCountChanged(); + + } + else + { + QPtrList<KonqView> viewList; + + m_mainWindow->listViews( &viewList ); + + QPtrListIterator<KonqView> it( viewList ); + for (; it.current(); ++it ) + if ( it.current()->service()->desktopEntryName() == serviceName ) + // takes care of choosing the new active view, and also calls slotViewRemoved + viewManager->removeView( it.current() ); + } + +} + + +void ToggleViewGUIClient::saveConfig( bool add, const QString &serviceName ) +{ + // This is used on konqueror's startup....... so it's never used, since + // the K menu only contains calls to kfmclient...... + // Well, it could be useful again in the future. + // Currently, the profiles save this info. + QStringList toggableViewsShown = KonqSettings::toggableViewsShown(); + if (add) + { + if ( !toggableViewsShown.contains( serviceName ) ) + toggableViewsShown.append(serviceName); + } + else + toggableViewsShown.remove(serviceName); + KonqSettings::setToggableViewsShown( toggableViewsShown ); +} + +void ToggleViewGUIClient::slotViewAdded( KonqView *view ) +{ + QString name = view->service()->desktopEntryName(); + + KAction *action = m_actions[ name ]; + + if ( action ) + { + static_cast<KToggleAction *>( action )->setChecked( true ); + saveConfig( true, name ); + + // KonqView::isToggleView() is not set yet.. so just check for the orientation + +#if 0 + QVariant vert = view->service()->property( "X-KDE-BrowserView-ToggableView-Orientation"); + bool vertical = vert.toString().lower() == "vertical"; + QVariant nohead = view->service()->property( "X-KDE-BrowserView-ToggableView-NoHeader"); + bool noheader = nohead.isValid() ? nohead.toBool() : false; + // if it is a vertical toggle part, turn on the header. + // this works even when konq loads the view from a profile. + if ( vertical && (!noheader)) + { + view->frame()->header()->setText(view->service()->name()); + view->frame()->header()->setAction(action); + } +#endif + } +} + +void ToggleViewGUIClient::slotViewRemoved( KonqView *view ) +{ + QString name = view->service()->desktopEntryName(); + + KAction *action = m_actions[ name ]; + + if ( action ) + { + static_cast<KToggleAction *>( action )->setChecked( false ); + saveConfig( false, name ); + } +} + +#include "konq_guiclients.moc" |