diff options
Diffstat (limited to 'kpilot/dbviewerWidget.cpp')
-rw-r--r-- | kpilot/dbviewerWidget.cpp | 440 |
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()); + } +} + + + + + |