<commit_before>/*

  Qt4xHb - Bindings libraries for Harbour/xHarbour and Qt Framework 4

  Copyright (C) 2020 <NAME> <marcosgambeta AT outlook DOT com>

*/

#include "events.h"

static Events *s_events = NULL;

/*
  constructor
*/
Events::Events(QObject *parent) : QObject(parent)
{
  mutex = new QMutex();
}

/*
  destructor
*/
Events::~Events()
{
  Events_release_codeblocks ();
  delete mutex;
}

/*
  filtro de eventos
*/
bool Events::eventFilter(QObject *obj, QEvent *event)
{
  QEvent::Type eventtype = event->type();
  int found = -1;
  const int listsize = list1.size();
  for (int i = 0; i < listsize; ++i)
  {
    if( ( (QObject *) list1.at(i) == (QObject *) obj ) && ( (QEvent::Type) list2.at(i) == (QEvent::Type) eventtype ) )
        {
          found = i;
          break;
        }
  }
  // se no encontrado na lista, propaga o evento
  if( found == -1 )
  {
    return false;
  }
  // executa bloco de cdigo/funo
  //PHB_ITEM pObject = hb_itemPutPtr( NULL, (QObject *) obj );
  PHB_ITEM pObject = Events_return_qobject( (QObject *) obj, "QOBJECT" );
  //PHB_ITEM pEvent = hb_itemPutPtr( NULL, (QEvent *) event );
  PHB_ITEM pEvent = Events_return_object( (QEvent *) event, "QEVENT" );
  bool ret = hb_itemGetL( hb_vmEvalBlockV( (PHB_ITEM) list3.at(found), 2, pObject, pEvent ) );
  hb_itemRelease( pObject );
  hb_itemRelease( pEvent );
  // retorna resultado
  // .t.: interrompe processamento do evento
  // .f.: continua processamento do evento
  return ret;
}

/*
  Conecta um determinado evento com um objeto
  Parmetro 1: ponteiro para o objeto
  Parmetro 2: id do evento
  Parmetro 3: codeblock
  Retorna .t. se a conexo foi bem sucedida ou .f. se falhou
  Funo de uso interno, no deve ser usada nas aplicaes do
  usurio
*/

bool Events_connect_event ( QObject * object, int type, PHB_ITEM codeblock )
{
  int i;
  // parmetros da funo
  //QObject * object = (QObject *) hb_parptr(1);
  //int type = hb_parni(2);
  //PHB_ITEM codeblock = hb_itemNew( hb_param( 3, HB_IT_BLOCK | HB_IT_SYMBOL ) );
  // cria objeto da classe Events, caso no tenha sido criado
  if( s_events == NULL )
  {
    s_events = new Events(QCoreApplication::instance());
  }
  // instala eventfilter, se no houver nenhum evento
  if( s_events->list1.contains( object ) == false )
  {
    object->installEventFilter(s_events);
  }

  s_events->mutex->lock();

  // verifica se j est na lista
  int found = -1;
  const int listsize = s_events->list1.size();
  for (i = 0; i < listsize; ++i)
  {
    if( ( (QObject *) s_events->list1.at(i) == (QObject *) object ) && ( (QEvent::Type) s_events->list2.at(i) == (QEvent::Type) type ) )
    {
      found = i;
      hb_itemRelease( codeblock );
      break;
    }
  }

  bool ret = false;

  // se nao encontrado na lista, adiciona
  if( found == -1 )
  {
    // procura por posio livre
    i = s_events->list1.indexOf( NULL );
    if( i == -1 ) // nao encontrou posicao livre
    {
      // adiciona evento na lista de eventos
      s_events->list1 << object;
      s_events->list2 << (QEvent::Type) type;
      s_events->list3 << codeblock;
    }
    else // encontrou posicao livre
    {
      // coloca na posio livre
      s_events->list1[i] = object;
      s_events->list2[i] = (QEvent::Type) type;
      s_events->list3[i] = codeblock;
    }
    ret = true;
  }

  s_events->mutex->unlock();

  // retorna o resultado da operao
  //hb_retl( ret );
  return ret;
}

/*
  Desconecta um determinado evento
  Parmetro 1: ponteiro para o objeto
  Parmetro 2: id do evento
  Retorna .t. se a desconexo foi bem sucedida ou .f. se falhou
  Funo de uso interno, no deve ser usada nas aplicaes do
  usurio
*/

bool Events_disconnect_event ( QObject * object, int type )
{
  int i;
  // parmetros da funo
  //QObject * object = (QObject *) hb_parptr(1);
  //int type = hb_parni(2);
  // cria objeto da classe Events, caso no tenha sido criado
  if( s_events == NULL )
  {
    s_events = new Events(QCoreApplication::instance());
  }<commit_msg>source/events.cpp: updated<commit_after>/*

  Qt4xHb - Bindings libraries for Harbour/xHarbour and Qt Framework 4

  Copyright (C) 2020 <NAME> <marcosgambeta AT outlook DOT com>

*/

#include "events.h"

static Events *s_events = NULL;

/*
  constructor
*/
Events::Events(QObject *parent) : QObject(parent)
{
  mutex = new QMutex();
}

/*
  destructor
*/
Events::~Events()
{
  Events_release_codeblocks ();
  delete mutex;
}

/*
  filtro de eventos
*/
bool Events::eventFilter(QObject *obj, QEvent *event)
{
  QEvent::Type eventtype = event->type();
  int found = -1;
  const int listsize = list1.size();
  for (int i = 0; i < listsize; ++i)
  {
    if( ( (QObject *) list1.at(i) == (QObject *) obj ) && ( (QEvent::Type) list2.at(i) == (QEvent::Type) eventtype ) )
        {
          found = i;
          break;
        }
  }
  // se no encontrado na lista, propaga o evento
  if( found == -1 )
  {
    return false;
  }
  // executa bloco de cdigo/funo
  //PHB_ITEM pObject = hb_itemPutPtr( NULL, (QObject *) obj );
  PHB_ITEM pObject = Events_return_qobject( (QObject *) obj, "QOBJECT" );
  //PHB_ITEM pEvent = hb_itemPutPtr( NULL, (QEvent *) event );
  PHB_ITEM pEvent = Events_return_object( (QEvent *) event, "QEVENT" );
  bool ret = hb_itemGetL( hb_vmEvalBlockV( (PHB_ITEM) list3.at(found), 2, pObject, pEvent ) );
  hb_itemRelease( pObject );
  hb_itemRelease( pEvent );
  // retorna resultado
  // .t.: interrompe processamento do evento
  // .f.: continua processamento do evento
  return ret;
}

/*
  Conecta um determinado evento com um objeto
  Parmetro 1: ponteiro para o objeto
  Parmetro 2: id do evento
  Parmetro 3: codeblock
  Retorna .t. se a conexo foi bem sucedida ou .f. se falhou
  Funo de uso interno, no deve ser usada nas aplicaes do
  usurio
*/

bool Events_connect_event ( QObject * object, int type, PHB_ITEM codeblock )
{
  int i;
  // parmetros da funo
  //QObject * object = (QObject *) hb_parptr(1);
  //int type = hb_parni(2);
  //PHB_ITEM codeblock = hb_itemNew( hb_param( 3, HB_IT_BLOCK | HB_IT_SYMBOL ) );
  // instala eventfilter, se no houver nenhum evento
  if( s_events->list1.contains( object ) == false )
  {
    object->installEventFilter(s_events);
  }

  s_events->mutex->lock();

  // verifica se j est na lista
  int found = -1;
  const int listsize = s_events->list1.size();
  for (i = 0; i < listsize; ++i)
  {
    if( ( (QObject *) s_events->list1.at(i) == (QObject *) object ) && ( (QEvent::Type) s_events->list2.at(i) == (QEvent::Type) type ) )
    {
      found = i;
      hb_itemRelease( codeblock );
      break;
    }
  }

  bool ret = false;

  // se nao encontrado na lista, adiciona
  if( found == -1 )
  {
    // procura por posio livre
    i = s_events->list1.indexOf( NULL );
    if( i == -1 ) // nao encontrou posicao livre
    {
      // adiciona evento na lista de eventos
      s_events->list1 << object;
      s_events->list2 << (QEvent::Type) type;
      s_events->list3 << codeblock;
    }
    else // encontrou posicao livre
    {
      // coloca na posio livre
      s_events->list1[i] = object;
      s_events->list2[i] = (QEvent::Type) type;
      s_events->list3[i] = codeblock;
    }
    ret = true;
  }

  s_events->mutex->unlock();

  // retorna o resultado da operao
  //hb_retl( ret );
  return ret;
}

/*
  Desconecta um determinado evento
  Parmetro 1: ponteiro para o objeto
  Parmetro 2: id do evento
  Retorna .t. se a desconexo foi bem sucedida ou .f. se falhou
  Funo de uso interno, no deve ser usada nas aplicaes do
  usurio
*/

bool Events_disconnect_event ( QObject * object, int type )
{
  int i;
  // parmetros da funo
  //QObject * object = (QObject *) hb_parptr(1);
  //int type = hb_parni(2);
{'fraction_non_alphanumeric': 0.13238554845441503, 'fraction_numerical': 0.010173470718664406, 'mean_word_length': 2.8455366098294883, 'pattern_counts': {'":': 0, '<': 23, '<?xml version=': 0, '>': 41, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7175008', 'n_tokens_mistral': 2953, 'n_tokens_neox': 2897, 'n_words': 799}