summaryrefslogtreecommitdiffstats
path: root/kpilot/conduits/abbrowserconduit/resolutionDialog.cc
diff options
context:
space:
mode:
Diffstat (limited to 'kpilot/conduits/abbrowserconduit/resolutionDialog.cc')
-rw-r--r--kpilot/conduits/abbrowserconduit/resolutionDialog.cc323
1 files changed, 323 insertions, 0 deletions
diff --git a/kpilot/conduits/abbrowserconduit/resolutionDialog.cc b/kpilot/conduits/abbrowserconduit/resolutionDialog.cc
new file mode 100644
index 000000000..2749074f8
--- /dev/null
+++ b/kpilot/conduits/abbrowserconduit/resolutionDialog.cc
@@ -0,0 +1,323 @@
+/* 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 [email protected]
+*/
+
+#include "options.h"
+
+#include <qtimer.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+#include <qlistview.h>
+#include <qregexp.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 : QCheckListItem {
+public:
+ ResolutionCheckListItem(ResolutionItem*it, ResolutionTable*tb,
+ QListView*parent);
+ ResolutionCheckListItem(QString header, QString text,
+ ResolutionCheckListItem*parent);
+ ~ResolutionCheckListItem() {};
+ virtual void stateChange(bool newstate);
+ virtual void setValue(QString text);
+ virtual void setCaption(QString 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
+ */
+ QString fCaption;
+ /* The currrent value of the entry (for controllers this changes with the
+ * selected button */
+ QString fText;
+};
+
+
+ResolutionCheckListItem::ResolutionCheckListItem(ResolutionItem*it,
+ ResolutionTable*tb, QListView*parent) :
+ QCheckListItem(parent, QString::null, QCheckListItem::Controller),
+ fResItem(it),
+ isController(true),
+ fCaption(it?(it->fName):(QString::null)),
+ fText(it?(it->fResolved):(QString::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;
+ QString testtext(QString::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(QString text, QString header,
+ ResolutionCheckListItem*parent) :
+ QCheckListItem(parent, QString(), QCheckListItem::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(QString text)
+{
+ FUNCTIONSETUP;
+ fText=text;
+ if (isController && fResItem)
+ {
+ fResItem->fResolved=text;
+ }
+ updateText();
+}
+
+void ResolutionCheckListItem::setCaption(QString caption)
+{
+ fCaption=caption;
+ updateText();
+}
+
+void ResolutionCheckListItem::updateText()
+{
+ QString 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(QRegExp(CSL1("\n")),
+ i18n("Denoting newlines in Address entries. No need to translate", " | "));
+ setText(0, newText);
+}
+
+
+
+/*****************************************************************
+ *
+ *****************************************************************/
+
+ResolutionDlg::ResolutionDlg( QWidget* parent, KPilotLink*fH,
+ const QString &caption, const QString &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 QTimer(this, "TickleTimer");
+
+ if (tickleTimer)
+ {
+ connect( tickleTimer, SIGNAL(timeout()), this, SLOT(_tickle()));
+ // tickle the palm every 10 seconds to prevent a timeout until the
+ // sync is really finished.
+ tickleTimer->start( 10000 );
+ }
+
+ connect(fWidget->fKeepBoth, SIGNAL(clicked()), SLOT(slotKeepBoth()));
+ connect(fWidget->fBackupValues, SIGNAL(clicked()), SLOT(slotUseBackup()));
+ connect(fWidget->fPalmValues, SIGNAL(clicked()), SLOT(slotUsePalm()));
+ connect(fWidget->fPCValues, SIGNAL(clicked()), 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
+}