void FLFormRecordDB::nextRecord() {
    if ( cursor_ && cursor_->isValid() ) {
        if ( cursor_->at() == ( cursor_->size() - 1 ) ) {
            firstRecord();
            return ;
        }
        if ( !validateForm() )
            return ;
        if ( cursor_->checkIntegrity() ) {
            acceptedForm();
            cursor_->setActivatedCheckIntegrity( false );
            if ( cursor_->commitBuffer() ) {
                cursor_->setActivatedCheckIntegrity( true );
                cursor_->commit();
                cursor_->setModeAccess( initialModeAccess );
                accepted = false;
                QString caption = cursor_->metadata() ->alias() + " [ " + static_cast<FLApplication *>( qApp ) ->lastTextCaption() + " ]";
                cursor_->transaction();
                cursor_->next();
                initScript();
            }
        }
#ifdef FL_TEST
        static_cast<FLApplication *>( qApp ) ->continueTesting( FLTester::FORM_RECORD_READY, this->name() );
#endif
    }
}
Exemple #2
0
DbRecord DbFile::newRecord(const char* key, const char* value, RecordType type)
{
	switch (type)
	{
	case Normal:
	{
		size_t size = DbRecord::getSize(key, value, type);
		// Record size too large
		if (size > DbPage::maxFreeSpace)
			return newRecord(key, value, Long);

		return getNewRecord(key, value, type);
	}
	case Long:
	{
		// Check value length
		size_t size = DbRecord::getSize(key, value, type);
		int valueLen = strlen(value);
		int leftValueLen = size - DbPage::maxFreeSpace;
		// Record size too small
		if (leftValueLen <= 0)
			return newRecord(key, value, Normal);

		// Split the first value str
		std::string currentStr(value, valueLen - leftValueLen);

		// Init iterators
		DbRecord firstRecord(getPage(0), 0);
		DbRecord currentRecord(getPage(0), 0);
		DbRecord lastRecord(getPage(0), 0);

		// Create records
		while (leftValueLen > 0)
		{
			lastRecord = currentRecord;
			currentRecord = getNewRecord(key, currentStr.c_str(), type);

			// Update record iterator and next record cursor
			if (type != Long)
			{
				lastRecord.nextExtendedRecord(currentRecord.getPage()->getId(), currentRecord.getCursor());
				leftValueLen -= currentStr.size();
			}
			else
			{
				firstRecord = currentRecord;
				type = LongExtended;
			}

			// Get the size of next value in the new record
			if (leftValueLen > 0)
			{
				size = DbRecord::getSize(key, value + (valueLen - leftValueLen), type);
				if (size > DbPage::maxFreeSpace)
					currentStr = std::string(value + (valueLen - leftValueLen), leftValueLen - (size - DbPage::maxFreeSpace));
				else
					currentStr = std::string(value + (valueLen - leftValueLen), leftValueLen);
			}
		}

		currentRecord.nextExtendedRecord(0, 0);
		return firstRecord;
	}
	default:
		error("Not known record type");
		return DbRecord(getPage(0), 0);		// Avoid warning
	}
}
void FLFormRecordDB::setMainWidget( QWidget * w ) {
    if ( !cursor_ || !w )
        return ;

    if ( !cursor_->metadata() )
        return ;

    if ( showed ) {
        if ( mainWidget_ && mainWidget_ != w )
            initMainWidget( w );
    } else
        w->hide();

    if ( pushButtonAcceptContinue )
        pushButtonAcceptContinue->hide();

    if ( pushButtonAccept )
        pushButtonAccept->hide();

    if ( pushButtonCancel )
        pushButtonCancel->hide();

    if ( pushButtonFirst )
        pushButtonFirst->hide();

    if ( pushButtonPrevious )
        pushButtonPrevious->hide();

    if ( pushButtonNext )
        pushButtonNext->hide();

    if ( pushButtonLast )
        pushButtonLast->hide();

    if ( layoutButtons )
        delete layoutButtons;

    if ( layout )
        delete layout;

    w->setFont( qApp->font() );
    layout = new QVBoxLayout( this, 2, 3, "vlay" + name_ );

    layout->add( w );

    layoutButtons = new QHBoxLayout( layout, 3, "hlay" + name_ ) ;
    QSpacerItem *spacer_2 = new QSpacerItem( 20, 20, QSizePolicy::Expanding,
            QSizePolicy::Minimum );

    QSize pbSize( 26, 26 );

#ifdef FL_DEBUGGER
    if ( !pushButtonIDE ) {
        pushButtonIDE = new QPushButton( this, "pushButtonIDE" );
        connect( pushButtonIDE, SIGNAL( clicked() ), this, SLOT( openIde() ) );
    }
    pushButtonIDE->setSizePolicy( QSizePolicy(( QSizePolicy::SizeType ) 0, ( QSizePolicy::SizeType ) 0, 0, 0,
                                  pushButtonIDE->sizePolicy().hasHeightForWidth() ) );
    pushButtonIDE->setMinimumSize( pbSize );
    pushButtonIDE->setMaximumSize( pbSize );
    QPixmap qsa( QPixmap::fromMimeSource( "bug.png" ) );
    pushButtonIDE->setIconSet( qsa );
    pushButtonIDE->setAccel( QKeySequence( Qt::Key_F3 ) );
    QToolTip::add( pushButtonIDE, tr( "Abrir Depurador (F3)" ) );
    QWhatsThis::add( pushButtonIDE, tr( "Abrir Depurador (F3)" ) );
    pushButtonIDE->setFocusPolicy( QWidget::NoFocus );
    layoutButtons->addWidget( pushButtonIDE );
    connect( pushButtonIDE, SIGNAL( clicked() ), this, SLOT( openIde() ) );
#endif

    layoutButtons->addItem( spacer_2 );

    if ( cursor_->modeAccess() == FLSqlCursor::EDIT ||
            cursor_->modeAccess() == FLSqlCursor::BROWSE ) {
        if ( !pushButtonFirst ) {
            pushButtonFirst = new QPushButton( this, "pushButtonFirst" );
            connect( pushButtonFirst, SIGNAL( clicked() ), this, SLOT( firstRecord() ) );
        }
        pushButtonFirst->setSizePolicy( QSizePolicy(( QSizePolicy::SizeType ) 0, ( QSizePolicy::SizeType ) 0, 0, 0,
                                        pushButtonFirst->sizePolicy().hasHeightForWidth() ) );
        pushButtonFirst->setMinimumSize( pbSize );
        pushButtonFirst->setMaximumSize( pbSize );
        QPixmap rld( QPixmap::fromMimeSource( "first.png" ) );
        pushButtonFirst->setIconSet( rld );
        pushButtonFirst->setAccel( QKeySequence( Qt::Key_F5 ) );
        QToolTip::add( pushButtonFirst, tr( "Aceptar los cambios e ir al primer registro (F5)" ) );
        QWhatsThis::add( pushButtonFirst, tr( "Aceptar los cambios e ir al primer registro (F5)" ) );
        pushButtonFirst->setFocusPolicy( QWidget::NoFocus );
        layoutButtons->addWidget( pushButtonFirst );
        pushButtonFirst->show();

        if ( !pushButtonPrevious ) {
            pushButtonPrevious = new QPushButton( this, "pushButtonPrevious" );
            connect( pushButtonPrevious, SIGNAL( clicked() ), this, SLOT( previousRecord() ) );
        }
        pushButtonPrevious->setSizePolicy( QSizePolicy(( QSizePolicy::SizeType ) 0, ( QSizePolicy::SizeType ) 0, 0, 0,
                                           pushButtonPrevious->sizePolicy().hasHeightForWidth() ) );
        pushButtonPrevious->setMinimumSize( pbSize );
        pushButtonPrevious->setMaximumSize( pbSize );
        QPixmap rld2( QPixmap::fromMimeSource( "previous.png" ) );
        pushButtonPrevious->setIconSet( rld2 );
        pushButtonPrevious->setAccel( QKeySequence( Qt::Key_F6 ) );
        QToolTip::add( pushButtonPrevious, tr( "Aceptar los cambios e ir al registro anterior (F6)" ) );
        QWhatsThis::add( pushButtonPrevious, tr( "Aceptar los cambios e ir al registro anterior (F6)" ) );
        pushButtonPrevious->setFocusPolicy( QWidget::NoFocus );
        layoutButtons->addWidget( pushButtonPrevious );
        pushButtonPrevious->show();

        if ( !pushButtonNext ) {
            pushButtonNext = new QPushButton( this, "pushButtonNext" );
            connect( pushButtonNext, SIGNAL( clicked() ), this, SLOT( nextRecord() ) );
        }
        pushButtonNext->setSizePolicy( QSizePolicy(( QSizePolicy::SizeType ) 0, ( QSizePolicy::SizeType ) 0, 0, 0,
                                       pushButtonNext->sizePolicy().hasHeightForWidth() ) );
        pushButtonNext->setMinimumSize( pbSize );
        pushButtonNext->setMaximumSize( pbSize );
        QPixmap rld3( QPixmap::fromMimeSource( "next.png" ) );
        pushButtonNext->setIconSet( rld3 );
        pushButtonNext->setAccel( QKeySequence( Qt::Key_F7 ) );
        QToolTip::add( pushButtonNext, tr( "Aceptar los cambios e ir al registro siguiente (F7)" ) );
        QWhatsThis::add( pushButtonNext, tr( "Aceptar los cambios e ir al registro siguiente (F7)" ) );
        pushButtonNext->setFocusPolicy( QWidget::NoFocus );
        layoutButtons->addWidget( pushButtonNext );
        pushButtonNext->show();

        if ( !pushButtonLast ) {
            pushButtonLast = new QPushButton( this, "pushButtonLast" );
            connect( pushButtonLast, SIGNAL( clicked() ), this, SLOT( lastRecord() ) );
        }
        pushButtonLast->setSizePolicy( QSizePolicy(( QSizePolicy::SizeType ) 0, ( QSizePolicy::SizeType ) 0, 0, 0,
                                       pushButtonLast->sizePolicy().hasHeightForWidth() ) );
        pushButtonLast->setMinimumSize( pbSize );
        pushButtonLast->setMaximumSize( pbSize );
        QPixmap rld4( QPixmap::fromMimeSource( "last.png" ) );
        pushButtonLast->setIconSet( rld4 );
        pushButtonLast->setAccel( QKeySequence( Qt::Key_F8 ) );
        QToolTip::add( pushButtonLast, tr( "Aceptar los cambios e ir al último registro (F8)" ) );
        QWhatsThis::add( pushButtonLast, tr( "Aceptar los cambios e ir al último registro (F8)" ) );
        pushButtonLast->setFocusPolicy( QWidget::NoFocus );
        layoutButtons->addWidget( pushButtonLast );
        pushButtonLast->show();
    }

    if ( cursor_->modeAccess() != FLSqlCursor::BROWSE ) {
        if ( showAcceptContinue_ ) {
            if ( !pushButtonAcceptContinue ) {
                pushButtonAcceptContinue = new QPushButton( this, "pushButtonAcceptContinue" );
                connect( pushButtonAcceptContinue, SIGNAL( clicked() ), this, SLOT( acceptContinue() ) );
            }
            pushButtonAcceptContinue->setSizePolicy( QSizePolicy(( QSizePolicy::SizeType ) 0, ( QSizePolicy::SizeType ) 0, 0, 0,
                    pushButtonAcceptContinue->sizePolicy().hasHeightForWidth() ) );
            pushButtonAcceptContinue->setMinimumSize( pbSize );
            pushButtonAcceptContinue->setMaximumSize( pbSize );
            QPixmap rld( QPixmap::fromMimeSource( "reload.png" ) );
            pushButtonAcceptContinue->setIconSet( rld );
            pushButtonAcceptContinue->setFocusPolicy( QWidget::NoFocus );
            pushButtonAcceptContinue->setAccel( QKeySequence( Qt::Key_F9 ) );
            QToolTip::add( pushButtonAcceptContinue, tr( "Aceptar los cambios y continuar con la edición de un nuevo registro (F9)" ) );
            QWhatsThis::add( pushButtonAcceptContinue, tr( "Aceptar los cambios y continuar con la edición de un nuevo registro (F9)" ) );
            layoutButtons->addWidget( pushButtonAcceptContinue );
            pushButtonAcceptContinue->show();
        }

        if ( !pushButtonAccept ) {
            pushButtonAccept = new QPushButton( this, "pushButtonAccept" );
            connect( pushButtonAccept, SIGNAL( clicked() ), this, SLOT( accept() ) );
        }
        pushButtonAccept->setSizePolicy( QSizePolicy(( QSizePolicy::SizeType ) 0, ( QSizePolicy::SizeType ) 0, 0, 0,
                                         pushButtonAccept->sizePolicy().hasHeightForWidth() ) );
        pushButtonAccept->setMinimumSize( pbSize );
        pushButtonAccept->setMaximumSize( pbSize );
        QPixmap ok( QPixmap::fromMimeSource( "button_ok.png" ) );
        pushButtonAccept->setIconSet( ok );
        pushButtonAccept->setFocusPolicy( QWidget::NoFocus );
        pushButtonAccept->setAccel( QKeySequence( Qt::Key_F10 ) );
        QToolTip::add( pushButtonAccept, tr( "Aceptar los cambios y cerrar formulario (F10)" ) );
        QWhatsThis::add( pushButtonAccept, tr( "Aceptar los cambios y cerrar formulario (F10)" ) );
        layoutButtons->addWidget( pushButtonAccept );
        pushButtonAccept->show();
    }

    if ( !pushButtonCancel ) {
        pushButtonCancel = new QPushButton( this, "pushButtonCancel" );
        connect( cursor_, SIGNAL( autoCommit() ), this, SLOT( disablePushButtonCancel() ) );
        connect( pushButtonCancel, SIGNAL( clicked() ), this, SLOT( reject() ) );
    }
    pushButtonCancel->setSizePolicy( QSizePolicy(( QSizePolicy::SizeType ) 0, ( QSizePolicy::SizeType ) 0, 0, 0,
                                     pushButtonCancel->sizePolicy().hasHeightForWidth() ) );
    pushButtonCancel->setMinimumSize( pbSize );
    pushButtonCancel->setMaximumSize( pbSize );
    QPixmap cancel( QPixmap::fromMimeSource( "button_cancel.png" ) );
    pushButtonCancel->setIconSet( cancel );
    if ( cursor_->modeAccess() != FLSqlCursor::BROWSE ) {
        pushButtonCancel->setFocusPolicy( QWidget::NoFocus );
        pushButtonCancel->setAccel( 4096 );
        QToolTip::add( pushButtonCancel, tr( "Cancelar los cambios y cerrar formulario (Esc)" ) );
        QWhatsThis::add( pushButtonCancel, tr( "Cancelar los cambios y cerrar formulario (Esc)" ) );
    } else {
        QPixmap ok( QPixmap::fromMimeSource( "button_cancel.png" ) );
        pushButtonCancel->setIconSet( ok );
        pushButtonCancel->setFocusPolicy( QWidget::StrongFocus );
        pushButtonCancel->setFocus();
        pushButtonCancel->setAccel( 4096 );
        QToolTip::add( pushButtonCancel, tr( "Aceptar y cerrar formulario (Esc)" ) );
        QWhatsThis::add( pushButtonCancel, tr( "Aceptar y cerrar formulario (Esc)" ) );
    }
    pushButtonCancel->setDefault( true );
    layoutButtons->addWidget( pushButtonCancel );
    pushButtonCancel->show();

    mainWidget_ = w;
    mainWidget_->setFocusPolicy( QWidget::NoFocus );
    int mWidth = mainWidget_->width();
    int mHeight = mainWidget_->height();
    QWidget * actWin = qApp->activeWindow();
    QRect screen = ( actWin ? actWin->geometry() : qApp->mainWidget()->geometry() );
    QRect desk = QApplication::desktop()->geometry();
    QPoint p = screen.center() - QPoint( mWidth / 2, mHeight / 2 );
    if ( p.x() + mWidth > desk.width() )
        p.setX( desk.width() - mWidth );
    if ( p.y() + mHeight > desk.height() )
        p.setY( desk.height() - mHeight );
    if ( p.x() < 0 )
        p.setX( 0 );
    if ( p.y() < 0 )
        p.setY( 0 );
    move( p );
}