/***************************************************************************
                           FLFormRecordDB.h
                          -------------------
 begin                : Sat Jul 28 2001
 copyright            : (C) 2001-2005 by InfoSiAL S.L.
 email                : mail@infosial.com
***************************************************************************/
/***************************************************************************
 *   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; version 2 of the License.               *
 ***************************************************************************/
/***************************************************************************
   Este  programa es software libre. Puede redistribuirlo y/o modificarlo
   bajo  los  términos  de  la  Licencia  Pública General de GNU   en  su
   versión 2, publicada  por  la  Free  Software Foundation.
 ***************************************************************************/

#ifndef FLFORMRECORDDB_H
#define FLFORMRECORDDB_H

#include <qpushbutton.h>
#include <qsqlrecord.h>
#include <qtooltip.h>
#include <qwhatsthis.h>

#include "FLFormDB.h"

class FLFormRecordDBInterface;

/**
Subclase de FLFormDB pensada para editar registros.

Básicamente esta clase hace lo mismo que su clase
base FLFormDB, lo único que añade son dos botones
Aceptar y/o Cancelar para confirmar o cancelar
los cambios que se realizan en los componentes de
datos que contiene.

Esta clase es idónea para cargar los formularios de
edición de registros definidos en los metadatos
( FLTableMetaData ).

@author InfoSiAL S.L.
*/
class FL_EXPORT FLFormRecordDB: public FLFormDB {

  Q_OBJECT

  friend class FLFormRecordDBInterface;

public:

  /**
  constructor.

  Solo acepta que se le indique un cursor ya creado.

  @param cursor Objeto FLSqlCursor con el cursor con el que tratar.
  @param actionName Nombre de la acción asociada al formulario
  @param showAcceptContinue Indica si se debe mostrar el botón de Aceptar y Continuar
  */
  FLFormRecordDB( FLSqlCursor * cursor, const QString &actionName = QString::null,
                  QWidget * parent = 0, bool showAcceptContinue = true );

  /**
  destructor
  */
  ~FLFormRecordDB();

  /**
  Establece el cursor que debe utilizar el formulario.

  @param c Cursor con el que trabajar
  */
  void setCursor( FLSqlCursor * c );

  /**
  Reimplementado, añade un widget como principal del formulario
  */
  void setMainWidget( QWidget * w );

  /**
  Sobrecargado de setMainWidget.

  Aqui toma el nombre de un formulario de la acción asociada y construye el Widget principal, a partir de él.
  */
  void setMainWidget();

protected:

  /**
  Inicialización
  */
  void initForm();

  /**
  Captura evento cerrar
  */
  void closeEvent( QCloseEvent * e );

  /**
  Validación de formulario.

  Invoca a la función "validateForm" del script "process" asociado al formulario, cuando
  se acepta el formulario y sólo continua con el commit del registro cuando la función del
  script devuelve TRUE.
  */
  bool validateForm();

  /**
  Aceptación de formulario.

  Invoca a la función "acceptedForm" del script "process" asociado al formulario, cuando
  se acepta el formulario y justo antes de hace el commit del registro.
  */
  void acceptedForm();

  /**
  Después de fijar los cambios del buffer del registro actual.

  Invoca a la función "afterCommitBuffer" del script asociado al formulario,
  justo después de hacer el commit del buffer del registro.
  */
  void afterCommitBuffer();

  /**
  Despues de fijar la transacción.

  Invoca a la función "afterCommitTransaction" del script asociado al formulario,
  juesto despues de terminar la transacción en curso aceptando.
  */
  void afterCommitTransaction();

  /**
  Cancelación de formulario.

  Invoca a la función "canceledForm" del script "process" asociado al formulario, cuando se
  cancela el formulario.
  */
  void canceledForm();

  /**
  Boton Aceptar
  */
  QPushButton *pushButtonAccept;

  /**
  Boton Aceptar y continuar
  */
  QPushButton *pushButtonAcceptContinue;

  /**
  Boton Primero
  */
  QPushButton *pushButtonFirst;

  /**
  Boton Anterior
  */
  QPushButton *pushButtonPrevious;

  /**
  Boton Siguiente
  */
  QPushButton *pushButtonNext;

  /**
  Boton Ultimo
  */
  QPushButton *pushButtonLast;

public slots:

  /**
  Invoca a la función "init()" del script "process" asociado al formulario
  */
  void initScript();

  /**
  Se activa al pulsar el boton aceptar
  */
  virtual void accept();

  /**
  Se activa al pulsar el boton aceptar y contninuar
  */
  virtual void acceptContinue();

  /**
  Se activa al pulsar el botón cancelar
  */
  virtual void reject();

  /**
  Abrir IDE en el contexto de este formulario
  */
  void openIde();

protected slots:

  /**
  Ir al primer anterior
  */
  virtual void firstRecord();

  /**
  Ir al registro anterior
  */
  virtual void previousRecord();

  /**
  Ir al registro siguiente
  */
  virtual void nextRecord();

  /**
  Ir al ultimo registro
  */
  virtual void lastRecord();

  /**
  Desactiva el botón cancelar
  */
  void disablePushButtonCancel();

private:

  /**
  Indica si se han aceptado los cambios
  */
  bool accepted;

  /**
  Indica si se debe mostrar el botón Aceptar y Continuar
  */
  bool showAcceptContinue_;

  /**
  Interface para scripts
  */
  FLFormRecordDBInterface *iface;

  /**
  Indica que se está intentando aceptar los cambios
  */
  bool accepting;

  /**
  Modo en el que inicialmente está el cursor
  */
  int initialModeAccess;

  /**
  Registra el nivel de anidamiento de transacciones en el que se entra al iniciar el formulario
  */
  int initTransLevel;
};

#endif
