#include <settings.h>
#include "mythdialogs.h"
#include "libmyth/mythdialogs.h"
#include "libmyth/mythwidgets.h"
#include "installsettings.h"

class AdvancedXNvidiaConnections: public TriggeredConfigurationGroup {
Q_OBJECT
public:
    AdvancedXNvidiaConnections();
    HostComboBox *HostXNvidiaConnection;
    HostComboBox *HostXnVidiaTVformat;
    HostComboBox *HostXnVidiaTVstandard;

public slots:
    void AdvancedXNvidiaConnectionsGatherSettings();
signals:
        void nVidia_sig(void);
};


class AdvancedXNvidia_modelines: public TriggeredConfigurationGroup {
    Q_OBJECT
public:
    AdvancedXNvidia_modelines();
    HostComboBox *HostXNvidiaModelineCatagory;
    HostComboBox *HostXNvidiaadvancedresVESA;
    HostComboBox *HostXNvidiaadvancedresATSC;
    HostComboBox *HostXNvidiaadvancedresDVD;
    HostComboBox *HostXNvidiaadvancedresNTSC;
    HostComboBox *HostXNvidiaadvancedresCustom;
    HostCheckBox *HostXnVidia1080p;
    HostCheckBox *HostXnVidia1080i;
    HostCheckBox *HostXnVidia720p;
    HostCheckBox *HostXnVidia480p;
    void Nvidia_fillselection(QString);
public slots:
    void AdvancedXNvidia_modelines_GatherSettings(void);
};


//-------------------------------------------------

class AdvancedXcardtype: public TriggeredConfigurationGroup {
Q_OBJECT
public:
    AdvancedXcardtype();
    HostComboBox *HostXcardtype;

public slots:
    void AdvancedXcardgatherSettings();
signals:
        void go(void );
        void goATI(void);
        void gonVidia(void);
};


class AdvancedXSettings:    public TriggeredConfigurationGroup {
Q_OBJECT
public:
    AdvancedXSettings();
    HostCheckBox *HostXIgnoreConfig;
protected slots:
    void ADJUSTEDID(void);
};


class AdvancedXGeneric_modelines: public TriggeredConfigurationGroup {
    Q_OBJECT
public:
    AdvancedXGeneric_modelines();
    HostComboBox *HostXModelineCatagory;
    HostComboBox *HostXadvancedresVESA;
    HostComboBox *HostXadvancedresATSC;
    HostComboBox *HostXadvancedresDVD;
    HostComboBox *HostXadvancedresNTSC;
    HostComboBox *HostXadvancedresCustom;
    void generic_fillselection(QString);
public slots:
    void AdvancedXGeneric_modelines_GatherSettings(void);
};


class EDIDOptions : public ConfigurationWizard
{
public:
    EDIDOptions();
};








void testXconfiguration();
void ReadDDCvalues();
static HostComboBox *HostXres()
//Used in the simple config
{
    HostComboBox *gc = new HostComboBox("HostXres");
    gc->setLabel(QObject::tr("Initial resolution"));
    const int num_defaults = 2;
    char *defaults[num_defaults]={"800x600","1280x720"};
    int defaults_added[num_defaults]={0,0};
    int found_modes_in_xorg_log = FALSE;

    gc->addSelection("Auto");

    {
      FILE *modelines;
      const char*mode_extract_command =
        "sed -n 's/[[:space:]]\\+/ /g;"             // compress whitespace
                "s/[\\) ]: /#/g;"              // Insert # as a field delimiter
		"/Modes in ModePool/,/ModePool/p'" // get the Modelool lines
		" /var/log/Xorg.0.log |"             // from the Xorg log
	"cut -d# -f2-3 | "            // select the mode and description fields
	"sed '/^\\\"/!d;"             // Only selest modeline lines.
	     "/DoubleScan/d;"         // Remove doublescan modelines.
	     "/nvidia-auto-select/d;" // Remove auto modeline.
             "s/ x /x/g;"
	     "s/ @ /@/g;"
             "s/From: //g;"
             "s/ Format [0-9]*) (/, /g;"
             "s/ Format [0-9]*//g;"
	     "s/ Server//g'"; //reformat. 
      cout << mode_extract_command << endl;
      modelines = popen (mode_extract_command, "r");

      char previous_mode[200]={0};

      if (modelines)
      {
	char line_in[200];
	while (fgets (line_in, sizeof (line_in), modelines))
	{
          char *separator;

	  if (strchr (line_in, '\n'))
	    strchr (line_in, '\n')[0]=0;

	  separator = strchr (line_in, '#');

	  if (separator)
	  {
	    separator[0]=0;
	    separator++;

  	    // Skip this mode if the description is identical to the previous.
	    if (strcmp (previous_mode, separator) == 0)
	      continue;

	    strncpy (previous_mode, separator, sizeof(previous_mode));
  	    gc->addSelection(separator, line_in);
	    found_modes_in_xorg_log = TRUE;

 	    for (int def = 0; def < num_defaults; def++)
	      if (strncmp (&line_in[1], defaults[def], strlen (defaults[def]))==0)
	        defaults_added[def]=1;
	  }
	}
	pclose (modelines);
      }
    }

    for (int def = 0; def < num_defaults; def++)
      if (!defaults_added[def])
	gc->addSelection(defaults[def], defaults[def]);

    if (found_modes_in_xorg_log)
      gc->setHelpText(QObject::tr("Choose a resolution to match your display and a refresh rate to match the content you will be recording - 60 Hz for NTSC (e.g. US) 50 Hz for PAL (e.g. UK, Aust, NZ)."));
    else
      gc->setHelpText(QObject::tr("Choose the resolution to use when the system reboots."));

    return gc;
}