]> icculus.org git repositories - duncan/yast2-qt4.git/blob - src/YQTable.cc
picking up branches/tmp/sh/qt4-port/, merging it with trunk
[duncan/yast2-qt4.git] / src / YQTable.cc
1 /*---------------------------------------------------------------------\
2 |                                                                      |
3 |                      __   __    ____ _____ ____                      |
4 |                      \ \ / /_ _/ ___|_   _|___ \                     |
5 |                       \ V / _` \___ \ | |   __) |                    |
6 |                        | | (_| |___) || |  / __/                     |
7 |                        |_|\__,_|____/ |_| |_____|                    |
8 |                                                                      |
9 |                               core system                            |
10 |                                                        (C) SuSE GmbH |
11 \----------------------------------------------------------------------/
12
13   File:       YQTable.cc
14
15   Author:     Stefan Hundhammer <sh@suse.de>
16
17 /-*/
18
19 #include <q3header.h>
20 #include <QVBoxLayout>
21 #define y2log_component "qt-ui"
22 #include <ycp/y2log.h>
23
24 #include "utf8.h"
25 #include "YQUI.h"
26 #include "YEvent.h"
27 #include "YQSignalBlocker.h"
28 #include "YUIException.h"
29
30 #include "QY2ListView.h"
31 #include "YQTable.h"
32
33
34 YQTable::YQTable( YWidget * parent, YTableHeader * tableHeader )
35     : QFrame( (QWidget *) parent->widgetRep() )
36     , YTable( parent, tableHeader )
37 {
38     setWidgetRep( this );
39     QVBoxLayout* layout = new QVBoxLayout( this );
40     layout->setSpacing( 0 );
41     setLayout( layout );
42
43     layout->setMargin( YQWidgetMargin );
44
45     _qt_listView = new QY2ListView( this );
46     YUI_CHECK_NEW( _qt_listView );
47     layout->addWidget( _qt_listView );
48     _qt_listView->setAllColumnsShowFocus( true );
49
50
51     //
52     // Add columns
53     //
54
55     for ( int i=0; i < columns(); i++ )
56     {
57         _qt_listView->addColumn( fromUTF8( header( i ) ) );
58
59         int qt_alignment = Qt::Left;
60
61         switch ( alignment( i ) )
62         {
63             case YAlignBegin:   qt_alignment = Qt::AlignLeft;   break;
64             case YAlignCenter:  qt_alignment = Qt::AlignCenter; break;
65             case YAlignEnd:     qt_alignment = Qt::AlignRight;  break;
66
67             case YAlignUnchanged: break;
68         }
69
70         _qt_listView->setColumnAlignment( i, qt_alignment );
71         // _qt_listView->adjustColumn( column );
72     }
73
74
75     //
76     // Connect signals and slots
77     //
78
79     connect( _qt_listView,      SIGNAL( doubleClicked    ( Q3ListViewItem * ) ),
80              this,              SLOT  ( slotActivated    ( Q3ListViewItem * ) ) );
81
82     connect( _qt_listView,      SIGNAL( spacePressed     ( Q3ListViewItem * ) ),
83              this,              SLOT  ( slotActivated    ( Q3ListViewItem * ) ) );
84
85     connect( _qt_listView,      SIGNAL( selectionChanged ( Q3ListViewItem * ) ),
86              this,              SLOT  ( slotSelected     ( Q3ListViewItem * ) ) );
87 }
88
89
90 YQTable::~YQTable()
91 {
92     // NOP
93 }
94
95
96 void
97 YQTable::setKeepSorting( bool keepSorting )
98 {
99     YTable::setKeepSorting( keepSorting );
100     _qt_listView->setSortByInsertionSequence( keepSorting );
101 }
102
103
104 void
105 YQTable::addItem( YItem * yitem )
106 {
107     YTableItem * item = dynamic_cast<YTableItem *> (yitem);
108     YUI_CHECK_PTR( item );
109
110     YTable::addItem( item );
111
112     YQTableListViewItem * clone = new YQTableListViewItem( this, _qt_listView, item );
113     YUI_CHECK_NEW( clone );
114
115     if ( item->selected() )
116     {
117         YQSignalBlocker sigBlocker( _qt_listView );
118         _qt_listView->setSelected( clone, true );
119     }
120 }
121
122
123 void
124 YQTable::selectItem( YItem * yitem, bool selected )
125 {
126     YQSignalBlocker sigBlocker( _qt_listView );
127
128     YTableItem * item = dynamic_cast<YTableItem *> (yitem);
129     YUI_CHECK_PTR( item );
130
131     YQTableListViewItem * clone = (YQTableListViewItem *) item->data();
132     YUI_CHECK_PTR( clone );
133
134     if ( ! selected && clone == _qt_listView->selectedItem() )
135     {
136         deselectAllItems();
137     }
138     else
139     {
140         _qt_listView->setSelected( clone, true );
141         YTable::selectItem( item, selected );
142     }
143 }
144
145
146 void
147 YQTable::deselectAllItems()
148 {
149     YQSignalBlocker sigBlocker( _qt_listView );
150
151     YTable::deselectAllItems();
152     _qt_listView->clearSelection();
153 }
154
155
156 void
157 YQTable::deleteAllItems()
158 {
159     _qt_listView->clear();
160     YTable::deleteAllItems();
161 }
162
163
164 void
165 YQTable::cellChanged( const YTableCell * cell )
166 {
167     YTableItem * item = cell->parent();
168     YUI_CHECK_PTR( item );
169
170     YQTableListViewItem * clone = (YQTableListViewItem *) item->data();
171     YUI_CHECK_PTR( clone );
172
173     clone->updateCell( cell );
174 }
175
176
177 void
178 YQTable::selectOrigItem( Q3ListViewItem * listViewItem )
179 {
180     if ( listViewItem )
181     {
182         YQTableListViewItem * tableListViewItem = dynamic_cast<YQTableListViewItem *> (listViewItem);
183         YUI_CHECK_PTR( tableListViewItem );
184
185         YTable::selectItem( tableListViewItem->origItem(), true );
186     }
187 }
188
189
190 void
191 YQTable::slotSelected( Q3ListViewItem * listViewItem  )
192 {
193     selectOrigItem( listViewItem );
194
195     if ( immediateMode() )
196     {
197         if ( ! YQUI::ui()->eventPendingFor( this ) )
198         {
199             // Avoid overwriting a (more important) Activated event with a SelectionChanged event
200
201             YQUI::ui()->sendEvent( new YWidgetEvent( this, YEvent::SelectionChanged ) );
202         }
203     }
204 }
205
206
207 void
208 YQTable::slotActivated( Q3ListViewItem * listViewItem )
209 {
210     selectOrigItem( listViewItem );
211
212     if ( notify() )
213         YQUI::ui()->sendEvent( new YWidgetEvent( this, YEvent::Activated ) );
214 }
215
216
217 void
218 YQTable::setEnabled( bool enabled )
219 {
220     _qt_listView->setEnabled( enabled );
221     _qt_listView->triggerUpdate();
222     YWidget::setEnabled( enabled );
223 }
224
225
226
227 int
228 YQTable::preferredWidth()
229 {
230     // Arbitrary value.
231     // Use a MinSize widget to set a size that is useful for the application.
232
233     return 30;
234 }
235
236
237 int
238 YQTable::preferredHeight()
239 {
240     // Arbitrary value.
241     // Use a MinSize widget to set a size that is useful for the application.
242
243     return 30;
244 }
245
246
247 void
248 YQTable::setSize( int newWidth, int newHeight )
249 {
250     resize( newWidth, newHeight );
251 }
252
253
254 bool
255 YQTable::setKeyboardFocus()
256 {
257     _qt_listView->setFocus();
258
259     return true;
260 }
261
262
263
264
265
266
267 YQTableListViewItem::YQTableListViewItem( YQTable *     table,
268                                           QY2ListView * parent,
269                                           YTableItem *  origItem )
270     : QY2ListViewItem( parent )
271     , _table( table )
272     , _origItem( origItem )
273 {
274     YUI_CHECK_PTR( _table );
275     YUI_CHECK_PTR( _origItem );
276
277     _origItem->setData( this );
278
279     for ( YTableCellIterator it = _origItem->cellsBegin();
280           it != _origItem->cellsEnd();
281           ++it )
282     {
283         updateCell( *it );
284     }
285
286     if ( _origItem->selected() )
287         QY2ListViewItem::setSelected( true );
288 }
289
290
291 void
292 YQTableListViewItem::updateCell( const YTableCell * cell )
293 {
294     if ( ! cell )
295         return;
296
297     int column = cell->column();
298
299     //
300     // Set label text
301     //
302
303     setText( column, fromUTF8( cell->label() ) );
304
305
306     //
307     // Set icon (if specified)
308     //
309
310     if ( cell->hasIconName() )
311     {
312         // _table is checked against 0 in the constructor
313
314         string  iconName = _table->iconFullPath( cell->iconName() );
315         QPixmap icon     = QPixmap( iconName.c_str() );
316
317         if ( icon.isNull() )
318             y2warning( "Can't load icon %s", iconName.c_str() );
319         else
320             setPixmap( column, icon );
321     }
322     else // No pixmap name
323     {
324         if ( pixmap( column ) ) // Was there a pixmap before?
325         {
326             setPixmap( column, QPixmap() ); // Set empty pixmap
327         }
328     }
329 }
330
331
332 #include "YQTable.moc"