23 #include "distributionlisteditor.h"
24 #include "distributionlisteditor_p.h"
26 #include <libtdepim/addresseelineedit.h>
27 #include <libtdepim/distributionlist.h>
28 #include <libemailfunctions/email.h>
30 #include <tdeabc/addressbook.h>
31 #include <tdeabc/resource.h>
33 #include <tdeapplication.h>
34 #include <kdialogbase.h>
35 #include <tdeglobal.h>
36 #include <kiconloader.h>
37 #include <klineedit.h>
38 #include <tdelocale.h>
39 #include <tdemessagebox.h>
43 #include <tqsignalmapper.h>
44 #include <tqtoolbutton.h>
45 #include <tqguardedptr.h>
47 class KPIM::DistributionListEditor::EditorWidgetPrivate
50 TQScrollView* scrollView;
51 TQSignalMapper* mapper;
52 TDEABC::AddressBook* addressBook;
55 TQLabel* memberListLabel;
56 KLineEdit* nameLineEdit;
57 TQWidget* memberListWidget;
58 TQVBoxLayout* addresseeLayout;
59 TQValueList<KPIM::DistributionListEditor::Line*> addressees;
60 TQGuardedPtr<TDEABC::Resource> resource;
61 KPIM::DistributionList distributionList;
62 KPIM::DistributionListEditor::Line* addLineForEntry(
const KPIM::DistributionList::Entry& entry );
67 KPIM::DistributionListEditor::Line::Line( TDEABC::AddressBook* book, TQWidget* parent ) : TQWidget( parent ), m_addressBook( book )
69 Q_ASSERT( m_addressBook );
70 TQBoxLayout* layout =
new TQHBoxLayout(
this );
71 layout->setSpacing( KDialog::spacingHint() );
72 m_lineEdit =
new KPIM::DistributionListEditor::LineEdit(
this );
73 connect( m_lineEdit, TQ_SIGNAL( textChanged(
const TQString& ) ),
74 this, TQ_SLOT( textChanged(
const TQString& ) ) );
75 layout->addWidget( m_lineEdit );
76 m_clearButton =
new TQToolButton(
this );
77 m_clearButton->setIconSet( TDEApplication::reverseLayout() ? SmallIconSet(
"locationbar_erase") : SmallIconSet(
"clear_left" ) );
78 m_clearButton->setEnabled(
false );
79 layout->addWidget( m_clearButton );
80 connect( m_clearButton, TQ_SIGNAL( clicked() ), m_lineEdit, TQ_SLOT( clear() ) );
83 void KPIM::DistributionListEditor::Line::textChanged(
const TQString& text )
85 m_clearButton->setEnabled( !text.isEmpty() );
91 void KPIM::DistributionListEditor::Line::setFocusToLineEdit()
93 m_lineEdit->setFocus();
96 void KPIM::DistributionListEditor::Line::setEntry(
const KPIM::DistributionList::Entry& entry )
98 m_uid = entry.addressee.uid();
99 m_initialText = entry.addressee.fullEmail( entry.email );
100 m_lineEdit->setText( m_initialText );
103 TDEABC::Addressee KPIM::DistributionListEditor::Line::findAddressee(
const TQString& name,
const TQString& email )
const
105 if ( name.isEmpty() && email.isEmpty() )
106 return TDEABC::Addressee();
108 typedef TDEABC::Addressee::List List;
109 const List byEmail = m_addressBook->findByEmail( email );
110 if ( !byEmail.isEmpty() )
112 const List::ConstIterator end = byEmail.end();
113 for ( List::ConstIterator it = byEmail.begin(); it != end; ++it )
115 if ( (*it).formattedName() == name )
118 return byEmail.first();
121 TDEABC::Addressee addressee;
122 addressee.setUid( TDEApplication::randomString( 10 ) );
123 addressee.setFormattedName( name );
124 addressee.setEmails( email );
125 m_addressBook->insertAddressee( addressee );
129 KPIM::DistributionList::Entry KPIM::DistributionListEditor::Line::entry()
const
131 const TQString text = m_lineEdit->text();
134 KPIM::getNameAndMail(m_lineEdit->text(), name, email );
136 KPIM::DistributionList::Entry res;
137 if ( !m_uid.isNull() )
139 const TDEABC::Addressee addr = m_addressBook->findByUid( m_uid );
140 if ( m_initialText == text || addr.formattedName() == name )
141 res.addressee = addr;
143 if ( res.addressee.isEmpty() )
144 res.addressee = findAddressee( name, email );
145 res.email = res.addressee.preferredEmail() != email ? email : TQString();
150 KPIM::DistributionListEditor::LineEdit::LineEdit( TQWidget* parent ) : KPIM::AddresseeLineEdit( parent )
152 allowDistributionLists(
false );
156 KPIM::DistributionListEditor::EditorWidget::EditorWidget( TDEABC::AddressBook* book, TQWidget* parent )
157 : KDialogBase( parent, 0, true, TQString(), KDialogBase::Ok|KDialogBase::Cancel ), d( new DistributionListEditor::EditorWidgetPrivate )
159 d->addressBook = book;
160 Q_ASSERT( d->addressBook );
162 d->mapper =
new TQSignalMapper(
this );
163 connect( d->mapper, TQ_SIGNAL( mapped(
int ) ),
164 this, TQ_SLOT( lineTextChanged(
int ) ) );
165 setCaption( i18n(
"Edit Distribution List" ) );
166 TQWidget* main =
new TQWidget(
this );
167 TQVBoxLayout* mainLayout =
new TQVBoxLayout( main );
168 mainLayout->setMargin( KDialog::marginHint() );
169 mainLayout->setSpacing( KDialog::spacingHint() );
171 TQHBoxLayout* nameLayout =
new TQHBoxLayout;
172 nameLayout->setSpacing( KDialog::spacingHint() );
173 d->nameLabel =
new TQLabel( main );
174 d->nameLabel->setText( i18n(
"Name:" ) );
175 nameLayout->addWidget( d->nameLabel );
177 d->nameLineEdit =
new KLineEdit( main );
178 nameLayout->addWidget( d->nameLineEdit );
180 mainLayout->addLayout( nameLayout );
181 mainLayout->addSpacing( 30 );
183 d->memberListLabel =
new TQLabel( main );
184 d->memberListLabel->setText( i18n(
"Distribution list members:" ) );
185 mainLayout->addWidget( d->memberListLabel );
187 d->scrollView =
new TQScrollView( main );
188 d->scrollView->setFrameShape( TQFrame::NoFrame );
189 mainLayout->addWidget( d->scrollView );
190 d->memberListWidget =
new TQWidget( d->scrollView->viewport() );
191 d->memberListWidget->setSizePolicy( TQSizePolicy::MinimumExpanding, TQSizePolicy::MinimumExpanding );
192 TQVBoxLayout* memberLayout =
new TQVBoxLayout( d->memberListWidget );
193 d->addresseeLayout =
new TQVBoxLayout;
194 d->addresseeLayout->setSpacing( KDialog::spacingHint() );
195 memberLayout->addItem( d->addresseeLayout );
196 memberLayout->addStretch();
197 d->scrollView->addChild( d->memberListWidget );
198 d->scrollView->setResizePolicy( TQScrollView::AutoOneFit );
200 setMainWidget( main );
202 KPIM::DistributionListEditor::Line*
const last = d->addLineForEntry( KPIM::DistributionList::Entry() );
203 const TQSize hint = sizeHint();
204 resize( hint.width() * 3L/2, hint.height() );
207 KPIM::DistributionListEditor::EditorWidget::~EditorWidget()
212 void KPIM::DistributionListEditor::EditorWidget::lineTextChanged(
int id )
214 if (
id != d->lastLineId )
216 d->addLineForEntry( KPIM::DistributionList::Entry() );
217 d->scrollView->updateContents();
220 void KPIM::DistributionListEditor::EditorWidget::setDistributionList(
const KPIM::DistributionList& list )
222 d->distListUid = list.uid();
223 d->nameLineEdit->setText( list.name() );
224 d->resource = list.resource();
226 using KPIM::DistributionListEditor::Line;
227 typedef TQValueList<Line*>::ConstIterator ListIterator;
228 for ( ListIterator it = d->addressees.begin(), end = d->addressees.end(); it != end; ++it )
232 d->addressees.clear();
234 typedef KPIM::DistributionList::Entry Entry;
235 const Entry::List entries = list.entries( d->addressBook );
237 for ( Entry::List::ConstIterator it = entries.begin(), end = entries.end(); it != end; ++it )
239 d->addLineForEntry( *it );
241 KPIM::DistributionListEditor::Line*
const last = d->addLineForEntry( Entry() );
242 last->setFocusToLineEdit();
245 KPIM::DistributionListEditor::Line* KPIM::DistributionListEditor::EditorWidgetPrivate::addLineForEntry(
const KPIM::DistributionList::Entry& entry )
247 KPIM::DistributionListEditor::Line* line =
new KPIM::DistributionListEditor::Line( addressBook, memberListWidget );
248 line->setEntry( entry );
249 addresseeLayout->addWidget( line );
250 addressees.append( line );
251 TQObject::connect( line, TQ_SIGNAL( textChanged() ),
252 mapper, TQ_SLOT( map() ) );
253 mapper->setMapping( line, ++lastLineId );
254 line->setShown(
true );
258 void KPIM::DistributionListEditor::EditorWidget::slotOk()
260 const TQString name = d->nameLineEdit->text();
261 const KPIM::DistributionList existing = KPIM::DistributionList::findByName( d->addressBook, name );
262 if ( !existing.isEmpty() && existing.uid() != d->distListUid )
264 KMessageBox::error(
this, i18n(
"A distribution list with the name %1 already exists. Please choose another name." ).arg( name ), i18n(
"Name in Use" ) );
268 TDEABC::Ticket *ticket = d->resource->requestSaveTicket();
270 kdWarning(5720) <<
"Unable to get save ticket!" << endl;
274 KPIM::DistributionList list;
275 list.setUid( d->distListUid.isNull() ? TDEApplication::randomString( 10 ) :d->distListUid );
276 list.setName( name );
277 list.setResource( d->resource );
278 typedef TQValueList<KPIM::DistributionListEditor::Line*>::ConstIterator ListIterator;
279 for ( ListIterator it = d->addressees.begin(), end = d->addressees.end(); it != end; ++it )
281 const KPIM::DistributionList::Entry entry = (*it)->entry();
282 if ( entry.addressee.isEmpty() )
284 list.insertEntry( entry.addressee, entry.email );
286 d->distributionList = list;
288 d->addressBook->insertAddressee( d->distributionList );
289 if ( !d->resource->save( ticket ) ) {
290 kdWarning(5720) <<
"Unable to save dist list!" << endl;
292 d->resource->releaseSaveTicket( ticket );
294 if ( !KPIM::DistributionList::findByName( d->addressBook, name ).isEmpty() ) {
299 KPIM::DistributionList KPIM::DistributionListEditor::EditorWidget::distributionList()
const
301 return d->distributionList;
304 #include "distributionlisteditor.moc"
305 #include "distributionlisteditor_p.moc"