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.
tdenetwork/kopete/plugins/history/historyplugin.cpp

195 lines
6.1 KiB

/*
historyplugin.cpp
Copyright (c) 2003-2004 by Olivier Goffart <ogoffart @ kde.org>
(c) 2003 by Stefan Gehn <metz AT gehn.net>
Kopete (c) 2003-2004 by the Kopete developers <kopete-devel@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 <kgenericfactory.h>
#include <kaboutdata.h>
#include <kaction.h>
#include <kmessagebox.h>
//#include <kconfig.h>
#include <kplugininfo.h>
#include <kdeversion.h>
#include "kopetechatsessionmanager.h"
#include "kopetemetacontact.h"
#include "kopeteview.h"
#include "kopetecontactlist.h"
#include "kopeteuiglobal.h"
#include "kopetemessageevent.h"
#include "kopeteviewplugin.h"
#include "historydialog.h"
#include "historyplugin.h"
#include "historylogger.h"
#include "historyguiclient.h"
#include "historyconfig.h"
typedef KGenericFactory<HistoryPlugin> HistoryPluginFactory;
static const KAboutData aboutdata("kopete_history", I18N_NOOP("History") , "1.0" );
K_EXPORT_COMPONENT_FACTORY( kopete_history, HistoryPluginFactory( &aboutdata ) )
HistoryPlugin::HistoryPlugin( TQObject *parent, const char *name, const TQStringList & /* args */ )
: Kopete::Plugin( HistoryPluginFactory::instance(), parent, name ), m_loggerFactory( this )
{
KAction *viewMetaContactHistory = new KAction( i18n("View &History" ),
TQString::fromLatin1( "history" ), 0, this, TQT_SLOT(slotViewHistory()),
actionCollection(), "viewMetaContactHistory" );
viewMetaContactHistory->setEnabled(
Kopete::ContactList::self()->selectedMetaContacts().count() == 1 );
connect(Kopete::ContactList::self(), TQT_SIGNAL(metaContactSelected(bool)),
viewMetaContactHistory, TQT_SLOT(setEnabled(bool)));
connect(Kopete::ChatSessionManager::self(), TQT_SIGNAL(viewCreated(KopeteView*)),
this, TQT_SLOT(slotViewCreated(KopeteView*)));
connect(this, TQT_SIGNAL(settingsChanged()), this, TQT_SLOT(slotSettingsChanged()));
setXMLFile("historyui.rc");
if(detectOldHistory())
{
if(
KMessageBox::questionYesNo(Kopete::UI::Global::mainWidget(),
i18n( "Old history files from Kopete 0.6.x or older has been detected.\n"
"Do you want to import and convert it to the new history format?" ),
i18n( "History Plugin" ), i18n("Import && Convert"), i18n("Do Not Import") ) == KMessageBox::Yes )
{
convertOldHistory();
}
}
// Add GUI action to all existing kmm objects
// (Needed if the plugin is enabled while kopete is already running)
TQValueList<Kopete::ChatSession*> sessions = Kopete::ChatSessionManager::self()->sessions();
for (TQValueListIterator<Kopete::ChatSession*> it= sessions.begin(); it!=sessions.end() ; ++it)
{
if(!m_loggers.contains(*it))
{
m_loggers.insert(*it, new HistoryGUIClient( *it ) );
connect( *it, TQT_SIGNAL(closing(Kopete::ChatSession*)),
this, TQT_SLOT(slotKMMClosed(Kopete::ChatSession*)));
}
}
}
HistoryPlugin::~HistoryPlugin()
{
}
void HistoryMessageLogger::handleMessage( Kopete::MessageEvent *event )
{
history->messageDisplayed( event->message() );
MessageHandler::handleMessage( event );
}
void HistoryPlugin::messageDisplayed(const Kopete::Message &m)
{
if(m.direction()==Kopete::Message::Internal || !m.manager())
return;
if(!m_loggers.contains(m.manager()))
{
m_loggers.insert(m.manager() , new HistoryGUIClient( m.manager() ) );
connect(m.manager(), TQT_SIGNAL(closing(Kopete::ChatSession*)),
this, TQT_SLOT(slotKMMClosed(Kopete::ChatSession*)));
}
HistoryLogger *l=m_loggers[m.manager()]->logger();
if(l)
{
TQPtrList<Kopete::Contact> mb=m.manager()->members();
l->appendMessage(m,mb.first());
}
m_lastmessage=m;
}
void HistoryPlugin::slotViewHistory()
{
Kopete::MetaContact *m=Kopete::ContactList::self()->selectedMetaContacts().first();
if(m)
{
int lines = HistoryConfig::number_ChatWindow();
// TODO: Keep track of open dialogs and raise instead of
// opening a new (duplicated) one
new HistoryDialog(m);
}
}
void HistoryPlugin::slotViewCreated( KopeteView* v )
{
if(v->plugin()->pluginInfo()->pluginName() != TQString::fromLatin1("kopete_chatwindow") )
return; //Email chat windows are not supported.
bool autoChatWindow = HistoryConfig::auto_chatwindow();
int nbAutoChatWindow = HistoryConfig::number_Auto_chatwindow();
KopeteView *m_currentView = v;
Kopete::ChatSession *m_currentChatSession = v->msgManager();
TQPtrList<Kopete::Contact> mb = m_currentChatSession->members();
if(!m_currentChatSession)
return; //i am sorry
if(!m_loggers.contains(m_currentChatSession))
{
m_loggers.insert(m_currentChatSession , new HistoryGUIClient( m_currentChatSession ) );
connect( m_currentChatSession, TQT_SIGNAL(closing(Kopete::ChatSession*)),
this , TQT_SLOT(slotKMMClosed(Kopete::ChatSession*)));
}
if(!autoChatWindow || nbAutoChatWindow == 0)
return;
HistoryLogger *logger = m_loggers[m_currentChatSession]->logger();
logger->setPositionToLast();
TQValueList<Kopete::Message> msgs = logger->readMessages(nbAutoChatWindow,
/*mb.first()*/ 0L, HistoryLogger::AntiChronological, true, true);
// make sure the last message is not the one which will be appened right
// after the view is created (and which has just been logged in)
if(
(msgs.last().plainBody() == m_lastmessage.plainBody()) &&
(m_lastmessage.manager() == m_currentChatSession))
{
msgs.remove(msgs.fromLast());
}
m_currentView->appendMessages( msgs );
}
void HistoryPlugin::slotKMMClosed( Kopete::ChatSession* kmm)
{
m_loggers[kmm]->deleteLater();
m_loggers.remove(kmm);
}
void HistoryPlugin::slotSettingsChanged()
{
kdDebug(14310) << k_funcinfo << "RELOADING CONFIG" << endl;
HistoryConfig::self()->readConfig();
}
#include "historyplugin.moc"