bool AlarmDialog::openIncidenceEditorThroughKOrganizer( const Incidence::Ptr &incidence ) { if ( !QDBusConnection::sessionBus().interface()->isServiceRegistered( "org.kde.korganizer" ) ) { if ( KToolInvocation::startServiceByDesktopName( "korganizer", QString() ) ) { KMessageBox::error( this, i18nc( "@info", "Could not start KOrganizer so editing is not possible." ) ); return false; } } org::kde::korganizer::Korganizer korganizer( "org.kde.korganizer", "/Korganizer", QDBusConnection::sessionBus() ); kDebug() << "editing incidence " << incidence->summary(); if ( !korganizer.editIncidence( incidence->uid() ) ) { KMessageBox::error( this, i18nc( "@info", "An internal KOrganizer error occurred attempting to modify \"%1\"", cleanSummary( incidence->summary() ) ) ); } // get desktop # where korganizer (or kontact) runs QString object = QDBusConnection::sessionBus().interface()->isServiceRegistered( "org.kde.kontact" ) ? "kontact/MainWindow_1" : "korganizer/MainWindow_1"; QDBusInterface korganizerObj( "org.kde.korganizer", '/' + object ); #ifdef Q_WS_X11 QDBusReply<int> reply = korganizerObj.call( "winId" ); if ( reply.isValid() ) { int window = reply; int desktop = KWindowSystem::windowInfo( window, NET::WMDesktop ).desktop(); if ( KWindowSystem::currentDesktop() == desktop ) { KWindowSystem::minimizeWindow( winId(), false ); } else { KWindowSystem::setCurrentDesktop( desktop ); } KWindowSystem::activateWindow( KWindowSystem::transientFor( window ) ); } #elif defined(Q_WS_WIN) // WId is a typedef to a void* on windows QDBusReply<qlonglong> reply = korganizerObj.call( "winId" ); if ( reply.isValid() ) { qlonglong window = reply; KWindowSystem::minimizeWindow( winId(), false ); KWindowSystem::allowExternalProcessWindowActivation(); KWindowSystem::activateWindow( reinterpret_cast<WId>(window) ); } #else // TODO (mac) #endif return true; }
void AlarmDialog::slotCalendarChanged() { Akonadi::Item::List incidences = mCalendar->incidences(); for ( Akonadi::Item::List::ConstIterator it = incidences.constBegin(); it != incidences.constEnd(); ++it ) { ReminderListItem *item = searchByItem( *it ); if ( item ) { Incidence::Ptr incidence = CalendarSupport::incidence( *it ); QString displayStr; // Yes, alarms can be empty, if someone edited the incidence and removed all alarms if ( !incidence->alarms().isEmpty() ) { const KDateTime dateTime = triggerDateForIncidence( incidence, item->mRemindAt, displayStr ); const QString summary = cleanSummary( incidence->summary() ); if ( displayStr != item->text( 1 ) || summary != item->text( 0 ) ) { item->setText( 1, displayStr ); item->setText( 0, summary ); } } } } }
void AlarmDialog::addIncidence( const Akonadi::Item &incidenceitem, const QDateTime &reminderAt, const QString &displayText ) { Incidence::Ptr incidence = CalendarSupport::incidence( incidenceitem ); ReminderListItem *item = searchByItem( incidenceitem ); if ( !item ) { item = new ReminderListItem( incidenceitem, mIncidenceTree ); } item->mNotified = false; item->mHappening = KDateTime(); item->mRemindAt = reminderAt; item->mTrigger = KDateTime::currentLocalDateTime(); item->mDisplayText = displayText; item->setText( 0, cleanSummary( incidence->summary() ) ); Event::Ptr event; Todo::Ptr todo; QString displayStr; const KDateTime dateTime = triggerDateForIncidence( incidence, reminderAt, displayStr ); if ( incidence->type() == Incidence::TypeEvent ) { item->setIcon( 0, SmallIcon( "view-calendar-day" ) ); } else if ( incidence->type() == Incidence::TypeTodo ) { item->setIcon( 0, SmallIcon( "view-calendar-tasks" ) ); } item->mHappening = dateTime; item->setText( 1, displayStr ); item->setText( 2, IncidenceFormatter::dateTimeToString( item->mTrigger, false, true, KDateTime::Spec::LocalZone() ) ); QString tip = IncidenceFormatter::toolTipStr( CalendarSupport::displayName( mCalendar, incidenceitem.parentCollection() ), incidence, item->mRemindAt.date(), true, KDateTime::Spec::LocalZone() ); if ( !item->mDisplayText.isEmpty() ) { tip += "<br>" + item->mDisplayText; } item->setToolTip( 0, tip ); item->setToolTip( 1, tip ); item->setToolTip( 2, tip ); item->setData( 0, QTreeWidgetItem::UserType, false ); mIncidenceTree->setCurrentItem( item ); showDetails(); slotSave(); }
void Compat::fixEmptySummary( const Incidence::Ptr &incidence ) { // some stupid vCal exporters ignore the standard and use Description // instead of Summary for the default field. Correct for this: Copy the // first line of the description to the summary (if summary is just one // line, move it) if ( incidence->summary().isEmpty() && !( incidence->description().isEmpty() ) ) { QString oldDescription = incidence->description().trimmed(); QString newSummary( oldDescription ); newSummary.remove( QRegExp( "\n.*" ) ); incidence->setSummary( newSummary ); if ( oldDescription == newSummary ) { incidence->setDescription( "" ); } } }
void AlarmDialog::edit() { ReminderList selection = selectedItems(); if ( selection.count() != 1 ) { return; } Incidence::Ptr incidence = CalendarSupport::incidence( selection.first()->mIncidence ); if ( !mCalendar->hasChangeRights( selection.first()->mIncidence ) ) { KMessageBox::sorry( this, i18nc( "@info", "\"%1\" is a read-only item so modifications are not possible.", cleanSummary( incidence->summary() ) ) ); return; } #if !defined(KDEPIM_MOBILE_UI) openIncidenceEditorNG( selection.first()->mIncidence ); #else openIncidenceEditorThroughKOrganizer( incidence ); #endif }
int main( int argc, char **argv ) { KAboutData aboutData( "testrecurrencenew", 0, ki18n( "Load recurrence rules with the new class and print out debug messages" ), "0.1" ); KCmdLineArgs::init( argc, argv, &aboutData ); KCmdLineOptions options; options.add( "verbose", ki18n( "Verbose output" ) ); options.add( "+input", ki18n( "Name of input file" ) ); options.add( "[+output]", ki18n( "optional name of output file for the recurrence dates" ) ); KCmdLineArgs::addCmdLineOptions( options ); KComponentData componentData( &aboutData ); //QCoreApplication app( KCmdLineArgs::qtArgc(), KCmdLineArgs::qtArgv() ); KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); if ( args->count() < 1 ) { args->usage( "Wrong number of arguments." ); } QString input = args->arg( 0 ); kDebug() << "Input file:" << input; QTextStream *outstream; outstream = 0; QString fn( "" ); if ( args->count() > 1 ) { fn = args->arg( 1 ); kDebug() << "We have a file name given:" << fn; } QFile outfile( fn ); if ( !fn.isEmpty() && outfile.open( QIODevice::WriteOnly ) ) { kDebug() << "Opened output file!!!"; outstream = new QTextStream( &outfile ); } MemoryCalendar::Ptr cal( new MemoryCalendar( KDateTime::UTC ) ); KDateTime::Spec viewSpec; FileStorage store( cal, input ); if ( !store.load() ) return 1; QString tz = cal->nonKDECustomProperty( "X-LibKCal-Testsuite-OutTZ" ); if ( !tz.isEmpty() ) { viewSpec = KDateTime::Spec( KSystemTimeZones::zone( tz ) ); } Incidence::List inc = cal->incidences(); for ( Incidence::List::Iterator it = inc.begin(); it != inc.end(); ++it ) { Incidence::Ptr incidence = *it; kDebug() << "*+*+*+*+*+*+*+*+*+*"; kDebug() << " ->" << incidence->summary() << "<-"; incidence->recurrence()->dump(); KDateTime dt( incidence->recurrence()->endDateTime() ); int i = 0; if ( outstream ) { if ( !dt.isValid() ) { if ( viewSpec.isValid() ) { dt = KDateTime( QDate( 2011, 1, 1 ), QTime( 0, 0, 1 ), viewSpec ); } else { dt = KDateTime( QDate( 2011, 1, 1 ), QTime( 0, 0, 1 ) ); } } else { dt = dt.addYears( 2 ); } kDebug() << "-------------------------------------------"; kDebug() << " *~*~*~*~ Starting with date:" << dumpTime( dt, viewSpec ); // Output to file for testing purposes while ( dt.isValid() && i < 500 ) { ++i; dt = incidence->recurrence()->getPreviousDateTime( dt ); if ( dt.isValid() ) { (*outstream) << dumpTime( dt, viewSpec ) << endl; } } } else { if ( !dt.isValid() ) { dt = KDateTime( QDate( 2005, 7, 31 ), QTime( 23, 59, 59 ), KDateTime::Spec::UTC() ); } else { dt = dt.addYears( 2 ); } incidence->recurrence()->dump(); kDebug() << "-------------------------------------------"; kDebug() << " *~*~*~*~ Starting with date:" << dumpTime( dt, viewSpec ); // Output to konsole while ( dt.isValid() && i < 50 ) { ++i; kDebug() << "-------------------------------------------"; dt = incidence->recurrence()->getPreviousDateTime( dt ); if ( dt.isValid() ) { kDebug() << " *~*~*~*~ Previous date is:" << dumpTime( dt, viewSpec ); } } } } delete outstream; outfile.close(); return 0; }
void AlarmDialog::eventNotification() { bool beeped = false; bool found = false; ReminderList list; QTreeWidgetItemIterator it( mIncidenceTree ); while ( *it ) { ReminderListItem *item = static_cast<ReminderListItem *>( *it ); ++it; if ( item->isDisabled() || item->mNotified ) { //skip suspended reminders or reminders that have been notified continue; } found = true; item->mNotified = true; Incidence::Ptr incidence = CalendarSupport::incidence( item->mIncidence ); Alarm::List alarms = incidence->alarms(); Alarm::List::ConstIterator ait; for ( ait = alarms.constBegin(); ait != alarms.constEnd(); ++ait ) { Alarm::Ptr alarm = *ait; // FIXME: Check whether this should be done for all multiple alarms if ( alarm->type() == Alarm::Procedure ) { // FIXME: Add a message box asking whether the procedure should really be executed kDebug() << "Starting program: '" << alarm->programFile() << "'"; QString program = alarm->programFile(); // if the program name contains spaces escape it if ( program.contains( ' ' ) && !( program.startsWith( '\"' ) && program.endsWith( '\"' ) ) ) { program = '\"' + program + '\"'; } QProcess::startDetached( program + ' ' + alarm->programArguments() ); } else if ( alarm->type() == Alarm::Audio ) { beeped = true; Phonon::MediaObject *player = Phonon::createPlayer( Phonon::NotificationCategory, alarm->audioFile() ); player->setParent( this ); connect( player, SIGNAL(finished()), player, SLOT(deleteLater()) ); player->play(); } else if ( alarm->type() == Alarm::Email ) { QString from = CalendarSupport::KCalPrefs::instance()->email(); Identity id = KOCore::self()->identityManager()->identityForAddress( from ); QString to; if ( alarm->mailAddresses().isEmpty() ) { to = from; } else { const Person::List addresses = alarm->mailAddresses(); QStringList add; for ( Person::List::ConstIterator it = addresses.constBegin(); it != addresses.constEnd(); ++it ) { add << (*it)->fullName(); } to = add.join( ", " ); } QString subject; Akonadi::Item parentItem = mCalendar->itemForIncidenceUid( alarm->parentUid() ); Incidence::Ptr parent = CalendarSupport::incidence( parentItem ); if ( alarm->mailSubject().isEmpty() ) { if ( parent->summary().isEmpty() ) { subject = i18nc( "@title", "Reminder" ); } else { subject = i18nc( "@title", "Reminder: %1", cleanSummary( parent->summary() ) ); } } else { subject = i18nc( "@title", "Reminder: %1", alarm->mailSubject() ); } QString body = IncidenceFormatter::mailBodyStr( parent.staticCast<IncidenceBase>(), KSystemTimeZones::local() ); if ( !alarm->mailText().isEmpty() ) { body += '\n' + alarm->mailText(); } //TODO: support attachments CalendarSupport::MailClient mailer; mailer.send( id, from, to, QString(), subject, body, true, false, QString(), MailTransport::TransportManager::self()->defaultTransportName() ); } } } if ( !beeped && found ) { KNotification::beep(); } }