Diffstat (limited to 'noncore/settings/networksettings2/editconnection.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/settings/networksettings2/editconnection.cpp | 188 |
1 files changed, 121 insertions, 67 deletions
diff --git a/noncore/settings/networksettings2/editconnection.cpp b/noncore/settings/networksettings2/editconnection.cpp index 77826d1..3f8a53f 100644 --- a/noncore/settings/networksettings2/editconnection.cpp +++ b/noncore/settings/networksettings2/editconnection.cpp | |||
@@ -1,12 +1,13 @@ | |||
1 | #include <opie2/odebug.h> | ||
1 | #include <qlistview.h> | 2 | #include <qlistview.h> |
2 | #include <qwidgetstack.h> | 3 | #include <qwidgetstack.h> |
3 | #include <qframe.h> | 4 | #include <qframe.h> |
4 | #include <qcombobox.h> | 5 | #include <qcombobox.h> |
5 | #include <qtabwidget.h> | 6 | #include <qtabwidget.h> |
6 | #include <qmessagebox.h> | 7 | #include <qmessagebox.h> |
7 | #include <qpushbutton.h> | 8 | #include <qpushbutton.h> |
8 | #include <qlineedit.h> | 9 | #include <qlineedit.h> |
9 | #include <qheader.h> | 10 | #include <qheader.h> |
10 | #include <qpainter.h> | 11 | #include <qpainter.h> |
11 | #include <qcheckbox.h> | 12 | #include <qcheckbox.h> |
12 | #include <qlabel.h> | 13 | #include <qlabel.h> |
@@ -22,24 +23,31 @@ | |||
22 | // | 23 | // |
23 | 24 | ||
24 | class MyQCheckListItem : public QCheckListItem | 25 | class MyQCheckListItem : public QCheckListItem |
25 | { | 26 | { |
26 | public: | 27 | public: |
27 | MyQCheckListItem( QListView *parent, const QString & S, Type T ) : | 28 | MyQCheckListItem( QListView *parent, const QString & S, Type T ) : |
28 | QCheckListItem( parent, S, T ) { } | 29 | QCheckListItem( parent, S, T ) { } |
29 | MyQCheckListItem( QCheckListItem *parent, const QString & S, Type T ) : | 30 | MyQCheckListItem( QCheckListItem *parent, const QString & S, Type T ) : |
30 | QCheckListItem( parent, S, T ) { } | 31 | QCheckListItem( parent, S, T ) { } |
31 | MyQCheckListItem( QListViewItem *parent, const QString & S, Type T ) : | 32 | MyQCheckListItem( QListViewItem *parent, const QString & S, Type T ) : |
32 | QCheckListItem( parent, S, T ) { } | 33 | QCheckListItem( parent, S, T ) { } |
33 | 34 | ||
35 | MyQCheckListItem( QListView *parent, const QString & S ) : | ||
36 | QCheckListItem( parent, S, QCheckListItem::Controller ) { } | ||
37 | MyQCheckListItem( QCheckListItem *parent, const QString & S ) : | ||
38 | QCheckListItem( parent, S, QCheckListItem::Controller ) { } | ||
39 | MyQCheckListItem( QListViewItem *parent, const QString & S ) : | ||
40 | QCheckListItem( parent, S, QCheckListItem::Controller ) { } | ||
41 | |||
34 | virtual void paintCell( QPainter *p, const QColorGroup &cg, | 42 | virtual void paintCell( QPainter *p, const QColorGroup &cg, |
35 | int column, int width, int alignment ); | 43 | int column, int width, int alignment ); |
36 | 44 | ||
37 | }; | 45 | }; |
38 | 46 | ||
39 | void MyQCheckListItem::paintCell( QPainter *p, const QColorGroup &cg, | 47 | void MyQCheckListItem::paintCell( QPainter *p, const QColorGroup &cg, |
40 | int column, int width, int alignment ) | 48 | int column, int width, int alignment ) |
41 | { | 49 | { |
42 | QColorGroup _cg( cg ); | 50 | QColorGroup _cg( cg ); |
43 | QColor c = _cg.text(); | 51 | QColor c = _cg.text(); |
44 | if ( ! isSelectable() ) | 52 | if ( ! isSelectable() ) |
45 | _cg.setColor( QColorGroup::Text, Qt::lightGray ); | 53 | _cg.setColor( QColorGroup::Text, Qt::lightGray ); |
@@ -107,66 +115,88 @@ NodeCollection * EditConnection::getTmpCollection( void ) { | |||
107 | for( QListIterator<ANetNodeInstance> it(TmpCollection); | 115 | for( QListIterator<ANetNodeInstance> it(TmpCollection); |
108 | it.current(); | 116 | it.current(); |
109 | ++it ) { | 117 | ++it ) { |
110 | if( it.current()->isNew() ) { | 118 | if( it.current()->isNew() ) { |
111 | delete it.current(); | 119 | delete it.current(); |
112 | } | 120 | } |
113 | } | 121 | } |
114 | TmpCollection.clear(); | 122 | TmpCollection.clear(); |
115 | 123 | ||
116 | // update content | 124 | // update content |
117 | QListViewItem * it = Nodes_LV->firstChild(); | 125 | QListViewItem * it = Nodes_LV->firstChild(); |
118 | ANetNode * NN; | 126 | ANetNode * NN; |
119 | // start iter | 127 | |
128 | // start iter (if there is a collection) | ||
129 | /* | ||
130 | |||
131 | a node collection is sorted from the toplevel | ||
132 | node to the deepest node | ||
133 | |||
134 | */ | ||
120 | ANetNodeInstance * NNI = | 135 | ANetNodeInstance * NNI = |
121 | (SelectedNodes) ? SelectedNodes->first() : 0 ; | 136 | (SelectedNodes) ? SelectedNodes->first() : 0 ; |
122 | 137 | ||
123 | TmpCollection.setModified( 0 ); | 138 | TmpCollection.setModified( 0 ); |
124 | 139 | ||
140 | // the listview always starts with the toplevel | ||
141 | // hierarchy. This is always a controller item | ||
125 | while ( it ) { | 142 | while ( it ) { |
126 | NN = (*Mapping)[it]; | 143 | NN = (*Mapping)[it]; |
127 | if( NN == 0 ) { | 144 | if( NN == 0 ) { |
128 | // child is controller -> has sub radio | 145 | // this item is a controller -> |
129 | // check if one radio is selected | 146 | // has radio items as children -> |
147 | // find selected one | ||
130 | it = it->firstChild(); | 148 | it = it->firstChild(); |
131 | while( it ) { | 149 | while( it ) { |
132 | if( ((QCheckListItem *)it)->isOn() ) { | 150 | if( ((QCheckListItem *)it)->isOn() ) { |
133 | // this radio is selected -> go deeper | 151 | // this radio is selected -> go deeper |
134 | if( SelectedNodes == 0 || | ||
135 | NNI == 0 || | ||
136 | it->text(0) != NNI->nodeClass()->name() ) { | ||
137 | // new item not in previous collection | ||
138 | ANetNodeInstance * NNI = (*Mapping)[it]->createInstance(); | ||
139 | NNI->initialize(); | ||
140 | // this node type not in collection | ||
141 | TmpCollection.append( NNI ); | ||
142 | // master collection changed because new item in it | ||
143 | TmpCollection.setModified( 1 ); | ||
144 | // no more valid items in old list | ||
145 | NNI = 0; | ||
146 | } else { | ||
147 | // already in list -> copy pointer | ||
148 | TmpCollection.append( NNI ); | ||
149 | NNI = SelectedNodes->next(); | ||
150 | } | ||
151 | it = it->firstChild(); | ||
152 | // do not bother to check other items | ||
153 | break; | 152 | break; |
154 | } | 153 | } |
155 | it = it->nextSibling(); | 154 | it = it->nextSibling(); |
156 | } | 155 | } |
156 | |||
157 | if( ! it ) { | ||
158 | owarn << "Radio not selected" << oendl; | ||
159 | TmpIsValid = 0; | ||
160 | return 0; | ||
161 | } | ||
162 | |||
163 | // it now contains selected radio | ||
164 | NN = (*Mapping)[it]; | ||
165 | } | ||
166 | |||
167 | // NN here contains the netnode of the | ||
168 | // current item -> this node needs to | ||
169 | // be stored in the collection | ||
170 | if( NNI == 0 || | ||
171 | it->text(0) != NNI->nodeClass()->name() ) { | ||
172 | // new item not in previous collection | ||
173 | ANetNodeInstance * NNI = NN->createInstance(); | ||
174 | NNI->initialize(); | ||
175 | // this node type not in collection | ||
176 | TmpCollection.append( NNI ); | ||
177 | // master collection changed because new item in it | ||
178 | TmpCollection.setModified( 1 ); | ||
179 | // no more valid items in old list | ||
180 | NNI = 0; | ||
157 | } else { | 181 | } else { |
158 | // check children | 182 | // already in list -> copy pointer |
159 | it = it->firstChild(); | 183 | TmpCollection.append( NNI ); |
184 | NNI = SelectedNodes->next(); | ||
160 | } | 185 | } |
186 | |||
187 | // go deeper to next level | ||
188 | // this level is can be a new controller | ||
189 | // or an item | ||
190 | it = it->firstChild(); | ||
161 | } | 191 | } |
162 | 192 | ||
163 | TmpIsValid = 1; | 193 | TmpIsValid = 1; |
164 | return &(TmpCollection); | 194 | return &(TmpCollection); |
165 | } | 195 | } |
166 | 196 | ||
167 | // pass a connection NodeCollection to be edited | 197 | // pass a connection NodeCollection to be edited |
168 | void EditConnection::setConnection( NodeCollection * NC ) { | 198 | void EditConnection::setConnection( NodeCollection * NC ) { |
169 | ANetNodeInstance * NNI; | 199 | ANetNodeInstance * NNI; |
170 | ANetNode * NN; | 200 | ANetNode * NN; |
171 | 201 | ||
172 | SelectedNodes = NC; | 202 | SelectedNodes = NC; |
@@ -178,58 +208,78 @@ void EditConnection::setConnection( NodeCollection * NC ) { | |||
178 | 208 | ||
179 | // valid colledction | 209 | // valid colledction |
180 | Tab_TB->setTabEnabled( Setup_FRM, FALSE ); | 210 | Tab_TB->setTabEnabled( Setup_FRM, FALSE ); |
181 | Setup_FRM->setEnabled( FALSE ); | 211 | Setup_FRM->setEnabled( FALSE ); |
182 | 212 | ||
183 | // select items in collection | 213 | // select items in collection |
184 | QListViewItem * it = Nodes_LV->firstChild(); | 214 | QListViewItem * it = Nodes_LV->firstChild(); |
185 | bool Found; | 215 | bool Found; |
186 | 216 | ||
187 | TmpIsValid = 0; | 217 | TmpIsValid = 0; |
188 | 218 | ||
189 | while ( it ) { | 219 | while ( it ) { |
190 | // listitem corresponds to netnode | ||
191 | NN = (*Mapping)[it]; | 220 | NN = (*Mapping)[it]; |
192 | if( NN == 0 ) { | 221 | if( NN == 0 ) { |
193 | // child is controller -> has sub radio | 222 | // this item is a controller -> |
194 | QString Ctr = it->text(0); | 223 | // has radio items as children -> |
195 | // check if one radio is selected | 224 | // find selected one |
196 | it = it->firstChild(); | 225 | it = it->firstChild(); |
197 | Found = 0; | 226 | Found = 0; |
198 | while( it ) { | 227 | while( it ) { |
199 | if( NNI && it->text(0) == NNI->nodeClass()->name() ) { | 228 | if( NNI && it->text(0) == NNI->nodeClass()->name() ) { |
200 | // this radio is part of the collection | 229 | // this radio is part of the collection |
201 | ((QCheckListItem *)it)->setOn( 1 ); | 230 | ((QCheckListItem *)it)->setOn( 1 ); |
202 | updateGUI( it, NNI->nodeClass() ); | 231 | updateGUI( it, NNI->nodeClass() ); |
203 | // check its children | 232 | // check its children |
204 | Found = 1; | 233 | Found = 1; |
205 | it = it->firstChild(); | 234 | it = it->firstChild(); |
206 | NNI = SelectedNodes->next(); | 235 | NNI = SelectedNodes->next(); |
207 | // do not bother to check other items | 236 | // do not bother to check other items |
208 | break; | 237 | break; |
209 | } | 238 | } |
210 | it = it->nextSibling(); | 239 | it = it->nextSibling(); |
211 | } | 240 | } |
241 | |||
212 | if( ! Found ) { | 242 | if( ! Found ) { |
213 | // this means that this level is NOT present in collection | 243 | // this means that this level is NOT present in collection |
214 | // probably INCOMPATIBEL collection OR Missing plugin | 244 | // probably INCOMPATIBEL collection OR Missing plugin |
215 | QMessageBox::warning( | 245 | QMessageBox::warning( |
216 | 0, | 246 | 0, |
217 | tr( "Error presentig Connection" ), | 247 | tr( "Error presentig Connection" ), |
218 | tr( "<p>Old connection or missing plugin \"<i>%1</i>\"</p>" ). | 248 | tr( "<p>Old connection or missing plugin \"<i>%1</i>\"</p>" ). |
219 | arg(Ctr) ); | 249 | arg(NNI->nodeClass()->name()) ); |
220 | return; | 250 | return; |
221 | } | 251 | } |
252 | |||
253 | // it now contains selected radio | ||
254 | NN = (*Mapping)[it]; | ||
222 | } else { | 255 | } else { |
223 | // automatic item -> check children | 256 | // automatic selection |
257 | if( NNI == 0 || it->text(0) != NNI->nodeClass()->name() ) { | ||
258 | // should exist and be the same | ||
259 | if( NNI ) { | ||
260 | QMessageBox::warning( | ||
261 | 0, | ||
262 | tr( "Error presentig Connection" ), | ||
263 | tr( "<p>Old connection or missing plugin \"<i>%1</i>\"</p>" ). | ||
264 | arg(NNI->nodeClass()->name()) ); | ||
265 | } else { | ||
266 | QMessageBox::warning( | ||
267 | 0, | ||
268 | tr( "Error presentig Connection" ), | ||
269 | tr( "<p>Missing connection\"<i>%1</i>\"</p>" ). | ||
270 | arg(it->text(0)) ); | ||
271 | } | ||
272 | return; | ||
273 | } | ||
224 | it = it->firstChild(); | 274 | it = it->firstChild(); |
225 | } | 275 | } |
226 | } | 276 | } |
227 | } | 277 | } |
228 | 278 | ||
229 | // get result of editing (either new OR updated collection | 279 | // get result of editing (either new OR updated collection |
230 | NodeCollection * EditConnection::connection( void ) { | 280 | NodeCollection * EditConnection::connection( void ) { |
231 | 281 | ||
232 | if( SelectedNodes == 0 ) { | 282 | if( SelectedNodes == 0 ) { |
233 | // new collection | 283 | // new collection |
234 | SelectedNodes = new NodeCollection; | 284 | SelectedNodes = new NodeCollection; |
235 | } | 285 | } |
@@ -260,55 +310,57 @@ void EditConnection::buildFullTree( void ) { | |||
260 | ANetNode * NN; | 310 | ANetNode * NN; |
261 | 311 | ||
262 | // toplevel item | 312 | // toplevel item |
263 | MyQCheckListItem * TheTop = new MyQCheckListItem( | 313 | MyQCheckListItem * TheTop = new MyQCheckListItem( |
264 | Nodes_LV, | 314 | Nodes_LV, |
265 | NSResources->netNode2Name("fullsetup"), | 315 | NSResources->netNode2Name("fullsetup"), |
266 | QCheckListItem::Controller ); | 316 | QCheckListItem::Controller ); |
267 | TheTop->setOpen( TRUE ); | 317 | TheTop->setOpen( TRUE ); |
268 | Description_LBL->setText( | 318 | Description_LBL->setText( |
269 | NSResources->netNode2Description( "fullsetup" ) ); | 319 | NSResources->netNode2Description( "fullsetup" ) ); |
270 | Nodes_LV->setSelected( TheTop, TRUE ); | 320 | Nodes_LV->setSelected( TheTop, TRUE ); |
271 | 321 | ||
272 | // find all Nodes that care toplevel nodes -> ie provide | 322 | // find all Nodes that are toplevel nodes -> ie provide |
273 | // TCP/IP Connection | 323 | // TCP/IP Connection |
274 | for( QDictIterator<NetNode_t> Iter(NSResources->netNodes()); | 324 | for( QDictIterator<NetNode_t> Iter(NSResources->netNodes()); |
275 | Iter.current(); | 325 | Iter.current(); |
276 | ++Iter ) { | 326 | ++Iter ) { |
277 | 327 | ||
278 | NN = Iter.current()->NetNode; | 328 | NN = Iter.current()->NetNode; |
279 | 329 | ||
280 | if( ! NN->isToplevel() ) { | 330 | if( ! NN->isToplevel() ) { |
281 | continue; | 331 | continue; |
282 | } | 332 | } |
283 | 333 | ||
284 | MyQCheckListItem * it = new MyQCheckListItem( TheTop, | 334 | MyQCheckListItem * it = new MyQCheckListItem( TheTop, |
285 | NN->name(), | 335 | NN->name(), |
286 | QCheckListItem::RadioButton ); | 336 | QCheckListItem::RadioButton ); |
287 | it->setPixmap( 0, NSResources->getPixmap( "Devices/commprofile" ) ); | 337 | it->setPixmap( 0, |
338 | NSResources->getPixmap( NN->pixmapName() ) | ||
339 | ); | ||
288 | // remember that this node maps to this listitem | 340 | // remember that this node maps to this listitem |
289 | Mapping->insert( it, NN ); | 341 | Mapping->insert( it, NN ); |
290 | buildSubTree( it, NN ); | 342 | buildSubTree( it, NN ); |
291 | } | 343 | } |
292 | } | 344 | } |
293 | 345 | ||
294 | // Build device tree -> help function | 346 | // Build device tree -> help function |
295 | void EditConnection::buildSubTree( QListViewItem * it, ANetNode *NN ) { | 347 | void EditConnection::buildSubTree( QListViewItem * it, ANetNode *NN ) { |
296 | ANetNode::NetNodeList & NNL = NN->alternatives(); | 348 | ANetNode::NetNodeList & NNL = NN->alternatives(); |
297 | 349 | ||
298 | if( NNL.size() > 1 ) { | 350 | if( NNL.size() > 1 ) { |
299 | // this node has alternatives -> needs radio buttons | 351 | // this node has alternatives -> needs radio buttons |
300 | it = new MyQCheckListItem( | 352 | it = new MyQCheckListItem( |
301 | it, | 353 | it, |
302 | NSResources->netNode2Name(NNL[0]->provides()), | 354 | NSResources->netNode2Name(NN->needs()[0]), |
303 | QCheckListItem::Controller ); | 355 | QCheckListItem::Controller ); |
304 | it->setSelectable( FALSE ); | 356 | it->setSelectable( FALSE ); |
305 | } | 357 | } |
306 | 358 | ||
307 | for ( unsigned int i=0; i < NNL.size(); i++ ) { | 359 | for ( unsigned int i=0; i < NNL.size(); i++ ) { |
308 | QListViewItem * CI; | 360 | QListViewItem * CI; |
309 | if( NNL.size() > 1 ) { | 361 | if( NNL.size() > 1 ) { |
310 | // generate radio buttons | 362 | // generate radio buttons |
311 | CI = new MyQCheckListItem( | 363 | CI = new MyQCheckListItem( |
312 | (QCheckListItem *)it, | 364 | (QCheckListItem *)it, |
313 | NNL[i]->name(), QCheckListItem::RadioButton ); | 365 | NNL[i]->name(), QCheckListItem::RadioButton ); |
314 | // remember that this node maps to this listitem | 366 | // remember that this node maps to this listitem |
@@ -378,28 +430,29 @@ void EditConnection::SLOT_SelectNode( QListViewItem * it ) { | |||
378 | if( it == 0 || it->depth() == 0 ) { | 430 | if( it == 0 || it->depth() == 0 ) { |
379 | Description_LBL->setText( | 431 | Description_LBL->setText( |
380 | NSResources->netNode2Description( "fullsetup" ) ); | 432 | NSResources->netNode2Description( "fullsetup" ) ); |
381 | // topevel or no selection | 433 | // topevel or no selection |
382 | return; | 434 | return; |
383 | } | 435 | } |
384 | 436 | ||
385 | // store conversion from lvitem to node | 437 | // store conversion from lvitem to node |
386 | NN = (*Mapping)[ it ]; | 438 | NN = (*Mapping)[ it ]; |
387 | 439 | ||
388 | if( ! NN ) { | 440 | if( ! NN ) { |
389 | // intermediate node | 441 | // intermediate node |
390 | NN = (*Mapping)[ it->firstChild() ]; | 442 | NN = (*Mapping)[ it->parent() ]; |
391 | if( NN ) { | 443 | if( NN ) { |
392 | // figure out type of this node -> produce mesage | 444 | // figure out type of this node -> produce mesage |
393 | Description_LBL->setText( NSResources->netNode2Description(NN->provides()) ); | 445 | Description_LBL->setText( NSResources->netNode2Description( |
446 | NN->needs()[0]) ); | ||
394 | } else { | 447 | } else { |
395 | Description_LBL->setText( "" ); | 448 | Description_LBL->setText( "" ); |
396 | } | 449 | } |
397 | return; | 450 | return; |
398 | } | 451 | } |
399 | 452 | ||
400 | Description_LBL->setText( NN->nodeDescription() ); | 453 | Description_LBL->setText( NN->nodeDescription() ); |
401 | 454 | ||
402 | if( ! it->isSelectable() ) { | 455 | if( ! it->isSelectable() ) { |
403 | return; | 456 | return; |
404 | } | 457 | } |
405 | 458 | ||
@@ -530,48 +583,49 @@ void EditConnection::enablePath( QListViewItem * it, bool pha ) { | |||
530 | } else { | 583 | } else { |
531 | // controller node | 584 | // controller node |
532 | it->setSelectable( TRUE ); | 585 | it->setSelectable( TRUE ); |
533 | it->setOpen( TRUE ); | 586 | it->setOpen( TRUE ); |
534 | enablePath( it->firstChild(), pha ); | 587 | enablePath( it->firstChild(), pha ); |
535 | } | 588 | } |
536 | it = it->nextSibling(); | 589 | it = it->nextSibling(); |
537 | } | 590 | } |
538 | } | 591 | } |
539 | 592 | ||
540 | // do we have a complete configuration (all needs are provided for ?) | 593 | // do we have a complete configuration (all needs are provided for ?) |
541 | bool EditConnection::haveCompleteConfig( QListViewItem * it ) { | 594 | bool EditConnection::haveCompleteConfig( QListViewItem * it ) { |
542 | if( it == 0 || ((QCheckListItem *)it)->isOn() ) { | 595 | |
543 | // check children | 596 | // check if all below this level is selected |
544 | it = (it) ? it->firstChild() : Nodes_LV->firstChild() ; | 597 | it = ( it ) ?it : Nodes_LV->firstChild(); |
545 | while ( it ) { | 598 | ANetNode *NN; |
546 | if( ((QCheckListItem *)it)->type() == | 599 | bool Found; |
547 | QCheckListItem::Controller ) { | 600 | |
548 | // child is controller -> has sub radio | 601 | while ( it ) { |
549 | // check if one radio is selected | 602 | NN = (*Mapping)[it]; |
550 | it = it->firstChild(); | 603 | if( NN == 0 ) { |
551 | while( it ) { | 604 | // this item is a controller -> |
552 | if( ((QCheckListItem *)it)->isOn() ) { | 605 | // has radio items as children -> |
553 | // this radio is selected -> go deeper | 606 | // find selected one |
554 | it = it->firstChild(); | 607 | it = it->firstChild(); |
555 | if( ! it ) { | 608 | Found = 0; |
556 | // was deepest level | 609 | while( it ) { |
557 | return 1; | 610 | if( ((QCheckListItem *)it)->isOn() ) { |
558 | } | 611 | Found = 1; |
559 | // do not bother to check other items | 612 | // go deeper |
560 | break; | 613 | it = it->firstChild(); |
561 | } | 614 | break; |
562 | it = it->nextSibling(); | ||
563 | } | ||
564 | if( ! it ) { | ||
565 | // no radio selected | ||
566 | return 0; | ||
567 | } | 615 | } |
568 | } else { | 616 | it = it->nextSibling(); |
569 | // check children | ||
570 | it = it->firstChild(); | ||
571 | } | 617 | } |
618 | |||
619 | if( ! Found ) { | ||
620 | return 0; // no not complete -> a radio should have been chkd | ||
621 | } | ||
622 | |||
623 | // it now contains selected radio | ||
624 | NN = (*Mapping)[it]; | ||
625 | } else { | ||
626 | // automatic selection | ||
627 | it = it->firstChild(); | ||
572 | } | 628 | } |
573 | // deepest level -> all is still OK | 629 | } |
574 | return 1; | 630 | return 1; |
575 | } // was not ON | ||
576 | return 0; | ||
577 | } | 631 | } |