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.
tdepim/kpilot/conduits/abbrowserconduit/resolutionDialog.cc

324 lines
8.4 KiB

/* 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 <tqtimer.h>
#include <tqlabel.h>
#include <tqpushbutton.h>
#include <tqlistview.h>
#include <tqregexp.h>
#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<ResolutionCheckListItem*>(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="<<it->fExistItems<<", PC="<<
it->fEntries[0]<<", Palm="<<it->fEntries[1]<<", Backup="<<
it->fEntries[2]<<endl;
#endif
bool hasValidValues=false;
if (it->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
}