2 // Author: Sergey TELKOV
10 QtxTable::QtxTable( QWidget* parent, const char* name )
11 : QTable( parent, name ),
16 connect( verticalHeader(), SIGNAL( sizeChange( int, int, int ) ),
17 this, SLOT( onHeaderSizeChange( int, int, int ) ) );
18 connect( horizontalHeader(), SIGNAL( sizeChange( int, int, int ) ),
19 this, SLOT( onHeaderSizeChange( int, int, int ) ) );
20 connect( verticalScrollBar(), SIGNAL( valueChanged( int ) ), this, SLOT( onScrollBarMoved( int ) ) );
21 connect( horizontalScrollBar(), SIGNAL( valueChanged( int ) ), this, SLOT( onScrollBarMoved( int ) ) );
24 QtxTable::QtxTable( int numRows, int numCols, QWidget* parent, const char* name )
25 : QTable( numRows, numCols, parent, name ),
30 connect( verticalHeader(), SIGNAL( sizeChange( int, int, int ) ),
31 this, SLOT( onHeaderSizeChange( int, int, int ) ) );
32 connect( horizontalHeader(), SIGNAL( sizeChange( int, int, int ) ),
33 this, SLOT( onHeaderSizeChange( int, int, int ) ) );
34 connect( verticalScrollBar(), SIGNAL( valueChanged( int ) ), this, SLOT( onScrollBarMoved( int ) ) );
35 connect( horizontalScrollBar(), SIGNAL( valueChanged( int ) ), this, SLOT( onScrollBarMoved( int ) ) );
42 bool QtxTable::headerEditable( Orientation o ) const
44 return myHeaderEditable.contains( o ) ? myHeaderEditable[o] : false;
47 void QtxTable::setHeaderEditable( Orientation o, const bool on )
49 if ( headerEditable( o ) == on )
52 myHeaderEditable.insert( o, on );
54 QHeader* hdr = header( o );
56 if ( !on && myEditedHeader == hdr )
57 endHeaderEdit( false );
60 hdr->installEventFilter( this );
62 hdr->removeEventFilter( this );
65 bool QtxTable::editHeader( Orientation o, const int sec )
67 return beginHeaderEdit( o, sec );
70 void QtxTable::endEditHeader( const bool accept )
72 endHeaderEdit( accept );
82 bool QtxTable::eventFilter( QObject* o, QEvent* e )
84 if ( e->type() == QEvent::MouseButtonDblClick )
86 QMouseEvent* me = (QMouseEvent*)e;
87 if ( o == horizontalHeader() )
89 beginHeaderEdit( Horizontal, me->pos() );
92 else if ( o == verticalHeader() )
94 beginHeaderEdit( Vertical, me->pos() );
99 if ( o == myHeaderEditor && e->type() == QEvent::KeyPress && isHeaderEditing() )
101 QKeyEvent* ke = (QKeyEvent*)e;
102 if ( ke->key() == Key_Escape )
104 endHeaderEdit( false );
108 if ( ke->key() == Key_Return || ke->key() == Key_Enter )
110 endHeaderEdit( true );
117 if ( o == myHeaderEditor && e->type() == QEvent::FocusOut &&
118 isHeaderEditing() && ((QFocusEvent*)e)->reason() != QFocusEvent::Popup )
124 if ( e->type() == QEvent::Wheel && isHeaderEditing() )
127 return QTable::eventFilter( o, e );
130 void QtxTable::onScrollBarMoved( int )
132 updateHeaderEditor();
135 void QtxTable::onHeaderSizeChange( int, int, int )
137 if ( sender() == myEditedHeader )
138 updateHeaderEditor();
141 void QtxTable::resizeEvent( QResizeEvent* e )
143 QTable::resizeEvent( e );
145 updateHeaderEditor();
148 bool QtxTable::beginHeaderEdit( Orientation o, const int section )
150 if ( !headerEditable( o ) || !header( o ) || !header( o )->isVisibleTo( this ) )
155 QHeader* hdr = header( o );
157 QRect r = headerSectionRect( hdr, section );
161 if ( o == Horizontal )
162 r.setLeft( QMAX( r.left(), leftMargin() ) );
164 r.setTop( QMAX( r.top(), topMargin() ) );
166 myHeaderEditor = createHeaderEditor( hdr, section );
167 if ( !myHeaderEditor )
170 myEditedHeader = hdr;
171 myEditedSection = section;
173 myHeaderEditor->reparent( this, QPoint( 0, 0 ), false );
175 updateHeaderEditor();
177 myHeaderEditor->show();
179 myHeaderEditor->setActiveWindow();
180 myHeaderEditor->setFocus();
182 myHeaderEditor->installEventFilter( this );
187 void QtxTable::endHeaderEdit( const bool accept )
189 if ( !isHeaderEditing() )
192 QString oldTxt = myEditedHeader ? myEditedHeader->label( myEditedSection ) : QString::null;
194 if ( accept && myEditedHeader )
195 setHeaderContentFromEditor( myEditedHeader, myEditedSection, myHeaderEditor );
197 QString newTxt = myEditedHeader ? myEditedHeader->label( myEditedSection ) : QString::null;
199 int sec = myEditedSection;
200 QHeader* hdr = myEditedHeader;
203 myEditedSection = -1;
205 myHeaderEditor->hide();
206 myHeaderEditor->deleteLater();
209 if ( oldTxt != newTxt )
211 emit headerEdited( hdr, sec );
212 emit headerEdited( hdr == horizontalHeader() ? Horizontal : Vertical, sec );
216 bool QtxTable::isHeaderEditing() const
218 return myHeaderEditor && myEditedHeader && myEditedSection != -1;
221 QWidget* QtxTable::createHeaderEditor( QHeader* hdr, const int sec, const bool init )
223 QLineEdit* ed = new QLineEdit( 0 );
226 ed->setText( hdr->label( sec ) );
231 void QtxTable::setHeaderContentFromEditor( QHeader* hdr, const int sec, QWidget* editor )
233 if ( !hdr || !editor )
236 if ( editor->inherits( "QLineEdit" ) )
237 hdr->setLabel( sec, ((QLineEdit*)editor)->text() );
240 QHeader* QtxTable::header( Orientation o ) const
242 return o == Horizontal ? horizontalHeader() : verticalHeader();
245 void QtxTable::beginHeaderEdit( Orientation o, const QPoint& p )
247 QHeader* hdr = header( o );
251 int pos = o == Horizontal ? p.x() : p.y();
252 int sec = hdr->sectionAt( hdr->offset() + pos );
254 beginHeaderEdit( o, sec );
257 QRect QtxTable::headerSectionRect( QHeader* hdr, const int sec ) const
259 QRect r( -1, -1, -1, -1 );
264 r = hdr->sectionRect( sec );
266 r = QRect( mapFromGlobal( hdr->mapToGlobal( r.topLeft() ) ), r.size() );
271 void QtxTable::updateHeaderEditor()
273 if ( !myHeaderEditor || !myEditedHeader || myEditedSection < 0 )
276 QRect r = headerSectionRect( myEditedHeader, myEditedSection );
280 if ( myEditedHeader == horizontalHeader() )
282 r.setLeft( QMAX( r.left(), leftMargin() ) );
283 r.setRight( QMIN( r.right(), width() - rightMargin() - 2 ) );
287 r.setTop( QMAX( r.top(), topMargin() ) );
288 r.setBottom( QMIN( r.bottom(), height() - bottomMargin() - 2 ) );
291 myHeaderEditor->resize( r.size() );
292 myHeaderEditor->move( r.topLeft() );