#pragma +
// Name:						Window-Klassen
// Programmtyp:			Hilfsroutine für
//								Fakturierprogramm
//	Programmiersprache:	C++ (AT&T Standard 3.0)
// Computersystem:		Commodore AMIGA
// Betriebssystem:		AMIGA OS3.0 oder höher
// Autor:					Manfred Tremmel
// © Copyright:			1997-2001 by MT Graphic & Design
// Version:					V1.08
//
//    Copyright (C) 1997-2001 Manfred Tremmel
//
//    This program is free software; you can redistribute it and/or modify
//    it under the terms of the GNU General Public License as published by
//    the Free Software Foundation; either version 2 of the License, or
//    (at your option) any later version.
//
//    This program is distributed in the hope that it will be useful,
//    but WITHOUT ANY WARRANTY; without even the implied warranty of
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//    GNU General Public License for more details.
//
//    You should have received a copy of the GNU General Public License
//    along with this program; if not, write to the Free Software
//    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA

// Includes:
#include <new.h>
#include <intuition/intuition.h>
#include <iostream.h>
#include <stdlib.h>

#include "MT-Rechnung.h"
#include "MTLocale.h"
#include "MTList.h"
#include "Datenbank.h"
#include "Einstellungen.h"
#include "MTScreen.h"
#include "MTWindow.h"
#include "MTAuswert.h"
#include "MTWinSuch.h"
#include "MTWinNavi.h"
#include "MTEditHook.h"

extern Prefs				*MyPrefsPTR;

MTSuch_Gadget::MTSuch_Gadget(MTWindow *Win) : MTAuswert( Win )
{
	SuchList		= new ListenClass(256);
	DB_Pos		= 0;
	GetIt			= ThisWindow->ThisScreen->FindWindow( NAVIGATOR_WINDOW );
	MTLoeschen();

	SuchTextFeld[0]	= SU_TEXT1;
	SuchTextFeld[1]	= SU_TEXT2;
	SuchTextFeld[2]	= SU_TEXT3;
};

MTSuch_Gadget::~MTSuch_Gadget()
{
	delete SuchList;
};

void MTSuch_Gadget::StartDaten( UBYTE von )
{
	for( i = 0; i < 3; i++ )
	{
		SuchFeld[i]		= MyPrefsPTR->Daten->SuchFeld[(AktDB->Such_DB_Nr)][von][i];
		SuchWert[i]		= MyPrefsPTR->Daten->SuchWert[(AktDB->Such_DB_Nr)][von][i];
		VGLFeld[i]		= MyPrefsPTR->Daten->VGLFeld[(AktDB->Such_DB_Nr)][von][i];
		strcpy(SuchText[i], MyPrefsPTR->Daten->SuchText[(AktDB->Such_DB_Nr)][von][i]);
	}
	Verknuepf[0]		= MyPrefsPTR->Daten->Verknuepf[(AktDB->Such_DB_Nr)][von][0];
	Verknuepf[1]		= MyPrefsPTR->Daten->Verknuepf[(AktDB->Such_DB_Nr)][von][1];
};

void MTSuch_Gadget::FillWindow()
{
	for( i = 0; i < 3; i++ )
	{
		switch( AktDB->Such_DB_Typ[(SuchFeld[i])] )
		{
			case 0:
			case 1:
			case 2:
			case 3:
				if( AktDB->Such_DB_Feld[(SuchFeld[i])] )
				{
					SuchBezug[i]	= 1;
					SetGadgetAttrs( ThisWindow->gads[(SuchTextFeld[i])], ThisWindow->Win, NULL, WSTRINGA_Hook, &Dummy_edh, TAG_DONE );
				}
				else
					SuchBezug[i]	= 0;
				break;
			case 4:
			case 5:
			case 6:
			case 7:
			case 8:
			case 9:
			case 10:
				if( AktDB->Such_DB_CS[(SuchFeld[i])] )
					SuchBezug[i]	= 2;
				else
				{
					SuchBezug[i]	= 1;
					SetGadgetAttrs( ThisWindow->gads[(SuchTextFeld[i])], ThisWindow->Win, NULL, WSTRINGA_Hook, &PosNegZahl_edh, TAG_DONE );
				}
				break;
			default:
				SuchBezug[i]		= 1;
				SetGadgetAttrs( ThisWindow->gads[(SuchTextFeld[i])], ThisWindow->Win, NULL, WSTRINGA_Hook, &PosNegZahlNK_edh, TAG_DONE );
				break;
		}
	}

	switch( SuchBezug[0] )
	{
		case 1:
			SetGadgetAttrs( ThisWindow->gads[SU_TEXT1], ThisWindow->Win, NULL, WSTRINGA_String, SuchText[0], TAG_DONE );
			break;
		case 2:
			SetGadgetAttrs( ThisWindow->gads[SU_CYCLE1], ThisWindow->Win, NULL, WCYCLEA_Labels, (ULONG)AktDB->Such_DB_CS[(SuchFeld[0])], WCYCLEA_Active, SuchWert[0], TAG_DONE );
			break;
	}
	SetGadgetAttrs( ThisWindow->gads[SU_EBENE1], ThisWindow->Win, NULL, WGROUPA_ActivePage, SuchBezug[0], TAG_DONE );

	switch( SuchBezug[1] )
	{
		case 1:
			SetGadgetAttrs( ThisWindow->gads[SU_TEXT2], ThisWindow->Win, NULL, WSTRINGA_String, SuchText[1], TAG_DONE );
			break;
		case 2:
			SetGadgetAttrs( ThisWindow->gads[SU_CYCLE2], ThisWindow->Win, NULL, WCYCLEA_Labels, (ULONG)AktDB->Such_DB_CS[(SuchFeld[1])], WCYCLEA_Active, SuchWert[1], TAG_DONE );
			break;
	}
	SetGadgetAttrs( ThisWindow->gads[SU_EBENE2], ThisWindow->Win, NULL, WGROUPA_ActivePage, SuchBezug[1], TAG_DONE );

	switch( SuchBezug[2] )
	{
		case 1:
			SetGadgetAttrs( ThisWindow->gads[SU_TEXT3], ThisWindow->Win, NULL, WSTRINGA_String, SuchText[2], TAG_DONE );
			break;
		case 2:
			SetGadgetAttrs( ThisWindow->gads[SU_CYCLE3], ThisWindow->Win, NULL, WCYCLEA_Labels, (ULONG)AktDB->Such_DB_CS[(SuchFeld[2])], WCYCLEA_Active, SuchWert[2], TAG_DONE );
			break;
	}
	SetGadgetAttrs( ThisWindow->gads[SU_EBENE3], ThisWindow->Win, NULL, WGROUPA_ActivePage, SuchBezug[2], TAG_DONE );

	SetGadgetAttrs( ThisWindow->gads[SU_FELD1], ThisWindow->Win, NULL, WCYCLEA_Labels, (ULONG)AktDB->Such_DB_Felder_String, WCYCLEA_Active, SuchFeld[0], TAG_DONE );
	SetGadgetAttrs( ThisWindow->gads[SU_FELD2], ThisWindow->Win, NULL, WCYCLEA_Labels, (ULONG)AktDB->Such_DB_Felder_String, WCYCLEA_Active, SuchFeld[1], TAG_DONE );
	SetGadgetAttrs( ThisWindow->gads[SU_FELD3], ThisWindow->Win, NULL, WCYCLEA_Labels, (ULONG)AktDB->Such_DB_Felder_String, WCYCLEA_Active, SuchFeld[2], TAG_DONE );
	SetGadgetAttrs( ThisWindow->gads[SU_VGL1], ThisWindow->Win, NULL, WCYCLEA_Active, VGLFeld[0], TAG_DONE );
	SetGadgetAttrs( ThisWindow->gads[SU_VGL2], ThisWindow->Win, NULL, WCYCLEA_Active, VGLFeld[1], TAG_DONE );
	SetGadgetAttrs( ThisWindow->gads[SU_VGL3], ThisWindow->Win, NULL, WCYCLEA_Active, VGLFeld[2], TAG_DONE );
	SetGadgetAttrs( ThisWindow->gads[SU_UNDODER1], ThisWindow->Win, NULL, WMXA_Active, Verknuepf[0], TAG_DONE );
	SetGadgetAttrs( ThisWindow->gads[SU_UNDODER2], ThisWindow->Win, NULL, WMXA_Active, Verknuepf[1], TAG_DONE );
	SetGadgetAttrs( ThisWindow->gads[SU_LV_GEFUNDEN], ThisWindow->Win, NULL, WLISTVIEWA_List, &SuchList->MyList,
																									WLISTVIEWA_Top, First_LV,
																									WLISTVIEWA_Selected, Select_LV,
																									TAG_DONE);
};

void MTSuch_Gadget::MTLoeschen()
{
	SuchFeld[0]		= 0;
	SuchFeld[1]		= 0;
	SuchFeld[2]		= 0;
	VGLFeld[0]		= 0;
	VGLFeld[1]		= 0;
	VGLFeld[2]		= 0;
	SuchText[0][0]	= 0;
	SuchText[1][0]	= 0;
	SuchText[2][0]	= 0;
	SuchWert[0]		= 0;
	SuchWert[1]		= 0;
	SuchWert[2]		= 0;
	Verknuepf[0]	= 0;
	Verknuepf[1]	= 0;

	First_LV			= 0;
	Select_LV		= 0;
	SuchBezug[0]	= 0;
	SuchBezug[1]	= 0;
	SuchBezug[2]	= 0;

	SuchList->EntferneAlle();
};

// Gadget-Auswertung:
WORD MTSuch_Gadget::MTAuswertung( struct IntuiMessage* imsg, WORD DONE )
{
	STRPTR TextPTR;
	ULONG Merker;
	switch( imsg->Class )
	{
		// ein Button wurde betätigt (genaugenommen losgelassen)
		case IDCMP_IDCMPUPDATE:
			if( imsg->Code	== 0xffff )
				IconNummer = imsg->Qualifier;
			else
				IconNummer = GetTagData(GA_ID,0,(struct TagItem *)imsg->IAddress);
			switch( IconNummer )
			{
				// Suchfelder geändert
				case SU_FELD1:
					if( CycleAuswert( &SuchFeld[0] ) )
					{
						SuchText[0][0]	= 0;
						SuchWert[0]		= 0;
						FillWindow();
					}
					break;
				case SU_FELD2:
					if( CycleAuswert( &SuchFeld[1] ) )
					{
						SuchText[1][0]	= 0;
						SuchWert[1]		= 0;
						FillWindow();
					}
					break;
				case SU_FELD3:
					if( CycleAuswert( &SuchFeld[2] ) )
					{
						SuchText[2][0]	= 0;
						SuchWert[2]		= 0;
						FillWindow();
					}
					break;
				// Vergleichsfunktion geändert
				case SU_VGL1:
					CycleAuswert( &VGLFeld[0] );
					break;
				case SU_VGL2:
					CycleAuswert( &VGLFeld[1] );
					break;
				case SU_VGL3:
					CycleAuswert( &VGLFeld[2] );
					break;
				// Suchtext geändert
				case SU_TEXT1:
					TextAuswert( SuchText[0] );
					break;
				case SU_TEXT2:
					TextAuswert( SuchText[1] );
					break;
				case SU_TEXT3:
					TextAuswert( SuchText[2] );
					break;
				// Suchwert Cycle-Gadget
				case SU_CYCLE1:
					CycleAuswert( &Merker );
					SuchWert[0] = Merker;
					break;
				case SU_CYCLE2:
					CycleAuswert( &Merker );
					SuchWert[1] = Merker;
					break;
				case SU_CYCLE3:
					CycleAuswert( &Merker );
					SuchWert[2] = Merker;
					break;
				// Verknüpfung
				case SU_UNDODER1:
					GetAttr(WMXA_Active, ThisWindow->gads[IconNummer], (ULONG *)&Merker );
					Verknuepf[0] = Merker;
					break;
				case SU_UNDODER2:
					GetAttr(WMXA_Active, ThisWindow->gads[IconNummer], (ULONG *)&Merker );
					Verknuepf[1] = Merker;
					break;
				// Die vier verschiedenen Vorgaben
				case SU_VOR1:
					StartDaten(0);
					FillWindow();
					break;
				case SU_VOR2:
					StartDaten(1);
					FillWindow();
					break;
				case SU_VOR3:
					StartDaten(2);
					FillWindow();
					break;
				case SU_VOR4:
					StartDaten(3);
					FillWindow();
					break;
				// Liste gefundener Datensätze
				case SU_LV_GEFUNDEN:
					Select_LV = GetTagData(WLISTVIEWA_Selected,0,(struct TagItem *)imsg->IAddress);
					GetAttr(WLISTVIEWA_Top, ThisWindow->gads[IconNummer], (ULONG *)&First_LV );
					break;
				// Suche starten
				case SU_START:
					First_LV		= 0;
					Select_LV	= 0;
					SetGadgetAttrs( ThisWindow->gads[SU_LV_GEFUNDEN], ThisWindow->Win, NULL, WLISTVIEWA_List, NULL, TAG_DONE);
					SuchList->EntferneAlle();
					WZ_LockWindow( ThisWindow->WinHandle );

					AktDB->Suchen( SuchList,	SuchFeld[0], SuchText[0], SuchWert[0], VGLFeld[0], Verknuepf[0],
														SuchFeld[1], SuchText[1], SuchWert[1], VGLFeld[1], Verknuepf[1],
														SuchFeld[2], SuchText[2], SuchWert[2], VGLFeld[2] );
					SetGadgetAttrs( ThisWindow->gads[SU_LV_GEFUNDEN], ThisWindow->Win, NULL, WLISTVIEWA_List, &SuchList->MyList,
																													 WLISTVIEWA_Top, First_LV,
																													 WLISTVIEWA_Selected, Select_LV,
																													 TAG_DONE);
					WZ_UnlockWindow( ThisWindow->WinHandle );

					if( SuchList->Anzahl == 0 )
						DisplayBeep(ThisWindow->ThisScreen->ThisScreen);
					break;
				// Ende
				case SU_OK:
					if( SuchList->Anzahl == 0 )
					{
						DB_Pos	= 0;
						*SelectPosText = 0;
					}
					else
					{
						strcpy( SelectPosText, SuchList->SucheNode( Select_LV ) );
						DB_Pos	= strtoul( SelectPosText, 0, 10 );
					}
					MTLoeschen();
					DONE		= 2;
					break;
				// Abbruch
				case SU_ABBRUCH:
					MTLoeschen();
					DONE		= 2;
					DB_Pos	= 0;
					*SelectPosText = 0;
					break;
			}
			break;
		// Tastatureingabe (nicht ASCII)
		case IDCMP_RAWKEY:
			switch( imsg->Code )
			{
				case 76:
					if( Select_LV > 0 )
					{
						Select_LV--;
						SetGadgetAttrs( ThisWindow->gads[SU_LV_GEFUNDEN], ThisWindow->Win, NULL,
																	WLISTVIEWA_Visible, Select_LV, WLISTVIEWA_Selected, Select_LV, TAG_DONE);
						GetAttr(WLISTVIEWA_Top, ThisWindow->gads[SU_LV_GEFUNDEN], (ULONG *)&First_LV );
						TextPTR = SuchList->SucheNode( Select_LV );
						DB_Pos = strtoul( TextPTR, 0, 10 );
					}
					break;
				case 77:
					if( (Select_LV+1) < SuchList->Anzahl )
					{
						Select_LV++;
						SetGadgetAttrs( ThisWindow->gads[SU_LV_GEFUNDEN], ThisWindow->Win, NULL,
																	WLISTVIEWA_Visible, Select_LV, WLISTVIEWA_Selected, Select_LV, TAG_DONE);
						GetAttr(WLISTVIEWA_Top, ThisWindow->gads[SU_LV_GEFUNDEN], (ULONG *)&First_LV );
						TextPTR = SuchList->SucheNode( Select_LV );
						DB_Pos = strtoul( TextPTR, 0, 10 );
					}
					break;
			}
			break;
		case IDCMP_ACTIVEWINDOW:
			StartDaten(0);
			FillWindow();
			if( GetIt )
			{
				((MTNav_Gadget *)(GetIt->FirstAuswert))->AlleSperren();
				SetGadgetAttrs( GetIt->gads[NAV_NUMMER], GetIt->Win, NULL, WINTEGERA_Long, 0, GA_DISABLED, TRUE, TAG_DONE );
				SetGadgetAttrs( GetIt->gads[NAV_MAX], GetIt->Win, NULL, WARGSA_Format, "", TAG_DONE );
			}
			break;
	}
	return DONE;
};

