/*******************************************************************
 KNotes -- Notes for the KDE project

 Copyright (c) 1997-2006, The KNotes Developers

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

#ifndef KNOTE_H
#define KNOTE_H

#include <tqstring.h>
#include <tqevent.h>
#include <tqframe.h>
#include <tqpoint.h>
#include <tqcolor.h>

#include <tdeconfig.h>
#include <kxmlguiclient.h>

class TQLabel;

class KXMLGUIBuilder;

class KFind;
class TDEPopupMenu;
class KNoteButton;
class KNoteEdit;
class KNoteConfig;
class TDEToolBar;
class TDEListAction;
class TDEToggleAction;

namespace KCal {
    class Journal;
}


class KNote : public TQFrame, virtual public KXMLGUIClient
{
    Q_OBJECT
  
public:
    KNote( TQDomDocument buildDoc, KCal::Journal *journal, TQWidget *parent = 0,
           const char *name = 0 );
    ~KNote();

    void changeJournal(KCal::Journal *);
    void saveData( bool update = true);
    void saveConfig() const;

    TQString noteId() const;

    TQString name() const;
    TQString text() const;
    TQString plainText() const;

    void setName( const TQString& name );
    void setText( const TQString& text );

    TQColor fgColor() const;
    TQColor bgColor() const;
    void setColor( const TQColor& fg, const TQColor& bg );

    void find( const TQString& pattern, long options );

    bool isModified() const;
    TQDateTime getLastModified() const;

    void sync( const TQString& app );
    bool isNew( const TQString& app ) const;
    bool isModified( const TQString& app ) const;

    static void setStyle( int style );

    void deleteWhenIdle();
    void blockEmitDataChanged( bool _b ) { m_blockEmitDataChanged = _b;}
public slots:
    void slotKill( bool force = false );

signals:
    void sigRequestNewNote();
    void sigShowNextNote();
    void sigNameChanged();
    void sigDataChanged(const TQString &);
    void sigColorChanged();
    void sigKillNote( KCal::Journal* );

    void sigFindFinished();

protected:
    virtual void drawFrame( TQPainter* );
    virtual void showEvent( TQShowEvent* );
    virtual void resizeEvent( TQResizeEvent* );
    virtual void closeEvent( TQCloseEvent* );
    virtual void dropEvent( TQDropEvent* );
    virtual void dragEnterEvent( TQDragEnterEvent* );

    virtual bool event( TQEvent* );
    virtual bool eventFilter( TQObject*, TQEvent* );

    virtual bool focusNextPrevChild( bool );

    /// Protect against deletion while we are running a sub-eventloop
    void aboutToEnterEventLoop();
    void eventLoopLeft();

private slots:
    void slotRename();
    void slotUpdateReadOnly();
    void slotClose();

    void slotSend();
    void slotMail();
    void slotPrint();
    void slotSaveAs();

    void slotInsDate();
    void slotSetAlarm();

    void slotPreferences();
    void slotPopupActionToDesktop( int id );

    void slotFindNext();
    void slotHighlight( const TQString& txt, int idx, int len );

    void slotApplyConfig();
    void slotUpdateKeepAboveBelow();
    void slotUpdateShowInTaskbar();
    void slotUpdateDesktopActions();

    void slotUpdateViewport( int, int );
    void slotRequestNewNote();
    void slotSaveData();
private:
    void updateFocus();
    void updateMask();
    void updateLayout();
    void updateLabelAlignment();
    void updateBackground( int offset = -1 );

    void createFold();

    void toDesktop( int desktop );

    TQString toPlainText( const TQString& );

private:
    TQLabel        *m_label, *m_pushpin, *m_fold;
    KNoteButton   *m_button;
    TDEToolBar      *m_tool;
    KNoteEdit     *m_editor;

    KNoteConfig   *m_config;
    KCal::Journal *m_journal;

    KFind         *m_find;

    TDEPopupMenu    *m_menu;
    TDEPopupMenu    *m_edit_menu;

    TDEToggleAction *m_readOnly;

    TDEListAction   *m_toDesktop;
    TDEToggleAction *m_keepAbove;
    TDEToggleAction *m_keepBelow;

    TDESharedConfig::Ptr m_twinConf;

    static int s_ppOffset;

    int m_busy;
    bool m_deleteWhenIdle;
    bool m_blockEmitDataChanged;
};

#endif
