diff options
Diffstat (limited to 'korganizer/searchdialog.cpp')
-rw-r--r-- | korganizer/searchdialog.cpp | 261 |
1 files changed, 261 insertions, 0 deletions
diff --git a/korganizer/searchdialog.cpp b/korganizer/searchdialog.cpp new file mode 100644 index 000000000..082a6eacc --- /dev/null +++ b/korganizer/searchdialog.cpp @@ -0,0 +1,261 @@ +/* + This file is part of KOrganizer. + + Copyright (c) 1998 Preston Brown <pbrown@kde.org> + Copyright (c) 2000,2001 Cornelius Schumacher <schumacher@kde.org> + Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.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. + + As a special exception, permission is given to link this program + with any edition of Qt, and distribute the resulting executable, + without including the source code for Qt in the source distribution. +*/ + +#include <qlayout.h> +#include <qcheckbox.h> +#include <qgroupbox.h> +#include <qhbuttongroup.h> +#include <qlabel.h> +#include <qlineedit.h> + +#include <klocale.h> +#include <kmessagebox.h> + +#include <libkcal/calendar.h> + +#include <libkdepim/kdateedit.h> + +#include "koglobals.h" +#include "koprefs.h" +#include "kolistview.h" + +#include "searchdialog.h" +#include "searchdialog.moc" + +SearchDialog::SearchDialog(Calendar *calendar,QWidget *parent) + : KDialogBase(Plain,i18n("Find Events"),User1|Close,User1,parent,0,false,false, + KGuiItem( i18n("&Find"), "find") ) +{ + mCalendar = calendar; + + QFrame *topFrame = plainPage(); + QVBoxLayout *layout = new QVBoxLayout(topFrame,0,spacingHint()); + + // Search expression + QHBoxLayout *subLayout = new QHBoxLayout(); + layout->addLayout(subLayout); + + searchEdit = new QLineEdit( "*", topFrame ); // Find all events by default + searchLabel = new QLabel( searchEdit, i18n("&Search for:"), topFrame ); + subLayout->addWidget( searchLabel ); + subLayout->addWidget( searchEdit ); + searchEdit->setFocus(); + connect( searchEdit, SIGNAL( textChanged( const QString & ) ), + this, SLOT( searchTextChanged( const QString & ) ) ); + + + QHButtonGroup *itemsGroup = new QHButtonGroup( i18n("Search For"), topFrame ); + layout->addWidget( itemsGroup ); + mEventsCheck = new QCheckBox( i18n("&Events"), itemsGroup ); + mTodosCheck = new QCheckBox( i18n("To-&dos"), itemsGroup ); + mJournalsCheck = new QCheckBox( i18n("&Journal entries"), itemsGroup ); + mEventsCheck->setChecked( true ); + mTodosCheck->setChecked( true ); + + // Date range + QGroupBox *rangeGroup = new QGroupBox( 1, Horizontal, i18n( "Date Range" ), + topFrame ); + layout->addWidget( rangeGroup ); + + QWidget *rangeWidget = new QWidget( rangeGroup ); + QHBoxLayout *rangeLayout = new QHBoxLayout( rangeWidget, 0, spacingHint() ); + + mStartDate = new KDateEdit( rangeWidget ); + rangeLayout->addWidget( new QLabel( mStartDate, i18n("Fr&om:"), rangeWidget ) ); + rangeLayout->addWidget( mStartDate ); + + mEndDate = new KDateEdit( rangeWidget ); + rangeLayout->addWidget( new QLabel( mEndDate, i18n("&To:"), rangeWidget ) ); + mEndDate->setDate( QDate::currentDate().addDays( 365 ) ); + rangeLayout->addWidget( mEndDate ); + + mInclusiveCheck = new QCheckBox( i18n("E&vents have to be completely included"), + rangeGroup ); + mInclusiveCheck->setChecked( false ); + mIncludeUndatedTodos = new QCheckBox( i18n("Include to-dos &without due date"), rangeGroup ); + mIncludeUndatedTodos->setChecked( true ); + + // Subjects to search + QHButtonGroup *subjectGroup = new QHButtonGroup( i18n("Search In"), topFrame ); + layout->addWidget(subjectGroup); + + mSummaryCheck = new QCheckBox( i18n("Su&mmaries"), subjectGroup ); + mSummaryCheck->setChecked( true ); + mDescriptionCheck = new QCheckBox( i18n("Desc&riptions"), subjectGroup ); + mCategoryCheck = new QCheckBox( i18n("Cate&gories"), subjectGroup ); + + + // Results list view + listView = new KOListView( mCalendar, topFrame ); + listView->showDates(); + layout->addWidget( listView ); + + if ( KOPrefs::instance()->mCompactDialogs ) { + KOGlobals::fitDialogToScreen( this, true ); + } + + connect( this,SIGNAL(user1Clicked()),SLOT(doSearch())); + + // Propagate edit and delete event signals from event list view + connect( listView, SIGNAL( showIncidenceSignal( Incidence * ) ), + SIGNAL( showIncidenceSignal( Incidence *) ) ); + connect( listView, SIGNAL( editIncidenceSignal( Incidence * ) ), + SIGNAL( editIncidenceSignal( Incidence * ) ) ); + connect( listView, SIGNAL( deleteIncidenceSignal( Incidence * ) ), + SIGNAL( deleteIncidenceSignal( Incidence * ) ) ); +} + +SearchDialog::~SearchDialog() +{ +} + +void SearchDialog::searchTextChanged( const QString &_text ) +{ + enableButton( KDialogBase::User1, !_text.isEmpty() ); +} + +void SearchDialog::doSearch() +{ + QRegExp re; + + re.setWildcard( true ); // most people understand these better. + re.setCaseSensitive( false ); + re.setPattern( searchEdit->text() ); + if ( !re.isValid() ) { + KMessageBox::sorry( this, + i18n("Invalid search expression, cannot perform " + "the search. Please enter a search expression " + "using the wildcard characters '*' and '?' " + "where needed." ) ); + return; + } + + search( re ); + + listView->showIncidences( mMatchedEvents ); + + if ( mMatchedEvents.count() == 0 ) { + KMessageBox::information( this, + i18n("No events were found matching your search expression."), + "NoSearchResults" ); + } +} + +void SearchDialog::updateView() +{ + QRegExp re; + re.setWildcard( true ); // most people understand these better. + re.setCaseSensitive( false ); + re.setPattern( searchEdit->text() ); + if ( re.isValid() ) { + search( re ); + } else { + mMatchedEvents.clear(); + } + + listView->showIncidences( mMatchedEvents ); +} + +void SearchDialog::search( const QRegExp &re ) +{ + QDate startDt = mStartDate->date(); + QDate endDt = mEndDate->date(); + + Event::List events; + if (mEventsCheck->isChecked()) { + events = mCalendar->events( startDt, endDt, mInclusiveCheck->isChecked() ); + } + Todo::List todos; + if (mTodosCheck->isChecked()) { + if ( mIncludeUndatedTodos->isChecked() ) { + Todo::List alltodos = mCalendar->todos(); + Todo::List::iterator it; + Todo *todo; + for (it=alltodos.begin(); it!=alltodos.end(); ++it) { + todo = *it; + if ( (!todo->hasStartDate() && !todo->hasDueDate() ) || // undated + ( todo->hasStartDate() && (todo->dtStart()>=startDt) && (todo->dtStart()<=endDt) ) || // start dt in range + ( todo->hasDueDate() && (todo->dtDue().date()>=startDt) && (todo->dtDue()<=endDt) ) || // due dt in range + ( todo->hasCompletedDate() && (todo->completed().date()>=startDt) && (todo->completed()<=endDt) ) ) { // completed dt in range + todos.append( todo ); + } + } + } else { + QDate dt = startDt; + while ( dt <= endDt ) { + todos += mCalendar->todos( dt ); + dt = dt.addDays( 1 ); + } + } + } + + Journal::List journals; + if (mJournalsCheck->isChecked()) { + QDate dt = startDt; + while ( dt <= endDt ) { + journals += mCalendar->journals( dt ); + dt = dt.addDays( 1 ); + } + } + + Incidence::List allIncidences = Calendar::mergeIncidenceList( events, todos, journals ); + + mMatchedEvents.clear(); + Incidence::List::ConstIterator it; + for( it = allIncidences.begin(); it != allIncidences.end(); ++it ) { + Incidence *ev = *it; + if ( mSummaryCheck->isChecked() ) { +#if QT_VERSION >= 300 + if ( re.search( ev->summary() ) != -1 ) { +#else + if ( re.match( ev->summary() ) != -1 ) { +#endif + mMatchedEvents.append( ev ); + continue; + } + } + if ( mDescriptionCheck->isChecked() ) { +#if QT_VERSION >= 300 + if ( re.search( ev->description() ) != -1 ) { +#else + if ( re.match( ev->description() ) != -1 ) { +#endif + mMatchedEvents.append( ev ); + continue; + } + } + if ( mCategoryCheck->isChecked() ) { +#if QT_VERSION >= 300 + if ( re.search( ev->categoriesStr() ) != -1 ) { +#else + if ( re.match( ev->categoriesStr() ) != -1 ) { +#endif + mMatchedEvents.append( ev ); + continue; + } + } + } +} |