00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
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 #include "kolistview.h"
00040
00041 #include "searchdialog.h"
00042 #include "searchdialog.moc"
00043
00044 SearchDialog::SearchDialog(Calendar *calendar,QWidget *parent)
00045 : KDialogBase(Plain,i18n("Find Events"),User1|Close,User1,parent,0,false,false,
00046 KGuiItem( i18n("&Find"), "find") )
00047 {
00048 mCalendar = calendar;
00049
00050 QFrame *topFrame = plainPage();
00051 QVBoxLayout *layout = new QVBoxLayout(topFrame,0,spacingHint());
00052
00053
00054 QHBoxLayout *subLayout = new QHBoxLayout();
00055 layout->addLayout(subLayout);
00056
00057 searchEdit = new QLineEdit( "*", topFrame );
00058 searchLabel = new QLabel( searchEdit, i18n("&Search for:"), topFrame );
00059 subLayout->addWidget( searchLabel );
00060 subLayout->addWidget( searchEdit );
00061 searchEdit->setFocus();
00062 connect( searchEdit, SIGNAL( textChanged( const QString & ) ),
00063 this, SLOT( searchTextChanged( const QString & ) ) );
00064
00065
00066 QHButtonGroup *itemsGroup = new QHButtonGroup( i18n("Search For"), topFrame );
00067 layout->addWidget( itemsGroup );
00068 mEventsCheck = new QCheckBox( i18n("&Events"), itemsGroup );
00069 mTodosCheck = new QCheckBox( i18n("To&dos"), itemsGroup );
00070 mJournalsCheck = new QCheckBox( i18n("&Journal entries"), itemsGroup );
00071 mEventsCheck->setChecked( true );
00072 mTodosCheck->setChecked( true );
00073
00074
00075 QGroupBox *rangeGroup = new QGroupBox( 1, Horizontal, i18n( "Date Range" ),
00076 topFrame );
00077 layout->addWidget( rangeGroup );
00078
00079 QWidget *rangeWidget = new QWidget( rangeGroup );
00080 QHBoxLayout *rangeLayout = new QHBoxLayout( rangeWidget, 0, spacingHint() );
00081
00082 mStartDate = new KDateEdit( rangeWidget );
00083 rangeLayout->addWidget( new QLabel( mStartDate, i18n("Fr&om:"), rangeWidget ) );
00084 rangeLayout->addWidget( mStartDate );
00085
00086 mEndDate = new KDateEdit( rangeWidget );
00087 rangeLayout->addWidget( new QLabel( mEndDate, i18n("&To:"), rangeWidget ) );
00088 mEndDate->setDate( QDate::currentDate().addDays( 365 ) );
00089 rangeLayout->addWidget( mEndDate );
00090
00091 mInclusiveCheck = new QCheckBox( i18n("E&vents have to be completely included"),
00092 rangeGroup );
00093 mInclusiveCheck->setChecked( false );
00094 mIncludeUndatedTodos = new QCheckBox( i18n("Include todos &without due date"), rangeGroup );
00095 mIncludeUndatedTodos->setChecked( true );
00096
00097
00098 QHButtonGroup *subjectGroup = new QHButtonGroup( i18n("Search In"), topFrame );
00099 layout->addWidget(subjectGroup);
00100
00101 mSummaryCheck = new QCheckBox( i18n("Su&mmaries"), subjectGroup );
00102 mSummaryCheck->setChecked( true );
00103 mDescriptionCheck = new QCheckBox( i18n("Desc&riptions"), subjectGroup );
00104 mCategoryCheck = new QCheckBox( i18n("Cate&gories"), subjectGroup );
00105
00106
00107
00108 listView = new KOListView( mCalendar, topFrame );
00109 listView->showDates();
00110 layout->addWidget( listView );
00111
00112 if ( KOPrefs::instance()->mCompactDialogs ) {
00113 KOGlobals::fitDialogToScreen( this, true );
00114 }
00115
00116 connect( this,SIGNAL(user1Clicked()),SLOT(doSearch()));
00117
00118
00119 connect( listView, SIGNAL( showIncidenceSignal( Incidence * ) ),
00120 SIGNAL( showIncidenceSignal( Incidence *) ) );
00121 connect( listView, SIGNAL( editIncidenceSignal( Incidence * ) ),
00122 SIGNAL( editIncidenceSignal( Incidence * ) ) );
00123 connect( listView, SIGNAL( deleteIncidenceSignal( Incidence * ) ),
00124 SIGNAL( deleteIncidenceSignal( Incidence * ) ) );
00125 }
00126
00127 SearchDialog::~SearchDialog()
00128 {
00129 }
00130
00131 void SearchDialog::searchTextChanged( const QString &_text )
00132 {
00133 enableButton( KDialogBase::User1, !_text.isEmpty() );
00134 }
00135
00136 void SearchDialog::doSearch()
00137 {
00138 QRegExp re;
00139
00140 re.setWildcard( true );
00141 re.setCaseSensitive( false );
00142 re.setPattern( searchEdit->text() );
00143 if ( !re.isValid() ) {
00144 KMessageBox::sorry( this,
00145 i18n("Invalid search expression, cannot perform "
00146 "the search. Please enter a search expression "
00147 "using the wildcard characters '*' and '?' "
00148 "where needed." ) );
00149 return;
00150 }
00151
00152 search( re );
00153
00154 listView->showIncidences( mMatchedEvents );
00155
00156 if ( mMatchedEvents.count() == 0 ) {
00157 KMessageBox::information( this,
00158 i18n("No events were found matching your search expression.") );
00159 }
00160 }
00161
00162 void SearchDialog::updateView()
00163 {
00164 QRegExp re;
00165 re.setWildcard( true );
00166 re.setCaseSensitive( false );
00167 re.setPattern( searchEdit->text() );
00168 if ( re.isValid() ) {
00169 search( re );
00170 } else {
00171 mMatchedEvents.clear();
00172 }
00173
00174 listView->showIncidences( mMatchedEvents );
00175 }
00176
00177 void SearchDialog::search( const QRegExp &re )
00178 {
00179 QDate startDt = mStartDate->date();
00180 QDate endDt = mEndDate->date();
00181
00182 Event::List events;
00183 if (mEventsCheck->isChecked()) {
00184 events = mCalendar->events( startDt, endDt, mInclusiveCheck->isChecked() );
00185 }
00186 Todo::List todos;
00187 if (mTodosCheck->isChecked()) {
00188 if ( mIncludeUndatedTodos->isChecked() ) {
00189 Todo::List alltodos = mCalendar->todos();
00190 Todo::List::iterator it;
00191 Todo *todo;
00192 for (it=alltodos.begin(); it!=alltodos.end(); ++it) {
00193 todo = *it;
00194 if ( (!todo->hasStartDate() && !todo->hasDueDate() ) ||
00195 ( todo->hasStartDate() && (todo->dtStart()>=startDt) && (todo->dtStart()<=endDt) ) ||
00196 ( todo->hasDueDate() && (todo->dtDue().date()>=startDt) && (todo->dtDue()<=endDt) ) ||
00197 ( todo->hasCompletedDate() && (todo->completed().date()>=startDt) && (todo->completed()<=endDt) ) ) {
00198 todos.append( todo );
00199 }
00200 }
00201 } else {
00202 QDate dt = startDt;
00203 while ( dt <= endDt ) {
00204 todos += mCalendar->todos( dt );
00205 dt = dt.addDays( 1 );
00206 }
00207 }
00208 }
00209
00210 Journal::List journals;
00211 if (mJournalsCheck->isChecked()) {
00212 QDate dt = startDt;
00213 while ( dt <= endDt ) {
00214 Journal* j=mCalendar->journal( dt );
00215 if (j) journals.append( j );
00216 dt = dt.addDays( 1 );
00217 }
00218 }
00219
00220 Incidence::List allIncidences = Calendar::mergeIncidenceList( events, todos, journals );
00221
00222 mMatchedEvents.clear();
00223 Incidence::List::ConstIterator it;
00224 for( it = allIncidences.begin(); it != allIncidences.end(); ++it ) {
00225 Incidence *ev = *it;
00226 if ( mSummaryCheck->isChecked() ) {
00227 #if QT_VERSION >= 300
00228 if ( re.search( ev->summary() ) != -1 ) {
00229 #else
00230 if ( re.match( ev->summary() ) != -1 ) {
00231 #endif
00232 mMatchedEvents.append( ev );
00233 continue;
00234 }
00235 }
00236 if ( mDescriptionCheck->isChecked() ) {
00237 #if QT_VERSION >= 300
00238 if ( re.search( ev->description() ) != -1 ) {
00239 #else
00240 if ( re.match( ev->description() ) != -1 ) {
00241 #endif
00242 mMatchedEvents.append( ev );
00243 continue;
00244 }
00245 }
00246 if ( mCategoryCheck->isChecked() ) {
00247 #if QT_VERSION >= 300
00248 if ( re.search( ev->categoriesStr() ) != -1 ) {
00249 #else
00250 if ( re.match( ev->categoriesStr() ) != -1 ) {
00251 #endif
00252 mMatchedEvents.append( ev );
00253 continue;
00254 }
00255 }
00256 }
00257 }