summaryrefslogtreecommitdiff
path: root/noncore/settings/networksettings2/editconnection.cpp
Unidiff
Diffstat (limited to 'noncore/settings/networksettings2/editconnection.cpp') (more/less context) (show whitespace changes)
-rw-r--r--noncore/settings/networksettings2/editconnection.cpp146
1 files changed, 100 insertions, 46 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,6 +1,7 @@
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>
@@ -28,12 +29,19 @@ public:
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,
@@ -113,54 +121,76 @@ NodeCollection * EditConnection::getTmpCollection( void ) {
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 || 152 break;
135 NNI == 0 || 153 }
154 it = it->nextSibling();
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 ||
136 it->text(0) != NNI->nodeClass()->name() ) { 171 it->text(0) != NNI->nodeClass()->name() ) {
137 // new item not in previous collection 172 // new item not in previous collection
138 ANetNodeInstance * NNI = (*Mapping)[it]->createInstance(); 173 ANetNodeInstance * NNI = NN->createInstance();
139 NNI->initialize(); 174 NNI->initialize();
140 // this node type not in collection 175 // this node type not in collection
141 TmpCollection.append( NNI ); 176 TmpCollection.append( NNI );
142 // master collection changed because new item in it 177 // master collection changed because new item in it
143 TmpCollection.setModified( 1 ); 178 TmpCollection.setModified( 1 );
144 // no more valid items in old list 179 // no more valid items in old list
145 NNI = 0; 180 NNI = 0;
146 } else { 181 } else {
147 // already in list -> copy pointer 182 // already in list -> copy pointer
148 TmpCollection.append( NNI ); 183 TmpCollection.append( NNI );
149 NNI = SelectedNodes->next(); 184 NNI = SelectedNodes->next();
150 } 185 }
186
187 // go deeper to next level
188 // this level is can be a new controller
189 // or an item
151 it = it->firstChild(); 190 it = it->firstChild();
152 // do not bother to check other items
153 break;
154 }
155 it = it->nextSibling();
156 }
157 } else {
158 // check children
159 it = it->firstChild();
160 }
161 } 191 }
162 192
163 TmpIsValid = 1; 193 TmpIsValid = 1;
164 return &(TmpCollection); 194 return &(TmpCollection);
165} 195}
166 196
@@ -184,18 +214,17 @@ void EditConnection::setConnection( NodeCollection * NC ) {
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 );
@@ -206,24 +235,45 @@ void EditConnection::setConnection( NodeCollection * NC ) {
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
@@ -266,13 +316,13 @@ void EditConnection::buildFullTree( void ) {
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;
@@ -281,13 +331,15 @@ void EditConnection::buildFullTree( void ) {
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
@@ -296,13 +348,13 @@ 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;
@@ -384,16 +436,17 @@ void EditConnection::SLOT_SelectNode( QListViewItem * it ) {
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
@@ -536,42 +589,43 @@ void EditConnection::enablePath( QListViewItem * it, bool pha ) {
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();
598 ANetNode *NN;
599 bool Found;
600
545 while ( it ) { 601 while ( it ) {
546 if( ((QCheckListItem *)it)->type() == 602 NN = (*Mapping)[it];
547 QCheckListItem::Controller ) { 603 if( NN == 0 ) {
548 // child is controller -> has sub radio 604 // this item is a controller ->
549 // check if one radio is selected 605 // has radio items as children ->
606 // find selected one
550 it = it->firstChild(); 607 it = it->firstChild();
608 Found = 0;
551 while( it ) { 609 while( it ) {
552 if( ((QCheckListItem *)it)->isOn() ) { 610 if( ((QCheckListItem *)it)->isOn() ) {
553 // this radio is selected -> go deeper 611 Found = 1;
612 // go deeper
554 it = it->firstChild(); 613 it = it->firstChild();
555 if( ! it ) {
556 // was deepest level
557 return 1;
558 }
559 // do not bother to check other items
560 break; 614 break;
561 } 615 }
562 it = it->nextSibling(); 616 it = it->nextSibling();
563 } 617 }
564 if( ! it ) { 618
565 // no radio selected 619 if( ! Found ) {
566 return 0; 620 return 0; // no not complete -> a radio should have been chkd
567 } 621 }
622
623 // it now contains selected radio
624 NN = (*Mapping)[it];
568 } else { 625 } else {
569 // check children 626 // automatic selection
570 it = it->firstChild(); 627 it = it->firstChild();
571 } 628 }
572 } 629 }
573 // deepest level -> all is still OK
574 return 1; 630 return 1;
575 } // was not ON
576 return 0;
577} 631}