Source Code (Use browser search to find items of interest.)

Class Index

kab'TopLevelWidget (./kdeutils/kab/kab_topwidget.h:41)

class TopLevelWidget : public KTMainWindow
{
  Q_OBJECT
public:
  /** The indices of the statusbar parts. */
  enum StatusbarIndex { Text=1, /**< The status text. */
			Number /**< The number of entries. */
  };
  /** This descriptors are used to create the view. */
  enum View { NoView=0,
	      BusinessCard,
	      Editing
  };
  /** The constructor. */
  TopLevelWidget();
protected:
  /** Construct the menubar. */
  void makeMenu();
  /** Construct the toolbar. */
  void makeToolbar();
  /** Construct the statusbar. */
  void makeStatusbar();
  /** Create the interface to the address database. */
  bool initializeInterface();
  /** Create the view. This method reads the latest view
      chosen by the user and restores it if no view is given.
  */
  void createView(View=NoView, bool recreate=false);
  /** The main widget. There are different child classes of
   *  KABBasicLook. */
  KABBasicLook *view;
  /** Stores the currently selected view. */
  View currentView;
  /** The interface to the AddressBook object. */
  KabAPI *api;
  /** A pointer to a key storing the entry currently displayed.
   *  This property is set by the entrySelected method.
   *  @see entrySelected
   */
  KabKey *current;
  /** The pointer to the file menu. */
  QPopupMenu *file;
  /** The pointer to the import menu. */
  QPopupMenu *import;
  /** The pointer to the edit menu. */
  QPopupMenu *edit;
  /** The id of the mail and browse menu items. */
  int idEditMail, idEditBrowse;
  /** The pointer to the view menu. */
  QPopupMenu *menuview;
  /** The IDs of the view status entries. */
  int idViewBC, idViewEdit;
  /** The datanavigator widget. Although it is child of the toolbar,
   *  the pointer to the datanavigator is stored here to be able to
   *  update its contents. */
  KDataNavigator *nav;
  /** Used to reset the status bar. */
  QTimer *timer;
  /** The list containing the status messages to display. */
  QStringList *messages;
  /** If true, the entry needs to be saved before showing another
      one. */
  bool modified;
  /** Signals that the "Quit" button has been selected. */
  bool closingdown;
  /** Edit this entry. */
  bool editCurrentEntry();
  /** Remove this entry. If quiet is true, the entry is removed
      silently even if query-on-delete is set. Use it for deleting
      temporaries. Careful! */
  bool removeCurrentEntry(bool quiet=false);
public slots:
  /** An entry has been selected. */
  void entrySelected(int);
  /** The entries map has changed. Possibly the database, too...*/
  void entriesChanged();
  // The file menu:
  /** Create a new address database. Triggered from the menu. */
  void createNew();
  /** Load the standard database. This is the predefined user database
   *  created on the first start of the program. Note that the user might
   *  configure this filename!. Triggered from the menu. */
  void loadDefaultDatabase();
  /** Load a database file. With kab2, the filename is no more fixed.
   *  Triggered from the menu. */
  void loadDatabaseFile();
  /** Save the database. */
  void save();
  /** Import kab 1 addressbook. This is triggered from the menu. */
  void importKab1Addressbook();
  /** Set the status bar text. */
  void setStatus(const QString&);
  /** Erase it after some time. */
  void statusbarTimeOut();
  /** The business card view has been selected. */
  void selectViewBC();
  /** The editing view has been selected. */
  void selectViewEdit();
  /** Add an entry. */
  void add();  /** Edit an entry. */
  void editEntry();
  /** Remove an entry. */
  void remove();
  /** Send an email. Calls mail(const QString& url). Just for convenience. */
  void mail();
  /** Send an email. */
  void mail(const QString& url);
  /** Browse the homepage. Calls browse(const QString& url). Just for convenience. */
  void browse();
  /** Browse the homepage. */
  void browse(const QString& url);
  /** Enable all messages disabled by the "do not show again" button. */
  void enableAllMessages();
  /** Configure settings local to the file. User field names, for example. */
  void configureFile();
  /** The currently displayed entry has been changed by the user. We
      will store this in a boolean value, and (according to a
      configuration setting) ask the user to save her changes before
      displaying another entry. */
  void entryChangedSlot();
  /** Quit the application. */
  void quit();
  /** About-kab-slot. Overloaded from KTMainWindow. */
  void showAboutApplication(void);
  /** About-KDE-slot. */
  void aboutKDE();
signals:
  /** Called after changes in the database that the AddressBook object
   *  does not recognize.
   */
  void databaseChanged();
};

kab'TopLevelWidget::configureFile() (./kdeutils/kab/dialog_configurefile.cc:51)

void TopLevelWidget::configureFile()
{
  Section *config;
  // -----
  config=api->addressbook()->configurationSection();
  if(config==0)
    {
      return;
    }
  KDialogBase dialog(this);
  KabFileConfigWidget widget(config, &dialog);
  widget.setMinimumSize(320, 200);
  dialog.setMainWidget(&widget);
  if(dialog.exec())
    {
      emit(setStatus(i18n("Accepted.")));
      if(widget.saveSettings(config)!=AddressBook::NoError)
	{
	  emit(setStatus(i18n("Permission denied.")));
	} else {
	  emit(setStatus(i18n("Settings applied.")));
	}
      save();
      createView(currentView, true);
    } else {
      emit(setStatus(i18n("Rejected.")));
    }
}


kab'TopLevelWidget::editEntry() (./kdeutils/kab/dialog_editentry.cc:36)

void TopLevelWidget::editEntry()
{
  editCurrentEntry();
}


kab'TopLevelWidget::editCurrentEntry() (./kdeutils/kab/dialog_editentry.cc:41)

bool TopLevelWidget::editCurrentEntry()
{
  // it must be ensured that all other changes are committed to the database
  // before calling this method since it uses the entry as it is found into
  // the database
  AddressBook::Entry entry;
  // ----- create a KDialogBase dialog containing a KABEditLook widget:
  KDialogBase dialog(this);
  KABEditLook *look=new KABEditLook(api, &dialog);
  look->setMinimumSize(320, 200); // WORK_TO_DO: remove this line
  dialog.setMainWidget(look);
  dialog.resize(dialog.minimumSize());
  // WORK_TO_DO: handle size
  // ----- get the entry:
  if(api->addressbook()->getEntry(*current, entry)!=AddressBook::NoError)
    {
      debug("TopLevelWidget::editCurrentEntry: no such entry.");
    }
  // ----- display the editing dialog:
  look->setEntry(entry);
  if(dialog.exec())
    {
      look->getEntry(entry);
      view->setEntry(entry);
      modified=true;
      emit(setStatus(i18n("Accepted.")));
      return true;
    } else {
      emit(setStatus(i18n("Rejected.")));
      return false;
    }
}


kab'TopLevelWidget::createNew() (./kdeutils/kab/kab_createnew.cc:39)

void TopLevelWidget::createNew()
{
  register bool GUARD; GUARD=true;
  // ###########################################################################
  kDebugInfo(GUARD, 0, "KabMainWindow::newFile: called.");
  QString home, filename;
  KURL dummy;
  QFileInfo info;
  // ----- select the filename:
  home=QDir::homeDirPath();
  if(home.isEmpty())
    {
      KMessageBox::sorry
	(this, i18n("Could not find the users home directory."), i18n("Sorry"));
      setStatus(i18n("Intern error!")); 
      kapp->beep();
      return;
    }
  for(;;) // do forever
    {
      // dummy=KFileDialog::getOpenFileName(home, "*kab", this);
      dummy=KFileDialog::getOpenURL(home, "*kab", this);
      kDebugInfo(GUARD, 0, "KabMainWindow::newFile: URL is %s.", dummy.decodedURL().data());
      if(dummy.isEmpty()) // dialog has been cancelled
	{
	  setStatus(i18n("Cancelled."));
	  qApp->beep();
	  return;
	}
      // WORK_TO_DO: download the URL or find the local file name in filename
      if(!dummy.isLocalFile())
      {
        setStatus( i18n( "Only local files supported yet." ) );
	qApp->beep();
	return;
      } else {
	filename=dummy.path();
      }
      // ...
      // -----
      info.setFile(filename);
      if(info.isDir() || info.exists())
	{
	  KMessageBox::sorry
	    (this, 
	     i18n("This file is a directory, or it already exists.\n"
		  "Please select another filename.\n"
		  "You must have permission to write "
		  "to create the new file."),
	     i18n("File error"));
	} else {
	  kDebugInfo(GUARD, 0, "KabMainWindow::newFile: filename is %s.", filename.data());
	  break;
	}
    }
  // ----- adjust name:
  if(filename.length()<4 || filename.mid(filename.length()-4, 4)!=".kab")
    {
      filename+=".kab";
      KMessageBox::information
	(this,
	 i18n("The filename did not end with \".kab\".\n"
	      "It has been changed to\n")+filename,
	 i18n("Note"));
    }
  // ----- create the new database file:
  if(api->addressbook()->createNew(filename)!=AddressBook::NoError)
    {
      KMessageBox::sorry
	(this,
	 i18n("The file could not be created, possibly permission denied."),
	 i18n("kab: File error"));
      qApp->beep();
      return;
    }
  // ----- load this file:
  if(api->addressbook()->load(filename)!=AddressBook::NoError)
    {
      KMessageBox::sorry
	(this, i18n("The file has been created, but could not be loaded."),
	 i18n("File error"));
      qApp->beep();
      return;
    }
  // -----
  kDebugInfo(GUARD, 0, "KabMainWindow::newFile: done.");  
  // ###########################################################################
}


kab'TopLevelWidget::loadDatabaseFile() (./kdeutils/kab/kab_openfile.cc:38)

void TopLevelWidget::loadDatabaseFile()
{
  register bool GUARD; GUARD=true;
  // ###########################################################################
  kDebugInfo(GUARD, 0, "KabMainWindow::open: called.");
  QString home, filename;
  KURL dummy;
  QFileInfo info;
  // ----- select the filename:
  home=QDir::homeDirPath();
  if(home.isEmpty())
    {
      KMessageBox::sorry
	(this, i18n("Could not find the users home directory."), i18n("Sorry"));
      setStatus(i18n("Intern error!"));
      kapp->beep();
      return;
    }
  for(;;) // do forever
    {
      dummy = KFileDialog::getOpenURL(home, "*kab", this);
      if(dummy.isEmpty()) // dialog has been cancelled
	{
	  setStatus(i18n("Cancelled."));
	  qApp->beep();
	  return;
	}
      // WORK_TO_DO: download the URL or find the local file name in filename
      if(!dummy.isLocalFile())
      {
        setStatus(i18n("Only local files supported yet."));
	qApp->beep();
        return;
      } else {
	filename=dummy.path();
      }
      // ...
      // -----
      info.setFile(filename);
      if(info.isDir() || !info.exists())
	{
	  KMessageBox::sorry
	    (this, i18n("The file does not exist or is a directory.\n"
			"Use \"New File\" to create a new one.\n"
			"Select an existing file to load it."),
	     i18n("File error"));
	} else {
	  kDebugInfo(GUARD, 0, "KabMainWindow::newFile: filename is %s.",
		     filename.data());
	  break;
	}
    }
  // ----- load the file:
  if(api->addressbook()->load(filename)!=AddressBook::NoError)
    {
      KMessageBox::sorry
	(this, i18n("The file could not be loaded."),
	 i18n("File error"));
      kapp->beep();
      return;
    }
  // -----
  modified=false;
  // WORK_TO_DO: updateGUI();
  kDebugInfo(GUARD, 0, "KabMainWindow::newFile: done.");  
  // ###########################################################################
}

kab'TopLevelWidget::save() (./kdeutils/kab/kab_save.cc:32)

void TopLevelWidget::save()
{
  // ###########################################################################
  AddressBook::Entry entry;
  // WORK_TO_DO:
  // ----- remember last visible entry:
  // ----- save the database:
  AddressBook *book=api->addressbook();
  if(modified)
    {
      // ----- put the new entry into the database:
      //       preload it with the old contents
      if(book->getEntry(*current, entry)!=AddressBook::NoError)
	{
	  emit(setStatus(i18n("Internal error.")));
	}
      //       get all values from the current view:
      view->getEntry(entry);
      //       and store it:
      switch(book->change(*current, entry))
	{
	case AddressBook::NoError:
	  emit(setStatus(i18n("Entry stored.")));
	  break;
	case AddressBook::PermDenied:
	  emit(setStatus(i18n("Permission denied.")));
	  return;
	default:
	  emit(setStatus(i18n("Internal error.")));
	  return;
	}
    }
  if(book->save("", true)!=AddressBook::NoError)
    {
      KMessageBox::sorry
	(this, i18n("The file could not be saved (permission denied)."),
	 i18n("kab: File error"));
    }
  // ----- finally say something and remember state:
  setStatus(i18n("File saved."));
  modified=false;
  // ###########################################################################
}


kab'TopLevelWidget::TopLevelWidget() (./kdeutils/kab/kab_topwidget.cc:47)

TopLevelWidget::TopLevelWidget()
  : KTMainWindow(),
    view(0),
    currentView(NoView),
    current(0),
    timer(new QTimer(this)),
    messages(new QStringList),
    modified(false),
    closingdown(false)
{
  bool GUARD; GUARD=true;
  kDebugInfo(GUARD, 0, "TopLevelWidget ctor: called.");
  // -----
  // WORK_TO_DO: remember last selected view
  createView(BusinessCard);
  api=new KabAPI(this);
  if(api==0)
    {
      KMessageBox::sorry
	(this, i18n("Out of memory."),
	 i18n("General failure"));
      ::exit(-1);
    }
  // -----
  makeMenu();
  makeToolbar();
  makeStatusbar();
  // -----
  connect(nav, SIGNAL(itemSelected(int)), SLOT(entrySelected(int)));
  connect(api, SIGNAL(setStatus(const QString&)),
	  SLOT(setStatus(const QString&)));
  connect(timer, SIGNAL(timeout()), SLOT(statusbarTimeOut()));
  // -----
  if(!initializeInterface())
    {
      KMessageBox::sorry
	(this, i18n("Could not connect to the address database."),
	 i18n("Database error"));
      ::exit(-1);
    }
  connect(this, SIGNAL(databaseChanged()),
	  api->addressbook(), SLOT(externalChange()));
  // -----
  entriesChanged();
  // -----
  setStatus(i18n("Welcome to kab 2.0"));
  kDebugInfo(GUARD, 0, "TopLevelWidget ctor: done.");
}


kab'TopLevelWidget::makeMenu() (./kdeutils/kab/kab_topwidget.cc:96)

void TopLevelWidget::makeMenu()
{
  // ----- the file menu:
  file=new QPopupMenu;
  CHECK_PTR(file);
  // ----- the import (sub-) menu (more should follow): 
  import=new QPopupMenu;
  CHECK_PTR(import);
  import->insertItem(i18n("&KDE 1 address book"), this, 
		     SLOT(importKab1Addressbook()));
  file->insertItem(i18n("&Create new database"), this,
		   SLOT(createNew()), KStdAccel::openNew());
  file->insertItem(i18n("&Open"), this,
		   SLOT(loadDatabaseFile()), KStdAccel::open());
  file->insertItem(i18n("Open default &database"), this,
		   SLOT(loadDefaultDatabase()));
  file->insertItem(i18n("&Save"), this,
		   SLOT(save()), KStdAccel::save());
  file->insertSeparator();
  file->insertItem(i18n("&Import..."), import);
  file->insertSeparator();
  file->insertItem(i18n("&Quit"), this, SLOT(quit()), KStdAccel::quit());
  // ----- the edit menu:
  edit=new QPopupMenu;
  edit->insertItem(i18n("&Add entry"), this, SLOT(add()), CTRL+Key_A);
  edit->insertItem(i18n("&Edit entry"), this, SLOT(editEntry()), CTRL+Key_E);
  edit->insertItem(i18n("&Remove entry"), this, SLOT(remove()), CTRL+Key_R);
  edit->insertSeparator();
  idEditMail=edit->insertItem(i18n("Send an e&mail"), this, SLOT(mail()), CTRL+Key_M);
  idEditBrowse=edit->insertItem(i18n("&Browse"), this, SLOT(browse()), CTRL+Key_B);
  edit->insertSeparator();
  edit->insertItem(i18n("Enable all &messages"), this,
		   SLOT(enableAllMessages()));
  edit->insertItem(i18n("&Configure this file"), this,
		   SLOT(configureFile()));
  // ----- the view menu:
  menuview=new QPopupMenu;
  idViewBC=menuview->insertItem(i18n("&Business card"), this,
				SLOT(selectViewBC()));
  idViewEdit=menuview->insertItem(i18n("&Editing"), this,
				  SLOT(selectViewEdit()));
  menuview->setCheckable(true);
  selectViewBC();
  // -----
  menuBar()->insertItem(i18n("&File"), file);
  menuBar()->insertItem(i18n("&Edit"), edit);
  menuBar()->insertItem(i18n("&View"), menuview);
  menuBar()->insertItem
    (i18n("&Help"), helpMenu(QString::null, false));
}


kab'TopLevelWidget::makeToolbar() (./kdeutils/kab/kab_topwidget.cc:147)

void TopLevelWidget::makeToolbar()
{
  int id;
  // -----
  nav=new KDataNavigator(toolBar());
  nav->setFrameStyle(QFrame::NoFrame);
  nav->setMode(KDataNavigator::List);
  id=toolBar()->insertWidget(0, 100, nav);
  toolBar()->setItemAutoSized(id);
  connect(nav, SIGNAL(newItem()), SLOT(add()));
}


kab'TopLevelWidget::makeStatusbar() (./kdeutils/kab/kab_topwidget.cc:159)

void TopLevelWidget::makeStatusbar()
{
  //statusBar()->setInsertOrder(KStatusBar::RightToLeft);
  statusBar()->insertItem("20000/20000", Number);
  statusBar()->insertItem("", Text, 1000, true);
}


kab'TopLevelWidget::initializeInterface() (./kdeutils/kab/kab_topwidget.cc:166)

bool TopLevelWidget::initializeInterface()
{
  if(api->init()!=AddressBook::NoError)
    {
      KMessageBox::sorry
	(this, i18n("The database interface could not be created."),
	 i18n("Database error"));
      return false;
    } else {
      connect(api->addressbook(), SIGNAL(changed()),
	      SLOT(entriesChanged()));
      return true;
    }
}


kab'TopLevelWidget::entrySelected() (./kdeutils/kab/kab_topwidget.cc:181)

void TopLevelWidget::entrySelected(int index)
{
  bool GUARD; GUARD=true;
  kDebugInfo(GUARD, 0, "TopLevelWidget::entrySelected: called (%i).", index);
  // -----
  AddressBook::Entry entry;
  KabKey key;
  int number;
  QString text;
  // ----- store user changes:
  if(closingdown) return;
  if(modified) // the current entry has been modified
    { // WORK_TO_DO: respect "Query save on change" configuration setting
      if(current!=0) // make sure non-debug versions also work stable
	{
	  if(KMessageBox::questionYesNo
	     (this,
	      i18n("You changed this entry.\nSave changes?\n"
		   "(Unsaved changes will be lost.)"),
	      i18n("Save changes?"))==KMessageBox::Yes)
	    {
	      save();
	    }
	}
    }
  // -----
  number=api->addressbook()->noOfEntries();
  if(number!=0)
    {
      view->setEnabled(true);
      if(api->addressbook()->getKey(index, key)!=AddressBook::NoError)
	{
	  kDebugInfo("TopLevelWidget::entrySelected: no such entry (%i).",
		     index);
	}
      if(api->addressbook()->getEntry(key, entry)!=AddressBook::NoError)
	{
	  kDebugInfo("TopLevelWidget::entrySelected: cannot access existing entry.");
	}
    } else {
      kDebugInfo("TopLevelWidget::entrySelected: no entries.");
      view->setEnabled(false);
    }
  // -----
  if(number==0)
    {
      text=i18n("No entries.");
    } else {
      text=text.sprintf("%i/%i", index+1, number);
    }
  statusBar()->changeItem(text, Number);
  // -----
  view->setEntry(entry);
  modified=false; // finally reset modification mark
  if(current!=0)
    { // make sure the old key is deleted:
      delete current; current=0;
    }
  current=new KabKey(key);
  kDebugInfo(GUARD, 0, "TopLevelWidget::entrySelected: done (%i).", index);
}


kab'TopLevelWidget::entriesChanged() (./kdeutils/kab/kab_topwidget.cc:243)

void TopLevelWidget::entriesChanged()
{ // this signal is emitted from AddressBook::updateEntriesMap
  bool GUARD; GUARD=true;
  kDebugInfo(GUARD, 0, "TopLevelWidget::entriesChanged: called.");
  // -----
  QStringList headlines;
  // -----
  if(api->addressbook()->getListOfNames(&headlines, true, false)
     !=AddressBook::NoError)
    {
      return;
    }
  nav->setList(&headlines);
  entrySelected(0); // WORK_TO_DO: remember the visible entry like in kab 1
  // -----
  kDebugInfo(GUARD, 0, "TopLevelWidget::entriesChanged: done.");  
}


kab'TopLevelWidget::importKab1Addressbook() (./kdeutils/kab/kab_topwidget.cc:261)

void TopLevelWidget::importKab1Addressbook()
{ // WORK_TO_DO: Proof-read messages
  // ###########################################################################
  Kab1Importer importer(api, this);
  connect(&importer, SIGNAL(setStatus(const QString&)),
	  SLOT(setStatus(const QString&)));
  if(importer.exec())
    {
      entriesChanged();
    }
  // ###########################################################################
}


kab'TopLevelWidget::setStatus() (./kdeutils/kab/kab_topwidget.cc:274)

void TopLevelWidget::setStatus(const QString& text)
{
  // ###########################################################################
  messages->append(text);
  if(!timer->isActive())
    {
      timer->start(0);
    } else {
      timer->start(500);
    }
  // ###########################################################################
}


kab'TopLevelWidget::statusbarTimeOut() (./kdeutils/kab/kab_topwidget.cc:287)

void TopLevelWidget::statusbarTimeOut()
{
  // ###########################################################################
  if(!messages->isEmpty())
    {
      statusBar()->changeItem(messages->first(), Text);
      messages->remove(messages->begin());
      if(messages->isEmpty())
	{
	  timer->start(5000, true);
	} else {
	  timer->start(1000, true);
	}
    } else {
      statusBar()->changeItem("", Text);
    }
  // ###########################################################################
}


kab'TopLevelWidget::loadDefaultDatabase() (./kdeutils/kab/kab_topwidget.cc:306)

void TopLevelWidget::loadDefaultDatabase()
{
  // ###########################################################################
  QString path;
  // -----
  path=api->addressbook()->getStandardFilename();
  if(!path.isEmpty())
    {
      if(api->addressbook()->load(path)!=AddressBook::NoError)
	{
	  KMessageBox::sorry
	    (this, i18n("The standard file could not be loaded."),
	     i18n("File error"));
	}
    }
  modified=false;
  // ###########################################################################
}


kab'TopLevelWidget::selectViewBC() (./kdeutils/kab/kab_topwidget.cc:325)

void TopLevelWidget::selectViewBC()
{
  menuview->setItemChecked(idViewBC, true);
  menuview->setItemChecked(idViewEdit, false);
  createView(BusinessCard);
  emit(setStatus(i18n("Business card view.")));
}


kab'TopLevelWidget::selectViewEdit() (./kdeutils/kab/kab_topwidget.cc:333)

void TopLevelWidget::selectViewEdit()
{
  menuview->setItemChecked(idViewBC, false);
  menuview->setItemChecked(idViewEdit, true);
  createView(Editing);
  emit(setStatus(i18n("Editing view.")));
}


kab'TopLevelWidget::enableAllMessages() (./kdeutils/kab/kab_topwidget.cc:341)

void TopLevelWidget::enableAllMessages()
{
  if(KMessageBox::questionYesNo
     (this,
      i18n("This will re-enable all messages you disabled before.\n"
	   "Continue?"),
      i18n("Enable messages?"))==KMessageBox::Yes)
    {
      KMessageBox::enableAllMessages();
    }
}


kab'TopLevelWidget::add() (./kdeutils/kab/kab_topwidget.cc:353)

void TopLevelWidget::add()
{ // WORK_TO_DO: check for redundant calls 
  KabKey key;
  AddressBook::Entry entry; // WORK_TO_DO: possibly use templates or default entries?
  int index;
  // -----
  switch(api->add(entry, key, true))
    {
    case AddressBook::NoError:
      // ----- first save the database:
      emit(setStatus(i18n("New entry added.")));
      save();
      emit(databaseChanged());
      entriesChanged();
      // ----- make the new entry the current (and visible):
      if(api->addressbook()->getIndex(key, index)==AddressBook::NoError)
	{
	  entrySelected(index);
	} 
      // ----- and edit it if we are not in editing mode:
      if(currentView!=Editing)
	{
	  if(*current==key)
	    {
	      if(editCurrentEntry())
		{
		  emit(i18n("Saving new entry."));
		  save();
		  emit(i18n("Done."));
		} else {
		  emit(i18n("Rejected."));
		  removeCurrentEntry(true); // silently
		}
	    } else {
	      KMessageBox::information
		(this,
		 i18n("Cannot display the new entry.\n"
		      "Unknown cause."),
		 i18n("Error"));
	      return;
	    }
	}
      break;
    case AddressBook::PermDenied:
      KMessageBox::information
	(this,
	 i18n("Cannot add the new entry.\n"
	      "Permission denied.\n"
	      "You do not have writing permissions for this file."),
	     i18n("Error"));
      return;
    default:
      KMessageBox::information
	(this,
	 i18n("Cannot add the new entry.\n"
	      "Unknown cause."),
	     i18n("Error"));
      return;
    }     
  emit(databaseChanged());
  entriesChanged();
  // ----- recalculate index of this entry (may have changed):
  if(api->addressbook()->getIndex(key, index)==AddressBook::NoError)
    {
      entrySelected(index);
    } 
}


kab'TopLevelWidget::remove() (./kdeutils/kab/kab_topwidget.cc:421)

void TopLevelWidget::remove()
{
  removeCurrentEntry();
}


kab'TopLevelWidget::removeCurrentEntry() (./kdeutils/kab/kab_topwidget.cc:426)

bool TopLevelWidget::removeCurrentEntry(bool quiet)
{
  bool queryOnDelete=true; // WORK_TO_DO: respect configuration settings
  bool doIt=true;
  // -----
  if(queryOnDelete && !quiet)
    {
      doIt=KMessageBox::questionYesNo
	(this,
	 i18n("Really remove this entry?"),
	 i18n("Question"))==KMessageBox::Yes;
    }
  if(doIt)
    {
      if(api->remove(*current)==AddressBook::NoError)
	{
	  emit(setStatus(i18n("Entry deleted.")));
	  save();
	  emit(databaseChanged());
	  entriesChanged();
	  return true;
	} else {
	  KMessageBox::information
	    (this,
	     i18n("Could not delete the entry\n"
		  "(probably permission denied)."),
	     i18n("Error"));
	  emit(setStatus(i18n("Permission denied.")));
	  return false;
	}
    }
  return false;
}


kab'TopLevelWidget::createView() (./kdeutils/kab/kab_topwidget.cc:460)

void TopLevelWidget::createView(View v, bool recreate)
{
  bool modificationstate=modified;
  // ----- avoid deleting and creating:
  if(v==currentView && !recreate) return;
  // -----
  AddressBook::Entry entry;
  // -----
  if(view!=0)
    {
      view->getEntry(entry);
      delete view;
      view=0;
    }
  // -----
  switch(v)
    {
    case BusinessCard:
      view=new KABBusinessCard(api, this);
      break;
    case Editing:
      view=new KABEditLook(api, this);
      connect(view, SIGNAL(entryChanged()), SLOT(entryChangedSlot()));
      break;
    default:
      kDebugWarning("TopLevelWidget::createView: unknown kind of view.");
      view=new KABBusinessCard(api, this);
    }
  connect(view, SIGNAL(sendEmail(const QString&)), SLOT(mail(const QString&)));
  connect(view, SIGNAL(browse(const QString&)), SLOT(browse(const QString&)));
  view->setEntry(entry);
  view->setMinimumSize(320, 200);
  setView(view, true);
  view->show();
  currentView=v;
  modified=modificationstate;
  // -----
}


kab'TopLevelWidget::entryChangedSlot() (./kdeutils/kab/kab_topwidget.cc:499)

void TopLevelWidget::entryChangedSlot()
{
  register bool GUARD; GUARD=false;
  kDebugInfo(GUARD, 0,
	     "TopLevelWidget::entryChangedSlot: current entry has been changed.");
  modified=true;
}


kab'TopLevelWidget::quit() (./kdeutils/kab/kab_topwidget.cc:507)

void TopLevelWidget::quit()
{
  closingdown=true;
  kapp->quit();
}


kab'TopLevelWidget::aboutKDE() (./kdeutils/kab/kab_topwidget.cc:513)

void TopLevelWidget::aboutKDE()
{
}


kab'TopLevelWidget::showAboutApplication() (./kdeutils/kab/kab_topwidget.cc:517)

void TopLevelWidget::showAboutApplication(void)
{
  QPixmap logo;
  QString path;
  KAboutDialog dialog(this);
  // -----
  path=locate("appdata", "pics/addressbook_logo.png");
  if(path.isEmpty())
    {
      kDebugWarning
	(0, "TopLevelWidget::aboutKAB: cannot locate ressources.");
    } else {
      if(logo.load(path))
	{
	  dialog.setLogo(logo);
	}
    }
  dialog.setCaption("About KDE address book");
  dialog.setVersion("KDE address book 2.0alpha");
  dialog.setAuthor("Mirko Sucker", "mirko@kde.org", "", "Initial developer.");
  dialog.adjust();
  dialog.exec();
}


kab'TopLevelWidget::mail() (./kdeutils/kab/kab_topwidget.cc:541)

void TopLevelWidget::mail()
{
  mail(QString::null);
}


kab'TopLevelWidget::mail() (./kdeutils/kab/kab_topwidget.cc:546)

void TopLevelWidget::mail(const QString& url)
{
  kdDebug() << "TopLevelWidget::mail: called with url " << url << "." << endl;
}


kab'TopLevelWidget::browse() (./kdeutils/kab/kab_topwidget.cc:551)

void TopLevelWidget::browse()
{
  browse(QString::null);
}


kab'TopLevelWidget::browse() (./kdeutils/kab/kab_topwidget.cc:556)

void TopLevelWidget::browse(const QString& url)
{
  kdDebug() << "TopLevelWidget::browse: called with url " << url << "." << endl;
}