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.
kvirc/src/modules/logview/logviewmdiwindow.cpp

478 lines
15 KiB

//
// File : logviewmdiwindow.cpp
// Creation date : Tue Apr 23 2002 18:08:22 by Juanjo <20>varez
//
// This file is part of the KVirc irc client distribution
// Copyright (C) 1999-2000 Szymon Stefanek (pragma at kvirc dot net)
//
// 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 opinion) 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 "logviewmdiwindow.h"
#include "logviewwidget.h"
#include "kvi_iconmanager.h"
#include "kvi_locale.h"
#include "kvi_module.h"
#include "kvi_options.h"
#include "kvi_frame.h"
#include "kvi_ircview.h"
#include "kvi_qstring.h"
#include "kvi_qcstring.h"
#include "kvi_app.h"
#include "kvi_fileutils.h"
#ifdef COMPILE_USE_QT4
#include <tq3progressdialog.h>
#else
#include <tqprogressdialog.h>
#endif
#include "kvi_valuelist.h"
#include "kvi_accel.h"
#include <tqpixmap.h>
#include <tqsplitter.h>
#include <tqtoolbutton.h>
#include "kvi_tal_listview.h"
#include <tqfileinfo.h>
#include <tqdir.h>
#include "kvi_tal_popupmenu.h"
#include <tqcursor.h>
#include <tqlayout.h>
#include <tqpushbutton.h>
#ifdef COMPILE_ZLIB_SUPPORT
#include <zlib.h>
#endif
#include <tqtextcodec.h>
#include "kvi_styled_controls.h"
#include <tqdatetimeedit.h>
#include <tqlineedit.h>
#include <tqlabel.h>
extern KviLogViewMDIWindow * g_pLogViewWindow;
KviLogViewMDIWindow::KviLogViewMDIWindow(KviModuleExtensionDescriptor * d,KviFrame * lpFrm)
: KviWindow(KVI_WINDOW_TYPE_LOGVIEW,lpFrm,"logview"), KviModuleExtension(d)
{
g_pLogViewWindow = this;
// m_pLogViewWidget = new KviLogViewWidget(this);
#ifdef COMPILE_USE_QT4
m_pSplitter = new TQSplitter(Qt::Horizontal,this,"main_splitter");
#else
m_pSplitter = new TQSplitter(Qt::Horizontal,this,"main_splitter");
#endif
m_pTabWidget = new TQTabWidget(m_pSplitter);
m_pIndexTab = new KviTalVBox(m_pTabWidget);
m_pTabWidget->insertTab(m_pIndexTab,__tr2qs_ctx("Index","logview"));
m_pListView = new KviTalListView(m_pIndexTab);
m_pListView->addColumn(__tr2qs_ctx("Log File","logview"),135);
m_pListView->setColumnWidthMode(0,KviTalListView::Maximum);
m_pListView->setAllColumnsShowFocus(true);
m_pListView->setMultiSelection(false);
m_pListView->setShowSortIndicator(true);
m_pListView->setRootIsDecorated(true);
connect(m_pListView,TQT_SIGNAL(selectionChanged(KviTalListViewItem *)),this,TQT_SLOT(itemSelected(KviTalListViewItem *)));
connect(m_pListView,TQT_SIGNAL(rightButtonClicked ( KviTalListViewItem * , const TQPoint &, int )),this,TQT_SLOT(rightButtonClicked ( KviTalListViewItem * , const TQPoint &, int )));
m_pSearchTab = new TQWidget(m_pTabWidget);
m_pTabWidget->insertTab(m_pSearchTab,__tr2qs_ctx("Filter","logview"));
TQGridLayout *tqlayout = new TQGridLayout(m_pSearchTab,10,2,3,5);
m_pShowChannelsCheck = new KviStyledCheckBox(__tr2qs_ctx("Show channel logs","logview"),m_pSearchTab);
m_pShowChannelsCheck->setChecked(true);
tqlayout->addMultiCellWidget(m_pShowChannelsCheck,0,0,0,1);
m_pShowQueryesCheck = new KviStyledCheckBox(__tr2qs_ctx("Show query logs","logview"),m_pSearchTab);
m_pShowQueryesCheck->setChecked(true);
tqlayout->addMultiCellWidget(m_pShowQueryesCheck,1,1,0,1);
m_pShowConsolesCheck = new KviStyledCheckBox(__tr2qs_ctx("Show console logs","logview"),m_pSearchTab);
m_pShowConsolesCheck->setChecked(true);
tqlayout->addMultiCellWidget(m_pShowConsolesCheck,2,2,0,1);
m_pShowDccChatCheck = new KviStyledCheckBox(__tr2qs_ctx("Show DCC chat logs","logview"),m_pSearchTab);
m_pShowDccChatCheck->setChecked(true);
tqlayout->addMultiCellWidget(m_pShowDccChatCheck,3,3,0,1);
m_pShowOtherCheck = new KviStyledCheckBox(__tr2qs_ctx("Show other logs","logview"),m_pSearchTab);
m_pShowOtherCheck->setChecked(true);
tqlayout->addMultiCellWidget(m_pShowOtherCheck,4,4,0,1);
TQLabel *l;
l = new TQLabel(__tr2qs_ctx("Contents filter","logview"),m_pSearchTab);
tqlayout->addMultiCellWidget(l,5,5,0,1);
l = new TQLabel(__tr2qs_ctx("Log name mask:","logview"),m_pSearchTab);
m_pFileNameMask = new TQLineEdit(m_pSearchTab);
connect(m_pFileNameMask,TQT_SIGNAL(returnPressed()),this,TQT_SLOT(applyFilter()));
tqlayout->addWidget(l,6,0);
tqlayout->addWidget(m_pFileNameMask,6,1);
l = new TQLabel(__tr2qs_ctx("Log contents mask:","logview"),m_pSearchTab);
m_pContentsMask = new TQLineEdit(m_pSearchTab);
connect(m_pContentsMask,TQT_SIGNAL(returnPressed()),this,TQT_SLOT(applyFilter()));
tqlayout->addWidget(l,7,0);
tqlayout->addWidget(m_pContentsMask,7,1);
m_pEnableFromFilter = new KviStyledCheckBox(__tr2qs_ctx("Only older than","logview"),m_pSearchTab);
m_pFromDateEdit = new TQDateEdit(m_pSearchTab);
m_pFromDateEdit->setDate(TQDate::currentDate());
tqlayout->addWidget(m_pEnableFromFilter,8,0);
tqlayout->addWidget(m_pFromDateEdit,8,1);
connect(m_pEnableFromFilter,TQT_SIGNAL(toggled(bool)),m_pFromDateEdit,TQT_SLOT(setEnabled(bool)));
m_pFromDateEdit->setEnabled(false);
m_pEnableToFilter = new KviStyledCheckBox(__tr2qs_ctx("Only newier than","logview"),m_pSearchTab);
m_pToDateEdit = new TQDateEdit(m_pSearchTab);
m_pToDateEdit->setDate(TQDate::currentDate());
tqlayout->addWidget(m_pEnableToFilter,9,0);
tqlayout->addWidget(m_pToDateEdit,9,1);
connect(m_pEnableToFilter,TQT_SIGNAL(toggled(bool)),m_pToDateEdit,TQT_SLOT(setEnabled(bool)));
m_pToDateEdit->setEnabled(false);
TQPushButton *pb = new TQPushButton(__tr2qs_ctx("Apply filter","logview"),m_pSearchTab);
connect(pb,TQT_SIGNAL(clicked()),this,TQT_SLOT(applyFilter()));
tqlayout->addWidget(pb,10,1);
TQWidget *w = new TQWidget(m_pSearchTab);
w->setSizePolicy(TQSizePolicy::Ignored,TQSizePolicy::Ignored);
tqlayout->addWidget(w,11,1);
m_pIrcView = new KviIrcView(m_pSplitter,g_pFrame,this);
#ifdef COMPILE_USE_QT4
m_pIrcView->setFocusPolicy(TTQ_ClickFocus);
#else
m_pIrcView->setFocusPolicy(TQ_ClickFocus);
#endif
KviValueList<int> li;
li.append(110);
li.append(width()-110);
m_pSplitter->setSizes(li);
g_pApp->getLocalKvircDirectory(m_szLogDirectory,KviApp::Log);
KviTQString::ensureLastCharIs(m_szLogDirectory,'/'); // Does this work on Windows?
cacheFileList();
setupItemList();
KviAccel *a = new KviAccel( this );
a->connectItem( a->insertItem(TQt::Key_F+TQt::CTRL),
m_pIrcView,
TQT_SLOT(toggleToolWidget()) );
}
KviLogViewMDIWindow::~KviLogViewMDIWindow()
{
g_pLogViewWindow = 0;
}
void KviLogViewMDIWindow::applyFilter()
{
setupItemList();
}
TQPixmap * KviLogViewMDIWindow::myIconPtr()
{
return g_pIconManager->getSmallIcon(KVI_SMALLICON_LOG);
}
void KviLogViewMDIWindow::resizeEvent(TQResizeEvent *e)
{
m_pSplitter->setGeometry(0,0,width(),height());
}
void KviLogViewMDIWindow::fillCaptionBuffers()
{
m_szPlainTextCaption = __tr2qs_ctx("Log Viewer","logview");
m_szHtmlActiveCaption = TQString("<nobr><font color=\"%1\"><b>").tqarg(TQString(KVI_OPTION_COLOR(KviOption_colorCaptionTextActive).name()).ascii());
m_szHtmlActiveCaption.append(m_szPlainTextCaption);
m_szHtmlActiveCaption.append("</b></font></nobr>");
m_szHtmlInactiveCaption = TQString("<nobr><font color=\"%1\"><b>").tqarg(TQString(KVI_OPTION_COLOR(KviOption_colorCaptionTextInactive).name()).ascii());
m_szHtmlInactiveCaption.append(m_szPlainTextCaption);
m_szHtmlInactiveCaption.append("</b></font></nobr>");
}
void KviLogViewMDIWindow::die()
{
close();
}
TQSize KviLogViewMDIWindow::sizeHint() const
{
TQSize ret(m_pSplitter->sizeHint().width(),m_pIrcView->sizeHint().height());
return ret;
}
void KviLogViewMDIWindow::setupItemList()
{
m_pListView->clear();
KviLogFile *pFile;
//m_logList.begin();
KviLogListViewItem *pLastCategory=0;
KviLogListViewItemFolder *pLastGroupItem;
TQString szLastGroup;
TQString szCurGroup;
const bool bShowChannel=m_pShowChannelsCheck->isChecked();
const bool bShowQuery=m_pShowQueryesCheck->isChecked();
const bool bShowConsole=m_pShowConsolesCheck->isChecked();
const bool bShowOther=m_pShowOtherCheck->isChecked();
const bool bShowDccChat=m_pShowDccChatCheck->isChecked();
const bool filterFromDate=m_pEnableFromFilter->isChecked();
const bool filterToDate=m_pEnableToFilter->isChecked();
const TQString nameFilterText = m_pFileNameMask->text();
const bool enableNameFilter = !nameFilterText.isEmpty();
const TQString contentFilterText = m_pContentsMask->text();
const bool enableContentFilter = !contentFilterText.isEmpty();
TQDate fromDate = m_pFromDateEdit->date();
TQDate toDate = m_pToDateEdit->date();
TQString textBuffer;
#ifdef COMPILE_USE_QT4
Q3ProgressDialog progress( __tr2qs_ctx("Filtering files...","logview"),
__tr2qs_ctx("Abort filtering","logview"), m_logList.count(),
this, "progress", TRUE );
#else
TQProgressDialog progress( __tr2qs_ctx("Filtering files...","logview"),
__tr2qs_ctx("Abort filtering","logview"), m_logList.count(),
this, "progress", TRUE );
#endif
int i=0;
for(pFile=m_logList.first();pFile;pFile=m_logList.next())
{
progress.setProgress( i );
i++;
g_pApp->processEvents();
if ( progress.wasCanceled() )
break;
if(pFile->type()==KviLogFile::Channel && !bShowChannel)
continue;
if(pFile->type()==KviLogFile::Console && !bShowConsole)
continue;
if(pFile->type()==KviLogFile::DccChat && !bShowDccChat)
continue;
if(pFile->type()==KviLogFile::Other && !bShowOther)
continue;
if(pFile->type()==KviLogFile::Query && !bShowQuery)
continue;
if(filterFromDate)
if(pFile->date()<fromDate)
continue;
if(filterToDate)
if(pFile->date()>toDate)
continue;
if(enableNameFilter)
if(!KviTQString::matchStringCI(nameFilterText,pFile->name()))
continue;
if(enableContentFilter)
{
pFile->getText(textBuffer,m_szLogDirectory);
if(!KviTQString::matchStringCI(contentFilterText,textBuffer))
continue;
}
if(pLastCategory)
{
if(pLastCategory->m_type!=pFile->type())
pLastCategory = new KviLogListViewItemType(m_pListView,pFile->type());
} else {
pLastCategory = new KviLogListViewItemType(m_pListView,pFile->type());
}
KviTQString::sprintf(szCurGroup,__tr2qs_ctx("%Q on %Q","logview"),&(pFile->name()),
&(pFile->network())
);
if(szLastGroup!=szCurGroup) {
szLastGroup=szCurGroup;
pLastGroupItem=new KviLogListViewItemFolder(pLastCategory,szLastGroup);
}
new KviLogListViewLog(pLastGroupItem,pFile->type(),pFile);
}
progress.setProgress( m_logList.count() );
}
void KviLogViewMDIWindow::cacheFileList()
{
TQStringList m_pFileNames = getFileNames();
m_pFileNames.sort();
TQString szFname;
for(TQStringList::Iterator it = m_pFileNames.begin(); it != m_pFileNames.end(); ++it)
{
szFname=(*it);
TQFileInfo fi(szFname);
if(fi.extension(false)=="gz" || fi.extension(false)=="log")
m_logList.append(new KviLogFile(szFname));
}
}
void KviLogViewMDIWindow::itemSelected(KviTalListViewItem * it)
{
bool bCompressed=0;
//A parent node
m_pIrcView->clearBuffer();
if(!it || !it->parent() || !(((KviLogListViewItem *)it)->m_pFileData) )
{
return;
}
TQString text;
((KviLogListViewItem *)it)->m_pFileData->getText(text,m_szLogDirectory);
TQStringList lines=TQStringList::split('\n',text);
bool bOk;
int iMsgType;
for ( TQStringList::Iterator it = lines.begin(); it != lines.end(); ++it ) {
TQString num=(*it).section(' ',0,0);
iMsgType=num.toInt(&bOk);
if(bOk)
outputNoFmt(iMsgType,(*it).section(' ',1),KviIrcView::NoRepaint | KviIrcView::NoTimestamp);
else
outputNoFmt(0,*it,KviIrcView::NoRepaint | KviIrcView::NoTimestamp);
}
m_pIrcView->tqrepaint(false);
}
TQStringList KviLogViewMDIWindow::getFileNames()
{
TQString logPath;
g_pApp->getLocalKvircDirectory(logPath,KviApp::Log);
TQString qPath(logPath);
TQDir logDir(qPath);
return logDir.entryList();
}
void KviLogViewMDIWindow::rightButtonClicked ( KviTalListViewItem * it, const TQPoint &, int )
{
if(!it) return;
if(((KviLogListViewItem *)it)->fileName(0).isEmpty()) return;
KviTalPopupMenu* popup = new KviTalPopupMenu(this);
popup->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_TQUIT)),__tr2qs_ctx("Remove file","logview"),this,TQT_SLOT(deleteCurrent()));
popup->exec( TQCursor::pos() );
}
void KviLogViewMDIWindow::deleteCurrent()
{
KviLogListViewItem* pItem = (KviLogListViewItem *)(m_pListView->currentItem());
if(pItem)
{
if(!pItem->fileName(0).isNull())
{
TQString szFname;
g_pApp->getLocalKvircDirectory(szFname,KviApp::Log,pItem->m_pFileData->fileName());
KviFileUtils::removeFile(szFname);
delete pItem;
m_pIrcView->clearBuffer();
}
}
}
KviLogFile::KviLogFile(const TQString& name)
{
m_szFilename=name;
TQFileInfo fi(m_szFilename);
m_bCompressed=(fi.extension(false)=="gz");
TQString typeToken = m_szFilename.section('_',0,0);
// Ignore non-logs files, this includes '.' and '..'
if( KviTQString::equalCI(typeToken,"channel") )
m_type = Channel;
else if( KviTQString::equalCI(typeToken,"console") )
m_type = Console;
else if( KviTQString::equalCI(typeToken,"dccchat") )
m_type = DccChat;
else if( KviTQString::equalCI(typeToken,"query") )
m_type = Query;
else
m_type = Other;
KviStr undecoded = m_szFilename.section('.',0,0);
undecoded.cutToFirst('_');
m_szName = undecoded.hexDecode(undecoded.ptr()).ptr();
undecoded = m_szFilename.section('.',1,1).section('_',0,0);
m_szNetwork = undecoded.hexDecode(undecoded.ptr()).ptr();
TQString szDate = m_szFilename.section('.',1,3).section('_',1,1);
int iYear = szDate.section('.',0,0).toInt();
int iMonth = szDate.section('.',1,1).toInt();
int iDay = szDate.section('.',2,2).toInt();
m_date.setYMD(iYear,iMonth,iDay);
//debug("type=%i, name=%s, net=%s, date=%i %i %i",m_type,m_szName.ascii(),m_szNetwork.ascii(),iYear,iMonth,iDay);
}
void KviLogFile::getText(TQString & text,const TQString& logDir){
TQString logName = logDir;
TQFile logFile;
logName.append(fileName());
#ifdef COMPILE_ZLIB_SUPPORT
if(m_bCompressed)
{
gzFile file=gzopen(logName.local8Bit().data(),"rb");
if(file)
{
char buff[1025];
int len;
KviTQCString data;
//TQCString data;
len=gzread(file,buff,1024);
while(len>0)
{
buff[len]=0;
data.append(buff);
len=gzread(file,buff,1024);
}
gzclose(file);
text = TQString::fromUtf8(data);
} else {
debug("Cannot open compressed file %s",logName.local8Bit().data());
}
} else {
#endif
logFile.setName(logName);
if(!logFile.open(IO_ReadOnly))
return;
TQByteArray bytes;
bytes=logFile.readAll();
text = TQString::fromUtf8(bytes.data(), bytes.size());
logFile.close();
#ifdef COMPILE_ZLIB_SUPPORT
}
#endif
}
#include "logviewmdiwindow.moc"