Index: branches/KDE_1_1_BRANCH/kdeutils/kab/toplevelwidget.cc =================================================================== --- branches/KDE_1_1_BRANCH/kdeutils/kab/toplevelwidget.cc (revision 19985) +++ branches/KDE_1_1_BRANCH/kdeutils/kab/toplevelwidget.cc (revision 19986) @@ -1,271 +1,271 @@ /* -*- C++ -*- * This file implements the toplevel widget for the addressbook. * * the KDE addressbook. - * copyright: (C) Mirko Sucker, 1998 + * copyright: (C) Mirko Sucker, 1998, 1999 * license: GNU Public License, Version 2 * mail to: Mirko Sucker * requires: C++-compiler, STL, string class, * Nana for debugging * $Revision$ */ #include "toplevelwidget.h" #include "AddressBookAbout.h" #include #include #include #include #include #include #include "debug.h" ABTLWidget::ABTLWidget(const char* name) : KTMainWindow(name) { // ############################################################################ timer=new QTimer(this); connect(timer, SIGNAL(timeout()), SLOT(timeOut())); // ----- widget=new AddressWidget(this, 0, true); if(!constructMenu()) { QMessageBox::critical (this, i18n("Initialization failure"), i18n ("The program's menubar could not be constructed.")); ::exit(-1); } if(!constructStatusBar()) { QMessageBox::critical (this, i18n("Initialization failure"), i18n ("The program's statusbar could not be constructed.")); ::exit(-1); } menu->show(); setMenu(menu); status->show(); setStatusBar(status); setView(widget); widget->show(); updateRects(); createConnections(); widget->currentChanged(); // ----- be friendly: setStatus(i18n("KDE addressbook.")); // ############################################################################ } bool ABTLWidget::constructMenu() { // ############################################################################ menu=menuBar(); // ----- the file menu file=new QPopupMenu; CHECK(file!=0); saveItemID=file->insertItem(i18n("&Save"), widget, SLOT(save()), CTRL+Key_S); QPopupMenu *_export=new QPopupMenu; _export->insertItem (i18n("HTML table"), widget, SLOT(exportHTML())); /* export->insertItem (i18n("Plain text"), widget, SLOT(exportPlain())); export->insertItem (i18n("TeX table"), widget, SLOT(exportTeXTable())); export->insertItem (i18n("TeX labels"), widget, SLOT(exportTeXLabels())); */ exportItemID=file->insertItem(i18n("Export"), _export); file->insertSeparator(); searchItemID=file->insertItem(i18n("Search &entries"), widget, SLOT(search()), CTRL+Key_F); printItemID=file->insertItem(i18n("&Print"), widget, SLOT(print()), CTRL+Key_P); file->insertSeparator(); file->insertItem(i18n("&Quit"), KApplication::getKApplication(), SLOT(quit()), CTRL+Key_Q); // ----- the edit menu edit=new QPopupMenu; CHECK(edit!=0); copyItemID=edit->insertItem(i18n("&Copy"), widget, SLOT(copy()), CTRL+Key_W); edit->insertSeparator(); edit->insertItem(i18n("&Add entry"), widget, SLOT(add()), CTRL+Key_N); editItemID=edit->insertItem(i18n("&Edit entry"), widget, SLOT(edit()), CTRL+Key_E); removeItemID=edit->insertItem(i18n("&Remove entry"), widget, SLOT(remove()), CTRL+Key_R); edit->insertSeparator(); /* I had to disable it as it is not implemented and * needs to wait for a little time. On the other hand I did not * want to show entries without functionality. int result; result=edit->insertItem(i18n("Import &vCard"), widget, SLOT(importVCard()), CTRL+Key_V); edit->setItemEnabled(result, false); edit->insertSeparator(); */ mailItemID=edit->insertItem(i18n("&Mail"), widget, SLOT(mail()), CTRL+Key_M); talkItemID=edit->insertItem(i18n("&Talk"), widget, SLOT(talk()), CTRL+Key_T); browseItemID=edit->insertItem(i18n("&Browse"), widget, SLOT(browse()), CTRL+Key_B); // the about menu QPopupMenu* about=new QPopupMenu; about->insertItem(i18n("Help on Addressbook"), KApplication::getKApplication(), SLOT(appHelpActivated()), Key_F1); about->insertSeparator(); about->insertItem(i18n("About Addressbook"), this, SLOT(about()), CTRL+Key_A); about->insertItem(i18n("About &Qt"), this, SLOT(aboutQt())); about->insertItem(i18n("About &KDE"), KApplication::getKApplication(), SLOT(aboutKDE())); // fill the menu menu->insertItem(i18n("&File"), file); menu->insertItem(i18n("&Edit"), edit); menu->insertSeparator(); menu->insertItem(i18n("&About"), about); // ############################################################################ return true; } bool ABTLWidget::constructStatusBar() { // ############################################################################ // status=new KStatusBar(this); status=statusBar(); status->setInsertOrder(KStatusBar::RightToLeft); status->insertItem("20000/20000", Number); status->insertItem("", Text); // ############################################################################ return true; } void ABTLWidget::setNumber(int which, int count) { register bool GUARD; GUARD=false; // ############################################################################ LG(GUARD, "ABTLWidget::setNumber: updating statusbar.\n"); char buffer[256]; sprintf(buffer, "%i/%i", which, count); status->changeItem(buffer, Number); // ############################################################################ } void ABTLWidget::createConnections() { // ######################################################## connect(widget, SIGNAL(entrySelected(int, int)), SLOT(setNumber(int, int))); connect(KApplication::getKApplication(), SIGNAL(appearanceChanged()), SLOT(updateRects())); connect(widget, SIGNAL(sizeChanged()), SLOT(updateRects())); // ----- to set status messages connect(widget, SIGNAL(setStatus(const char*)), SLOT(setStatus(const char*))); // ----- to enable or disable menu items: connect(widget, SIGNAL(statusChanged(int)), SLOT(enableWidgets(int))); // ----- to clean up before closing: connect(KApplication::getKApplication(), SIGNAL(saveYourself()), SLOT(saveOurselfes())); // ############################################################################ } void ABTLWidget::aboutQt() { // ############################################################################ QMessageBox::aboutQt(this, i18n("About Qt")); // ############################################################################ } void ABTLWidget::about() { // ############################################################################ AddressBookAbout dialog(this); // ----- connect(&dialog, SIGNAL(sendEmail(const char*)), widget, SLOT(mail(const char*))); dialog.exec(); // ############################################################################ } void ABTLWidget::setStatus(const char* text) { // ############################################################################ status->changeItem(text, Text); timer->start(8000, false); // ############################################################################ } void ABTLWidget::timeOut() { // ############################################################################ status->changeItem("", Text); // ############################################################################ } void ABTLWidget::saveOurselfes() { register bool GUARD; GUARD=true; LG(GUARD, "ABTLWidget::saveOurselfes: called.\n"); REQUIRE(widget!=0); // ############################################################################ if(widget->AddressBook::save()) { LG(GUARD, "ABTLWidget::saveOurselfes: " "database saved.\n"); } else { LG(GUARD, "ABTLWidget::saveOurselfes: could not save " "database.\n"); } LG(GUARD, "ABTLWidget::saveOurselfes: switching to " "readonly mode.\n"); widget->setFileName(widget->fileName(), true, true); // this app will not be closed calling the destructors: LG(GUARD, "ABTLWidget::saveOurselfes: looking for stale " "lockfiles.\n"); ConfigDB::CleanLockFiles(0); LG(GUARD, "ABTLWidget::saveOurselfes: done.\n"); // ############################################################################ } void ABTLWidget::enableWidgets(int noOfEntries) { // ############################################################################ const int FileMenuItems[]= { saveItemID, exportItemID, printItemID }; const int EditMenuItems[]= { mailItemID, browseItemID, talkItemID, editItemID, removeItemID, copyItemID }; const int NoOfFileMenuItems=sizeof(FileMenuItems)/sizeof(FileMenuItems[0]); const int NoOfEditMenuItems=sizeof(EditMenuItems)/sizeof(EditMenuItems[0]); int count; // ----- for(count=0; countsetItemEnabled(FileMenuItems[count], noOfEntries!=0); } for(count=0; countsetItemEnabled(EditMenuItems[count], noOfEntries!=0); } file->setItemEnabled(searchItemID, noOfEntries>1); // ############################################################################ } #include "toplevelwidget.moc" Index: branches/KDE_1_1_BRANCH/kdeutils/kab/toplevelwidget.h =================================================================== --- branches/KDE_1_1_BRANCH/kdeutils/kab/toplevelwidget.h (revision 19985) +++ branches/KDE_1_1_BRANCH/kdeutils/kab/toplevelwidget.h (revision 19986) @@ -1,65 +1,64 @@ /* -*- C++ -*- * Qt widget for the addressbook example. * Declaration of the toplevel widget. * - * the Configuration Database library - * copyright: (C) Mirko Sucker, 1998 + * the KDE addressbook + * copyright: (C) Mirko Sucker, 1998, 1999 * license: GNU Public License, Version 2 - * mail to: Mirko Sucker - * - * requires: C++-compiler, STL, string class, NANA + * mail to: Mirko Sucker + * requires: C++-compiler, STL, string class * $Revision$ */ #ifndef ADDRESSBOOK_TLW_INCL #define ADDRESSBOOK_TLW_INCL #include "kab.h" // There are two ID functions, and namespaces do not work: #ifdef ID #undef ID #endif #define ID KDE_ID #include #undef ID #include #include "debug.h" /** Here we will construct a top level widget that * has an AddressWidget as its main part. */ class ABTLWidget : public KTMainWindow // KTopLevelWidget { Q_OBJECT protected: // menubar, statusbar KMenuBar* menu; QPopupMenu *edit, *file; int mailItemID, browseItemID, talkItemID, editItemID, removeItemID, exportItemID, searchItemID, printItemID, saveItemID, copyItemID; KStatusBar* status; // the AddressWidget object AddressWidget* widget; // a timer to erase the statusbar text QTimer* timer; bool constructMenu(); bool constructStatusBar(); void createConnections(); public: enum StatusbarIndex { Text=1, Number }; ABTLWidget(const char* name=0); public slots: void setNumber(int number, int count); void aboutQt(); void about(); // ----- next both used to set and erase statusbar: void setStatus(const char*); void timeOut(); // ----- called by saveYourself signal: void saveOurselfes(); // ----- enables or disables menu items: void enableWidgets(int noOfEntries); }; #endif // ADDRESSBOOK_TLW_INCL Index: branches/KDE_1_1_BRANCH/kdeutils/kab/main.cc =================================================================== --- branches/KDE_1_1_BRANCH/kdeutils/kab/main.cc (revision 19985) +++ branches/KDE_1_1_BRANCH/kdeutils/kab/main.cc (revision 19986) @@ -1,73 +1,73 @@ /* The main-function for the addressbook application * - * the Configuration Database library - * copyright: (C) Mirko Sucker, 1998 + * the KDE addressbook + * copyright: (C) Mirko Sucker, 1998, 1999 * license: GNU Public License, Version 2 * mail to: Mirko Sucker * requires: C++-compiler, STL, string class, Qt > 1.33, * NANA (for debugging) * $Revision$ */ #include #include "toplevelwidget.h" #include #include #include "debug.h" extern "C" { #include } void exit_handler() { register bool GUARD; GUARD=true; LG(GUARD, "addressbook exit_handler: called.\n"); // ######################################################## LG(GUARD, "addressbook exit_handler: clearing ConfigDB " "lockfiles.\n"); ConfigDB::CleanLockFiles(0); LG(GUARD, "addressbook exit_handler: done.\n"); // ######################################################## } void signal_handler(int sig) { register bool GUARD; GUARD=true; LG(GUARD, "addressbook signal_handler: called.\n"); // ######################################################## exit(sig); // ######################################################## } int main(int argc, char** argv) { register bool GUARD; GUARD=true; LG(GUARD, "addressbook main: starting.\n"); // ######################################################## - KApplication app(argc, argv, "kab"); + KApplication *app=new KApplication(argc, argv, "kab"); int rc; // ----- AuthorEmailAddress="mirko@kde.org"; // static, public kimgioRegister(); LG(GUARD, "addressbook main: installing signal " "handler.\n"); signal(SIGINT, signal_handler); signal(SIGQUIT, signal_handler); signal(SIGKILL, signal_handler); signal(SIGTERM, signal_handler); LG(GUARD, "addressbook main: installing exit handler.\n"); atexit(exit_handler); LG(GUARD, "addressbook main: creating addressbook.\n"); ABTLWidget* db=new ABTLWidget; - app.setMainWidget(db); + app->setMainWidget(db); db->show(); LG(GUARD, "addressbook main: executing X application.\n"); - rc=app.exec(); - delete db; + rc=app->exec(); + // delete db; // ----- return rc; // ######################################################## } Index: branches/KDE_1_1_BRANCH/kdeutils/kab/AddressBookAbout.cpp =================================================================== --- branches/KDE_1_1_BRANCH/kdeutils/kab/AddressBookAbout.cpp (revision 19985) +++ branches/KDE_1_1_BRANCH/kdeutils/kab/AddressBookAbout.cpp (revision 19986) @@ -1,100 +1,100 @@ /* -*- C++ -*- * This file implements the about-dialog. * * the KDE addressbook. - * copyright: (C) Mirko Sucker, 1998 + * copyright: (C) Mirko Sucker, 1998, 1999 * license: GNU Public License, Version 2 * mail to: Mirko Sucker * requires: C++-compiler, STL, string class, * Nana for debugging * $Revision$ */ #include "AddressBookAbout.h" #include #include #include #include #include "debug.h" AddressBookAbout::AddressBookAbout(QWidget* parent, const char* name) : AddressBookAboutData(parent, name) { // ############################################################################ const string AddressBookLogo="addressbook_logo.jpg"; setCaption(i18n("About addressbook")); QPixmap pixmap; string path; path=KApplication::getKApplication()->kde_datadir(); path+=(string)"/kab/pics/"+AddressBookLogo; // this needs the installed JPEG reader: if(!pixmap.load(path.c_str())) { QMessageBox::information (parent, // we are invisible here! i18n("Image load failure"), i18n("Could not load addressbook logo image!")); labelLogo->setText(i18n("Here you would see\nthe addressbook logo.")); } else { labelLogo->setPixmap(pixmap); ix=pixmap.width(); iy=pixmap.height(); } buttonOK->setText(i18n("OK")); buttonOK->setFocus(); labelAuthor->setText(i18n("written and maintained by")); urlName->setText("mirko@kde.org"); urlName->setAlignment(AlignCenter); // ----- connect(urlName, SIGNAL(leftClickedURL(const char*)), SLOT(mail(const char*))); initializeGeometry(); // ############################################################################ } AddressBookAbout::~AddressBookAbout() { } void AddressBookAbout::initializeGeometry() { // ############################################################################ const int Grid=5; int tempx, tempy, cx, cy; // ----- first determine the size of the label containing the logo: tempx=6+ix; tempy=6+iy; // ----- then determine dialog width: cx=QMAX(labelVersion->sizeHint().width(), labelAuthor->sizeHint().width()); cx=QMAX(tempx, cx)+4*Grid; cy=2*Grid; // ----- now show image, version and author label: labelLogo->setGeometry((cx-tempx)/2, cy, ix+6, iy+6); cy+=Grid+labelLogo->height(); labelVersion->setGeometry (2*Grid, cy, cx-4*Grid, labelVersion->sizeHint().height()); cy+=Grid+labelVersion->sizeHint().height(); labelAuthor->setGeometry (2*Grid, cy, cx-4*Grid, labelAuthor->sizeHint().height()); cy+=Grid+labelAuthor->sizeHint().height(); urlName->setGeometry(2*Grid, cy, cx-4*Grid, labelAuthor->sizeHint().height()); cy+=Grid+labelAuthor->sizeHint().height(); // ----- now we know how to resize the inner frame: labelFrame->setGeometry(Grid, Grid, cx-2*Grid, cy-Grid); cy+=Grid; // ----- now resize the button: buttonOK->setGeometry(Grid, cy, cx-2*Grid, buttonOK->sizeHint().height()); cy+=Grid+buttonOK->sizeHint().height(); frameBase->setGeometry(0, 0, cx, cy); setFixedSize(cx, cy); // ############################################################################ } void AddressBookAbout::mail(const char* address) { // ############################################################################ emit(sendEmail(address)); // ############################################################################ } #include "AddressBookAbout.moc" #include "AddressBookAboutData.moc"