/**************************************/
/*                                    */
/* tests.c                            */
/*                                    */
/**************************************/



#include "x/scolplugin.h"
#include "x/version.h"
#include "objects/text.h"



/*************************************************************************************/
/*                                                                                   */
/*  void GRTestReflexLine ( HWND h ) ;                                               */
/*  Cette fonction est appelée apres qu'une touche ENTER a ete activee dans un       */
/*  objet text edit line. La fonction appelle le reflexe lineOk de l'objet alors     */
/*                                                                                   */
/*************************************************************************************/


int GRTestReflexLine ( HWND h )
{
    int p , k ;
    PtrObjVoid O ;
    char TEXT [MAX_TEXT ] ;

    p = OBJfindTH(mm,OBJTYPTEXT,(int)h);
    if ( p != NIL )
    {
        p = MMfetch(mm,p,OFFOBJMAG);
        O = ( PtrObjVoid ) (MMstart(mm,(p>>1))) ;
        if ( O->Type == ( OBJ_TYPE_EDIT_LINE << 1))
        {
            k=OBJbeginreflex(mm,OBJTYPTEXT,(int)h,RFLTEXT_LINEOK) ; 
            if (k==0)
			{
				GetText ( h , TEXT ) ;
	            Mpushstrbloc ( mm , TEXT ) ;
		        OBJcallreflex(mm,1);
				//MMechostr(MSKDEBUG,"callback line\n");
				return 1;
			}
        }        
    }
	return 0;
}

/***************************************************************************************/
/*                                                                                     */
/*  void GRTestTextTransparent ( HWND h , HDC hdcedit ) ;                              */
/*                                                                                     */
/*  Cette fonction est appele lors d'un reaffichage dans un objet texte.               */
/*  Elle verifie que l'objet est transparent, puis place l'objet en mode transparent   */
/*                                                                                     */
/***************************************************************************************/

void GRTestTextTransparent ( HWND h , HDC hdcedit)
{


    PtrObjVoid O ;
    PtrObjText T ;
    int p ;
 

 
    p = OBJfindTH(mm,OBJTYPTEXT,(int)h);
    
    if (p!=NIL) p = OBJfindTH(mm,OBJTYPRICHTEXT,(int)h);
    if (p!= NIL ) 
    {          
            p = MMfetch(mm,p,OFFOBJMAG);     
            O = ( PtrObjVoid ) (MMstart(mm,(p>>1))) ;
            T = ( PtrObjText ) (MMstart(mm,(O->Buffer>>1)));
            if ( T->Flags & ET_TRANSPARENT )
            {

                SetBkMode ( hdcedit , TRANSPARENT ) ;    
            }
    }
}

/**************************************************************************************/
/*                                                                                    */
/*  void GRTestDefaultButton ( HWND h ) ;                                             */
/*  h est la fenetre parente. Cette fonction regarde si h correspond bien a une       */
/*  fenetre de type dialogue, et dans ce cas, declenche l'evenement du bouton qui     */
/*  a ete cree comme le bouton par defaut                                             */
/*                                                                                    */
/**************************************************************************************/

void GRTestDefaultButton( HWND h )
{
    PtrObjVoid O ;
    PtrObjWindow T ;
    int p ;
 
   
    p = OBJfindTH(mm,OBJTYPWINDOW,(int)h);
    
    
    if (p!=NIL) 

    {          
            p = MMfetch(mm,p,OFFOBJMAG);
     
            O = ( PtrObjVoid ) (MMstart(mm,(p>>1))) ;
            T = ( PtrObjWindow ) (MMstart(mm,(O->Buffer>>1)));
             if ( T->Flags & WN_DIALOG )
            {
                p = SendMessage ( h , DM_GETDEFID , ( WPARAM ) 0 ,( LPARAM ) 0 ) & 0xFF ;                
                if ( p ) SendMessage ( h , WM_COMMAND , ( WPARAM ) BN_CLICKED + ( p << 16 ) , ( LPARAM ) GetDlgItem ( h , p )) ;
            }
    
    }
}

/******************************************************************************************/
/*                                                                                        */
/*  void GRTestTabFocus ( HWND hwnd , int type ) ;                                        */
/*                                                                                        */
/*  Cette fonction est appelee quand un objet de handler hwnd , et de type TYPE, recoit   */
/*  un appui de la touche TAB. Dans ce cas, on verifie que l'objet possede un flag        */
/*  TABFOCUS, et alors on passe le focus au controle suivant qui possede ce flag          */
/*                                                                                        */
/******************************************************************************************/


void GRTestTabFocus ( HWND hwnd , int type ) 
{
  int p, p2, flag, lenght ;
  PtrObjVoid O ;
  HWND nextCtrl;

  flag = 0 ;
  p = OBJfindTH(mm,type,(int)hwnd);      
 

  p = MMfetch(mm,p,OFFOBJMAG);
  O = ( PtrObjVoid ) (MMstart(mm,(p>>1)));

  if (type==OBJTYPLISTBOX)
	{
		flag = (( PtrObjCombo ) (MMstart(mm,(O->Buffer>>1))))->Flags ;
		if ( flag & LBF_TABFOCUS ) flag = 1 ;
	}
	else if (type==OBJTYPCHECK)
	{
		flag = (( PtrObjButton ) (MMstart(mm,(O->Buffer>>1))))->Flags ;
		if ( flag & CH_TABFOCUS ) flag = 1 ;
	}
	else if (type==OBJTYPBUTTON)
	{
		flag = (( PtrObjButton ) (MMstart(mm,(O->Buffer>>1))))->Flags ;
		if ( flag & PB_TABFOCUS ) flag = 1 ;
	}
	else if (type==OBJTYPTEXT)
	{
		flag = (( PtrObjText ) (MMstart(mm,(O->Buffer>>1))))->Flags ;
		if ( flag & ET_TABFOCUS ) flag = 1 ;
	}
	else if (type==OBJTYPCOMBOBOX)
	{
		flag = (( PtrObjCombo ) (MMstart(mm,(O->Buffer>>1))))->Flags ;
		if ( flag & CB_TABFOCUS ) flag = 1 ;
	}
  
  nextCtrl = GetNextDlgTabItem ( GetParent ( hwnd ) , hwnd , (GetKeyState(VK_SHIFT)<0) ? TRUE:FALSE );

  if ( flag ) SetFocus ( nextCtrl );

  p2 = OBJfindTH(mm,OBJTYPTEXT,(int)nextCtrl);
  if (p2 != NIL)
  {
    lenght = GetWindowTextLength(nextCtrl);
    #ifdef WIN32
      SendMessage (nextCtrl, EM_SETSEL, (WPARAM)0, (LPARAM)lenght);
    #else
      SendMessage (nextCtrl, EM_SETSEL, 0, MAKELONG (0, lenght));
    #endif
  }
}