]> SALOME platform Git repositories - modules/gui.git/blob - src/Qtx/QtxTable.cxx
Salome HOME
6c56918d6f3107247cd5b6504d72c2e52db315fd
[modules/gui.git] / src / Qtx / QtxTable.cxx
1 // File:      QtxTable.cxx
2 // Author:    Sergey TELKOV
3
4 #include "QtxTable.h"
5
6 #ifndef QT_NO_TABLE
7
8 #include <qlineedit.h>
9
10 QtxTable::QtxTable( QWidget* parent, const char* name )
11 : QTable( parent, name ),
12 myHeaderEditor( 0 ),
13 myEditedHeader( 0 ),
14 myEditedSection( -1 )
15 {
16 }
17
18 QtxTable::QtxTable( int numRows, int numCols, QWidget* parent, const char* name )
19 : QTable( numRows, numCols, parent, name ),
20 myHeaderEditor( 0 ),
21 myEditedHeader( 0 ),
22 myEditedSection( -1 )
23 {
24 }
25
26 QtxTable::~QtxTable()
27 {
28 }
29
30 bool QtxTable::headerEditable( Orientation o ) const
31 {
32   return myHeaderEditable.contains( o ) ? myHeaderEditable[o] : false;
33 }
34
35 void QtxTable::setHeaderEditable( Orientation o, const bool on )
36 {
37   if ( headerEditable( o ) == on )
38     return;
39
40   myHeaderEditable.insert( o, on );
41
42   QHeader* hdr = header( o );
43
44   if ( !on && myEditedHeader == hdr )
45     endHeaderEdit( false );
46
47   if ( on )
48     hdr->installEventFilter( this );
49   else
50     hdr->removeEventFilter( this );
51 }
52
53 bool QtxTable::editHeader( Orientation o, const int sec )
54 {
55   return beginHeaderEdit( o, sec );
56 }
57
58 void QtxTable::endEditHeader( const bool accept )
59 {
60   endHeaderEdit( accept );
61 }
62
63 bool QtxTable::eventFilter( QObject* o, QEvent* e )
64 {
65   if ( e->type() == QEvent::MouseButtonDblClick )
66   {
67     QMouseEvent* me = (QMouseEvent*)e;
68     if ( o == horizontalHeader() )
69     {
70       beginHeaderEdit( Horizontal, me->pos() );
71       return true;
72     }
73     else if ( o == verticalHeader() )
74     {
75       beginHeaderEdit( Vertical, me->pos() );
76       return true;
77     }
78   }
79
80   if ( o == myHeaderEditor && e->type() == QEvent::KeyPress && isHeaderEditing() )
81   {
82           QKeyEvent* ke = (QKeyEvent*)e;
83     if ( ke->key() == Key_Escape )
84     {
85       endHeaderEdit( false );
86       return true;
87     }
88
89     if ( ke->key() == Key_Return || ke->key() == Key_Enter )
90     {
91       endHeaderEdit( true );
92       return true;
93     }
94
95     return false;
96   }
97
98   if ( o == myHeaderEditor && e->type() == QEvent::FocusOut &&
99        isHeaderEditing() && ((QFocusEvent*)e)->reason() != QFocusEvent::Popup )
100   {
101                 endHeaderEdit();
102                 return true;
103   }
104
105   if ( e->type() == QEvent::Wheel && isHeaderEditing() )
106     return true;
107
108   return QTable::eventFilter( o, e );
109 }
110
111 bool QtxTable::beginHeaderEdit( Orientation o, const int section )
112 {
113   if ( !headerEditable( o ) || !header( o ) || !header( o )->isVisibleTo( this ) )
114     return false;
115
116   endHeaderEdit();
117
118   QHeader* hdr = header( o );
119
120   QRect r = headerSectionRect( hdr, section );
121   if ( !r.isValid() )
122     return false;
123
124   if ( o == Horizontal )
125     r.setLeft( QMAX( r.left(), leftMargin() ) );
126   else
127     r.setTop( QMAX( r.top(), topMargin() ) );
128
129   myHeaderEditor = createHeaderEditor( hdr, section );
130   if ( !myHeaderEditor )
131     return false;
132
133   myEditedHeader = hdr;
134   myEditedSection = section;
135
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 );
143
144   return true;
145 }
146
147 void QtxTable::endHeaderEdit( const bool accept )
148 {
149   if ( !isHeaderEditing() )
150     return;
151
152   QString oldTxt = myEditedHeader ? myEditedHeader->label( myEditedSection ) : QString::null;
153
154   if ( accept && myEditedHeader )
155     setHeaderContentFromEditor( myEditedHeader, myEditedSection, myHeaderEditor );
156
157   QString newTxt = myEditedHeader ? myEditedHeader->label( myEditedSection ) : QString::null;
158
159   int sec = myEditedSection;
160   QHeader* hdr = myEditedHeader;
161
162   myEditedHeader = 0;
163   myEditedSection = -1;
164
165   myHeaderEditor->hide();
166   delete myHeaderEditor;
167   myHeaderEditor = 0;
168
169   if ( oldTxt != newTxt )
170   {
171     emit headerEdited( hdr, sec );
172     emit headerEdited( hdr == horizontalHeader() ? Horizontal : Vertical, sec );
173   }
174 }
175
176 bool QtxTable::isHeaderEditing() const
177 {
178   return myHeaderEditor && myEditedHeader && myEditedSection != -1;
179 }
180
181 QWidget* QtxTable::createHeaderEditor( QHeader* hdr, const int sec, const bool init )
182 {
183   QLineEdit* ed = new QLineEdit( 0 );
184
185   if ( init && hdr )
186     ed->setText( hdr->label( sec ) );
187
188   return ed;
189 }
190
191 void QtxTable::setHeaderContentFromEditor( QHeader* hdr, const int sec, QWidget* editor )
192 {
193   if ( !hdr || !editor )
194     return;
195
196   if ( editor->inherits( "QLineEdit" ) )
197     hdr->setLabel( sec, ((QLineEdit*)editor)->text() );
198 }
199
200 QHeader* QtxTable::header( Orientation o ) const
201 {
202   return o == Horizontal ? horizontalHeader() : verticalHeader();
203 }
204
205 void QtxTable::beginHeaderEdit( Orientation o, const QPoint& p )
206 {
207   QHeader* hdr = header( o );
208   if ( !hdr )
209     return;
210
211   int pos = o == Horizontal ? p.x() : p.y();
212   int sec = hdr->sectionAt( hdr->offset() + pos );
213
214   beginHeaderEdit( o, sec );
215 }
216
217 QRect QtxTable::headerSectionRect( QHeader* hdr, const int sec ) const
218 {
219   QRect r( -1, -1, -1, -1 );
220
221   if ( !hdr )
222     return r;
223
224   r = hdr->sectionRect( sec );
225   if ( r.isValid() )
226     r = QRect( mapFromGlobal( hdr->mapToGlobal( r.topLeft() ) ), r.size() );
227
228   return r;
229 }
230
231 #endif