summaryrefslogtreecommitdiff
path: root/noncore/settings/networksettings2/editconnection.cpp
Unidiff
Diffstat (limited to 'noncore/settings/networksettings2/editconnection.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/settings/networksettings2/editconnection.cpp188
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
24class MyQCheckListItem : public QCheckListItem 25class MyQCheckListItem : public QCheckListItem
25{ 26{
26public: 27public:
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
39void MyQCheckListItem::paintCell( QPainter *p, const QColorGroup &cg, 47void 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
168void EditConnection::setConnection( NodeCollection * NC ) { 198void 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
230NodeCollection * EditConnection::connection( void ) { 280NodeCollection * 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
295void EditConnection::buildSubTree( QListViewItem * it, ANetNode *NN ) { 347void 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 ?)
541bool EditConnection::haveCompleteConfig( QListViewItem * it ) { 594bool 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}