/*
 * Xailer source code:
 *
 * MsgBox.c
 * Funciones para cajas de mensaje
 *
 * Copyright 2003, 2007 Jose F. Gimenez
 * Copyright 2003, 2007 Xailer.com
 * All rights reserved
 *
 */

#include <windows.h>
#include <xailer.h>


//--------------------------------------------------------------------------

XA_EXPORT int XA_MsgBox( PHB_ITEM pItem, const char * Caption, ULONG uType, HWND hWnd ) // XA_MsgBox( <pItem>, <cCaption>, <ulType>, <hWnd> ) --> int
{
   UINT uiRet;
   ULONG ulLen;
   BOOL bFreeReq = FALSE;

   LPSTR szText;

	if( pItem )
	{
		if( HB_IS_OBJECT( pItem ) )
   	{
   	   szText = hb_xgrab( 128 );
   	   sprintf( szText, "{ %s }", hb_objGetClsName( pItem ) );
   	   bFreeReq = TRUE;
   	}
      else if( HB_IS_HASH( pItem ) )
      {
         szText = "{ => }";
   	}
   	else if( HB_IS_ARRAY( pItem ) )
   	{
   	   szText = "{ ... }";
   	}
   	else
   	   szText = hb_itemString( pItem, &ulLen, &bFreeReq );
	}
	else
   	szText = "";

   if( !Caption || !*Caption )  // Obtener el caption de Application:cTitle
   {
      XA_ObjSend( Application(), "cTitle" );
      Caption = hb_parc( -1 );
   }

   if( ! uType )
      uType = MB_ICONINFORMATION;

   if( ( ! hWnd ) && ( ( uType & MB_TASKMODAL ) == 0 ) )
      hWnd = GetActiveWindow();

   uiRet = MessageBox( hWnd, szText, Caption, uType );

   if( bFreeReq )
      hb_xfree( szText );

   return uiRet;
}

//--------------------------------------------------------------------------

XA_EXPORT void MsgDebug( const char * cText ) // MsgDebug( <cText> ) --> void
{
   MessageBox( GetActiveWindow(), cText, "Debug", MB_ICONINFORMATION );
}

//--------------------------------------------------------------------------

XA_EXPORT void MsgSysError( DWORD nError ) // MsgSysError( <dwError> ) --> void
{
   LPVOID lpMsgBuf;

   if ( FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |
                       FORMAT_MESSAGE_FROM_SYSTEM |
                       FORMAT_MESSAGE_IGNORE_INSERTS,
                       NULL, nError,
                       MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
                       (LPTSTR) &lpMsgBuf, 0, NULL ) )
   {
      MessageBox( GetActiveWindow(), (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONERROR );
      LocalFree( lpMsgBuf );
   }
}

//--------------------------------------------------------------------------

XA_FUNC( MSGINFO )      // MsgInfo( <uValue>, [<cTitle>] ) --> nResult
{
   hb_retnl( XA_MsgBox( hb_param( 1, HB_IT_ANY ), hb_parc( 2 ), MB_ICONINFORMATION, 0 ) );
}

//--------------------------------------------------------------------------

XA_FUNC( MSGALERT )     // MsgAlert( <uValue>, [<cTitle>] ) --> nResult
{
   hb_retnl( XA_MsgBox( hb_param( 1, HB_IT_ANY ), hb_parc( 2 ), MB_ICONEXCLAMATION, 0 ) );
}

//--------------------------------------------------------------------------

XA_FUNC( MSGSTOP )      // MsgStop( <uValue>, [<cTitle>] ) --> nResult
{
   hb_retnl( XA_MsgBox( hb_param( 1, HB_IT_ANY ), hb_parc( 2 ), MB_ICONSTOP, 0 ) );
}

//--------------------------------------------------------------------------

XA_FUNC( MSGOKCANCEL )  // MsgOkCancel( <uValue>, [<cTitle>] ) --> lResult
{
   hb_retl( XA_MsgBox( hb_param( 1, HB_IT_ANY ), hb_parc( 2 ), MB_OKCANCEL | MB_ICONQUESTION, 0 ) == IDOK );
}

//--------------------------------------------------------------------------

XA_FUNC( MSGCANCELOK )  // MsgCancelOk( <uValue>, [<cTitle>] ) --> lResult
{
   hb_retl( XA_MsgBox( hb_param( 1, HB_IT_ANY ), hb_parc( 2 ), MB_OKCANCEL | MB_ICONQUESTION | MB_DEFBUTTON2, 0 ) == IDOK );
}

//--------------------------------------------------------------------------

XA_FUNC( MSGYESNO )     // MsgYesNo( <uValue>, [<cTitle>] ) --> lResult
{
   hb_retl( XA_MsgBox( hb_param( 1, HB_IT_ANY ), hb_parc( 2 ), MB_YESNO | MB_ICONQUESTION, 0 ) == IDYES );
}

//--------------------------------------------------------------------------

XA_FUNC( MSGYESNOCANCEL )  // MsgYesNoCancel( <uValue>, [<cTitle>] ) --> nResult
{
   hb_retnl( XA_MsgBox( hb_param( 1, HB_IT_ANY ), hb_parc( 2 ), MB_YESNOCANCEL | MB_ICONQUESTION, 0 ) );
}

//--------------------------------------------------------------------------

XA_FUNC( MSGNOYES )     // MsgNoYes( <uValue>, [<cTitle>] ) --> lResult
{
   hb_retl( XA_MsgBox( hb_param( 1, HB_IT_ANY ), hb_parc( 2 ), MB_YESNO | MB_ICONQUESTION | MB_DEFBUTTON2, 0 ) == IDYES );
}

//--------------------------------------------------------------------------

XA_FUNC( MSGRETRYCANCEL )  // MsgRetryCancel( <uValue>, [<cTitle>] ) --> lResult
{
   hb_retl( XA_MsgBox( hb_param( 1, HB_IT_ANY ), hb_parc( 2 ), MB_RETRYCANCEL | MB_ICONQUESTION, 0 ) == IDRETRY );
}

//--------------------------------------------------------------------------

XA_FUNC( MESSAGEBOX )      // MessageBox( <hWnd>, <uValue>, [<cTitle>], <nFlags> ) --> nResult
{
   hb_retnl( XA_MsgBox( hb_param( 2, HB_IT_ANY ), hb_parc( 3 ), hb_parnl( 4 ), (HWND) hb_parnl( 1 ) ) );
}

//--------------------------------------------------------------------------
// JFG - NOTA: Esta es igual que MessageBox pero quitando hwnd
XA_FUNC( MSGBOX )          // MsgBox( <uValue>, [<cTitle>], <nFlags> ) --> nResult
{
   hb_retnl( XA_MsgBox( hb_param( 1, HB_IT_ANY ), hb_parc( 2 ), hb_parnl( 3 ), NULL ) );
}

//--------------------------------------------------------------------------

XA_FUNC( MSGBEEP )   // MsgBeep( <nIcon> ) --> n/a
{
   MessageBeep( HB_ISNUM( 1 ) ? (UINT) hb_parni( 1 ) : 0xFFFFFFFF );
}

//--------------------------------------------------------------------------

XA_FUNC( MESSAGEBEEP )  // MessageBeep( <nIcon> ) --> n/a
{
   MessageBeep( HB_ISNUM( 1 ) ? (UINT) hb_parni( 1 ) : 0xFFFFFFFF );
}

//--------------------------------------------------------------------------

XA_FUNC( MSGDEBUG )     // MsgDebug( <cString> ) --> n/a
{
   MsgDebug( hb_parc( 1 ) );
}

//--------------------------------------------------------------------------

XA_FUNC( MSGSYSERROR )  // MsgSysError( <nSysError> ) --> n/a
{
   MsgSysError( hb_parnl( 1 ) );
}

//--------------------------------------------------------------------------

XA_FUNC( XA_GETSYSERROR )  // XA_GetSysError( <nSysError> ) --> cErrorDescription
{
   LPVOID lpMsgBuf;

   if ( HB_ISNUM( 1 ) &&
         FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |
                        FORMAT_MESSAGE_FROM_SYSTEM |
                        FORMAT_MESSAGE_IGNORE_INSERTS,
                        NULL, hb_parnl( 1 ),
                        MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ),
                        (LPTSTR) &lpMsgBuf, 0, NULL ) )
   {
      hb_retc( (char *) lpMsgBuf );
      LocalFree( lpMsgBuf );
   }
   else
      hb_retc( "" );
}

//--------------------------------------------------------------------------
