/***************************************************************************
 *   Copyright (C) 2003 by S�astien Laot                                 *
 *   slaout@linux62.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.             *
 ***************************************************************************/

#ifndef NOTEEDIT_H
#define NOTEEDIT_H

#include <kdialogbase.h>
#include <tqtextedit.h>
#include <tqlineedit.h>

class TQWidget;
//class TQLineEdit;
class TQPushButton;
class TDEIconButton;
class KURLRequester;
class KTextEdit;
class TDEMainWindow;
class KTooolBar;
class TDEToggleAction;

class FontSizeCombo;

class Note;
class RunCommandRequester;
class FocusedFontCombo;
class FocusedColorCombo;

#include "notecontent.h"

/** The base class for every note editors.
  * Scenario:
  *  The Basket class calls NoteEditor::editNoteContent() with the NoteContent to edit.
  *  This method create the good child NoteEditor depending
  *  on the note content type and return it to the Basket.
  *  This custom NoteEditor have two choices regarding what to do in its constructor:
  *   - Display a dialog and then call cancel() if the user canceled the dialog;
  *   - Create an inline editor and call setInlineEditor() with that editor as parameter.
  *     When the user exit the edition, validate() is called by the Basket.
  *     You should then call setEmpty() is the user cleared the content.
  *  The custom editor SHOULD call the NoteEditor constructor.
  *  If the user cleared the content OR if the user canceled the dialog whereas he/she
  *  JUST ADDED the note, then the note will be deleted by the Basket.
  */
class NoteEditor : public TQObject
{
  TQ_OBJECT
  
  public:
	NoteEditor(NoteContent *noteContent);
	bool        isEmpty()  { return m_isEmpty;      }
	bool        canceled() { return m_canceled;     }
	bool        isInline() { return m_widget != 0;  }
	TQWidget*    widget()   { return m_widget;       }
	KTextEdit*  textEdit() { return m_textEdit;     }
	TQLineEdit*  lineEdit() { return m_lineEdit;     }

  private:
	bool         m_isEmpty;
	bool         m_canceled;
	TQWidget     *m_widget;
	KTextEdit   *m_textEdit;
	TQLineEdit   *m_lineEdit;
	NoteContent *m_noteContent;

  public:
	NoteContent* noteContent() { return m_noteContent; }
	Note*        note();
  protected:
	void setEmpty() { m_isEmpty  = true; }
	void cancel()   { m_canceled = true; }
	void setInlineEditor(TQWidget *inlineEditor);
  public:
	virtual void validate() {}
	virtual void autoSave(bool /*toFileToo*/) {} // Same as validate(), but does not precede editor close and is triggered either while the editor widget changed size or after 3 seconds of inactivity.

  signals:
	void askValidation();
	void mouseEnteredEditorWidget();

  public:
	static NoteEditor* editNoteContent(NoteContent *noteContent, TQWidget *parent);
};

class TextEditor : public NoteEditor
{
  TQ_OBJECT
  
  public:
	TextEditor(TextContent *textContent, TQWidget *parent);
	~TextEditor();
	void validate();
	void autoSave(bool toFileToo);
  protected:
	TextContent *m_textContent;
};

class HtmlEditor : public NoteEditor
{
  TQ_OBJECT
  
  public:
	HtmlEditor(HtmlContent *htmlContent, TQWidget *parent);
	~HtmlEditor();
	void validate();
	void autoSave(bool toFileToo);
  protected:
	HtmlContent *m_htmlContent;
  public slots:
	void cursorPositionChanged();
	void textChanged();
	void fontChanged(const TQFont &font);
  protected slots:
//	void slotVerticalAlignmentChanged(TQTextEdit::VerticalAlignment align);
	//	void setBold();
	//	void setItalic();
	//	void setUnderline();
	void setLeft();
	void setCentered();
	void setRight();
	void setBlock();
};

class ImageEditor : public NoteEditor
{
  TQ_OBJECT
  
  public:
	ImageEditor(ImageContent *imageContent, TQWidget *parent);
};

class AnimationEditor : public NoteEditor
{
  TQ_OBJECT
  
  public:
	AnimationEditor(AnimationContent *animationContent, TQWidget *parent);
};

class FileEditor : public NoteEditor
{
  TQ_OBJECT
  
  public:
	FileEditor(FileContent *fileContent, TQWidget *parent);
	~FileEditor();
	void validate();
	void autoSave(bool toFileToo);
  protected:
	FileContent *m_fileContent;
};

class LinkEditor : public NoteEditor
{
  TQ_OBJECT
  
  public:
	LinkEditor(LinkContent *linkContent, TQWidget *parent);
};

class LauncherEditor : public NoteEditor
{
  TQ_OBJECT
  
  public:
	LauncherEditor(LauncherContent *launcherContent, TQWidget *parent);
};

class ColorEditor : public NoteEditor
{
  TQ_OBJECT
  
  public:
	ColorEditor(ColorContent *colorContent, TQWidget *parent);
};

class UnknownEditor : public NoteEditor
{
  TQ_OBJECT
  
  public:
	  UnknownEditor(UnknownContent *unknownContent, TQWidget *parent);
};

/** TQLineEdit behavior:
  * Create a new TQLineEdit with a text, then the user select a part of it and press ONE letter key.
  * The signal textChanged() is not emitted!
  * This class correct that!
  */
class DebuggedLineEdit : public TQLineEdit
{
  TQ_OBJECT
  
  public:
	DebuggedLineEdit(const TQString &text, TQWidget *parent = 0);
	~DebuggedLineEdit();
  protected:
	void keyPressEvent(TQKeyEvent *event);
};

/** The dialog to edit Link Note content.
  * @author S�astien Laot
  */
class LinkEditDialog : public KDialogBase
{
  TQ_OBJECT
  
  public:
	LinkEditDialog(LinkContent *contentNote, TQWidget *parent = 0);
	~LinkEditDialog();
	void polish();
  protected slots:
	void slotOk();
	void urlChanged(const TQString&);
	void doNotAutoTitle(const TQString&);
	void doNotAutoIcon(TQString);
	void guessTitle();
	void guessIcon();
  private:
	LinkContent   *m_noteContent;
	bool           m_isAutoModified;
	KURLRequester *m_url;
	TQLineEdit     *m_title;
	TDEIconButton   *m_icon;
	TQPushButton   *m_autoTitle;
	TQPushButton   *m_autoIcon;
};


/** The dialog to edit Launcher Note content.
  * @author S�astien Laot
  */
class LauncherEditDialog : public KDialogBase
{
  TQ_OBJECT
  
  public:
	LauncherEditDialog(LauncherContent *contentNote, TQWidget *parent = 0);
	~LauncherEditDialog();
	void polish();
  protected slots:
	void slotOk();
	void guessIcon();
  private:
	LauncherContent     *m_noteContent;
	RunCommandRequester *m_command;
	TQLineEdit           *m_name;
	TDEIconButton         *m_icon;
};

/** This class manage toolbars for the inline editors.
  * The toolbars should be created once at the application startup,
  * then KXMLGUI can manage them and save theire state and position...
  * @author S�astien Laot
  */
class InlineEditors : public TQObject
{
  TQ_OBJECT
  
  public:
	InlineEditors();
	~InlineEditors();
	void initToolBars(TDEActionCollection *actionCollection);
	static InlineEditors* instance();

  public:
	// Rich Text ToolBar:
	TDEToolBar* richTextToolBar();
	void enableRichTextToolBar();
	void disableRichTextToolBar();
	FocusedFontCombo  *richTextFont;
	FontSizeCombo     *richTextFontSize;
	FocusedColorCombo *richTextColor;
	TDEToggleAction     *richTextBold;
	TDEToggleAction     *richTextItalic;
	TDEToggleAction     *richTextUnderline;
//	TDEToggleAction     *richTextSuper;
//	TDEToggleAction     *richTextSub;
	TDEToggleAction     *richTextLeft;
	TDEToggleAction     *richTextCenter;
	TDEToggleAction     *richTextRight;
	TDEToggleAction     *richTextJustified;
	TDEAction	  *richTextUndo;
	TDEAction	  *richTextRedo;
};

#endif // NOTEEDIT_H
