// qualoptimierung.cpp: Implementierungsdatei
//

#include "stdafx.h"
#include "Ecopay.h"
#include "EcopayDoc.h"
#include "ChildFrm.h"
#include "qualoptimierung.h"
#include "simulation.h"
#include "visualisierung.h"
#include "visdireckt.h"
#include "kartendialog.h"
#include "savename.h"
#include <sstream> 
#include <list>

// qualoptimierung-Dialogfeld

IMPLEMENT_DYNAMIC(qualoptimierung, CDialog)

qualoptimierung::qualoptimierung(CWnd* pParent /*=NULL*/)
: CDialog(qualoptimierung::IDD, pParent)
,m_brush(RGB(255,254,252))
{
    daten = new datenbank();
}

qualoptimierung::~qualoptimierung()
{
    delete daten;
}

void qualoptimierung::DoDataExchange( CDataExchange* pDX)
{
	CDialog::DoDataExchange( pDX);
	//DDX_Control(pDX, IDC_LISTMassnahmen, m_massnahmen_liste);
	DDX_Control( pDX, IDC_LISTgewmassnahmen, m_gew_massnahmen);
	DDX_Control( pDX, IDC_LISTzahlungmass, m_zahlung_liste);
	DDX_Control( pDX, IDC_LISTpixelmass, m_mengen_liste);
	DDX_Control( pDX, IDC_Budget, m_budget);
	//DDX_Control(pDX, IDC_LISTArten, m_arten_liste);
	DDX_Control( pDX, IDC_LISTgewarten, m_ausgew_arten);
	DDX_Control( pDX, IDC_LISTqulitaetarten, m_artengewichte);
	DDX_Control( pDX, IDC_EDIT2, m_artengewicht);
	DDX_Control( pDX, IDC_Gkosten, m_ges_kosten);
	DDX_Control( pDX, IDC_VIS, m_visualisierung);
	DDX_Control( pDX, IDC_Speichern, m_speichern);
	DDX_Control( pDX, IDC_EDIT1, m_art);
	DDX_Control( pDX, IDC_TZahlung, m_tzahlung);
	DDX_Control( pDX, IDC_qual_liste, m_qual_liste);
	DDX_Control( pDX, IDC_qual, m_qualitaet);
	/*
	DDX_Control(pDX, IDC_ausgeArt, m_gart);
	DDX_Control(pDX, IDC_LISTgewarten, m_listegarten);
	DDX_Control(pDX, IDC_LISTqulitaetarten, m_liste_qualitaet);
	DDX_Control(pDX, IDC_LIST1, m_liste_ergebnis);*/
	DDX_Control( pDX, IDC_Massnahmenart, m_massnahmenart);
	DDX_Control( pDX, IDC_Massnahmenstart, m_massnahmenstart);
	DDX_Control( pDX, IDC_Massnahmenabstand, m_massnahmenabstand);
	DDX_Control( pDX, IDC_MassnahmenGV, m_massnahmeGV);
	DDX_Control( pDX, IDC_Combo_Art, m_massnahmetierart);
	DDX_Control( pDX, IDC_Duengungja, m_d_ja);
	DDX_Control( pDX, IDC_Duengungnein, m_d_nein);
	DDX_Control( pDX, IDC_COMBOartnamen, m_arten_name);
	DDX_Control( pDX, IDC_COMBOartnamenlatein, m_arten_namenlatein);
	DDX_Control( pDX, IDC_COMBOartsavetime, m_arten_savetime);
	DDX_Control( pDX, IDC_Bundesland, m_bundesland);
	DDX_Control( pDX, IDC_keine, hohe_ges);
	DDX_Control( pDX, IDC_Hoch, hoehe_hoch);
	DDX_Control( pDX, IDC_Tief, hoehe_tief);
	DDX_Control( pDX, IDC_Mahd, m_mahd);
	DDX_Control( pDX, IDC_Weide, m_alle_weide);
	DDX_Control( pDX, IDC_AlleMassnahmen, m_alle);
	DDX_Control(pDX, IDC_Massnahmenabstand4, massnahmenabstand3);
}

BEGIN_MESSAGE_MAP(qualoptimierung, CDialog)
//ON_LBN_SELCHANGE(IDC_LISTMassnahmen, &qualoptimierung::OnLbnSelchangeListmassnahmen)
//ON_LBN_SELCHANGE(IDC_LISTArten, &qualoptimierung::OnLbnSelchangeListarten)
ON_EN_KILLFOCUS(IDC_TZahlung, &qualoptimierung::OnEnKillfocusTzahlung)
ON_EN_KILLFOCUS(IDC_Budget, &qualoptimierung::OnEnKillfocusBudget)
ON_BN_CLICKED(IDC_VIS, &qualoptimierung::OnBnClickedVis)
ON_BN_CLICKED(IDC_Speichern, &qualoptimierung::OnBnClickedSpeichern)
ON_BN_CLICKED(IDC_BUTTONOptimierung, &qualoptimierung::OnBnClickedButtonoptimierung)
ON_BN_CLICKED(IDC_Einlesen, &qualoptimierung::OnBnClickedEinlesen)
ON_EN_KILLFOCUS(IDC_qual, &qualoptimierung::OnEnKillfocusqual)
ON_WM_SIZE()
ON_WM_VSCROLL()

ON_CBN_SELCHANGE(IDC_Massnahmenart, &qualoptimierung::OnCbnSelchangeMassnahmenart)
ON_CBN_SELCHANGE(IDC_Massnahmenstart, &qualoptimierung::OnCbnSelchangeMassnahmenstart)
ON_CBN_SELCHANGE(IDC_Massnahmenabstand, &qualoptimierung::OnCbnSelchangeMassnahmenabstand)
ON_CBN_SELCHANGE(IDC_Combo_Art, &qualoptimierung::OnCbnSelchangeComboArt)
ON_CBN_SELCHANGE(IDC_MassnahmenGV, &qualoptimierung::OnCbnSelchangeMassnahmengv)
ON_CBN_SELCHANGE(IDC_COMBOartnamen, &qualoptimierung::OnCbnSelchangeComboartnamen)
ON_CBN_SELCHANGE(IDC_COMBOartnamenlatein, &qualoptimierung::OnCbnSelchangeComboartnamenlatein)
ON_CBN_SELCHANGE(IDC_COMBOartsavetime, &qualoptimierung::OnCbnSelchangeComboartsavetime)
ON_BN_CLICKED(IDC_Duengungja, &qualoptimierung::OnBnClickedDuengungja)
ON_BN_CLICKED(IDC_Duengungnein, &qualoptimierung::OnBnClickedDuengungnein)
ON_CBN_SELCHANGE(IDC_Bundesland, &qualoptimierung::OnCbnSelchangeBundesland)
ON_WM_CTLCOLOR()
ON_BN_CLICKED(IDC_Mahd, &qualoptimierung::OnBnClickedMahd)
ON_LBN_DBLCLK(IDC_LISTgewmassnahmen, &qualoptimierung::OnLbnDblclkListgewmassnahmen)
ON_LBN_DBLCLK(IDC_LISTgewarten, &qualoptimierung::OnLbnDblclkListgewarten)
ON_BN_CLICKED(IDC_Weide, &qualoptimierung::OnBnClickedWeide)
ON_BN_CLICKED(IDC_AlleMassnahmen, &qualoptimierung::OnBnClickedAllemassnahmen)
ON_CBN_SELCHANGE(IDC_Massnahmenabstand4, &qualoptimierung::OnCbnSelchangeMassnahmenabstand4)
ON_BN_CLICKED(IDC_BUTTONeraseMeasures, &qualoptimierung::OnBnClickedButtonerasemeasures)
END_MESSAGE_MAP()

// qualoptimierung-Meldungshandler
BOOL qualoptimierung::OnInitDialog()
{

    CDialog::OnInitDialog();

    getdata();
    blandgew = false;
    hochgew = false;

    m_speichern.EnableWindow(0);

    m_visualisierung.EnableWindow(0);

    daten->delete_zwischenvis();

    GetWindowRect(m_rect);
    m_nScrollPos = 0;

    return TRUE;
}
void qualoptimierung::getdata()
{
    vector< CString> namen, namenlatein, bundeslandname;
    vector< CString>::iterator i;
    vector< string>::iterator k;
    int massnahmenanzahl, j;
    string result;
    string monatsv;

    char ma[ 100];
    int mv;

    vector < string > mnamenliste;
    vector < CString > bnamen;
    mnamenliste = daten->returnmassnahmenname();
    bnamen = daten->returnbundeslandname();
    for( k = mnamenliste.begin(); k != mnamenliste.end(); k++)
    {
        lstrcpy( ma, (*k).c_str());
        m_massnahmenart.AddString( ma);
    }

    for( i = bnamen.begin(); i != bnamen.end(); i++)
    {
        m_bundesland.AddString( *i);
    }

    namen = daten->returnartname( "name");
    i = namen.begin();
    CString auswahl;
    while( i != namen.end())
    {
        auswahl = *(i);
        m_arten_name.AddString( auswahl);
        i++;
    }
    namenlatein = daten->returnartname( "name_latein");
    i = namenlatein.begin();
    while( i != namenlatein.end())
    {
        auswahl = *(i);
        m_arten_namenlatein.AddString( auswahl);
        i++;
    }

}

void qualoptimierung::OnCbnSelchangeMassnahmenart()
{
    // TODO: Add your control notification handler code here
    m_massnahmenstart.SetEditSel( 0, -1);
    m_massnahmenstart.Clear();
    m_massnahmenstart.ResetContent();
    m_massnahmenabstand.SetEditSel( 0, -1);
    m_massnahmenabstand.Clear();
    m_massnahmenabstand.ResetContent();
	massnahmenabstand3.SetEditSel( 0, -1);
    massnahmenabstand3.Clear();
    massnahmenabstand3.ResetContent();
    m_massnahmeGV.SetEditSel( 0, -1);
    m_massnahmeGV.Clear();
    m_massnahmeGV.ResetContent();
    m_massnahmetierart.SetEditSel( 0, -1);
    m_massnahmetierart.Clear();
    m_massnahmetierart.ResetContent();
    CheckDlgButton( IDC_Duengungja, 0);
    CheckDlgButton( IDC_Duengungnein, 0);
    duengung_gewaehlt = false;
    tierartgewaehlt = false;
    gvgewaehlt = false;
    CString mvwahl;
    int nIndex = m_massnahmenart.GetCurSel();
    if( nIndex != CB_ERR)
    {
        m_massnahmenart.GetLBText( nIndex, mvwahl);
        namemassnahme = mvwahl;
        vector< int> mstart;
        vector< int>::iterator k;
        mstart = daten->returnmassnahmenstart( namemassnahme);

        CString monatsv;
        for( k = mstart.begin(); k != mstart.end(); k++)
        {
            int mv = (*k);
            switch( mv)
            {
                case 1:
                    monatsv = "1. MV Januar, 1.";
                    break;

                case 13:
                    monatsv = "1. MV April, 13.";
                    break;
                case 14:
                    monatsv = "2. MV April, 14.";
                    break;
                case 15:
                    monatsv = "3. MV April, 15.";
                    break;
                case 16:
                    monatsv = "4. MV April, 16.";
                    break;
                case 17:
                    monatsv = "1. MV Mai, 17.";
                    break;
                case 18:
                    monatsv = "2. MV Mai, 18.";
                    break;
                case 19:
                    monatsv = "3. MV Mai, 19.";
                    break;
                case 20:
                    monatsv = "4. MV Mai, 20.";
                    break;
                case 21:
                    monatsv = "1. MV Juni, 21.";
                    break;
                case 22:
                    monatsv = "2. MV Juni, 22.";
                    break;
                case 23:
                    monatsv = "3. MV Juni, 23.";
                    break;
                case 24:
                    monatsv = "4. MV Juni, 24.";
                    break;
                case 25:
                    monatsv = "1. MV Juli, 25.";
                    break;
                case 26:
                    monatsv = "2. MV Juli, 26.";
                    break;
                case 27:
                    monatsv = "3. MV Juli, 27.";
                    break;
                case 28:
                    monatsv = "4. MV Juli, 28.";
                    break;
                case 29:
                    monatsv = "1. MV August, 29.";
                    break;
                case 30:
                    monatsv = "2. MV August, 30.";
                    break;
                case 31:
                    monatsv = "3. MV August, 31.";
                    break;
                case 32:
                    monatsv = "4. MV August, 32.";
                    break;
                case 33:
                    monatsv = "1. MV September, 33.";
                    break;
                case 34:
                    monatsv = "2. MV September, 34.";
                    break;
                case 35:
                    monatsv = "3. MV September, 35.";
                    break;
                case 36:
                    monatsv = "4. MV September, 36.";
                    break;
                case 37:
                    monatsv = "1. MV Oktober, 37.";
                    break;
                case 38:
                    monatsv = "2. MV Oktober, 38.";
                    break;
                case 39:
                    monatsv = "3. MV Oktober, 39.";
                    break;
                case 40:
                    monatsv = "4. MV Oktober, 40.";
                    break;
                default:
                    break;
            }

            m_massnahmenstart.AddString( monatsv);
        }
    }
}

void qualoptimierung::OnCbnSelchangeMassnahmenstart()
{
    // TODO: Add your control notification handler code here
    m_massnahmenabstand.SetEditSel( 0, -1);
    m_massnahmenabstand.Clear();
    m_massnahmenabstand.ResetContent();
	massnahmenabstand3.SetEditSel( 0, -1);
    massnahmenabstand3.Clear();
    massnahmenabstand3.ResetContent();
    m_massnahmeGV.SetEditSel( 0, -1);
    m_massnahmeGV.Clear();
    m_massnahmeGV.ResetContent();
    m_massnahmetierart.SetEditSel( 0, -1);
    m_massnahmetierart.Clear();
    m_massnahmetierart.ResetContent();
    CheckDlgButton( IDC_Duengungja, 0);
    CheckDlgButton( IDC_Duengungnein, 0);

    duengung_gewaehlt = false;
    tierartgewaehlt = false;
    gvgewaehlt = false;
    CString mvwahl;
    int nIndex = m_massnahmenstart.GetCurSel();
    if( nIndex != CB_ERR)
    {
        m_massnahmenstart.GetLBText( nIndex, mvwahl);
        // aus dem string artauswahl muss der Name und die savetime ausgelesen werden.

        string::size_type posA, posB, posC;

        string line( mvwahl);

        // Find first , character.
        posA = line.find_first_of( ",", 0);

        // Find first whitespace after that (i.e. end of token).
        //posB = line.find_first_not_of( " /t", posA);
        posC = line.find_first_of( ".", posA + 1);

        // Extract the token.
        string num = line.substr( posA + 1, posC - (posA + 1));
        CString str;

        int j = atoi( num.c_str());
        mv1massnahme = j;
        str.Format( _T( "%d"), mv1massnahme);

        vector< int> abstand;
        vector< int>::iterator k;
        abstand = daten->returnmassnahmenabstand( namemassnahme, mv1massnahme);

        for( k = abstand.begin(); k != abstand.end(); k++)
        {
            str.Format( _T( "%d"), (*k));
            //AfxMessageBox(str);

            m_massnahmenabstand.AddString( str);
        }
    }
}

void qualoptimierung::OnCbnSelchangeMassnahmenabstand()
{
    // TODO: Add your control notification handler code here
    CString mvwahl;
    CheckDlgButton( IDC_Duengungja, 0);
    CheckDlgButton( IDC_Duengungnein, 0);

    duengung_gewaehlt = false;
    tierartgewaehlt = false;
    gvgewaehlt = false;

    int nIndex = m_massnahmenabstand.GetCurSel();
    CString str;
    char eintrag[ 1000];
    if( nIndex != CB_ERR)
    {
        m_massnahmenabstand.GetLBText( nIndex, mvwahl);
        massnahmenabstand3.SetEditSel( 0, -1);
        massnahmenabstand3.Clear();
        massnahmenabstand3.ResetContent();
		m_massnahmeGV.SetEditSel( 0, -1);
        m_massnahmeGV.Clear();
        m_massnahmeGV.ResetContent();
        m_massnahmetierart.SetEditSel( 0, -1);
        m_massnahmetierart.Clear();
        m_massnahmetierart.ResetContent();

        abstand2massnahme = atoi( mvwahl);
        vector< int> abstand;
        vector< int>::iterator k;
        abstand = daten->returnmassnahmenabstand2( namemassnahme, mv1massnahme,abstand2massnahme);

        for( k = abstand.begin(); k != abstand.end(); k++)
        {
            str.Format( _T( "%d"), (*k));
            //AfxMessageBox(str);

            massnahmenabstand3.AddString( str);
        }

    }
}

void qualoptimierung::OnCbnSelchangeMassnahmenabstand4()
{
    CString mvwahl;
    CheckDlgButton( IDC_Duengungja, 0);
    CheckDlgButton( IDC_Duengungnein, 0);

    duengung_gewaehlt = false;
    tierartgewaehlt = false;
    gvgewaehlt = false;

    int nIndex = massnahmenabstand3.GetCurSel();
    CString str;
    char eintrag[ 1000];
    if( nIndex != CB_ERR)
    {
        massnahmenabstand3.GetLBText( nIndex, mvwahl);
        m_massnahmeGV.SetEditSel( 0, -1);
        m_massnahmeGV.Clear();
        m_massnahmeGV.ResetContent();
        m_massnahmetierart.SetEditSel( 0, -1);
        m_massnahmetierart.Clear();
        m_massnahmetierart.ResetContent();

        abstand3massnahme = atoi( mvwahl);
        vector < string > tierliste;
        vector< string>::iterator l;
        bool tiere;
        vector< bool> dung;

        dung = daten->returnmassnahmenduengung( namemassnahme, mv1massnahme,
                abstand2massnahme,abstand3massnahme);
        if( dung.size() == 1)
        {
            duengung = dung.front();
            duengung_gewaehlt = true;
            //Es gibt nur einen Wert für Duenger: einstellen und wahl verhindern
            if( duengung)
            {
                CheckDlgButton( IDC_Duengungja, 1);
                m_d_ja.EnableWindow( 0);

                CheckDlgButton( IDC_Duengungnein, 0);
                m_d_nein.EnableWindow( 0);
            } else
            {
                CheckDlgButton( IDC_Duengungja, 0);
                m_d_ja.EnableWindow( 0);

                CheckDlgButton( IDC_Duengungnein, 1);
                m_d_nein.EnableWindow( 0);
            }

        } else
        {
            duengung_gewaehlt = false;
            //Beide Wahlmöglichkeiten ermöglichen
            m_d_ja.EnableWindow( 1);
            m_d_nein.EnableWindow( 1);
        }

        tierliste = daten->returnmassnahmentierart( namemassnahme, mv1massnahme,
                abstand2massnahme,abstand3massnahme);

        l = tierliste.begin();
        if( (*l) != "Maßnahme ohne Vieh")
        {

            m_massnahmetierart.EnableWindow( 1);
            m_massnahmeGV.EnableWindow( 1);
            tiere = true;

            for( l = tierliste.begin(); l != tierliste.end(); l++)
            {
                lstrcpy( eintrag, (*l).c_str());

                m_massnahmetierart.AddString( eintrag);
            }

            vector< double> mGV;
            vector< double>::iterator k;
            mGV = daten->returnmassnahmenGV( namemassnahme, mv1massnahme,
                    abstand2massnahme,abstand3massnahme);

            CString monatsv;
            for( k = mGV.begin(); k != mGV.end(); k++)
            {
                if( (*k) != 99)
                {
                    str.Format( _T( "%.1f"), (*k));
                    m_massnahmeGV.AddString( str);
                } else
                {
                    m_massnahmeGV.AddString( "dem Standort angepasst");
                    grossvieheinheit = 99;
                    gvgewaehlt = true;
                }

            }
        } else
        {
            m_massnahmetierart.EnableWindow( 0);
            m_massnahmeGV.EnableWindow( 0);
            grossvieheinheit = 0;
            gvgewaehlt = true;
            tierartgewaehlt = true;
            tierart = 0;
            if( duengung_gewaehlt)
            {
                m = daten->returnmassnahme( namemassnahme, mv1massnahme,
                        abstand2massnahme,abstand3massnahme, duengung, 0, 0);
                m.zahlung = 0;
                char ma[ 1000];
                stringstream returnstring;
                returnstring << m.name << ", " << m.mv1massnahme << "/"
                        << m.abstand2massnahme <<"/"<<m.abstand3massnahme<< ",";
                //if((m.grossvieheinheit != 0) && (m.grossvieheinheit != 99))
                //returnstring<<m.grossvieheinheit<<" (GV), ";

                returnstring << m.duengung << " (D)";
                string result = returnstring.str();
                lstrcpy( ma, result.c_str());
                mliste.push_back( m);
                m_gew_massnahmen.AddString( ma);
            }

        }

    }
}


void qualoptimierung::OnCbnSelchangeMassnahmengv()
{

    CString mvwahl;
    int nIndex = m_massnahmeGV.GetCurSel();
    CString str;
    char eintrag[ 1000];
    if( nIndex != CB_ERR)
    {
        m_massnahmeGV.GetLBText( nIndex, mvwahl);
        if( mvwahl != ("dem Standort angepasst"))
            grossvieheinheit = atof( mvwahl);
        else
            grossvieheinheit = 99;

        gvgewaehlt = true;
        if( duengung_gewaehlt && tierartgewaehlt)
        {
            m = daten->returnmassnahme( namemassnahme,mv1massnahme,abstand2massnahme,abstand3massnahme, duengung,grossvieheinheit,tierart);
            m.zahlung = 0;
            char ma[1000];
            stringstream returnstring;
            returnstring<<m.name<<", "<<m.mv1massnahme<<"/"<<m.abstand2massnahme<<"/"<<m.abstand3massnahme<<",";
            if((m.grossvieheinheit != 0) && (m.grossvieheinheit != 99))
            returnstring<<m.grossvieheinheit<<" (GV), ";

            returnstring<<m.duengung<< " (D)";
            string result = returnstring.str();
            lstrcpy(ma, result.c_str());
            mliste.push_back(m);
            m_gew_massnahmen.AddString(ma);
        }
    }
}

void qualoptimierung::OnCbnSelchangeComboArt()
{
    // TODO: Add your control notification handler code here
    CString mvwahl;
    int nIndex = m_massnahmetierart.GetCurSel();
    CString str;
    char eintrag[ 1000];
    if( nIndex != CB_ERR)
    {
        m_massnahmetierart.GetLBText( nIndex, mvwahl);
        // aus dem string artauswahl muss der Name und die savetime ausgelesen werden.

        string::size_type posA, posB;

        string line( mvwahl);

        // Find first , character.
        posA = line.find_first_not_of( " /t", 0);

        // Find first whitespace after that (i.e. end of token).
        //posB = line.find_first_not_of( " /t", posA);
        posB = line.find_first_of( ",", posA);

        // Extract the token.
        string num = line.substr( posA, posB - posA);
        CString str;

        tierart = atoi( num.c_str());
        tierartgewaehlt = true;
        if( duengung_gewaehlt && gvgewaehlt)
        {
            m = daten->returnmassnahme( namemassnahme,mv1massnahme,abstand2massnahme,abstand3massnahme, duengung,grossvieheinheit,tierart);
            m.zahlung = 0;
            char ma[1000];
            stringstream returnstring;
            returnstring<<m.name<<", "<<m.mv1massnahme<<"/"<<m.abstand2massnahme<<"/"<<m.abstand3massnahme<<",";
            if((m.grossvieheinheit != 0) && (m.grossvieheinheit != 99))
            returnstring<<m.grossvieheinheit<<" (GV), ";

            returnstring<<m.duengung<< " (D)";
            string result = returnstring.str();
            lstrcpy(ma, result.c_str());
            mliste.push_back(m);
            m_gew_massnahmen.AddString(ma);
        }
    }
}

void qualoptimierung::OnCbnSelchangeComboartnamen()
{
    // TODO: Add your control notification handler code here
    int nIndex = m_arten_name.GetCurSel();
    CString str;
    vector < CString > savetimes;
    vector< CString>::iterator i;
    char eintrag[ 1000];
    if( nIndex != CB_ERR)
    {
        //m_arten_namenlatein.EnableWindow(0);
        m_arten_savetime.SetEditSel( 0, -1);
        m_arten_savetime.Clear();
        m_arten_savetime.ResetContent();

        artg = true;
        m_arten_name.GetLBText( nIndex, str);
        savetimes = daten->returnartspeicherdatum( str, "name");
        namenartlatein = daten->returnname( "name_latein", "name", str);
        int Index = m_arten_namenlatein.FindStringExact( -1, namenartlatein);
        m_arten_namenlatein.SetCurSel( Index);
        nameart = str;
        name = LPCTSTR( str);

        i = savetimes.begin();
        while( i != savetimes.end())
        {

            m_arten_savetime.AddString( *i);
            i++;
        }

        // aus dem string artauswahl muss der Name und
    }

}

void qualoptimierung::OnCbnSelchangeComboartnamenlatein()
{
    // TODO: Add your control notification handler code here
    int nIndex = m_arten_namenlatein.GetCurSel();
    CString str;
    vector < CString > savetimes;
    vector< CString>::iterator i;
    char eintrag[ 1000];
    if( nIndex != CB_ERR)
    {
        //m_arten_namenlatein.EnableWindow(0);
        m_arten_savetime.SetEditSel( 0, -1);
        m_arten_savetime.Clear();
        m_arten_savetime.ResetContent();

        artg = true;
        m_arten_namenlatein.GetLBText( nIndex, str);
        savetimes = daten->returnartspeicherdatum( str, "name_latein");
        CString artn = daten->returnname( "name", "name_latein", str);

        //AfxMessageBox(nameart);

        int Index = m_arten_name.FindStringExact( -1, artn);
        m_arten_name.SetCurSel( Index);
        nameart = artn;
        name = LPCTSTR( artn);

        i = savetimes.begin();
        while( i != savetimes.end())
        {

            m_arten_savetime.AddString( *i);
            i++;
        }

        // aus dem string artauswahl muss der Name und
    }

}

void qualoptimierung::OnCbnSelchangeComboartsavetime()
{
    // TODO: Add your control notification handler code here
    int nIndex = m_arten_savetime.GetCurSel();
    CString str;
    char eintrag[ 1000];
    if( nIndex != CB_ERR)
    {
        //m_arten_namenlatein.EnableWindow(0);

        m_arten_savetime.GetLBText( nIndex, str);

        savetime = LPCTSTR( str);

        if( artg)
        {
            m_art.SetWindowTextA( nameart);

        }

        // aus dem string artauswahl muss der Name und
    }

}
void qualoptimierung::OnBnClickedDuengungja()
{
    // TODO: Add your control notification handler code here
    UINT check;
    duengung_gewaehlt = true;
    check = IsDlgButtonChecked( IDC_Duengungja);
    if( check == 1)
    {
        duengung = true;
        CheckDlgButton( IDC_Duengungnein, 0);
    } else
    {
        duengung = false;
        CheckDlgButton( IDC_Duengungnein, 1);
    }

    if( tierartgewaehlt && gvgewaehlt)
    {
        m = daten->returnmassnahme( namemassnahme,mv1massnahme,abstand2massnahme,abstand3massnahme, duengung,grossvieheinheit,tierart);
        char ma[1000];
        stringstream returnstring;
        returnstring<<m.name<<", "<<m.mv1massnahme<<"/"<<m.abstand2massnahme<<"/"<<m.abstand3massnahme<<",";
        if((m.grossvieheinheit != 0) && (m.grossvieheinheit != 99))
        returnstring<<m.grossvieheinheit<<" (GV), ";

        returnstring<<m.duengung<< " (D)";
        string result = returnstring.str();
        lstrcpy(ma, result.c_str());
        mliste.push_back(m);
        m_gew_massnahmen.AddString(ma);
    }

}

void qualoptimierung::OnBnClickedDuengungnein()
{
    // TODO: Add your control notification handler code here
    UINT check;
    duengung_gewaehlt = true;
    check = IsDlgButtonChecked( IDC_Duengungnein);
    if( check == 1)
    {
        duengung = false;
        CheckDlgButton( IDC_Duengungja, 0);
    } else
    {
        duengung = true;
        CheckDlgButton( IDC_Duengungja, 1);
    }

    if( tierartgewaehlt && gvgewaehlt)
    {
        m = daten->returnmassnahme( namemassnahme,mv1massnahme,abstand2massnahme,abstand3massnahme, duengung,grossvieheinheit,tierart);
        char ma[1000];
        stringstream returnstring;
        returnstring<<m.name<<", "<<m.mv1massnahme<<"/"<<m.abstand2massnahme<<"/"<<m.abstand3massnahme<<",";
        if((m.grossvieheinheit != 0) && (m.grossvieheinheit != 99))
        returnstring<<m.grossvieheinheit<<" (GV), ";

        returnstring<<m.duengung<< " (D)";
        string result = returnstring.str();
        lstrcpy(ma, result.c_str());
        mliste.push_back(m);
        m_gew_massnahmen.AddString(ma);
    }
}

/*
 void qualoptimierung::OnLbnSelchangeListmassnahmen()
 {
 // TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
 CString mvwahl; 
 string result;
 char  ma[100];
 int nIndex = m_massnahmen_liste.GetCurSel();
 if (nIndex != CB_ERR)

 {
 m_massnahmen_liste.GetText(nIndex,mvwahl);
 // aus dem string artauswahl muss der Name und die savetime ausgelesen werden.

 }

 string::size_type posA, posB;

 string line(mvwahl);



 // Find first non-whitespace character.
 posA = line.find_first_not_of( " \t", 0);

 // Find first whitespace after that (i.e. end of token).
 posB = line.find_first_of( ",", posA);
 

 // Extract the token.
 string num = line.substr( posA, posB - posA);
 int j = atoi(num.c_str());
 //die ausgewählte Maßnahme wird in die Liste geschoben und noch mal im Fenster nebenan gezeigt
 mliste.push_back(*(massnahmenliste[j]));
 stringstream returnstring;
 returnstring<<(*(massnahmenliste[j])).name <<",(MV"<<(*(massnahmenliste[j])).mv1massnahme<<", "<<(*(massnahmenliste[j])).abstand2massnahme <<"), "<<(*(massnahmenliste[j])).duengung<< " D";
 result = returnstring.str();
 lstrcpy(ma, result.c_str());
 m_gew_massnahmen.AddString(ma);
 // massnahme m1 = (*(massnahmenliste[j]));
 

 }

 void qualoptimierung::OnLbnSelchangeListarten()
 {
 // TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
 CString artauswahl; 
 int nIndex = m_arten_liste.GetCurSel();
 if (nIndex != CB_ERR)

 {
 m_arten_liste.GetText(nIndex,artauswahl);
 // aus dem string artauswahl muss der Name und die savetime ausgelesen werden.

 }

 string::size_type posA, posB,posC;

 string line(artauswahl);
 string name, savetime;



 // Find first non-whitespace character.
 posA = line.find_first_not_of( " \t", 0);
 posC = line.find_first_of( "/", 0);
 //posC = line.find_first_not_of( " \t", posD);
 


 // Find first whitespace after that (i.e. end of token).
 posB = line.find_first_of( ",", posC+1);
 
 // Iterate this until the end of the line.
 // while( string::npos != posA || string::npos != posB)
 // {
 // Extract the token.
 name = line.substr( posC+1, posB - (posC+1));

 CString bname(name.c_str());
 //AfxMessageBox(bname,MB_YESNO,0);

 
 //... do something with the token ...
 
 // Find next token same way as before.
 posA = line.find_first_not_of( " \t", posB+1);
 
 posB = line.find_first_of( ",t", posA);
 savetime = line.substr( posA, posB - posA);

 nart = new art;
 nart = nart->get_art_from_database(name,savetime);
 //artlist.push_back(nart);

 //nart = nart->get_art_from_database(name,savetime);
 m_art.SetWindowTextA((*nart).get_m_name());

 //artlist.push_back(nart);
 m_artengewicht.SetFocus();
 //m_artliste.AddString((*nart).get_m_name());

 
 }
 */

void qualoptimierung::OnEnKillfocusTzahlung()
{

    CString zahlung;
    m_tzahlung.GetWindowTextA( zahlung);
    LPCTSTR csNumbers = _T( ")(0123456789.-");
    CString csTest = zahlung;
    if( !csTest.Trim( csNumbers).IsEmpty())
    {
        AfxMessageBox( "Sie müssen bitte die Transaktionskosten eingeben!",
                MB_OK, 0);
        m_tzahlung.SetFocus();
    }
}

void qualoptimierung::OnEnKillfocusBudget()
{

    CString zahlung;
    m_budget.GetWindowTextA( zahlung);
    LPCTSTR csNumbers = _T( ")(0123456789.-");
    CString csTest = zahlung;
    if( !csTest.Trim( csNumbers).IsEmpty())
    {
        AfxMessageBox( "Sie müssen bitte ein Budget eingeben!", MB_OK, 0);
        m_budget.SetFocus();
    }
}

void qualoptimierung::OnBnClickedVis()
{

    CCreateContext pContext;
    CMultiDocTemplate* pDocTemplate = NULL;
    pDocTemplate = new CMultiDocTemplate( IDR_EcopayYPE,
            RUNTIME_CLASS( CEcopayDoc), RUNTIME_CLASS( CChildFrame), // Benutzerspezifischer MDI-Child-Rahmen
            RUNTIME_CLASS( visdireckt));

    AfxGetApp()->AddDocTemplate( pDocTemplate);
    m_pTemplateI = new CMultiDocTemplate( IDR_EcopayYPE,
            RUNTIME_CLASS( CEcopayDoc), RUNTIME_CLASS( CChildFrame), // Benutzerspezifischer MDI-Child-Rahmen
            RUNTIME_CLASS( visdireckt));

    CMDIChildWnd * pChild = ((CMDIFrameWnd*) (AfxGetApp()->m_pMainWnd))
            ->MDIGetActive();
    CDocument * pDoc = pChild->GetActiveDocument();
    CDocTemplate* pTemplate = m_pTemplateI;
    //pDocument = pTemplate->CreateNewDocument();
    CFrameWnd* pFrame = pTemplate->CreateNewFrame( pDoc, pChild);
    pTemplate->InitialUpdateFrame( pFrame, pDoc);

}

void qualoptimierung::OnBnClickedSpeichern()
{

    time_t seconds;

    seconds = time( NULL);
    int konfiguration = int( seconds);
    savename Dlg;
    Dlg.DoModal();

    vector< massnahme>::iterator mit;
    int i = 0;
    datenbank daten2;
    for( mit = mliste.begin(); mit != mliste.end(); mit++)
    {
        int zahl = int( ergeb.zahlung[ i]);
        bool saved = daten2.save_konfiguration( konfiguration,
                (*mit).massnahmeID, zahl, ergeb.mengen[ i], ergebnissavename,
                bundeslandID);
        i++;
    }

    vector< modell::masspixelergeb>::iterator e;
    //AfxMessageBox("Nur noch ERgebnis speichern",MB_YESNO,0);
    bool saved;

    for( e = ergeb.massnahmenergebnis.begin();
            e != ergeb.massnahmenergebnis.end(); e++)
    {
        bool saved = daten2.save_ergebnis( (*e).pixelID, (*e).m.massnahmeID,
                konfiguration, (*e).gewinn, (*e).artenq);

    }
}

void qualoptimierung::OnBnClickedButtonoptimierung()
{

    CString zahlung;
    char ma[ 1000];
    char mz[ 1000];
    stringstream returnstring, neuerstring;
    string result, zahlungstr;
    m_tzahlung.GetWindowTextA( zahlung);
    CString bud;
    m_budget.GetWindowTextA( bud);
    gesammtbudget = atoi( bud);
    if( bud.IsEmpty())
    {
        AfxMessageBox( "Sie müssen bitte ein Budget eingeben!", MB_OK, 0);
        m_budget.SetFocus();
    } else
    {
        if( blandgew == false)
            AfxMessageBox( "Sie müssen bitte ein Bundesland auswählen!", MB_OK,
                    0);
        else
        {
            UINT check;
            check = IsDlgButtonChecked( IDC_keine);
            if( check == 1)
            {
                egal = true;
                hochgew = true;
            } else
            {
                check = IsDlgButtonChecked( IDC_Tief);
                if( check == 1)
                {
                    egal = false;
                    hoch = false;
                    hochgew = true;
                } else
                {
                    check = IsDlgButtonChecked( IDC_Hoch);
                    if( check == 1)
                    {
                        egal = false;
                        hoch = true;
                        hochgew = true;
                    }
                }
            }
            if( hochgew)
            {
                if( zahlung.IsEmpty())
                {
                    AfxMessageBox(
                            "Sie müssen bitte die Transaktionskosten eingeben!",
                            MB_OK, 0);
                    m_tzahlung.SetFocus();
                } else
                {
                    if( artlist.size() != 0 && mliste.size() != 0)
                    {
                        int tzahlung = atoi( zahlung);
                        vector< double>::iterator it;
                        vector< int>::iterator pit;
                        int zeilen, spalten;
                        daten->get_matrix_referenz( zeilen, spalten,
                                bundeslandID);

                        simulation sim;
                        CString str;
                        CWaitCursor wait;
                        //Do the lengthProcessing.

                        //Continue Processing.

                       /* ergeb = sim.simulate( tzahlung, artlist, mliste,
                                artengewichte, minqual, gesammtbudget, 0,
                                zeilen, spalten, bundeslandID, hoch, egal);*/

						ergeb = sim.maximiereEffFlaeche(tzahlung, artlist, mliste,
                                artengewichte, minqual, gesammtbudget, 0,
                                zeilen, spalten, bundeslandID, hoch, egal);
                        //MessageBox("Done");      //This changes the cursor.
                        wait.Restore(); //Restore the Wait cursor.
                        int mass = 0;
                        float budget = 0;
                        for( pit = ergeb.masspixel.begin();
                                pit != ergeb.masspixel.end(); pit++)
                        {

                            if( *pit != 0)
                            {
                                returnstring.str( "");
                                returnstring.clear();
                                returnstring << mliste[ mass].name << ", "
                                        << mliste[ mass].mv1massnahme << "/"
                                        << mliste[ mass].abstand2massnahme<< "/"
                                        << mliste[ mass].abstand3massnahme
                                        << ",";
                                if( (mliste[ mass].grossvieheinheit != 0)
                                        && (mliste[ mass].grossvieheinheit != 99))
                                    returnstring
                                            << mliste[ mass].grossvieheinheit
                                            << " (GV), ";

                                returnstring << mliste[ mass].duengung
                                        << " (D)";
                                result = returnstring.str();
                                lstrcpy( ma, result.c_str());
                                m_zahlung_liste.AddString( ma);
                                int gew = int( ergeb.zahlung[ mass]);
                                str.Format( _T( "%.2f"), ergeb.zahlung[ mass]);
                                neuerstring.str( "");
                                neuerstring.clear();
                                neuerstring << "Zahlung in Euro: " << str;
                                zahlungstr = neuerstring.str();
                                lstrcpy( mz, zahlungstr.c_str());
                                m_zahlung_liste.AddString( mz);

                                neuerstring.str( "");
                                neuerstring.clear();
                                str.Format( _T( "%.2f"), (*pit) * 6.25);
                                neuerstring << "Die teilnehmende Fläche in ha: "
                                        << str;
                                zahlungstr = neuerstring.str();
                                lstrcpy( mz, zahlungstr.c_str());
                                m_zahlung_liste.AddString( mz);

                                neuerstring.str( "");
                                neuerstring.clear();
                                str.Format( _T( "%.2f"),
                                        (ergeb.mengen[ mass]) * 6.25);
                                neuerstring << "Maximalfläche in ha: " << str;
                                zahlungstr = neuerstring.str();
                                lstrcpy( mz, zahlungstr.c_str());
                                m_zahlung_liste.AddString( mz);

                                budget =
                                        budget
                                                + ((*pit) * ergeb.zahlung[ mass]
                                                        * 6.25);

                            }
                            mass++;
                        }
                        //m_pixel_pro_massnahme.AddString("Die effektiven Flächen ha:");
                        mass = 0;
                        for( it = ergeb.artenflaechen.begin();
                                it != ergeb.artenflaechen.end(); it++)
                        {
                            if( *it != 0)
                            {

                                m_mengen_liste.AddString(
                                        artlist[ mass]->m_name);
                                neuerstring.str( "");
                                neuerstring.clear();
                                str.Format( _T( "%.2f"), *it);
                                neuerstring
                                        << "Erreichte effektive Fläche in ha: ";
                                zahlungstr = neuerstring.str();
                                lstrcpy( mz, zahlungstr.c_str());
                                m_mengen_liste.AddString( mz);
                                m_mengen_liste.AddString( str);

                            }
                            mass++;

                        }

                        str.Format( _T( "%.f"), budget);
                        m_ges_kosten.SetWindowTextA( str);
                        //ergebnis in den zwischenspeicher der Datenbank speichern
						/*
                        vector< modell::masspixelergeb>::iterator mp;
                        vector< modell::artenqualitaet>::iterator aq;
                        datenbank daten2;
                        double pixelqualitaet = 0;
                        stringstream resultstring;

                        for( mp = ergeb.massnahmenergebnis.begin();
                                mp != ergeb.massnahmenergebnis.end(); mp++)
                        {
							resultstring.str("");
							resultstring.clear();

                            for( aq = (*mp).artenq.begin();
                                    aq != (*mp).artenq.end(); aq++)
                            {

                                daten2.save_zwischenvis( (*mp).m.massnahmeID,
                                        (*mp).m.name, (*aq).art->get_artID(),
                                        (*aq).art->get_m_name(),
                                        (*aq).qualitaet, (*mp).pixelID,
                                        (*mp).matrix_i, (*mp).matrix_j,
                                        (*mp).gewinn, (*mp).m.zahlung,
                                        bundeslandID);
                                resultstring << "(" << (*aq).art->get_artID()
                                        << ", " << (*aq).qualitaet << ")";
                                pixelqualitaet = pixelqualitaet
                                        + (*aq).qualitaet;
                            }
                            result = resultstring.str();
                            daten2.save_ergebnis_zwischenvis( (*mp).pixelID,
                                    (*mp).m.massnahmeID,
                                    (*mp).m.zahlung, (*mp).gewinn,
                                    pixelqualitaet, result);

                        }*/
                        m_visualisierung.EnableWindow( 1);
                        m_speichern.EnableWindow( 1);
                    } else
                        AfxMessageBox(
                                "Sie haben vergessen eine Art oder eine Maßnahme auszuwählen!",
                                MB_OK, 0);

                }
            } else
                AfxMessageBox( "Sie müssen bitte die Höhenlage auswählen!",
                        MB_OK, 0);

        }
    }

}

void qualoptimierung::OnBnClickedEinlesen()
{

    CString gewicht;
    CString a;
    m_art.GetWindowTextA( a);
    if( a.IsEmpty())
        AfxMessageBox( "Sie müssen bitte zuerst eine Art auswählen!", MB_OK, 0);
    else
    {
        m_artengewicht.GetWindowTextA( gewicht);
        LPCTSTR csNumbers = _T( ")(0123456789.-");
        CString csTest = gewicht;
        if( !csTest.Trim( csNumbers).IsEmpty() || gewicht.IsEmpty())
        {
            AfxMessageBox(
                    "Sie müssen bitte eine Zahl  für das Gewicht eingeben!",
                    MB_OK, 0);
            m_artengewicht.SetFocus();
        } else
        {

            double q = atof( gewicht);

            if( q > 100 || q < 0)
            {
                AfxMessageBox( "Das Gewicht muß zwischen 1 und 100 liegen!"
                        "\n\n Bitte überarbeiten Sie Ihre Eingabe!", MB_OK, 0);
                m_artengewicht.SetFocus();

            } else
            {
                CString qual;
                m_qualitaet.GetWindowTextA( qual);
                LPCTSTR csNumbers = _T( ")(0123456789.-");
                CString csTest = qual;
                if( !csTest.Trim( csNumbers).IsEmpty() || qual.IsEmpty())
                {
                    AfxMessageBox(
                            "Sie müssen bitte eine Zahl für die minimale Qualitaet eingeben!",
                            MB_OK, 0);
                    m_qualitaet.SetFocus();
                }

                double mqual = atof( qual);

                if( mqual > 1 || mqual < 0)
                {
                    AfxMessageBox( "Die Qualitaet muß zwischen 0 und 1 liegen!"
                            "\n\n Bitte überarbeiten Sie Ihre Eingabe!", MB_OK,
                            0);
                    m_artengewicht.SetFocus();

                } else
                {

                    m_artengewichte.AddString( gewicht);
                    nart = new art;
                    nart = nart->get_art_from_database( name, savetime);
                    m_ausgew_arten.AddString( (*nart).get_m_name());
                    m_qual_liste.AddString( qual);
                    artlist.push_back( nart);
                    artengewichte.push_back( q / 100);
                    minqual.push_back( mqual);

                    m_art.SetWindowTextA( "");
                    m_artengewicht.SetWindowTextA( "");
                    m_qualitaet.SetWindowTextA( "");
                }
            }
        }
    }
}

void qualoptimierung::OnEnKillfocusqual()
{

    CString qual;
    m_qualitaet.GetWindowTextA( qual);
    LPCTSTR csNumbers = _T( ")(0123456789.-");
    CString csTest = qual;
    if( !csTest.Trim( csNumbers).IsEmpty())
    {
        AfxMessageBox(
                "Sie müssen bitte eine minimale Qualitaet für die Art eingeben",
                MB_OK, 0);
        m_qualitaet.SetFocus();
    }
}

void qualoptimierung::OnSize( UINT nType, int cx, int cy)
{
    CDialog::OnSize( nType, cx, cy);

    // TODO: Fügen Sie hier Ihren Meldungsbehandlungscode ein.
    m_nCurHeight = cy;
    int nScrollMax;
    if( cy < m_rect.Height())
    {
        nScrollMax = m_rect.Height() - cy;
    } else
        nScrollMax = 0;

    SCROLLINFO si;
    si.cbSize = sizeof(SCROLLINFO);
    si.fMask = SIF_ALL; // SIF_ALL = SIF_PAGE | SIF_RANGE | SIF_POS;
    si.nMin = 0;
    si.nMax = nScrollMax;
    si.nPage = si.nMax / 10;
    si.nPos = 0;
    SetScrollInfo( SB_VERT, &si, TRUE);

}

void qualoptimierung::OnVScroll(
        UINT nSBCode,
        UINT nPos,
        CScrollBar* pScrollBar)
{
    // TODO: Fügen Sie hier Ihren Meldungsbehandlungscode ein, und/oder benutzen Sie den Standard.
    int nDelta;
    int nMaxPos = m_rect.Height() - m_nCurHeight;

    switch( nSBCode)
    {
        case SB_LINEDOWN:
            if( m_nScrollPos >= nMaxPos)
                return;
            nDelta = min( nMaxPos / 100, nMaxPos - m_nScrollPos);
            break;

        case SB_LINEUP:
            if( m_nScrollPos <= 0)
                return;
            nDelta = -min( nMaxPos / 100, m_nScrollPos);
            break;

        case SB_PAGEDOWN:
            if( m_nScrollPos >= nMaxPos)
                return;
            nDelta = min( nMaxPos / 10, nMaxPos - m_nScrollPos);
            break;

        case SB_THUMBPOSITION:
            nDelta = (int) nPos - m_nScrollPos;
            break;

        case SB_PAGEUP:
            if( m_nScrollPos <= 0)
                return;
            nDelta = -min( nMaxPos / 10, m_nScrollPos);
            break;

        default:
            return;
    }
    m_nScrollPos += nDelta;
    SetScrollPos( SB_VERT, m_nScrollPos, TRUE);
    ScrollWindow( 0, -nDelta);

    CDialog::OnVScroll( nSBCode, nPos, pScrollBar);
}

void qualoptimierung::OnCbnSelchangeBundesland()
{
    // TODO: Add your control notification handler code here
    CString bland;
    int nIndex = m_bundesland.GetCurSel();
    if( nIndex != CB_ERR)
    {
        m_bundesland.GetLBText( nIndex, bland);
        bundeslandID = daten->returnbundeslandID( bland);
        blandgew = true;
    } else
        blandgew = false;
}

HBRUSH qualoptimierung::OnCtlColor( CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialog::OnCtlColor( pDC, pWnd, nCtlColor);
    int ID = pWnd->GetDlgCtrlID();

    if( ID == IDD_Qualitaet)
    {
        HBRUSH hBrush = CreateSolidBrush( RGB( 255, 254, 252));
        return hBrush;
    }

    if( (ID == IDC_STATIC_1) || (ID == IDC_STATIC_2))
    {
        pDC->SetTextColor( RGB( 192, 0, 0)); // Setzt die Textfarbe 
        pDC->SetBkMode( TRANSPARENT);

        // Return handle to our CBrush object
        //hbr = m_brush;
    }

    // TODO:  Ändern Sie hier alle Attribute für den DC.

    if( ID == IDC_STATIC || ID == IDC_Duengungja || ID == IDC_Duengungnein
            || ID == IDC_Hoch || ID == IDC_Tief || ID == IDC_keine
            || ID == IDC_EDIT1)
    {
        pDC->SetTextColor( RGB( 142, 35, 35)); // Setzt die Textfarbe auf 
        pDC->SetBkMode( TRANSPARENT);
        //HBRUSH hBrush = CreateSolidBrush(RGB(255,0,0)); //Setzt die Hintergrundfarbe auf rot
        // return (HBRUSH) hBrush;
    }

    // TODO:  Gib einen anderen Pinsel zurück, wenn der Standard nicht erwünscht ist.
    hbr = m_brush;
    return hbr;
}

void qualoptimierung::OnBnClickedMahd()
{
    // TODO: Add your control notification handler code here
    int anzahl;
    char ma[ 1000];
    daten->returnmassnahmen_gruppe( mliste, "Mahd");
    daten->returnmassnahmen_gruppe( mliste, "Streifenmahd");

    anzahl = mliste.size();
    for( int i = 0; i < anzahl; i++)
    {
        stringstream returnstring;
        returnstring << mliste[ i].name << ", " << mliste[ i].mv1massnahme
                << "/" << mliste[ i].abstand2massnahme << ",";
        returnstring << mliste[ i].duengung << " (D)";
        string result = returnstring.str();
        lstrcpy( ma, result.c_str());
        m_gew_massnahmen.AddString( ma);
    }
}

void qualoptimierung::OnLbnDblclkListgewmassnahmen()
{
    // TODO: Add your control notification handler code here
    CString mvwahl;
    int nIndex = m_gew_massnahmen.GetCurSel();
    if( nIndex != CB_ERR)
    {

        m_gew_massnahmen.GetText( nIndex, mvwahl);
        m_gew_massnahmen.DeleteString( nIndex);

        vector< massnahme>::iterator it;
        it = mliste.begin();
        for( int i = 0; i < mliste.size(); i++)
        {
            if( i == nIndex)
            {
                mliste.erase( it);
                break;
            } else
                it++;
        }

    }

}

void qualoptimierung::OnLbnDblclkListgewarten()
{
    // TODO: Add your control notification handler code here
    CString mvwahl;
    int nIndex = m_ausgew_arten.GetCurSel();
    if( nIndex != CB_ERR)
    {

        m_ausgew_arten.GetText( nIndex, mvwahl);
        m_ausgew_arten.DeleteString( nIndex);
        m_artengewichte.DeleteString( nIndex);
        m_qual_liste.DeleteString( nIndex);
        vector< art*>::iterator it;
        it = artlist.begin();
        for( int i = 0; i < artlist.size(); i++)
        {
            if( i == nIndex)
            {
                artlist.erase( it);
                break;
            } else
                it++;
        }
        vector< double>::iterator pt;
        pt = minqual.begin();
        for( int i = 0; i < minqual.size(); i++)
        {
            if( i == nIndex)
            {
                minqual.erase( pt);
                ;
                break;
            } else
                pt++;
        }
        pt = artengewichte.begin();
        for( int i = 0; i < artengewichte.size(); i++)
        {
            if( i == nIndex)
            {
                artengewichte.erase( pt);
                ;
                break;
            } else
                pt++;
        }

    }

}

void qualoptimierung::OnBnClickedWeide()
{
    // TODO: Add your control notification handler code here
    int anzahl;
    char ma[ 1000];
    daten->returnmassnahmen_gruppe( mliste, "Umtriebsweide");
    daten->returnmassnahmen_gruppe( mliste, "Saisonale_Standweide");
    daten->returnmassnahmen_gruppe( mliste, "Maehweide");
    daten->returnmassnahmen_gruppe( mliste, "Ganzjahresweide");
    anzahl = mliste.size();
    for( int i = 0; i < anzahl; i++)
    {
        stringstream returnstring;
        returnstring << mliste[ i].name << ", " << mliste[ i].mv1massnahme
                << "/" << mliste[ i].abstand2massnahme << ",";
        if( (mliste[ i].grossvieheinheit != 0)
                && (mliste[ i].grossvieheinheit != 99))
            returnstring << mliste[ i].grossvieheinheit << " (GV), ";
        returnstring << mliste[ i].duengung << " (D)";
        string result = returnstring.str();
        lstrcpy( ma, result.c_str());
        m_gew_massnahmen.AddString( ma);
    }
}

void qualoptimierung::OnBnClickedAllemassnahmen()
{
    // TODO: Add your control notification handler code here
    int anzahl;
    char ma[ 1000];
    daten->returnmassnahmen_gruppe( mliste);
    anzahl = mliste.size();
    for( int i = 0; i < anzahl; i++)
    {
        stringstream returnstring;
        returnstring << mliste[ i].name << ", " << mliste[ i].mv1massnahme
                << "/" << mliste[ i].abstand2massnahme << ",";
        if( (mliste[ i].grossvieheinheit != 0)
                && (mliste[ i].grossvieheinheit != 99))
            returnstring << mliste[ i].grossvieheinheit << " (GV), ";
        returnstring << mliste[ i].duengung << " (D)";
        string result = returnstring.str();
        lstrcpy( ma, result.c_str());
        m_gew_massnahmen.AddString( ma);
    }

}



void qualoptimierung::OnBnClickedButtonerasemeasures()
{
	CString mvwahl, str;
    int nIndex = m_gew_massnahmen.GetCurSel();
    if( nIndex != CB_ERR)
    {

		int iNumSel = m_gew_massnahmen.GetSelCount(); // get number of selected items
		//str.Format(_T("%d"),iNumSel);
        //AfxMessageBox(str,MB_YESNO,0);
		LPINT lpiSelItems = new int[iNumSel]; // allocate memory for all of them
		m_gew_massnahmen.GetSelItems(iNumSel, lpiSelItems);
		for (int nCount = (iNumSel-1); nCount >= 0; nCount--)
		{
			m_gew_massnahmen.DeleteString(lpiSelItems[nCount]); // loop over every selected item and process it
			//str.Format(_T("%d"),lpiSelItems[nCount]);
			//AfxMessageBox(str,MB_YESNO,0);
			vector< massnahme>::iterator it;
			it = mliste.begin();
			for( int i = 0; i < mliste.size(); i++)
			{
				if( i == lpiSelItems[nCount])
				{
					mliste.erase( it);
					break;
				} else
					it++;
			}

		}
		delete [] lpiSelItems; // don't forget to clean up!
	}
}
