summaryrefslogtreecommitdiffstats
path: root/kpilot/dbviewerWidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kpilot/dbviewerWidget.cpp')
-rw-r--r--kpilot/dbviewerWidget.cpp440
1 files changed, 440 insertions, 0 deletions
diff --git a/kpilot/dbviewerWidget.cpp b/kpilot/dbviewerWidget.cpp
new file mode 100644
index 0000000..c1dcbd2
--- /dev/null
+++ b/kpilot/dbviewerWidget.cpp
@@ -0,0 +1,440 @@
+/* dbViewerWidget.cpp KPilot
+**
+** Copyright (C) 2003 by Dan Pilone.
+** Copyright (C) 2003 Reinhold Kainhofer <reinhold@kainhofer.com>
+** Written 2003 by Reinhold Kainhofer and Adriaan de Groot
+**
+** This is the generic DB viewer widget.
+*/
+
+/*
+** 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 <unistd.h>
+#include <stdio.h>
+
+#include <pi-file.h>
+#include <pi-dlp.h>
+
+#include <tqlayout.h>
+#include <tqdir.h>
+#include <tqregexp.h>
+#include <tqlistview.h>
+
+#include <tdelistbox.h>
+#include <ktextedit.h>
+#include <kpushbutton.h>
+#include <kcombobox.h>
+#include <tdemessagebox.h>
+
+#include "listCat.h"
+#include "listItems.h"
+
+#include "dbviewerWidget.h"
+#include "pilotLocalDatabase.h"
+#include "pilotDatabase.h"
+#include "pilotRecord.h"
+#include "dbFlagsEditor.h"
+#include "dbRecordEditor.h"
+#include "dbAppInfoEditor.h"
+#include "kpilotConfig.h"
+
+
+#include "dbviewerWidget.moc"
+
+
+GenericDBWidget::GenericDBWidget(TQWidget *parent, const TQString &dbpath) :
+ PilotComponent(parent,"component_generic",dbpath), fDB(0L)
+{
+ FUNCTIONSETUP;
+ setupWidget();
+ fRecList.setAutoDelete(true);
+}
+
+
+void GenericDBWidget::setupWidget()
+{
+ TQGridLayout *g = new TQGridLayout( this, 1, 1, SPACING);
+
+ fDBList = new TDEListBox( this );
+ g->addWidget( fDBList, 0, 0 );
+ fDBType = new KComboBox( FALSE, this );
+ g->addWidget( fDBType, 1, 0 );
+ fDBType->insertItem( i18n( "All Databases" ) );
+ fDBType->insertItem( i18n( "Only Applications (*.prc)" ) );
+ fDBType->insertItem( i18n( "Only Databases (*.pdb)" ) );
+
+ TQGridLayout *g1 = new TQGridLayout( 0, 1, 1);
+ fDBInfo = new KTextEdit( this );
+ fDBInfo->setSizePolicy( TQSizePolicy( (TQSizePolicy::SizeType)3, (TQSizePolicy::SizeType)0, 0, 0, fDBInfo->sizePolicy().hasHeightForWidth() ) );
+ fDBInfo->setReadOnly( TRUE );
+ g1->addWidget( fDBInfo, 0, 0 );
+ fDBInfoButton = new KPushButton( i18n( "General Database &Information" ), this );
+ g1->addWidget( fDBInfoButton, 1, 0 );
+ fAppInfoButton = new KPushButton( i18n( "&Application Info Block (Categories etc.)" ), this );
+ g1->addWidget( fAppInfoButton, 2, 0 );
+
+ TQGridLayout *g2 = new TQGridLayout( 0, 1, 1);
+ fRecordList = new TDEListView( this );
+ g2->addMultiCellWidget( fRecordList, 0, 0, 0, 2 );
+ fRecordList->addColumn(i18n("Rec. Nr."));
+ fRecordList->addColumn(i18n("Length"));
+ fRecordList->addColumn(i18n("Record ID"));
+ fRecordList->setAllColumnsShowFocus(true);
+ fRecordList->setResizeMode( TDEListView::LastColumn );
+ fRecordList->setFullWidth( TRUE );
+ fRecordList->setItemsMovable( FALSE );
+
+ fAddRecord = new KPushButton( i18n("&Add..."), this );
+ g2->addWidget( fAddRecord, 1, 0 );
+ fEditRecord = new KPushButton( i18n("&Edit..."), this );
+ g2->addWidget( fEditRecord, 1, 1 );
+ fDeleteRecord = new KPushButton( i18n("&Delete"), this );
+ g2->addWidget( fDeleteRecord, 1, 2 );
+
+ g1->addLayout( g2, 3, 0 );
+
+
+ g->addMultiCellLayout( g1, 0, 1, 1, 1 );
+ resize( TQSize(682, 661).expandedTo(minimumSizeHint()) );
+
+ connect(fDBList, TQT_SIGNAL(highlighted(const TQString &)),
+ this, TQT_SLOT(slotSelected(const TQString &)));
+ connect(fDBType, TQT_SIGNAL(activated(int)),
+ this, TQT_SLOT(slotDBType(int)));
+ connect(fDBInfoButton, TQT_SIGNAL(clicked()),
+ this, TQT_SLOT(slotShowDBInfo()));
+ connect(fAppInfoButton, TQT_SIGNAL(clicked()),
+ this, TQT_SLOT(slotShowAppInfo()));
+ connect(fAddRecord, TQT_SIGNAL(clicked()),
+ this, TQT_SLOT(slotAddRecord()));
+ connect(fEditRecord, TQT_SIGNAL(clicked()),
+ this, TQT_SLOT(slotEditRecord()));
+ connect(fDeleteRecord, TQT_SIGNAL(clicked()),
+ this, TQT_SLOT(slotDeleteRecord()));
+ connect(fRecordList, TQT_SIGNAL(executed(TQListViewItem*)),
+ this, TQT_SLOT(slotEditRecord(TQListViewItem*)));
+
+}
+
+GenericDBWidget::~GenericDBWidget()
+{
+ FUNCTIONSETUP;
+ if (fDB) KPILOT_DELETE(fDB);
+}
+
+
+void GenericDBWidget::showComponent()
+{
+ FUNCTIONSETUP;
+ fDBInfo->setText(TQString());
+ slotDBType(0);
+
+ fDBList->show();
+ fDBInfo->show();
+}
+
+void GenericDBWidget::hideComponent()
+{
+ reset();
+}
+
+void GenericDBWidget::slotSelected(const TQString &dbname)
+{
+ FUNCTIONSETUP;
+#ifdef DEBUG
+ DEBUGKPILOT << fname << ": Selected DB " << dbname << endl;
+#endif
+ struct DBInfo dbinfo;
+ TQString display;
+ fRecList.clear();
+ fRecordList->clear();
+
+ if (fDB) KPILOT_DELETE(fDB);
+ currentDB=dbname;
+
+ if (!shown) return;
+
+ if (dbname.endsWith(CSL1(".pdb")) || dbname.endsWith(CSL1(".PDB")))
+ {
+ // We are dealing with a database
+ currentDBtype=eDatabase;
+
+ currentDB.remove( TQRegExp(CSL1(".(pdb|PDB)$")) );
+
+ fDB=new PilotLocalDatabase(dbPath(), currentDB, false);
+ if (!fDB || !fDB->isOpen())
+ {
+ fDBInfo->setText(i18n("<B>Warning:</B> Cannot read "
+ "database file %1.").arg(currentDB));
+ return;
+ }
+ dbinfo=fDB->getDBInfo();
+ display.append(i18n("<B>Database:</B> %1, %2 records<BR>")
+ .arg(TQString::fromLatin1(dbinfo.name)).arg(fDB->recordCount()));
+ char buff[5];
+ set_long(buff, dbinfo.type);
+ buff[4]='\0';
+ TQString tp = TQString::fromLatin1(buff);
+ set_long(buff, dbinfo.creator);
+ buff[4]='\0';
+ TQString cr = TQString::fromLatin1(buff);
+ display.append(i18n("<B>Type:</B> %1, <B>Creator:</B> %2<br><br>").arg(tp).arg(cr));
+
+ int currentRecord = 0;
+ PilotRecord *pilotRec;
+
+#ifdef DEBUG
+ DEBUGKPILOT << fname << ": Reading database "<<dbname<<"..." << endl;
+#endif
+
+ while ((pilotRec = fDB->readRecordByIndex(currentRecord)) != 0L)
+ {
+// if (!(pilotRec->isDeleted()) )
+ {
+ PilotListViewItem*item=new PilotListViewItem(fRecordList,
+ TQString::number(currentRecord), TQString::number(pilotRec->size()),
+ TQString::number(pilotRec->id()),
+ TQString(),
+ pilotRec->id(), pilotRec);
+ item->setNumericCol(0, true);
+ item->setNumericCol(1, true);
+ item->setNumericCol(2, true);
+ }
+ fRecList.append(pilotRec);
+
+ currentRecord++;
+ }
+
+#ifdef DEBUG
+ DEBUGKPILOT << fname
+ << ": Total " << currentRecord << " records" << endl;
+#endif
+
+ }
+ else
+ {
+ // we are dealing with an application
+ currentDBtype=eApplication;
+
+ TQCString filename = TQFile::encodeName(dbPath() + CSL1("/") + dbname);
+ const char *s = filename;
+ struct pi_file *pf = pi_file_open(const_cast<char *>(s));
+ if (!pf)
+ {
+ fDBInfo->setText(i18n("<B>Warning:</B> Cannot read "
+ "application file %1.").arg(dbname));
+ return;
+ }
+#if PILOT_LINK_NUMBER < PILOT_LINK_0_12_0
+ if (pi_file_get_info(pf,&dbinfo))
+ {
+ fDBInfo->setText(i18n("<B>Warning:</B> Cannot read "
+ "application file %1.").arg(dbname));
+ return;
+ }
+#else
+ pi_file_get_info(pf,&dbinfo);
+#endif
+ display.append(i18n("<B>Application:</B> %1<BR><BR>").arg(dbname));
+ }
+ enableWidgets(currentDBtype==eDatabase);
+
+ TQDateTime ttime;
+
+ ttime.setTime_t(dbinfo.createDate);
+ display.append(i18n("Created: %1<BR>").arg(ttime.toString()));
+
+ ttime.setTime_t(dbinfo.modifyDate);
+ display.append(i18n("Modified: %1<BR>").arg(ttime.toString()));
+
+ ttime.setTime_t(dbinfo.backupDate);
+ display.append(i18n("Backed up: %1<BR>").arg(ttime.toString()));
+
+ fDBInfo->setText(display);
+}
+
+void GenericDBWidget::slotDBType(int mode)
+{
+ FUNCTIONSETUP;
+ if (!shown) return;
+
+ reset();
+
+ TQDir dir(dbPath());
+ switch (mode)
+ {
+ case 1:
+ dir.setNameFilter(CSL1("*.prc")); break;
+ case 2:
+ dir.setNameFilter(CSL1("*.pdb")); break;
+ case 0:
+ default:
+ dir.setNameFilter(CSL1("*.pdb;*.prc")); break;
+ }
+ TQStringList l = dir.entryList();
+ fDBList->insertStringList(l);
+}
+
+void GenericDBWidget::reset()
+{
+ FUNCTIONSETUP;
+ fDBList->clear();
+ fDBInfo->clear();
+ fRecordList->clear();
+ if (fDB) KPILOT_DELETE(fDB);
+ currentDB=TQString();
+}
+
+void GenericDBWidget::slotAddRecord()
+{
+ FUNCTIONSETUP;
+ pi_buffer_t *b = pi_buffer_new(0);
+ PilotRecord *rec=new PilotRecord(b, 0, 0, 0);
+ PilotListViewItem*item=new PilotListViewItem(fRecordList,
+ TQString::number(-1), TQString::number(rec->size()),
+ TQString::number(rec->id()), TQString(),
+ rec->id(), rec);
+ if (slotEditRecord(item))
+ {
+ fRecList.append(rec);
+ }
+ else
+ {
+ KPILOT_DELETE(item);
+ KPILOT_DELETE(rec);
+ }
+}
+
+bool GenericDBWidget::slotEditRecord(TQListViewItem*item)
+{
+ FUNCTIONSETUP;
+ PilotListViewItem*currRecItem=dynamic_cast<PilotListViewItem*>(item);
+ if (currRecItem)
+ {
+ PilotRecord*rec=(PilotRecord*)currRecItem->rec();
+ int nr=currRecItem->text(0).toInt();
+ DBRecordEditor*dlg=new DBRecordEditor(rec, nr, this);
+ if (dlg->exec())
+ {
+ currRecItem->setText(1, TQString::number(rec->size()));
+ currRecItem->setText(2, TQString::number(rec->id()));
+ fRecordList->triggerUpdate();
+ writeRecord(rec);
+ KPILOT_DELETE(dlg);
+ return true;
+ }
+ KPILOT_DELETE(dlg);
+ }
+ else
+ {
+ // Either nothing selected, or some error occurred...
+ KMessageBox::information(this, i18n("You must select a record for editing."), i18n("No Record Selected"), CSL1("norecordselected"));
+ }
+ return false;
+}
+void GenericDBWidget::slotEditRecord()
+{
+ slotEditRecord(fRecordList->selectedItem());
+}
+
+void GenericDBWidget::slotDeleteRecord()
+{
+ FUNCTIONSETUP;
+ PilotListViewItem*currRecItem=dynamic_cast<PilotListViewItem*>(fRecordList->selectedItem());
+ if (currRecItem && (KMessageBox::questionYesNo(this, i18n("<qt>Do you really want to delete the selected record? This cannot be undone.<br><br>Delete record?<qt>"), i18n("Deleting Record"), KStdGuiItem::del(), KStdGuiItem::cancel())==KMessageBox::Yes) )
+ {
+ PilotRecord*rec=(PilotRecord*)currRecItem->rec();
+ rec->setDeleted();
+ writeRecord(rec);
+ // fRecordList->triggerUpdate();
+ KPILOT_DELETE(currRecItem);
+ }
+}
+
+void GenericDBWidget::slotShowAppInfo()
+{
+ FUNCTIONSETUP;
+ if (!fDB) return;
+ char*appBlock=new char[0xFFFF];
+ int len=fDB->readAppBlock((unsigned char*)appBlock, 0xFFFF);
+ DBAppInfoEditor*dlg=new DBAppInfoEditor(appBlock, len, this);
+ if (dlg->exec())
+ {
+ fDB->writeAppBlock( (unsigned char*)(dlg->appInfo), dlg->len );
+
+ KPilotConfig::addAppBlockChangedDatabase(getCurrentDB());
+ KPilotSettings::writeConfig();
+ }
+ KPILOT_DELETE(dlg);
+ delete[] appBlock;
+}
+
+void GenericDBWidget::slotShowDBInfo()
+{
+ FUNCTIONSETUP;
+ if ( !fDB || !shown ) return;
+ DBInfo db=fDB->getDBInfo();
+ DBFlagsEditor*dlg=new DBFlagsEditor(&db, this);
+ if (dlg->exec())
+ {
+#ifdef DEBUG
+ DEBUGKPILOT<<"OK pressed, assiging DBInfo, flags="<<
+ db.flags<<", miscFlag="<<db.miscFlags<<endl;
+#endif
+ fDB->setDBInfo(db);
+
+ KPilotConfig::addFlagsChangedDatabase(getCurrentDB());
+ KPilotSettings::writeConfig();
+
+ slotSelected(fDBList->currentText());
+ }
+ KPILOT_DELETE(dlg);
+}
+
+void GenericDBWidget::enableWidgets(bool enable)
+{
+ //FUNCTIONSETUP;
+ fDBInfoButton->setEnabled(enable);
+ fAppInfoButton->setEnabled(enable);
+ fRecordList->setEnabled(enable);
+ fAddRecord->setEnabled(enable);
+ fEditRecord->setEnabled(enable);
+ fDeleteRecord->setEnabled(enable);
+}
+
+void GenericDBWidget::writeRecord(PilotRecord*r)
+{
+ // FUNCTIONSETUP;
+ if (fDB && r)
+ {
+ fDB->writeRecord(r);
+ markDBDirty(getCurrentDB());
+ }
+}
+
+
+
+
+