// pixel_laden.cpp : implementation file
//

#include "stdafx.h"
#include "Ecopay.h"
#include "pixel_laden.h"
#include "datenbank.h"
#include <iostream>
#include <fstream>
#include <sstream>

IMPLEMENT_DYNAMIC(pixel_laden, CDialog)

pixel_laden::pixel_laden(CWnd* pParent /*=NULL*/)
	: CDialog(pixel_laden::IDD, pParent)
{

}



pixel_laden::~pixel_laden()
{
}



void pixel_laden::DoDataExchange(CDataExchange* pDX)
{
  CDialog::DoDataExchange(pDX);
  DDX_Control(pDX, IDC_PIXEL_LADEN_BUNDESLAND, m_auswahl_bundesland);
  DDX_Control(pDX, IDC_PIXEL_LADEN_SPALTENNAME, m_auswahl_spaltenname);
  DDX_Control(pDX, IDC_PIXEL_LADEN_TRENNZEICHEN, m_auswahl_trennzeichen);
  DDX_Control(pDX, IDC_PIXEL_LADEN_CSVSPALTENNAME, m_auswahl_csvspaltenname);
  DDX_Control(pDX, IDC_PIXEL_LADEN_BEZUGSPUNKT, m_auswahl_bezugspunkt);
  DDX_Control(pDX, IDC_PIXEL_LADEN_FORTSCHRITT, fortschritt);
  DDX_Control(pDX, IDC_PIXEL_LADEN_AKTION, m_auswahl_aktion);
  DDX_Control(pDX, IDC_STATIC_GREY, static_grey1);
}



BOOL pixel_laden::OnInitDialog()
{
  CDialog::OnInitDialog();
  
  // load the country names and pixelfields from the database
  datenbank* db = new datenbank();
  vector< CString> bundeslaender = db->returnbundeslandname();
  vector< CString> pixelfields = db->getpixelfields();
  delete db;
  
  // add the country names and pixelfields to their respective dropdown boxes
  vector< CString>::iterator i;
  for( i = bundeslaender.begin(); i != bundeslaender.end(); i++)
    m_auswahl_bundesland.AddString( *i);
  for( i = pixelfields.begin(); i != pixelfields.end(); i++)
    if( *i != "pixelID" &&
        *i != "bundesland" &&
        *i != "bundeslandID" &&
        *i != "x_koordinate" &&
        *i != "y_koordinate" &&
        *i != "matrix_i" &&
        *i != "matrix_j")
      m_auswahl_spaltenname.AddString( *i);

  // initially, "Pixel" is set as the action
  m_auswahl_aktion.SetCurSel( 0);
  aktion_auswahl = 0;
  
  // set the available separator characters
  m_auswahl_trennzeichen.AddString( ";");
  m_auswahl_trennzeichen.AddString( ",");
  m_auswahl_trennzeichen.AddString( ":");
  m_auswahl_trennzeichen.AddString( " (space)");
  m_auswahl_trennzeichen.AddString( "\t(tab)");
  m_auswahl_trennzeichen.SetCurSel( 0);
  // initially, ";" is selected as the separator
  trennzeichen_auswahl = 0;
  
  // initially, "unten links" (bottom left) is set as the reference point
  m_auswahl_bezugspunkt.SetCurSel( 0);
  
  return TRUE;
}



BEGIN_MESSAGE_MAP(pixel_laden, CDialog)
  ON_BN_CLICKED(IDC_CSV_FILESEARCH, &pixel_laden::OnBnClickedCsvFilesearch)
  ON_BN_CLICKED(IDC_PIXEL_LADEN_GO, &pixel_laden::OnBnClickedPixelLadenGo)
  ON_CBN_SELCHANGE(IDC_PIXEL_LADEN_TRENNZEICHEN, &pixel_laden::OnCbnSelchangePixelLadenTrennzeichen)
  ON_CBN_SELCHANGE(IDC_PIXEL_LADEN_AKTION, &pixel_laden::OnCbnSelchangePixelLadenAktion)
END_MESSAGE_MAP()



void pixel_laden::OnBnClickedCsvFilesearch()
{
  // display a file dialog for csv and txt files
  CFileDialog fileDlg( TRUE, NULL, NULL, OFN_HIDEREADONLY, 
          "CSV Files (*.csv;*.txt)|*.csv;*.txt|All Files (*.*)|*.*||", this);
  fileDlg.m_ofn.lpstrTitle = "CSV Datei-Auswahl";
  if ( fileDlg.DoModal() == IDOK)
  {
    // once a file is selected, do some sanity checks on it
    CString filename = fileDlg.GetPathName(); 
    ifstream csvFile( filename);
    
    // reset the list of column names and the file name
    // this will be filled again if the format of the selected file is valid
    m_auswahl_csvspaltenname.ResetContent();
    GetDlgItem( IDC_CSV_FILENAME)->SetWindowTextA( "");
    
    if( csvFile.is_open())
    { 
      if( !csvFile.eof())
      {
        // read the separator character that is selected
        CString separator_buf;
        m_auswahl_trennzeichen.GetLBText( 
                m_auswahl_trennzeichen.GetCurSel(),
                separator_buf);
        char separator = separator_buf[0];
        
        // read the first line of the file that contains column name information
        char buf[ 1024];
        csvFile.getline( buf, 1024);

        // there need to be columns for the x value, the y value and at least 
        // one other with attribute values
        bool columnsFound = false;
        bool xFound = false;
        bool yFound = false;

        // go through the line one character at a time to identify tokens        
        int pos = 0;
        CString token = "";
        while( buf[ pos] != 0)
        {
          // if the separator is found, a token ends and needs to be checked
          if( buf[ pos] == separator)
          {
	          if( token == "\"X\"")
	            xFound = true;
	          else if( token == "\"Y\"")
	            yFound = true;
	          else if( aktion_auswahl == 1 && 
	                   token != "\"Zeilen_ID\"" && 
	                   token != "\"Row_ID\"")
	          {
	            columnsFound = true;
		          m_auswahl_csvspaltenname.AddString( token);
		        }
		        // empty the token after it is processed
            token = "";
          }
          else
          {
            // the token has not ended yet, append this character to it
            CString tmp( buf[ pos]);
            token.Append( tmp);
          }
          pos++;
        }        
        // the last token may not end with a separator so it needs to be
        // processed after the end of line is reached
        if( token != "")
        {
    	    if( token == "\"X\"")
            xFound = true;
          else if( token == "\"Y\"")
            yFound = true;
          else if( aktion_auswahl == 1 &&
                   token != "\"Zeilen_ID\"" && 
                   token != "\"Row_ID\"")
          {
            columnsFound = true;
            m_auswahl_csvspaltenname.AddString( token);
          }
        }
	      
	      // check whether the columns for the x and y values where found
	      if( !xFound || !yFound)
	      {
	        m_auswahl_csvspaltenname.ResetContent();
	        AfxMessageBox( "Es konnte keine Spalte fuer die X- und/oder die "
	                       "Y-Werte gefunden werden!\nDie Datei hat nicht das "
	                       "richtige Format. Bitte passen Sie das Trennzeichen "
	                       "an oder waehlen Sie eine andere Datei!", MB_OK);
	        csvFile.close();
          return;
	      }
	      // if the action is set to "Attribute" check 
	      // whether at least one other column was found
	      if( aktion_auswahl == 1 && !columnsFound)
	      {
	        AfxMessageBox( "Es konnten keine Spalten fuer die Attributwerte "
	                       "gefunden werden!\nDie Datei hat nicht das "
	                       "richtige Format. Bitte passen Sie das Trennzeichen "
	                       "an oder waehlen Sie eine andere Datei!", MB_OK);
	        csvFile.close();
          return;
	      }
      }
      else // csvFile.eof()
      {
        AfxMessageBox( "Datei '" + filename + "' ist leer!\n"
                       "Bitte waehlen Sie eine andere Datei!", MB_OK);
        csvFile.close();
        return;
      }
      
      // if this point is reached the file meets all the requirements
      GetDlgItem( IDC_CSV_FILENAME)->SetWindowTextA( filename);
      csvFile.close();
    }
    else // !csvFile.is_open()
      AfxMessageBox( "Datei '" + filename + "' konnte nicht geoeffnet werden!\n"
                     "Bitte ueberpruefen Sie die Datei!", MB_OK);
  }
}



void pixel_laden::OnBnClickedPixelLadenGo()
{
  // check whether all input fields are ok
  if( !checkInput())
    return;
  
  // open the csv file, determine the required columns, the separator and 
  // the length of the file
  int xCol, yCol, attCol, length;
  char separator;
  ifstream* csvFile = openCSVFile( xCol, yCol, attCol, separator, length);
  // NULL is returned if anything is wrong with the file
  if( csvFile == NULL)
    return;
  
  // load the reference points for the selected country's matrix 
  datenbank* db = new datenbank();
  CString bundeslandname;
  m_auswahl_bundesland.GetLBText( 
                m_auswahl_bundesland.GetCurSel(),
                bundeslandname);
  double llCornerX, llCornerY;
  int rowCount, colCount;
  int bundeslandID = db->returnbundeslandID( bundeslandname);
  
  if( !db->get_matrix_referenz( 
          rowCount, colCount, llCornerX, llCornerY, bundeslandID))
  {
    AfxMessageBox( "Es konnte keine Matrix-Referenz fuer das gewaehlte "
                   "Bundesland in der Datenbank gefunden werden!\n"
                   "Bitte bearbeiten Sie die Datenbank und versuchen Sie es "
                   "erneut.", MB_OK);
    delete db;
    csvFile->close();
    delete( csvFile);
    return;
  }
  
  // if this point is reached the file is ready to be processed
  // start logging
  bool logging;
  ofstream logFile( "log.txt");
  if( !logFile.is_open())
  {
    if( AfxMessageBox( "Datei 'log.txt' konnte nicht erstellt/geoffnet werden."
                       "\nMoechten Sie ohne Logging fortfahren?", MB_YESNO)
          == IDYES)
      logging = false;
    else
    {
      delete db;
      csvFile->close();
      delete( csvFile);
      return;
    }
  }
  else
    logging = true;
  
  AfxMessageBox( "Eingabe akzeptiert, bitte druecken Sie OK,\num mit der "
                 "Verarbeitung zu beginnen!", MB_OK);
  
  // first read some of the dialog input into variables for easy reference
  
  // parse and store the side length; its validity has already been checked
  CString sideLength_str;
  GetDlgItem( IDC_PIXEL_LADEN_SEITENLAENGE)->GetWindowTextA( sideLength_str);
  sideLength_str.Replace( ",", ".");
  double sideLength = strtod( sideLength_str, NULL);
  
  // store the name of the database column holding the attribute to be read in
  CString attname;
  if( aktion_auswahl == 1)
    m_auswahl_spaltenname.GetLBText( m_auswahl_spaltenname.GetCurSel(), 
                                     attname);
  else
    attname = "";

  // is the lower left corner or the center the reference point of the pixel?
  // rewrite this if more options added!
  bool llReference = m_auswahl_bezugspunkt.GetCurSel() == 0;
  
  fortschritt.ShowWindow( TRUE);
  fortschritt.SetRange32( 0, length);
  fortschritt.SetPos( 0);
  
  if( logging)
  {
    logFile.precision( 10);
    logFile << "BundeslandID fuer '" << bundeslandname << "': " 
            << bundeslandID << "\n"
            << "Matrix-Referenz:\n\t"
            << "x-Koordinate (unten links): " << llCornerX << "\n\t"
            << "y-Koordinate (unten links): " << llCornerY << "\n\t"
            << "Zeilenanzahl: " << rowCount << "\n\t"
            << "Spaltenanzahl: " << colCount << "\n"
            << "Index des Tokens mit der x-Koordinate: " << xCol << "\n" 
            << "Index des Tokens mit der y-Koordinate: " << yCol << "\n\t"
            << "(Koordinaten beziehen sich auf die " 
            << (llReference ? "linke untere Ecke" : "Mitte") << " des Pixels)\n"
            << "Seitenlaenge der Pixel: " << sideLength << "m\n";
    if( aktion_auswahl == 1)
    {
      logFile << "Index des Tokens mit dem Attributwert: " << attCol << "\n"
              << "Ausgewaehlte Spalte in der Datenbank: " << attname << "\n\n";
    }
    else
      logFile << "\n";
  }
    
  // process all lines of the file and count faulty entries 
  int lineCount = 1;
  int offGrid = 0;
  int emptyTokens = 0;
  while( !csvFile->eof())
  {
    // read the next line from the stream
    char buf[ 1024];
    csvFile->getline( buf, 1024);
    
    // as the line is parsed tokens will be stored in this variable
    CString token = "";
    // required tokens are stored more permanently in these variables
    CString xToken = "";
    CString yToken = "";
    CString attToken = "";
    
    if( logging)
    {
      logFile << "Verarbeite Eintrag " << lineCount;
      logFile << "\n\t\"" << buf << "\"\n";
    }
        
    // go through the line one character at a time and identify tokens
    int pos = 0;
    // i is the index of the current token (needed to identify required ones)
    int i = 0;
    while( buf[ pos] != 0)
    {
      if( buf[ pos] == separator)
      {
        // if the separator is found a token has ended
        if( logging)
          logFile << "\n\tToken" << i << " = \"" << token << "\"";
        token = "";
        i++;
      }
      else
      {
        // otherwise store this character in the current token
        CString tmp( buf[ pos]);
        token.Append( tmp);
        // also store it for later if required
        if( i == xCol)
          xToken.Append( tmp);
        else if( i == yCol)
          yToken.Append( tmp);
        // note that attCol is -1 if action is set to "Pixel" so this works
        else if( i == attCol)
          attToken.Append( tmp);
      }
      pos++;
    }
    if( logging)
      logFile << "\n\tToken" << i << " = \"" << token << "\"\n";
    
    // check whether all required tokens were found
    if( xToken == "" || yToken == "" || (aktion_auswahl == 1 && attToken == ""))
    {
      if( logging)
      {
        logFile << "\n\tVerarbeitung von Eintrag " << lineCount 
                << " fehlgeschlagen:\n";
        if( xToken == "")
          logFile << "\tx-Koordinate nicht gefunden!\n";
        if( yToken == "")
          logFile << "\ty-Koordinate nicht gefunden!\n";
        if( aktion_auswahl == 1 && attToken == "") 
          logFile << "\tAttributwert nicht gefunden!\n";
        logFile << "\n";
        emptyTokens++;
      }
    }
    else
    {
      // all required tokens were found; now process them
      // first determine x and y matrix coordinates from the x and y values read
      double xValue, yValue, xCoord, yCoord;
      xToken.Replace( ",", ".");
      xValue = strtod( xToken, NULL);
      xCoord = (xValue - llCornerX - (llReference?0.0:sideLength/2))/sideLength;
      yToken.Replace( ",", ".");
      yValue = strtod( yToken, NULL);
      yCoord = (yValue - llCornerY - (llReference?0.0:sideLength/2))/sideLength;
      
      // xCoord and yCoord must have integer values (except for rounding errors)
      // otherwise xValue and yValue do not refer exactly to a reference point
      if( xCoord - floor( xCoord) > 0.0001 || yCoord - floor( yCoord) > 0.0001)
      {
        if( logging)
        {
          logFile << "\n\tVerarbeitung von Eintrag " << lineCount 
                  << " fehlgeschlagen:";
          if( xCoord - floor( xCoord) > 0.0001)
            logFile << "\n\tx-Koordinate passt nicht ins Pixelraster. ";
          if( yCoord - floor( yCoord) > 0.0001)
            logFile << "\n\ty-Koordinate passt nicht ins Pixelraster.";
          logFile << "\n\n";
          offGrid++;
        }
      }
      else
      {
        xCoord = floor( xCoord);
        yCoord = floor( yCoord);
        // compute the matrix_i and matrix_j coordinates from the x and y ones 
        int matrix_i, matrix_j;
        matrix_i = rowCount - (int) yCoord - 1;
        matrix_j = (int) xCoord;
        
        // check that the pixel lies within the raster boundaries
        if( matrix_i < 0 || matrix_i >= rowCount || 
            matrix_j < 0 || matrix_j >= colCount)
        {
          if( logging)
          {
            logFile << "\n\tVerarbeitung von Eintrag " << lineCount 
                    << " fehlgeschlagen:";
            if( matrix_i < 0 || matrix_i >= rowCount)
              logFile << "\n\ty-Koordinate liegt ausserhalb des Pixelrasters. ";
            if( matrix_j < 0 || matrix_j >= colCount)
              logFile << "\n\tx-Koordinate liegt ausserhalb des Pixelrasters.";
            logFile << "\n\n";
            offGrid++;
          }
        }
        else
        {
          // all required information was found and appears valid;
          // now send it to the database
          string error;
          
          if( aktion_auswahl == 1)
          {
            // send an update about this attribute value
            attToken.Replace( ",", ".");
            
            // log the sql command 
            // (change this if datenbank::updatePixel is changed!)
            if( logging)
            {
              logFile << "\n\tSende folgenden Befehl an die Datenbank:\n\t";
              stringstream query_stringstream;
              query_stringstream << "UPDATE pixel SET " 
                      << attname << "='" << attToken << "' "
                      << "WHERE bundeslandID='" << bundeslandID << "' "
                      << "AND x_koordinate='" << ((int)floor( xCoord)) << "' "
                      << "AND y_koordinate='" << ((int)floor( yCoord)) << "';"
                      << "\n\n";
              logFile << query_stringstream.str();
            }
            
            error = db->updatePixel( bundeslandID, xCoord, yCoord, 
                                     attname, attToken);
          }
          else
          {
            // insert a new pixel
            
            // log the sql command 
            // (change this if datenbank::insertPixel is changed!)
            if( logging)
            {
              logFile << "\n\tSende folgenden Befehl an die Datenbank:\n\t";
              stringstream query_stringstream;
              query_stringstream << "INSERT INTO pixel (bundeslandID, "
                      << "bundesland, x_koordinate, y_koordinate, "
                      << "matrix_i, matrix_j) VALUES('" 
                      << bundeslandID << "', '" << bundeslandname << "', '" 
                      << ((int)floor( xCoord)) << "', '" 
                      << ((int)floor( yCoord)) << "', '" 
                      << matrix_i << "', '" << matrix_j << "');\n\n";
              logFile << query_stringstream.str();
            }
            
            error = db->insertPixel( bundeslandID, bundeslandname, 
                                     xCoord, yCoord, matrix_i, matrix_j);
          }
          
          if( error != "")
          {
            char er[ 1000];
            lstrcpy( er, error.c_str());
            AfxMessageBox( er, MB_OK);
            AfxMessageBox( "Das Programm wird beendet.\n"
                    "Stellen Sie sicher, dass die "
                    "Datenbankverbindung verfügbar ist \n"
                    "und starten Sie das Programm erneut.", MB_OK);
            delete db;
            csvFile->close();
            delete( csvFile);
            if( logging)
            {
              logFile << "Ein kritischer Fehler ist aufgetreten!";
              logFile.close();
            }
            exit( 1);
          }
        }
      }
    }
    fortschritt.SetPos( csvFile->tellg());
    lineCount++;
  }
  
  if( logging)
  {
    logFile << "\n\nverarbeitete Eintraege: " << lineCount - 1 << "\n"
            << "unvollstaendige Eintraege: " << emptyTokens << "\n"
            << "nicht zum Raster passende Eintraege: " << offGrid << "\n" 
            << "-> an die Datenbank gesendete Befehle: " 
            << lineCount - 1 - emptyTokens - offGrid << "\n";
  }
  
  fortschritt.ShowWindow( FALSE);
  if( logging)
    AfxMessageBox( "Verarbeitung abgeschlossen!\n"
                   "Ergebnisse finden Sie in der Datei 'log.txt'.", MB_OK);
  else
    AfxMessageBox( "Verarbeitung abgeschlossen!", MB_OK);
  
  delete db;
  csvFile->close();
  delete( csvFile);
  if( logFile.is_open())
    logFile.close();
}



bool pixel_laden::checkInput()
{
  if( GetDlgItem( IDC_CSV_FILENAME)->GetWindowTextLengthA() == 0)
  {
    AfxMessageBox( "Bitte waehlen Sie eine CSV-Datei!", MB_OK);
    return false;
  }
  if( aktion_auswahl == 1 && m_auswahl_spaltenname.GetCurSel() == CB_ERR)
  {
    AfxMessageBox( "Bitte waehlen Sie eine Spalte der Pixeltabelle in der "
                   "Datenbank!", MB_OK);
    return false;
  }
  if( aktion_auswahl == 1 && m_auswahl_csvspaltenname.GetCurSel() == CB_ERR)
  {
    AfxMessageBox( "Bitte waehlen Sie eine Spalte der Tabelle in der "
                   "CSV-Datei!", MB_OK);
    return false;
  }
  if( m_auswahl_bundesland.GetCurSel() == CB_ERR)
  {
    AfxMessageBox( "Bitte waehlen Sie ein Bundesland!", MB_OK);
    return false;
  }
  
  if( GetDlgItem( IDC_PIXEL_LADEN_SEITENLAENGE)->GetWindowTextLengthA() == 0)
  {
    AfxMessageBox( "Bitte geben Sie eine Seitenlaenge an!", MB_OK);
    return false;
  }
  else
  {
    CString sideLength_str;
    GetDlgItem( IDC_PIXEL_LADEN_SEITENLAENGE)->GetWindowTextA( sideLength_str);
    double sideLength = strtod( sideLength_str, NULL);
    if( sideLength <= 0.0 || sideLength > 10000.0)
    {
      AfxMessageBox( "Die Seitenlaenge muss > 0 und <= 10000 sein!", MB_OK);
      return false;
    }
  }
  
  return true;
}



ifstream* pixel_laden::openCSVFile( int& xCol, int& yCol, int& attCol, 
                                    char& separator, int& length)
{
  // open a stream to the CSV file
  CString filename;
  GetDlgItem( IDC_CSV_FILENAME)->GetWindowTextA( filename);
  ifstream* csvFile = new ifstream();
  csvFile->open( filename);
  
  xCol = -1;
  yCol = -1;
  attCol = -1;
  separator = 0;
  length = -1;
  
  // check again that the file can be read and is not empty
  if( !csvFile->is_open())
  {
    AfxMessageBox( "Datei '" + filename + "' konnte nicht geoeffnet werden!\n"
                   "Bitte ueberpruefen Sie die Datei!", MB_OK);
    delete( csvFile);
    return NULL;
  }
  if( csvFile->eof())
  {
    AfxMessageBox( "Datei '" + filename + "' ist leer!\n"
                   "Bitte waehlen Sie eine andere Datei!", MB_OK);
    csvFile->close();
    delete( csvFile);
    return NULL;
  }
  
  // first determine the length of the file to allow for progress updates
  csvFile->seekg( 0, ios::end);
  length = csvFile->tellg();
  csvFile->seekg( 0, ios::beg);
  
  // now identify the columns of the CSV file that hold the x and y coordinates 
  // and the attribute values
  CString separator_buf, attribute_buf;
  m_auswahl_trennzeichen.GetLBText( 
          m_auswahl_trennzeichen.GetCurSel(),
          separator_buf);
  separator = separator_buf[ 0];
  if( aktion_auswahl == 1)
  {
    m_auswahl_csvspaltenname.GetLBText( 
        m_auswahl_csvspaltenname.GetCurSel(),
        attribute_buf);
  }
  else
    attribute_buf = "";
  
  // read the first line with column name information into a buffer
  char buf[ 1024];
  csvFile->getline( buf, 1024);
  // go through the line one character at a time and identify tokens
  int pos = 0;
  int i = 0;
  CString token = "";
  while( buf[ pos] != 0)
  {
    if( buf[ pos] == separator)
    {
      if( token == "\"X\"")
        xCol = i;
      else if( token == "\"Y\"")
        yCol = i;
      else if( aktion_auswahl == 1 && token == attribute_buf)
        attCol = i;
      token = "";
      i++;
    }
    else
    {
      CString tmp( buf[ pos]);
      token.Append( tmp);
    }
    pos++;
  }
  if( token != "")
  {
    if( token == "\"X\"")
      xCol = i;
    else if( token == "\"Y\"")
      yCol = i;
    else if( aktion_auswahl == 1 && token == attribute_buf)
      attCol = i;
  }
  
  if( xCol == -1 || yCol == -1)
  {
    AfxMessageBox( "Es konnte keine Spalte fuer die X-Werte und/oder die "
                   "Y-Werte gefunden werden!\nDie Datei hat "
                   "nicht das richtige Format. Bitte passen Sie das "
                   "Trennzeichen an oder waehlen Sie eine andere Datei!", 
                   MB_OK);
    csvFile->close();
    delete( csvFile);
    return NULL;
  }
  
  if( aktion_auswahl == 1 && attCol == -1)
  {
    AfxMessageBox( "Die angegebene Spalte fuer die Attributwerte konnte nicht "
                   "(mehr) gefunden werden!\nDie Datei hat "
                   "nicht das richtige Format. Bitte passen Sie das "
                   "Trennzeichen an oder waehlen Sie eine andere Datei!", 
                   MB_OK);
    csvFile->close();
    delete( csvFile);
    return NULL;
  }

  
  
  return csvFile;
}

void pixel_laden::OnCbnSelchangePixelLadenTrennzeichen()
{
  if( m_auswahl_trennzeichen.GetCurSel() != trennzeichen_auswahl)
  {
    if( GetDlgItem( IDC_CSV_FILENAME)->GetWindowTextLengthA() != 0)
    {
      if( AfxMessageBox( "Wenn Sie ein neues Trennzeichen auswaehlen, wird die "
              "Datei- und Spaltenauswahl geloescht. Sind Sie sicher?",
              MB_YESNO) == IDYES)
      {
        trennzeichen_auswahl = m_auswahl_trennzeichen.GetCurSel();
        m_auswahl_csvspaltenname.ResetContent();
        GetDlgItem( IDC_CSV_FILENAME)->SetWindowTextA( "");
      }
      else
        m_auswahl_trennzeichen.SetCurSel( trennzeichen_auswahl);
    }
    else
      trennzeichen_auswahl = m_auswahl_trennzeichen.GetCurSel();
  }
}

void pixel_laden::OnCbnSelchangePixelLadenAktion()
{
  if( m_auswahl_aktion.GetCurSel() != aktion_auswahl)
  {
    bool changed;
    if( GetDlgItem( IDC_CSV_FILENAME)->GetWindowTextLengthA() != 0)
    {
      if( AfxMessageBox( "Wenn Sie eine andere Aktion auswaehlen, wird die "
                         "Dateiauswahl geloescht. Sind Sie sicher?",
                         MB_YESNO) == IDYES)
      {
        aktion_auswahl = m_auswahl_aktion.GetCurSel();
        GetDlgItem( IDC_CSV_FILENAME)->SetWindowTextA( "");
        changed = true;
      }
      else
      {
        m_auswahl_aktion.SetCurSel( aktion_auswahl);
        changed = false;
      }
    }
    else
    {
      aktion_auswahl = m_auswahl_aktion.GetCurSel();
      changed = true;
    }
    if( changed)
    {
      if( aktion_auswahl == 0)
      {
        GetDlgItem( IDC_STATIC_GREY1)->EnableWindow( FALSE);
        GetDlgItem( IDC_STATIC_GREY2)->EnableWindow( FALSE);
        GetDlgItem( IDC_STATIC_GREY3)->EnableWindow( FALSE);
        GetDlgItem( IDC_PIXEL_LADEN_SPALTENNAME)->EnableWindow( FALSE);
        GetDlgItem( IDC_PIXEL_LADEN_CSVSPALTENNAME)->EnableWindow( FALSE);
        m_auswahl_spaltenname.SetCurSel( -1);
        m_auswahl_csvspaltenname.SetCurSel( -1);
      } 
      else // aktion_auswahl == 1
      {
        GetDlgItem( IDC_STATIC_GREY1)->EnableWindow( TRUE);
        GetDlgItem( IDC_STATIC_GREY2)->EnableWindow( TRUE);
        GetDlgItem( IDC_STATIC_GREY3)->EnableWindow( TRUE);
        GetDlgItem( IDC_PIXEL_LADEN_SPALTENNAME)->EnableWindow( TRUE);
        GetDlgItem( IDC_PIXEL_LADEN_CSVSPALTENNAME)->EnableWindow( TRUE);
      } 
    }
  }
}
