1 // File: SalomeApp_Dialog.cxx
2 // Author: Alexander SOLOVYOV
4 #include <SalomeApp_Dialog.h>
5 #include <SUIT_Session.h>
7 #include <qtoolbutton.h>
12 Class : SalomeApp_Dialog
13 Description : Base class for all SALOME dialogs
16 //=======================================================================
17 // name : SalomeApp_Dialog
18 // Purpose : Constructor
19 //=======================================================================
20 SalomeApp_Dialog::SalomeApp_Dialog( QWidget* parent, const char* name, bool modal,
21 bool allowResize, const int f, WFlags wf )
22 : QtxDialog( parent, name, modal, allowResize, f, wf ),
23 myIsExclusive( true ),
26 setObjectPixmap( "SalomeApp", tr( "ICON_SELECT" ) );
29 //=======================================================================
30 // name : ~SalomeApp_Dialog
31 // Purpose : Destructor
32 //=======================================================================
33 SalomeApp_Dialog::~SalomeApp_Dialog()
37 //=======================================================================
40 //=======================================================================
41 void SalomeApp_Dialog::show()
46 //=======================================================================
49 //=======================================================================
50 bool SalomeApp_Dialog::isExclusive() const
55 //=======================================================================
56 // name : updateButtons
58 //=======================================================================
59 void SalomeApp_Dialog::updateButtons( const int _id )
66 ObjectMap::const_iterator anIt = myObjects.begin(),
67 aLast = myObjects.end();
68 for( ; anIt!=aLast; anIt++ )
70 QToolButton* but = (QToolButton*)anIt.data().myBtn;
71 if( but && but->isOn() )
82 //=======================================================================
83 // name : setExclusive
85 //=======================================================================
86 void SalomeApp_Dialog::setExclusive( const bool ex )
92 //=======================================================================
95 //=======================================================================
96 void SalomeApp_Dialog::showObject( const int id )
98 setObjectShown( id, true );
101 //=======================================================================
104 //=======================================================================
105 void SalomeApp_Dialog::hideObject( const int id )
107 setObjectShown( id, false );
110 //=======================================================================
111 // name : setObjectShown
113 //=======================================================================
114 void SalomeApp_Dialog::setObjectShown( const int id, const bool shown )
116 if( myObjects.contains( id ) && isObjectShown( id )!=shown )
118 Object& obj = myObjects[ id ];
119 obj.myEdit->setShown( shown );
120 obj.myBtn->setShown( shown );
121 obj.myLabel->setShown( shown );
123 ( ( QToolButton* )obj.myBtn )->setOn( false );
127 //=======================================================================
128 // name : isObjectShown
130 //=======================================================================
131 bool SalomeApp_Dialog::isObjectShown( const int id ) const
133 return myObjects.contains( id ) && myObjects[ id ].myEdit->isShown();
136 //=======================================================================
137 // name : setObjectEnabled
139 //=======================================================================
140 void SalomeApp_Dialog::setObjectEnabled( const int id, const bool en )
142 if( myObjects.contains( id ) && isObjectEnabled( id )!=en )
144 Object& obj = myObjects[ id ];
145 obj.myEdit->setEnabled( en );
146 obj.myBtn->setEnabled( en );
147 // obj.myLabel->setEnabled( en );
149 ( ( QToolButton* )obj.myBtn )->setOn( false );
153 //=======================================================================
154 // name : isObjectEnabled
156 //=======================================================================
157 bool SalomeApp_Dialog::isObjectEnabled( const int id ) const
159 return myObjects.contains( id ) && myObjects[ id ].myEdit->isEnabled();
162 //=======================================================================
163 // name : selectObject
165 //=======================================================================
166 void SalomeApp_Dialog::selectObject( const QString& name, const int type, const QString& id, const bool update )
168 QStringList names; names.append( name );
169 TypesList types; types.append( type );
170 QStringList ids; ids.append( id );
171 selectObject( names, types, ids, update );
174 //=======================================================================
175 // name : selectObject
177 //=======================================================================
178 void SalomeApp_Dialog::selectObject( const QStringList& _names,
179 const TypesList& _types,
180 const QStringList& _ids,
183 ObjectMap::iterator anIt = myObjects.begin(),
184 aLast = myObjects.end();
185 for( ; anIt!=aLast; anIt++ )
186 if( anIt.data().myBtn->isOn() )
187 selectObject( anIt.key(), _names, _types, _ids, update );
190 //=======================================================================
191 // name : hasSelection
193 //=======================================================================
194 bool SalomeApp_Dialog::hasSelection( const int id ) const
196 return myObjects.contains( id ) && !myObjects[ id ].myIds.isEmpty();
199 //=======================================================================
200 // name : clearSelection
202 //=======================================================================
203 void SalomeApp_Dialog::clearSelection( const int id )
207 ObjectMap::const_iterator anIt = myObjects.begin(),
208 aLast = myObjects.end();
209 for( ; anIt!=aLast; anIt++ )
210 clearSelection( anIt.key() );
213 else if( myObjects.contains( id ) )
215 myObjects[ id ].myIds.clear();
216 myObjects[ id ].myTypes.clear();
217 myObjects[ id ].myNames.clear();
219 myObjects[ id ].myEdit->setText( QString::null );
220 emit selectionChanged( id );
224 //=======================================================================
227 //=======================================================================
228 QWidget* SalomeApp_Dialog::objectWg( const int theId, const int theWgId ) const
231 if( myObjects.contains( theId ) )
233 if ( theWgId == Label )
234 aResWg = myObjects[ theId ].myLabel;
235 else if ( theWgId == Btn )
236 aResWg = myObjects[ theId ].myBtn;
237 else if ( theWgId == Control )
238 aResWg = myObjects[ theId ].myEdit;
243 //=======================================================================
246 //=======================================================================
247 QString SalomeApp_Dialog::objectText( const int theId ) const
249 return myObjects.contains( theId ) ? myObjects[ theId ].myEdit->text() : "";
252 //=======================================================================
253 // name : setObjectText
255 //=======================================================================
256 void SalomeApp_Dialog::setObjectText( const int theId, const QString& theText )
258 if ( myObjects.contains( theId ) )
259 myObjects[ theId ].myEdit->setText( theText );
262 //=======================================================================
263 // name : selectedObject
265 //=======================================================================
266 void SalomeApp_Dialog::selectedObject( const int id, QStringList& list ) const
268 if( myObjects.contains( id ) )
269 list = myObjects[ id ].myIds;
272 //=======================================================================
273 // name : selectedObject
275 //=======================================================================
276 QString SalomeApp_Dialog::selectedObject( const int id ) const
278 if ( myObjects.contains( id ) && myObjects[ id ].myIds.count() > 0 )
279 return myObjects[ id ].myIds.first();
284 //=======================================================================
285 // name : objectSelection
287 //=======================================================================
288 void SalomeApp_Dialog::objectSelection( SelectedObjects& objs ) const
291 ObjectMap::const_iterator anIt = myObjects.begin(),
292 aLast = myObjects.end();
293 for( ; anIt!=aLast; anIt++ )
296 selectedObject( anIt.key(), ids );
298 objs.insert( anIt.key(), ids );
302 //=======================================================================
303 // name : createObject
305 //=======================================================================
306 int SalomeApp_Dialog::createObject( const QString& label, QWidget* parent, const int id )
310 for( nid=0; myObjects.contains( nid ); nid++ );
312 if( !myObjects.contains( nid ) )
314 QLabel* lab = new QLabel( label, parent );
315 myObjects[ nid ].myLabel = lab;
317 QToolButton* but = new QToolButton( parent );
318 but->setIconSet( QIconSet( myPixmap ) );
319 but->setToggleButton( true );
320 but->setMaximumWidth( but->height() );
321 but->setMinimumWidth( but->height() );
322 connect( but, SIGNAL( toggled( bool ) ), this, SLOT( onToggled( bool ) ) );
323 myObjects[ nid ].myBtn = but;
325 QLineEdit* ne = new QLineEdit( parent );
326 ne->setReadOnly( true );
327 ne->setMinimumWidth( 150 );
328 connect( ne, SIGNAL( textChanged( const QString& ) ), this, SLOT( onTextChanged( const QString& ) ) );
329 myObjects[ nid ].myEdit = ne;
331 myObjects[ nid ].myNI = OneNameOrCount;
336 //=======================================================================
337 // name : renameObject
339 //=======================================================================
340 void SalomeApp_Dialog::renameObject( const int id, const QString& label )
342 if( myObjects.contains( id ) )
343 myObjects[ id ].myLabel->setText( label );
346 //=======================================================================
347 // name : setObjectType
349 //=======================================================================
350 void SalomeApp_Dialog::setObjectType( const int id, const int type1, ... )
354 const int* tt = &type1;
361 setObjectType( id, types );
364 //=======================================================================
365 // name : setObjectType
367 //=======================================================================
368 void SalomeApp_Dialog::setObjectType( const int id, const TypesList& list )
370 if( !myObjects.contains( id ) )
373 TypesList& internal = myObjects[ id ].myPossibleTypes;
376 TypesList::const_iterator anIt = list.begin(),
378 for( ; anIt!=aLast; anIt++ )
379 types.insert( *anIt, 0 );
383 QMap<int,int>::const_iterator aMIt = types.begin(),
384 aMLast = types.end();
385 for( ; aMIt!=aMLast; aMIt++ )
386 internal.append( aMIt.key() );
391 //=======================================================================
392 // name : addObjectType
394 //=======================================================================
395 void SalomeApp_Dialog::addObjectType( const int id, const int type1, const int, ... )
397 TypesList types; objectTypes( id, types );
399 const int* tt = &type1;
406 setObjectType( id, types );
409 //=======================================================================
410 // name : addObjectType
412 //=======================================================================
413 void SalomeApp_Dialog::addObjectType( const int id, const TypesList& list )
415 TypesList types = list; objectTypes( id, types );
416 setObjectType( id, types );
419 //=======================================================================
420 // name : addObjectType
422 //=======================================================================
423 void SalomeApp_Dialog::addObjectType( const int id, const int type )
425 TypesList types; objectTypes( id, types );
426 types.append( type );
427 setObjectType( id, types );
430 //=======================================================================
431 // name : removeObjectType
433 //=======================================================================
434 void SalomeApp_Dialog::removeObjectType( const int id )
437 setObjectType( id, types );
440 //=======================================================================
441 // name : removeObjectType
443 //=======================================================================
444 void SalomeApp_Dialog::removeObjectType( const int id, const TypesList& list )
446 if( !myObjects.contains( id ) )
449 TypesList& internal = myObjects[ id ].myPossibleTypes;
452 TypesList::const_iterator anIt = internal.begin(),
453 aLast = internal.end();
454 for( ; anIt!=aLast; anIt++ )
455 types.insert( *anIt, 0 );
456 anIt = list.begin(); aLast = list.end();
457 for( ; anIt!=aLast; anIt++ )
458 types.remove( *anIt );
462 QMap<int,int>::const_iterator aMIt = types.begin(),
463 aMLast = types.end();
464 for( ; aMIt!=aMLast; aMIt++ )
465 internal.append( aMIt.key() );
470 //=======================================================================
471 // name : removeObjectType
473 //=======================================================================
474 void SalomeApp_Dialog::removeObjectType( const int id, const int type )
476 TypesList list; list.append( type );
477 removeObjectType( id, list );
480 //=======================================================================
481 // name : hasObjectType
483 //=======================================================================
484 bool SalomeApp_Dialog::hasObjectType( const int id, const int type ) const
486 if( myObjects.contains( id ) )
487 return myObjects[ id ].myPossibleTypes.contains( type );
492 //=======================================================================
493 // name : objectTypes
495 //=======================================================================
496 void SalomeApp_Dialog::objectTypes( const int id, TypesList& list ) const
498 if( myObjects.contains( id ) )
500 TypesList::const_iterator anIt = myObjects[ id ].myPossibleTypes.begin(),
501 aLast = myObjects[ id ].myPossibleTypes.end();
502 for( ; anIt!=aLast; anIt++ )
503 list.append( *anIt );
507 //=======================================================================
510 //=======================================================================
511 void SalomeApp_Dialog::onToggled( bool on )
513 QButton* but = ( QButton* )sender();
519 ObjectMap::const_iterator anIt = myObjects.begin(),
520 aLast = myObjects.end();
521 for( ; anIt!=aLast && id==-1; anIt++ )
522 if( anIt.data().myBtn==but )
529 emit objectActivated( id );
532 emit objectDeactivated( id );
535 //=======================================================================
536 // name : updateObject
538 //=======================================================================
539 void SalomeApp_Dialog::updateObject( const int id, bool emit_signal )
541 if( hasSelection( id ) )
543 Object& obj = myObjects[ id ];
544 filterTypes( id, obj.myNames, obj.myTypes, obj.myIds );
545 obj.myEdit->setText( selectionDescription( obj.myNames, obj.myTypes, obj.myNI ) );
547 emit selectionChanged( id );
551 //=======================================================================
552 // name : filterTypes
554 //=======================================================================
555 void SalomeApp_Dialog::filterTypes( const int id, QStringList& names, TypesList& types, QStringList& ids ) const
557 if( !myObjects.contains( id ) )
560 const Object& obj = myObjects[ id ];
561 if( obj.myPossibleTypes.isEmpty() )
564 QStringList new_names, new_ids;
567 TypesList::const_iterator anIt1 = types.begin(),
569 QStringList::const_iterator anIt2 = names.begin(),
571 for( ; anIt1!=aLast; anIt1++, anIt2++, anIt3++ )
572 if( obj.myPossibleTypes.contains( *anIt1 ) )
574 if( new_types.count()==1 && !multipleSelection( id ) )
577 new_names.append( *anIt2 );
578 new_types.append( *anIt1 );
579 new_ids.append( *anIt3 );
586 //=======================================================================
589 //=======================================================================
590 SUIT_ResourceMgr* SalomeApp_Dialog::resMgr() const
592 return SUIT_Session::session()->resourceMgr();
595 //=======================================================================
596 // name : setObjectPixmap
598 //=======================================================================
599 void SalomeApp_Dialog::setObjectPixmap( const QPixmap& p )
602 ObjectMap::const_iterator anIt = myObjects.begin(),
603 aLast = myObjects.end();
604 for( ; anIt!=aLast; anIt++ )
605 ( ( QToolButton* )anIt.data().myBtn )->setIconSet( p );
608 //=======================================================================
609 // name : setObjectPixmap
611 //=======================================================================
612 void SalomeApp_Dialog::setObjectPixmap( const QString& section, const QString& file )
614 SUIT_ResourceMgr* mgr = resMgr();
616 setObjectPixmap( mgr->loadPixmap( section, file ) );
619 //=======================================================================
620 // name : multipleSelection
622 //=======================================================================
623 bool SalomeApp_Dialog::multipleSelection( const int id ) const
625 return nameIndication( id )!=OneName;
628 //=======================================================================
629 // name : nameIndication
631 //=======================================================================
632 SalomeApp_Dialog::NameIndication SalomeApp_Dialog::nameIndication( const int id ) const
634 if( myObjects.contains( id ) )
635 return myObjects[ id ].myNI;
637 return OneNameOrCount;
640 //=======================================================================
641 // name : setNameIndication
643 //=======================================================================
644 void SalomeApp_Dialog::setNameIndication( const int id, const NameIndication ni )
648 ObjectMap::iterator anIt = myObjects.begin(),
650 aLast = myObjects.end();
651 for( ; anIt!=aLast; anIt++ )
653 anIt.data().myNI = ni;
654 setReadOnly( anIt.key(), isReadOnly( anIt.key() ) );
655 aNext = anIt; aNext++;
656 updateObject( anIt.key(), aNext==aLast );
659 else if( myObjects.contains( id ) )
661 myObjects[ id ].myNI = ni;
662 setReadOnly( id, isReadOnly( id ) );
663 updateObject( id, true );
667 //=======================================================================
668 // name : selectionDescription
670 //=======================================================================
671 QString SalomeApp_Dialog::selectionDescription( const QStringList& names, const TypesList& types, const NameIndication ni ) const
673 if( names.count()!=types.count() )
674 return "SalomeApp_Dialog::selectionDescription(): Error!!!";
676 if( names.isEmpty() )
677 return QString::null;
682 return names.first();
686 if( names.count()==1 )
687 return names.first();
689 return countOfTypes( types );
693 return names.join( " " );
697 return countOfTypes( types );
700 return QString::null;
703 //=======================================================================
704 // name : countOfTypes
706 //=======================================================================
707 QString SalomeApp_Dialog::countOfTypes( const TypesList& types ) const
709 QMap<int, int> typesCount;
710 QStringList typeCount;
712 TypesList::const_iterator anIt = types.begin(),
714 for( ; anIt!=aLast; anIt++ )
715 if( typesCount.contains( *anIt ) )
716 typesCount[ *anIt ]++;
718 typesCount[ *anIt ] = 1;
720 QMap<int,int>::const_iterator aMIt = typesCount.begin(),
721 aMLast = typesCount.end();
722 for( ; aMIt!=aMLast; aMIt++ )
723 typeCount.append( QString( "%1 %2" ).arg( aMIt.data() ).arg( typeName( aMIt.key() ) ) );
725 return typeCount.join( ", " );
728 //=======================================================================
731 //=======================================================================
732 QString& SalomeApp_Dialog::typeName( const int type )
734 return myTypeNames[ type ];
737 //=======================================================================
740 //=======================================================================
741 const QString& SalomeApp_Dialog::typeName( const int type ) const
743 return myTypeNames[ type ];
747 //=======================================================================
748 // name : activateObject
750 //=======================================================================
751 void SalomeApp_Dialog::activateObject( const int theId )
753 if ( myObjects.contains( theId ) && !myObjects[ theId ].myBtn->isOn() )
754 myObjects[ theId ].myBtn->toggle();
757 //=======================================================================
758 // name : deactivateAll
760 //=======================================================================
761 void SalomeApp_Dialog::deactivateAll()
763 ObjectMap::iterator anIt = myObjects.begin(),
764 aLast = myObjects.end();
765 for( ; anIt!=aLast; anIt++ )
767 QToolButton* btn = ( QToolButton* )anIt.data().myBtn;
772 //=======================================================================
773 // name : selectObject
775 //=======================================================================
776 void SalomeApp_Dialog::selectObject( const int id, const QString& name, const int type, const QString& selid, const bool update )
778 QStringList names; names.append( name );
779 TypesList types; types.append( type );
780 QStringList ids; ids.append( selid );
781 selectObject( id, names, types, ids, update );
784 //=======================================================================
785 // name : selectObject
787 //=======================================================================
788 void SalomeApp_Dialog::selectObject( const int id, const QStringList& _names, const TypesList& _types,
789 const QStringList& _ids, const bool update )
791 if( !myObjects.contains( id ) )
794 QStringList names = _names, ids = _ids;
795 TypesList types = _types;
797 filterTypes( id, names, types, ids );
799 Object& obj = myObjects[ id ];
801 obj.myEdit->setText( selectionDescription( names, types, obj.myNI ) );
806 emit selectionChanged( id );
809 //=======================================================================
810 // name : setReadOnly
812 //=======================================================================
813 void SalomeApp_Dialog::setReadOnly( const int id, const bool ro )
815 if( myObjects.contains( id ) )
816 myObjects[ id ].myEdit->setReadOnly( nameIndication( id )==ListOfNames || nameIndication( id )==OneName ? ro : true );
819 //=======================================================================
822 //=======================================================================
823 bool SalomeApp_Dialog::isReadOnly( const int id ) const
825 if( myObjects.contains( id ) )
826 return myObjects[ id ].myEdit->isReadOnly();
831 //=======================================================================
832 // name : onTextChanged
834 //=======================================================================
835 void SalomeApp_Dialog::onTextChanged( const QString& text )
842 if( sender() && sender()->inherits( "QLineEdit" ) )
844 QLineEdit* edit = ( QLineEdit* )sender();
846 ObjectMap::const_iterator anIt = myObjects.begin(),
847 aLast = myObjects.end();
848 for( ; anIt!=aLast; anIt++ )
849 if( anIt.data().myEdit == edit )
852 if( id>=0 && !isReadOnly( id ) )
854 QStringList list = QStringList::split( " ", text );
855 emit objectChanged( id, list );