diff options
Diffstat (limited to 'konqueror/sidebar/sidebar_widget.cpp')
-rw-r--r-- | konqueror/sidebar/sidebar_widget.cpp | 1310 |
1 files changed, 1310 insertions, 0 deletions
diff --git a/konqueror/sidebar/sidebar_widget.cpp b/konqueror/sidebar/sidebar_widget.cpp new file mode 100644 index 000000000..3b402b25e --- /dev/null +++ b/konqueror/sidebar/sidebar_widget.cpp @@ -0,0 +1,1310 @@ +/*************************************************************************** + sidebar_widget.cpp + ------------------- + begin : Sat June 2 16:25:27 CEST 2001 + copyright : (C) 2001 Joseph Wenninger + email : jowenn@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. * + * * + ***************************************************************************/ +#include <config.h> + +#include <limits.h> + +#include <qdir.h> +#include <qpopupmenu.h> +#include <qhbox.h> +#include <qpushbutton.h> +#include <qwhatsthis.h> +#include <qlayout.h> +#include <qstringlist.h> + +#include <klocale.h> +#include <ksimpleconfig.h> +#include <kstandarddirs.h> +#include <kdebug.h> +#include <kiconloader.h> +#include <kicondialog.h> +#include <kmessagebox.h> +#include <kinputdialog.h> +#include <konq_events.h> +#include <kfileitem.h> +#include <kio/netaccess.h> +#include <kpopupmenu.h> +#include <kprocess.h> +#include <kurlrequesterdlg.h> +#include <kinputdialog.h> +#include <kfiledialog.h> +#include <kdesktopfile.h> +#include "konqsidebar.h" + +#include "sidebar_widget.h" +#include "sidebar_widget.moc" + + +addBackEnd::addBackEnd(QWidget *parent, class QPopupMenu *addmenu, + bool universal, const QString ¤tProfile, + const char *name) + : QObject(parent,name), + m_parent(parent) +{ + m_universal=universal; + m_currentProfile = currentProfile; + menu = addmenu; + connect(menu,SIGNAL(aboutToShow()),this,SLOT(aboutToShowAddMenu())); + connect(menu,SIGNAL(activated(int)),this,SLOT(activatedAddMenu(int))); +} + +void addBackEnd::aboutToShowAddMenu() +{ + if (!menu) + return; + KStandardDirs *dirs = KGlobal::dirs(); + QStringList list = dirs->findAllResources("data","konqsidebartng/add/*.desktop",true,true); + libNames.setAutoDelete(true); + libNames.resize(0); + libParam.setAutoDelete(true); + libParam.resize(0); + menu->clear(); + int i = 0; + + for (QStringList::Iterator it = list.begin(); it != list.end(); ++it, i++ ) + { + KDesktopFile *confFile; + + confFile = new KDesktopFile(*it, true); + if (! confFile->tryExec()) { + delete confFile; + i--; + continue; + } + if (m_universal) { + if (confFile->readEntry("X-KDE-KonqSidebarUniversal").upper()!="TRUE") { + delete confFile; + i--; + continue; + } + } else { + if (confFile->readEntry("X-KDE-KonqSidebarBrowser").upper()=="FALSE") { + delete confFile; + i--; + continue; + } + } + QString icon = confFile->readIcon(); + if (!icon.isEmpty()) + { + menu->insertItem(SmallIcon(icon), + confFile->readEntry("Name"), i); + } else { + menu->insertItem(confFile->readEntry("Name"), i); + } + libNames.resize(libNames.size()+1); + libNames.insert(libNames.count(), new QString(confFile->readEntry("X-KDE-KonqSidebarAddModule"))); + libParam.resize(libParam.size()+1); + libParam.insert(libParam.count(), new QString(confFile->readEntry("X-KDE-KonqSidebarAddParam"))); + delete confFile; + } + menu->insertSeparator(); + menu->insertItem(i18n("Rollback to System Default"), i); +} + + +void addBackEnd::doRollBack() +{ + if (KMessageBox::warningContinueCancel(m_parent, i18n("<qt>This removes all your entries from the sidebar and adds the system default ones.<BR><B>This procedure is irreversible</B><BR>Do you want to proceed?</qt>"))==KMessageBox::Continue) + { + KStandardDirs *dirs = KGlobal::dirs(); + QString loc=dirs->saveLocation("data","konqsidebartng/" + m_currentProfile + "/",true); + QDir dir(loc); + QStringList dirEntries = dir.entryList( QDir::Dirs | QDir::NoSymLinks ); + dirEntries.remove("."); + dirEntries.remove(".."); + for ( QStringList::Iterator it = dirEntries.begin(); it != dirEntries.end(); ++it ) { + if ((*it)!="add") + KIO::NetAccess::del(KURL( loc+(*it) ), m_parent); + } + emit initialCopyNeeded(); + } +} + + +static QString findFileName(const QString* tmpl,bool universal, const QString &profile) { + QString myFile, filename; + KStandardDirs *dirs = KGlobal::dirs(); + QString tmp = *tmpl; + + if (universal) { + dirs->saveLocation("data", "konqsidebartng/kicker_entries/", true); + tmp.prepend("/konqsidebartng/kicker_entries/"); + } else { + dirs->saveLocation("data", "konqsidebartng/" + profile + "/entries/", true); + tmp.prepend("/konqsidebartng/" + profile + "/entries/"); + } + filename = tmp.arg(""); + myFile = locateLocal("data", filename); + + if (QFile::exists(myFile)) { + for (ulong l = 0; l < ULONG_MAX; l++) { + filename = tmp.arg(l); + myFile = locateLocal("data", filename); + if (!QFile::exists(myFile)) { + break; + } else { + myFile = QString::null; + } + } + } + + return myFile; +} + +void addBackEnd::activatedAddMenu(int id) +{ + kdDebug() << "activatedAddMenu: " << QString("%1").arg(id) << endl; + if (((uint)id) == libNames.size()) + doRollBack(); + if(((uint)id) >= libNames.size()) + return; + + KLibLoader *loader = KLibLoader::self(); + + // try to load the library + QString libname = *libNames.at(id); + KLibrary *lib = loader->library(QFile::encodeName(libname)); + if (lib) + { + // get the create_ function + QString factory("add_"); + factory = factory+(*libNames.at(id)); + void *add = lib->symbol(QFile::encodeName(factory)); + + if (add) + { + //call the add function + bool (*func)(QString*, QString*, QMap<QString,QString> *); + QMap<QString,QString> map; + func = (bool (*)(QString*, QString*, QMap<QString,QString> *)) add; + QString *tmp = new QString(""); + if (func(tmp,libParam.at(id),&map)) + { + QString myFile = findFileName(tmp,m_universal,m_currentProfile); + + if (!myFile.isEmpty()) + { + kdDebug() <<"trying to save to file: "<<myFile << endl; + KSimpleConfig scf(myFile,false); + scf.setGroup("Desktop Entry"); + for (QMap<QString,QString>::ConstIterator it = map.begin(); it != map.end(); ++it) { + kdDebug() <<"writing:"<<it.key()<<" / "<<it.data()<<endl; + scf.writePathEntry(it.key(), it.data()); + } + scf.sync(); + emit updateNeeded(); + + } else { + kdWarning() << "No unique filename found" << endl; + } + } else { + kdWarning() << "No new entry (error?)" << endl; + } + delete tmp; + } + } else { + kdWarning() << "libname:" << libNames.at(id) + << " doesn't specify a library!" << endl; + } +} + + +/**************************************************************/ +/* Sidebar_Widget */ +/**************************************************************/ + +Sidebar_Widget::Sidebar_Widget(QWidget *parent, KParts::ReadOnlyPart *par, const char *name,bool universalMode, const QString ¤tProfile) + :QWidget(parent,name),m_universalMode(universalMode),m_partParent(par),m_currentProfile(currentProfile) +{ + m_somethingVisible = false; + m_initial = true; + m_noUpdate = false; + m_layout = 0; + m_currentButton = 0; + m_activeModule = 0; + m_userMovedSplitter = false; + //kdDebug() << "**** Sidebar_Widget:SidebarWidget()"<<endl; + if (universalMode) + { + m_relPath = "konqsidebartng/kicker_entries/"; + } + else + { + m_relPath = "konqsidebartng/" + currentProfile + "/entries/"; + } + m_path = KGlobal::dirs()->saveLocation("data", m_relPath, true); + m_buttons.setAutoDelete(true); + m_hasStoredUrl = false; + m_latestViewed = -1; + setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); + + QSplitter *splitterWidget = splitter(); + if (splitterWidget) { + splitterWidget->setResizeMode(parent, QSplitter::FollowSizeHint); + splitterWidget->setOpaqueResize( false ); + connect(splitterWidget,SIGNAL(setRubberbandCalled()),SLOT(userMovedSplitter())); + } + + m_area = new KDockArea(this); + m_area->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); + m_mainDockWidget = m_area->createDockWidget("free", 0); + m_mainDockWidget->setWidget(new QWidget(m_mainDockWidget)); + m_area->setMainDockWidget(m_mainDockWidget); + m_area->setMinimumWidth(0); + m_mainDockWidget->setDockSite(KDockWidget::DockTop); + m_mainDockWidget->setEnableDocking(KDockWidget::DockNone); + + m_buttonBar = new KMultiTabBar(KMultiTabBar::Vertical,this); + m_buttonBar->showActiveTabTexts(true); + + m_menu = new QPopupMenu(this, "Sidebar_Widget::Menu"); + QPopupMenu *addMenu = new QPopupMenu(this, "Sidebar_Widget::addPopup"); + m_menu->insertItem(i18n("Add New"), addMenu, 0); + m_menu->insertItem(i18n("Multiple Views"), 1); + m_menu->insertItem(i18n("Show Tabs Left"), 2); + m_menu->insertItem(i18n("Show Configuration Button"), 3); + if (!m_universalMode) { + m_menu->insertItem(SmallIconSet("remove"), + i18n("Close Navigation Panel"), + par, SLOT(deleteLater())); + } + connect(m_menu, SIGNAL(aboutToShow()), + this, SLOT(aboutToShowConfigMenu())); + connect(m_menu, SIGNAL(activated(int)), + this, SLOT(activatedMenu(int))); + + m_buttonPopup = 0; + addBackEnd *ab = new addBackEnd(this, addMenu, universalMode, + currentProfile, + "Sidebar_Widget-addBackEnd"); + + connect(ab, SIGNAL(updateNeeded()), + this, SLOT(updateButtons())); + connect(ab, SIGNAL(initialCopyNeeded()), + this, SLOT(finishRollBack())); + + initialCopy(); + + if (universalMode) + { + m_config = new KConfig("konqsidebartng_kicker.rc"); + } + else + { + m_config = new KConfig("konqsidebartng.rc"); + m_config->setGroup(currentProfile); + } + readConfig(); + + // Disable stuff (useful for Kiosk mode)! + m_menu->setItemVisible(1, !m_immutableSingleWidgetMode); + m_menu->setItemVisible(2, !m_immutableShowTabsLeft); + m_menu->setItemVisible(3, !m_immutableShowExtraButtons); + + connect(&m_configTimer, SIGNAL(timeout()), + this, SLOT(saveConfig())); + m_somethingVisible = !m_openViews.isEmpty(); + doLayout(); + QTimer::singleShot(0,this,SLOT(createButtons())); + connect(m_area, SIGNAL(dockWidgetHasUndocked(KDockWidget*)), + this, SLOT(dockWidgetHasUndocked(KDockWidget*))); +} + +void Sidebar_Widget::addWebSideBar(const KURL& url, const QString& /*name*/) { + //kdDebug() << "Web sidebar entry to be added: " << url.url() + // << " [" << name << "]" << endl; + + // Look for existing ones with this URL + KStandardDirs *dirs = KGlobal::dirs(); + QString list; + dirs->saveLocation("data", m_relPath, true); + list = locateLocal("data", m_relPath); + + // Go through list to see which ones exist. Check them for the URL + QStringList files = QDir(list).entryList("websidebarplugin*.desktop"); + for (QStringList::Iterator it = files.begin(); it != files.end(); ++it){ + KSimpleConfig scf(list + *it, false); + scf.setGroup("Desktop Entry"); + if (scf.readPathEntry("URL", QString::null) == url.url()) { + // We already have this one! + KMessageBox::information(this, + i18n("This entry already exists.")); + return; + } + } + + QString tmpl = "websidebarplugin%1.desktop"; + QString myFile = findFileName(&tmpl,m_universalMode,m_currentProfile); + + if (!myFile.isEmpty()) { + KSimpleConfig scf(myFile, false); + scf.setGroup("Desktop Entry"); + scf.writeEntry("Type", "Link"); + scf.writePathEntry("URL", url.url()); + scf.writeEntry("Icon", "netscape"); + scf.writeEntry("Name", i18n("Web SideBar Plugin")); + scf.writeEntry("Open", "true"); + scf.writeEntry("X-KDE-KonqSidebarModule", "konqsidebar_web"); + scf.sync(); + + QTimer::singleShot(0,this,SLOT(updateButtons())); + } +} + + +void Sidebar_Widget::finishRollBack() +{ + m_path = KGlobal::dirs()->saveLocation("data",m_relPath,true); + initialCopy(); + QTimer::singleShot(0,this,SLOT(updateButtons())); +} + + +void Sidebar_Widget::saveConfig() +{ + m_config->writeEntry("SingleWidgetMode",m_singleWidgetMode); + m_config->writeEntry("ShowExtraButtons",m_showExtraButtons); + m_config->writeEntry("ShowTabsLeft", m_showTabsLeft); + m_config->writeEntry("HideTabs", m_hideTabs); + m_config->writeEntry("SavedWidth",m_savedWidth); + m_config->sync(); +} + +void Sidebar_Widget::doLayout() +{ + if (m_layout) + delete m_layout; + + m_layout = new QHBoxLayout(this); + if (m_showTabsLeft) + { + m_layout->add(m_buttonBar); + m_layout->add(m_area); + m_buttonBar->setPosition(KMultiTabBar::Left); + } else { + m_layout->add(m_area); + m_layout->add(m_buttonBar); + m_buttonBar->setPosition(KMultiTabBar::Right); + } + m_layout->activate(); + if (m_hideTabs) m_buttonBar->hide(); + else m_buttonBar->show(); +} + + +void Sidebar_Widget::aboutToShowConfigMenu() +{ + m_menu->setItemChecked(1, !m_singleWidgetMode); + m_menu->setItemChecked(2, m_showTabsLeft); + m_menu->setItemChecked(3, m_showExtraButtons); +} + + +void Sidebar_Widget::initialCopy() +{ + kdDebug()<<"Initial copy"<<endl; + QStringList dirtree_dirs; + if (m_universalMode) + dirtree_dirs = KGlobal::dirs()->findDirs("data","konqsidebartng/kicker_entries/"); + else + dirtree_dirs = KGlobal::dirs()->findDirs("data","konqsidebartng/entries/"); + if (dirtree_dirs.last()==m_path) + return; //oups; + + int nVersion=-1; + KSimpleConfig lcfg(m_path+".version"); + int lVersion=lcfg.readNumEntry("Version",0); + + + for (QStringList::const_iterator ddit=dirtree_dirs.begin();ddit!=dirtree_dirs.end();++ddit) { + QString dirtree_dir=*ddit; + if (dirtree_dir == m_path) continue; + + + kdDebug()<<"************************************ retrieving directory info:"<<dirtree_dir<<endl; + + if ( !dirtree_dir.isEmpty() && dirtree_dir != m_path ) + { + KSimpleConfig gcfg(dirtree_dir+".version"); + int gversion = gcfg.readNumEntry("Version", 1); + nVersion=(nVersion>gversion)?nVersion:gversion; + if (lVersion >= gversion) + continue; + + QDir dir(m_path); + QStringList entries = dir.entryList( QDir::Files ); + QStringList dirEntries = dir.entryList( QDir::Dirs | QDir::NoSymLinks ); + dirEntries.remove( "." ); + dirEntries.remove( ".." ); + + QDir globalDir( dirtree_dir ); + Q_ASSERT( globalDir.isReadable() ); + // Only copy the entries that don't exist yet in the local dir + QStringList globalDirEntries = globalDir.entryList(); + QStringList::ConstIterator eIt = globalDirEntries.begin(); + QStringList::ConstIterator eEnd = globalDirEntries.end(); + for (; eIt != eEnd; ++eIt ) + { + //kdDebug(1201) << "KonqSidebarTree::scanDir dirtree_dir contains " << *eIt << endl; + if ( *eIt != "." && *eIt != ".." && + !entries.contains( *eIt ) && + !dirEntries.contains( *eIt ) ) + { // we don't have that one yet -> copy it. + QString cp("cp -R -- "); + cp += KProcess::quote(dirtree_dir + *eIt); + cp += " "; + cp += KProcess::quote(m_path); + kdDebug() << "SidebarWidget::intialCopy executing " << cp << endl; + ::system( QFile::encodeName(cp) ); + } + } + } + + lcfg.writeEntry("Version",(nVersion>lVersion)?nVersion:lVersion); + lcfg.sync(); + + } +} + +void Sidebar_Widget::buttonPopupActivate(int id) +{ + switch (id) + { + case 1: + { + KIconDialog kicd(this); +// kicd.setStrictIconSize(true); + QString iconname=kicd.selectIcon(KIcon::Small); + kdDebug()<<"New Icon Name:"<<iconname<<endl; + if (!iconname.isEmpty()) + { + KSimpleConfig ksc(m_path+m_currentButton->file); + ksc.setGroup("Desktop Entry"); + ksc.writeEntry("Icon",iconname); + ksc.sync(); + QTimer::singleShot(0,this,SLOT(updateButtons())); + } + break; + } + case 2: + { + KURLRequesterDlg * dlg = new KURLRequesterDlg( m_currentButton->URL, i18n("Enter a URL:"), this, "url_dlg" ); + dlg->fileDialog()->setMode( KFile::Directory ); + if (dlg->exec()) + { + KSimpleConfig ksc(m_path+m_currentButton->file); + ksc.setGroup("Desktop Entry"); + if ( !dlg->selectedURL().isValid()) + { + KMessageBox::error(this, i18n("<qt><b>%1</b> does not exist</qt>").arg(dlg->selectedURL().url())); + } + else + { + QString newurl= dlg->selectedURL().prettyURL(); + //If we are going to set the name by 'set name', we don't set it here. + //ksc.writeEntry("Name",newurl); + ksc.writePathEntry("URL",newurl); + ksc.sync(); + QTimer::singleShot(0,this,SLOT(updateButtons())); + } + } + delete dlg; + break; + } + case 3: + { + if (KMessageBox::warningContinueCancel(this,i18n("<qt>Do you really want to remove the <b>%1</b> tab?</qt>").arg(m_currentButton->displayName), + QString::null,KStdGuiItem::del())==KMessageBox::Continue) + { + QFile f(m_path+m_currentButton->file); + if (!f.remove()) + qDebug("Error, file not deleted"); + QTimer::singleShot(0,this,SLOT(updateButtons())); + } + break; + } + case 4: // Set a name for this sidebar tab + { + bool ok; + + // Pop up the dialog asking the user for name. + const QString name = KInputDialog::getText(i18n("Set Name"), i18n("Enter the name:"), + m_currentButton->displayName, &ok, this); + + if(ok) + { + // Write the name in the .desktop file of this side button. + KSimpleConfig ksc(m_path+m_currentButton->file); + ksc.setGroup("Desktop Entry"); + ksc.writeEntry("Name", name, true, false, true /*localized*/ ); + ksc.sync(); + + // Update the buttons with a QTimer (why?) + QTimer::singleShot(0,this,SLOT(updateButtons())); + } + break; + } + } +} + +void Sidebar_Widget::activatedMenu(int id) +{ + switch (id) + { + case 1: + { + m_singleWidgetMode = !m_singleWidgetMode; + if ((m_singleWidgetMode) && (m_visibleViews.count()>1)) + { + int tmpViewID=m_latestViewed; + for (uint i=0; i<m_buttons.count(); i++) { + ButtonInfo *button = m_buttons.at(i); + if ((int) i != tmpViewID) + { + if (button->dock && button->dock->isVisibleTo(this)) + showHidePage(i); + } else { + if (button->dock) + { + m_area->setMainDockWidget(button->dock); + m_mainDockWidget->undock(); + } + } + } + m_latestViewed=tmpViewID; + } else { + if (!m_singleWidgetMode) + { + int tmpLatestViewed=m_latestViewed; + m_area->setMainDockWidget(m_mainDockWidget); + m_mainDockWidget->setDockSite(KDockWidget::DockTop); + m_mainDockWidget->setEnableDocking(KDockWidget::DockNone); + m_mainDockWidget->show(); + if ((tmpLatestViewed>=0) && (tmpLatestViewed < (int) m_buttons.count())) + { + ButtonInfo *button = m_buttons.at(tmpLatestViewed); + if (button && button->dock) + { + m_noUpdate=true; + button->dock->undock(); + button->dock->setEnableDocking(KDockWidget::DockTop| + KDockWidget::DockBottom/*|KDockWidget::DockDesktop*/); + kdDebug()<<"Reconfiguring multi view mode"<<endl; + m_buttonBar->setTab(tmpLatestViewed,true); + showHidePage(tmpLatestViewed); + } + } + } + } + break; + } + case 2: + { + m_showTabsLeft = ! m_showTabsLeft; + doLayout(); + break; + } + case 3: + { + m_showExtraButtons = ! m_showExtraButtons; + if(m_showExtraButtons) + { + m_buttonBar->button(-1)->show(); + } + else + { + m_buttonBar->button(-1)->hide(); + + KMessageBox::information(this, + i18n("You have hidden the navigation panel configuration button. To make it visible again, click the right mouse button on any of the navigation panel buttons and select \"Show Configuration Button\".")); + + } + break; + } + default: + return; + } + m_configTimer.start(400, true); +} + +void Sidebar_Widget::readConfig() +{ + m_disableConfig = m_config->readBoolEntry("DisableConfig",false); + m_singleWidgetMode = m_config->readBoolEntry("SingleWidgetMode",true); + m_immutableSingleWidgetMode = + m_config->entryIsImmutable("SingleWidgetMode"); + m_showExtraButtons = m_config->readBoolEntry("ShowExtraButtons",false); + m_immutableShowExtraButtons = + m_config->entryIsImmutable("ShowExtraButtons"); + m_showTabsLeft = m_config->readBoolEntry("ShowTabsLeft", true); + m_immutableShowTabsLeft = m_config->entryIsImmutable("ShowTabsLeft"); + m_hideTabs = m_config->readBoolEntry("HideTabs", false); + m_immutableHideTabs = m_config->entryIsImmutable("HideTabs"); + + if (m_initial) { + m_openViews = m_config->readListEntry("OpenViews"); + m_savedWidth = m_config->readNumEntry("SavedWidth",200); + m_initial=false; + } +} + +void Sidebar_Widget::stdAction(const char *handlestd) +{ + ButtonInfo* mod = m_activeModule; + + if (!mod) + return; + if (!(mod->module)) + return; + + kdDebug() << "Try calling >active< module's (" << mod->module->className() << ") slot " << handlestd << endl; + + int id = mod->module->metaObject()->findSlot( handlestd ); + if ( id == -1 ) + return; + kdDebug() << "Action slot was found, it will be called now" << endl; + QUObject o[ 1 ]; + mod->module->qt_invoke( id, o ); + return; +} + + +void Sidebar_Widget::updateButtons() +{ + //PARSE ALL DESKTOP FILES + m_openViews = m_visibleViews; + + if (m_buttons.count() > 0) + { + for (uint i = 0; i < m_buttons.count(); i++) + { + ButtonInfo *button = m_buttons.at(i); + if (button->dock) + { + m_noUpdate = true; + if (button->dock->isVisibleTo(this)) { + showHidePage(i); + } + + delete button->module; + delete button->dock; + } + m_buttonBar->removeTab(i); + + } + } + m_buttons.clear(); + + readConfig(); + doLayout(); + createButtons(); +} + +void Sidebar_Widget::createButtons() +{ + if (!m_path.isEmpty()) + { + kdDebug()<<"m_path: "<<m_path<<endl; + QDir dir(m_path); + QStringList list=dir.entryList("*.desktop"); + for (QStringList::Iterator it=list.begin(); it!=list.end(); ++it) + { + addButton(*it); + } + } + + if (!m_buttonBar->button(-1)) { + m_buttonBar->appendButton(SmallIcon("configure"), -1, m_menu, + i18n("Configure Sidebar")); + } + + if (m_showExtraButtons && !m_disableConfig) { + m_buttonBar->button(-1)->show(); + } else { + m_buttonBar->button(-1)->hide(); + } + + for (uint i = 0; i < m_buttons.count(); i++) + { + ButtonInfo *button = m_buttons.at(i); + if (m_openViews.contains(button->file)) + { + m_buttonBar->setTab(i,true); + m_noUpdate = true; + showHidePage(i); + if (m_singleWidgetMode) { + break; + } + } + } + + collapseExpandSidebar(); + m_noUpdate=false; +} + +bool Sidebar_Widget::openURL(const class KURL &url) +{ + if (url.protocol()=="sidebar") + { + for (unsigned int i=0;i<m_buttons.count();i++) + if (m_buttons.at(i)->file==url.path()) + { + KMultiTabBarTab *tab = m_buttonBar->tab(i); + if (!tab->isOn()) + tab->animateClick(); + return true; + } + return false; + } + + m_storedUrl=url; + m_hasStoredUrl=true; + bool ret = false; + for (unsigned int i=0;i<m_buttons.count();i++) + { + ButtonInfo *button = m_buttons.at(i); + if (button->dock) + { + if ((button->dock->isVisibleTo(this)) && (button->module)) + { + ret = true; + button->module->openURL(url); + } + } + } + return ret; +} + +bool Sidebar_Widget::addButton(const QString &desktoppath,int pos) +{ + int lastbtn = m_buttons.count(); + m_buttons.resize(m_buttons.size()+1); + + KSimpleConfig *confFile; + + kdDebug() << "addButton:" << (m_path+desktoppath) << endl; + + confFile = new KSimpleConfig(m_path+desktoppath,true); + confFile->setGroup("Desktop Entry"); + + QString icon = confFile->readEntry("Icon"); + QString name = confFile->readEntry("Name"); + QString comment = confFile->readEntry("Comment"); + QString url = confFile->readPathEntry("URL",QString::null); + QString lib = confFile->readEntry("X-KDE-KonqSidebarModule"); + + delete confFile; + + if (pos == -1) + { + m_buttonBar->appendTab(SmallIcon(icon), lastbtn, name); + ButtonInfo *bi = new ButtonInfo(desktoppath, ((KonqSidebar*)m_partParent),0, url, lib, name, + icon, this); + /*int id=*/m_buttons.insert(lastbtn, bi); + KMultiTabBarTab *tab = m_buttonBar->tab(lastbtn); + tab->installEventFilter(this); + connect(tab,SIGNAL(clicked(int)),this,SLOT(showHidePage(int))); + + // Set Whats This help + // This uses the comments in the .desktop files + QWhatsThis::add(tab, comment); + } + + return true; +} + + + +bool Sidebar_Widget::eventFilter(QObject *obj, QEvent *ev) +{ + + if (ev->type()==QEvent::MouseButtonPress && ((QMouseEvent *)ev)->button()==QMouseEvent::RightButton) + { + KMultiTabBarTab *bt=dynamic_cast<KMultiTabBarTab*>(obj); + if (bt) + { + kdDebug()<<"Request for popup"<<endl; + m_currentButton = 0; + for (uint i=0;i<m_buttons.count();i++) + { + if (bt==m_buttonBar->tab(i)) + { + m_currentButton = m_buttons.at(i); + break; + } + } + + if (m_currentButton) + { + if (!m_buttonPopup) + { + m_buttonPopup=new KPopupMenu(this, "Sidebar_Widget::ButtonPopup"); + m_buttonPopup->insertTitle(SmallIcon("unknown"), "", 50); + m_buttonPopup->insertItem(SmallIconSet("text"), i18n("Set Name..."),4); // Item to open a dialog to change the name of the sidebar item (by Pupeno) + m_buttonPopup->insertItem(SmallIconSet("www"), i18n("Set URL..."),2); + m_buttonPopup->insertItem(SmallIconSet("icons"), i18n("Set Icon..."),1); + m_buttonPopup->insertSeparator(); + m_buttonPopup->insertItem(SmallIconSet("editdelete"), i18n("Remove"),3); + m_buttonPopup->insertSeparator(); + m_buttonPopup->insertItem(SmallIconSet("configure"), i18n("Configure Navigation Panel"), m_menu, 4); + connect(m_buttonPopup, SIGNAL(activated(int)), + this, SLOT(buttonPopupActivate(int))); + } + m_buttonPopup->setItemEnabled(2,!m_currentButton->URL.isEmpty()); + m_buttonPopup->changeTitle(50,SmallIcon(m_currentButton->iconName), + m_currentButton->displayName); + if (!m_disableConfig) + { m_buttonPopup->exec(QCursor::pos()); } + } + return true; + + } + } + return false; +} + +void Sidebar_Widget::mousePressEvent(QMouseEvent *ev) +{ + if (ev->type()==QEvent::MouseButtonPress && + ((QMouseEvent *)ev)->button()==QMouseEvent::RightButton && + !m_disableConfig) + { m_menu->exec(QCursor::pos()); } +} + +KonqSidebarPlugin *Sidebar_Widget::loadModule(QWidget *par,QString &desktopName,QString lib_name,ButtonInfo* bi) +{ + KLibLoader *loader = KLibLoader::self(); + + // try to load the library + KLibrary *lib = loader->library(QFile::encodeName(lib_name)); + if (lib) + { + // get the create_ function + QString factory("create_%1"); + void *create = lib->symbol(QFile::encodeName(factory.arg(lib_name))); + + if (create) + { + // create the module + + KonqSidebarPlugin* (*func)(KInstance*,QObject *, QWidget*, QString&, const char *); + func = (KonqSidebarPlugin* (*)(KInstance*,QObject *, QWidget *, QString&, const char *)) create; + QString fullPath(m_path+desktopName); + return (KonqSidebarPlugin*)func(getInstance(),bi,par,fullPath,0); + } + } else { + kdWarning() << "Module " << lib_name << " doesn't specify a library!" << endl; + } + return 0; +} + +KParts::BrowserExtension *Sidebar_Widget::getExtension() +{ + return KParts::BrowserExtension::childObject(m_partParent); +} + +bool Sidebar_Widget::createView( ButtonInfo *data) +{ + bool ret = true; + KSimpleConfig *confFile; + confFile = new KSimpleConfig(data->file,true); + confFile->setGroup("Desktop Entry"); + + data->dock = m_area->createDockWidget(confFile->readEntry("Name",i18n("Unknown")),0); + data->module = loadModule(data->dock,data->file,data->libName,data); + + if (data->module == 0) + { + delete data->dock; + data->dock = 0; + ret = false; + } else { + data->dock->setWidget(data->module->getWidget()); + data->dock->setEnableDocking(KDockWidget::DockTop| + KDockWidget::DockBottom/*|KDockWidget::DockDesktop*/); + data->dock->setDockSite(KDockWidget::DockTop|KDockWidget::DockBottom); + connectModule(data->module); + connect(this, SIGNAL(fileSelection(const KFileItemList&)), + data->module, SLOT(openPreview(const KFileItemList&))); + + connect(this, SIGNAL(fileMouseOver(const KFileItem&)), + data->module, SLOT(openPreviewOnMouseOver(const KFileItem&))); + } + + delete confFile; + return ret; +} + +void Sidebar_Widget::showHidePage(int page) +{ + ButtonInfo *info = m_buttons.at(page); + if (!info->dock) + { + if (m_buttonBar->isTabRaised(page)) + { + //SingleWidgetMode + if (m_singleWidgetMode) + { + if (m_latestViewed != -1) + { + m_noUpdate = true; + showHidePage(m_latestViewed); + } + } + + if (!createView(info)) + { + m_buttonBar->setTab(page,false); + return; + } + + m_buttonBar->setTab(page,true); + + connect(info->module, + SIGNAL(setIcon(const QString&)), + m_buttonBar->tab(page), + SLOT(setIcon(const QString&))); + + connect(info->module, + SIGNAL(setCaption(const QString&)), + m_buttonBar->tab(page), + SLOT(setText(const QString&))); + + if (m_singleWidgetMode) + { + m_area->setMainDockWidget(info->dock); + m_mainDockWidget->undock(); + } else { + info->dock->manualDock(m_mainDockWidget,KDockWidget::DockTop,100); + } + + info->dock->show(); + + if (m_hasStoredUrl) + info->module->openURL(m_storedUrl); + m_visibleViews<<info->file; + m_latestViewed=page; + } + } else { + if ((!info->dock->isVisibleTo(this)) && (m_buttonBar->isTabRaised(page))) { + //SingleWidgetMode + if (m_singleWidgetMode) { + if (m_latestViewed != -1) { + m_noUpdate = true; + showHidePage(m_latestViewed); + } + } + + if (m_singleWidgetMode) { + m_area->setMainDockWidget(info->dock); + m_mainDockWidget->undock(); + } else { + info->dock->manualDock(m_mainDockWidget,KDockWidget::DockTop,100); + } + + info->dock->show(); + m_latestViewed = page; + if (m_hasStoredUrl) + info->module->openURL(m_storedUrl); + m_visibleViews << info->file; + m_buttonBar->setTab(page,true); + } else { + m_buttonBar->setTab(page,false); + if (m_singleWidgetMode) { + m_area->setMainDockWidget(m_mainDockWidget); + m_mainDockWidget->show(); + } + info->dock->undock(); + m_latestViewed = -1; + m_visibleViews.remove(info->file); + } + } + + if (!m_noUpdate) + collapseExpandSidebar(); + m_noUpdate = false; +} + +void Sidebar_Widget::collapseExpandSidebar() +{ + if (!parentWidget()) + return; // Can happen during destruction + + if (m_visibleViews.count()==0) + { + m_somethingVisible = false; + parentWidget()->setMaximumWidth(minimumSizeHint().width()); + updateGeometry(); + emit panelHasBeenExpanded(false); + } else { + m_somethingVisible = true; + parentWidget()->setMaximumWidth(32767); + updateGeometry(); + emit panelHasBeenExpanded(true); + } +} + +QSize Sidebar_Widget::sizeHint() const +{ + if (m_somethingVisible) + return QSize(m_savedWidth,200); + return minimumSizeHint(); +} + +void Sidebar_Widget::dockWidgetHasUndocked(KDockWidget* wid) +{ + kdDebug()<<" Sidebar_Widget::dockWidgetHasUndocked(KDockWidget*)"<<endl; + for (unsigned int i=0;i<m_buttons.count();i++) + { + ButtonInfo *button = m_buttons.at(i); + if (button->dock==wid) + { + if (m_buttonBar->isTabRaised(i)) + { + m_buttonBar->setTab(i,false); + showHidePage(i); + } + } + } +} + +KInstance *Sidebar_Widget::getInstance() +{ + return ((KonqSidebar*)m_partParent)->getInstance(); +} + +void Sidebar_Widget::submitFormRequest(const char *action, + const QString& url, + const QByteArray& formData, + const QString& /*target*/, + const QString& contentType, + const QString& /*boundary*/ ) +{ +KParts::URLArgs args; + + args.setContentType("Content-Type: " + contentType); + args.postData = formData; + args.setDoPost(QCString(action).lower() == "post"); + // boundary? + emit getExtension()->openURLRequest(KURL( url ), args); +} + +void Sidebar_Widget::openURLRequest( const KURL &url, const KParts::URLArgs &args) +{ + getExtension()->openURLRequest(url,args); +} + +void Sidebar_Widget::createNewWindow( const KURL &url, const KParts::URLArgs &args) +{ + getExtension()->createNewWindow(url,args); +} + +void Sidebar_Widget::createNewWindow( const KURL &url, const KParts::URLArgs &args, + const KParts::WindowArgs &windowArgs, KParts::ReadOnlyPart *&part ) +{ + getExtension()->createNewWindow(url,args,windowArgs,part); +} + +void Sidebar_Widget::enableAction( const char * name, bool enabled ) +{ + if (sender()->parent()->isA("ButtonInfo")) + { + ButtonInfo *btninfo = static_cast<ButtonInfo*>(sender()->parent()); + if (btninfo) + { + QString n(name); + if (n == "copy") + btninfo->copy = enabled; + else if (n == "cut") + btninfo->cut = enabled; + else if (n == "paste") + btninfo->paste = enabled; + else if (n == "trash") + btninfo->trash = enabled; + else if (n == "del") + btninfo->del = enabled; + else if (n == "rename") + btninfo->rename = enabled; + } + } +} + + +bool Sidebar_Widget::doEnableActions() +{ + if (!(sender()->parent()->isA("ButtonInfo"))) + { + kdDebug()<<"Couldn't set active module, aborting"<<endl; + return false; + } else { + m_activeModule=static_cast<ButtonInfo*>(sender()->parent()); + getExtension()->enableAction( "copy", m_activeModule->copy ); + getExtension()->enableAction( "cut", m_activeModule->cut ); + getExtension()->enableAction( "paste", m_activeModule->paste ); + getExtension()->enableAction( "trash", m_activeModule->trash ); + getExtension()->enableAction( "del", m_activeModule->del ); + getExtension()->enableAction( "rename", m_activeModule->rename ); + return true; + } + +} + +void Sidebar_Widget::popupMenu( const QPoint &global, const KFileItemList &items ) +{ + if (doEnableActions()) + getExtension()->popupMenu(global,items); +} + + +void Sidebar_Widget::popupMenu( KXMLGUIClient *client, const QPoint &global, const KFileItemList &items ) +{ + if (doEnableActions()) + getExtension()->popupMenu(client,global,items); +} + +void Sidebar_Widget::popupMenu( const QPoint &global, const KURL &url, + const QString &mimeType, mode_t mode) +{ + if (doEnableActions()) + getExtension()->popupMenu(global,url,mimeType,mode); +} + +void Sidebar_Widget::popupMenu( KXMLGUIClient *client, + const QPoint &global, const KURL &url, + const QString &mimeType, mode_t mode ) +{ + if (doEnableActions()) + getExtension()->popupMenu(client,global,url,mimeType,mode); +} + +void Sidebar_Widget::connectModule(QObject *mod) +{ + if (mod->metaObject()->findSignal("started(KIO::Job*)") != -1) { + connect(mod,SIGNAL(started(KIO::Job *)),this, SIGNAL(started(KIO::Job*))); + } + + if (mod->metaObject()->findSignal("completed()") != -1) { + connect(mod,SIGNAL(completed()),this,SIGNAL(completed())); + } + + if (mod->metaObject()->findSignal("popupMenu(const QPoint&,const KURL&,const QString&,mode_t)") != -1) { + connect(mod,SIGNAL(popupMenu( const QPoint &, const KURL &, + const QString &, mode_t)),this,SLOT(popupMenu( const + QPoint &, const KURL&, const QString &, mode_t))); + } + + if (mod->metaObject()->findSignal("popupMenu(KXMLGUIClient*,const QPoint&,const KURL&,const QString&,mode_t)") != -1) { + connect(mod,SIGNAL(popupMenu( KXMLGUIClient *, const QPoint &, + const KURL &,const QString &, mode_t)),this, + SLOT(popupMenu( KXMLGUIClient *, const QPoint &, + const KURL &,const QString &, mode_t))); + } + + if (mod->metaObject()->findSignal("popupMenu(const QPoint&,const KFileItemList&)") != -1) { + connect(mod,SIGNAL(popupMenu( const QPoint &, const KFileItemList & )), + this,SLOT(popupMenu( const QPoint &, const KFileItemList & ))); + } + + if (mod->metaObject()->findSignal("openURLRequest(const KURL&,const KParts::URLArgs&)") != -1) { + connect(mod,SIGNAL(openURLRequest( const KURL &, const KParts::URLArgs &)), + this,SLOT(openURLRequest( const KURL &, const KParts::URLArgs &))); + } + + if (mod->metaObject()->findSignal("submitFormRequest(const char*,const QString&,const QByteArray&,const QString&,const QString&,const QString&)") != -1) { + connect(mod, + SIGNAL(submitFormRequest(const char*,const QString&,const QByteArray&,const QString&,const QString&,const QString&)), + this, + SLOT(submitFormRequest(const char*,const QString&,const QByteArray&,const QString&,const QString&,const QString&))); + } + + if (mod->metaObject()->findSignal("enableAction(const char*,bool)") != -1) { + connect(mod,SIGNAL(enableAction( const char *, bool)), + this,SLOT(enableAction(const char *, bool))); + } + + if (mod->metaObject()->findSignal("createNewWindow(const KURL&,const KParts::URLArgs&)") != -1) { + connect(mod,SIGNAL(createNewWindow( const KURL &, const KParts::URLArgs &)), + this,SLOT(createNewWindow( const KURL &, const KParts::URLArgs &))); + } +} + + + +Sidebar_Widget::~Sidebar_Widget() +{ + m_config->writeEntry("OpenViews", m_visibleViews); + if (m_configTimer.isActive()) + saveConfig(); + delete m_config; + m_noUpdate = true; + for (uint i=0;i<m_buttons.count();i++) + { + ButtonInfo *button = m_buttons.at(i); + if (button->dock) + button->dock->undock(); + } +} + +void Sidebar_Widget::customEvent(QCustomEvent* ev) +{ + if (KonqFileSelectionEvent::test(ev)) + { + emit fileSelection(static_cast<KonqFileSelectionEvent*>(ev)->selection()); + } else if (KonqFileMouseOverEvent::test(ev)) { + if (!(static_cast<KonqFileMouseOverEvent*>(ev)->item())) { + emit fileMouseOver(KFileItem(KURL(),QString::null,KFileItem::Unknown)); + } else { + emit fileMouseOver(*static_cast<KonqFileMouseOverEvent*>(ev)->item()); + } + } +} + +void Sidebar_Widget::resizeEvent(QResizeEvent* ev) +{ + if (m_somethingVisible && m_userMovedSplitter) + { + int newWidth = width(); + QSplitter *split = splitter(); + if (split && (m_savedWidth != newWidth)) + { + QValueList<int> sizes = split->sizes(); + if ((sizes.count() >= 2) && (sizes[1])) + { + m_savedWidth = newWidth; + updateGeometry(); + m_configTimer.start(400, true); + } + } + } + m_userMovedSplitter = false; + QWidget::resizeEvent(ev); +} + +QSplitter *Sidebar_Widget::splitter() const +{ + if (m_universalMode) return 0; + QObject *p = parent(); + if (!p) return 0; + p = p->parent(); + return static_cast<QSplitter*>(p); +} + +void Sidebar_Widget::userMovedSplitter() +{ + m_userMovedSplitter = true; +} |