You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
327 lines
11 KiB
327 lines
11 KiB
15 years ago
|
/*
|
||
|
This file is part of libkdepim.
|
||
|
|
||
|
Copyright (c) 2004 Lutz Rogowski <rogowski@kde.org>
|
||
|
|
||
|
This program is free software; you can redistribute it and/or modify
|
||
|
it under the terms of the GNU General Public License as published by
|
||
|
the Free Software Foundation; either version 2 of the License, or
|
||
|
(at your option) any later version.
|
||
|
|
||
|
This program is distributed in the hope that it will be useful,
|
||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
GNU General Public License for more details.
|
||
|
|
||
|
You should have received a copy of the GNU General Public License
|
||
|
along with this program; if not, write to the Free Software
|
||
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||
|
|
||
|
As a special exception, permission is given to link this program
|
||
|
with any edition of Qt, and distribute the resulting executable,
|
||
|
without including the source code for Qt in the source distribution.
|
||
|
*/
|
||
|
|
||
|
#include <qlayout.h>
|
||
|
#include <qlabel.h>
|
||
|
#include <qbuttongroup.h>
|
||
|
#include <qvbox.h>
|
||
|
#include <qhbox.h>
|
||
|
#include <qradiobutton.h>
|
||
|
#include <qpushbutton.h>
|
||
|
#include <qlayout.h>
|
||
|
#include <qscrollview.h>
|
||
|
#include <qtextbrowser.h>
|
||
|
#include <qapplication.h>
|
||
|
|
||
|
|
||
|
#include <klocale.h>
|
||
|
#include <kglobal.h>
|
||
|
|
||
|
#include "kincidencechooser.h"
|
||
|
#include "libkcal/incidence.h"
|
||
|
#include "libkcal/incidenceformatter.h"
|
||
|
|
||
|
int KIncidenceChooser::chooseMode = KIncidenceChooser::ask ;
|
||
|
|
||
|
KIncidenceChooser::KIncidenceChooser(QWidget *parent, char *name) :
|
||
|
KDialog(parent,name,true)
|
||
|
{
|
||
|
KDialog *topFrame = this;
|
||
|
QGridLayout *topLayout = new QGridLayout(topFrame,5,3);
|
||
|
int iii = 0;
|
||
|
setCaption( i18n("Conflict Detected"));
|
||
|
QLabel * lab;
|
||
|
lab = new QLabel( i18n(
|
||
|
"<qt>A conflict was detected. This probably means someone edited the same entry on the server while you changed it locally."
|
||
|
"<br/>NOTE: You have to check mail again to apply your changes to the server.</qt>"), topFrame);
|
||
|
topLayout->addMultiCellWidget(lab, iii,iii,0,2);
|
||
|
++iii;
|
||
|
QHBox * b_box = new QHBox( topFrame );
|
||
|
topLayout->addMultiCellWidget(b_box, iii,iii,0,2);
|
||
|
++iii;
|
||
|
QPushButton* button = new QPushButton( i18n("Take Local"), b_box );
|
||
|
connect ( button, SIGNAL( clicked()), this, SLOT (takeIncidence1() ) );
|
||
|
button = new QPushButton( i18n("Take New"), b_box );
|
||
|
connect ( button, SIGNAL( clicked()), this, SLOT (takeIncidence2() ) );
|
||
|
button = new QPushButton( i18n("Take Both"), b_box );
|
||
|
connect ( button, SIGNAL( clicked()), this, SLOT (takeBoth() ) );
|
||
|
topLayout->setSpacing(spacingHint());
|
||
|
topLayout->setMargin(marginHint());
|
||
|
// text is not translated, because text has to be set later
|
||
|
mInc1lab = new QLabel ( i18n("Local incidence"), topFrame);
|
||
|
topLayout->addWidget(mInc1lab ,iii,0);
|
||
|
mInc1Sumlab = new QLabel ( i18n("Local incidence summary"), topFrame);
|
||
|
topLayout->addMultiCellWidget(mInc1Sumlab, iii,iii,1,2);
|
||
|
++iii;
|
||
|
topLayout->addWidget( new QLabel ( i18n("Last modified:"), topFrame) ,iii,0);
|
||
|
mMod1lab = new QLabel ( "Set Last modified", topFrame);
|
||
|
topLayout->addWidget(mMod1lab,iii,1);
|
||
|
showDetails1 = new QPushButton( i18n("Show Details"),topFrame );
|
||
|
connect ( showDetails1, SIGNAL( clicked()), this, SLOT (showIncidence1() ) );
|
||
|
topLayout->addWidget(showDetails1,iii,2);
|
||
|
++iii;
|
||
|
|
||
|
mInc2lab = new QLabel ( "Local incidence", topFrame);
|
||
|
topLayout->addWidget(mInc2lab,iii,0);
|
||
|
mInc2Sumlab = new QLabel ( "Local incidence summary", topFrame);
|
||
|
topLayout->addMultiCellWidget(mInc2Sumlab, iii,iii,1,2);
|
||
|
++iii;
|
||
|
topLayout->addWidget( new QLabel ( i18n("Last modified:"), topFrame) ,iii,0);
|
||
|
mMod2lab = new QLabel ( "Set Last modified", topFrame);
|
||
|
topLayout->addWidget(mMod2lab,iii,1);
|
||
|
showDetails2 = new QPushButton( i18n("Show Details"), topFrame);
|
||
|
connect ( showDetails2, SIGNAL( clicked()), this, SLOT (showIncidence2() ) );
|
||
|
topLayout->addWidget(showDetails2,iii,2);
|
||
|
++iii;
|
||
|
//
|
||
|
#if 0
|
||
|
// commented out for now, because the diff code has too many bugs
|
||
|
diffBut = new QPushButton( i18n("Show Differences"), topFrame );
|
||
|
connect ( diffBut, SIGNAL( clicked()), this, SLOT ( showDiff() ) );
|
||
|
topLayout->addMultiCellWidget(diffBut, iii,iii,0,2);
|
||
|
++iii;
|
||
|
#else
|
||
|
diffBut = 0;
|
||
|
#endif
|
||
|
mBg = new QButtonGroup ( 1, Qt::Horizontal, i18n("Sync Preferences"), topFrame);
|
||
|
topLayout->addMultiCellWidget(mBg, iii,iii,0,2);
|
||
|
++iii;
|
||
|
mBg->insert( new QRadioButton ( i18n("Take local entry on conflict"), mBg ), KIncidenceChooser::local);
|
||
|
mBg->insert( new QRadioButton ( i18n("Take new (remote) entry on conflict"), mBg ), KIncidenceChooser::remote);
|
||
|
mBg->insert( new QRadioButton ( i18n("Take newest entry on conflict"), mBg ), KIncidenceChooser::newest );
|
||
|
mBg->insert( new QRadioButton ( i18n("Ask for every entry on conflict"), mBg ),KIncidenceChooser::ask );
|
||
|
mBg->insert( new QRadioButton ( i18n("Take both on conflict"), mBg ), KIncidenceChooser::both );
|
||
|
mBg->setButton ( chooseMode );
|
||
|
mTbL = 0;
|
||
|
mTbN = 0;
|
||
|
mDisplayDiff = 0;
|
||
|
choosedIncidence = 0;
|
||
|
button = new QPushButton( i18n("Apply This to All Conflicts of This Sync"), topFrame );
|
||
|
connect ( button, SIGNAL( clicked()), this, SLOT ( setSyncMode() ) );
|
||
|
topLayout->addMultiCellWidget(button, iii,iii,0,2);
|
||
|
}
|
||
|
|
||
|
KIncidenceChooser::~KIncidenceChooser()
|
||
|
{
|
||
|
if ( mTbL ) delete mTbL;
|
||
|
if ( mTbN ) delete mTbN;
|
||
|
if ( mDisplayDiff ) {
|
||
|
delete mDisplayDiff;
|
||
|
delete diff;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void KIncidenceChooser::setIncidence( KCal::Incidence* local ,KCal::Incidence* remote )
|
||
|
{
|
||
|
mInc1 = local;
|
||
|
mInc2 = remote;
|
||
|
setLabels();
|
||
|
|
||
|
}
|
||
|
KCal::Incidence* KIncidenceChooser::getIncidence( )
|
||
|
{
|
||
|
|
||
|
KCal::Incidence* retval = choosedIncidence;
|
||
|
if ( chooseMode == KIncidenceChooser::local )
|
||
|
retval = mInc1;
|
||
|
else if ( chooseMode == KIncidenceChooser::remote )
|
||
|
retval = mInc2;
|
||
|
else if ( chooseMode == KIncidenceChooser::both ) {
|
||
|
retval = 0;
|
||
|
}
|
||
|
else if ( chooseMode == KIncidenceChooser::newest ) {
|
||
|
if ( mInc1->lastModified() == mInc2->lastModified())
|
||
|
retval = 0;
|
||
|
if ( mInc1->lastModified() > mInc2->lastModified() )
|
||
|
retval = mInc1;
|
||
|
else
|
||
|
retval = mInc2;
|
||
|
}
|
||
|
return retval;
|
||
|
}
|
||
|
|
||
|
void KIncidenceChooser::setSyncMode()
|
||
|
{
|
||
|
chooseMode = mBg->selectedId ();
|
||
|
if ( chooseMode != KIncidenceChooser::ask )
|
||
|
QDialog::accept();
|
||
|
|
||
|
}
|
||
|
|
||
|
void KIncidenceChooser::useGlobalMode()
|
||
|
{
|
||
|
if ( chooseMode != KIncidenceChooser::ask )
|
||
|
QDialog::reject();
|
||
|
}
|
||
|
|
||
|
void KIncidenceChooser::setLabels()
|
||
|
{
|
||
|
KCal::Incidence* inc = mInc1;
|
||
|
QLabel* des = mInc1lab;
|
||
|
QLabel * sum = mInc1Sumlab;
|
||
|
|
||
|
|
||
|
if ( inc->type() == "Event" ) {
|
||
|
des->setText( i18n( "Local Event") );
|
||
|
sum->setText( inc->summary().left( 30 ));
|
||
|
if ( diffBut )
|
||
|
diffBut->setEnabled( true );
|
||
|
}
|
||
|
else if ( inc->type() == "Todo" ) {
|
||
|
des->setText( i18n( "Local Todo") );
|
||
|
sum->setText( inc->summary().left( 30 ));
|
||
|
if ( diffBut )
|
||
|
diffBut->setEnabled( true );
|
||
|
|
||
|
}
|
||
|
else if ( inc->type() == "Journal" ) {
|
||
|
des->setText( i18n( "Local Journal") );
|
||
|
sum->setText( inc->description().left( 30 ));
|
||
|
if ( diffBut )
|
||
|
diffBut->setEnabled( false );
|
||
|
}
|
||
|
mMod1lab->setText( KGlobal::locale()->formatDateTime(inc->lastModified() ));
|
||
|
inc = mInc2;
|
||
|
des = mInc2lab;
|
||
|
sum = mInc2Sumlab;
|
||
|
if ( inc->type() == "Event" ) {
|
||
|
des->setText( i18n( "New Event") );
|
||
|
sum->setText( inc->summary().left( 30 ));
|
||
|
}
|
||
|
else if ( inc->type() == "Todo" ) {
|
||
|
des->setText( i18n( "New Todo") );
|
||
|
sum->setText( inc->summary().left( 30 ));
|
||
|
|
||
|
}
|
||
|
else if ( inc->type() == "Journal" ) {
|
||
|
des->setText( i18n( "New Journal") );
|
||
|
sum->setText( inc->description().left( 30 ));
|
||
|
|
||
|
}
|
||
|
mMod2lab->setText( KGlobal::locale()->formatDateTime(inc->lastModified() ));
|
||
|
}
|
||
|
|
||
|
void KIncidenceChooser::showIncidence1()
|
||
|
{
|
||
|
if ( mTbL ) {
|
||
|
if ( mTbL->isVisible() ) {
|
||
|
showDetails1->setText( i18n("Show Details"));
|
||
|
mTbL->hide();
|
||
|
} else {
|
||
|
showDetails1->setText( i18n("Hide Details"));
|
||
|
mTbL->show();
|
||
|
mTbL->raise();
|
||
|
}
|
||
|
return;
|
||
|
}
|
||
|
mTbL = new KDialogBase( this, "", false /*not modal*/, mInc1lab->text(), KDialogBase::Ok );
|
||
|
mTbL->setEscapeButton( KDialogBase::Ok );
|
||
|
connect( mTbL, SIGNAL( okClicked() ), this, SLOT( detailsDialogClosed() ) );
|
||
|
QTextBrowser* textBrowser = new QTextBrowser( mTbL );
|
||
|
mTbL->setMainWidget( textBrowser );
|
||
|
textBrowser->setText( KCal::IncidenceFormatter::extensiveDisplayString( mInc1 ) );
|
||
|
mTbL->setMinimumSize( 400, 400 );
|
||
|
showDetails1->setText( i18n("Hide Details"));
|
||
|
mTbL->show();
|
||
|
mTbL->raise();
|
||
|
}
|
||
|
|
||
|
void KIncidenceChooser::detailsDialogClosed()
|
||
|
{
|
||
|
KDialogBase* dialog = static_cast<KDialogBase *>( const_cast<QObject *>( sender() ) );
|
||
|
if ( dialog == mTbL )
|
||
|
showDetails1->setText( i18n( "Show details..." ) );
|
||
|
else
|
||
|
showDetails2->setText( i18n( "Show details..." ) );
|
||
|
}
|
||
|
|
||
|
void KIncidenceChooser::showDiff()
|
||
|
{
|
||
|
if ( mDisplayDiff ) {
|
||
|
mDisplayDiff->show();
|
||
|
mDisplayDiff->raise();
|
||
|
return;
|
||
|
}
|
||
|
mDisplayDiff = new KPIM::HTMLDiffAlgoDisplay (this);
|
||
|
if ( mInc1->summary().left( 20 ) != mInc2->summary().left( 20 ) )
|
||
|
mDisplayDiff->setCaption( i18n( "Differences of %1 and %2").arg( mInc1->summary().left( 20 ) ).arg( mInc2->summary().left( 20 ) ) );
|
||
|
else
|
||
|
mDisplayDiff->setCaption( i18n( "Differences of %1").arg( mInc1->summary().left( 20 ) ) );
|
||
|
|
||
|
diff = new KPIM::CalendarDiffAlgo( mInc1, mInc2);
|
||
|
diff->setLeftSourceTitle( i18n( "Local entry"));
|
||
|
diff->setRightSourceTitle(i18n( "New (remote) entry") );
|
||
|
diff->addDisplay( mDisplayDiff );
|
||
|
diff->run();
|
||
|
mDisplayDiff->show();
|
||
|
mDisplayDiff->raise();
|
||
|
}
|
||
|
|
||
|
void KIncidenceChooser::showIncidence2()
|
||
|
{
|
||
|
if ( mTbN ) {
|
||
|
if ( mTbN->isVisible() ) {
|
||
|
showDetails2->setText( i18n("Show Details"));
|
||
|
mTbN->hide();
|
||
|
} else {
|
||
|
showDetails2->setText( i18n("Hide Details"));
|
||
|
mTbN->show();
|
||
|
mTbN->raise();
|
||
|
}
|
||
|
return;
|
||
|
}
|
||
|
mTbN = new KDialogBase( this, "", false /*not modal*/, mInc2lab->text(), KDialogBase::Ok );
|
||
|
mTbN->setEscapeButton( KDialogBase::Ok );
|
||
|
connect( mTbN, SIGNAL( okClicked() ), this, SLOT( detailsDialogClosed() ) );
|
||
|
QTextBrowser* textBrowser = new QTextBrowser( mTbN );
|
||
|
mTbN->setMainWidget( textBrowser );
|
||
|
textBrowser->setText( KCal::IncidenceFormatter::extensiveDisplayString( mInc2 ) );
|
||
|
mTbN->setMinimumSize( 400, 400 );
|
||
|
showDetails2->setText( i18n("Hide Details"));
|
||
|
mTbN->show();
|
||
|
mTbN->raise();
|
||
|
}
|
||
|
|
||
|
void KIncidenceChooser::takeIncidence1()
|
||
|
{
|
||
|
choosedIncidence = mInc1;
|
||
|
QDialog::accept();
|
||
|
}
|
||
|
|
||
|
void KIncidenceChooser::takeIncidence2()
|
||
|
{
|
||
|
choosedIncidence = mInc2;
|
||
|
QDialog::accept();
|
||
|
}
|
||
|
|
||
|
void KIncidenceChooser::takeBoth()
|
||
|
{
|
||
|
|
||
|
choosedIncidence = 0;
|
||
|
QDialog::accept();
|
||
|
}
|
||
|
|
||
|
|
||
|
#include "kincidencechooser.moc"
|