/*
    This file is part of KAddressbook.
    Copyright (c) 2003 Tobias Koenig <tokoe@kde.org>

    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; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

    As a special exception, permission is given to link this program
    with any edition of TQt, and distribute the resulting executable,
    without including the source code for TQt in the source distribution.
*/

#ifndef KABCORE_H
#define KABCORE_H

#include <config.h> // FOR TDEPIM_NEW_DISTRLISTS

#include <tdeabc/field.h>

#include <tqdict.h>
#include <tqlabel.h>
#include <tqwidget.h>

#include "core.h"
#include <tdepimmacros.h>

namespace TDEABC {
class AddressBook;
class Ticket;
}

namespace KPIM {
class AddresseeView;
class CategoryEditDialog;
class CategorySelectDialog;
}

class TDEAboutData;
class TDEAction;
class TDEActionCollection;
class TDEConfig;
class KPushButton;
class KStatusBar;
class TDEToggleAction;
class KXMLGUIClient;

class TQSplitter;
class TQHBoxLayout;
class TQWidgetStack;

class AddresseeEditorDialog;
class ExtensionManager;
class FilterSelectionWidget;
class IncSearchWidget;
class JumpButtonBar;
class KAddressBookIface;
class KAddressBookService;
class KIMProxy;
class LDAPSearchDialog;
class ViewManager;
class XXPortManager;

namespace KAB {
    class DistributionListEntryView;
}

typedef struct {
  TDEABC::Ticket *ticket;
  int counter;
} ResourceMapEntry;

class KDE_EXPORT KABCore : public KAB::Core
{
  Q_OBJECT
  

  public:
    KABCore( KXMLGUIClient *client, bool readWrite, TQWidget *parent,
             const TQString &file = TQString(), const char *name = 0 );
    ~KABCore();

    /**
      Restores the global settings.
     */
    void restoreSettings();

    /**
      Saves the global settings.
     */
    void saveSettings();

    /**
      Returns a pointer to the StdAddressBook of the application.
     */
    TDEABC::AddressBook *addressBook() const;

    /**
      Returns a pointer to the TDEConfig object of the application.
     */
    TDEConfig *config() const;

    /**
      Returns a pointer to the global TDEActionCollection object. So
      other classes can register their actions easily.
     */
    TDEActionCollection *actionCollection() const;

    /**
      Returns the current sort field of the view.
     */
    TDEABC::Field *currentSortField() const;

    /**
      Returns the uid list of the currently selected contacts.
     */
    TQStringList selectedUIDs() const;

    /**
      Displays the ResourceSelectDialog and returns the selected
      resource or a null pointer if no resource was selected by
      the user.
     */
    TDEABC::Resource *requestResource( TQWidget *parent );

    /**
      Returns the parent widget.
     */
    TQWidget *widget() const;

    static TDEAboutData *createAboutData();

    void setStatusBar( KStatusBar *statusBar );

    KStatusBar *statusBar() const;

    KAB::SearchManager *searchManager() const { return mSearchManager; }

    KCommandHistory *commandHistory() const { return mCommandHistory; }

#ifdef TDEPIM_NEW_DISTRLISTS
    /**
      Returns all the distribution lists.
     */
    virtual KPIM::DistributionList::List distributionLists() const;

    /**
      Returns the name of all the distribution lists.
     */
    virtual TQStringList distributionListNames() const;

    /**
      sets the distribution list to display. If null, the regular
      address book is to be displayed.
     */
    virtual void setSelectedDistributionList( const TQString &name );
#endif

  public slots:
    /**
      Is called whenever a contact is selected in the view.
     */
    void setContactSelected( const TQString &uid );

    /**
      Opens the preferred mail composer with all selected contacts as
      arguments.
     */
    void sendMail();

    /**
      Opens the preferred mail composer with the given contacts as
      arguments.
     */
    void sendMail( const TQString& email );


    void mailVCard();
    void mailVCard(const TQStringList& uids);

    /**
     * Start an Instant Messaging chat with the selected contacts
     */
    void startChat();

    /**
      Starts the preferred web browser with the given URL as argument.
     */
    void browse( const TQString& url );

    /**
      Select all contacts in the view.
     */
    void selectAllContacts();

    /**
      Deletes all selected contacts from the address book.
     */
    void deleteContacts();

    /**
      Deletes given contacts from the address book.

      @param uids The uids of the contacts, which shall be deleted.
     */
    void deleteContacts( const TQStringList &uids );

    /**
      Deletes given distribution lists from the address book.

      @param uids The names of the distribution lists which shall be deleted.
     */
    void deleteDistributionLists( const TQStringList &names );


    /**
      Copys the selected contacts into clipboard for later pasting.
     */
    void copyContacts();

    /**
      Cuts the selected contacts and stores them for later pasting.
     */
    void cutContacts();

    /**
      Paste contacts from clipboard into the address book.
     */
    void pasteContacts();

    /**
      Paste given contacts into the address book.

      @param list The list of addressee, which shall be pasted.
     */
    void pasteContacts( TDEABC::Addressee::List &list );


    /**
      Merge the selected contacts in a single one.
     */
    void mergeContacts();

    /**
      Sets the whoAmI contact, that is used by many other programs to
      get personal information about the current user.
     */
    void setWhoAmI();

    /**
      Displays the category dialog and applies the result to all
      selected contacts.
     */
    void setCategories();

    /**
      Search with the current search field for a contact, that matches
      the given text, and selects it in the view.
     */
    void incrementalTextSearch( const TQString& text );

    void incrementalJumpButtonSearch( const TQString& characters );

    /**
      Marks the address book as modified.
     */
    void setModified();

    /**
      Marks the address book as modified concerning the argument.
     */
    void setModified( bool modified );

    /**
      Returns whether the address book is modified.
     */
    bool modified() const;

    /**
      Called whenever an contact is modified in the contact editor
      dialog or the quick edit.
     */
    void contactModified( const TDEABC::Addressee &addr );

    /**
      DCOP METHOD: Adds the given email address to address book.
     */
    virtual void addEmail( const TQString& addr );

    /**
      DCOP METHOD: Imports the vCard, located at the given url.
     */
    virtual void importVCard( const KURL& url );

    /**
      DCOP METHOD: Imports the given vCard.
     */
    virtual void importVCardFromData( const TQString& vCard );

    /**
      DCOP METHOD: Opens contact editor to input a new contact.
     */
    virtual void newContact();

    /**
     DCOP METHOD: Opens distribution list editor to create a new distribution list
    */
    virtual void newDistributionList();

    /**
      DCOP METHOD: Returns the name of the contact, that matches the given
                   phone number.
     */
    virtual TQString getNameByPhone( const TQString& phone );

    /**
      DCOP METHOD: Handle command line arguments, return true if handled
      and false if no args was given. The iface is either the mainwin or the part.
     */
    bool handleCommandLine( KAddressBookIface* iface );


    /**
      Saves the contents of the AddressBook back to disk.
     */
    void save();

    /**
      Loads the contents of the AddressBook from disk.
     */
    void load();

    /**
      Shows the edit dialog for the given uid. If the uid is TQString(),
      the method will try to find a selected addressee in the view.
     */
    void editContact( const TQString &uid = TQString() );

    /**
     * Let the user chose a different resource for the selected contacts.
     * If the adding to the new resource is successfull, the contact is
     * removed from the old one, unless the Copy flag is given. */
    void storeContactIn( const TQString &uid = TQString(), bool copy = false );

    /**
     * Lets the user chose a different resource for the selected contacts and
     * copies it there.
     */
    void copySelectedContactToResource();

    /**
     * Lets the user chose a different resource for the selected contacts and
     * moves it there.
     */
    void moveSelectedContactToResource();

    /**
      Launches the ldap search dialog.
     */
    void openLDAPDialog();

    /**
      Opens the settings dialog.
     */
    void configure();

    /**
      Creates a KAddressBookPrinter, which will display the print
      dialog and do the printing.
     */
    void print();

    void detailsHighlighted( const TQString& );

    void showContactsAddress( const TQString &uid );

    void configurationChanged();

    bool queryClose();

    /**
      Is called whenever the xmlgui has to be rebuild after a part switch.
     */
    void reinitXMLGUI();

  private:

#ifdef TDEPIM_NEW_DISTRLISTS
    void editDistributionList( const KPIM::DistributionList &list );
    void showDistributionListEntry( const TQString &uid );
#endif

  private slots:
    void setJumpButtonBarVisible( bool visible );
    void setDetailsVisible( bool visible );

    void extensionModified( const TDEABC::Addressee::List &list );
    void extensionDeleted( const TQStringList &uidList );
    void clipboardDataChanged();
    void updateIncSearchWidget();

    void slotEditorDestroyed( const TQString &uid );
    void delayedAddressBookChanged();
    void addressBookChanged();

    void categoriesSelected( const TQStringList& );
    void editCategories();
    void slotClearSearchBar();
    void slotContactsUpdated();

    void activateDetailsWidget( TQWidget *widget );
    void deactivateDetailsWidget( TQWidget *widget );

    void editDistributionList( const TQString &name );

    void removeSelectedContactsFromDistList();
    void editSelectedDistributionList();
    void sendMailToDistributionList( const TQString &id );

  private:
    void initGUI();
    void createJumpButtonBar();
    void initActions();

    void updateCategories();
    TQStringList allCategories() const;

    AddresseeEditorDialog *createAddresseeEditorDialog( TQWidget *parent,
                                                        const char *name = 0 );

    TQWidget *mWidget;
    TDEABC::AddressBook *mAddressBook;
    KStatusBar *mStatusBar;

    ViewManager *mViewManager;
    TQLabel *mViewHeaderLabel;

#ifdef TDEPIM_NEW_DISTRLISTS
    TQString mSelectedDistributionList;
    KPushButton *mAddDistListButton;
    KPushButton *mRemoveDistListButton;
    TQWidget *mDistListButtonWidget;
#endif

    ExtensionManager *mExtensionManager;
    XXPortManager *mXXPortManager;

    JumpButtonBar *mJumpButtonBar;
    FilterSelectionWidget *mFilterSelectionWidget;
    IncSearchWidget *mIncSearchWidget;
    KAB::DistributionListEntryView* mDistListEntryView;
    KPIM::AddresseeView *mDetailsViewer;
    KPIM::CategorySelectDialog *mCategorySelectDialog;
    KPIM::CategoryEditDialog *mCategoryEditDialog;
    TQWidget *mDetailsPage;
    TQWidget *mDetailsWidget;
    TQHBoxLayout *mDetailsLayout;
    TQSplitter *mDetailsSplitter;
    TQSplitter *mLeftSplitter;
    TQWidgetStack *mDetailsStack;
    LDAPSearchDialog *mLdapSearchDialog;
    TQDict<AddresseeEditorDialog> mEditorDict;

    bool mReadWrite;
    bool mModified;
    bool mIsPart;

    TQTimer *mAddressBookChangedTimer;

    TDEAction *mActionPaste;
    TDEAction *mActionCut;
    TDEAction *mActionDelete;
    TDEAction *mActionCopy;
    TDEAction *mActionEditAddressee;
    TDEAction *mActionMoveAddresseeTo;
    TDEAction *mActionCopyAddresseeTo;
    TDEAction *mActionMerge;
    TDEAction *mActionMail;
    TDEAction *mActionMailVCard;
    TDEAction *mActionChat;
    TDEAction *mActionSave;
    TDEAction *mActionDeleteView;
    TDEAction *mActionWhoAmI;
    TDEAction *mActionCategories;
    TDEToggleAction *mActionJumpBar;
    TDEToggleAction *mActionDetails;
    KCommandHistory *mCommandHistory;

    KAddressBookService *mAddressBookService;

    KAB::SearchManager *mSearchManager;
    // KIMProxy provides access to up to date instant messaging presence data
    ::KIMProxy *mKIMProxy;
    class KABCorePrivate;
    KABCorePrivate *d;
};

#endif
