2 // Author: Sergey TELKOV
10 QtxTable::QtxTable( QWidget* parent, const char* name )
11 : QTable( parent, name ),
18 QtxTable::QtxTable( int numRows, int numCols, QWidget* parent, const char* name )
19 : QTable( numRows, numCols, parent, name ),
30 bool QtxTable::headerEditable( Orientation o ) const
32 return myHeaderEditable.contains( o ) ? myHeaderEditable[o] : false;
35 void QtxTable::setHeaderEditable( Orientation o, const bool on )
37 if ( headerEditable( o ) == on )
40 myHeaderEditable.insert( o, on );
42 QHeader* hdr = header( o );
44 if ( !on && myEditedHeader == hdr )
45 endHeaderEdit( false );
48 hdr->installEventFilter( this );
50 hdr->removeEventFilter( this );
53 bool QtxTable::editHeader( Orientation o, const int sec )
55 return beginHeaderEdit( o, sec );
58 void QtxTable::endEditHeader( const bool accept )
60 endHeaderEdit( accept );
63 bool QtxTable::eventFilter( QObject* o, QEvent* e )
65 if ( e->type() == QEvent::MouseButtonDblClick )
67 QMouseEvent* me = (QMouseEvent*)e;
68 if ( o == horizontalHeader() )
70 beginHeaderEdit( Horizontal, me->pos() );
73 else if ( o == verticalHeader() )
75 beginHeaderEdit( Vertical, me->pos() );
80 if ( o == myHeaderEditor && e->type() == QEvent::KeyPress && isHeaderEditing() )
82 QKeyEvent* ke = (QKeyEvent*)e;
83 if ( ke->key() == Key_Escape )
85 endHeaderEdit( false );
89 if ( ke->key() == Key_Return || ke->key() == Key_Enter )
91 endHeaderEdit( true );
98 if ( o == myHeaderEditor && e->type() == QEvent::FocusOut &&
99 isHeaderEditing() && ((QFocusEvent*)e)->reason() != QFocusEvent::Popup )
105 if ( e->type() == QEvent::Wheel && isHeaderEditing() )
108 return QTable::eventFilter( o, e );
111 bool QtxTable::beginHeaderEdit( Orientation o, const int section )
113 if ( !headerEditable( o ) || !header( o ) || !header( o )->isVisibleTo( this ) )
118 QHeader* hdr = header( o );
120 QRect r = headerSectionRect( hdr, section );
124 if ( o == Horizontal )
125 r.setLeft( QMAX( r.left(), leftMargin() ) );
127 r.setTop( QMAX( r.top(), topMargin() ) );
129 myHeaderEditor = createHeaderEditor( hdr, section );
130 if ( !myHeaderEditor )
133 myEditedHeader = hdr;
134 myEditedSection = section;
136 myHeaderEditor->reparent( this, QPoint( 0, 0 ), false );
137 myHeaderEditor->resize( r.size() );
138 myHeaderEditor->move( r.topLeft() );
139 myHeaderEditor->show();
140 myHeaderEditor->setActiveWindow();
141 myHeaderEditor->setFocus();
142 myHeaderEditor->installEventFilter( this );
147 void QtxTable::endHeaderEdit( const bool accept )
149 if ( !isHeaderEditing() )
152 QString oldTxt = myEditedHeader ? myEditedHeader->label( myEditedSection ) : QString::null;
154 if ( accept && myEditedHeader )
155 setHeaderContentFromEditor( myEditedHeader, myEditedSection, myHeaderEditor );
157 QString newTxt = myEditedHeader ? myEditedHeader->label( myEditedSection ) : QString::null;
159 int sec = myEditedSection;
160 QHeader* hdr = myEditedHeader;
163 myEditedSection = -1;
165 myHeaderEditor->hide();
166 delete myHeaderEditor;
169 if ( oldTxt != newTxt )
171 emit headerEdited( hdr, sec );
172 emit headerEdited( hdr == horizontalHeader() ? Horizontal : Vertical, sec );
176 bool QtxTable::isHeaderEditing() const
178 return myHeaderEditor && myEditedHeader && myEditedSection != -1;
181 QWidget* QtxTable::createHeaderEditor( QHeader* hdr, const int sec, const bool init )
183 QLineEdit* ed = new QLineEdit( 0 );
186 ed->setText( hdr->label( sec ) );
191 void QtxTable::setHeaderContentFromEditor( QHeader* hdr, const int sec, QWidget* editor )
193 if ( !hdr || !editor )
196 if ( editor->inherits( "QLineEdit" ) )
197 hdr->setLabel( sec, ((QLineEdit*)editor)->text() );
200 QHeader* QtxTable::header( Orientation o ) const
202 return o == Horizontal ? horizontalHeader() : verticalHeader();
205 void QtxTable::beginHeaderEdit( Orientation o, const QPoint& p )
207 QHeader* hdr = header( o );
211 int pos = o == Horizontal ? p.x() : p.y();
212 int sec = hdr->sectionAt( hdr->offset() + pos );
214 beginHeaderEdit( o, sec );
217 QRect QtxTable::headerSectionRect( QHeader* hdr, const int sec ) const
219 QRect r( -1, -1, -1, -1 );
224 r = hdr->sectionRect( sec );
226 r = QRect( mapFromGlobal( hdr->mapToGlobal( r.topLeft() ) ), r.size() );