/***************************************************************************
                          kcoloreditdoc.h  -  description
                             -------------------
    begin                : Sat Jul  8 09:57:28 CEST 2000
    copyright            : (C) 2000 by Artur Rataj
    email                : art@zeus.polsl.gliwice.pl
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   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 KCOLOREDITDOC_H
#define KCOLOREDITDOC_H

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

// include files for QT
#include <qobject.h>
#include <qstring.h>
#include <qptrlist.h>

// application specific includes
#include "palette.h"
#include "palettehistory.h"

// forward declaration of the KColorEdit classes
class KColorEditView;

/**	KColorEditDoc provides a document object for a document-view model.
  *
  * The KColorEditDoc class provides a document object that can be used in conjunction with the classes KColorEditApp and KColorEditView
  * to create a document-view model for standard KDE applications based on KApplication and KMainWindow. Thereby, the document object
  * is created by the KColorEditApp instance and contains the document structure with the according methods for manipulation of the document
  * data by KColorEditView objects. Also, KColorEditDoc contains the methods for serialization of the document data from and to files.
  *
  * @author Source Framework Automatically Generated by KDevelop, (c) The KDevelop Team.
  * @version KDevelop version 0.4 code generation
  */
class KColorEditDoc : public QObject
{
  Q_OBJECT

  public:
    /** Constructor for the fileclass of the application */
    KColorEditDoc(QWidget *parent, const char *name=0);
    /** Destructor for the fileclass of the application */
    ~KColorEditDoc();

    /** adds a view to the document which represents the document contents. Usually this is your main view. */
    void addView(KColorEditView *view);
    /** removes a view from the list of currently connected views */
    void removeView(KColorEditView *view);
    /** sets the modified flag for the document after a modifying action on the view connected to the document.*/
    void setModified(bool modified);
    /** returns if the document is modified or not. Use this to determine if your document needs saving by the user on closing.*/
    bool isModified() const { return m_modified; };
    /** "save modified" - asks the user for saving if the document is modified */
    bool saveModified();
    /** deletes the document's contents */
    void deleteContents();
    /** initializes the document generally */
    bool newDocument();
    /** closes the actual document */
    void closeDocument();
    /** loads the document */
    bool openDocument(const QString& filename);
    /** saves the document */
    bool saveDocument(const QString& filename);
    /** sets the path to the file connected with the document */
    void setAbsFilePath(const QString &filename);
    /** returns the pathname of the current document file*/
    const QString& absFilePath() const;
    /** sets the filename of the document */
    void setTitle(const QString &_t);
    /** returns the title of the document */
    const QString& title() const;
		/** @return a description of a possible unsuccessfull IO operation */
		const QString& errorString() const;
		/** returns a pointer to paletteHistory */
		PaletteHistory* paletteHistory();
		/** sets a palette cursor position */
		void setPaletteCursorPos(const int pos);
		/** @return a palette cursor position */
		int paletteCursorPos();
		/** Sets palette selection and enables or disables cut/paste
		 *  depending on whether any colors are selected
		 */
		void setPaletteSelection(const int begin, const int end);
		/** Gets lesser selection position or equal selection position
		 *  if no colors are selected
		 */
		int paletteSelectionBegin() const;
		/** Gets greater selection position or equal selection position
		 *  if no colors are selected
		 */
		int paletteSelectionEnd() const;
		/** Copies a selection into a clipboard */
		void copy();
		/** Cuts a selection into a clipboard */
		void cut();
		/** Pastes a selection from a clipboard */
		void paste();
		/** Inserts a color at index */
		void insert(int index, const Color& color);
		/** Replaces a color at index */
		void replace(int index, const Color& color);

	protected:
		/** Sets an error string if an IO operation was unsuccesfull */
		void setErrorString(const QString& string);
		/** Copies a palette to clipboard */
		void copyToClipboard(Palette& palette);

  public slots:
    /** Calls redraw() on all views connected to the document object,
     *  except for sender if sender is not null
     */
    void slotRedrawAllViews(KColorEditView* sender, bool newDocument = false);
    /** Sets a view mode */
	void slotChangeViewMode(bool viewColorNames);

  signals:

    void selectionChanged( int, int );
    void clipboardChanged();
    void modified( bool );
    void paletteAvailable( bool );

  public:
    /** the list of the views currently connected to the document */
    QPtrList<KColorEditView> *m_pViewList;

  private:
    /** the modified flag of the current document */
    bool m_modified;
    QString m_title;
    QString m_absFilePath;
    QString m_errorString;

	protected:
		Palette m_palette;
		PaletteHistory m_paletteHistory;
		int m_paletteCursorPos;
		int m_paletteSelectionBegin;
		int m_paletteSelectionEnd;
};

#endif // KCOLOREDITDOC_H
