korganizer Library API Documentation

searchdialog.cpp

00001 /* 00002 This file is part of KOrganizer. 00003 Copyright (c) 1998 Preston Brown 00004 Copyright (c) 2000,2001 Cornelius Schumacher <schumacher@kde.org> 00005 00006 This program is free software; you can redistribute it and/or modify 00007 it under the terms of the GNU General Public License as published by 00008 the Free Software Foundation; either version 2 of the License, or 00009 (at your option) any later version. 00010 00011 This program is distributed in the hope that it will be useful, 00012 but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 GNU General Public License for more details. 00015 00016 You should have received a copy of the GNU General Public License 00017 along with this program; if not, write to the Free Software 00018 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 00019 00020 As a special exception, permission is given to link this program 00021 with any edition of Qt, and distribute the resulting executable, 00022 without including the source code for Qt in the source distribution. 00023 */ 00024 00025 #include <qlayout.h> 00026 #include <qcheckbox.h> 00027 #include <qgroupbox.h> 00028 #include <qhbuttongroup.h> 00029 #include <qlabel.h> 00030 #include <qlineedit.h> 00031 00032 #include <klocale.h> 00033 #include <kmessagebox.h> 00034 00035 #include <libkdepim/kdateedit.h> 00036 00037 #include "koglobals.h" 00038 #include "koprefs.h" 00039 00040 #include "searchdialog.h" 00041 #include "searchdialog.moc" 00042 00043 SearchDialog::SearchDialog(Calendar *calendar,QWidget *parent) 00044 : KDialogBase(Plain,i18n("Find Events"),User1|Close,User1,parent,0,false,false, 00045 KGuiItem( i18n("&Find"), "find")) 00046 { 00047 mCalendar = calendar; 00048 00049 QFrame *topFrame = plainPage(); 00050 QVBoxLayout *layout = new QVBoxLayout(topFrame,0,spacingHint()); 00051 00052 // Search expression 00053 QHBoxLayout *subLayout = new QHBoxLayout(); 00054 layout->addLayout(subLayout); 00055 00056 searchEdit = new QLineEdit( "*", topFrame ); // Find all events by default 00057 searchLabel = new QLabel( searchEdit, i18n("&Search for:"), topFrame ); 00058 subLayout->addWidget( searchLabel ); 00059 subLayout->addWidget( searchEdit ); 00060 searchEdit->setFocus(); 00061 connect( searchEdit, SIGNAL( textChanged( const QString & ) ), 00062 this, SLOT( searchTextChanged( const QString & ) ) ); 00063 00064 00065 QHButtonGroup *itemsGroup = new QHButtonGroup( i18n("Search For"), topFrame ); 00066 layout->addWidget( itemsGroup ); 00067 mEventsCheck = new QCheckBox( i18n("&Events"), itemsGroup ); 00068 mTodosCheck = new QCheckBox( i18n("To&dos"), itemsGroup ); 00069 mJournalsCheck = new QCheckBox( i18n("&Journal entries"), itemsGroup ); 00070 mEventsCheck->setChecked( true ); 00071 mTodosCheck->setChecked( true ); 00072 00073 // Date range 00074 QGroupBox *rangeGroup = new QGroupBox( 1, Horizontal, i18n( "Date Range" ), 00075 topFrame ); 00076 layout->addWidget( rangeGroup ); 00077 00078 QWidget *rangeWidget = new QWidget( rangeGroup ); 00079 QHBoxLayout *rangeLayout = new QHBoxLayout( rangeWidget, 0, spacingHint() ); 00080 00081 mStartDate = new KDateEdit( rangeWidget ); 00082 rangeLayout->addWidget( new QLabel( mStartDate, i18n("&From:"), rangeWidget ) ); 00083 rangeLayout->addWidget( mStartDate ); 00084 00085 mEndDate = new KDateEdit( rangeWidget ); 00086 rangeLayout->addWidget( new QLabel( mEndDate, i18n("&To:"), rangeWidget ) ); 00087 mEndDate->setDate( QDate::currentDate().addDays( 365 ) ); 00088 rangeLayout->addWidget( mEndDate ); 00089 00090 mInclusiveCheck = new QCheckBox( i18n("Events have to be &completely included"), 00091 rangeGroup ); 00092 mInclusiveCheck->setChecked( false ); 00093 mIncludeUndatedTodos = new QCheckBox( i18n("Include todos &without due date"), rangeGroup ); 00094 mIncludeUndatedTodos->setChecked( true ); 00095 00096 // Subjects to search 00097 QHButtonGroup *subjectGroup = new QHButtonGroup( i18n("Search In"), topFrame ); 00098 layout->addWidget(subjectGroup); 00099 00100 mSummaryCheck = new QCheckBox( i18n("Su&mmaries"), subjectGroup ); 00101 mSummaryCheck->setChecked( true ); 00102 mDescriptionCheck = new QCheckBox( i18n("Desc&riptions"), subjectGroup ); 00103 mCategoryCheck = new QCheckBox( i18n("Cate&gories"), subjectGroup ); 00104 00105 00106 // Results list view 00107 listView = new KOListView( mCalendar, topFrame ); 00108 listView->showDates(); 00109 layout->addWidget( listView ); 00110 00111 if ( KOPrefs::instance()->mCompactDialogs ) { 00112 KOGlobals::fitDialogToScreen( this, true ); 00113 } 00114 00115 connect( this,SIGNAL(user1Clicked()),SLOT(doSearch())); 00116 00117 // Propagate edit and delete event signals from event list view 00118 connect( listView, SIGNAL( showIncidenceSignal( Incidence * ) ), 00119 SIGNAL( showIncidenceSignal( Incidence *) ) ); 00120 connect( listView, SIGNAL( editIncidenceSignal( Incidence * ) ), 00121 SIGNAL( editIncidenceSignal( Incidence * ) ) ); 00122 connect( listView, SIGNAL( deleteIncidenceSignal( Incidence * ) ), 00123 SIGNAL( deleteIncidenceSignal( Incidence * ) ) ); 00124 } 00125 00126 SearchDialog::~SearchDialog() 00127 { 00128 } 00129 00130 void SearchDialog::searchTextChanged( const QString &_text ) 00131 { 00132 enableButton( KDialogBase::User1, !_text.isEmpty() ); 00133 } 00134 00135 void SearchDialog::doSearch() 00136 { 00137 QRegExp re; 00138 00139 re.setWildcard( true ); // most people understand these better. 00140 re.setCaseSensitive( false ); 00141 re.setPattern( searchEdit->text() ); 00142 if ( !re.isValid() ) { 00143 KMessageBox::sorry( this, 00144 i18n("Invalid search expression, cannot perform " 00145 "the search. Please enter a search expression " 00146 "using the wildcard characters '*' and '?' " 00147 "where needed." ) ); 00148 return; 00149 } 00150 00151 search( re ); 00152 00153 listView->showIncidences( mMatchedEvents ); 00154 00155 if ( mMatchedEvents.count() == 0 ) { 00156 KMessageBox::information( this, 00157 i18n("No events were found matching your search expression.") ); 00158 } 00159 } 00160 00161 void SearchDialog::updateView() 00162 { 00163 QRegExp re; 00164 re.setWildcard( true ); // most people understand these better. 00165 re.setCaseSensitive( false ); 00166 re.setPattern( searchEdit->text() ); 00167 if ( re.isValid() ) { 00168 search( re ); 00169 } else { 00170 mMatchedEvents.clear(); 00171 } 00172 00173 listView->showIncidences( mMatchedEvents ); 00174 } 00175 00176 void SearchDialog::search( const QRegExp &re ) 00177 { 00178 QDate startDt = mStartDate->date(); 00179 QDate endDt = mEndDate->date(); 00180 00181 Event::List events = mCalendar->events( startDt, endDt, 00182 mInclusiveCheck->isChecked() ); 00183 Todo::List todos; 00184 if ( mIncludeUndatedTodos ) 00185 todos = mCalendar->todos(); 00186 else { 00187 QDate dt = startDt; 00188 while ( dt <= endDt ) { 00189 todos += mCalendar->todos( dt ); 00190 dt = dt.addDays( 1 ); 00191 } 00192 } 00193 00194 Journal::List journals; 00195 QDate dt = startDt; 00196 while ( dt <= endDt ) { 00197 Journal* j=mCalendar->journal( dt ); 00198 if (j) journals.append( j ); 00199 dt = dt.addDays( 1 ); 00200 } 00201 00202 Incidence::List allIncidences = Calendar::mergeIncidenceList( events, todos, journals ); 00203 00204 mMatchedEvents.clear(); 00205 Incidence::List::ConstIterator it; 00206 for( it = allIncidences.begin(); it != allIncidences.end(); ++it ) { 00207 Incidence *ev = *it; 00208 if ( mSummaryCheck->isChecked() ) { 00209 #if QT_VERSION >= 300 00210 if ( re.search( ev->summary() ) != -1 ) { 00211 #else 00212 if ( re.match( ev->summary() ) != -1 ) { 00213 #endif 00214 mMatchedEvents.append( ev ); 00215 continue; 00216 } 00217 } 00218 if ( mDescriptionCheck->isChecked() ) { 00219 #if QT_VERSION >= 300 00220 if ( re.search( ev->description() ) != -1 ) { 00221 #else 00222 if ( re.match( ev->description() ) != -1 ) { 00223 #endif 00224 mMatchedEvents.append( ev ); 00225 continue; 00226 } 00227 } 00228 if ( mCategoryCheck->isChecked() ) { 00229 #if QT_VERSION >= 300 00230 if ( re.search( ev->categoriesStr() ) != -1 ) { 00231 #else 00232 if ( re.match( ev->categoriesStr() ) != -1 ) { 00233 #endif 00234 mMatchedEvents.append( ev ); 00235 continue; 00236 } 00237 } 00238 } 00239 }
KDE Logo
This file is part of the documentation for korganizer Library Version 3.2.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Jul 28 23:58:14 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003