--- /dev/null
+// File: SalomeApp_Dialog.cxx
+// Author: Alexander SOLOVYOV
+
+#include <SalomeApp_Dialog.h>
+#include <SUIT_Session.h>
+
+#include <qtoolbutton.h>
+#include <qlineedit.h>
+#include <qlabel.h>
+
+/*
+ Class : SalomeApp_Dialog
+ Description : Base class for all SALOME dialogs
+*/
+
+//=======================================================================
+// name : SalomeApp_Dialog
+// Purpose : Constructor
+//=======================================================================
+SalomeApp_Dialog::SalomeApp_Dialog( QWidget* parent, const char* name, bool modal,
+ bool allowResize, const int f, WFlags wf )
+: QtxDialog( parent, name, modal, allowResize, f, wf ),
+ myIsExclusive( true ),
+ myIsBusy( false )
+{
+ setObjectPixmap( "SalomeApp", tr( "ICON_SELECT" ) );
+}
+
+//=======================================================================
+// name : ~SalomeApp_Dialog
+// Purpose : Destructor
+//=======================================================================
+SalomeApp_Dialog::~SalomeApp_Dialog()
+{
+}
+
+//=======================================================================
+// name : show
+// Purpose :
+//=======================================================================
+void SalomeApp_Dialog::show()
+{
+ QtxDialog::show();
+}
+
+//=======================================================================
+// name : isExclusive
+// Purpose :
+//=======================================================================
+bool SalomeApp_Dialog::isExclusive() const
+{
+ return myIsExclusive;
+}
+
+//=======================================================================
+// name : updateButtons
+// Purpose :
+//=======================================================================
+void SalomeApp_Dialog::updateButtons( const int _id )
+{
+ if( !myIsExclusive )
+ return;
+
+ int id = _id;
+
+ ObjectMap::const_iterator anIt = myObjects.begin(),
+ aLast = myObjects.end();
+ for( ; anIt!=aLast; anIt++ )
+ {
+ QToolButton* but = (QToolButton*)anIt.data().myBtn;
+ if( but && but->isOn() )
+ {
+ if( id==-1 )
+ id = anIt.key();
+
+ if( anIt.key()!=id )
+ but->setOn( false );
+ }
+ }
+}
+
+//=======================================================================
+// name : setExclusive
+// Purpose :
+//=======================================================================
+void SalomeApp_Dialog::setExclusive( const bool ex )
+{
+ myIsExclusive = ex;
+ updateButtons();
+}
+
+//=======================================================================
+// name : showObject
+// Purpose :
+//=======================================================================
+void SalomeApp_Dialog::showObject( const int id )
+{
+ setObjectShown( id, true );
+}
+
+//=======================================================================
+// name : hideObject
+// Purpose :
+//=======================================================================
+void SalomeApp_Dialog::hideObject( const int id )
+{
+ setObjectShown( id, false );
+}
+
+//=======================================================================
+// name : setObjectShown
+// Purpose :
+//=======================================================================
+void SalomeApp_Dialog::setObjectShown( const int id, const bool shown )
+{
+ if( myObjects.contains( id ) && isObjectShown( id )!=shown )
+ {
+ Object& obj = myObjects[ id ];
+ obj.myEdit->setShown( shown );
+ obj.myBtn->setShown( shown );
+ obj.myLabel->setShown( shown );
+ if( !shown )
+ ( ( QToolButton* )obj.myBtn )->setOn( false );
+ }
+}
+
+//=======================================================================
+// name : isObjectShown
+// Purpose :
+//=======================================================================
+bool SalomeApp_Dialog::isObjectShown( const int id ) const
+{
+ return myObjects.contains( id ) && myObjects[ id ].myEdit->isShown();
+}
+
+//=======================================================================
+// name : setObjectEnabled
+// Purpose :
+//=======================================================================
+void SalomeApp_Dialog::setObjectEnabled( const int id, const bool en )
+{
+ if( myObjects.contains( id ) && isObjectEnabled( id )!=en )
+ {
+ Object& obj = myObjects[ id ];
+ obj.myEdit->setEnabled( en );
+ obj.myBtn->setEnabled( en );
+// obj.myLabel->setEnabled( en );
+ if( !en )
+ ( ( QToolButton* )obj.myBtn )->setOn( false );
+ }
+}
+
+//=======================================================================
+// name : isObjectEnabled
+// Purpose :
+//=======================================================================
+bool SalomeApp_Dialog::isObjectEnabled( const int id ) const
+{
+ return myObjects.contains( id ) && myObjects[ id ].myEdit->isEnabled();
+}
+
+//=======================================================================
+// name : selectObject
+// Purpose :
+//=======================================================================
+void SalomeApp_Dialog::selectObject( const QString& name, const int type, const QString& id, const bool update )
+{
+ QStringList names; names.append( name );
+ TypesList types; types.append( type );
+ QStringList ids; ids.append( id );
+ selectObject( names, types, ids, update );
+}
+
+//=======================================================================
+// name : selectObject
+// Purpose :
+//=======================================================================
+void SalomeApp_Dialog::selectObject( const QStringList& _names,
+ const TypesList& _types,
+ const QStringList& _ids,
+ const bool update )
+{
+ ObjectMap::iterator anIt = myObjects.begin(),
+ aLast = myObjects.end();
+ for( ; anIt!=aLast; anIt++ )
+ if( anIt.data().myBtn->isOn() )
+ selectObject( anIt.key(), _names, _types, _ids, update );
+}
+
+//=======================================================================
+// name : hasSelection
+// Purpose :
+//=======================================================================
+bool SalomeApp_Dialog::hasSelection( const int id ) const
+{
+ return myObjects.contains( id ) && !myObjects[ id ].myIds.isEmpty();
+}
+
+//=======================================================================
+// name : clearSelection
+// Purpose :
+//=======================================================================
+void SalomeApp_Dialog::clearSelection( const int id )
+{
+ if( id==-1 )
+ {
+ ObjectMap::const_iterator anIt = myObjects.begin(),
+ aLast = myObjects.end();
+ for( ; anIt!=aLast; anIt++ )
+ clearSelection( anIt.key() );
+ }
+
+ else if( myObjects.contains( id ) )
+ {
+ myObjects[ id ].myIds.clear();
+ myObjects[ id ].myTypes.clear();
+ myObjects[ id ].myNames.clear();
+
+ myObjects[ id ].myEdit->setText( QString::null );
+ emit selectionChanged( id );
+ }
+}
+
+//=======================================================================
+// name : objectWg
+// Purpose :
+//=======================================================================
+QWidget* SalomeApp_Dialog::objectWg( const int theId, const int theWgId ) const
+{
+ QWidget* aResWg = 0;
+ if( myObjects.contains( theId ) )
+ {
+ if ( theWgId == Label )
+ aResWg = myObjects[ theId ].myLabel;
+ else if ( theWgId == Btn )
+ aResWg = myObjects[ theId ].myBtn;
+ else if ( theWgId == Control )
+ aResWg = myObjects[ theId ].myEdit;
+ }
+ return aResWg;
+}
+
+//=======================================================================
+// name : objectText
+// Purpose :
+//=======================================================================
+QString SalomeApp_Dialog::objectText( const int theId ) const
+{
+ return myObjects.contains( theId ) ? myObjects[ theId ].myEdit->text() : "";
+}
+
+//=======================================================================
+// name : setObjectText
+// Purpose :
+//=======================================================================
+void SalomeApp_Dialog::setObjectText( const int theId, const QString& theText )
+{
+ if ( myObjects.contains( theId ) )
+ myObjects[ theId ].myEdit->setText( theText );
+}
+
+//=======================================================================
+// name : selectedObject
+// Purpose :
+//=======================================================================
+void SalomeApp_Dialog::selectedObject( const int id, QStringList& list ) const
+{
+ if( myObjects.contains( id ) )
+ list = myObjects[ id ].myIds;
+}
+
+//=======================================================================
+// name : selectedObject
+// Purpose :
+//=======================================================================
+QString SalomeApp_Dialog::selectedObject( const int id ) const
+{
+ if ( myObjects.contains( id ) && myObjects[ id ].myIds.count() > 0 )
+ return myObjects[ id ].myIds.first();
+ else
+ return "";
+}
+
+//=======================================================================
+// name : objectSelection
+// Purpose :
+//=======================================================================
+void SalomeApp_Dialog::objectSelection( SelectedObjects& objs ) const
+{
+ //objs.clear();
+ ObjectMap::const_iterator anIt = myObjects.begin(),
+ aLast = myObjects.end();
+ for( ; anIt!=aLast; anIt++ )
+ {
+ QStringList ids;
+ selectedObject( anIt.key(), ids );
+ if( !ids.isEmpty() )
+ objs.insert( anIt.key(), ids );
+ }
+}
+
+//=======================================================================
+// name : createObject
+// Purpose :
+//=======================================================================
+int SalomeApp_Dialog::createObject( const QString& label, QWidget* parent, const int id )
+{
+ int nid = id;
+ if( nid<0 )
+ for( nid=0; myObjects.contains( nid ); nid++ );
+
+ if( !myObjects.contains( nid ) )
+ {
+ QLabel* lab = new QLabel( label, parent );
+ myObjects[ nid ].myLabel = lab;
+
+ QToolButton* but = new QToolButton( parent );
+ but->setIconSet( QIconSet( myPixmap ) );
+ but->setToggleButton( true );
+ but->setMaximumWidth( but->height() );
+ but->setMinimumWidth( but->height() );
+ connect( but, SIGNAL( toggled( bool ) ), this, SLOT( onToggled( bool ) ) );
+ myObjects[ nid ].myBtn = but;
+
+ QLineEdit* ne = new QLineEdit( parent );
+ ne->setReadOnly( true );
+ ne->setMinimumWidth( 150 );
+ connect( ne, SIGNAL( textChanged( const QString& ) ), this, SLOT( onTextChanged( const QString& ) ) );
+ myObjects[ nid ].myEdit = ne;
+
+ myObjects[ nid ].myNI = OneNameOrCount;
+ }
+ return nid;
+}
+
+//=======================================================================
+// name : renameObject
+// Purpose :
+//=======================================================================
+void SalomeApp_Dialog::renameObject( const int id, const QString& label )
+{
+ if( myObjects.contains( id ) )
+ myObjects[ id ].myLabel->setText( label );
+}
+
+//=======================================================================
+// name : setObjectType
+// Purpose :
+//=======================================================================
+void SalomeApp_Dialog::setObjectType( const int id, const int type1, ... )
+{
+ TypesList types;
+
+ const int* tt = &type1;
+ while( *tt>=0 )
+ {
+ types.append( *tt );
+ tt++;
+ }
+
+ setObjectType( id, types );
+}
+
+//=======================================================================
+// name : setObjectType
+// Purpose :
+//=======================================================================
+void SalomeApp_Dialog::setObjectType( const int id, const TypesList& list )
+{
+ if( !myObjects.contains( id ) )
+ return;
+
+ TypesList& internal = myObjects[ id ].myPossibleTypes;
+
+ QMap<int,int> types;
+ TypesList::const_iterator anIt = list.begin(),
+ aLast = list.end();
+ for( ; anIt!=aLast; anIt++ )
+ types.insert( *anIt, 0 );
+
+
+ internal.clear();
+ QMap<int,int>::const_iterator aMIt = types.begin(),
+ aMLast = types.end();
+ for( ; aMIt!=aMLast; aMIt++ )
+ internal.append( aMIt.key() );
+
+ updateObject( id );
+}
+
+//=======================================================================
+// name : addObjectType
+// Purpose :
+//=======================================================================
+void SalomeApp_Dialog::addObjectType( const int id, const int type1, const int, ... )
+{
+ TypesList types; objectTypes( id, types );
+
+ const int* tt = &type1;
+ while( *tt>=0 )
+ {
+ types.append( *tt );
+ tt++;
+ }
+
+ setObjectType( id, types );
+}
+
+//=======================================================================
+// name : addObjectType
+// Purpose :
+//=======================================================================
+void SalomeApp_Dialog::addObjectType( const int id, const TypesList& list )
+{
+ TypesList types = list; objectTypes( id, types );
+ setObjectType( id, types );
+}
+
+//=======================================================================
+// name : addObjectType
+// Purpose :
+//=======================================================================
+void SalomeApp_Dialog::addObjectType( const int id, const int type )
+{
+ TypesList types; objectTypes( id, types );
+ types.append( type );
+ setObjectType( id, types );
+}
+
+//=======================================================================
+// name : removeObjectType
+// Purpose :
+//=======================================================================
+void SalomeApp_Dialog::removeObjectType( const int id )
+{
+ TypesList types;
+ setObjectType( id, types );
+}
+
+//=======================================================================
+// name : removeObjectType
+// Purpose :
+//=======================================================================
+void SalomeApp_Dialog::removeObjectType( const int id, const TypesList& list )
+{
+ if( !myObjects.contains( id ) )
+ return;
+
+ TypesList& internal = myObjects[ id ].myPossibleTypes;
+
+ QMap<int,int> types;
+ TypesList::const_iterator anIt = internal.begin(),
+ aLast = internal.end();
+ for( ; anIt!=aLast; anIt++ )
+ types.insert( *anIt, 0 );
+ anIt = list.begin(); aLast = list.end();
+ for( ; anIt!=aLast; anIt++ )
+ types.remove( *anIt );
+
+
+ internal.clear();
+ QMap<int,int>::const_iterator aMIt = types.begin(),
+ aMLast = types.end();
+ for( ; aMIt!=aMLast; aMIt++ )
+ internal.append( aMIt.key() );
+
+ updateObject( id );
+}
+
+//=======================================================================
+// name : removeObjectType
+// Purpose :
+//=======================================================================
+void SalomeApp_Dialog::removeObjectType( const int id, const int type )
+{
+ TypesList list; list.append( type );
+ removeObjectType( id, list );
+}
+
+//=======================================================================
+// name : hasObjectType
+// Purpose :
+//=======================================================================
+bool SalomeApp_Dialog::hasObjectType( const int id, const int type ) const
+{
+ if( myObjects.contains( id ) )
+ return myObjects[ id ].myPossibleTypes.contains( type );
+ else
+ return false;
+}
+
+//=======================================================================
+// name : objectTypes
+// Purpose :
+//=======================================================================
+void SalomeApp_Dialog::objectTypes( const int id, TypesList& list ) const
+{
+ if( myObjects.contains( id ) )
+ {
+ TypesList::const_iterator anIt = myObjects[ id ].myPossibleTypes.begin(),
+ aLast = myObjects[ id ].myPossibleTypes.end();
+ for( ; anIt!=aLast; anIt++ )
+ list.append( *anIt );
+ }
+}
+
+//=======================================================================
+// name : onToggled
+// Purpose :
+//=======================================================================
+void SalomeApp_Dialog::onToggled( bool on )
+{
+ QButton* but = ( QButton* )sender();
+ int id = -1;
+
+ if( !but )
+ return;
+
+ ObjectMap::const_iterator anIt = myObjects.begin(),
+ aLast = myObjects.end();
+ for( ; anIt!=aLast && id==-1; anIt++ )
+ if( anIt.data().myBtn==but )
+ id = anIt.key();
+
+ if( id!=-1 )
+ if( on )
+ {
+ emit objectActivated( id );
+ updateButtons( id );
+ }
+ else
+ emit objectDeactivated( id );
+}
+
+//=======================================================================
+// name : updateObject
+// Purpose :
+//=======================================================================
+void SalomeApp_Dialog::updateObject( const int id, bool emit_signal )
+{
+ if( hasSelection( id ) )
+ {
+ Object& obj = myObjects[ id ];
+ filterTypes( id, obj.myNames, obj.myTypes, obj.myIds );
+ obj.myEdit->setText( selectionDescription( obj.myNames, obj.myTypes, obj.myNI ) );
+ if( emit_signal )
+ emit selectionChanged( id );
+ }
+}
+
+//=======================================================================
+// name : filterTypes
+// Purpose :
+//=======================================================================
+void SalomeApp_Dialog::filterTypes( const int id, QStringList& names, TypesList& types, QStringList& ids ) const
+{
+ if( !myObjects.contains( id ) )
+ return;
+
+ const Object& obj = myObjects[ id ];
+ if( obj.myPossibleTypes.isEmpty() )
+ return;
+
+ QStringList new_names, new_ids;
+ TypesList new_types;
+
+ TypesList::const_iterator anIt1 = types.begin(),
+ aLast = types.end();
+ QStringList::const_iterator anIt2 = names.begin(),
+ anIt3 = ids.begin();
+ for( ; anIt1!=aLast; anIt1++, anIt2++, anIt3++ )
+ if( obj.myPossibleTypes.contains( *anIt1 ) )
+ {
+ if( new_types.count()==1 && !multipleSelection( id ) )
+ break;
+
+ new_names.append( *anIt2 );
+ new_types.append( *anIt1 );
+ new_ids.append( *anIt3 );
+ }
+ names = new_names;
+ types = new_types;
+ ids = new_ids;
+}
+
+//=======================================================================
+// name : resMgr
+// Purpose :
+//=======================================================================
+SUIT_ResourceMgr* SalomeApp_Dialog::resMgr() const
+{
+ return SUIT_Session::session()->resourceMgr();
+}
+
+//=======================================================================
+// name : setObjectPixmap
+// Purpose :
+//=======================================================================
+void SalomeApp_Dialog::setObjectPixmap( const QPixmap& p )
+{
+ myPixmap = p;
+ ObjectMap::const_iterator anIt = myObjects.begin(),
+ aLast = myObjects.end();
+ for( ; anIt!=aLast; anIt++ )
+ ( ( QToolButton* )anIt.data().myBtn )->setIconSet( p );
+}
+
+//=======================================================================
+// name : setObjectPixmap
+// Purpose :
+//=======================================================================
+void SalomeApp_Dialog::setObjectPixmap( const QString& section, const QString& file )
+{
+ SUIT_ResourceMgr* mgr = resMgr();
+ if( mgr )
+ setObjectPixmap( mgr->loadPixmap( section, file ) );
+}
+
+//=======================================================================
+// name : multipleSelection
+// Purpose :
+//=======================================================================
+bool SalomeApp_Dialog::multipleSelection( const int id ) const
+{
+ return nameIndication( id )!=OneName;
+}
+
+//=======================================================================
+// name : nameIndication
+// Purpose :
+//=======================================================================
+SalomeApp_Dialog::NameIndication SalomeApp_Dialog::nameIndication( const int id ) const
+{
+ if( myObjects.contains( id ) )
+ return myObjects[ id ].myNI;
+ else
+ return OneNameOrCount;
+}
+
+//=======================================================================
+// name : setNameIndication
+// Purpose :
+//=======================================================================
+void SalomeApp_Dialog::setNameIndication( const int id, const NameIndication ni )
+{
+ if( id==-1 )
+ {
+ ObjectMap::iterator anIt = myObjects.begin(),
+ aNext,
+ aLast = myObjects.end();
+ for( ; anIt!=aLast; anIt++ )
+ {
+ anIt.data().myNI = ni;
+ setReadOnly( anIt.key(), isReadOnly( anIt.key() ) );
+ aNext = anIt; aNext++;
+ updateObject( anIt.key(), aNext==aLast );
+ }
+ }
+ else if( myObjects.contains( id ) )
+ {
+ myObjects[ id ].myNI = ni;
+ setReadOnly( id, isReadOnly( id ) );
+ updateObject( id, true );
+ }
+}
+
+//=======================================================================
+// name : selectionDescription
+// Purpose :
+//=======================================================================
+QString SalomeApp_Dialog::selectionDescription( const QStringList& names, const TypesList& types, const NameIndication ni ) const
+{
+ if( names.count()!=types.count() )
+ return "SalomeApp_Dialog::selectionDescription(): Error!!!";
+
+ if( names.isEmpty() )
+ return QString::null;
+
+ switch( ni )
+ {
+ case OneName:
+ return names.first();
+ break;
+
+ case OneNameOrCount:
+ if( names.count()==1 )
+ return names.first();
+ else
+ return countOfTypes( types );
+ break;
+
+ case ListOfNames:
+ return names.join( " " );
+ break;
+
+ case Count:
+ return countOfTypes( types );
+ break;
+ };
+ return QString::null;
+}
+
+//=======================================================================
+// name : countOfTypes
+// Purpose :
+//=======================================================================
+QString SalomeApp_Dialog::countOfTypes( const TypesList& types ) const
+{
+ QMap<int, int> typesCount;
+ QStringList typeCount;
+
+ TypesList::const_iterator anIt = types.begin(),
+ aLast = types.end();
+ for( ; anIt!=aLast; anIt++ )
+ if( typesCount.contains( *anIt ) )
+ typesCount[ *anIt ]++;
+ else
+ typesCount[ *anIt ] = 1;
+
+ QMap<int,int>::const_iterator aMIt = typesCount.begin(),
+ aMLast = typesCount.end();
+ for( ; aMIt!=aMLast; aMIt++ )
+ typeCount.append( QString( "%1 %2" ).arg( aMIt.data() ).arg( typeName( aMIt.key() ) ) );
+
+ return typeCount.join( ", " );
+}
+
+//=======================================================================
+// name : typeName
+// Purpose :
+//=======================================================================
+QString& SalomeApp_Dialog::typeName( const int type )
+{
+ return myTypeNames[ type ];
+}
+
+//=======================================================================
+// name : typeName
+// Purpose :
+//=======================================================================
+const QString& SalomeApp_Dialog::typeName( const int type ) const
+{
+ return myTypeNames[ type ];
+}
+
+
+//=======================================================================
+// name : activateObject
+// Purpose :
+//=======================================================================
+void SalomeApp_Dialog::activateObject( const int theId )
+{
+ if ( myObjects.contains( theId ) && !myObjects[ theId ].myBtn->isOn() )
+ myObjects[ theId ].myBtn->toggle();
+}
+
+//=======================================================================
+// name : deactivateAll
+// Purpose :
+//=======================================================================
+void SalomeApp_Dialog::deactivateAll()
+{
+ ObjectMap::iterator anIt = myObjects.begin(),
+ aLast = myObjects.end();
+ for( ; anIt!=aLast; anIt++ )
+ {
+ QToolButton* btn = ( QToolButton* )anIt.data().myBtn;
+ btn->setOn( false );
+ }
+}
+
+//=======================================================================
+// name : selectObject
+// Purpose :
+//=======================================================================
+void SalomeApp_Dialog::selectObject( const int id, const QString& name, const int type, const QString& selid, const bool update )
+{
+ QStringList names; names.append( name );
+ TypesList types; types.append( type );
+ QStringList ids; ids.append( selid );
+ selectObject( id, names, types, ids, update );
+}
+
+//=======================================================================
+// name : selectObject
+// Purpose :
+//=======================================================================
+void SalomeApp_Dialog::selectObject( const int id, const QStringList& _names, const TypesList& _types,
+ const QStringList& _ids, const bool update )
+{
+ if( !myObjects.contains( id ) )
+ return;
+
+ QStringList names = _names, ids = _ids;
+ TypesList types = _types;
+
+ filterTypes( id, names, types, ids );
+
+ Object& obj = myObjects[ id ];
+ if( update )
+ obj.myEdit->setText( selectionDescription( names, types, obj.myNI ) );
+ obj.myTypes = types;
+ obj.myIds = ids;
+ obj.myNames = names;
+
+ emit selectionChanged( id );
+}
+
+//=======================================================================
+// name : setReadOnly
+// Purpose :
+//=======================================================================
+void SalomeApp_Dialog::setReadOnly( const int id, const bool ro )
+{
+ if( myObjects.contains( id ) )
+ myObjects[ id ].myEdit->setReadOnly( nameIndication( id )==ListOfNames || nameIndication( id )==OneName ? ro : true );
+}
+
+//=======================================================================
+// name : isReadOnly
+// Purpose :
+//=======================================================================
+bool SalomeApp_Dialog::isReadOnly( const int id ) const
+{
+ if( myObjects.contains( id ) )
+ return myObjects[ id ].myEdit->isReadOnly();
+ else
+ return true;
+}
+
+//=======================================================================
+// name : onTextChanged
+// Purpose :
+//=======================================================================
+void SalomeApp_Dialog::onTextChanged( const QString& text )
+{
+ if( myIsBusy )
+ return;
+
+ myIsBusy = true;
+
+ if( sender() && sender()->inherits( "QLineEdit" ) )
+ {
+ QLineEdit* edit = ( QLineEdit* )sender();
+ int id = -1;
+ ObjectMap::const_iterator anIt = myObjects.begin(),
+ aLast = myObjects.end();
+ for( ; anIt!=aLast; anIt++ )
+ if( anIt.data().myEdit == edit )
+ id = anIt.key();
+
+ if( id>=0 && !isReadOnly( id ) )
+ {
+ QStringList list = QStringList::split( " ", text );
+ emit objectChanged( id, list );
+ }
+ }
+
+ myIsBusy = false;
+}
--- /dev/null
+// File: SalomeApp_Dialog.h
+// Author: Alexander SOLOVYOV
+
+#ifndef SALOMEAPP_DIALOG_H
+#define SALOMEAPP_DIALOG_H
+
+#include <QtxDialog.h>
+
+#include <qvaluelist.h>
+#include <qmap.h>
+#include <qpixmap.h>
+
+class QLineEdit;
+class QButton;
+class QLabel;
+
+class SUIT_ResourceMgr;
+
+/*
+ Class : SalomeApp_Dialog
+ Description : Base class for all SALOME dialogs
+*/
+class SalomeApp_Dialog : public QtxDialog
+{
+ Q_OBJECT
+
+public:
+ typedef QValueList<int> TypesList;
+ typedef QMap<int,QStringList> SelectedObjects;
+
+ enum ObjectWg
+ {
+ Label = 0x00000001,
+ Btn = 0x00000002,
+ Control = 0x00000004
+ };
+
+ typedef enum
+ {
+ OneName, //<! only one object can be selected and it's name is shown
+ OneNameOrCount, //<! if one object is selected, it's name is shown otherwise
+ // "<count> <type>" is shown
+ ListOfNames, //! list of all names is shown
+ Count //! In every case "<count> <type>" is shown
+
+ } NameIndication;
+ //! The enumeration describing how names of selected objects will be shown in line edit
+ //! For more details see above
+
+public:
+ SalomeApp_Dialog( QWidget* = 0, const char* = 0, bool = false,
+ bool = false, const int = Standard, WFlags = 0 );
+ virtual ~SalomeApp_Dialog();
+
+ virtual void show();
+
+ //! Check if buttons is exclusive (as radiobuttons)
+ bool isExclusive() const;
+
+ //! Set exclusive state
+ void setExclusive( const bool );
+
+ //! Check if operation according to dialog will be resumed automatically when mouse enter the dialog
+ bool isAutoResumed() const;
+
+ //! Set auto resumed state
+ void setAutoResumed( const bool );
+
+ //! Show widgets corresponding to id
+ void showObject( const int );
+
+ //! Hide widgets corresponding to id
+ void hideObject( const int );
+
+ //! Change the shown state of widgets corresponding to id
+ void setObjectShown( const int, const bool );
+
+ //! Check the shown state
+ bool isObjectShown( const int ) const;
+
+ //! Change the enabled state of widgets corresponding to id
+ void setObjectEnabled( const int, const bool );
+
+ //! Check the enabled state
+ bool isObjectEnabled( const int ) const;
+
+ //! Get widget of object (see ObjectWg enumeration)
+ QWidget* objectWg( const int theId, const int theWgId ) const;
+
+ //! Pass to all active widgets name, type and id of selected object
+ void selectObject( const QString&, const int, const QString&, const bool = true );
+
+ /*!
+ Pass to all active widgets list of names, types and ids of selected objects
+ Every active widget filters list and accept only objects with possible types
+ */
+ void selectObject( const QStringList&, const TypesList&, const QStringList&, const bool = true );
+
+ //! Get text of object's control
+ QString objectText( const int ) const;
+
+ //! Set text of object's control
+ void setObjectText( const int, const QString& );
+
+ //! Select in certain widget avoiding check if there is active widget
+ void selectObject( const int, const QString&, const int, const QString&, const bool = true );
+ void selectObject( const int, const QStringList&, const TypesList&, const QStringList&, const bool = true );
+
+ //! Check if certain widget has selection
+ bool hasSelection( const int ) const;
+
+ //! Clear selection in widgets. If parameter is -1, then selection in all widgets will be cleared
+ void clearSelection( const int = -1 );
+
+ //! Get ids list of object selected in certain widget
+ void selectedObject( const int, QStringList& ) const;
+
+ //! Get ids list of object selected in certain widget
+ QString selectedObject( const int ) const;
+
+ //! Get map "widget id -> ids list"
+ void objectSelection( SelectedObjects& ) const;
+
+ //! Activate object selection button
+ void activateObject( const int );
+
+ //! Set all object selection buttons to inactive state
+ void deactivateAll();
+
+signals:
+ //! selection in certain widget is changed
+ void selectionChanged ( int );
+
+ //! selection in certain widget is on
+ void objectActivated ( int );
+
+ //! selection in certain widget is off
+ void objectDeactivated( int );
+
+ /*
+ text representation of selection is changed
+ it is emitted only if "read only" state of line edit is false
+ */
+ void objectChanged( int, const QStringList& );
+
+protected:
+ //! Finds and returns resource manager
+ SUIT_ResourceMgr* resMgr() const;
+
+ /*! Create label, button and line edit for object selection
+ * If passed id is negative, then id will be calculated automatically (first free id)
+ * Returns the same id (if id>=0) or calculated
+ */
+ int createObject ( const QString&, QWidget*, const int = -1 );
+
+ //! Set pixmap as icon for all selection buttons
+ void setObjectPixmap ( const QPixmap& );
+
+ //! Load pixmap with section, name using resource manager and set as icon for all selection buttons
+ void setObjectPixmap ( const QString&, const QString& );
+
+ //! Change label
+ void renameObject ( const int, const QString& );
+
+ //! Set possible types for certain id. The list of arguments must be finished by negative integer
+ void setObjectType ( const int, const int, ... );
+
+ //! Set list as possible types for object selection
+ void setObjectType ( const int, const TypesList& );
+
+ /*!
+ Add types to list of possible types
+ The list of arguments must be finished by negative integer
+ */
+ void addObjectType ( const int, const int, const int, ... );
+
+ //! Add types to list of possible types
+ void addObjectType ( const int, const TypesList& );
+
+ //! Add type to list of possible types
+ void addObjectType ( const int, const int );
+
+ //! Clear list of possible types (it means, that all types are welcome)
+ void removeObjectType( const int );
+
+ //! Remove types in list from list of possible types
+ void removeObjectType( const int, const TypesList& );
+
+ //! Remove a type from list of possible types
+ void removeObjectType( const int, const int );
+
+ //! Check if list of possible types contains this one
+ bool hasObjectType ( const int, const int ) const;
+
+ //! Return list of possible types
+ void objectTypes ( const int, TypesList& ) const;
+
+ //!Change and get type name for indicating in selection widget
+ QString& typeName( const int );
+ const QString& typeName( const int ) const;
+
+ //! Create string contains selection list by list of names, list of types and current name indication state
+ virtual QString selectionDescription( const QStringList&, const TypesList&, const NameIndication ) const;
+
+ //! Create string by pattern "<count> <type>" for current list of types
+ virtual QString countOfTypes( const TypesList& ) const;
+
+ //! Get and set name indication for certain widget
+ NameIndication nameIndication( const int ) const;
+ void setNameIndication( const int, const NameIndication );
+
+ //! Check using name indication if multiple selection in possible
+ bool multipleSelection( const int ) const;
+
+ //! Set the "read only" state of object selection line edit
+ //! The "read only" will be false only if name indication is ListOfNames
+ void setReadOnly( const int, const bool );
+
+ //! Check the "read only" state of object selection line edit
+ bool isReadOnly( const int ) const;
+
+private slots:
+ //! emits if the object selection button changes state
+ void onToggled( bool );
+
+ //! text in some line edit is changed
+ void onTextChanged( const QString& );
+
+private:
+ /*!
+ If buttons are exclusive, set to "off" all buttons except one with id
+ If id=-1, then all buttons, except first with "on" state, will be set to "off"
+ */
+ void updateButtons( const int = -1 );
+
+ /*!
+ Filter types and update selection string in line edit
+ If bool is true, then signal is emitted
+ */
+ void updateObject( const int, bool = true );
+
+ //! Remove from list not possible types and remove from names and ids lists the corresponding items
+ void filterTypes( const int, QStringList&, TypesList&, QStringList& ) const;
+
+private:
+ typedef struct
+ {
+ QLineEdit* myEdit;
+ QButton* myBtn;
+ QLabel* myLabel;
+ QStringList myNames, myIds;
+ TypesList myTypes, myPossibleTypes;
+ NameIndication myNI;
+
+ } Object;
+
+ typedef QMap<int, Object> ObjectMap;
+
+private:
+ ObjectMap myObjects;
+ QMap<int,QString> myTypeNames;
+ bool myIsExclusive, myIsBusy;
+ QPixmap myPixmap;
+};
+
+#endif