/*****
*
* TOra - An Oracle Toolkit for DBA's and developers
* Copyright (C) 2003-2005 Quest Software, Inc
* Portions Copyright (C) 2005 Other Contributors
* 
* 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;  only version 2 of
* the License is valid for this program.
* 
* 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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*
*      As a special exception, you have permission to link this program
*      with the Oracle Client libraries and distribute executables, as long
*      as you follow the requirements of the GNU GPL in regard to all of the
*      software in the executable aside from Oracle client libraries.
*
*      Specifically you are not permitted to link this program with the
*      Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech.
*      And you are not permitted to distribute binaries compiled against
*      these libraries without written consent from Quest Software, Inc.
*      Observe that this does not disallow linking to the Qt Free Edition.
*
*      You may link this product with any GPL'd Qt library such as Qt/Free
*
* All trademarks belong to their respective owners.
*
*****/

#ifndef TOEDITWIDGET_H
#define TOEDITWIDGET_H

#include "config.h"

#include <list>

#include <qwidget.h>

class toSearchReplace;

/** This is an abstract base class for any widget (Not included in object) that wants to
 * access copy, cut, paste, open, save commands of the user interface.
 */
class toEditWidget
{
public:
    /** Class used to extent how to enable/disable parts of the interface as
     * focus changes.
     */
    class editHandler
    {
    public:
        /** Constructor.
         */
        editHandler();
        /** Destructor.
         */
        virtual ~editHandler();
        /** Called when a new widget receives the focus.
         */
        virtual void receivedFocus(toEditWidget *widget) = 0;
        /** Called when a widget loses the focus.
         */
        virtual void lostFocus(toEditWidget *widget) = 0;
    };
private:
    bool Open;
    bool Save;
    bool Print;
    bool Undo;
    bool Redo;
    bool Cut;
    bool Copy;
    bool Paste;
    bool Search;
    bool SelectAll;
    bool ReadAll;
    void setMainSettings(void);

    static std::list<editHandler *> *Handlers;
public:
    /** Empty constructor, all functions are disabled.
     */
    toEditWidget();
    /** Specified constructor, all functions are specified in the constructor.
     */
    toEditWidget(bool open, bool save, bool print,
                 bool undo, bool redo,
                 bool cut, bool copy, bool paste,
                 bool search,
                 bool selectAll, bool readAll);
    virtual ~toEditWidget();

    /** Specify new enabled functions.
     */
    void setEdit(bool open, bool save, bool print,
                 bool undo, bool redo,
                 bool cut, bool copy, bool paste,
                 bool search,
                 bool selectAll, bool readAll);

    /** Perform an open on this widget. Default NOP.
     * @param file The file to open, if not specified prompt for file.
     */
    virtual bool editOpen(QString file = QString::null);
    /** Perform a save on this widget. Default NOP.
     * @param askfile Ask filename even if default filename is available.
     */
    virtual bool editSave(bool askfile);
    /** Print this widgets contents. Default NOP.
     */
    virtual void editPrint(void)
    { }
    /** Perform undo. Default NOP.
     */
    virtual void editUndo(void)
    { }
    /** Perform redo. Default NOP.
     */
    virtual void editRedo(void)
    { }
    /** Perform cut. Default NOP.
     */
    virtual void editCut(void)
    { }
    /** Perform copy. Default NOP.
     */
    virtual void editCopy(void)
    { }
    /** Perform paste. Default NOP.
     */
    virtual void editPaste(void)
    { }
    /** Select all contents. Default NOP.
     */
    virtual void editSelectAll(void)
    { }
    /** Read all available data. Default NOP.
     */
    virtual void editReadAll(void)
    { }

    /** Set if open is enabled.
     */
    void openEnabled(bool val)
    {
        Open = val;
        setMainSettings();
    }
    /** Set if save is enabled.
     */
    void saveEnabled(bool val)
    {
        Save = val;
        setMainSettings();
    }
    /** Set if print is enabled.
     */
    void printEnabled(bool val)
    {
        Print = val;
        setMainSettings();
    }
    /** Set if undo is enabled.
     */
    void undoEnabled(bool val)
    {
        Undo = val;
        setMainSettings();
    }
    /** Set if redo is enabled.
     */
    void redoEnabled(bool val)
    {
        Redo = val;
        setMainSettings();
    }
    /** Set if cut is enabled.
     */
    void cutEnabled(bool val)
    {
        Cut = val;
        setMainSettings();
    }
    /** Set if copy is enabled.
     */
    void copyEnabled(bool val)
    {
        Copy = val;
        setMainSettings();
    }
    /** Set if paste is enabled.
     */
    void pasteEnabled(bool val)
    {
        Paste = val;
        setMainSettings();
    }
    /** Set if search is enabled.
     */
    void searchEnabled(bool val)
    {
        Search = val;
        setMainSettings();
    }
    /** Set if select all is enabled.
     */
    void selectAllEnabled(bool val)
    {
        SelectAll = val;
        setMainSettings();
    }
    /** Set if read all is enabled.
     */
    void readAllEnabled(bool val)
    {
        ReadAll = val;
        setMainSettings();
    }

    /** Check if open is enabled.
     */
    bool openEnabled(void)
    {
        return Open;
    }
    /** Check if save is enabled.
     */
    bool saveEnabled(void)
    {
        return Save;
    }
    /** Check if print is enabled.
     */
    bool printEnabled(void)
    {
        return Print;
    }
    /** Check if undo is enabled.
     */
    bool undoEnabled(void)
    {
        return Undo;
    }
    /** Check if redo is enabled.
     */
    bool redoEnabled(void)
    {
        return Redo;
    }
    /** Check if cut is enabled.
     */
    bool cutEnabled(void)
    {
        return Cut;
    }
    /** Check if copy is enabled.
     */
    bool copyEnabled(void)
    {
        return Copy;
    }
    /** Check if paste is enabled.
     */
    bool pasteEnabled(void)
    {
        return Paste;
    }
    /** Check if search is enabled.
     */
    bool searchEnabled(void)
    {
        return Search;
    }
    /** Check if select all is enabled.
     */
    bool selectAllEnabled(void)
    {
        return SelectAll;
    }
    /** Check if read all is enabled.
     */
    bool readAllEnabled(void)
    {
        return ReadAll;
    }

    /** Move to top of data
     */
    virtual void searchTop(void)
    { }
    /** Search for next entry
     * @return True if found, should select the found text.
     */
    virtual bool searchNext(toSearchReplace *search);
    /** Replace entry with new data
     */
    virtual void searchReplace(const QString &newData);
    /** Check if data can be modified by search
     * @param all If true can replace all, otherwise can replace right now.
     */
    virtual bool searchCanReplace(bool all);

    /** Call this when this widget has received the focus. Must be called by the implementor.
     */
    virtual void receivedFocus(void);
    /** Called when this widget has lost the focus. Don't forget to call parent when reimplemented.
     */
    virtual void lostFocus(void);

    /** Add a hook to be called every time focus changes.
     */
    static void addHandler(editHandler *handler);
    /** Removed a hook from being called every time focus changes.
     */
    static void delHandler(editHandler *handler);
};

#endif
