korganizer

filtereditdialog.cpp
1/*
2 This file is part of KOrganizer.
3
4 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
5 Copyright (C) 2004 Reinhold Kainhofer <reinhold@kainhofer.com>
6 Copyright (C) 2005 Thomas Zander <zander@kde.org>
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21
22 As a special exception, permission is given to link this program
23 with any edition of TQt, and distribute the resulting executable,
24 without including the source code for TQt in the source distribution.
25*/
26
27#include <tqpushbutton.h>
28#include <tqcheckbox.h>
29#include <tqbuttongroup.h>
30#include <tqlineedit.h>
31#include <tqradiobutton.h>
32#include <tqlistbox.h>
33#include <tqwhatsthis.h>
34
35#include <kdebug.h>
36#include <tdelocale.h>
37#include <tdemessagebox.h>
38#include <knuminput.h>
39
40#include <libkcal/calfilter.h>
41#include <libtdepim/categoryselectdialog.h>
42
43#include "koprefs.h"
44#include "filteredit_base.h"
45
46#include "filtereditdialog.h"
47#include "filtereditdialog.moc"
48
49FilterEditDialog::FilterEditDialog( TQPtrList<CalFilter> *filters,
50 TQWidget *parent, const char *name)
51 : KDialogBase( parent, name, false, i18n("Edit Calendar Filters"),
52 Ok | Apply | Cancel )
53{
54 setMainWidget( mFilterEdit = new FilterEdit(filters, this));
55
56 connect(mFilterEdit, TQ_SIGNAL(dataConsistent(bool)),
57 TQ_SLOT(setDialogConsistent(bool)));
58 updateFilterList();
59 connect( mFilterEdit, TQ_SIGNAL( editCategories() ), TQ_SIGNAL( editCategories() ) );
60 connect( mFilterEdit, TQ_SIGNAL( filterChanged() ), TQ_SIGNAL( filterChanged() ) );
61}
62
63FilterEditDialog::~FilterEditDialog()
64{
65 delete mFilterEdit;
66 mFilterEdit = 0L;
67}
68
69void FilterEditDialog::updateFilterList()
70{
71 mFilterEdit->updateFilterList();
72}
73
74void FilterEditDialog::updateCategoryConfig()
75{
76 mFilterEdit->updateCategoryConfig();
77}
78
79void FilterEditDialog::slotApply()
80{
81 mFilterEdit->saveChanges();
82}
83
84void FilterEditDialog::slotOk()
85{
86 slotApply();
87 accept();
88}
89
90void FilterEditDialog::setDialogConsistent(bool consistent) {
91 enableButtonOK( consistent );
92 enableButtonApply( consistent );
93}
94
95FilterEdit::FilterEdit(TQPtrList<CalFilter> *filters, TQWidget *parent)
96 : FilterEdit_base( parent), current(0), mCategorySelectDialog( 0 )
97{
98 mFilters = filters;
99 TQWhatsThis::add( mNewButton, i18n( "Press this button to define a new filter." ) );
100 TQWhatsThis::add( mDeleteButton, i18n( "Press this button to remove the currently active filter." ) );
101
102 connect( mRulesList, TQ_SIGNAL(selectionChanged()), this, TQ_SLOT(filterSelected()) );
103 connect( mNewButton, TQ_SIGNAL( clicked() ), TQ_SLOT( bNewPressed() ) );
104 connect( mDeleteButton, TQ_SIGNAL( clicked() ), TQ_SLOT( bDeletePressed() ) );
105 connect( mNameLineEdit, TQ_SIGNAL( textChanged(const TQString &) ), TQ_SLOT( updateSelectedName(const TQString &) ) );
106 connect( mCatEditButton, TQ_SIGNAL( clicked() ), TQ_SLOT( editCategorySelection() ) );
107}
108
109FilterEdit::~FilterEdit() {
110}
111
112
113void FilterEdit::updateFilterList()
114{
115 mRulesList->clear();
116
117 CalFilter *filter = mFilters->first();
118
119 if ( !filter )
120 emit(dataConsistent(false));
121 else {
122 while( filter ) {
123 mRulesList->insertItem( filter->name() );
124 filter = mFilters->next();
125 }
126
127 CalFilter *f = mFilters->at( mRulesList->currentItem() );
128 if ( f ) filterSelected( f );
129
130 emit(dataConsistent(true));
131 }
132
133 if(current == 0L && mFilters->count() > 0)
134 filterSelected(mFilters->at(0));
135 mDeleteButton->setEnabled( mFilters->count() > 1 );
136}
137
138void FilterEdit::saveChanges()
139{
140 if(current == 0L)
141 return;
142
143 current->setName(mNameLineEdit->text());
144 int criteria = 0;
145 if ( mCompletedCheck->isChecked() ) criteria |= CalFilter::HideCompleted;
146 if ( mRecurringCheck->isChecked() ) criteria |= CalFilter::HideRecurring;
147 if ( mCatShowCheck->isChecked() ) criteria |= CalFilter::ShowCategories;
148 if ( mHideInactiveTodosCheck->isChecked() ) criteria |= CalFilter::HideInactiveTodos;
149 if ( mHideTodosNotAssignedToMeCheck->isChecked() )
150 criteria |= CalFilter::HideTodosWithoutAttendeeInEmailList;
151 current->setCriteria( criteria );
152 current->setCompletedTimeSpan( mCompletedTimeSpan->value() );
153
154 TQStringList categoryList;
155 for( uint i = 0; i < mCatList->count(); ++i )
156 categoryList.append( mCatList->text( i ) );
157 current->setCategoryList( categoryList );
158 emit filterChanged();
159}
160
161void FilterEdit::filterSelected()
162{
163 filterSelected(mFilters->at(mRulesList->currentItem()));
164}
165
166void FilterEdit::filterSelected(CalFilter *filter)
167{
168 if(filter == current) return;
169 kdDebug(5850) << "Selected filter " << (filter!=0?filter->name():"") << endl;
170 saveChanges();
171
172 current = filter;
173 mNameLineEdit->blockSignals(true);
174 mNameLineEdit->setText(current->name());
175 mNameLineEdit->blockSignals(false);
176 mDetailsFrame->setEnabled(current != 0L);
177 mCompletedCheck->setChecked( current->criteria() & CalFilter::HideCompleted );
178 mCompletedTimeSpan->setValue( current->completedTimeSpan() );
179 mRecurringCheck->setChecked( current->criteria() & CalFilter::HideRecurring );
180 mHideInactiveTodosCheck->setChecked( current->criteria() & CalFilter::HideInactiveTodos );
181 mHideTodosNotAssignedToMeCheck->setChecked(
182 current->criteria() & CalFilter::HideTodosWithoutAttendeeInEmailList );
183 mCategoriesButtonGroup->setButton( (current->criteria() & CalFilter::ShowCategories)?0:1 );
184 mCatList->clear();
185 mCatList->insertStringList( current->categoryList() );
186}
187
188void FilterEdit::bNewPressed() {
189 CalFilter *newFilter = new CalFilter( i18n("New Filter %1").arg(mFilters->count()) );
190 mFilters->append( newFilter );
191 updateFilterList();
192 mRulesList->setSelected(mRulesList->count()-1, true);
193 emit filterChanged();
194}
195
196void FilterEdit::bDeletePressed() {
197 if ( mRulesList->currentItem() < 0 ) return; // nothing selected
198 if ( mFilters->count() <= 1 ) return; // We need at least a default filter object.
199
200 int result = KMessageBox::warningContinueCancel( this,
201 i18n("This item will be permanently deleted."), i18n("Delete Confirmation"), KGuiItem(i18n("Delete"),"edit-delete") );
202
203 if ( result != KMessageBox::Continue )
204 return;
205
206 unsigned int selected = mRulesList->currentItem();
207 mFilters->remove( selected );
208 current = 0L;
209 updateFilterList();
210 mRulesList->setSelected(TQMIN(mRulesList->count()-1, selected), true);
211 emit filterChanged();
212}
213
214void FilterEdit::updateSelectedName(const TQString &newText) {
215 mRulesList->blockSignals( true );
216 mRulesList->changeItem(newText, mRulesList->currentItem());
217 mRulesList->blockSignals( false );
218 bool allOk = true;
219 CalFilter *filter = mFilters->first();
220 while( allOk && filter ) {
221 if(filter->name().isEmpty())
222 allOk = false;
223 filter = mFilters->next();
224 }
225 emit dataConsistent(allOk);
226}
227
228void FilterEdit::editCategorySelection()
229{
230 if( !current ) return;
231 if ( !mCategorySelectDialog ) {
232 mCategorySelectDialog = new KPIM::CategorySelectDialog( KOPrefs::instance(), this, "filterCatSelect" );
233 connect( mCategorySelectDialog,
234 TQ_SIGNAL( categoriesSelected( const TQStringList & ) ),
235 TQ_SLOT( updateCategorySelection( const TQStringList & ) ) );
236 connect( mCategorySelectDialog, TQ_SIGNAL( editCategories() ),
237 TQ_SIGNAL( editCategories() ) );
238
239 }
240 mCategorySelectDialog->setSelected( current->categoryList() );
241
242 mCategorySelectDialog->show();
243}
244
245void FilterEdit::updateCategorySelection( const TQStringList &categories )
246{
247 mCatList->clear();
248 mCatList->insertStringList(categories);
249 current->setCategoryList(categories);
250}
251
252void FilterEdit::updateCategoryConfig()
253{
254 if ( mCategorySelectDialog ) mCategorySelectDialog->updateCategoryConfig();
255}
TQString name() const
void setEnabled(bool)