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.
tdeaddons/konq-plugins/crashes/crashesplugin.cpp

194 lines
5.9 KiB

/*
Copyright (c) 2002-2003 Alexander Kellett <lypanov@kde.org>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License (LGPL) as published by the Free Software Foundation;
either version 2 of the License, or (at your option) any later
version.
This library 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#include <kdebug.h>
#include <kaction.h>
#include <kglobal.h>
#include <kconfig.h>
#include <kinstance.h>
#include <khtml_part.h>
#include <kgenericfactory.h>
#include <krun.h>
#include <kservice.h>
#include <kpopupmenu.h>
#include <kbookmarkimporter_crash.h>
#include "crashesplugin.h"
typedef KGenericFactory<CrashesPlugin> CrashesPluginFactory;
K_EXPORT_COMPONENT_FACTORY( libcrashesplugin, CrashesPluginFactory( "crashesplugin" ) )
CrashesPlugin::CrashesPlugin( QObject* parent, const char* name, const QStringList & )
: KParts::Plugin( parent, name )
{
m_part = (parent && parent->inherits( "KHTMLPart" )) ? static_cast<KHTMLPart*>(parent) : 0L;
m_pCrashesMenu = new KActionMenu( i18n("&Crashes"), "core",
actionCollection(), "crashes" );
m_pCrashesMenu->setDelayed( false );
m_pCrashesMenu->setEnabled( true );
connect( m_pCrashesMenu->popupMenu(), SIGNAL( aboutToShow() ),
this, SLOT( slotAboutToShow() ) );
}
CrashesPlugin::~CrashesPlugin()
{
}
void CrashesPlugin::slotAboutToShow()
{
m_pCrashesMenu->popupMenu()->clear();
KCrashBookmarkImporter importer(KCrashBookmarkImporter::crashBookmarksDir());
connect( &importer, SIGNAL( newBookmark( const QString &, const QCString &, const QString &) ),
SLOT( newBookmarkCallback( const QString &, const QCString &, const QString & ) ) );
connect( &importer, SIGNAL( endFolder() ), SLOT( endFolderCallback() ) );
int count = m_pCrashesMenu->popupMenu()->count();
m_crashesList.clear();
m_crashRangesList.clear();
importer.parseCrashBookmarks( false );
bool gotSep = true; // don't start with a sep
bool enable = true;
int firstItem = count; // item ids grow up from count
int crashGroup = INT_MAX; // group ids grow down from INT_MAX
if (m_crashesList.count() > 0) {
CrashesList::ConstIterator e = m_crashesList.begin();
for( ; e != m_crashesList.end(); ++e ) {
if ( ((*e).first == "-")
&& ((*e).second == "-")
) {
if (!gotSep) {
if (count - firstItem > 1)
{
m_crashRangesList.append( CrashRange(firstItem, count) );
m_pCrashesMenu->popupMenu()->insertItem(
i18n("All Pages of This Crash"), this,
SLOT(slotGroupSelected(int)),
0, crashGroup--);
}
m_pCrashesMenu->popupMenu()->insertSeparator();
}
gotSep = true;
firstItem = ++count;
} else {
QString str = (*e).first;
if (str.length() > 48) {
str.truncate(48);
str.append("...");
}
m_pCrashesMenu->popupMenu()->insertItem(
str, this,
SLOT(slotItemSelected(int)),
0, ++count );
gotSep = false;
}
}
if (count - firstItem > 1) {
m_crashRangesList.append( CrashRange(firstItem, count) );
m_pCrashesMenu->popupMenu()->insertItem(
i18n("All Pages of This Crash"), this,
SLOT(slotGroupSelected(int)),
0, crashGroup--);
}
} else {
m_pCrashesMenu->popupMenu()->insertItem(
i18n("No Recovered Crashes"), this,
SLOT(slotItemSelected(int)),
0, ++count );
gotSep = false;
enable = false;
}
if (!gotSep) {
// don't have an extra sep
m_pCrashesMenu->popupMenu()->insertSeparator();
}
int id =m_pCrashesMenu->popupMenu()->insertItem( i18n("&Clear List of Crashes"), this,
SLOT(slotClearCrashes()),
0, ++count );
m_pCrashesMenu->popupMenu()->setItemEnabled( id, enable);
}
void CrashesPlugin::newBookmarkCallback( const QString & text, const QCString & url,
const QString & )
{
m_crashesList.prepend(qMakePair(text,url));
}
void CrashesPlugin::endFolderCallback( )
{
m_crashesList.prepend(qMakePair(QString("-"),QCString("-")));
}
void CrashesPlugin::slotClearCrashes() {
KCrashBookmarkImporter importer(KCrashBookmarkImporter::crashBookmarksDir());
importer.parseCrashBookmarks( true );
slotAboutToShow();
}
void CrashesPlugin::slotItemSelected( int id )
{
if (m_crashesList.count() == 0)
return;
KURL url( m_crashesList[id-1].second );
if (m_part)
emit m_part->browserExtension()->openURLRequest( url );
}
void CrashesPlugin::slotGroupSelected( int range )
{
if (!m_part)
return;
range = INT_MAX - range;
if (m_crashesList.count() == 0 || m_crashRangesList.count() == 0)
return;
CrashRange r = m_crashRangesList[range];
int from = r.first;
int i = from;
if (m_part) {
KParts::URLArgs urlargs;
urlargs.setNewTab( true );
do {
KURL url( m_crashesList[i].second );
// Open first one in current tab
if (i == from)
emit m_part->browserExtension()->openURLRequest( url );
else
emit m_part->browserExtension()->createNewWindow( url, urlargs );
} while (++i < r.second);
}
}
#include "crashesplugin.moc"