~ubuntu-branches/ubuntu/karmic/datakiosk/karmic

« back to all changes in this revision

Viewing changes to src/src/datatablebox.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Jonathan Riddell
  • Date: 2005-06-27 22:48:06 UTC
  • Revision ID: james.westby@ubuntu.com-20050627224806-8farkci1dc2onhbs
Tags: upstream-0.7
ImportĀ upstreamĀ versionĀ 0.7

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/***************************************************************************
 
2
*   Copyright (C) 2005 by Adam Treat                                      *
 
3
*   treat@kde.org                                                         *
 
4
*                                                                         *
 
5
*   Copyright (C) 2004 by Scott Wheeler                                   *
 
6
*   wheeler@kde.org                                                       *
 
7
*                                                                         *
 
8
*   This program is free software; you can redistribute it and/or modify  *
 
9
*   it under the terms of the GNU General Public License as published by  *
 
10
*   the Free Software Foundation; either version 2 of the License, or     *
 
11
*   (at your option) any later version.                                   *
 
12
*                                                                         *
 
13
***************************************************************************/
 
14
 
 
15
#include <kapplication.h>
 
16
#include <kiconloader.h>
 
17
#include <kurldrag.h>
 
18
#include <kmessagebox.h>
 
19
#include <ksplashscreen.h>
 
20
#include <kstandarddirs.h>
 
21
#include <kparts/partmanager.h>
 
22
#include <kpopupmenu.h>
 
23
#include <kaction.h>
 
24
#include <kdebug.h>
 
25
 
 
26
#include <qheader.h>
 
27
#include <qpainter.h>
 
28
#include <qwidgetstack.h>
 
29
 
 
30
#include "datatablebox.h"
 
31
#include "datatable.h"
 
32
#include "datakiosk.h"
 
33
#include "dataclip.h"
 
34
 
 
35
#include "project.h"
 
36
#include "datareport.h"
 
37
#include "viewmode.h"
 
38
#include "actioncollection.h"
 
39
#include "databaseconnection.h"
 
40
 
 
41
#define widget (kapp->mainWidget())
 
42
 
 
43
using namespace ActionCollection;
 
44
 
 
45
DataTableBox::DataTableBox( QWidget *parent, QWidgetStack *dataTableStack,
 
46
                            const char *name ) :
 
47
        KListView( parent, name ),
 
48
        Project( dataTableStack ),
 
49
        m_viewModeIndex( 0 ),
 
50
        m_hasSelection( false ),
 
51
        m_doingMultiSelect( false ),
 
52
        m_treeViewSetup( false ),
 
53
        m_dropItem( 0 ),
 
54
        m_clipShown( false )
 
55
{
 
56
    setFocusPolicy( QWidget::ClickFocus );
 
57
 
 
58
    readConfig();
 
59
    addColumn( "DataTables", width() );
 
60
 
 
61
    header() ->blockSignals( true );
 
62
    header() ->hide();
 
63
    header() ->blockSignals( false );
 
64
 
 
65
    setSorting( 0 );
 
66
    setFullWidth( true );
 
67
    setItemMargin( 3 );
 
68
 
 
69
    setAcceptDrops( false );
 
70
    setDragEnabled( false );
 
71
    setSelectionModeExt( Single );
 
72
 
 
73
    m_listMenu = new KPopupMenu( this );
 
74
 
 
75
    action( "create_childtable" ) ->plug( m_listMenu );
 
76
    action( "create_search" ) ->plug( m_listMenu );
 
77
    action( "create_report" ) ->plug( m_listMenu );
 
78
    m_listMenu->insertSeparator();
 
79
    action( "edit_table" ) ->plug( m_listMenu );
 
80
    action( "add_virtual" ) ->plug( m_listMenu );
 
81
    m_listMenu->insertSeparator();
 
82
    action( "table_up" ) ->plug( m_listMenu );
 
83
    action( "table_down" ) ->plug( m_listMenu );
 
84
    m_listMenu->insertSeparator();
 
85
    action( "remove_table" ) ->plug( m_listMenu );
 
86
 
 
87
    m_reportMenu = new KPopupMenu( this );
 
88
    action( "refresh_report" ) ->plug( m_reportMenu );
 
89
    action( "print" ) ->plug( m_reportMenu );
 
90
    m_reportMenu->insertSeparator();
 
91
    action( "edit_report" ) ->plug( m_reportMenu );
 
92
    m_reportMenu->insertSeparator();
 
93
    action( "remove_report" ) ->plug( m_reportMenu );
 
94
 
 
95
    // add the view modes stuff
 
96
 
 
97
    KSelectAction *viewModeAction =
 
98
        new KSelectAction( i18n( "View Modes" ), "view_choose", KShortcut(), actions(), "view_mode_menu" );
 
99
 
 
100
    m_viewModes.append( new ViewMode( this ) );
 
101
    m_viewModes.append( new CompactViewMode( this ) );
 
102
    m_viewModes.append( new TreeViewMode( this ) );
 
103
 
 
104
    QStringList modeNames;
 
105
 
 
106
    for ( QValueListIterator<ViewMode *> it = m_viewModes.begin(); it != m_viewModes.end(); ++it )
 
107
        modeNames.append( ( *it ) ->name() );
 
108
 
 
109
    viewModeAction->setItems( modeNames );
 
110
 
 
111
    QPopupMenu *p = viewModeAction->popupMenu();
 
112
 
 
113
    p->changeItem( 0, SmallIconSet( "view_detailed" ), modeNames[ 0 ] );
 
114
    p->changeItem( 1, SmallIconSet( "view_text" ), modeNames[ 1 ] );
 
115
    p->changeItem( 2, SmallIconSet( "view_tree" ), modeNames[ 2 ] );
 
116
 
 
117
    viewModeAction->setCurrentItem( m_viewModeIndex );
 
118
    m_viewModes[ m_viewModeIndex ] ->setShown( true );
 
119
 
 
120
    connect( viewModeAction, SIGNAL( activated( int ) ), this, SLOT( slotSetViewMode( int ) ) );
 
121
 
 
122
    connect( this, SIGNAL( selectionChanged() ),
 
123
             this, SLOT( slotWidgetChanged() ) );
 
124
 
 
125
    connect( this, SIGNAL( contextMenuRequested( QListViewItem *, const QPoint &, int ) ),
 
126
             this, SLOT( slotShowContextMenu( QListViewItem *, const QPoint &, int ) ) );
 
127
 
 
128
    //UGLY HACK
 
129
    uglyInitialize();
 
130
}
 
131
 
 
132
DataTableBox::~DataTableBox()
 
133
{
 
134
    saveConfig();
 
135
}
 
136
 
 
137
void DataTableBox::raise( DataTable *dataTable )
 
138
{
 
139
    if ( !dataTable )
 
140
        return ;
 
141
 
 
142
    Item *i = m_dataTableDict.find( dataTable );
 
143
 
 
144
    clearSelection();
 
145
    setSelected( i, true );
 
146
 
 
147
    setSingleItem( i );
 
148
    ensureItemVisible( currentItem() );
 
149
}
 
150
 
 
151
void DataTableBox::raise( DataReport *dataReport )
 
152
{
 
153
    Project::raise( dataReport );
 
154
    if ( !dataReport )
 
155
        return ;
 
156
 
 
157
    Item *i = m_dataTableDict.find( dataReport );
 
158
 
 
159
    clearSelection();
 
160
    setSelected( i, true );
 
161
 
 
162
    setSingleItem( i );
 
163
    ensureItemVisible( currentItem() );
 
164
}
 
165
 
 
166
void DataTableBox::initialize()
 
167
{
 
168
    QPixmap pm;
 
169
    pm.load( locate( "appdata", "pics/datakiosk-splash.png" ) );
 
170
    KSplashScreen *splash = new KSplashScreen( pm );
 
171
 
 
172
    connect( this, SIGNAL( splashMessage( const QString &, int, const QColor & ) ),
 
173
            splash, SLOT( message( const QString &, int, const QColor & ) ) );
 
174
 
 
175
    if ( !fileName().isEmpty() )
 
176
        splash->show();
 
177
 
 
178
    loadConnections();
 
179
 
 
180
    if ( loadDataTables() )
 
181
    {
 
182
        setSelected( currentItem(), false );
 
183
        setCurrentItem( firstChild() );
 
184
        setSelected( firstChild(), true );
 
185
        action( "edit_project" ) ->setEnabled( true );
 
186
        action( "create_datatable" ) ->setEnabled( true );
 
187
        action( "save_project" ) ->setEnabled( true );
 
188
        action( "save_project_as" ) ->setEnabled( true );
 
189
        action( "close_project" ) ->setEnabled( true );
 
190
        action( "print" ) ->setEnabled( false );
 
191
    }
 
192
    else
 
193
    {
 
194
        action( "edit_project" ) ->setEnabled( false );
 
195
        action( "create_datatable" ) ->setEnabled( false );
 
196
        action( "save_project" ) ->setEnabled( false );
 
197
        action( "save_project_as" ) ->setEnabled( false );
 
198
        action( "close_project" ) ->setEnabled( false );
 
199
        action( "print" ) ->setEnabled( false );
 
200
        emit selectionChanged();
 
201
    }
 
202
 
 
203
    if ( !fileName().isEmpty() )
 
204
        splash->finish( this );
 
205
 
 
206
    m_clipboard = new DataClip( KApplication::desktop() );
 
207
    connect( widget, SIGNAL( showing() ),
 
208
             this, SLOT( clipOnWindowShown() ) );
 
209
    connect( widget, SIGNAL( hiding() ),
 
210
             m_clipboard, SLOT( hide() ) );
 
211
    connect( widget, SIGNAL( raising() ),
 
212
             m_clipboard, SLOT( raise() ) );
 
213
    connect( widget, SIGNAL( lowering() ),
 
214
             m_clipboard, SLOT( lower() ) );
 
215
 
 
216
    delete splash;
 
217
}
 
218
 
 
219
//UGLY HACK
 
220
void DataTableBox::uglyInitialize()
 
221
{
 
222
    QTimer::singleShot( 0, this, SLOT( slotInitialize() ) );
 
223
}
 
224
 
 
225
void DataTableBox::newProject()
 
226
{
 
227
    createDatabaseDataTable();
 
228
    currentItem() ->setSelected( true );
 
229
    currentItem() ->repaint();
 
230
    emit selectionChanged();
 
231
    action( "edit_project" ) ->setEnabled( true );
 
232
    action( "create_datatable" ) ->setEnabled( true );
 
233
    action( "save_project" ) ->setEnabled( true );
 
234
    action( "save_project_as" ) ->setEnabled( true );
 
235
    action( "close_project" ) ->setEnabled( true );
 
236
    action( "print" ) ->setEnabled( false );
 
237
}
 
238
 
 
239
void DataTableBox::closeProject()
 
240
{
 
241
    Project::closeProject();
 
242
 
 
243
    selectAll( true );
 
244
    removeTable();
 
245
}
 
246
 
 
247
void DataTableBox::clipboard()
 
248
{
 
249
    Project::clipboard();
 
250
 
 
251
    if ( m_clipboard->isVisible() )
 
252
        m_clipboard->hide();
 
253
    else
 
254
        m_clipboard->show();
 
255
 
 
256
    m_clipShown = m_clipboard->isVisible();
 
257
}
 
258
 
 
259
void DataTableBox::clipOnWindowShown()
 
260
{
 
261
    if ( m_clipShown )
 
262
        m_clipboard->show();
 
263
}
 
264
 
 
265
DataTable *DataTableBox::currentDataTable() const
 
266
{
 
267
    Item * item = dynamic_cast<Item *>( currentItem() );
 
268
 
 
269
    if ( item )
 
270
        if ( DataTable * dataTable = dynamic_cast<DataTable*>( item->itemWidget() ) )
 
271
        {
 
272
            if ( item && dataTable )
 
273
                return dataTable;
 
274
            else
 
275
                return dynamic_cast<DataTable *>( dataTableStack() ->visibleWidget() );
 
276
        }
 
277
    return 0;
 
278
}
 
279
 
 
280
DataReport *DataTableBox::currentDataReport() const
 
281
{
 
282
    Item * item = dynamic_cast<Item *>( currentItem() );
 
283
 
 
284
    if ( item )
 
285
        if ( DataReport * dataReport = dynamic_cast<DataReport*>( item->itemWidget() ) )
 
286
        {
 
287
            if ( item && dataReport )
 
288
                return dataReport;
 
289
            else
 
290
                return dynamic_cast<DataReport *>( dataTableStack() ->visibleWidget() );
 
291
        }
 
292
    return 0;
 
293
}
 
294
 
 
295
DataTable *DataTableBox::rootOfCurrentDataTable()
 
296
{
 
297
    ItemList items = selectedItems();
 
298
    if ( items.count() > 1 )
 
299
        return 0;
 
300
 
 
301
    Item* root = items[ 0 ];
 
302
    while ( root->QListViewItem::parent() )
 
303
    {
 
304
        root = static_cast<Item *>( root->QListViewItem::parent() );
 
305
    }
 
306
 
 
307
    return dynamic_cast<DataTable*>( root->itemWidget() );
 
308
}
 
309
 
 
310
DataTableList DataTableBox::dataTablesInCurrentTree()
 
311
{
 
312
    DataTableList dataTables;
 
313
 
 
314
    ItemList items = selectedItems();
 
315
    if ( items.count() > 1 )
 
316
        return dataTables;
 
317
 
 
318
    Item* root = items[ 0 ];
 
319
    while ( root->QListViewItem::parent() )
 
320
    {
 
321
        root = static_cast<Item *>( root->QListViewItem::parent() );
 
322
    }
 
323
 
 
324
    QListViewItemIterator it( root );
 
325
    while ( it.current() )
 
326
    {
 
327
        if ( it.current() == root->nextSibling() )
 
328
            break;
 
329
 
 
330
        Item *item = static_cast<Item *>( ( *it ) );
 
331
        if ( DataTable * dataTable = dynamic_cast<DataTable*>( item ->itemWidget() ) )
 
332
            dataTables.append( dataTable );
 
333
        ++it;
 
334
    }
 
335
 
 
336
    return dataTables;
 
337
}
 
338
 
 
339
DataTableList DataTableBox::dataTablesInDataTableTree( DataTable *dataTable )
 
340
{
 
341
    DataTableList dataTables;
 
342
 
 
343
    Item* root = 0;
 
344
    for ( QListViewItemIterator it( this ); it.current(); ++it )
 
345
    {
 
346
        Item * item = dynamic_cast<Item *>( *it );
 
347
 
 
348
        if ( DataTable * d = dynamic_cast<DataTable*>( item->itemWidget() ) )
 
349
        {
 
350
            if ( d == dataTable )
 
351
            {
 
352
                root = item;
 
353
                break;
 
354
            }
 
355
        }
 
356
    }
 
357
 
 
358
    if ( !root )
 
359
        return dataTables;
 
360
 
 
361
    while ( root->QListViewItem::parent() )
 
362
    {
 
363
        root = static_cast<Item *>( root->QListViewItem::parent() );
 
364
    }
 
365
 
 
366
    QListViewItemIterator it( root );
 
367
    while ( it.current() )
 
368
    {
 
369
        if ( it.current() == root->nextSibling() )
 
370
            break;
 
371
 
 
372
        Item *item = static_cast<Item *>( ( *it ) );
 
373
        if ( DataTable * dataTable = dynamic_cast<DataTable*>( item ->itemWidget() ) )
 
374
            dataTables.append( dataTable );
 
375
        ++it;
 
376
    }
 
377
 
 
378
    return dataTables;
 
379
}
 
380
 
 
381
DataTableList DataTableBox::childrenOfDataTable( DataTable *dataTable )
 
382
{
 
383
    DataTableList dataTables;
 
384
 
 
385
    Item* root = 0;
 
386
    for ( QListViewItemIterator it( this ); it.current(); ++it )
 
387
    {
 
388
        Item * item = dynamic_cast<Item *>( *it );
 
389
 
 
390
        if ( DataTable * d = dynamic_cast<DataTable*>( item->itemWidget() ) )
 
391
        {
 
392
            if ( d == dataTable )
 
393
            {
 
394
                root = item;
 
395
                break;
 
396
            }
 
397
        }
 
398
    }
 
399
 
 
400
    if ( !root )
 
401
        return dataTables;
 
402
 
 
403
    if ( !root->firstChild() )
 
404
        return dataTables;
 
405
 
 
406
    QListViewItemIterator it( root->firstChild() );
 
407
    while ( it.current() )
 
408
    {
 
409
        if ( it.current()->depth() <= root->depth() )
 
410
            break;
 
411
 
 
412
        Item *item = static_cast<Item *>( ( *it ) );
 
413
 
 
414
        if ( DataTable * dataTable = dynamic_cast<DataTable*>( item ->itemWidget() ) )
 
415
            dataTables.append( dataTable );
 
416
        ++it;
 
417
    }
 
418
 
 
419
    return dataTables;
 
420
}
 
421
 
 
422
void DataTableBox::scrollTableUp()
 
423
{
 
424
    QListViewItem* nextItem = currentItem()->itemAbove();
 
425
 
 
426
    if ( !nextItem )
 
427
        nextItem = lastItem();
 
428
 
 
429
    if ( nextItem )
 
430
    {
 
431
        currentItem()->setSelected( false );
 
432
        nextItem->setSelected( true );
 
433
        setCurrentItem( nextItem );
 
434
    }
 
435
 
 
436
    if ( dynamic_cast<DataReport*>( dynamic_cast<Item*>( nextItem )->itemWidget() ) )
 
437
        scrollTableUp();
 
438
    else
 
439
        slotWidgetChanged();
 
440
}
 
441
 
 
442
void DataTableBox::scrollTableDown()
 
443
{
 
444
    QListViewItem* nextItem = currentItem()->itemBelow();
 
445
 
 
446
    if ( !nextItem )
 
447
        nextItem = firstChild();
 
448
 
 
449
    if ( nextItem )
 
450
    {
 
451
        currentItem()->setSelected( false );
 
452
        nextItem->setSelected( true );
 
453
        setCurrentItem( nextItem );
 
454
    }
 
455
 
 
456
    if ( dynamic_cast<DataReport*>( dynamic_cast<Item*>( nextItem )->itemWidget() ) )
 
457
        scrollTableDown();
 
458
    else
 
459
        slotWidgetChanged();
 
460
}
 
461
 
 
462
void DataTableBox::setSplashMessage( const QString &txt )
 
463
{
 
464
    emit splashMessage( txt, Qt::AlignRight, QColor( 0, 84, 255 ) );
 
465
}
 
466
 
 
467
void DataTableBox::setupDataTable( DataTable *dataTable, const QString &iconName )
 
468
{
 
469
    Project::setupDataTable( dataTable, iconName );
 
470
    Item *item = new Item( this, iconName, dataTable->name(), dataTable );
 
471
    //     connect( item, SIGNAL( itemDestroyed( Item* ) ),
 
472
    //              this, SLOT( slotItemDestroyed( Item* ) ) );
 
473
    connect( dataTable, SIGNAL( tableRefreshed() ),
 
474
             item, SLOT( repaintRequested() ) );
 
475
    connect( dataTable, SIGNAL( signalNameChanged( const QString & ) ),
 
476
             item, SLOT( slotSetName( const QString & ) ) );
 
477
}
 
478
 
 
479
void DataTableBox::setupDataTable( DataTable *dataTable, const QString &iconName, Item *parentItem )
 
480
{
 
481
    Project::setupDataTable( dataTable, iconName );
 
482
    Item *item = new Item( parentItem, iconName, dataTable->name(), dataTable );
 
483
    //     connect( item, SIGNAL( itemDestroyed( Item* ) ),
 
484
    //              this, SLOT( slotItemDestroyed( Item* ) ) );
 
485
    connect( dataTable, SIGNAL( tableRefreshed() ),
 
486
             item, SLOT( repaintRequested() ) );
 
487
    connect( dataTable, SIGNAL( signalNameChanged( const QString & ) ),
 
488
             item, SLOT( slotSetName( const QString & ) ) );
 
489
}
 
490
 
 
491
void DataTableBox::setupDataTable( DataTable *dataTable, const QString &iconName, DataTable *parentTable )
 
492
{
 
493
    Project::setupDataTable( dataTable, iconName );
 
494
    Item *item = new Item( m_dataTableDict.find( parentTable ), iconName, dataTable->name(), dataTable );
 
495
    //     connect( item, SIGNAL( itemDestroyed( Item* ) ),
 
496
    //              this, SLOT( slotItemDestroyed( Item* ) ) );
 
497
    connect( dataTable, SIGNAL( tableRefreshed() ),
 
498
             item, SLOT( repaintRequested() ) );
 
499
    connect( dataTable, SIGNAL( signalNameChanged( const QString & ) ),
 
500
             item, SLOT( slotSetName( const QString & ) ) );
 
501
}
 
502
 
 
503
void DataTableBox::setIconName( DataTable* dataTable, const QString &iconName )
 
504
{
 
505
    for ( QListViewItemIterator it( this ); it.current(); ++it )
 
506
    {
 
507
        Item *item = static_cast<Item *>( *it );
 
508
        if ( DataTable * d = dynamic_cast<DataTable*>( item->itemWidget() ) )
 
509
        {
 
510
            if ( d ->name() == dataTable->name() )
 
511
            {
 
512
                int iconSize = viewModeIndex() == 0 ? 32 : 16;
 
513
                static_cast<Item *>( *it ) ->setIconName( iconName );
 
514
                static_cast<Item *>( *it ) ->setPixmap( 0, SmallIcon( iconName, iconSize ) );
 
515
            }
 
516
        }
 
517
    }
 
518
}
 
519
 
 
520
void DataTableBox::setupDataReport( DataReport *dataReport, const QString &iconName, Item *parentItem )
 
521
{
 
522
    Project::setupDataReport( dataReport, iconName );
 
523
    Item *item = new Item( parentItem, iconName, dataReport->name(), dataReport );
 
524
    //     connect( item, SIGNAL( itemDestroyed( Item* ) ),
 
525
    //              this, SLOT( slotItemDestroyed( Item* ) ) );
 
526
    connect( dataReport, SIGNAL( reportRefreshed() ),
 
527
             item, SLOT( repaintRequested() ) );
 
528
    connect( dataReport, SIGNAL( signalNameChanged( const QString & ) ),
 
529
             item, SLOT( slotSetName( const QString & ) ) );
 
530
}
 
531
 
 
532
void DataTableBox::setupDataReport( DataReport *dataReport, const QString &iconName, DataTable *parentTable )
 
533
{
 
534
    Project::setupDataReport( dataReport, iconName );
 
535
    Item *item = new Item( m_dataTableDict.find( parentTable ), iconName, dataReport->name(), dataReport );
 
536
    //     connect( item, SIGNAL( itemDestroyed( Item* ) ),
 
537
    //              this, SLOT( slotItemDestroyed( Item* ) ) );
 
538
    connect( parentTable, SIGNAL( tableRefreshed() ),
 
539
             dataReport, SLOT( queueRefresh() ) );
 
540
    connect( dataReport, SIGNAL( reportRefreshed() ),
 
541
             item, SLOT( repaintRequested() ) );
 
542
    connect( dataReport, SIGNAL( signalNameChanged( const QString & ) ),
 
543
             item, SLOT( slotSetName( const QString & ) ) );
 
544
}
 
545
 
 
546
void DataTableBox::setIconName( DataReport *dataReport, const QString &iconName )
 
547
{
 
548
    for ( QListViewItemIterator it( this ); it.current(); ++it )
 
549
    {
 
550
        Item *item = static_cast<Item *>( *it );
 
551
        if ( DataReport * d = dynamic_cast<DataReport*>( item->itemWidget() ) )
 
552
        {
 
553
            if ( d ->name() == dataReport->name() )
 
554
            {
 
555
                int iconSize = viewModeIndex() == 0 ? 32 : 16;
 
556
                static_cast<Item *>( *it ) ->setIconName( iconName );
 
557
                static_cast<Item *>( *it ) ->setPixmap( 0, SmallIcon( iconName, iconSize ) );
 
558
            }
 
559
        }
 
560
    }
 
561
}
 
562
 
 
563
void DataTableBox::readConfig()
 
564
{
 
565
    KConfigGroup config( KGlobal::config(), "DataTableBox" );
 
566
    m_viewModeIndex = config.readNumEntry( "ViewMode", 0 );
 
567
}
 
568
 
 
569
void DataTableBox::saveConfig()
 
570
{
 
571
    KConfigGroup config( KGlobal::config(), "DataTableBox" );
 
572
    config.writeEntry( "ViewMode", action<KSelectAction>( "view_mode_menu" ) ->currentItem() );
 
573
    KGlobal::config() ->sync();
 
574
}
 
575
 
 
576
void DataTableBox::slotItemDestroyed( Item * )
 
577
{
 
578
    //     removeName( item ->text( 0 ) );
 
579
    //     m_dataTableDict.remove( item ->dataTable() );
 
580
}
 
581
 
 
582
void DataTableBox::editSearch()
 
583
{
 
584
    Project::editSearch();
 
585
    emit searchEdited();
 
586
}
 
587
 
 
588
void DataTableBox::removeSearch()
 
589
{
 
590
    Project::removeSearch();
 
591
    emit searchRemoved();
 
592
}
 
593
 
 
594
void DataTableBox::invokeSearch( const QString &search )
 
595
{
 
596
    Project::invokeSearch( search );
 
597
    emit searchInvoked( search );
 
598
}
 
599
 
 
600
void DataTableBox::advancedSearchRequested()
 
601
{
 
602
    emit advancedSearchClicked();
 
603
}
 
604
 
 
605
void DataTableBox::removeTable()
 
606
{
 
607
    ItemList items = selectedItems();
 
608
 
 
609
    if ( items.isEmpty() )
 
610
        return ;
 
611
 
 
612
    DataTableList removeQueue;
 
613
 
 
614
    for ( ItemList::ConstIterator it = items.begin(); it != items.end(); ++it )
 
615
    {
 
616
        if ( DataTable * dataTable = dynamic_cast<DataTable*>( ( *it ) ->itemWidget() ) )
 
617
        {
 
618
            removeName( ( *it ) ->text( 0 ) );
 
619
            m_dataTableDict.remove( dataTable );
 
620
            removeQueue.append( dataTable );
 
621
            removeDataTable( ( *it ) ->text( 0 ) );
 
622
        }
 
623
    }
 
624
 
 
625
    Item *x = static_cast<Item *>( items.back() ->nextSibling() );
 
626
    if ( x && dynamic_cast<DataTable*>( x->itemWidget() ) )
 
627
        setSingleItem( x );
 
628
    else
 
629
    {
 
630
        Item *y = static_cast<Item *>( items.front() ->itemAbove() );
 
631
        while ( y && !dynamic_cast<DataTable*>( y->itemWidget() ) )
 
632
            y = static_cast<Item *>( y->itemAbove() );
 
633
 
 
634
        setSingleItem( y );
 
635
    }
 
636
 
 
637
    for ( DataTableList::Iterator it = removeQueue.begin(); it != removeQueue.end(); ++it )
 
638
    {
 
639
        DataTableList dataTables = dataTablesInDataTablePeerTree( *it );
 
640
        DataTableList::Iterator it2 = dataTables.begin();
 
641
        for ( ; it2 != dataTables.end(); ++it2 )
 
642
        {
 
643
            if ( ( *it2 ) == ( *it ) )
 
644
                continue;
 
645
            else if ( ( *it2 )->number() > ( *it )->number() )
 
646
                ( *it2 )->setNumber( ( *it2 )->number() - 1 );
 
647
        }
 
648
 
 
649
        delete * it;
 
650
    }
 
651
}
 
652
 
 
653
void DataTableBox::sortTables()
 
654
{
 
655
    if ( childCount() > 1 )
 
656
        sort();
 
657
    else
 
658
        firstChild()->sort();
 
659
}
 
660
 
 
661
void DataTableBox::removeReport()
 
662
{
 
663
    ItemList items = selectedItems();
 
664
 
 
665
    if ( items.isEmpty() )
 
666
        return ;
 
667
 
 
668
    DataReportList removeQueue;
 
669
 
 
670
    for ( ItemList::ConstIterator it = items.begin(); it != items.end(); ++it )
 
671
    {
 
672
        if ( DataReport * dataReport = dynamic_cast<DataReport*>( ( *it ) ->itemWidget() ) )
 
673
        {
 
674
            removeName( ( *it ) ->text( 0 ) );
 
675
            m_dataTableDict.remove( dataReport );
 
676
            removeQueue.append( dataReport );
 
677
            removeDataReport( ( *it ) ->text( 0 ) );
 
678
        }
 
679
    }
 
680
 
 
681
    Item *x = static_cast<Item *>( items.back() ->nextSibling() );
 
682
    if ( x && dynamic_cast<DataTable*>( x->itemWidget() ) )
 
683
        setSingleItem( x );
 
684
    else
 
685
    {
 
686
        Item *y = static_cast<Item *>( items.front() ->itemAbove() );
 
687
        while ( y && !dynamic_cast<DataTable*>( y->itemWidget() ) )
 
688
            y = static_cast<Item *>( y->itemAbove() );
 
689
 
 
690
        setSingleItem( y );
 
691
    }
 
692
 
 
693
    for ( DataReportList::Iterator it = removeQueue.begin(); it != removeQueue.end(); ++it )
 
694
    {
 
695
        delete * it;
 
696
    }
 
697
}
 
698
 
 
699
void DataTableBox::contentsMousePressEvent( QMouseEvent *e )
 
700
{
 
701
    if ( e->button() == LeftButton )
 
702
        m_doingMultiSelect = true;
 
703
    KListView::contentsMousePressEvent( e );
 
704
}
 
705
 
 
706
void DataTableBox::contentsMouseReleaseEvent( QMouseEvent *e )
 
707
{
 
708
    if ( e->button() == LeftButton )
 
709
    {
 
710
        m_doingMultiSelect = false;
 
711
        slotWidgetChanged();
 
712
    }
 
713
    KListView::contentsMouseReleaseEvent( e );
 
714
}
 
715
 
 
716
void DataTableBox::keyPressEvent( QKeyEvent *e )
 
717
{
 
718
    if ( ( e->key() == Key_Up || e->key() == Key_Down ) && e->state() == ShiftButton )
 
719
        m_doingMultiSelect = true;
 
720
    KListView::keyPressEvent( e );
 
721
}
 
722
 
 
723
void DataTableBox::keyReleaseEvent( QKeyEvent *e )
 
724
{
 
725
    if ( m_doingMultiSelect && e->key() == Key_Shift )
 
726
    {
 
727
        m_doingMultiSelect = false;
 
728
        slotWidgetChanged();
 
729
    }
 
730
    KListView::keyReleaseEvent( e );
 
731
}
 
732
 
 
733
bool DataTableBox::hasSelection()
 
734
{
 
735
    QListViewItemIterator it( this, QListViewItemIterator::Selected );
 
736
    return it.current();
 
737
}
 
738
 
 
739
DataTableBox::ItemList DataTableBox::selectedItems()
 
740
{
 
741
    ItemList l;
 
742
 
 
743
    for ( QListViewItemIterator it( this, QListViewItemIterator::Selected ); it.current(); ++it )
 
744
        l.append( static_cast<Item *>( *it ) );
 
745
 
 
746
    return l;
 
747
}
 
748
 
 
749
void DataTableBox::setSingleItem( QListViewItem *item )
 
750
{
 
751
    KListView::setCurrentItem( item );
 
752
}
 
753
 
 
754
void DataTableBox::slotWidgetChanged()
 
755
{
 
756
    // Don't update while the mouse is pressed down.
 
757
 
 
758
    if ( m_doingMultiSelect )
 
759
        return ;
 
760
 
 
761
    ItemList items = selectedItems();
 
762
    m_hasSelection = !items.isEmpty();
 
763
 
 
764
    DataTableList dataTables;
 
765
    DataReportList dataReports;
 
766
    for ( ItemList::ConstIterator it = items.begin(); it != items.end(); ++it )
 
767
    {
 
768
        if ( DataTable * dataTable = dynamic_cast<DataTable*>( ( *it ) ->itemWidget() ) )
 
769
            dataTables.append( dataTable );
 
770
        else if ( DataReport * dataReport = dynamic_cast<DataReport*>( ( *it ) ->itemWidget() ) )
 
771
            dataReports.append( dataReport );
 
772
    }
 
773
 
 
774
    bool singleDataTable = dataTables.count() == 1;
 
775
    bool singleDataReport = dataReports.count() == 1;
 
776
 
 
777
    if ( ( dataTables.isEmpty() || !singleDataTable )
 
778
            && ( dataReports.isEmpty() || !singleDataReport ) )
 
779
    {
 
780
        static_cast<DataKiosk*>( widget ) ->partManager() ->setActivePart( 0L ); // sets as the active part
 
781
        dataTableStack() ->raiseWidget( 0 );
 
782
        action( "edit_table" ) ->setEnabled( false );
 
783
        action( "add_virtual" ) ->setEnabled( false );
 
784
        action( "table_up" ) ->setEnabled( false );
 
785
        action( "table_down" ) ->setEnabled( false );
 
786
        action( "remove_table" ) ->setEnabled( false );
 
787
        action( "create_childtable" ) ->setEnabled( false );
 
788
        action( "create_search" ) ->setEnabled( false );
 
789
        action( "create_report" ) ->setEnabled( false );
 
790
        action( "edit_search" ) ->setEnabled( false );
 
791
        action( "remove_search" ) ->setEnabled( false );
 
792
        action( "edit_report" ) ->setEnabled( false );
 
793
        action( "refresh_report" ) ->setEnabled( false );
 
794
        action( "remove_report" ) ->setEnabled( false );
 
795
        action( "print" ) ->setEnabled( false );
 
796
    }
 
797
    else if ( singleDataTable )
 
798
    {
 
799
        static_cast<DataKiosk*>( widget ) ->partManager() ->setActivePart( 0L );
 
800
        dataTableStack() ->raiseWidget( dataTables.front() );
 
801
        action( "edit_table" ) ->setEnabled( true );
 
802
        action( "add_virtual" ) ->setEnabled( true );
 
803
        action( "table_up" ) ->setEnabled( true );
 
804
        action( "table_down" ) ->setEnabled( true );
 
805
        action( "remove_table" ) ->setEnabled( true );
 
806
        action( "create_childtable" ) ->setEnabled( true );
 
807
        action( "create_search" ) ->setEnabled( true );
 
808
        action( "create_report" ) ->setEnabled( true );
 
809
        action( "edit_report" ) ->setEnabled( false );
 
810
        action( "refresh_report" ) ->setEnabled( false );
 
811
        action( "remove_report" ) ->setEnabled( false );
 
812
        action( "print" ) ->setEnabled( false );
 
813
    }
 
814
    else if ( singleDataReport )
 
815
    {
 
816
        for ( DataReport * report = m_dataReports.first(); report; report = m_dataReports.next() )
 
817
            report ->setAsActiveReport( false );
 
818
 
 
819
        DataReport * report = dataReports.front();
 
820
            report ->setAsActiveReport( true );
 
821
 
 
822
        static_cast<DataKiosk*>( widget ) ->partManager() ->setActivePart( report->kugarPart() );
 
823
        dataTableStack() ->raiseWidget( report );
 
824
//         if ( report->needsRefresh() )
 
825
//             report->refreshReport();
 
826
        action( "edit_table" ) ->setEnabled( false );
 
827
        action( "add_virtual" ) ->setEnabled( false );
 
828
        action( "table_up" ) ->setEnabled( false );
 
829
        action( "table_down" ) ->setEnabled( false );
 
830
        action( "remove_table" ) ->setEnabled( false );
 
831
        action( "create_childtable" ) ->setEnabled( false );
 
832
        action( "create_search" ) ->setEnabled( false );
 
833
        action( "create_report" ) ->setEnabled( false );
 
834
        action( "edit_search" ) ->setEnabled( false );
 
835
        action( "remove_search" ) ->setEnabled( false );
 
836
        action( "edit_report" ) ->setEnabled( true );
 
837
        action( "refresh_report" ) ->setEnabled( true );
 
838
        action( "remove_report" ) ->setEnabled( true );
 
839
        action( "print" ) ->setEnabled( report->isInitialized() );
 
840
    }
 
841
}
 
842
 
 
843
void DataTableBox::slotShowContextMenu( QListViewItem *item, const QPoint &point, int )
 
844
{
 
845
    Item * i = static_cast<Item*>( item );
 
846
 
 
847
    if ( i )
 
848
        if ( dynamic_cast<DataTable*>( i->itemWidget() ) )
 
849
            m_listMenu->popup( point );
 
850
        else if ( dynamic_cast<DataReport*>( i->itemWidget() ) )
 
851
            m_reportMenu->popup( point );
 
852
}
 
853
 
 
854
void DataTableBox::slotSetViewMode( int index )
 
855
{
 
856
    if ( index == m_viewModeIndex )
 
857
        return ;
 
858
 
 
859
    viewMode() ->setShown( false );
 
860
    m_viewModeIndex = index;
 
861
    viewMode() ->setShown( true );
 
862
 
 
863
    // The following call only does anything if the setup
 
864
    // hasn't already been performed.
 
865
 
 
866
    performTreeViewSetup();
 
867
}
 
868
 
 
869
void DataTableBox::setupItem( Item *item )
 
870
{
 
871
    m_dataTableDict.insert( item->itemWidget(), item );
 
872
    viewMode() ->queueRefresh();
 
873
}
 
874
 
 
875
void DataTableBox::performTreeViewSetup()
 
876
{
 
877
    if ( m_treeViewSetup || m_viewModeIndex != 2 )
 
878
        return ;
 
879
 
 
880
    m_treeViewSetup = true;
 
881
}
 
882
 
 
883
DataTableBox::Item *DataTableBox::Item::m_collectionItem = 0;
 
884
 
 
885
DataTableBox::Item::Item( DataTableBox *listBox, const QString &icon, const QString &text, QWidget *l )
 
886
        : QObject( listBox, text.ascii() ), KListViewItem( listBox, text ),
 
887
        m_widget( l ), m_text( text ), m_iconName( icon )
 
888
{
 
889
    init();
 
890
}
 
891
 
 
892
DataTableBox::Item::Item( Item *parent, const QString &icon, const QString &text, QWidget *l )
 
893
        : QObject( parent->listView(), text.ascii() ), KListViewItem( parent, text ),
 
894
        m_widget( l ), m_text( text ), m_iconName( icon )
 
895
{
 
896
    init();
 
897
}
 
898
 
 
899
DataTableBox::Item::~Item()
 
900
{
 
901
    emit itemDestroyed( this );
 
902
}
 
903
 
 
904
int DataTableBox::Item::compare( QListViewItem *i, int col, bool ) const
 
905
{
 
906
    DataTable* thisIsDataTable = dynamic_cast<DataTable*>( itemWidget() );
 
907
    DataTable* thatIsDataTable = dynamic_cast<DataTable*>( static_cast<Item *>( i ) ->itemWidget() );
 
908
 
 
909
    if ( thisIsDataTable && !thatIsDataTable )
 
910
        return -1;
 
911
    else if ( !thisIsDataTable && thatIsDataTable )
 
912
        return 1;
 
913
    else if ( thisIsDataTable && thatIsDataTable )
 
914
    {
 
915
        if ( thisIsDataTable->number() < thatIsDataTable->number() )
 
916
            return -1;
 
917
        else if ( thisIsDataTable->number() > thatIsDataTable->number() )
 
918
            return 1;
 
919
    }
 
920
 
 
921
    return text( col ).lower().localeAwareCompare( i->text( col ).lower() );
 
922
}
 
923
 
 
924
void DataTableBox::Item::paintCell( QPainter *painter, const QColorGroup &colorGroup, int column, int width, int align )
 
925
{
 
926
    DataTableBox * dataTableBox = static_cast<DataTableBox *>( listView() );
 
927
    dataTableBox->viewMode() ->paintCell( this, painter, colorGroup, column, width, align );
 
928
}
 
929
 
 
930
void DataTableBox::Item::setText( int column, const QString &text )
 
931
{
 
932
    m_text = text;
 
933
    KListViewItem::setText( column, text );
 
934
}
 
935
 
 
936
void DataTableBox::Item::setup()
 
937
{
 
938
    listView() ->viewMode() ->setupItem( this );
 
939
}
 
940
 
 
941
void DataTableBox::Item::repaintRequested()
 
942
{
 
943
    /*    kdDebug() << "repaintRequested" << dataTable()->numRows() << endl;*/
 
944
    listView() ->viewMode() ->queueRefresh();
 
945
    repaint();
 
946
}
 
947
 
 
948
void DataTableBox::Item::slotSetName( const QString &name )
 
949
{
 
950
    if ( listView() )
 
951
    {
 
952
        setText( 0, name );
 
953
        setSelected( true );
 
954
 
 
955
        listView() ->sort();
 
956
        listView() ->ensureItemVisible( listView() ->currentItem() );
 
957
        listView() ->viewMode() ->queueRefresh();
 
958
    }
 
959
}
 
960
 
 
961
void DataTableBox::Item::init()
 
962
{
 
963
    DataTableBox * list = listView();
 
964
 
 
965
    list->setupItem( this );
 
966
 
 
967
    setDragEnabled( false );
 
968
    setDropEnabled( false );
 
969
 
 
970
    int iconSize = list->viewModeIndex() == 0 ? 32 : 16;
 
971
    setPixmap( 0, SmallIcon( m_iconName, iconSize ) );
 
972
    list->addName( m_text );
 
973
 
 
974
    if ( m_widget )
 
975
    {
 
976
        connect( m_widget, SIGNAL( destroyed() ), this, SLOT( deleteLater() ) );
 
977
    }
 
978
}
 
979
 
 
980
#ifdef widget
 
981
#undef widget
 
982
#endif
 
983
 
 
984
#include "datatablebox.moc"