1
/***************************************************************************
2
* Copyright (C) 2005 by Adam Treat *
5
* This program is free software; you can redistribute it and/or modify *
6
* it under the terms of the GNU General Public License as published by *
7
* the Free Software Foundation; either version 2 of the License, or *
8
* (at your option) any later version. *
10
***************************************************************************/
12
#include "datatableedit.h"
13
#include "formlayout.h"
14
#include "datatableeditorfactory.h"
18
#include <qpushbutton.h>
23
#include <qdrawutil.h>
24
#include <qsqlpropertymap.h>
28
#include <kmessagebox.h>
30
ScrollForm::ScrollForm( QWidget *parent, const char *name )
31
: QScrollView( parent, name ),
32
m_frameColor( Qt::green )
34
setResizePolicy( QScrollView::AutoOneFit );
37
ScrollForm::~ScrollForm()
40
void ScrollForm::drawFrame( QPainter* p )
42
qDrawPlainRect( p, frameRect(), m_frameColor, 2 );
45
QColor ScrollForm::getFrameColor() const
50
void ScrollForm::setFrameColor( const QColor &color )
55
DataTableEdit::DataTableEdit( QWidget *parent, const char *name )
56
: QDataBrowser( parent, name ),
59
m_refreshing( false ),
64
setConfirmInsert( true );
65
setConfirmDelete( true );
68
setForm( new QSqlForm() );
70
QVBoxLayout *topLayout = new QVBoxLayout( this, 10, 10 );
72
m_scroll = new ScrollForm( this );
73
m_formBox = new QFrame( m_scroll->viewport() );
75
QVBoxLayout *viewPortLayout = new QVBoxLayout( m_scroll->viewport(), 0, 0 );
76
viewPortLayout->add(m_formBox);
78
m_formLayout = new FormLayout( m_formBox, 20, 20 );
79
m_scroll->addChild( m_formBox );
81
QFrame *buttonBox = new QFrame(this);
82
QHBoxLayout *buttonLayout = new QHBoxLayout( buttonBox, 0, 20 );
84
QPushButton *f = new QPushButton( "|< First", buttonBox );
85
QPushButton *p = new QPushButton( "<< Prev", buttonBox );
86
QPushButton *n = new QPushButton( "Next >>", buttonBox );
87
QPushButton *l = new QPushButton( "Last >|", buttonBox );
88
m_commit = new QPushButton( "Commit", buttonBox );
89
m_commit->setEnabled( false );
91
f->setFocusPolicy( QWidget::ClickFocus );
92
p->setFocusPolicy( QWidget::ClickFocus );
93
n->setFocusPolicy( QWidget::ClickFocus );
94
l->setFocusPolicy( QWidget::ClickFocus );
95
m_commit->setFocusPolicy( QWidget::ClickFocus );
97
QSpacerItem *hSpace = new QSpacerItem( 0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum );
99
buttonLayout->add( f );
100
buttonLayout->add( p );
101
buttonLayout->add( n );
102
buttonLayout->add( l );
103
buttonLayout->addItem( hSpace );
104
buttonLayout->add( m_commit );
106
topLayout->add( m_scroll );
107
topLayout->add( buttonBox );
109
QObject::connect( f, SIGNAL( clicked() ), this, SLOT( first() ) );
110
QObject::connect( p, SIGNAL( clicked() ), this, SLOT( prev() ) );
111
QObject::connect( n, SIGNAL( clicked() ), this, SLOT( next() ) );
112
QObject::connect( l, SIGNAL( clicked() ), this, SLOT( last() ) );
113
QObject::connect( m_commit, SIGNAL( clicked() ), this, SLOT( update() ) );
116
DataTableEdit::~DataTableEdit()
119
void DataTableEdit::addEditorBase( DataEditorBase *editor, bool isVirtual )
121
m_formLayout->add( editor );
124
form()->insert( editor->getEditor(), editor->getField()->name() );
125
QObject::connect( editor, SIGNAL( editBufferChanged( QVariant, bool ) ),
126
this, SLOT( toggleColorBox() ) );
127
QObject::connect( editor, SIGNAL( addConstraint( DataEditorBase *, const QString & ) ),
128
this, SLOT( constrainEditor( DataEditorBase *, const QString & ) ) );
133
void DataTableEdit::removeEditors()
136
QLayoutIterator it = m_formLayout->iterator();
138
while ( (item = it.takeCurrent()) )
140
DataEditorBase *editor = ::qt_cast<DataEditorBase*>( item->widget() );
146
void DataTableEdit::installPropertyMap( QSqlPropertyMap *map )
149
form()->installPropertyMap( map );
152
FormLayout* DataTableEdit::getFormLayout() const
157
ScrollForm* DataTableEdit::getScrollView() const
162
QFrame* DataTableEdit::getFormBox() const
167
QVariant DataTableEdit::currentValue( const QString &field )
169
QSqlField *f = sqlCursor()->editBuffer()->field( field );
172
QWidget *w = form()->fieldToWidget( f );
175
QVariant v = m_map->property( w );
186
void DataTableEdit::setCurrentRow( int row )
190
form()->clearValues( true );
192
m_scroll->viewport()->hide();
194
else if ( !isEnabled() )
197
m_scroll->viewport()->show();
203
bool DataTableEdit::seek( int i, bool relative )
207
//If we are currently inserting, but the cursor
208
//is valid then we've aborted the insert before the
210
if ( m_inserting && sqlCursor()->at() == i )
211
emit insertAborted();
213
//The DataTableView sends us this extra signal
214
//so we make sure the cursor is still invalid during
217
m_inserting = sqlCursor()->at() != i;
221
changeColorBox( Qt::green );
222
m_commit->setEnabled( false );
225
bool temp = QDataBrowser::seek( i, relative );
230
void DataTableEdit::first()
232
emit selectedFirst();
235
void DataTableEdit::prev()
240
void DataTableEdit::next()
245
void DataTableEdit::last()
250
void DataTableEdit::update()
252
if ( !m_commit->isEnabled() )
256
///TODO Write own version of update to get rid of unnecessary seeks
257
/// and invalidated updates.
258
QDataBrowser::update();
259
seek( m_currentRow, false );
260
changeColorBox( Qt::green );
261
m_commit->setEnabled( false );
262
emit selectedRow( m_currentRow );
265
bool DataTableEdit::insertRecord()
267
if ( confirmInsert() )
268
if ( KMessageBox::Continue !=
269
KMessageBox::warningContinueCancel( this, i18n( "You are about to insert a record. Are you sure?" ) ) )
273
QDataBrowser::insert();
274
changeColorBox( Qt::red );
275
m_commit->setEnabled( true );
279
bool DataTableEdit::deleteRecord()
281
if ( confirmDelete() )
282
if ( KMessageBox::Continue !=
283
KMessageBox::warningContinueCancel( this, i18n( "You are about to delete a record. Are you sure?" ) ) )
286
bool success = QDataBrowser::deleteCurrent();
289
changeColorBox( Qt::green );
290
m_commit->setEnabled( false );
295
void DataTableEdit::refresh()
298
QDataBrowser::refresh();
299
m_refreshing = false;
302
void DataTableEdit::readFields()
305
QDataBrowser::readFields();
307
QLayoutIterator it = m_formLayout->iterator();
309
while ( (item = it.current()) != 0 )
311
DataEditorBase *editor = ::qt_cast<DataEditorBase*>( item->widget() );
312
if ( !editor->getField() )
314
editor->calculateEditor(); //This editor points to a virtual field
319
if ( editor->getField()->isNull() )
321
editor->setNullValue( "" ); //needs to sync with QDataTable::nullText
326
m_refreshing = false;
329
void DataTableEdit::calculateFields()
331
QLayoutIterator it = m_formLayout->iterator();
333
while ( (item = it.current()) != 0 )
335
DataEditorBase *editor = ::qt_cast<DataEditorBase*>( item->widget() );
336
if ( !editor->getField() )
337
editor->calculateEditor(); //This editor points to a virtual field
342
void DataTableEdit::toggleColorBox()
347
QColor color = m_scroll->getFrameColor();
349
if ( color == Qt::green && currentEdited() )
351
changeColorBox( Qt::red );
352
m_commit->setEnabled( true );
354
else if ( color == Qt::red && !currentEdited() )
356
changeColorBox( Qt::green );
357
m_commit->setEnabled( false );
361
void DataTableEdit::constrainEditor( DataEditorBase *editor, const QString &field )
363
DataEditorBase *constraint = 0;
364
QLayoutIterator it = m_formLayout->iterator();
366
while ( (item = it.current()) != 0 )
368
DataEditorBase *eb = ::qt_cast<DataEditorBase*>( item->widget() );
369
if ( !eb->getField() )
375
if ( eb->getField()->name() == field )
385
QObject::connect( constraint, SIGNAL( editBufferChanged( QVariant, bool ) ),
386
editor, SLOT( resetEditBuffer( QVariant, bool ) ) );
390
QSql::Confirm DataTableEdit::confirmEdit( QSql::Op /*m*/ )
395
void DataTableEdit::showEvent( QShowEvent *ev )
397
QDataBrowser::showEvent( ev );
401
QLayoutIterator it = m_formLayout->iterator();
402
QLayoutItem *item = it.current();
407
if ( DataEditorBase *editor = ::qt_cast<DataEditorBase*>( item->widget() ) )
411
bool DataTableEdit::currentEdited()
414
QLayoutIterator it = m_formLayout->iterator();
416
while ( (item = it.current()) != 0 )
418
DataEditorBase *editor = ::qt_cast<DataEditorBase*>( item->widget() );
419
if ( editor->currentEdited() )
428
void DataTableEdit::handleError( const QSqlError &error )
431
//If currentEdited() != QDataBrowser::currentEdited()
432
//we know that the user put an incorrect string in a
433
//relation combo. Eventually should track the combo and highlight it
434
if ( currentEdited() && !QDataBrowser::currentEdited() )
435
err = QSqlError ( error.driverText(),
436
"Data Relation Error!\nCheck your dropdown boxes...",
437
error.type(), error.number() );
441
kdDebug() << "Error in query = " << sqlCursor()->lastQuery() << endl;
442
QDataBrowser::handleError( error );
445
void DataTableEdit::changeColorBox( QColor color )
447
QColor cur = m_scroll->getFrameColor();
451
m_scroll->setFrameColor( color );
453
emit colorBoxChanged( color );
456
#include "datatableedit.moc"