/*
 * HNDLMENU.C
 *
 * handles MN_SELECTED-events of jet_conf.prg;
 *
 */

/*--- includes              ---*/

#include "import.h"
#include <MGLOBAL.H>
#include <MYDIAL.H>
#include "misc.h"
#include "jet_conf.h"
#include "resource.h"
#include "lists.h"

#include "export.h"
#include "hndlmenu.h"

/*--- defines               ---*/

#define		NETM_P		path_heads[0]
#define		MAIL_P		path_heads[1]
#define		ARCH_P		path_heads[2]
#define		BADM_P		path_heads[3]
#define		DUPE_P		path_heads[4]
#define		INBO_P		path_heads[5]
#define		KINB_P		path_heads[6]
#define		PINB_P		path_heads[7]
#define		OUTB_P		path_heads[8]
#define		NODE_P		path_heads[9]
#define		LOGF_P		path_heads[10]
#define		ABOU_P		path_heads[11]

#define		NETM_N		path_names[0]
#define		MAIL_N		path_names[1]
#define		ARCH_N		path_names[2]
#define		BADM_N		path_names[3]
#define		DUPE_N		path_names[4]
#define		LOGF_N		path_names[5]

#define		ARC_P		arch_heads[0]
#define		ARC_E		arch_heads[1]
#define		LZH_P		arch_heads[2]
#define		LZH_E		arch_heads[3]
#define		LHA_P		arch_heads[4]
#define		LHA_E		arch_heads[5]
#define		ZIP_P		arch_heads[6]
#define		ZIP_E		arch_heads[7]
#define		ZOO_P		arch_heads[8]
#define		ZOO_E		arch_heads[9]
#define		ARJ_P		arch_heads[10]
#define		ARJ_E		arch_heads[11]

#define		ARC_N		arch_names[0]
#define		LZH_N		arch_names[1]
#define		ZIP_N		arch_names[2]
#define		ZOO_N		arch_names[3]
#define		ARJ_N		arch_names[4]

/*--- types                 ---*/

/*--- variables             ---*/

LOCAL BYTE	*path_heads[] = {
								"Netmail path",
								"Mailbox path",
								"Archive path",
								"BadMsgs path",
								"DupeMsgs path",
								"Inbound path",
								"KnownInbound path",
								"ProtInbound path",
								"Outbound path",
								"Nodelist path",
								"Logfile path",
								"Aboutfile"
							};

LOCAL BYTE	*path_names[] = {
								"NETMAIL",
								"MAILBOX",
								"ARCHIVE",
								"BADMSGS",
								"DUPEMSGS",
								"SYSTEM.LOG"
							};

LOCAL BYTE 	*arch_heads[] =	{
								"Arc Pack",
								"Arc Extract",
								"LZH Pack",
								"LZH Extract",
								"LHA Pack",
								"LHA Extract",
								"Zip Pack",
								"Zip Extract",
								"Zoo Pack",
								"Zoo Extract",
								"Arj Pack",
								"Arj Extract"
							};

LOCAL BYTE	*arch_names[] =	{
								"ARC.TTP",
								"LHARC.TTP",
								"STZIP.PRG",
								"ZOO.TTP",
								"UNARJ.TTP"
							};
									
/* Lokale Variablen fЃr die Pfad- und Dateinamenssicherung */
LOCAL BYTE	rpath[256],
			rname[14];

/*--- prototypes            ---*/

LOCAL VOID		DoSetSystem( VOID );
LOCAL VOID		DoSetFlags( VOID );
LOCAL VOID		DoSetPath( VOID );
LOCAL VOID		DoSetArchivers( VOID );
LOCAL VOID		DoSetLinks( VOID );
LOCAL VOID		ClearSelected( OBJECT *tree, WORD object );

/*--- functions             ---*/

/**-----------------------------------------------------------------------------
 ** Funktionsname:	GLOBAL WORD mn_selected( WORD titel, WORD item )
 **		->	nichts
 **		<-	Exitcode fЃr das Programm.
 **
 ** Die Funktion handelt einen selektierten MenЃeintrag ab.
 **/
GLOBAL WORD mn_selected( WORD titel, WORD item )
{
	BOOLEAN ok;
	WORD    Ret = 0;

	switch( item )
	{
		case INFOS:	
					(VOID) HndlDial( info_box, 0, FALSE, NULL, &ok );
					break;
		case LOAD_CONF:
					break;
		case SAVE_CONF:
					break;
		case QUIT:
					Ret = -1;
					break;
		case SET_SYSTEM:
					DoSetSystem( );
					break;
		case SET_FLAGS:
					DoSetFlags( );
					break;
		case SET_PATH:
					DoSetPath( );
					break;
		case SET_ARCHIVERS:
					DoSetArchivers( );
					break;
		case SET_LINKS:
					DoSetLinks( );
					break;
		case SET_GROUPS:
					break;
	}

	menu_tnormal( menutree, titel, 1 );
	return( Ret );
}

/**-----------------------------------------------------------------------------
 ** Funktionsname:	LOCAL VOID DoSetSystem( VOID )
 **		->	nichts
 **		<-	nichts
 **
 ** Die Funktion Ѓbernimmt die Konfiguration der Systemeinstellungen.
 **/
LOCAL VOID DoSetSystem( VOID )
{
	BOOLEAN ok;
	WORD rc = -1;
	DIALINFO di;

	open_dial( syst_box, FALSE, NULL, &di );
	dial_draw( &di );

	while( rc != OK_SYST )
	{
		rc = dial_do( &di, 0, NULL );

		switch( rc )
		{
			case SYST_DOMA:
						(VOID) HndlDial( doma_box, 0, FALSE, NULL, &ok );
						break;
			case SYST_ADDR:
						(VOID) HndlDial( addr_box, 0, FALSE, NULL, &ok );
						break;
		}

	}
	
	ClearSelected( syst_box, rc );
	close_dial( FALSE, NULL, &di );
}

/**-----------------------------------------------------------------------------
 ** Funktionsname:	LOCAL VOID DoSetFlags( VOID )
 **		->	nichts
 **		<-	nichts
 **
 ** Die Funktion Ѓbernimmt die Behandlung der Flags-Box.
 **/
LOCAL VOID DoSetFlags( VOID )
{
	BOOLEAN ok;
	WORD rc = -1;
	DIALINFO di;

	open_dial( flag_box, FALSE, NULL, &di );
	dial_draw( &di );

	while( rc != OK_FLAG )
	{
		rc = dial_do( &di, 0, NULL );

		switch( rc )
		{
			case TAS_MSGID:
			case POP_MSGID:
						popup_select( flag_box, POP_MSGID, popup, POP_OMODE, 0, 0, &ok );
						break;
			case CIR_MSGID:
						popup_select( flag_box, POP_MSGID, popup, POP_OMODE, 0, -2, &ok );
						break;
			case TAS_PKTTP:
			case POP_PKTTP:
						popup_select( flag_box, POP_PKTTP, popup, POP_PKTTYPE, 0, 0, &ok );
						break;
			case CIR_PKTTP:
						popup_select( flag_box, POP_PKTTP, popup, POP_PKTTYPE, 0, -2, &ok );
						break;
			case TAS_ORIGM:
			case POP_ORIGM:
						popup_select( flag_box, POP_ORIGM, popup, POP_OMODE, 0, 0, &ok );
						break;
			case CIR_ORIGM:
						popup_select( flag_box, POP_ORIGM, popup, POP_OMODE, 0, -2, &ok );
						break;
		}

	}
	
	ClearSelected( flag_box, rc );
	close_dial( FALSE, NULL, &di );
}

/**-----------------------------------------------------------------------------
 ** Funktionsname:	LOCAL VOID DoSetPath( VOID )
 **		->	nichts
 **		<-	nichts
 **
 ** Funktion zur Pfadeinstellung.
 **/
LOCAL VOID DoSetPath( VOID )
{
	WORD     rc = -1, x_coor, y_coor;
	BYTE     *head, *fn, cpath[256];
	DIALINFO di;

	open_dial( path_box, FALSE, NULL, &di );
	dial_draw( &di );

	while( rc != OK_PATH )
	{
		rname[0] = '\0';
		
		rc = dial_do( &di, 0, NULL );
		rc &= 0x00ff; /* Bit 15 k”nnte gesetzt sein (Doppelklick) */

		switch( rc )
		{
			case NETMAILP:
						head = NETM_P;
						fn   = NETM_N;
						break;
			case MAILBOXP:
						head = MAIL_P;
						fn   = MAIL_N;
						break;
			case ARCHIVEP:
						head = ARCH_P;
						fn   = ARCH_N;
						break;
			case BADMSGSP:
						head = BADM_P;
						fn   = BADM_N;
						break;
			case DUPMSGSP:
						head = DUPE_P;
						fn   = DUPE_N;
						break;
			case INBOUNDP:
						head = INBO_P;
						fn   = NULL;
						break;
			case KINBONDP:
						head = KINB_P;
						fn   = NULL;
						break;
			case PINBONDP:
						head = PINB_P;
						fn   = NULL;
						break;
			case HOLD:
						head = OUTB_P;
						fn   = NULL;
						break;
			case NODELSTP:
						head = NODE_P;
						fn   = NULL;
						break;
			case SYSLOGP:
						head = LOGF_P;
						fn   = LOGF_N;
						break;
			case ABOUTFP:
						head = ABOU_P;
						fn   = NULL;
						break;
			default:
						head = NULL;
		}

		if( head )
		{
			if( fn )
				strcpy( rname, fn );

			/* FileSelector aufrufen und auf Abbruch-Button testen: */
			if( select_file( rpath, rname, head ) )
			{
				strcpy( cpath, rpath );
				
				/* Filename rankopieren, falls n”tig: */
				switch( rc )
				{
					case NETMAILP:
					case MAILBOXP:
					case ARCHIVEP:
					case BADMSGSP:
					case DUPMSGSP:
									head   = strrchr( rname, '.' );
									if( !head && !strlen( rname ) )
										continue;
									
									if( head )
										*head = '\0';
					case ABOUTFP:
					case SYSLOGP:
									strcat( cpath, rname );
				}

				/* ptext einsetzen: */
				set_ptext( path_box, rc, cpath );

				/* Redraw-Area ermitteln: */
				objc_offset( path_box, rc, &x_coor, &y_coor );

				/* Neuzeichnen: */
				objc_draw( path_box, rc, MAX_DEPTH, x_coor, y_coor,
						   path_box[rc].ob_width, path_box[rc].ob_height );
			}
		}
	}
	
	ClearSelected( path_box, rc );
	close_dial( FALSE, NULL, &di );
}

/**-----------------------------------------------------------------------------
 ** Funktionsname:	LOCAL VOID DoSetArchivers( VOID )
 **		->	nichts
 **		<-	nichts
 **
 ** Funktion zur Packereinstellung.
 **/
LOCAL VOID DoSetArchivers( VOID )
{
	WORD     rc = -1, x_coor, y_coor;
	BYTE     *head, *fn, cpath[256];
	DIALINFO di;

	open_dial( arch_box, FALSE, NULL, &di );
	dial_draw( &di );

	while( rc != OK_ARCH )
	{
		rname[0] = '\0';
		
		rc = dial_do( &di, 0, NULL );
		rc &= 0x00ff; /* Bit 15 k”nnte gesetzt sein (Doppelklick) */

		switch( rc )
		{
			case ARC_PACK:
						head = ARC_P;
						fn   = ARC_N;
						break;
			case ARC_EXTRACT:
						head = ARC_E;
						fn   = ARC_N;
						break;
			case LZH_PACK:
						head = LZH_P;
						fn   = LZH_N;
						break;
			case LZH_EXTRACT:
						head = LZH_E;
						fn   = LZH_N;
						break;
			case LHA_PACK:
						head = LHA_P;
						fn   = LZH_N;
						break;
			case LHA_EXTRACT:
						head = LHA_E;
						fn   = LZH_N;
						break;
			case ZIP_PACK:
						head = ZIP_P;
						fn   = ZIP_N;
						break;
			case ZIP_EXTRACT:
						head = ZIP_E;
						fn   = ZIP_N;
						break;
			case ZOO_PACK:
						head = ZOO_P;
						fn   = ZOO_N;
						break;
			case ZOO_EXTRACT:
						head = ZOO_E;
						fn   = ZOO_N;
						break;
			case ARJ_PACK:
						head = ARJ_P;
						fn   = NULL;
						break;
			case ARJ_EXTRACT:
						head = ARJ_E;
						fn   = ARJ_N;
						break;
			default:
						head = NULL;
		}

		if( head )
		{
			if( fn )
				strcpy( rname, fn );

			/* FileSelector aufrufen und auf Abbruch-Button testen: */
			if( select_file( rpath, rname, head ) )
			{
				strcpy( cpath, rpath );
				
				/* Ist ein Filename ausgew„hlt? */
				if( !strchr( rname, '.' ) )
					continue;

				/* Filename rankopieren: */									
				strcat( cpath, rname );

				/* ptext einsetzen: */
				set_ptext( arch_box, rc, cpath );

				/* Redraw-Area ermitteln: */
				objc_offset( arch_box, rc, &x_coor, &y_coor );

				/* Neuzeichnen: */
				objc_draw( arch_box, rc, MAX_DEPTH, x_coor, y_coor,
						   arch_box[rc].ob_width, arch_box[rc].ob_height );
			}
		}
	}
	
	ClearSelected( arch_box, rc );
	close_dial( FALSE, NULL, &di );
}

/**-----------------------------------------------------------------------------
 ** Funktionsname:	LOCAL VOID DoSetLinks( VOID )
 **		->	nichts
 **		<-	nichts
 **
 ** Die Funktion Ѓbernimmt die Verwaltung der Links.
 **/
LOCAL VOID DoSetLinks( VOID )
{
	WORD rc = -1;
	DIALINFO di;

	open_dial( lklb_box, FALSE, NULL, &di );
	dial_draw( &di );

	while( rc != OK_LKLB )
	{
		rc = dial_do( &di, 0, &linklist );

		switch( rc )
		{
			case LK_MORE:

							reset_linkbox( );
							hndl_linkbox( );
/*
							setup_link( );
*/
							break;
			case LK_CHGE:
/*
							set_linkbox( linklist.active );
							handle_linkbox( );
							setup_link( );
*/
							break;
			case LK_DEL:
/*
							delete_link( linklist.active );
*/
							break;
		}

	}
	
	ClearSelected( lklb_box, rc );
	close_dial( FALSE, NULL, &di );
}


/**-----------------------------------------------------------------------------
 ** Funktionsname:	LOCAL VOID ClearSelected( OBJECT *tree, WORD object )
 **		->	Tree und Objektnummer
 **		<-	nichts
 **
 ** Die Funktion l”scht den SELECTED-Status eines Objekts.
 **/
LOCAL VOID ClearSelected( OBJECT *tree, WORD object )
{
	tree[object].ob_state &= 0xFFFE;
}