/***************************************************************************
                          kshowmail.h  -  description
                             -------------------
    begin                : Sat May  6 12:13:57 MEST 2000
    copyright            : (C) 2000-2001 by Eggert Ehmke
    email                : eggert.ehmke@berlin.de
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   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.                                   *
 *                                                                         *
 ***************************************************************************/

#ifndef KSHOWMAIL_H
#define KSHOWMAIL_H


#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

// include files for KDE
#include <kapplication.h>
#include <kmainwindow.h>
#include <kuniqueapplication.h>
#include <kaction.h>
#include <kstdaction.h>
#include <klocale.h>
#include <kstatusbar.h>
#include <krun.h>
#include <kpassdlg.h>
#include <kdebug.h>
#include <kedittoolbar.h>
#include <kcmultidialog.h>


//include files for KShowMail
#include "configlist.h"
#include "alertdialog.h"
#include "showrecord.h"
#include "showlistviewitem.h"
#include "kshowmaildock.h"
#include "kfeedback.h"
#include "types.h"
#include "kshowmailview.h"
#include "kshowmaildoc.h"
#include "serverdialog.h"
#include "filterlog.h"
#include "filterlogview.h"


// forward declaration of the Kshowmail classes
class KshowmailDoc;
class KshowmailView;

using namespace Types;

/**
  * The base class for Kshowmail application windows. It sets up the main
  * window and reads the config file as well as providing a menubar, toolbar
  * and statusbar. An instance of KshowmailView creates your center view, which is connected
  * to the window's Doc object.
  * KShowMailApp reimplements the methods that KMainWindow provides for main window handling and supports
  * full session management as well as keyboard accelerator configuration by using KAccel.
  * @see KMainWindow
  * @see KApplication
  * @see KConfig
  * @see KAccel
  *
  * @author Source Framework Automatically Generated by KDevelop, (c) The KDevelop Team.
  * @version KDevelop version 0.4 code generation
  */
class KShowMailApp : public KMainWindow
{
  Q_OBJECT

  friend class KshowmailView;
  friend class KshowmailDock;
  friend class UniqueApp;


  private:

    /**
     * The central document of our application. Just contains the view (m_pView).
     */
    KshowmailDoc* m_pDoc;

    /**
     * Contains the account and messages list views.
     */
    KshowmailView *m_pView;

    /**
     * The setup dialog. Created and used by slotSetup().
     */
    KCMultiDialog* SetupDialog;

    /**
     * refresh messages action; connected with slotRefresh()
     */
    KAction* m_actionRefresh;

    /**
     * Contains the application and account settings. The account
     * settings are stored in ConfigElem objects.
     */
    ConfigList m_ConfigList;

    /**
     * Message box which will be shown, when new mail has arrived.
     */
    AlertDialog* m_pAlertDialog;

    /**
     * The window into the system tray.
     */
    KShowMailDock* m_pDockWindow;

    /**
     * The refresh timer. Its timeout signal is connected with slotRefresh().
     */
    QTimer* m_pTimer;

    /**
     * Application state during the run time. Shows what KShowMail is doing :-) .
     */
     Types::State_Type m_state;

     /**
      * Number of seconds until the next refresh
      */
     unsigned long m_nSecondsToGo;

     /**
      * The filter log.
      */
     FilterLog fLog;


  public:
    /**
     * Constructor of KShowMailApp, calls all init functions to create the application.
     * @see initMenuBar initToolBar
     */
    KShowMailApp();

    /**
     * Destructor
     */
    ~KShowMailApp();

    /**
     * Contains information about KShowMail, including author, license, version etc.
     * This is accessed in main() when calling KShowMailApp::initMenuBar() to create the help menu.
     */
    static KAboutData* m_pAbout;

    /**
     * Delays the next refresh for one minute.
     */
    void delayNextRefresh();


  protected:

    /**
     * sets up the statusbar for the main window by initialzing a statuslabel.
     */
    void initStatusBar();

    /**
     * sets up the actions.
     */
    void initActions();

    /**
     * initializes the document object of the main window that is connected to the view in initView().
     * @see initView();
     */
    void initDocument();

    /**
     * creates the centerwidget of the KMainWindow instance and sets it as the view
     */
    void initView();

    /**
     * queryClose is called by KMainWindow on each closeEvent of a window. Against the
     * default implementation (only returns true), this calles saveModified() on the document object to ask
     * if the document should be saved if Modified; on cancel the closeEvent is rejected.
     * @see KMainWindow#queryClose
     * @see KMainWindow#closeEvent
     */
    virtual bool queryClose();

    /**
     * queryExit is called by KMainWindow when the last window of the app is going to be closed during the closeEvent().
     * Against the default implementation that just returns true, this calls saveOptions() to save the settings of
     * the last window's properties.
     * @see KMainWindow#queryExit
     * @see KMainWindow#closeEvent
     */
    virtual bool queryExit();

    /**
     * overwrite method of QObject; will be invoked by the internal QObject-Timer
     * the timer is set to 1 second in the construtor;
     * this method sets the time to the next refresh in the statusbar and
     * animates the "?" in the traybar, when the refresh is working
     */
    virtual void timerEvent( QTimerEvent * );

    /**
     * overwrite method of QWidget;
     * to hide the taskbar button
     */
    virtual bool event(QEvent *e);

    /**
     * Starts the first refresh or starts the refresh timer
     * with the configured init time.
     */
    void initFirstRefresh();

    /**
     * Stops the refresh timer.
     */
    void stopRefreshTimer();

    /**
     * Starts the refresh timer for the next refresh.
     */
    void initNextRefresh();

    /**
     * Refreshes the status bar filter field.
     */
    void refreshFilterStatusBar();

  protected slots:

    /**
     * Changes the status message of the whole statusbar for two seconds,
     * then restores the last status. This is used to display
     * statusbar messages that give information about actions for toolbar
     * icons and menu entries.
     * @param text the text that is displayed in the statusbar
     */
    void slotStatusHelpMsg(const QString &text);

    /**
     * Changes the contents in the left status bar item permanently,
     * used to indicate current actions. And sets the current time
     * in the right item.
     * @param text the text that is displayed in the statusbar
     */
    void slotStatusMsg(const QString &text);

    /**
     * Connected with the setup dialog.
     * Reloads the configuration, if it was changed from the dialog.
     */
    void slotConfChanged();

    /**
     * Connected with action m_actionDelete.
     * Deletes all selected mails.
     */
    void slotDelete();

    /**
     * Connected with signal sigDeleteReady of m_ConfigList.
     * This signal will be emitted when one or many accounts have
     * ended a deletion.
     * This slot refreshes the view, sets the state to idle and sets
     * a normal cursor.
     */
    void slotDeletionReady();

    /**
     * Connected with action m_actionShowMessage.
     * Shows all selected mails.
     */
    void slotShowMessage();

    /**
     * Connected with signal sigShowBodiesReady of m_ConfigList.
     * This signal will be emitted when all accounts have downloaded
     * and shown the selected messages.
     * This slot sets the state to idle and sets a normal cursor.
     */
    void slotShowMessageReady();

    /**
     * Connected with signal sigMessageWindowOpened of m_ConfigList.
     * This signal will be emitted when a window to show a mail body
     * was opened.
     * Switches the cursor to normal view.
     */
    void slotNormalCursor();

    /**
     * Connected with signal sigAllMessageWindowsClosed of m_ConfigList.
     * This signal will be emitted when all windows to show a mail body
     * have been closed.
     * Switches the cursor to waiting view.
     */
    void slotWaitingCursor();

    /**
     * Connected with m_actionRefresh.
     * Refreshes the mail list.
     */
    void slotRefresh();

    /**
     * Connected with signal sigRefreshReady of m_ConfigList.
     * This signal will be emitted when all accounts have refreshed
     * their mail list.
     * This slot refreshes the mail view.
     */
    void slotRefreshReady();

    /**
     * Connected with signal destroyed of the alert message dialog.
     * Sets m_pAlertDialog to NULL, if the dialog was destroyed.
     * If m_pAlertDialog == NULL, slotRefreshReady will create a new instance of it.
     * @see m_pAlertDialog
     * @see slotRefreshReady()
     */
    void slotAlertDestroyed();

    /**
     * Connected with signal signalOk of the alert message dialog.
     * Switches the main window to normal view.
     * @see m_pAlertDialog;
     */
    void slotAlertOk ();

    /**
     * Refreshes the account and messages list view.
     */
    void slotRefreshView ();

    /**
     * If the application state is not "idle" it will stop all current running POP3 jobs.
     * Connected with m_actionStop().
     */
    void slotStop ();

    /**
     * Shows the headers of all selected mails.
     * Connected with action m_actionShowHeader.
     */
    void slotShowHeader();

    /**
     * Connected with standard action configureToolbars.
     * Opens a dialog to configure the icons of the toolbar.
     */
    void slotEditToolbars();

    /**
     * Saves GUI options, account and filter settings to the configuration file.
     */
    void slotSaveOptions();

    /**
     * Calls the close() method of KShowMailApp to exit the application. Uses askCloseConfirmation() to ask
     * the user (if configured). Sets m_bForceClose to TRUE, therefore queryClose() will be passed without
     * anything to do. After that in queryExit() slotSaveOptions() will be invoked.
     */
    void slotFileQuit();

    /**
     * Opens the setup dialog for the highlighted account. Connected with m_actionSetupAccount.
     */
    void slotSetupAccount();

    /**
     * Connected with the standard setup action.
     * If the application state is "idle" (m_state == idle) it will open the configuration dialog.
     */
    void slotSetup();

    /**
     * Shows the filter log.
     */
    void slotShowFilterLog();

    /**
     * Adds the sender of the selected mails to the whitelist
     */
    void slotAddToWhitelist();

    /**
     * Adds the sender of the selected mails to the blacklist
     */
    void slotAddToBlacklist();

    void slotAccountActivated(QListViewItem*);
    void slotSendFeedbackMail();
    void slotForceClose();




private:

    bool m_bForceClose;


  protected:
    void addFeatureList(KFeedbackQuestion * question);
    bool askCloseConfirmation();

};

#endif // KSHOWMAIL_H
