/* resolutionDialog.h KPilot ** ** Copyright (C) 2002-2003 by Reinhold Kainhofer ** ** See the .cc file for an explanation of what this file is for. */ /* ** 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 in a file called COPYING; if not, write to ** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, ** MA 02110-1301, USA. */ /* ** Bug reports and questions can be sent to kde-pim@kde.org */ #include "options.h" #include #include #include #include #include #include "resolutionTable.h" #include "resolutionDialog_base.h" #include "resolutionDialog.moc" /** This class describes the controllers of the conflict resolution ListView, * as well as its child radio buttons. There are two different constructors * for them. * Each controller has three child radio buttons, and if any of them is * activated (stateChange), it sets the text of its parent (which is the * controller, which is an instance of ResolutionCheckListItem, too). **/ class ResolutionCheckListItem : TQCheckListItem { public: ResolutionCheckListItem(ResolutionItem*it, ResolutionTable*tb, TQListView*parent); ResolutionCheckListItem(TQString header, TQString text, ResolutionCheckListItem*parent); ~ResolutionCheckListItem() {}; virtual void stateChange(bool newstate); virtual void setValue(TQString text); virtual void setCaption(TQString caption); protected: void updateText(); /* fResItem is only set for the controller */ ResolutionItem*fResItem; bool isController; /* The description of the entry, e.g. Backup, PC, Palm for the radio buttons, * of the field name for the controllers */ TQString fCaption; /* The currrent value of the entry (for controllers this changes with the * selected button */ TQString fText; }; ResolutionCheckListItem::ResolutionCheckListItem(ResolutionItem*it, ResolutionTable*tb, TQListView*parent) : TQCheckListItem(parent, TQString::null, TQCheckListItem::Controller), fResItem(it), isController(true), fCaption(it?(it->fName):(TQString::null)), fText(it?(it->fResolved):(TQString::null)) { FUNCTIONSETUP; if (it && tb) { // If all three texts are identical, there is no need for // resolution so don't show the radio items below bool itemsEqual=true; TQString testtext(TQString::null); const enum eExistItems its[3]={eExistsPC, eExistsPalm, eExistsBackup}; // get a valid text from a valid field, which will serve as the // test text for the comparison for (int i=0; i<3; i++) { if ((testtext.isNull()) && (it->fExistItems & its[i]) ) testtext=it->fEntries[i]; } for (int i=0; i<3; i++) { if (it->fExistItems & its[i]) itemsEqual&=(it->fEntries[i]==testtext); } if (!itemsEqual) { ResolutionCheckListItem*item; for (int i=2; i>=0; i--) { // Add only existing items if (it->fExistItems & its[i]) { item=new ResolutionCheckListItem(it->fEntries[i], tb->labels[i], this); item->setOn(it->fEntries[i]==fText); } } } updateText(); } setOpen(true); } ResolutionCheckListItem::ResolutionCheckListItem(TQString text, TQString header, ResolutionCheckListItem*parent) : TQCheckListItem(parent, TQString(), TQCheckListItem::RadioButton), fResItem(0L), isController(false), fCaption(header), fText(text) { updateText(); } void ResolutionCheckListItem::stateChange(bool newstate) { if (newstate && !isController) { ResolutionCheckListItem*par=static_cast(parent()); { par->setValue(fText); } } } void ResolutionCheckListItem::setValue(TQString text) { FUNCTIONSETUP; fText=text; if (isController && fResItem) { fResItem->fResolved=text; } updateText(); } void ResolutionCheckListItem::setCaption(TQString caption) { fCaption=caption; updateText(); } void ResolutionCheckListItem::updateText() { TQString newText(i18n("Entries in the resolution dialog. First the name of the field, then the entry from the Handheld or PC after the colon", "%1: %2").arg(fCaption).arg(fText)); newText.replace(TQRegExp(CSL1("\n")), i18n("Denoting newlines in Address entries. No need to translate", " | ")); setText(0, newText); } /***************************************************************** * *****************************************************************/ ResolutionDlg::ResolutionDlg( TQWidget* parent, KPilotLink*fH, const TQString &caption, const TQString &helpText, ResolutionTable*tab) : KDialogBase( parent, "ResolutionDlg", false, caption, Apply|Cancel, Apply), tickleTimer(0L), fHandle(fH), fTable(tab) { fWidget = new ResolutionDialogBase( this ); setMainWidget(fWidget); fTable->fResolution=SyncAction::eDoNothing; fWidget->fIntroText->setText(helpText); fillListView(); adjustButtons(tab); adjustSize(); resize(size()); if (fHandle) tickleTimer=new TQTimer(this, "TickleTimer"); if (tickleTimer) { connect( tickleTimer, TQT_SIGNAL(timeout()), this, TQT_SLOT(_tickle())); // tickle the palm every 10 seconds to prevent a timeout until the // sync is really finished. tickleTimer->start( 10000 ); } connect(fWidget->fKeepBoth, TQT_SIGNAL(clicked()), TQT_SLOT(slotKeepBoth())); connect(fWidget->fBackupValues, TQT_SIGNAL(clicked()), TQT_SLOT(slotUseBackup())); connect(fWidget->fPalmValues, TQT_SIGNAL(clicked()), TQT_SLOT(slotUsePalm())); connect(fWidget->fPCValues, TQT_SIGNAL(clicked()), TQT_SLOT(slotUsePC())); } void ResolutionDlg::adjustButtons(ResolutionTable*tab) { FUNCTIONSETUP; if (!tab) return; if (!(tab->fExistItems & eExistsPC) ) { fWidget->fPCValues->setText(i18n("Delete entry")); fWidget->fKeepBoth->setDisabled(TRUE); fWidget->fKeepBoth->hide(); } if (!(tab->fExistItems & eExistsPalm) ) { fWidget->fPalmValues->setText(i18n("Delete entry")); fWidget->fKeepBoth->setDisabled(TRUE); fWidget->fKeepBoth->hide(); } if (!(tab->fExistItems & eExistsBackup) ) { fWidget->fBackupValues->setDisabled(TRUE); } } void ResolutionDlg::fillListView() { FUNCTIONSETUP; fWidget->fResolutionView->setSorting(-1, FALSE); fWidget->fResolutionView->clear(); for ( ResolutionItem* it = fTable->last(); it; it = fTable->prev() ) { #ifdef DEBUG DEBUGKPILOT<<"Building table, items="<fExistItems<<", PC="<< it->fEntries[0]<<", Palm="<fEntries[1]<<", Backup="<< it->fEntries[2]<fExistItems & eExistsPC) hasValidValues = hasValidValues || !(it->fEntries[0].isEmpty()); if (it->fExistItems & eExistsPalm) hasValidValues = hasValidValues || !(it->fEntries[1].isEmpty()); if (it->fExistItems & eExistsBackup) hasValidValues = hasValidValues || !(it->fEntries[2].isEmpty()); if (hasValidValues) new ResolutionCheckListItem(it, fTable, fWidget->fResolutionView); } } void ResolutionDlg::slotKeepBoth() { if ( (fTable->fExistItems & eExistsPC) && (fTable->fExistItems & eExistsPalm) ) { fTable->fResolution=SyncAction::eDuplicate; } else { fTable->fResolution=SyncAction::eDoNothing; } done(fTable->fResolution); } void ResolutionDlg::slotUseBackup() { if (fTable->fExistItems & eExistsBackup) { fTable->fResolution=SyncAction::ePreviousSyncOverrides; } else { fTable->fResolution=SyncAction::eDoNothing; } done(fTable->fResolution); } void ResolutionDlg::slotUsePalm() { if (fTable->fExistItems & eExistsPalm) { fTable->fResolution=SyncAction::eHHOverrides; } else { fTable->fResolution=SyncAction::eDelete; } done(fTable->fResolution); } void ResolutionDlg::slotUsePC() { if (fTable->fExistItems & eExistsPC) { fTable->fResolution=SyncAction::ePCOverrides; } else { fTable->fResolution=SyncAction::eDelete; } done(fTable->fResolution); } void ResolutionDlg::slotApply() { fTable->fResolution=SyncAction::eAskUser; done(fTable->fResolution); } void ResolutionDlg::_tickle() { if (fHandle) fHandle->tickle(); } /* * Destroys the object and frees any allocated resources */ ResolutionDlg::~ResolutionDlg() { // no need to delete child widgets, Qt does it all for us }