// // File : logviewmdiwindow.cpp // Creation date : Tue Apr 23 2002 18:08:22 by Juanjo �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 #else #include #endif #include "kvi_valuelist.h" #include "kvi_accel.h" #include #include #include #include "kvi_tal_listview.h" #include #include #include "kvi_tal_popupmenu.h" #include #include #include #ifdef COMPILE_ZLIB_SUPPORT #include #endif #include #include "kvi_styled_controls.h" #include #include #include 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 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("").tqarg(TQString(KVI_OPTION_COLOR(KviOption_colorCaptionTextActive).name()).ascii()); m_szHtmlActiveCaption.append(m_szPlainTextCaption); m_szHtmlActiveCaption.append(""); m_szHtmlInactiveCaption = TQString("").tqarg(TQString(KVI_OPTION_COLOR(KviOption_colorCaptionTextInactive).name()).ascii()); m_szHtmlInactiveCaption.append(m_szPlainTextCaption); m_szHtmlInactiveCaption.append(""); } 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()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"