• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdepim API Reference
  • KDE Home
  • Contact Us
 

kontact

  • sources
  • kde-4.14
  • kdepim
  • kontact
  • plugins
  • knotes
knotes_part.cpp
Go to the documentation of this file.
1 /*
2  This file is part of the KDE project
3 
4  Copyright (C) 2002-2003 Daniel Molkentin <molkentin@kde.org>
5  Copyright (C) 2004-2006 Michael Brade <brade@kde.org>
6  Copyright (C) 2013-2015 Laurent Montel <montel@kde.org>
7 
8  This program is free software; you can redistribute it and/or
9  modify it under the terms of the GNU General Public
10  License as published by the Free Software Foundation; either
11  version 2 of the License, or (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 GNU
16  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; see the file COPYING. If not, write to
20  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21  Boston, MA 02110-1301, USA.
22 */
23 
24 #include "knotes_part.h"
25 #include "notesharedglobalconfig.h"
26 #include "noteshared/noteutils.h"
27 #include "knoteseditdialog.h"
28 #include "knotesadaptor.h"
29 #include "noteshared/job/createnewnotejob.h"
30 #include "knotesiconview.h"
31 #include "knoteswidget.h"
32 #include "knotesselectdeletenotesdialog.h"
33 #include "knotes/configdialog/knoteconfigdialog.h"
34 #include "knotes/print/knoteprinter.h"
35 #include "knotes/print/knoteprintobject.h"
36 #include "knotes/print/knoteprintselectthemedialog.h"
37 #include "knotes/knoteedit.h"
38 #include "knotes/knotesglobalconfig.h"
39 #include "knotes/configdialog/knotesimpleconfigdialog.h"
40 #include "knotes/finddialog/knotefinddialog.h"
41 #include "utils/knoteutils.h"
42 #include "alarms/notealarmdialog.h"
43 #include "noteshared/resources/localresourcecreator.h"
44 #include "noteshared/job/createnewnotejob.h"
45 
46 #include "noteshared/akonadi/notesakonaditreemodel.h"
47 #include "noteshared/akonadi/noteschangerecorder.h"
48 #include "noteshared/attributes/notealarmattribute.h"
49 #include "noteshared/attributes/showfoldernotesattribute.h"
50 #include "noteshared/attributes/notealarmattribute.h"
51 #include "noteshared/attributes/notedisplayattribute.h"
52 #include "noteshared/attributes/notelockattribute.h"
53 
54 #include <Akonadi/Notes/NoteUtils>
55 
56 #include <Akonadi/Session>
57 #include <Akonadi/ChangeRecorder>
58 #include <Akonadi/ETMViewStateSaver>
59 #include <Akonadi/EntityDisplayAttribute>
60 #include <Akonadi/ItemCreateJob>
61 #include <Akonadi/ItemFetchJob>
62 #include <KCheckableProxyModel>
63 #include <akonadi/itemdeletejob.h>
64 #include <Akonadi/ItemFetchScope>
65 
66 
67 #include <KMime/KMimeMessage>
68 
69 #include <Akonadi/ItemModifyJob>
70 #include <Akonadi/Control>
71 
72 #include <KActionCollection>
73 #include <KAction>
74 #include <KInputDialog>
75 #include <KMessageBox>
76 #include <KXMLGUIFactory>
77 #include <KPrintPreview>
78 #include <ksocketfactory.h>
79 #include <KApplication>
80 #include <KFileDialog>
81 #include <KToggleAction>
82 
83 #include <QApplication>
84 #include <QClipboard>
85 #include <QMenu>
86 #include <QPointer>
87 #include <QCheckBox>
88 
89 #include <dnssd/publicservice.h>
90 
91 KNotesPart::KNotesPart( QObject *parent )
92  : KParts::ReadOnlyPart( parent ),
93  mNotesWidget( 0 ) ,
94  mPublisher(0),
95  mNotePrintPreview(0),
96  mNoteTreeModel(0)
97 {
98  (void) new KNotesAdaptor( this );
99  QDBusConnection::sessionBus().registerObject( QLatin1String("/KNotes"), this );
100 
101  setComponentData( KComponentData( "knotes" ) );
102 
103  Akonadi::Control::widgetNeedsAkonadi(widget());
104 
105  KNoteUtils::migrateToAkonadi();
106 
107  if (KNotesGlobalConfig::self()->autoCreateResourceOnStart()) {
108  NoteShared::LocalResourceCreator *creator = new NoteShared::LocalResourceCreator( this );
109  creator->createIfMissing();
110  }
111 
112  // create the actions
113  mNewNote = new KAction( KIcon( QLatin1String("knotes") ),
114  i18nc( "@action:inmenu create new popup note", "&New" ), this );
115  actionCollection()->addAction( QLatin1String("file_new"), mNewNote );
116  connect( mNewNote, SIGNAL(triggered(bool)), SLOT(newNote()) );
117  mNewNote->setShortcut( QKeySequence( Qt::CTRL + Qt::Key_N ) );
118  mNewNote->setHelpText(
119  i18nc( "@info:status", "Create a new popup note" ) );
120  mNewNote->setWhatsThis(
121  i18nc( "@info:whatsthis",
122  "You will be presented with a dialog where you can add a new popup note." ) );
123 
124  mNoteEdit = new KAction( KIcon( QLatin1String("document-edit") ),
125  i18nc( "@action:inmenu", "Edit..." ), this );
126  actionCollection()->addAction( QLatin1String("edit_note"), mNoteEdit );
127  connect( mNoteEdit, SIGNAL(triggered(bool)), SLOT(editNote()) );
128  mNoteEdit->setHelpText(
129  i18nc( "@info:status", "Edit popup note" ) );
130  mNoteEdit->setWhatsThis(
131  i18nc( "@info:whatsthis",
132  "You will be presented with a dialog where you can modify an existing popup note." ) );
133 
134  mNoteRename = new KAction( KIcon( QLatin1String("edit-rename") ),
135  i18nc( "@action:inmenu", "Rename..." ), this );
136  mNoteRename->setShortcut( QKeySequence( Qt::Key_F2 ) );
137  actionCollection()->addAction( QLatin1String("edit_rename"), mNoteRename );
138  connect( mNoteRename, SIGNAL(triggered(bool)), SLOT(renameNote()) );
139  mNoteRename->setHelpText(
140  i18nc( "@info:status", "Rename popup note" ) );
141  mNoteRename->setWhatsThis(
142  i18nc( "@info:whatsthis",
143  "You will be presented with a dialog where you can rename an existing popup note." ) );
144 
145  mNoteDelete = new KAction( KIcon( QLatin1String("edit-delete") ),
146  i18nc( "@action:inmenu", "Delete" ), this );
147  actionCollection()->addAction( QLatin1String("edit_delete"), mNoteDelete );
148  connect( mNoteDelete, SIGNAL(triggered(bool)), SLOT(killSelectedNotes()) );
149  mNoteDelete->setShortcut( QKeySequence( Qt::Key_Delete ) );
150  mNoteDelete->setHelpText(
151  i18nc( "@info:status", "Delete popup note" ) );
152  mNoteDelete->setWhatsThis(
153  i18nc( "@info:whatsthis",
154  "You will be prompted if you really want to permanently remove "
155  "the selected popup note." ) );
156 
157  mNotePrint = new KAction( KIcon( QLatin1String("document-print") ),
158  i18nc( "@action:inmenu", "Print Selected Notes..." ), this );
159  actionCollection()->addAction( QLatin1String("print_note"), mNotePrint );
160  connect( mNotePrint, SIGNAL(triggered(bool)), SLOT(slotPrintSelectedNotes()) );
161  mNotePrint->setHelpText(
162  i18nc( "@info:status", "Print popup note" ) );
163  mNotePrint->setWhatsThis(
164  i18nc( "@info:whatsthis",
165  "You will be prompted to print the selected popup note." ) );
166 
167  if(KPrintPreview::isAvailable()) {
168  mNotePrintPreview = new KAction( KIcon( QLatin1String("document-print-preview") ),i18nc( "@action:inmenu", "Print Preview Selected Notes..." ), this );
169  actionCollection()->addAction( QLatin1String("print_preview_note"), mNotePrintPreview );
170 
171  connect( mNotePrintPreview, SIGNAL(triggered(bool)), SLOT(slotPrintPreviewSelectedNotes()) );
172  }
173 
174  mNoteConfigure = new KAction( KIcon( QLatin1String("configure") ), i18n( "Note settings..." ), this );
175  actionCollection()->addAction( QLatin1String("configure_note"), mNoteConfigure );
176  connect( mNoteConfigure, SIGNAL(triggered(bool)), SLOT(slotNotePreferences()) );
177 
178  KAction *act = new KAction( KIcon( QLatin1String("configure") ), i18n( "Preferences KNotes..." ), this );
179  actionCollection()->addAction( QLatin1String("knotes_configure"), act );
180  connect( act, SIGNAL(triggered(bool)), SLOT(slotPreferences()) );
181 
182  mNoteSendMail = new KAction( KIcon( QLatin1String("mail-send") ), i18n( "Mail..." ), this );
183  actionCollection()->addAction( QLatin1String("mail_note"), mNoteSendMail );
184  connect( mNoteSendMail, SIGNAL(triggered(bool)), SLOT(slotMail()) );
185 
186  mNoteSendNetwork = new KAction( KIcon( QLatin1String("network-wired") ), i18n( "Send..." ), this );
187  actionCollection()->addAction( QLatin1String("send_note"), mNoteSendNetwork );
188  connect( mNoteSendNetwork, SIGNAL(triggered(bool)), SLOT(slotSendToNetwork()) );
189 
190  mNoteSetAlarm = new KAction( KIcon( QLatin1String("knotes_alarm") ), i18n( "Set Alarm..." ), this );
191  actionCollection()->addAction( QLatin1String("set_alarm"), mNoteSetAlarm );
192  connect( mNoteSetAlarm, SIGNAL(triggered(bool)), SLOT(slotSetAlarm()) );
193 
194  act = new KAction( KIcon( QLatin1String("edit-paste") ),
195  i18n( "New Note From Clipboard" ), this );
196  actionCollection()->addAction( QLatin1String("new_note_clipboard"), act );
197  connect( act, SIGNAL(triggered()), SLOT(slotNewNoteFromClipboard()) );
198 
199 
200  act = new KAction( KIcon( QLatin1String("document-open") ),
201  i18n( "New Note From Text File..." ), this );
202  actionCollection()->addAction( QLatin1String("new_note_from_text_file"), act );
203  connect( act, SIGNAL(triggered()), SLOT(slotNewNoteFromTextFile()) );
204 
205  mSaveAs = new KAction( KIcon( QLatin1String("document-save-as") ), i18n( "Save As..." ), this );
206  actionCollection()->addAction( QLatin1String("save_note"), mSaveAs );
207  connect( mSaveAs, SIGNAL(triggered(bool)), SLOT(slotSaveAs()) );
208 
209  mReadOnly = new KToggleAction( KIcon( QLatin1String("object-locked") ), i18n( "Lock" ), this );
210  actionCollection()->addAction( QLatin1String("lock_note"), mReadOnly );
211  connect( mReadOnly, SIGNAL(triggered(bool)), SLOT(slotUpdateReadOnly()) );
212  mReadOnly->setCheckedState( KGuiItem( i18n( "Unlock" ), QLatin1String("object-unlocked") ) );
213 
214 
215  KStandardAction::find( this, SLOT(slotOpenFindDialog()), actionCollection());
216 
217  Akonadi::Session *session = new Akonadi::Session( "KNotes Session", this );
218  mNoteRecorder = new NoteShared::NotesChangeRecorder(this);
219  mNoteRecorder->changeRecorder()->setSession(session);
220  mNoteTreeModel = new NoteShared::NotesAkonadiTreeModel(mNoteRecorder->changeRecorder(), this);
221 
222  connect( mNoteTreeModel, SIGNAL(rowsInserted(QModelIndex,int,int)),
223  SLOT(slotRowInserted(QModelIndex,int,int)));
224 
225  connect( mNoteRecorder->changeRecorder(), SIGNAL(itemChanged(Akonadi::Item,QSet<QByteArray>)), SLOT(slotItemChanged(Akonadi::Item,QSet<QByteArray>)));
226  connect( mNoteRecorder->changeRecorder(), SIGNAL(itemRemoved(Akonadi::Item)), SLOT(slotItemRemoved(Akonadi::Item)) );
227  connect( mNoteRecorder->changeRecorder(), SIGNAL(collectionChanged(Akonadi::Collection,QSet<QByteArray>)), SLOT(slotCollectionChanged(Akonadi::Collection,QSet<QByteArray>)) );
228 
229 
230  mSelectionModel = new QItemSelectionModel( mNoteTreeModel );
231  mModelProxy = new KCheckableProxyModel( this );
232  mModelProxy->setSelectionModel( mSelectionModel );
233  mModelProxy->setSourceModel( mNoteTreeModel );
234 
235  KSharedConfigPtr _config = KSharedConfig::openConfig( QLatin1String("kcmknotessummaryrc") );
236 
237  mModelState =
238  new KViewStateMaintainer<Akonadi::ETMViewStateSaver>( _config->group( "CheckState" ), this );
239  mModelState->setSelectionModel( mSelectionModel );
240 
241  mNotesWidget = new KNotesWidget(this,widget());
242 
243  mQuickSearchAction = new KAction( i18n("Set Focus to Quick Search"), this );
244  //If change shortcut change in quicksearchwidget->lineedit->setClickMessage
245  mQuickSearchAction->setShortcut( QKeySequence( Qt::ALT + Qt::Key_Q ) );
246  actionCollection()->addAction( QLatin1String("focus_to_quickseach"), mQuickSearchAction );
247  connect( mQuickSearchAction, SIGNAL(triggered(bool)), mNotesWidget, SLOT(slotFocusQuickSearch()) );
248 
249  connect( mNotesWidget->notesView(), SIGNAL(executed(QListWidgetItem*)),
250  this, SLOT(editNote(QListWidgetItem*)) );
251 
252  connect( mNotesWidget->notesView(), SIGNAL(itemSelectionChanged()),
253  this, SLOT(slotOnCurrentChanged()) );
254  slotOnCurrentChanged();
255 
256  setWidget( mNotesWidget );
257  setXMLFile( QLatin1String("knotes_part.rc") );
258  updateNetworkListener();
259  updateClickMessage();
260 }
261 
262 KNotesPart::~KNotesPart()
263 {
264  delete mPublisher;
265  mPublisher=0;
266 }
267 
268 void KNotesPart::updateClickMessage()
269 {
270  mNotesWidget->updateClickMessage(mQuickSearchAction->shortcut().toString());
271 }
272 
273 void KNotesPart::slotItemRemoved(const Akonadi::Item &item)
274 {
275  KNotesIconViewItem *iconView = mNotesWidget->notesView()->iconView(item.id());
276  delete iconView;
277 }
278 
279 void KNotesPart::slotRowInserted(const QModelIndex &parent, int start, int end)
280 {
281  for ( int i = start; i <= end; ++i) {
282  if ( mNoteTreeModel->hasIndex( i, 0, parent ) ) {
283  const QModelIndex child = mNoteTreeModel->index( i, 0, parent );
284  Akonadi::Collection parentCollection = mNoteTreeModel->data( child, Akonadi::EntityTreeModel::ParentCollectionRole).value<Akonadi::Collection>();
285  if (parentCollection.hasAttribute<NoteShared::ShowFolderNotesAttribute>()) {
286  Akonadi::Item item =
287  mNoteTreeModel->data( child, Akonadi::EntityTreeModel::ItemRole ).value<Akonadi::Item>();
288  if ( !item.hasPayload<KMime::Message::Ptr>() )
289  continue;
290  mNotesWidget->notesView()->addNote(item);
291  }
292  }
293  }
294 }
295 
296 QStringList KNotesPart::notesList() const
297 {
298  QStringList notes;
299  QHashIterator<Akonadi::Item::Id, KNotesIconViewItem*> i(mNotesWidget->notesView()->noteList());
300  while ( i.hasNext() ) {
301  i.next();
302  notes.append(QString::number(i.key()));
303  }
304  return notes;
305 }
306 
307 void KNotesPart::slotPrintPreviewSelectedNotes()
308 {
309  printSelectedNotes(true);
310 }
311 
312 void KNotesPart::slotPrintSelectedNotes()
313 {
314  printSelectedNotes(false);
315 }
316 
317 void KNotesPart::printSelectedNotes(bool preview)
318 {
319  QList<QListWidgetItem *> lst = mNotesWidget->notesView()->selectedItems();
320  if ( lst.isEmpty() ) {
321  KMessageBox::information(
322  mNotesWidget,
323  i18nc( "@info",
324  "To print notes, first select the notes to print from the list." ),
325  i18nc( "@title:window", "Print Popup Notes" ) );
326  return;
327  }
328  KNotesGlobalConfig *globalConfig = KNotesGlobalConfig::self();
329  QString printingTheme = globalConfig->theme();
330  if (printingTheme.isEmpty()) {
331  QPointer<KNotePrintSelectThemeDialog> dlg = new KNotePrintSelectThemeDialog(widget());
332  if (dlg->exec()) {
333  printingTheme = dlg->selectedTheme();
334  }
335  delete dlg;
336  }
337  if (!printingTheme.isEmpty()) {
338  QList<KNotePrintObject *> listPrintObj;
339  foreach ( QListWidgetItem *item, lst ) {
340  listPrintObj.append(new KNotePrintObject(static_cast<KNotesIconViewItem *>( item )->item()));
341  }
342  KNotePrinter printer;
343  printer.printNotes( listPrintObj, printingTheme, preview );
344  qDeleteAll(listPrintObj);
345  }
346 }
347 
348 bool KNotesPart::openFile()
349 {
350  return false;
351 }
352 
353 // public KNotes D-Bus interface implementation
354 
355 void KNotesPart::newNote( const QString &name, const QString &text )
356 {
357  NoteShared::CreateNewNoteJob *job = new NoteShared::CreateNewNoteJob(this, widget());
358  job->setRichText(KNotesGlobalConfig::self()->richText());
359  job->setNote(name, text);
360  job->start();
361 }
362 
363 void KNotesPart::slotNoteCreationFinished(KJob* job)
364 {
365  if (job->error()) {
366  kWarning() << job->errorString();
367  NoteShared::NoteSharedGlobalConfig::self()->setDefaultFolder(-1);
368  NoteShared::NoteSharedGlobalConfig::self()->writeConfig();
369  KMessageBox::error(widget(), i18n("Note was not created."), i18n("Create new note"));
370  return;
371  }
372 }
373 
374 void KNotesPart::newNoteFromClipboard( const QString &name )
375 {
376  const QString &text = QApplication::clipboard()->text();
377  newNote( name, text );
378 }
379 
380 void KNotesPart::killNote( Akonadi::Item::Id id )
381 {
382  killNote( id, false );
383 }
384 
385 void KNotesPart::killNote( Akonadi::Item::Id id, bool force )
386 {
387  KNotesIconViewItem *note = mNotesWidget->notesView()->iconView(id);
388  if ( note &&
389  ( (!force && KMessageBox::warningContinueCancelList(
390  mNotesWidget,
391  i18nc( "@info", "Do you really want to delete this note?" ),
392  QStringList( note->realName() ),
393  i18nc( "@title:window", "Confirm Delete" ),
394  KStandardGuiItem::del() ) == KMessageBox::Continue )
395  || force ) ) {
396 
397  Akonadi::ItemDeleteJob *job = new Akonadi::ItemDeleteJob(note->item());
398  connect(job, SIGNAL(result(KJob*)), SLOT(slotDeleteNotesFinished(KJob*)) );
399  }
400 }
401 
402 QString KNotesPart::name( Akonadi::Item::Id id ) const
403 {
404  KNotesIconViewItem *note = mNotesWidget->notesView()->iconView(id);
405  if ( note ) {
406  return note->text();
407  } else {
408  return QString();
409  }
410 }
411 
412 QString KNotesPart::text( Akonadi::Item::Id id ) const
413 {
414  //TODO return plaintext ?
415  KNotesIconViewItem *note = mNotesWidget->notesView()->iconView( id );
416  if ( note ) {
417  return note->description();
418  } else {
419  return QString();
420  }
421 }
422 
423 void KNotesPart::setName(Akonadi::Entity::Id id, const QString &newName )
424 {
425  KNotesIconViewItem *note = mNotesWidget->notesView()->iconView(id);
426  if ( note ) {
427  note->setIconText( newName );
428  }
429 }
430 
431 void KNotesPart::setText( Akonadi::Item::Id id, const QString &newText )
432 {
433  KNotesIconViewItem *note = mNotesWidget->notesView()->iconView( id );
434  if ( note ) {
435  note->setDescription( newText );
436  }
437 }
438 
439 QMap<QString, QString> KNotesPart::notes() const
440 {
441  QMap<QString, QString> notes;
442  QHashIterator<Akonadi::Item::Id, KNotesIconViewItem*> i(mNotesWidget->notesView()->noteList());
443  while ( i.hasNext() ) {
444  i.next();
445  notes.insert(QString::number(i.key()), i.value()->realName());
446  }
447  return notes;
448 }
449 
450 // private stuff
451 
452 void KNotesPart::killSelectedNotes()
453 {
454  QList<QListWidgetItem *> lst = mNotesWidget->notesView()->selectedItems();
455  if ( lst.isEmpty() ) {
456  return;
457  }
458  QList<KNotesIconViewItem*> items;
459 
460  foreach ( QListWidgetItem *item, lst ) {
461  KNotesIconViewItem *knivi = static_cast<KNotesIconViewItem *>( item );
462  items.append( knivi );
463  }
464 
465  if (items.isEmpty())
466  return;
467  QPointer<KNotesSelectDeleteNotesDialog> dlg = new KNotesSelectDeleteNotesDialog(items, widget());
468  if (dlg->exec()) {
469  Akonadi::Item::List lst;
470  QListIterator<KNotesIconViewItem*> kniviIt( items );
471  while ( kniviIt.hasNext() ) {
472  KNotesIconViewItem *iconViewIcon = kniviIt.next();
473  if (!iconViewIcon->readOnly()) {
474  lst.append(iconViewIcon->item());
475  }
476  }
477  if (!lst.isEmpty()) {
478  Akonadi::ItemDeleteJob *job = new Akonadi::ItemDeleteJob(lst);
479  connect(job, SIGNAL(result(KJob*)), SLOT(slotDeleteNotesFinished(KJob*)) );
480  }
481  }
482  delete dlg;
483 }
484 
485 void KNotesPart::slotDeleteNotesFinished(KJob* job)
486 {
487  if ( job->error() ) {
488  qDebug()<<" problem during delete job note:"<<job->errorString();
489  }
490 }
491 
492 void KNotesPart::popupRMB( QListWidgetItem *item, const QPoint &pos, const QPoint &globalPos )
493 {
494  Q_UNUSED( item );
495 
496  QMenu *contextMenu = new QMenu(widget());
497  if ( mNotesWidget->notesView()->itemAt ( pos ) ) {
498  contextMenu->addAction(mNewNote);
499  const bool uniqueNoteSelected = (mNotesWidget->notesView()->selectedItems().count() == 1);
500  const bool readOnly = uniqueNoteSelected ? static_cast<KNotesIconViewItem *>(mNotesWidget->notesView()->selectedItems().at(0))->readOnly() : false;
501  if (uniqueNoteSelected) {
502  if (!readOnly) {
503  contextMenu->addSeparator();
504  contextMenu->addAction(mNoteSetAlarm);
505  }
506  contextMenu->addSeparator();
507  contextMenu->addAction(mSaveAs);
508  contextMenu->addSeparator();
509  contextMenu->addAction(mNoteEdit);
510  contextMenu->addAction(mReadOnly);
511  if (!readOnly)
512  contextMenu->addAction(mNoteRename);
513  contextMenu->addSeparator();
514  contextMenu->addAction(mNoteSendMail);
515  contextMenu->addSeparator();
516  contextMenu->addAction(mNoteSendNetwork);
517  }
518  contextMenu->addSeparator();
519  contextMenu->addAction(mNotePrint);
520  if (KPrintPreview::isAvailable()) {
521  contextMenu->addAction(mNotePrintPreview);
522  }
523 
524  if (!readOnly) {
525  contextMenu->addSeparator();
526  contextMenu->addAction(mNoteConfigure);
527  contextMenu->addSeparator();
528  contextMenu->addAction(mNoteDelete);
529  }
530  } else {
531  contextMenu->addAction(mNewNote);
532  }
533 
534  contextMenu->exec( mNotesWidget->notesView()->mapFromParent( globalPos ) );
535  delete contextMenu;
536 }
537 
538 void KNotesPart::editNote(Akonadi::Entity::Id id)
539 {
540  KNotesIconViewItem *knoteItem = mNotesWidget->notesView()->iconView(id);
541  if (knoteItem) {
542  mNotesWidget->notesView()->setCurrentItem(knoteItem);
543  editNote(knoteItem);
544  }
545 }
546 
547 void KNotesPart::editNote( QListWidgetItem *item )
548 {
549  KNotesIconViewItem * knotesItem = static_cast<KNotesIconViewItem *>( item );
550  QPointer<KNoteEditDialog> dlg = new KNoteEditDialog( knotesItem->readOnly(), widget() );
551  dlg->setTitle( knotesItem->realName() );
552  dlg->setText( knotesItem->description() );
553  dlg->setColor( knotesItem->textForegroundColor(), knotesItem->textBackgroundColor() );
554 
555  dlg->setAcceptRichText(knotesItem->isRichText());
556  dlg->setTabSize(knotesItem->tabSize());
557  dlg->setAutoIndentMode(knotesItem->autoIndent());
558  dlg->setTextFont(knotesItem->textFont());
559 
560  dlg->setCursorPositionFromStart(knotesItem->cursorPositionFromStart());
561 
562  dlg->noteEdit()->setFocus();
563  if ( dlg->exec() == QDialog::Accepted ) {
564  knotesItem->setChangeIconTextAndDescription(dlg->title(), dlg->text(), dlg->cursorPositionFromStart());
565  }
566  delete dlg;
567 }
568 
569 void KNotesPart::editNote()
570 {
571  QListWidgetItem *item = mNotesWidget->notesView()->currentItem();
572  if ( item ) {
573  editNote( item );
574  }
575 }
576 
577 void KNotesPart::renameNote()
578 {
579  KNotesIconViewItem *knoteItem = static_cast<KNotesIconViewItem *>(mNotesWidget->notesView()->currentItem());
580 
581  const QString oldName = knoteItem->realName();
582  bool ok = false;
583  const QString newName =
584  KInputDialog::getText( i18nc( "@title:window", "Rename Popup Note" ),
585  i18nc( "@label:textbox", "New Name:" ),
586  oldName, &ok, mNotesWidget );
587  if ( ok && ( newName != oldName ) ) {
588  knoteItem->setIconText( newName );
589  }
590 }
591 
592 void KNotesPart::slotOnCurrentChanged( )
593 {
594  const bool uniqueNoteSelected = (mNotesWidget->notesView()->selectedItems().count() == 1);
595  const bool enabled(mNotesWidget->notesView()->currentItem());
596  mNoteRename->setEnabled( enabled && uniqueNoteSelected);
597  mNoteEdit->setEnabled( enabled && uniqueNoteSelected);
598  mNoteConfigure->setEnabled( uniqueNoteSelected );
599  mNoteSendMail->setEnabled(uniqueNoteSelected);
600  mNoteSendNetwork->setEnabled(uniqueNoteSelected);
601  mNoteSetAlarm->setEnabled(uniqueNoteSelected);
602  mSaveAs->setEnabled(uniqueNoteSelected);
603  mReadOnly->setEnabled(uniqueNoteSelected);
604  if (uniqueNoteSelected) {
605  const bool readOnly = static_cast<KNotesIconViewItem *>(mNotesWidget->notesView()->selectedItems().at(0))->readOnly();
606  mReadOnly->setChecked(readOnly);
607  mNoteEdit->setText(readOnly ? i18n("Show Note...") : i18nc( "@action:inmenu", "Edit..." ));
608  } else {
609  mNoteEdit->setText(i18nc( "@action:inmenu", "Edit..." ));
610  }
611 }
612 
613 void KNotesPart::slotNotePreferences()
614 {
615  if (!mNotesWidget->notesView()->currentItem())
616  return;
617  KNotesIconViewItem *knoteItem = static_cast<KNotesIconViewItem *>(mNotesWidget->notesView()->currentItem());
618  QPointer<KNoteSimpleConfigDialog> dialog = new KNoteSimpleConfigDialog( knoteItem->realName(), widget() );
619  Akonadi::Item item = knoteItem->item();
620  dialog->load(item, knoteItem->isRichText());
621  if (dialog->exec() ) {
622  KNoteUtils::updateConfiguration();
623  bool isRichText;
624  dialog->save(item, isRichText);
625  KMime::Message::Ptr message = item.payload<KMime::Message::Ptr>();
626  message->contentType( true )->setMimeType( isRichText ? "text/html" : "text/plain" );
627  message->assemble();
628  Akonadi::ItemModifyJob *job = new Akonadi::ItemModifyJob(item);
629  connect( job, SIGNAL(result(KJob*)), SLOT(slotNoteSaved(KJob*)) );
630  }
631  delete dialog;
632 }
633 
634 void KNotesPart::slotPreferences()
635 {
636  // create a new preferences dialog...
637  KNoteConfigDialog *dialog = new KNoteConfigDialog( i18n( "Settings" ), widget());
638  connect( dialog, SIGNAL(configCommitted()), this, SLOT(slotConfigUpdated()));
639  dialog->show();
640 }
641 
642 void KNotesPart::updateConfig()
643 {
644  updateNetworkListener();
645 }
646 
647 void KNotesPart::slotConfigUpdated()
648 {
649  updateNetworkListener();
650 }
651 
652 void KNotesPart::slotMail()
653 {
654  if (!mNotesWidget->notesView()->currentItem())
655  return;
656  KNotesIconViewItem *knoteItem = static_cast<KNotesIconViewItem *>(mNotesWidget->notesView()->currentItem());
657  NoteShared::NoteUtils noteUtils;
658  noteUtils.sendToMail(widget(),knoteItem->realName(), knoteItem->description());
659 }
660 
661 void KNotesPart::slotSendToNetwork()
662 {
663  if (!mNotesWidget->notesView()->currentItem())
664  return;
665  KNotesIconViewItem *knoteItem = static_cast<KNotesIconViewItem *>(mNotesWidget->notesView()->currentItem());
666  NoteShared::NoteUtils noteUtils;
667  noteUtils.sendToNetwork(widget(), knoteItem->realName(), knoteItem->description());
668 }
669 
670 void KNotesPart::updateNetworkListener()
671 {
672  delete mPublisher;
673  mPublisher=0;
674 
675  if ( NoteShared::NoteSharedGlobalConfig::receiveNotes() ) {
676  // create the socket and start listening for connections
677  mPublisher=new DNSSD::PublicService(NoteShared::NoteSharedGlobalConfig::senderID(), QLatin1String("_knotes._tcp"), NoteShared::NoteSharedGlobalConfig::port());
678  mPublisher->publishAsync();
679  }
680 }
681 
682 void KNotesPart::slotSetAlarm()
683 {
684  if (!mNotesWidget->notesView()->currentItem())
685  return;
686  KNotesIconViewItem *knoteItem = static_cast<KNotesIconViewItem *>(mNotesWidget->notesView()->currentItem());
687  QPointer<NoteShared::NoteAlarmDialog> dlg = new NoteShared::NoteAlarmDialog( knoteItem->realName(), widget() );
688  Akonadi::Item item = knoteItem->item();
689  if (item.hasAttribute<NoteShared::NoteAlarmAttribute>()) {
690  dlg->setAlarm(item.attribute<NoteShared::NoteAlarmAttribute>()->dateTime());
691  }
692  if ( dlg->exec() ) {
693  bool needToModify = true;
694  KDateTime dateTime = dlg->alarm();
695  if (dateTime.isValid()) {
696  NoteShared::NoteAlarmAttribute *attribute = item.attribute<NoteShared::NoteAlarmAttribute>( Akonadi::Entity::AddIfMissing );
697  attribute->setDateTime(dateTime);
698  } else {
699  if (item.hasAttribute<NoteShared::NoteAlarmAttribute>()) {
700  item.removeAttribute<NoteShared::NoteAlarmAttribute>();
701  } else {
702  needToModify = false;
703  }
704  }
705  if (needToModify) {
706  Akonadi::ItemModifyJob *job = new Akonadi::ItemModifyJob(item);
707  connect( job, SIGNAL(result(KJob*)), SLOT(slotNoteSaved(KJob*)) );
708  }
709  }
710  delete dlg;
711 }
712 
713 void KNotesPart::slotNoteSaved(KJob *job)
714 {
715  qDebug()<<" void KNote::slotNoteSaved(KJob *job)";
716  if ( job->error() ) {
717  qDebug()<<" problem during save note:"<<job->errorString();
718  }
719 }
720 
721 void KNotesPart::slotNewNoteFromClipboard()
722 {
723  const QString &text = KApplication::clipboard()->text();
724  newNote( QString(), text );
725 }
726 
727 void KNotesPart::slotSaveAs()
728 {
729  if (!mNotesWidget->notesView()->currentItem())
730  return;
731  KNotesIconViewItem *knoteItem = static_cast<KNotesIconViewItem *>(mNotesWidget->notesView()->currentItem());
732 
733  KUrl url;
734  QCheckBox *convert = 0;
735 
736  if ( knoteItem->isRichText() ) {
737  convert = new QCheckBox( 0 );
738  convert->setText( i18n( "Save note as plain text" ) );
739  }
740  QPointer<KFileDialog> dlg = new KFileDialog( url, QString(), widget(), convert );
741  dlg->setOperationMode( KFileDialog::Saving );
742  dlg->setCaption( i18n( "Save As" ) );
743  if( !dlg->exec() ) {
744  delete dlg;
745  return;
746  }
747 
748  const QString fileName = dlg->selectedFile();
749  const bool htmlFormatAndSaveAsHtml = (convert && !convert->isChecked());
750  delete dlg;
751  if ( fileName.isEmpty() ) {
752  return;
753  }
754 
755  QFile file( fileName );
756  if ( file.exists() &&
757  KMessageBox::warningContinueCancel( widget(),
758  i18n( "<qt>A file named <b>%1</b> already exists.<br />"
759  "Are you sure you want to overwrite it?</qt>",
760  QFileInfo( file ).fileName() ) ) != KMessageBox::Continue ) {
761  return;
762  }
763 
764  if ( file.open( QIODevice::WriteOnly ) ) {
765  QTextStream stream( &file );
766  QTextDocument doc;
767  doc.setHtml(knoteItem->description());
768  if ( htmlFormatAndSaveAsHtml ) {
769  QString htmlStr = doc.toHtml();
770  htmlStr.replace(QLatin1String("meta name=\"qrichtext\" content=\"1\""), QLatin1String("meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\""));
771  stream << htmlStr;
772  } else {
773  stream << knoteItem->realName() + QLatin1Char('\n');
774  stream << doc.toPlainText();
775  }
776  }
777 }
778 
779 void KNotesPart::slotUpdateReadOnly()
780 {
781  QListWidgetItem *item = mNotesWidget->notesView()->currentItem();
782  if (!item)
783  return;
784  KNotesIconViewItem *knoteItem = static_cast<KNotesIconViewItem *>(item);
785 
786  const bool readOnly = mReadOnly->isChecked();
787 
788  mNoteEdit->setText(readOnly ? i18n("Show Note...") : i18nc( "@action:inmenu", "Edit..." ));
789  knoteItem->setReadOnly( readOnly );
790 }
791 
792 void KNotesPart::slotItemChanged(const Akonadi::Item &item, const QSet<QByteArray> & set)
793 {
794  KNotesIconViewItem *knoteItem = mNotesWidget->notesView()->iconView(item.id());
795  if (knoteItem) {
796  knoteItem->setChangeItem(item, set);
797  }
798 }
799 
800 void KNotesPart::slotOpenFindDialog()
801 {
802  if (!mNoteFindDialog) {
803  mNoteFindDialog = new KNoteFindDialog(widget());
804  connect(mNoteFindDialog, SIGNAL(noteSelected(Akonadi::Item::Id)), this, SLOT(slotSelectNote(Akonadi::Item::Id)));
805  }
806  QHash<Akonadi::Item::Id , Akonadi::Item> lst;
807  QHashIterator<Akonadi::Item::Id, KNotesIconViewItem*> i(mNotesWidget->notesView()->noteList());
808  while (i.hasNext()) {
809  i.next();
810  lst.insert(i.key(), i.value()->item());
811  }
812  mNoteFindDialog->setExistingNotes(lst);
813  mNoteFindDialog->show();
814 }
815 
816 void KNotesPart::slotSelectNote(Akonadi::Item::Id id)
817 {
818  editNote(id);
819 }
820 
821 void KNotesPart::slotCollectionChanged(const Akonadi::Collection &col, const QSet<QByteArray> & set)
822 {
823  if (set.contains("showfoldernotesattribute")) {
824  //qDebug()<<" collection Changed "<<set<<" col "<<col;
825  if (col.hasAttribute<NoteShared::ShowFolderNotesAttribute>()) {
826  fetchNotesFromCollection(col);
827  } else {
828  QHashIterator<Akonadi::Item::Id, KNotesIconViewItem*> i(mNotesWidget->notesView()->noteList());
829  while (i.hasNext()) {
830  i.next();
831  Akonadi::Item item = i.value()->item();
832  if (item.parentCollection() == col) {
833  slotItemRemoved(item);
834  }
835  }
836  }
837  }
838 }
839 
840 void KNotesPart::fetchNotesFromCollection(const Akonadi::Collection &col)
841 {
842  Akonadi::ItemFetchJob *job = new Akonadi::ItemFetchJob( col );
843  job->fetchScope().fetchFullPayload(true);
844  job->fetchScope().fetchAttribute<NoteShared::NoteLockAttribute>();
845  job->fetchScope().fetchAttribute<NoteShared::NoteDisplayAttribute>();
846  job->fetchScope().fetchAttribute<NoteShared::NoteAlarmAttribute>();
847  job->fetchScope().setAncestorRetrieval(Akonadi::ItemFetchScope::Parent);
848  connect( job, SIGNAL(result(KJob*)), SLOT(slotItemFetchFinished(KJob*)) );
849 }
850 
851 void KNotesPart::slotItemFetchFinished(KJob *job)
852 {
853  if ( job->error() ) {
854  qDebug() << "Error occurred during item fetch:"<<job->errorString();
855  return;
856  }
857 
858  Akonadi::ItemFetchJob *fetchJob = qobject_cast<Akonadi::ItemFetchJob*>( job );
859 
860  const Akonadi::Item::List items = fetchJob->items();
861  foreach ( const Akonadi::Item &item, items ) {
862  if ( !item.hasPayload<KMime::Message::Ptr>() )
863  continue;
864  mNotesWidget->notesView()->addNote(item);
865  }
866 }
867 
868 void KNotesPart::slotNewNoteFromTextFile()
869 {
870  QString text;
871  const QString filename = KFileDialog::getOpenFileName( KUrl(),
872  QLatin1String("*.txt"),
873  widget(),
874  i18n("Select Text File") );
875  if (!filename.isEmpty()) {
876  QFile f(filename);
877  if (f.open(QIODevice::ReadOnly|QIODevice::Text)) {
878  text = QString::fromUtf8(f.readAll());
879  } else {
880  KMessageBox::error(widget(), i18n("Error during open text file: %1", f.errorString()), i18n("Open Text File"));
881  return;
882  }
883  newNote( i18n("Note from file '%1'",filename), text);
884  }
885 }
KNotesIconViewItem::autoIndent
bool autoIndent() const
Definition: knotesiconview.cpp:230
QModelIndex
KNotesIconView::addNote
void addNote(const Akonadi::Item &item)
Definition: knotesiconview.cpp:94
KNotesPart::openFile
bool openFile()
Definition: knotes_part.cpp:348
KNotesPart::notes
QMap< QString, QString > notes() const
Definition: knotes_part.cpp:439
QHash::insert
iterator insert(const Key &key, const T &value)
KNotesIconViewItem::cursorPositionFromStart
int cursorPositionFromStart() const
Definition: knotesiconview.cpp:252
KNotesPart::updateClickMessage
void updateClickMessage()
Definition: knotes_part.cpp:268
KNotesPart::newNoteFromClipboard
void newNoteFromClipboard(const QString &name=QString())
Definition: knotes_part.cpp:374
text
virtual QByteArray text(quint32 serialNumber) const =0
KNotesIconViewItem::textForegroundColor
QColor textForegroundColor() const
Definition: knotesiconview.cpp:225
KNotesPart::editNote
void editNote(Akonadi::Entity::Id id)
Definition: knotes_part.cpp:538
QMap
QMenu::addAction
void addAction(QAction *action)
QPointer
QDBusConnection::registerObject
bool registerObject(const QString &path, QObject *object, QFlags< QDBusConnection::RegisterOption > options)
QListWidgetItem
KNotesWidget::notesView
KNotesIconView * notesView() const
Definition: knoteswidget.cpp:51
KNotesPart::KNotesPart
KNotesPart(QObject *parent=0)
Definition: knotes_part.cpp:91
QDBusConnection::sessionBus
QDBusConnection sessionBus()
QPoint
KNotesIconViewItem::textBackgroundColor
QColor textBackgroundColor() const
Definition: knotesiconview.cpp:220
QFile
QTextStream
KNotesPart::notesList
QStringList notesList() const
Definition: knotes_part.cpp:296
KNotesPart::killNote
void killNote(Akonadi::Item::Id id)
Definition: knotes_part.cpp:380
KNotesWidget
Definition: knoteswidget.h:25
KNotesIconView::iconView
KNotesIconViewItem * iconView(Akonadi::Item::Id id) const
Definition: knotesiconview.cpp:100
QString::number
QString number(int n, int base)
QList::append
void append(const T &value)
QString::fromUtf8
QString fromUtf8(const char *str, int size)
QApplication::clipboard
QClipboard * clipboard()
QHash
knoteswidget.h
KNotesIconViewItem::isRichText
bool isRichText() const
Definition: knotesiconview.cpp:240
QObject
QCheckBox
KNotesSelectDeleteNotesDialog
Definition: knotesselectdeletenotesdialog.h:35
QList::isEmpty
bool isEmpty() const
QHashIterator
QString::isEmpty
bool isEmpty() const
knotes_part.h
KNotesPart::newNote
void newNote(const QString &name=QString(), const QString &text=QString())
Definition: knotes_part.cpp:355
QSet
KNotesIconViewItem::setChangeIconTextAndDescription
void setChangeIconTextAndDescription(const QString &iconText, const QString &description, int position)
Definition: knotesiconview.cpp:188
KNotesPart::updateConfig
void updateConfig()
Definition: knotes_part.cpp:642
QMenu::addSeparator
QAction * addSeparator()
KNotesIconViewItem::realName
QString realName() const
Definition: knotesiconview.cpp:208
QString
QList
KNotesPart::setText
void setText(Akonadi::Item::Id id, const QString &newText)
Definition: knotes_part.cpp:431
QMenu::exec
QAction * exec()
KNotesIconView::noteList
QHash< Akonadi::Item::Id, KNotesIconViewItem * > noteList() const
Definition: knotesiconview.cpp:108
QStringList
KNotesPart::setName
void setName(Akonadi::Item::Id id, const QString &newName)
Definition: knotes_part.cpp:423
QFileInfo
QMenu
QHashIterator::next
Item next()
QLatin1Char
KNotesIconViewItem::readOnly
bool readOnly() const
Definition: knotesiconview.cpp:147
KNotesPart::~KNotesPart
~KNotesPart()
Definition: knotes_part.cpp:262
QSet::contains
bool contains(const T &value) const
KNotesIconViewItem::setDescription
void setDescription(const QString &)
Definition: knotesiconview.cpp:263
KNotesIconViewItem::textFont
QFont textFont() const
Definition: knotesiconview.cpp:235
QAbstractButton::isChecked
bool isChecked() const
QClipboard::text
QString text(Mode mode) const
set
void set(quint32, const QString &, const QString &, const QString &, const QString &, time_t)
QString::replace
QString & replace(int position, int n, QChar after)
KNotesPart::name
QString name(Akonadi::Item::Id id) const
Definition: knotes_part.cpp:402
knotesiconview.h
QTextDocument::toPlainText
QString toPlainText() const
KNotesIconViewItem
Definition: knotesiconview.h:47
QLatin1String
QKeySequence
QTextDocument
KNotesPart::popupRMB
void popupRMB(QListWidgetItem *item, const QPoint &pos, const QPoint &globalPos)
Definition: knotes_part.cpp:492
KNotesIconViewItem::description
QString description() const
Definition: knotesiconview.cpp:246
KNotesIconViewItem::item
Akonadi::Item item()
Definition: knotesiconview.cpp:273
knoteseditdialog.h
KNotesWidget::updateClickMessage
void updateClickMessage(const QString &shortcutStr)
Definition: knoteswidget.cpp:46
QTextDocument::setHtml
void setHtml(const QString &html)
KNotesIconViewItem::setIconText
void setIconText(const QString &text, bool save=true)
Definition: knotesiconview.cpp:194
QAbstractButton::setText
void setText(const QString &text)
KNoteEditDialog
Definition: knoteseditdialog.h:28
QMap::insert
iterator insert(const Key &key, const T &value)
QListIterator
KNotesIconViewItem::setChangeItem
void setChangeItem(const Akonadi::Item &item, const QSet< QByteArray > &set)
Definition: knotesiconview.cpp:311
KNotesPart::text
QString text(Akonadi::Entity::Id id) const
Definition: knotes_part.cpp:412
QItemSelectionModel
QTextDocument::toHtml
QString toHtml(const QByteArray &encoding) const
knotesselectdeletenotesdialog.h
KNotesIconViewItem::tabSize
int tabSize() const
Definition: knotesiconview.cpp:215
KJob
QListWidgetItem::text
QString text() const
KNotesIconViewItem::setReadOnly
void setReadOnly(bool b, bool save=true)
Definition: knotesiconview.cpp:152
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:34:11 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kontact

Skip menu "kontact"
  • Main Page
  • Namespace List
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

kdepim API Reference

Skip menu "kdepim API Reference"
  • akonadi_next
  • akregator
  • blogilo
  • calendarsupport
  • console
  •   kabcclient
  •   konsolekalendar
  • kaddressbook
  • kalarm
  •   lib
  • kdgantt2
  • kjots
  • kleopatra
  • kmail
  • knode
  • knotes
  • kontact
  • korgac
  • korganizer
  • ktimetracker
  • libkdepim
  • libkleo
  • libkpgp
  • mailcommon
  • messagelist
  • messageviewer
  • pimprint

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal