diff options
author | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
---|---|---|
committer | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
commit | 460c52653ab0dcca6f19a4f492ed2c5e4e963ab0 (patch) | |
tree | 67208f7c145782a7e90b123b982ca78d88cc2c87 /libkdepim/kincidencechooser.cpp | |
download | tdepim-460c52653ab0dcca6f19a4f492ed2c5e4e963ab0.tar.gz tdepim-460c52653ab0dcca6f19a4f492ed2c5e4e963ab0.zip |
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdepim@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'libkdepim/kincidencechooser.cpp')
-rw-r--r-- | libkdepim/kincidencechooser.cpp | 326 |
1 files changed, 326 insertions, 0 deletions
diff --git a/libkdepim/kincidencechooser.cpp b/libkdepim/kincidencechooser.cpp new file mode 100644 index 000000000..0708cb4c4 --- /dev/null +++ b/libkdepim/kincidencechooser.cpp @@ -0,0 +1,326 @@ +/* + This file is part of libkdepim. + + Copyright (c) 2004 Lutz Rogowski <[email protected]> + + 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" |