/**
 * Copyright (C) 2003 Joonas Koivunen <rzei@mbnet.fi>
 * Copyright (C) 2003 Koos Vriezen <koos.vriezen@xs4all.nl>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library 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
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public License
 * along with this library; see the file COPYING.LIB.  If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

#ifndef _KMPlayerPREF_H_
#define _KMPlayerPREF_H_

#include "kmplayer_def.h"

#include <kdialogbase.h>
#include <tqframe.h>
#include <tqmap.h>

class TQTabWidget;
class TQTable;
class TQGroupBox;
class TQCheckBox;
class TQComboBox;
class TQLineEdit;
class TQRadioButton;
class TQSlider;
class TQSpinBox;
class TQColor;
class TQButtonGroup;
class KHistoryCombo;
class KComboBox;
class KURLRequester;
class KColorButton;

namespace KMPlayer {

class PrefGeneralPageGeneral; 	// general, general
class PrefSourcePageURL;        // source, url
class PrefRecordPage;           // recording
class RecorderPage;                     // base recorder
class PrefMEncoderPage;         // mencoder
class PrefMPlayerDumpstreamPage; // mplayer -dumpstream
class PrefFFMpegPage;           // ffmpeg
class PrefXinePage;             // xine url:record
class PrefGeneralPageLooks; 	// general, looks
class PrefGeneralPageOutput;	// general, output
class PrefOPPageGeneral;	// OP = outputplugins, general
class PrefOPPagePostProc;	// outputplugins, postproc
class PartBase;
class Source;
class Settings;
class PreferencesPage;
class OutputDriver;
class ColorSetting;
class FontSetting;

class KMPLAYER_NO_EXPORT Preferences : public KDialogBase
{
    Q_OBJECT
  
public:

    Preferences(PartBase *, Settings *);
    ~Preferences();

    PrefGeneralPageGeneral 	*m_GeneralPageGeneral;
    PrefSourcePageURL 		*m_SourcePageURL;
    PrefRecordPage 		*m_RecordPage;
    PrefMEncoderPage            *m_MEncoderPage;
    PrefMPlayerDumpstreamPage   *m_MPlayerDumpstreamPage;
#ifdef HAVE_XINE
    PrefXinePage                *m_XinePage;
#endif
    PrefFFMpegPage              *m_FFMpegPage;
    PrefGeneralPageLooks 	*m_GeneralPageLooks;
    PrefGeneralPageOutput 	*m_GeneralPageOutput;
    PrefOPPageGeneral 		*m_OPPageGeneral;
    PrefOPPagePostProc		*m_OPPagePostproc;
    void setDefaults();
    void setPage (const char *);
    void addPrefPage (PreferencesPage *);
    void removePrefPage (PreferencesPage *);

    RecorderPage * recorders;
    TQMap<TQString, TQTabWidget *> entries;
public slots:
    void confirmDefaults();
};

class KMPLAYER_NO_EXPORT PrefGeneralPageGeneral : public TQFrame
{
    Q_OBJECT
  
public:
    PrefGeneralPageGeneral(TQWidget *parent, Settings *);
    ~PrefGeneralPageGeneral() {}

    TQCheckBox *keepSizeRatio;
    TQCheckBox * autoResize;
    TQButtonGroup *sizesChoice;
    TQCheckBox *dockSysTray;
    TQCheckBox *loop;
    TQCheckBox *showConfigButton;
    TQCheckBox *showPlaylistButton;
    TQCheckBox *showRecordButton;
    TQCheckBox *showBroadcastButton;
    TQCheckBox *framedrop;
    TQCheckBox *adjustvolume;
    TQCheckBox *adjustcolors;

    TQSpinBox *seekTime;
};

class KMPLAYER_NO_EXPORT PrefGeneralPageLooks : public TQFrame {
    Q_OBJECT
  
public:
    PrefGeneralPageLooks (TQWidget *parent, Settings *);
    ~PrefGeneralPageLooks () {}
    TQComboBox *colorscombo;
    KColorButton *colorbutton;
    TQComboBox *fontscombo;
    TQPushButton *fontbutton;
public slots:
    void colorItemChanged (int);
    void colorCanged (const TQColor &);
    void fontItemChanged (int);
    void fontClicked ();
private:
    ColorSetting * colors;
    FontSetting * fonts;
};

class KMPLAYER_NO_EXPORT PrefSourcePageURL : public TQFrame
{
    Q_OBJECT
  
public:
    PrefSourcePageURL (TQWidget *parent);
    ~PrefSourcePageURL () {}

    KURLRequester * url;
    //KHistoryCombo * url;
    KComboBox * urllist;
    KURLRequester * sub_url;
    KComboBox * sub_urllist;
    TQListBox * backend;
    TQCheckBox * allowhref;
    TQLineEdit * prefBitRate;
    TQLineEdit * maxBitRate;
    bool changed;
private slots:
    void slotBrowse ();
    void slotTextChanged (const TQString &);
};


class KMPLAYER_NO_EXPORT PrefRecordPage : public TQFrame
{
    Q_OBJECT
  
public:
    PrefRecordPage (TQWidget *parent, PartBase *, RecorderPage *, int len);
    ~PrefRecordPage () {}

    KURLRequester * url;
    TQButtonGroup * recorder;
    TQButtonGroup * replay;
    TQLineEdit * replaytime;
    TQLabel * source;
public slots:
    void replayClicked (int id);
    void recorderClicked (int id);
private slots:
    void slotRecord ();
    void playingStopped ();
    void sourceChanged (KMPlayer::Source *, KMPlayer::Source *);
    void recordingStarted ();
    void recordingFinished ();
private:
    PartBase * m_player;
    RecorderPage * m_recorders;
    TQPushButton * recordButton;
    int m_recorders_length;
};

class KMPLAYER_NO_EXPORT RecorderPage : public TQFrame
{
    Q_OBJECT
  
public:
    RecorderPage (TQWidget *parent, PartBase *);
    virtual ~RecorderPage () {};
    virtual void record ();
    virtual TQString name () = 0;
    virtual const char * recorderName () = 0;
    RecorderPage * next;
protected:
    PartBase * m_player;
};

class KMPLAYER_NO_EXPORT PrefMEncoderPage : public RecorderPage 
{
    Q_OBJECT
  
public:
    PrefMEncoderPage (TQWidget *parent, PartBase *);
    ~PrefMEncoderPage () {}

    void record ();
    TQString name ();
    const char * recorderName () { return "mencoder"; }

    TQLineEdit * arguments;
    TQButtonGroup * format;
public slots:
    void formatClicked (int id);
private:
};

class KMPLAYER_NO_EXPORT PrefMPlayerDumpstreamPage : public RecorderPage {
public:
    PrefMPlayerDumpstreamPage (TQWidget *parent, PartBase *);
    ~PrefMPlayerDumpstreamPage () {}

    TQString name ();
    const char * recorderName () { return "mplayerdumpstream"; }
};

#ifdef HAVE_XINE
class KMPLAYER_NO_EXPORT PrefXinePage : public RecorderPage {
public:
    PrefXinePage (TQWidget *parent, PartBase *);
    ~PrefXinePage () {}

    TQString name ();
    const char * recorderName () { return "xine"; }
};
#endif

class KMPLAYER_NO_EXPORT PrefFFMpegPage : public RecorderPage
{
    Q_OBJECT
  
public:
    PrefFFMpegPage (TQWidget *parent, PartBase *);
    ~PrefFFMpegPage () {}

    void record ();
    TQString name ();
    const char * recorderName () { return "ffmpeg"; }

    TQLineEdit * arguments;
    TQButtonGroup * format;
private:
};


class KMPLAYER_NO_EXPORT PrefGeneralPageOutput : public TQFrame
{
    Q_OBJECT
  
public:
    PrefGeneralPageOutput (TQWidget *parent, OutputDriver * ad, OutputDriver * vd);
    ~PrefGeneralPageOutput() {}

    TQListBox *videoDriver;
    TQListBox *audioDriver;
};

class KMPLAYER_NO_EXPORT PrefOPPageGeneral : public TQFrame
{
    Q_OBJECT
  
public:
    PrefOPPageGeneral(TQWidget *parent = 0);
    ~PrefOPPageGeneral() {}
};

class KMPLAYER_NO_EXPORT PrefOPPagePostProc : public TQFrame
{
    Q_OBJECT
  
public:
    PrefOPPagePostProc(TQWidget *parent = 0);
    ~PrefOPPagePostProc() {}

    TQCheckBox* postProcessing;
    TQCheckBox* disablePPauto;
    TQTabWidget* PostprocessingOptions;

    TQRadioButton* defaultPreset;
    TQRadioButton* customPreset;
    TQRadioButton* fastPreset;

    TQCheckBox* HzDeblockFilter;
    TQCheckBox* VtDeblockFilter;
    TQCheckBox* DeringFilter;
    TQCheckBox* HzDeblockAQuality;
    TQCheckBox* VtDeblockAQuality;
    TQCheckBox* DeringAQuality;

    TQCheckBox* AutolevelsFilter;
    TQCheckBox* AutolevelsFullrange;
    TQCheckBox* HzDeblockCFiltering;
    TQCheckBox* VtDeblockCFiltering;
    TQCheckBox* DeringCFiltering;
    TQCheckBox* TmpNoiseFilter;
    TQSlider* TmpNoiseSlider;

    TQCheckBox* LinBlendDeinterlacer;
    TQCheckBox* CubicIntDeinterlacer;
    TQCheckBox* LinIntDeinterlacer;
    TQCheckBox* MedianDeinterlacer;
    TQCheckBox* FfmpegDeinterlacer;
};

} // namespace

#endif // _KMPlayerPREF_H_