// Ecopay.cpp : Definiert das Klassenverhalten für die Anwendung.
//

/* Standard C++ includes */

#include "stdafx.h"
#include <stdlib.h>
#include <iostream>
#include <sstream> 
#include "Ecopay.h"
#include "MainFrm.h"

#include "ChildFrm.h"
#include "EcopayDoc.h"
#include "EcopayView.h"
#include "steckbrief_schmetterling_neu.h"
#include "steckbrief_lebensraum_neu.h"
#include "steckbrief_vogel_neu.h"
#include "gis_daten.h"
#include "steckbrief_laden.h"
#include "datenbank.h"
#include "modellierung.h"
#include "ausgleichszahlung.h"
#include "optimierung.h"
#include "qualoptimierung.h"
#include "zahlungssimulierung.h"
#include "visualisierung.h"
#include "massnahmen_wirksamkeit.h"
#include "gruenland.h"
#include "gruenlanddialog.h"
#include "gruenlandladen.h"

#include "startfenster.h"
#include "pixel_laden.h"

#define NUMOFFSET 100
#define COLNAME 200

using namespace std;

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CEcopayApp

BEGIN_MESSAGE_MAP(CEcopayApp, CWinApp)
ON_COMMAND(ID_APP_ABOUT, &CEcopayApp::OnAppAbout)
// Dateibasierte Standarddokumentbefehle

ON_COMMAND(ID_FILE_NEW, &CWinApp::OnFileNew)
ON_COMMAND(ID_FILE_OPEN, &CWinApp::OnFileOpen)

// Standarddruckbefehl "Seite einrichten"
ON_COMMAND(ID_FILE_PRINT_SETUP, &CWinApp::OnFilePrintSetup)
ON_COMMAND(ID_NEUERSTECKBRIEF_SCHMETTERLING, &CEcopayApp::OnNeuersteckbriefSchmetterling)
ON_COMMAND(ID_NEUERSTECKBRIEF_VOGEL, &CEcopayApp::OnNeuersteckbriefVogel)
ON_COMMAND(ID_NEUERSTECKBRIEF_LEBENSRAUMTYP, &CEcopayApp::OnNeuersteckbriefLebensraumtyp)
ON_COMMAND(ID_GIS_GISDATENEINLESEN, &CEcopayApp::OnGisGisdateneinlesen)
ON_COMMAND(ID_GRUENLAND_NEUESGRUENLAND,&CEcopayApp::OnGruenlandNeuesgruenland)
ON_COMMAND(ID_STECKBRIEFLADEN_LEBENSRAUMTYP, &CEcopayApp::OnSteckbriefladenLebensraumtyp)
ON_COMMAND(ID_STECKBRIEFLADEN_VOGEL, &CEcopayApp::OnSteckbriefladenVogel)
ON_COMMAND(ID_STECKBRIEFLADEN_SCHMETTERLING, &CEcopayApp::OnSteckbriefladenSchmetterling)
ON_COMMAND(ID_MODELLIERUNG_KOSTENBERECHNUNG, &CEcopayApp::OnModellierungKostenberechnung)
ON_COMMAND(ID_MODELLIERUNG_SIMULIERUNGVONAUSGLEICHSZAHLUNGEN, 
        &CEcopayApp::OnModellierungSimulierungvonausgleichszahlungen)
ON_COMMAND(ID_SIMULATION_SIMULIERUNGAUSGEW32802, 
        &CEcopayApp::OnSimulationSimulierungausgew32802)
ON_COMMAND(ID_VISUALISIERUNG_KARTE, &CEcopayApp::OnVisualisierungKarte)
ON_COMMAND(ID_OPTIMIERUNG_QUALIT32804, &CEcopayApp::OnOptimierungQualit32804)

ON_COMMAND(ID_NEUESSTARTFENSTER, &CEcopayApp::OnNeuesStartfenster)
ON_COMMAND(ID_PIXELLADEN, &CEcopayApp::OnPixelLaden)
END_MESSAGE_MAP()

// CEcopayApp-Erstellung

CEcopayApp::CEcopayApp()
{
    // Alle wichtigen Initialisierungen in InitInstance positionieren
}

// Das einzige CEcopayApp-Objekt

CEcopayApp theApp;

// CEcopayApp-Initialisierung

BOOL CEcopayApp::InitInstance()
{
    // InitCommonControlsEx() ist für Windows XP erforderlich, wenn ein Anwendungsmanifest
    // die Verwendung von ComCtl32.dll Version 6 oder höher zum Aktivieren
    // von visuellen Stilen angibt. Ansonsten treten beim Erstellen von Fenstern Fehler auf.
    INITCOMMONCONTROLSEX InitCtrls;
    InitCtrls.dwSize = sizeof(InitCtrls);
    // Legen Sie dies fest, um alle allgemeinen Steuerelementklassen einzubeziehen,
    // die Sie in Ihrer Anwendung verwenden möchten.
    InitCtrls.dwICC = ICC_WIN95_CLASSES;
    InitCommonControlsEx( &InitCtrls);

    CWinApp::InitInstance();

    // OLE-Bibliotheken initialisieren
    if( !AfxOleInit())
    {
        AfxMessageBox (IDP_OLE_INIT_FAILED);
        return FALSE;
    }
    AfxEnableControlContainer();
    // Standardinitialisierung
    // Wenn Sie diese Features nicht verwenden und die Größe
    // der ausführbaren Datei verringern möchten, entfernen Sie
    // die nicht erforderlichen Initialisierungsroutinen.
    // Ändern Sie den Registrierungsschlüssel, unter dem Ihre Einstellungen gespeichert sind.
    // TODO: Ändern Sie diese Zeichenfolge entsprechend,
    // z.B. zum Namen Ihrer Firma oder Organisation.
    SetRegistryKey(
            _T( "Vom lokalen Anwendungs-Assistenten generierte Anwendungen"));
    LoadStdProfileSettings( 4); // Standard INI-Dateioptionen laden (einschließlich MRU)
    // Dokumentvorlagen der Anwendung registrieren. Dokumentvorlagen
    //  dienen als Verbindung zwischen Dokumenten, Rahmenfenstern und Ansichten.
    CMultiDocTemplate* pDocTemplate;
    pDocTemplate = new CMultiDocTemplate( IDR_EcopayYPE,
            RUNTIME_CLASS( CEcopayDoc), RUNTIME_CLASS( CChildFrame), 
            RUNTIME_CLASS( CEcopayView));
    if( !pDocTemplate)
        return FALSE;
    AddDocTemplate( pDocTemplate);

    m_pTemplateInfo = new CMultiDocTemplate( IDR_EcopayYPE,
            RUNTIME_CLASS( CEcopayDoc), RUNTIME_CLASS( CChildFrame), 
            RUNTIME_CLASS( Cvisualisierung));

    // Haupt-MDI-Rahmenfenster erstellen
    CMainFrame* pMainFrame = new CMainFrame;
    if( !pMainFrame || !pMainFrame->LoadFrame( IDR_MAINFRAME))
    {
        delete pMainFrame;
        return FALSE;
    }
    m_pMainWnd = pMainFrame;
    // Rufen Sie DragAcceptFiles nur auf, wenn eine Suffix vorhanden ist.
    // In einer MDI-Anwendung ist dies unmittelbar nach dem Festlegen 
    // von m_pMainWnd erforderlich

    // Befehlszeile auf Standardumgebungsbefehle überprüfen, DDE, Datei öffnen
    CCommandLineInfo cmdInfo;
    ParseCommandLine( cmdInfo);

    // Verteilung der in der Befehlszeile angegebenen Befehle. Gibt FALSE zurück, wenn
    // die Anwendung mit /RegServer, /Register, /Unregserver oder /Unregister gestartet wurde.
    if( !ProcessShellCommand( cmdInfo))
        return FALSE;
    // Das Hauptfenster ist initialisiert und kann jetzt angezeigt und aktualisiert werden.
    //pMainFrame->ShowWindow(m_nCmdShow);
    pMainFrame->ShowWindow( SW_SHOWMAXIMIZED);
    pMainFrame->UpdateWindow();

    OnNeuesStartfenster();

    ((CMDIFrameWnd*) m_pMainWnd)->MDIGetActive()->MDIMaximize();

    return TRUE;
}

int CEcopayApp::ExitInstance()
{
    delete (m_pTemplateInfo);
    return CWinApp::ExitInstance();
}

CEcopayApp *CEcopayApp::GetApp()
{
    CWinApp *pApp = AfxGetApp();
    if( pApp == 0)
    {
        // error handling

    }
    return (CEcopayApp*) pApp;
}

// CAboutDlg-Dialogfeld für Anwendungsbefehl "Info"
class CAboutDlg: public CDialog
{
public:
    CAboutDlg();

    // Dialogfelddaten
    enum
    {
        IDD = IDD_ABOUTBOX
    };

protected:
    virtual void DoDataExchange( CDataExchange* pDX); 

// Implementierung
protected:
    DECLARE_MESSAGE_MAP()
public:
    //afx_msg void OnSimulationSimulierungausgew32802();

};

CAboutDlg::CAboutDlg() :
        CDialog( CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange( CDataExchange* pDX)
{
    CDialog::DoDataExchange( pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//ON_COMMAND(ID_SIMULATION_SIMULIERUNGAUSGEW32802, &CAboutDlg::OnSimulationSimulierungausgew32802)
//ON_COMMAND(ID_GIS_GISDATENEINLESEN, &CAboutDlg::OnGisGisdateneinlesen)
//ON_COMMAND(ID_GRUENLAND_NEUESGRUENLAND, &CAboutDlg::OnGruenlandNeuesgruenland)
END_MESSAGE_MAP()

// Anwendungsbefehl zum Ausführen des Dialogfelds
void CEcopayApp::OnAppAbout()
{
    CAboutDlg aboutDlg;
    aboutDlg.DoModal();
}

void CEcopayApp::OnNeuesStartfenster()
{
    startfenster* startDlg;
    startDlg = new startfenster();

    if( startDlg != NULL)
    {
        BOOL ret = startDlg->Create( IDD_STARTFENSTER);
        if( !ret) //Create failed.
            AfxMessageBox( "Error creating Dialog", MB_YESNO, 0);
        startDlg->ShowWindow( SW_SHOW);
    } else
        AfxMessageBox( "Error Creating Dialog Object", MB_YESNO, 0);
}

void CEcopayApp::OnPixelLaden()
{
    pixel_laden* pixel_ladenDlg;
    pixel_ladenDlg = new pixel_laden();

    if( pixel_ladenDlg != NULL)
    {
        BOOL ret = pixel_ladenDlg->Create( IDD_PIXEL_LADEN);
        if( !ret) //Create failed.
            AfxMessageBox( "Error creating Dialog", MB_YESNO, 0);
        pixel_ladenDlg->ShowWindow( SW_SHOW);
    } else
        AfxMessageBox( "Error Creating Dialog Object", MB_YESNO, 0);
}

// CAboutDlg-Dialogfeld für Anwendungsbefehl "Steckbrief"

void CEcopayApp::OnNeuersteckbriefSchmetterling()
{

    steckbrief_schmetterling_neu* artenSchmetterlingDlg;

    artenSchmetterlingDlg = new steckbrief_schmetterling_neu();
    //Check if new succeeded and we got a valid pointer to a dialog object
    if( artenSchmetterlingDlg != NULL)
    {
        BOOL ret = artenSchmetterlingDlg->Create(
                IDD_DIALOG_Steckbrief_Schmetterling);
        if( !ret) //Create failed.

            AfxMessageBox( "Error creating Dialog", MB_YESNO, 0);
        artenSchmetterlingDlg->ShowWindow( SW_SHOW);
    } else
        AfxMessageBox( "Error Creating Dialog Object", MB_YESNO, 0);
}

void CEcopayApp::OnNeuersteckbriefVogel()
{
    // TODO: Fügen Sie hier Ihren Befehlsbehandlungscode ein.
    steckbrief_vogel_neu* artenVogelDlg;
    //artenVogelDlg.DoModal();
    artenVogelDlg = new steckbrief_vogel_neu();
    //Check if new succeeded and we got a valid pointer to a dialog object
    if( artenVogelDlg != NULL)
    {
        BOOL ret = artenVogelDlg->Create( IDD_DIALOG_Steckbrief_Vogel);
        if( !ret) //Create failed.

            AfxMessageBox( "Error creating Dialog", MB_YESNO, 0);
        artenVogelDlg->ShowWindow( SW_SHOW);
    } else
        AfxMessageBox( "Error Creating Dialog Object", MB_YESNO, 0);

}

void CEcopayApp::OnNeuersteckbriefLebensraumtyp()
{
    // TODO: Fügen Sie hier Ihren Befehlsbehandlungscode ein.

    steckbrief_lebensraum_neu artenLebensraumDlg;
    artenLebensraumDlg.DoModal();
}

void CEcopayApp::OnSteckbriefladenLebensraumtyp()
{
    // TODO: Fügen Sie hier Ihren Befehlsbehandlungscode ein.
    list < CString > stringlist;
    list< CString>::iterator i;
    steckbrief_laden* ladenDlg;
    ladenDlg = new steckbrief_laden;
    BOOL ret = ladenDlg->Create( IDD_STECKBRIEF_LADEN);
    ladenDlg->SetWindowTextA( "Lebensraum");
    datenbank* daten = new datenbank();
    //Connection* con = daten->datacon();
    stringlist = daten->returndata( "art", "name, name_benutzer, savetime ",
            "gruppe", "Lebensraum");
    i = stringlist.begin();
    CString auswahl;
    while( i != stringlist.end())
    {
        auswahl = *(i);
        ladenDlg->m_combo_art_auswahl.AddString( auswahl);
        i++;
    }

    ladenDlg->ShowWindow( SW_SHOW);

}

void CEcopayApp::OnSteckbriefladenVogel()
{
    // TODO: Fügen Sie hier Ihren Befehlsbehandlungscode ein.
    list < CString > stringlist;
    list< CString>::iterator i;
    steckbrief_laden* ladenDlg;
    ladenDlg = new steckbrief_laden;
    BOOL ret = ladenDlg->Create( IDD_STECKBRIEF_LADEN);
    ladenDlg->SetWindowTextA( "Vogel");
    datenbank* daten = new datenbank();
    //Connection* con = daten->datacon();
    stringlist = daten->returndata( "art", "name, name_benutzer, savetime ",
            "gruppe", "Vogel");
    i = stringlist.begin();
    CString auswahl;
    while( i != stringlist.end())
    {
        auswahl = *(i);
        ladenDlg->m_combo_art_auswahl.AddString( auswahl);
        i++;
    }

    ladenDlg->ShowWindow( SW_SHOW);

}

void CEcopayApp::OnSteckbriefladenSchmetterling()
{
    // TODO: Fügen Sie hier Ihren Befehlsbehandlungscode ein.
    list < CString > stringlist;
    list< CString>::iterator i;
    steckbrief_laden* ladenDlg;
    ladenDlg = new steckbrief_laden;
    BOOL ret = ladenDlg->Create( IDD_STECKBRIEF_LADEN);
    ladenDlg->SetWindowTextA( "Schmetterling");
    datenbank* daten = new datenbank();
    //Connection* con = daten->datacon();
    stringlist = daten->returndata( "art", "name, name_benutzer, savetime ",
            "gruppe", "Schmetterling");
    i = stringlist.begin();
    CString auswahl;
    while( i != stringlist.end())
    {
        auswahl = *(i);
        ladenDlg->m_combo_art_auswahl.AddString( auswahl);
        i++;
    }

    ladenDlg->ShowWindow( SW_SHOW);

}

void CEcopayApp::OnModellierungKostenberechnung()
{
    // TODO: Fügen Sie hier Ihren Befehlsbehandlungscode ein.
    zahlungssimulierung* modelDlg;
    modelDlg = new zahlungssimulierung;
    BOOL ret = modelDlg->Create( IDD_Zahlung);
    modelDlg->ShowWindow( SW_SHOW);
}

void CEcopayApp::OnModellierungSimulierungvonausgleichszahlungen()
{
    // TODO: Fügen Sie hier Ihren Befehlsbehandlungscode ein.
    /*ausgleichszahlung* azDlg;
     azDlg = new ausgleichszahlung;
     BOOL ret = azDlg->Create(IDD_Ausgleichszahlung);
     azDlg->ShowWindow(SW_SHOW);*/
    massnahmen_wirksamkeit* mwDlg;
    mwDlg = new massnahmen_wirksamkeit;
    BOOL ret = mwDlg->Create( IDD_Wirksamkeit);
    mwDlg->ShowWindow( SW_SHOW);
}

void CEcopayApp::OnSimulationSimulierungausgew32802()
{
    // TODO: Fügen Sie hier Ihren Befehlsbehandlungscode ein.
    optimierung* optDlg;
    optDlg = new optimierung;
    BOOL ret = optDlg->Create( IDD_DIALOG3);
    optDlg->ShowWindow( SW_SHOW);
}

void CEcopayApp::OnVisualisierungKarte()
{
    // TODO: Fügen Sie hier Ihren Befehlsbehandlungscode ein.
    //CMDIFrameWnd *pActiveChild = GetParent();

    //CDocument* pDocument;
    //CMDIChildWnd* pActiveChild = AfxGetMainWnd()->GetActiveFrame();
    // pChild is NULL if all windows are closed!
    CMDIChildWnd * pChild = ((CMDIFrameWnd*) (AfxGetApp()->m_pMainWnd))
            ->MDIGetActive();
    // put a comment here and uncomment below to test the alternative
    CDocument * pDoc = pChild->GetActiveDocument();

    // this next line works to open a new window but the animation fails in it.
    //CDocument * pDoc = ((CMDIFrameWnd*)(AfxGetApp()->m_pMainWnd))->GetActiveDocument();

    // this is what onWindowNew() does; it can't handle pActiveChild == NULL either

    //void CMDIFrameWnd::OnWindowNew()
    //{
    // CMDIChildWnd* pActiveChild = MDIGetActive();
    // CDocument* pDocument;
    // if (pActiveChild == NULL ||
    //   (pDocument = pActiveChild->GetActiveDocument()) == NULL)
    // {
    //  TRACE0("Warning: No active document for WindowNew command.\n");
    //  AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
    //  return;     // command failed
    // }

    // // otherwise we have a new frame !
    // CDocTemplate* pTemplate = pDocument->GetDocTemplate();
    // ASSERT_VALID(pTemplate);
    // CFrameWnd* pFrame = pTemplate->CreateNewFrame(pDocument, pActiveChild);
    // if (pFrame == NULL)
    // {
    //  TRACE0("Warning: failed to create new frame.\n");
    //  return;     // command failed
    // }

    // pTemplate->InitialUpdateFrame(pFrame, pDocument);
    //}

    CDocTemplate* pTemplate = ((CEcopayApp*) AfxGetApp())->m_pTemplateInfo;
    //pDocument = pTemplate->CreateNewDocument();
    CFrameWnd* pFrame = pTemplate->CreateNewFrame( pDoc, pChild);
    pTemplate->InitialUpdateFrame( pFrame, pDoc);

}
void CEcopayApp::VisualisierungKarte()
{
    // TODO: Fügen Sie hier Ihren Befehlsbehandlungscode ein.
    //CMDIFrameWnd *pActiveChild = GetParent();

    //CDocument* pDocument;
    //CMDIChildWnd* pActiveChild = AfxGetMainWnd()->GetActiveFrame();
    CMDIChildWnd * pChild = ((CMDIFrameWnd*) (AfxGetApp()->m_pMainWnd))
            ->MDIGetActive();

    CDocument * pDoc = pChild->GetActiveDocument();
    CDocTemplate* pTemplate = ((CEcopayApp*) AfxGetApp())->m_pTemplateInfo;
    //pDocument = pTemplate->CreateNewDocument();
    CFrameWnd* pFrame = pTemplate->CreateNewFrame( pDoc, pChild);
    pTemplate->InitialUpdateFrame( pFrame, pDoc);

}
void CEcopayApp::OnOptimierungQualit32804()
{
    // TODO: Fügen Sie hier Ihren Befehlsbehandlungscode ein.
    qualoptimierung* optDlg;
    optDlg = new qualoptimierung;
    BOOL ret = optDlg->Create( IDD_Qualitaet);
    optDlg->ShowWindow( SW_SHOW);
}

void CEcopayApp::OnGisGisdateneinlesen()
{
    gruenlanddialog* gruenDlg;

    gruenDlg = new gruenlanddialog();
    //Check if new succeeded and we got a valid pointer to a dialog object
    if( gruenDlg != NULL)
    {
        BOOL ret = gruenDlg->Create( IDD_DIALOG_gruenland);
        if( !ret) //Create failed.

            AfxMessageBox( "Error creating Dialog", MB_YESNO, 0);
        gruenDlg->SetWindowTextA( "Grünland eingeben");
        gruenDlg->ShowWindow( SW_SHOW);
    } else
        AfxMessageBox( "Error Creating Dialog Object", MB_YESNO, 0);
    // TODO: Add your command handler code here

}

void CEcopayApp::OnGruenlandNeuesgruenland()
{
    // TODO: Add your command handler code here

    list < CString > stringlist;
    list< CString>::iterator i;
    gruenlandladen* ladenDlg;
    ladenDlg = new gruenlandladen;
    BOOL ret = ladenDlg->Create( IDD_Gruenland_laden);
    ladenDlg->SetWindowTextA( "Grünlandtyp");
    datenbank daten;
    //Connection* con = daten->datacon();
    vector< gruenland*> gr;
    vector< gruenland*>::iterator git;
    int anzahl;
    CString auswahl;
    char eintrag[ 1000];

    gr = daten.returngruenland( anzahl);
    for( git = gr.begin(); git != gr.end(); git++)
    {
        stringstream querystring;
        stringstream returnstring;
        string mager;
        if( (*git)->name_deutsch != "Uebriges Gruenland2"
                && (*git)->name_deutsch != "Uebriges Gruenland")
        {
            if( (*git)->mager == true)
                mager = "schwachwüchsig";
            else
                mager = "starkwüchsig";
            returnstring << (*git)->name_deutsch << "/" << mager << ", "
                    << (*git)->savetime << ", " << (*git)->name_benutzer;
            string result = returnstring.str();
            lstrcpy( eintrag, result.c_str());
            ladenDlg->m_combo_art_auswahl.AddString( eintrag);
        }

    }

    ladenDlg->ShowWindow( SW_SHOW);
}
