~ubuntu-branches/debian/sid/kdevelop/sid

« back to all changes in this revision

Viewing changes to kdevdesigner/designer/tableeditorimpl.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Jeremy Lainé
  • Date: 2010-05-05 07:21:55 UTC
  • mfrom: (1.2.3 upstream) (5.1.2 squeeze)
  • Revision ID: james.westby@ubuntu.com-20100505072155-h78lx19pu04sbhtn
Tags: 4:4.0.0-2
* Upload to unstable (Closes: #579947, #481832).
* Acknowledge obsolete NMU fixes (Closes: #562410, #546961).

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/**********************************************************************
2
 
** Copyright (C) 2000-2001 Trolltech AS.  All rights reserved.
3
 
**
4
 
** This file is part of Qt Designer.
5
 
**
6
 
** This file may be distributed and/or modified under the terms of the
7
 
** GNU General Public License version 2 as published by the Free Software
8
 
** Foundation and appearing in the file LICENSE.GPL included in the
9
 
** packaging of this file.
10
 
**
11
 
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
12
 
** licenses may use this file in accordance with the Qt Commercial License
13
 
** Agreement provided with the Software.
14
 
**
15
 
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16
 
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
17
 
**
18
 
** See http://www.trolltech.com/gpl/ for GPL licensing information.
19
 
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
20
 
**   information about Qt Commercial License Agreements.
21
 
**
22
 
** Contact info@trolltech.com if any conditions of this licensing are
23
 
** not clear to you.
24
 
**
25
 
**********************************************************************/
26
 
 
27
 
#include "tableeditorimpl.h"
28
 
#ifndef QT_NO_TABLE
29
 
#include <qtable.h>
30
 
#endif
31
 
#include "formwindow.h"
32
 
#include <qlabel.h>
33
 
#include <qcombobox.h>
34
 
#include <qheader.h>
35
 
#include <qlistbox.h>
36
 
#include <klineedit.h>
37
 
#include <qpushbutton.h>
38
 
#include "pixmapchooser.h"
39
 
#include "command.h"
40
 
#include <qvaluelist.h>
41
 
#include <qtabwidget.h>
42
 
#include <qdatatable.h>
43
 
#include "project.h"
44
 
#include "metadatabase.h"
45
 
#include "mainwindow.h"
46
 
 
47
 
#include <klocale.h>
48
 
 
49
 
TableEditor::TableEditor( QWidget* parent,  QWidget *editWidget, FormWindow *fw, const char* name, bool modal, WFlags fl )
50
 
    : TableEditorBase( parent, name, modal, fl ),
51
 
#ifndef QT_NO_TABLE
52
 
    editTable( (QTable*)editWidget ),
53
 
#endif
54
 
    formWindow( fw )
55
 
{
56
 
    connect( buttonHelp, SIGNAL( clicked() ), MainWindow::self, SLOT( showDialogHelp() ) );
57
 
#ifndef QT_NO_TABLE
58
 
    labelColumnPixmap->setText( "" );
59
 
    labelRowPixmap->setText( "" );
60
 
 
61
 
#ifndef QT_NO_SQL
62
 
    if ( !::qt_cast<QDataTable*>(editTable) )
63
 
#endif
64
 
    {
65
 
        labelFields->hide();
66
 
        comboFields->hide();
67
 
        labelTable->hide();
68
 
        labelTableValue->hide();
69
 
    }
70
 
#ifndef QT_NO_SQL
71
 
    if ( ::qt_cast<QDataTable*>(editTable) ) {
72
 
        // ## why does this behave weird?
73
 
        //      TabWidget->removePage( rows_tab );
74
 
        //      rows_tab->hide();
75
 
        // ## do this in the meantime...
76
 
        TabWidget->setTabEnabled( rows_tab, FALSE );
77
 
    }
78
 
 
79
 
    if ( formWindow->project() && ::qt_cast<QDataTable*>(editTable) ) {
80
 
        QStringList lst = MetaDataBase::fakeProperty( editTable, "database" ).toStringList();
81
 
        if ( lst.count() == 2 && !lst[ 0 ].isEmpty() && !lst[ 1 ].isEmpty() ) {
82
 
            QStringList fields;
83
 
            fields << "<no field>";
84
 
            fields += formWindow->project()->databaseFieldList( lst[ 0 ], lst[ 1 ] );
85
 
            comboFields->insertStringList( fields );
86
 
        }
87
 
        if ( !lst[ 1 ].isEmpty() )
88
 
            labelTableValue->setText( lst[ 1 ] );
89
 
    }
90
 
#endif
91
 
 
92
 
    readFromTable();
93
 
#endif
94
 
}
95
 
 
96
 
TableEditor::~TableEditor()
97
 
{
98
 
}
99
 
 
100
 
void TableEditor::columnDownClicked()
101
 
{
102
 
    if ( listColumns->currentItem() == -1 ||
103
 
         listColumns->currentItem() == (int)listColumns->count() - 1 ||
104
 
         listColumns->count() < 2 )
105
 
        return;
106
 
    saveFieldMap();
107
 
    int index = listColumns->currentItem() + 1;
108
 
    QListBoxItem *i = listColumns->item( listColumns->currentItem() );
109
 
    listColumns->takeItem( i );
110
 
    listColumns->insertItem( i, index );
111
 
    listColumns->setCurrentItem( i );
112
 
    readColumns();
113
 
    restoreFieldMap();
114
 
    currentColumnChanged( i );
115
 
}
116
 
 
117
 
void TableEditor::columnTextChanged( const QString &s )
118
 
{
119
 
    if ( listColumns->currentItem() == -1 )
120
 
        return;
121
 
    listColumns->blockSignals( TRUE );
122
 
    listColumns->changeItem( s, listColumns->currentItem() );
123
 
    listColumns->blockSignals( FALSE );
124
 
#ifndef QT_NO_TABLE
125
 
    if ( table->horizontalHeader()->iconSet( listColumns->currentItem() ) )
126
 
        table->horizontalHeader()->setLabel( listColumns->currentItem(),
127
 
                                             *table->horizontalHeader()->iconSet( listColumns->currentItem() ), s );
128
 
    else
129
 
        table->horizontalHeader()->setLabel( listColumns->currentItem(), s );
130
 
#endif
131
 
}
132
 
 
133
 
void TableEditor::columnUpClicked()
134
 
{
135
 
    if ( listColumns->currentItem() <= 0 ||
136
 
         listColumns->count() < 2 )
137
 
        return;
138
 
    saveFieldMap();
139
 
    int index = listColumns->currentItem() - 1;
140
 
    QListBoxItem *i = listColumns->item( listColumns->currentItem() );
141
 
    listColumns->takeItem( i );
142
 
    listColumns->insertItem( i, index );
143
 
    listColumns->setCurrentItem( i );
144
 
    readColumns();
145
 
    restoreFieldMap();
146
 
    currentColumnChanged( i );
147
 
}
148
 
 
149
 
void TableEditor::currentColumnChanged( QListBoxItem *i )
150
 
{
151
 
    if ( !i )
152
 
        return;
153
 
    editColumnText->blockSignals( TRUE );
154
 
    editColumnText->setText( i->text() );
155
 
    if ( i->pixmap() )
156
 
        labelColumnPixmap->setPixmap( *i->pixmap() );
157
 
    else
158
 
        labelColumnPixmap->setText( "" );
159
 
    editColumnText->blockSignals( FALSE );
160
 
 
161
 
#ifndef QT_NO_SQL
162
 
    if ( ::qt_cast<QDataTable*>(editTable) ) {
163
 
        QString s = *fieldMap.find( listColumns->index( i ) );
164
 
        if ( s.isEmpty() )
165
 
            comboFields->setCurrentItem( 0 );
166
 
        else if ( comboFields->listBox()->findItem( s ) )
167
 
            comboFields->setCurrentItem( comboFields->listBox()->index( comboFields->listBox()->findItem( s ) ) );
168
 
        else
169
 
            comboFields->lineEdit()->setText( s );
170
 
    }
171
 
#endif
172
 
}
173
 
 
174
 
void TableEditor::currentFieldChanged( const QString &s )
175
 
{
176
 
    if ( listColumns->currentItem() == -1 )
177
 
        return;
178
 
    fieldMap.remove( listColumns->currentItem() );
179
 
    fieldMap.insert( listColumns->currentItem(), s );
180
 
    editColumnText->blockSignals( TRUE ); //## necessary
181
 
    QString newColText = s.mid(0,1).upper() + s.mid(1);
182
 
    editColumnText->setText( newColText );
183
 
    columnTextChanged( newColText );
184
 
    editColumnText->blockSignals( FALSE );
185
 
}
186
 
 
187
 
void TableEditor::currentRowChanged( QListBoxItem *i )
188
 
{
189
 
    if ( !i )
190
 
        return;
191
 
    editRowText->blockSignals( TRUE );
192
 
    editRowText->setText( i->text() );
193
 
    if ( i->pixmap() )
194
 
        labelRowPixmap->setPixmap( *i->pixmap() );
195
 
    else
196
 
        labelRowPixmap->setText( "" );
197
 
    editRowText->blockSignals( FALSE );
198
 
}
199
 
 
200
 
void TableEditor::deleteColumnClicked()
201
 
{
202
 
    if ( listColumns->currentItem() == -1 )
203
 
        return;
204
 
#ifndef QT_NO_TABLE
205
 
    table->setNumCols( table->numCols() - 1 );
206
 
    delete listColumns->item( listColumns->currentItem() );
207
 
    readColumns();
208
 
    if ( listColumns->firstItem() ) {
209
 
        listColumns->setCurrentItem( listColumns->firstItem() );
210
 
        listColumns->setSelected( listColumns->firstItem(), TRUE );
211
 
    }
212
 
#endif
213
 
}
214
 
 
215
 
void TableEditor::deleteRowClicked()
216
 
{
217
 
    if ( listRows->currentItem() == -1 )
218
 
        return;
219
 
#ifndef QT_NO_TABLE
220
 
    table->setNumRows( table->numRows() - 1 );
221
 
    delete listRows->item( listRows->currentItem() );
222
 
    readRows();
223
 
    if ( listRows->firstItem() ) {
224
 
        listRows->setCurrentItem( listRows->firstItem() );
225
 
        listRows->setSelected( listRows->firstItem(), TRUE );
226
 
    }
227
 
#endif
228
 
}
229
 
 
230
 
void TableEditor::newColumnClicked()
231
 
{
232
 
#ifndef QT_NO_TABLE
233
 
    table->setNumCols( table->numCols() + 1 );
234
 
    QMap<QString, bool> m;
235
 
    for ( int i = 0; i < table->numCols() - 1; ++i )
236
 
        m.insert( table->horizontalHeader()->label( i ), TRUE );
237
 
    int n = table->numCols() - 1;
238
 
    QString t = QString::number( n );
239
 
    while ( m.find( t ) != m.end() )
240
 
        t = QString::number( ++n );
241
 
    table->horizontalHeader()->setLabel( table->numCols() - 1, t );
242
 
    listColumns->insertItem( t );
243
 
    QListBoxItem *item = listColumns->item( listColumns->count() - 1 );
244
 
    listColumns->setCurrentItem( item );
245
 
    listColumns->setSelected( item, TRUE );
246
 
#ifndef QT_NO_SQL
247
 
    if ( ::qt_cast<QDataTable*>(editTable) ) {
248
 
        comboFields->setFocus();
249
 
    } else
250
 
#endif
251
 
    {
252
 
        editColumnText->setFocus();
253
 
        editColumnText->selectAll();
254
 
    }
255
 
#endif
256
 
}
257
 
 
258
 
void TableEditor::newRowClicked()
259
 
{
260
 
#ifndef QT_NO_TABLE
261
 
    table->setNumRows( table->numRows() + 1 );
262
 
    QMap<QString, bool> m;
263
 
    for ( int i = 0; i < table->numRows() - 1; ++i )
264
 
        m.insert( table->verticalHeader()->label( i ), TRUE );
265
 
    int n = table->numRows() - 1;
266
 
    QString t = QString::number( n );
267
 
    while ( m.find( t ) != m.end() )
268
 
        t = QString::number( ++n );
269
 
    table->verticalHeader()->setLabel( table->numRows() - 1, t );
270
 
    listRows->insertItem( t );
271
 
    QListBoxItem *item = listRows->item( listRows->count() - 1 );
272
 
    listRows->setCurrentItem( item );
273
 
    listRows->setSelected( item, TRUE );
274
 
#endif
275
 
}
276
 
 
277
 
void TableEditor::okClicked()
278
 
{
279
 
    applyClicked();
280
 
    accept();
281
 
}
282
 
 
283
 
void TableEditor::rowDownClicked()
284
 
{
285
 
    if ( listRows->currentItem() == -1 ||
286
 
         listRows->currentItem() == (int)listRows->count() - 1 ||
287
 
         listRows->count() < 2 )
288
 
        return;
289
 
    int index = listRows->currentItem() + 1;
290
 
    QListBoxItem *i = listRows->item( listRows->currentItem() );
291
 
    listRows->takeItem( i );
292
 
    listRows->insertItem( i, index );
293
 
    listRows->setCurrentItem( i );
294
 
    readRows();
295
 
}
296
 
 
297
 
void TableEditor::rowTextChanged( const QString &s )
298
 
{
299
 
    if ( listRows->currentItem() == -1 )
300
 
        return;
301
 
#ifndef QT_NO_TABLE
302
 
    listRows->changeItem( s, listRows->currentItem() );
303
 
    if ( table->verticalHeader()->iconSet( listRows->currentItem() ) )
304
 
        table->verticalHeader()->setLabel( listRows->currentItem(),
305
 
                                             *table->verticalHeader()->iconSet( listRows->currentItem() ), s );
306
 
    else
307
 
        table->verticalHeader()->setLabel( listRows->currentItem(), s );
308
 
#endif
309
 
}
310
 
 
311
 
void TableEditor::rowUpClicked()
312
 
{
313
 
    if ( listRows->currentItem() <= 0 ||
314
 
         listRows->count() < 2 )
315
 
        return;
316
 
    int index = listRows->currentItem() - 1;
317
 
    QListBoxItem *i = listRows->item( listRows->currentItem() );
318
 
    listRows->takeItem( i );
319
 
    listRows->insertItem( i, index );
320
 
    listRows->setCurrentItem( i );
321
 
    readRows();
322
 
}
323
 
 
324
 
void TableEditor::applyClicked()
325
 
{
326
 
    QValueList<PopulateTableCommand::Row> rows;
327
 
    QValueList<PopulateTableCommand::Column> cols;
328
 
 
329
 
    int i = 0;
330
 
#ifndef QT_NO_TABLE
331
 
    for ( i = 0; i < table->horizontalHeader()->count(); ++i ) {
332
 
        PopulateTableCommand::Column col;
333
 
        col.text = table->horizontalHeader()->label( i );
334
 
        if ( table->horizontalHeader()->iconSet( i ) )
335
 
            col.pix = table->horizontalHeader()->iconSet( i )->pixmap();
336
 
        col.field = *fieldMap.find( i );
337
 
        cols.append( col );
338
 
    }
339
 
    for ( i = 0; i < table->verticalHeader()->count(); ++i ) {
340
 
        PopulateTableCommand::Row row;
341
 
        row.text = table->verticalHeader()->label( i );
342
 
        if ( table->verticalHeader()->iconSet( i ) )
343
 
            row.pix = table->verticalHeader()->iconSet( i )->pixmap();
344
 
        rows.append( row );
345
 
    }
346
 
    PopulateTableCommand *cmd = new PopulateTableCommand( i18n( "Edit the Rows and Columns of '%1' " ).arg( editTable->name() ),
347
 
                                                          formWindow, editTable, rows, cols );
348
 
    cmd->execute();
349
 
    formWindow->commandHistory()->addCommand( cmd );
350
 
#endif
351
 
}
352
 
 
353
 
void TableEditor::chooseRowPixmapClicked()
354
 
{
355
 
    if ( listRows->currentItem() == -1 )
356
 
        return;
357
 
    QPixmap pix;
358
 
    if ( listRows->item( listRows->currentItem() )->pixmap() )
359
 
        pix = qChoosePixmap( this, formWindow, *listRows->item( listRows->currentItem() )->pixmap() );
360
 
    else
361
 
        pix = qChoosePixmap( this, formWindow, QPixmap() );
362
 
 
363
 
    if ( pix.isNull() )
364
 
        return;
365
 
 
366
 
#ifndef QT_NO_TABLE
367
 
    table->verticalHeader()->setLabel( listRows->currentItem(), pix, table->verticalHeader()->label( listRows->currentItem() ) );
368
 
    listRows->changeItem( pix, listRows->currentText(), listRows->currentItem() );
369
 
#endif
370
 
}
371
 
 
372
 
void TableEditor::deleteRowPixmapClicked()
373
 
{
374
 
    if ( listRows->currentItem() == -1 )
375
 
        return;
376
 
#ifndef QT_NO_TABLE
377
 
    table->verticalHeader()->setLabel( listRows->currentItem(), QPixmap(), table->verticalHeader()->label( listRows->currentItem() ) );
378
 
    listRows->changeItem( listRows->currentText(), listRows->currentItem() );
379
 
#endif
380
 
}
381
 
 
382
 
void TableEditor::chooseColPixmapClicked()
383
 
{
384
 
    if ( listColumns->currentItem() == -1 )
385
 
        return;
386
 
    QPixmap pix;
387
 
    if ( listColumns->item( listColumns->currentItem() )->pixmap() )
388
 
        pix = qChoosePixmap( this, formWindow, *listColumns->item( listColumns->currentItem() )->pixmap() );
389
 
    else
390
 
        pix = qChoosePixmap( this, formWindow, QPixmap() );
391
 
 
392
 
    if ( pix.isNull() )
393
 
        return;
394
 
#ifndef QT_NO_TABLE
395
 
    table->horizontalHeader()->setLabel( listColumns->currentItem(), pix, table->horizontalHeader()->label( listColumns->currentItem() ) );
396
 
    listColumns->changeItem( pix, listColumns->currentText(), listColumns->currentItem() );
397
 
#endif
398
 
}
399
 
 
400
 
void TableEditor::deleteColPixmapClicked()
401
 
{
402
 
    if ( listColumns->currentItem() == -1 )
403
 
        return;
404
 
#ifndef QT_NO_TABLE
405
 
    table->horizontalHeader()->setLabel( listColumns->currentItem(), QPixmap(), table->horizontalHeader()->label( listColumns->currentItem() ) );
406
 
    listColumns->changeItem( listColumns->currentText(), listColumns->currentItem() );
407
 
#endif
408
 
}
409
 
 
410
 
void TableEditor::readFromTable()
411
 
{
412
 
#ifndef QT_NO_TABLE
413
 
    QHeader *cols = editTable->horizontalHeader();
414
 
    table->setNumCols( cols->count() );
415
 
    QMap<QString, QString> columnFields = MetaDataBase::columnFields( editTable );
416
 
    for ( int i = 0; i < cols->count(); ++i ) {
417
 
        if ( editTable->horizontalHeader()->iconSet( i ) ) {
418
 
            table->horizontalHeader()->setLabel( i, *editTable->horizontalHeader()->iconSet( i ),
419
 
                                                 editTable->horizontalHeader()->label( i ) );
420
 
            listColumns->insertItem( editTable->horizontalHeader()->iconSet( i )->pixmap(),
421
 
                                     editTable->horizontalHeader()->label( i ) );
422
 
        } else {
423
 
            table->horizontalHeader()->setLabel( i, editTable->horizontalHeader()->label( i ) );
424
 
            listColumns->insertItem( editTable->horizontalHeader()->label( i ) );
425
 
        }
426
 
        QString cf = *columnFields.find( editTable->horizontalHeader()->label( i ) );
427
 
        fieldMap.insert( i, cf );
428
 
    }
429
 
 
430
 
    if ( listColumns->firstItem() ) {
431
 
        listColumns->setCurrentItem( listColumns->firstItem() );
432
 
        listColumns->setSelected( listColumns->firstItem(), TRUE );
433
 
    }
434
 
 
435
 
    QHeader *rows = editTable->verticalHeader();
436
 
    table->setNumRows( rows->count() );
437
 
    for ( int j = 0; j < rows->count(); ++j ) {
438
 
        if ( editTable->verticalHeader()->iconSet( j ) ) {
439
 
            table->verticalHeader()->setLabel( j, *editTable->verticalHeader()->iconSet( j ),
440
 
                                               editTable->verticalHeader()->label( j ) );
441
 
            listRows->insertItem( editTable->verticalHeader()->iconSet( j )->pixmap(),
442
 
                                  editTable->verticalHeader()->label( j ) );
443
 
        } else {
444
 
            table->verticalHeader()->setLabel( j, editTable->verticalHeader()->label( j ) );
445
 
            listRows->insertItem( editTable->verticalHeader()->label( j ) );
446
 
        }
447
 
    }
448
 
 
449
 
    if ( listRows->firstItem() ) {
450
 
        listRows->setCurrentItem( listRows->firstItem() );
451
 
        listRows->setSelected( listRows->firstItem(), TRUE );
452
 
    }
453
 
#endif
454
 
}
455
 
 
456
 
void TableEditor::readColumns()
457
 
{
458
 
    int j = 0;
459
 
#ifndef QT_NO_TABLE
460
 
    for ( QListBoxItem *i = listColumns->firstItem(); i; i = i->next(), ++j ) {
461
 
        if ( i->pixmap() )
462
 
            table->horizontalHeader()->setLabel( j, *i->pixmap(), i->text() );
463
 
        else
464
 
            table->horizontalHeader()->setLabel( j, i->text() );
465
 
    }
466
 
#endif
467
 
}
468
 
 
469
 
void TableEditor::readRows()
470
 
{
471
 
    int j = 0;
472
 
#ifndef QT_NO_TABLE
473
 
    for ( QListBoxItem *i = listRows->firstItem(); i; i = i->next(), ++j ) {
474
 
        if ( i->pixmap() )
475
 
            table->verticalHeader()->setLabel( j, *i->pixmap(), i->text() );
476
 
        else
477
 
            table->verticalHeader()->setLabel( j, i->text() );
478
 
    }
479
 
#endif
480
 
}
481
 
 
482
 
void TableEditor::saveFieldMap()
483
 
{
484
 
    tmpFieldMap.clear();
485
 
    for ( QMap<int, QString>::Iterator it = fieldMap.begin(); it != fieldMap.end(); ++it )
486
 
        tmpFieldMap.insert( listColumns->item( it.key() ), *it );
487
 
}
488
 
 
489
 
void TableEditor::restoreFieldMap()
490
 
{
491
 
    fieldMap.clear();
492
 
    for ( QMap<QListBoxItem*, QString>::Iterator it = tmpFieldMap.begin(); it != tmpFieldMap.end(); ++it )
493
 
        fieldMap.insert( listColumns->index( it.key() ), *it );
494
 
}