/*************************************************************************** * Copyright (C) 2005 by Nicolas Ternisien * * nicolas.ternisien@gmail.com * * * * 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. * * * * 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. * ***************************************************************************/ //TQt includes #include #include #include #include #include #include #include #include #include //KDE includes #include #include #include #include #include #include #include #include //For compatibility with old versions of KDE #include //Project includes #include "view.h" #include "logListItem.h" #include "logLine.h" #include "viewToolTip.h" #include "ksystemlogConfig.h" #include "ksystemlog.h" View::View(TQWidget *parent) : DCOPObject("KSystemLogInterface"), TQWidget(parent), logManager(NULL), table(NULL), columns(NULL), firstLoad(true) { // setup our layout manager to automatically add our widgets TQVBoxLayout* topLayout = new TQVBoxLayout(this); topLayout->setAutoAdd(true); #if defined(TDE_MAKE_VERSION) && TDE_VERSION >= TDE_MAKE_VERSION(3,3,0) filterBar=new TQHBox(this); filterBar->setSpacing(5); filterBar->setSizePolicy( TQSizePolicy( TQSizePolicy::Minimum, TQSizePolicy::Fixed ) ); clearSearch=new TDEToolBarButton( TQApplication::reverseLayout() ? "clear_left" : "locationbar_erase", 0, filterBar); clearSearch->setText(i18n("Clear the filter")); TQWhatsThis::add(clearSearch, i18n("This button clears the filter in one click.")); TQToolTip::add(clearSearch, i18n("Clear the filter")); TQLabel* label=new TQLabel(i18n("Filter:"), filterBar); search=new LogLineFilter(filterBar, (TDEListView*)NULL); label->setBuddy(search); TQWhatsThis::add(search, i18n("Allows you to select only list items that match the content of this text.")); TQToolTip::add(search, i18n("Type your item filter here")); label=new TQLabel(i18n("Column:"), filterBar); this->initSearchFilter(filterBar); label->setBuddy(searchFilter); toggleFilterBar(); #endif this->initLogList(); #if defined(TDE_MAKE_VERSION) && TDE_VERSION >= TDE_MAKE_VERSION(3,3,0) //We initialize the table after, after the initialization of the table search->setListView(table); //Connect the pressed signal of the clear button to the clear slot of "clear" connect(clearSearch, TQT_SIGNAL(pressed()), search, TQT_SLOT(clear())); #endif } View::~View() { #if defined(TDE_MAKE_VERSION) && (TDE_VERSION >= TDE_MAKE_VERSION(3,3,0)) delete clearSearch; delete search; delete searchFilter; delete filterBar; #endif kdDebug() << "Destroying View" << endl; } void View::saveConfig() { kdDebug() << "Saving View Layout..." << endl; KSystemLogConfig* configXT=KSystemLogConfig::self(); TDEConfig* config=configXT->config(); TQString group="List"; group.append(logManager->getIndex()); table->saveLayout(config, group); } void View::setLogManager(LogManager* manager) { logManager=manager; } //TODO Deprecate this method as soon as possible void View::openURL(TQString url) { kdDebug() << "DCOP Interface : " << url << endl; } bool View::isTooltipEnabled() { return(logManager->isTooltipEnabled()); } void View::toggleFilterBar() { #if defined(TDE_MAKE_VERSION) && TDE_VERSION >= TDE_MAKE_VERSION(3,3,0) //The newly created bar is only displayed if the config file allow it if (KSystemLogConfig::toggleFilterBar()==true) filterBar->show(); else filterBar->hide(); #endif } /** * Delete the "count" first items */ void View::deleteOldItems(int count) { TQListViewItem* item; for(int i=0; ilastItem(); table->takeItem(item); } } int View::getItemCount() { int count=0; if (logManager->getGroupBy()==NO_GROUP_BY) { count=table->childCount(); } else { TQPtrList lst; TQListViewItemIterator it(table); while (it.current()!=NULL) { count+=it.current()->childCount(); ++it; } } return(count); } void View::setColumns(LogViewColumns* list) { kdDebug() << "Change columns" << endl; columns=list; updateList(); //TODO Maybe with the deleting of the config group, this boolean is useless if (firstLoad==true) { KSystemLogConfig* configXT=KSystemLogConfig::self(); TQString group="List"; group.append(logManager->getIndex()); //We first restore the layout from the config table->restoreLayout(configXT->config(), group); //Then we delete it from config, to avoid reloading problem configXT->config()->deleteGroup(group); firstLoad=false; } updateSearchFilter(); } void View::setFirstItemVisible() { table->ensureItemVisible(table->firstChild()); } void View::setLastItemVisible() { table->ensureItemVisible(table->lastItem()); } void View::setFirstItemSelected() { table->setCurrentItem(table->firstChild()); table->setSelected(table->firstChild(), true); table->ensureItemVisible(table->firstChild()); } void View::setLastItemSelected() { table->setCurrentItem(table->lastItem()); table->setSelected(table->lastItem(), true); table->ensureItemVisible(table->lastItem()); } void View::updateSearchFilter() { #if defined(TDE_MAKE_VERSION) && TDE_VERSION >= TDE_MAKE_VERSION(3,3,0) //We first delete all items int count=searchFilter->count() - 1; while (count>=0) { searchFilter->removeItem(count); count--; } //Then we insert the default items searchFilter->insertItem(i18n("All")); LogViewColumns::Iterator it = columns->begin(); LogViewColumn* column; while(it!=columns->end()) { column=*it; if (column->isFiltred==true) searchFilter->insertItem(column->columnName); it++; } searchFilter->setCurrentItem(0); #endif } void View::updateList() { //First, delete all current columns int count=table->columns() - 1; while (count>=0) { table->removeColumn(count); count--; } LogViewColumns::Iterator it = columns->begin(); LogViewColumn* column; //Add all columns of the columns list object while(it!=columns->end()) { column=*it; table->addColumn(column->columnName, -1); it++; } //Adjust them to the size of the current maximum item int i=0; while (icolumns()) { table->adjustColumn(i); i++; } //TODO Try to reduce size of first column with a } void View::initLogList() { table=new TDEListView(this, "log_list"); TQWhatsThis::add(table, i18n("

This is the main view of KSystemLog. It displays the last lines of the selected log. Please see the documentation to discovers the meaning of each icons and existing log.

Log lines in bold are the last added to the list.

")); table->addColumn("Message"); table->setSorting(0, true); //table->setRootIsDecorated(true); table->setShowSortIndicator(true); table->setAllColumnsShowFocus(true); //This method is not implemented for the moment by TDEListView class table->setAutoOpen(false); //This is buggy but it's not my fault (I hope :-) table->setFullWidth(true); //TODO Find a color from TQColorGroup TQColor* alternate=new TQColor(246,246,255); table->setAlternateBackground(*alternate); table->setSelectionModeExt(TDEListView::Extended); toolTip=new ViewToolTip(this->getLogList()->viewport(), this); } LogListItem* View::getFirstSelectedItem() { TQListViewItemIterator it(table, TQListViewItemIterator::Selected); //Returns the first selected item or NULL is there is no item selected return(static_cast (it.current())); } LogListItem* View::getLastSelectedItem() { TQListViewItemIterator it(table, TQListViewItemIterator::Selected); TQListViewItem* item=NULL; while (it.current()) { item=it.current(); it++; } //Returns the last selected item or NULL is there is no item selected return(static_cast (item)); } void View::setSortEnabled(bool enabled) { if (enabled==true) table->setSorting(table->columns()+1); else table->setSorting(-1); } void View::initSearchFilter(TQWidget* filterBox) { #if defined(TDE_MAKE_VERSION) && TDE_VERSION >= TDE_MAKE_VERSION(3,3,0) searchFilter=new TQComboBox(filterBox); TQWhatsThis::add(searchFilter, i18n("Allows you to apply the item filter only on the specified column here. \"All\" column means no specific filter.")); TQToolTip::add(searchFilter, i18n("Choose the filtered column here")); searchFilter->insertItem(i18n("All")); //TODO 0 is not a very good value... Improve that. and of course, try to find a better solution searchFilter->setMinimumSize(70, 0); connect(searchFilter, TQT_SIGNAL(activated(int)), search, TQT_SLOT(setFocus())); connect(searchFilter, TQT_SIGNAL(activated(int)), this, TQT_SLOT(changeColumnFilter(int))); connect(searchFilter, TQT_SIGNAL(activated(int)), search, TQT_SLOT(updateSearch())); #endif } void View::addElement(TQStringList* entries, TQPixmap* icon) { TQStringList::Iterator it = entries->begin(); TDEListViewItem* item=new TDEListViewItem(table, *(it++), *(it++), *(it++), *(it++), *(it++)); if (icon!=NULL) item->setPixmap(0, *icon); } void View::addElementAtEnd(TQStringList* entries, TQPixmap* icon) { TQStringList::Iterator it = entries->begin(); TDEListViewItem* item=new TDEListViewItem(table, table->lastItem(), *(it++), *(it++), *(it++), *(it++), *(it++)); if (icon!=NULL) item->setPixmap(0, *icon); } TDEListView* View::getLogList() { return(table); } void View::changeColumnFilter(int column) { #if defined(TDE_MAKE_VERSION) && TDE_VERSION >= TDE_MAKE_VERSION(3,3,0) TQValueList filterColumns; //The user select all columns if (column==0) { search->setSearchColumns(filterColumns); } else { TQString columnName=searchFilter->currentText(); LogViewColumns::Iterator it; LogViewColumn* column; int position=0; for(it=columns->begin(); it!=columns->end(); it++) { column=*it; if (column->columnName==columnName) break; position++; } filterColumns.append(position); search->setSearchColumns(filterColumns); } //search->updateSearch(); #endif } void View::print(TQPainter* /*p*/, int /*height*/, int /*width*/) { //Print log files here } void View::slotOnURL(const TQString& url) { emit changeStatusbar(url); } void View::slotSetTitle(const TQString& title) { emit changeCaption(title); } void View::clearLogList( ) { table->clear(); } #include "view.moc"