From dca4070fd0e7b12c6ae29125ba038a0ed45d69fa Mon Sep 17 00:00:00 2001 From: caremoli Date: Tue, 28 Sep 2010 15:13:30 +0000 Subject: [PATCH] CCAR: update with V5_1_main (28/09) --- configure.ac | 2 + doc/salome/gui/images/pref11.png | Bin 26832 -> 26559 bytes doc/salome/gui/images/pref41.png | Bin 0 -> 21011 bytes doc/salome/gui/input/salome_preferences.doc | 12 + src/CAF/Makefile.am | 3 +- src/CAF/resources/CAF_msg_en.ts | 27 +- src/CAF/resources/CAF_msg_fr.ts | 59 ++ src/CAM/CAM_Module.cxx | 5 +- src/CAM/CAM_Module.h | 2 +- src/CAM/Makefile.am | 2 +- src/CAM/resources/CAM_msg_en.ts | 27 +- src/CAM/resources/CAM_msg_fr.ts | 19 + src/GLViewer/Makefile.am | 3 +- src/GLViewer/resources/GLViewer_msg_en.ts | 27 +- src/GLViewer/resources/GLViewer_msg_fr.ts | 117 +++ src/LightApp/LightApp.qrc | 7 + src/LightApp/LightApp_Application.cxx | 29 + src/LightApp/LightApp_Module.cxx | 21 +- src/LightApp/Makefile.am | 10 +- src/LightApp/images/en.png | Bin 0 -> 599 bytes src/LightApp/images/fr.png | Bin 0 -> 545 bytes src/LightApp/resources/LightApp.xml | 26 + src/LightApp/resources/LightApp_msg_en.ts | 53 +- src/LightApp/resources/LightApp_msg_fr.ts | 752 ++++++++++++++ src/LogWindow/Makefile.am | 3 +- src/LogWindow/resources/LogWindow_msg_en.ts | 25 +- src/LogWindow/resources/LogWindow_msg_fr.ts | 42 + src/OCCViewer/Makefile.am | 3 +- src/OCCViewer/OCCViewer_ViewWindow.cxx | 24 +- src/OCCViewer/resources/OCCViewer_msg_en.ts | 27 +- src/OCCViewer/resources/OCCViewer_msg_fr.ts | 310 ++++++ src/ObjBrowser/Makefile.am | 2 +- src/ObjBrowser/resources/OB_msg_en.ts | 26 +- src/ObjBrowser/resources/OB_msg_fr.ts | 38 + src/Plot2d/Makefile.am | 3 +- src/Plot2d/Plot2d_ViewFrame.cxx | 4 + src/Plot2d/Plot2d_ViewModel.cxx | 4 +- src/Plot2d/resources/Plot2d_msg_en.ts | 27 +- src/Plot2d/resources/Plot2d_msg_fr.ts | 511 +++++++++ src/PyConsole/Makefile.am | 3 +- src/PyConsole/resources/PyConsole_msg_en.ts | 31 +- src/PyConsole/resources/PyConsole_msg_fr.ts | 42 + src/QDS/Makefile.am | 2 +- src/QDS/resources/QDS_msg_en.ts | 29 +- src/QDS/resources/QDS_msg_fr.ts | 51 + src/Qtx/Makefile.am | 5 +- src/Qtx/QtxAction.cxx | 49 +- src/Qtx/QtxAction.h | 12 +- src/Qtx/QtxColorButton.cxx | 2 +- src/Qtx/QtxPagePrefMgr.cxx | 12 +- src/Qtx/QtxResourceMgr.cxx | 9 + src/Qtx/QtxShortcutEdit.cxx | 87 +- src/Qtx/QtxShortcutEdit.h | 3 + src/Qtx/QtxTreeView.cxx | 2 +- src/Qtx/resources/Qtx_msg_fr.ts | 286 +++++ src/QxGraph/Makefile.am | 3 +- src/QxGraph/resources/QxGraph_msg_en.ts | 27 +- src/QxGraph/resources/QxGraph_msg_fr.ts | 31 + src/QxScene/Makefile.am | 3 +- src/QxScene/resources/QxSceneViewer_msg_en.ts | 27 +- src/QxScene/resources/QxSceneViewer_msg_fr.ts | 38 + src/STD/Makefile.am | 3 +- src/STD/resources/STD_msg_en.ts | 27 +- src/STD/resources/STD_msg_fr.ts | 490 +++++++++ src/SUIT/Makefile.am | 12 +- src/SUIT/SUIT_Application.cxx | 19 +- src/SUIT/SUIT_Application.h | 7 +- src/SUIT/SUIT_ShortcutMgr.cxx | 187 ++++ src/SUIT/SUIT_ShortcutMgr.h | 75 ++ src/SUIT/resources/SUIT_msg_en.ts | 27 +- src/SUIT/resources/SUIT_msg_fr.ts | 150 +++ src/SUITApp/Makefile.am | 2 +- src/SUITApp/SUITApp.cxx | 2 +- src/SUITApp/resources/SUITApp_msg_en.ts | 27 +- src/SUITApp/resources/SUITApp_msg_fr.ts | 19 + src/SUPERVGraph/Makefile.am | 3 +- .../resources/SUPERVGraph_msg_en.ts | 27 +- .../resources/SUPERVGraph_msg_fr.ts | 27 + src/SVTK/Makefile.am | 1 + src/SVTK/SVTK_ViewWindow.cxx | 21 +- src/SVTK/resources/SVTK_msg_en.ts | 31 +- src/SVTK/resources/SVTK_msg_fr.ts | 622 +++++++++++ src/SalomeApp/Makefile.am | 5 +- src/SalomeApp/SalomeApp_Application.cxx | 52 +- src/SalomeApp/addvars2notebook.py | 67 ++ src/SalomeApp/resources/SalomeApp.xml | 26 + src/SalomeApp/resources/SalomeApp_msg_en.ts | 209 ++-- src/SalomeApp/resources/SalomeApp_msg_fr.ts | 461 +++++++++ src/Session/SALOME_Session_Server.cxx | 3 +- src/Style/Makefile.am | 2 + src/Style/Style_PrefDlg.cxx | 6 +- src/Style/resources/Style_msg_fr.ts | 287 +++++ src/TOOLSGUI/Makefile.am | 3 +- src/TOOLSGUI/ToolsGUI_RegWidget.cxx | 976 ++++-------------- src/TOOLSGUI/ToolsGUI_RegWidget.h | 73 +- src/TOOLSGUI/resources/ToolsGUI_msg_en.ts | 142 ++- src/TOOLSGUI/resources/ToolsGUI_msg_fr.ts | 222 ++++ src/VTKViewer/Makefile.am | 9 +- src/VTKViewer/VTKViewer_CellCenters.cxx | 184 ++++ src/VTKViewer/VTKViewer_CellCenters.h | 60 ++ src/VTKViewer/resources/VTKViewer_msg_en.ts | 27 +- src/VTKViewer/resources/VTKViewer_msg_fr.ts | 207 ++++ 102 files changed, 6337 insertions(+), 1469 deletions(-) create mode 100644 doc/salome/gui/images/pref41.png create mode 100644 src/CAF/resources/CAF_msg_fr.ts create mode 100755 src/CAM/resources/CAM_msg_fr.ts create mode 100755 src/GLViewer/resources/GLViewer_msg_fr.ts create mode 100644 src/LightApp/LightApp.qrc create mode 100644 src/LightApp/images/en.png create mode 100644 src/LightApp/images/fr.png create mode 100755 src/LightApp/resources/LightApp_msg_fr.ts create mode 100755 src/LogWindow/resources/LogWindow_msg_fr.ts create mode 100755 src/OCCViewer/resources/OCCViewer_msg_fr.ts create mode 100755 src/ObjBrowser/resources/OB_msg_fr.ts create mode 100755 src/Plot2d/resources/Plot2d_msg_fr.ts create mode 100755 src/PyConsole/resources/PyConsole_msg_fr.ts create mode 100755 src/QDS/resources/QDS_msg_fr.ts create mode 100644 src/Qtx/resources/Qtx_msg_fr.ts create mode 100755 src/QxGraph/resources/QxGraph_msg_fr.ts create mode 100755 src/QxScene/resources/QxSceneViewer_msg_fr.ts create mode 100755 src/STD/resources/STD_msg_fr.ts create mode 100644 src/SUIT/SUIT_ShortcutMgr.cxx create mode 100644 src/SUIT/SUIT_ShortcutMgr.h create mode 100755 src/SUIT/resources/SUIT_msg_fr.ts create mode 100755 src/SUITApp/resources/SUITApp_msg_fr.ts create mode 100755 src/SUPERVGraph/resources/SUPERVGraph_msg_fr.ts create mode 100755 src/SVTK/resources/SVTK_msg_fr.ts create mode 100644 src/SalomeApp/addvars2notebook.py create mode 100755 src/SalomeApp/resources/SalomeApp_msg_fr.ts create mode 100644 src/Style/resources/Style_msg_fr.ts create mode 100755 src/TOOLSGUI/resources/ToolsGUI_msg_fr.ts create mode 100644 src/VTKViewer/VTKViewer_CellCenters.cxx create mode 100644 src/VTKViewer/VTKViewer_CellCenters.h create mode 100755 src/VTKViewer/resources/VTKViewer_msg_fr.ts diff --git a/configure.ac b/configure.ac index bf6d0b1f6..bc7d43df9 100644 --- a/configure.ac +++ b/configure.ac @@ -657,3 +657,5 @@ AC_OUTPUT([ \ idl/Makefile \ Makefile ]) + +AC_HACK_LIBTOOL diff --git a/doc/salome/gui/images/pref11.png b/doc/salome/gui/images/pref11.png index 39755e71076737e4e59b198f5b4ec4762835489a..43b6fad6f8e31451c76ade1107f8c8e05ce75b7b 100755 GIT binary patch literal 26559 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 He|hk4tuY{p literal 26832 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 tTiH43&bdolH=zrp7r;l%^seAVfuo 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 P7#KWV{an^LB{Ts5K=IBZ literal 0 HcmV?d00001 diff --git a/doc/salome/gui/input/salome_preferences.doc b/doc/salome/gui/input/salome_preferences.doc index a560371d1..19688a32b 100644 --- a/doc/salome/gui/input/salome_preferences.doc +++ b/doc/salome/gui/input/salome_preferences.doc @@ -209,4 +209,16 @@ resizing columns on expanding an object browser item. Entry, IOR and Reference entry columns in the Object Browser. +

Shortcuts Preferences

+ +\image html pref41.png + +
    +
  • +Shortcuts settings widget allows to define custom shortcuts for the presented actions. +
    To change keyboard sequence for the certain action - select the action and press desirable +keys combination. +
  • +
+ */ diff --git a/src/CAF/Makefile.am b/src/CAF/Makefile.am index a0fc8e5ff..e95bc4463 100755 --- a/src/CAF/Makefile.am +++ b/src/CAF/Makefile.am @@ -49,7 +49,8 @@ MOC_FILES = \ nodist_libcaf_la_SOURCES = $(MOC_FILES) nodist_salomeres_DATA = \ - CAF_msg_en.qm + CAF_msg_en.qm \ + CAF_msg_fr.qm libcaf_la_CPPFLAGS = $(QT_INCLUDES) $(CAS_CPPFLAGS) -I$(srcdir)/../STD -I$(srcdir)/../SUIT -I$(srcdir)/../Qtx libcaf_la_LDFLAGS = $(QT_MT_LIBS) $(CAS_OCAF) $(CAS_OCAFVIS) diff --git a/src/CAF/resources/CAF_msg_en.ts b/src/CAF/resources/CAF_msg_en.ts index 590baaac3..ed2ac521d 100644 --- a/src/CAF/resources/CAF_msg_en.ts +++ b/src/CAF/resources/CAF_msg_en.ts @@ -1,27 +1,6 @@ - - + + + CAF_Application diff --git a/src/CAF/resources/CAF_msg_fr.ts b/src/CAF/resources/CAF_msg_fr.ts new file mode 100644 index 000000000..2a3397bb9 --- /dev/null +++ b/src/CAF/resources/CAF_msg_fr.ts @@ -0,0 +1,59 @@ + + + + + CAF_Application + + MEN_APP_EDIT + &Editer + + + INF_ALL_FILTER + Tous les Fichiers (*.*) + + + INF_ALL_DOCUMENTS_FILTER + Tous les Documents Lisibles + + + MEN_DESK_EDIT + &Editer + + + MEN_APP_EDIT_UNDO + &Défaire + + + MEN_APP_EDIT_REDO + &Refaire + + + PRP_APP_EDIT_REDO + Refaire la dernière opération + + + PRP_APP_EDIT_UNDO + Défaire la dernière opération + + + TOT_APP_EDIT_REDO + Refaire + + + TOT_APP_EDIT_UNDO + Défaire + + + INF_APP_REDOACTIONS + Refait %1 action(s) + + + INF_APP_UNDOACTIONS + Défait %1 action(s) + + + ABOUT_INFO + SUIT Caf application + + + diff --git a/src/CAM/CAM_Module.cxx b/src/CAM/CAM_Module.cxx index 39beee2d7..8e39ab66b 100755 --- a/src/CAM/CAM_Module.cxx +++ b/src/CAM/CAM_Module.cxx @@ -835,9 +835,10 @@ int CAM_Module::actionId( const QAction* a ) const */ QAction* CAM_Module::createAction( const int id, const QString& text, const QIcon& icon, const QString& menu, const QString& tip, const int key, - QObject* parent, const bool toggle, QObject* reciever, const char* member ) + QObject* parent, const bool toggle, QObject* reciever, + const char* member, const QString& shortcutAction ) { - QtxAction* a = new QtxAction( text, icon, menu, key, parent, toggle ); + QtxAction* a = new QtxAction( text, icon, menu, key, parent, toggle, shortcutAction ); a->setStatusTip( tip ); if ( reciever && member ) diff --git a/src/CAM/CAM_Module.h b/src/CAM/CAM_Module.h index 73aaf71b9..2a3022d66 100755 --- a/src/CAM/CAM_Module.h +++ b/src/CAM/CAM_Module.h @@ -128,7 +128,7 @@ protected: bool unregisterAction( QAction* ); QAction* createAction( const int, const QString&, const QIcon&, const QString&, const QString&, const int, QObject* = 0, - const bool = false, QObject* = 0, const char* = 0 ); + const bool = false, QObject* = 0, const char* = 0, const QString& = QString() ); private: CAM_Application* myApp; //!< parent application object diff --git a/src/CAM/Makefile.am b/src/CAM/Makefile.am index cd568c63f..98630d977 100755 --- a/src/CAM/Makefile.am +++ b/src/CAM/Makefile.am @@ -51,7 +51,7 @@ MOC_FILES = \ CAM_DataModel_moc.cxx nodist_libCAM_la_SOURCES = $(MOC_FILES) -nodist_salomeres_DATA = CAM_msg_en.qm +nodist_salomeres_DATA = CAM_msg_en.qm CAM_msg_fr.qm libCAM_la_CPPFLAGS = $(QT_INCLUDES) -I$(srcdir)/../SUIT -I$(srcdir)/../STD -I$(srcdir)/../Qtx libCAM_la_LDFLAGS = $(QT_MT_LIBS) diff --git a/src/CAM/resources/CAM_msg_en.ts b/src/CAM/resources/CAM_msg_en.ts index 831ce43f1..6779ef228 100644 --- a/src/CAM/resources/CAM_msg_en.ts +++ b/src/CAM/resources/CAM_msg_en.ts @@ -1,27 +1,6 @@ - - + + + @default diff --git a/src/CAM/resources/CAM_msg_fr.ts b/src/CAM/resources/CAM_msg_fr.ts new file mode 100755 index 000000000..09e8fecd3 --- /dev/null +++ b/src/CAM/resources/CAM_msg_fr.ts @@ -0,0 +1,19 @@ + + + + + @default + + ERROR_TLT + Erreur + + + ERROR_ACTIVATE_MODULE_MSG + Impossible d'activer le module %1 + + + MODULE_ROOT_OBJECT_TOOLTIP + %1 objet-racine du module + + + diff --git a/src/GLViewer/Makefile.am b/src/GLViewer/Makefile.am index 1eec79e89..e134a769f 100644 --- a/src/GLViewer/Makefile.am +++ b/src/GLViewer/Makefile.am @@ -111,7 +111,8 @@ dist_salomeres_DATA = \ nodist_salomeres_DATA = \ GLViewer_images.qm \ - GLViewer_msg_en.qm + GLViewer_msg_en.qm \ + GLViewer_msg_fr.qm libGLViewer_la_CPPFLAGS = $(QT_INCLUDES) $(CAS_CPPFLAGS) -I$(srcdir)/../SUIT -I$(srcdir)/../Qtx libGLViewer_la_LDFLAGS = $(QT_MT_LIBS) $(CAS_KERNEL) $(OGL_LIBS) diff --git a/src/GLViewer/resources/GLViewer_msg_en.ts b/src/GLViewer/resources/GLViewer_msg_en.ts index 667a0a688..d99e2af4c 100644 --- a/src/GLViewer/resources/GLViewer_msg_en.ts +++ b/src/GLViewer/resources/GLViewer_msg_en.ts @@ -1,27 +1,6 @@ - - + + + @default diff --git a/src/GLViewer/resources/GLViewer_msg_fr.ts b/src/GLViewer/resources/GLViewer_msg_fr.ts new file mode 100755 index 000000000..fa5eff43f --- /dev/null +++ b/src/GLViewer/resources/GLViewer_msg_fr.ts @@ -0,0 +1,117 @@ + + + + + @default + + DSC_FITSELECT + Montrer la zone choisie dans la vue + + + ERROR + Erreur + + + MNU_DUMP_VIEW + Clicher + + + MNU_PAN_VIEW + Redimensionnement + + + DSC_GLOBALPAN_VIEW + Sélection d'un nouveau centre de vue + + + MNU_ZOOM_VIEW + Zoomer + + + DSC_PAN_VIEW + Redimensionner la vue + + + DSC_FITALL + Montrer tous les objets dans la vue + + + MNU_FITALL + Montrer Tous + + + MNU_GLOBALPAN_VIEW + Redimensionnement Global + + + INF_APP_DUMP_VIEW + Clicher la vue + + + GL_IMAGE_FILES + Fichiers Images (*.bmp *.png) + + + MNU_RESET_VIEW + Restaurer + + + DSC_FITRECT + Montrer la zone dans la vue + + + MNU_FITRECT + Montrer la zone + + + CHANGE_BGCOLOR + Changee la couleur d'arrier-plan... + + + DSC_DUMP_VIEW + Sauvegarder la vue en cours au fichier image + + + MNU_FITSELECT + Montrer la Sélection + + + DSC_ZOOM_VIEW + Zoomer la vue + + + DSC_RESET_VIEW + Restaurer le Point de Vue + + + ERR_DOC_CANT_SAVE_FILE + Impossible de sauvegarder le fichier + + + LBL_TOOLBAR_LABEL + Opérations de Visualisation + + + + GLViewer_ViewFrame + + DUMP_VIEW_SAVE_FILE_DLG_CAPTION + Sauvegarder la Vue Clichée au Fichier + + + DUMP_VIEW_ERROR_DLG_TEXT + Impossible de Sauvegarder la Vue Clichée au Fichier + + + DUMP_VIEW_ERROR_DLG_CAPTION + Erreur + + + + GLViewer_ViewManager + + GL_VIEW_TITLE + GL Scène:%M - visualisateur:%V + + + diff --git a/src/LightApp/LightApp.qrc b/src/LightApp/LightApp.qrc new file mode 100644 index 000000000..ffcce9a7b --- /dev/null +++ b/src/LightApp/LightApp.qrc @@ -0,0 +1,7 @@ + + + images/en.png + images/fr.png + + + diff --git a/src/LightApp/LightApp_Application.cxx b/src/LightApp/LightApp_Application.cxx index 1c2be69d3..60fbb1f64 100644 --- a/src/LightApp/LightApp_Application.cxx +++ b/src/LightApp/LightApp_Application.cxx @@ -70,6 +70,7 @@ #include #include #include +#include #include #include #include @@ -231,6 +232,8 @@ LightApp_Application::LightApp_Application() : CAM_Application( false ), myPrefs( 0 ) { + Q_INIT_RESOURCE( LightApp ); + STD_TabDesktop* desk = new STD_TabDesktop(); setDesktop( desk ); @@ -1596,6 +1599,9 @@ void LightApp_Application::showPreferences( const QString& itemText ) if ( desktop() ) resourceMgr()->setValue( "desktop", "geometry", desktop()->storeGeometry() ); resourceMgr()->save(); + + // Update shortcuts + shortcutMgr()->updateShortcuts(); } delete prefDlg; @@ -1854,6 +1860,19 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref ) pref->setItemIcon( salomeCat, Qtx::scaleIcon( resourceMgr()->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false ), 20 ) ); int genTab = pref->addPreference( tr( "PREF_TAB_GENERAL" ), salomeCat ); + + int langGroup = pref->addPreference( tr( "PREF_GROUP_LANGUAGE" ), genTab ); + pref->setItemProperty( "columns", 2, langGroup ); + int curLang = pref->addPreference( tr( "PREF_CURRENT_LANGUAGE" ), langGroup, + LightApp_Preferences::Selector, "language", "language" ); + QStringList aLangs = SUIT_Session::session()->resourceMgr()->stringValue( "language", "languages", "en" ).split( "," ); + QList aIcons; + foreach ( QString aLang, aLangs ) { + aIcons << QPixmap( QString( ":/images/%1" ).arg( aLang ) ); + } + pref->setItemProperty( "strings", aLangs, curLang ); + pref->setItemProperty( "icons", aIcons, curLang ); + int studyGroup = pref->addPreference( tr( "PREF_GROUP_STUDY" ), genTab ); pref->setItemProperty( "columns", 2, studyGroup ); @@ -2143,6 +2162,12 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref ) pref->addPreference( tr( "PREF_RESIZE_ON_EXPAND_ITEM" ), objSetGroup, LightApp_Preferences::Bool, "ObjectBrowser", "resize_on_expand_item" ); + // Shortcuts preferences + int shortcutTab = pref->addPreference( tr( "PREF_TAB_SHORTCUTS" ), salomeCat ); + int shortcutGroup = pref->addPreference( tr( "PREF_GROUP_SHORTCUTS" ), shortcutTab ); + pref->addPreference( tr( "" ), shortcutGroup, + LightApp_Preferences::ShortcutTree, "shortcuts" ); + // MRU preferences int mruGroup = pref->addPreference( tr( "PREF_GROUP_MRU" ), genTab, LightApp_Preferences::Auto, "MRU", "show_mru" ); pref->setItemProperty( "columns", 4, mruGroup ); @@ -2435,6 +2460,10 @@ void LightApp_Application::preferencesChanged( const QString& sec, const QString mru->setVisible( resMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default } } + if ( sec == "language" && param == "language" ) + { + SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LANG_CHANGED" ) ); + } } /*! diff --git a/src/LightApp/LightApp_Module.cxx b/src/LightApp/LightApp_Module.cxx index 7fa22775f..b06fc08fa 100644 --- a/src/LightApp/LightApp_Module.cxx +++ b/src/LightApp/LightApp_Module.cxx @@ -46,6 +46,7 @@ #include #include #include +#include #include #include @@ -222,6 +223,14 @@ bool LightApp_Module::activateModule( SUIT_Study* study ) if ( mySwitchOp == 0 ) mySwitchOp = new LightApp_SwitchOp( this ); + // Enable Display and Erase actions + if ( action(myDisplay) ) + action(myDisplay)->setEnabled(true); + if ( action(myErase) ) + action(myErase)->setEnabled(true); + + application()->shortcutMgr()->setSectionEnabled( moduleName() ); + /* BUG 0020498 : The Entry column is always shown at module activation The registration of column is moved into LightApp_Application @@ -253,6 +262,14 @@ bool LightApp_Module::deactivateModule( SUIT_Study* study ) anIt.value()->abort(); } + // Disable Display and Erase action + if ( action(myDisplay) ) + action(myDisplay)->setEnabled(false); + if ( action(myErase) ) + action(myErase)->setEnabled(false); + + application()->shortcutMgr()->setSectionEnabled( moduleName(), false ); + /* BUG 0020498 : The Entry column is always shown at module activation QString EntryCol = QObject::tr( "ENTRY_COLUMN" ); LightApp_DataModel* m = dynamic_cast( dataModel() ); @@ -388,9 +405,9 @@ QtxPopupMgr* LightApp_Module::popupMgr() QAction *disp = createAction( -1, tr( "TOP_SHOW" ), p, tr( "MEN_SHOW" ), tr( "STB_SHOW" ), - 0, d, false, this, SLOT( onShowHide() ) ), + 0, d, false, this, SLOT( onShowHide() ), QString("General:Show object(s)") ), *erase = createAction( -1, tr( "TOP_HIDE" ), p, tr( "MEN_HIDE" ), tr( "STB_HIDE" ), - 0, d, false, this, SLOT( onShowHide() ) ), + 0, d, false, this, SLOT( onShowHide() ) , QString("General:Hide object(s)") ), *dispOnly = createAction( -1, tr( "TOP_DISPLAY_ONLY" ), p, tr( "MEN_DISPLAY_ONLY" ), tr( "STB_DISPLAY_ONLY" ), 0, d, false, this, SLOT( onShowHide() ) ), *eraseAll = createAction( -1, tr( "TOP_ERASE_ALL" ), p, tr( "MEN_ERASE_ALL" ), tr( "STB_ERASE_ALL" ), diff --git a/src/LightApp/Makefile.am b/src/LightApp/Makefile.am index c1d8006d2..0e4a30755 100755 --- a/src/LightApp/Makefile.am +++ b/src/LightApp/Makefile.am @@ -27,6 +27,10 @@ # include $(top_srcdir)/adm_local/unix/make_common_starter.am +EXTRA_DIST += images + +QRC_FILES = qrc_LightApp.cxx + lib_LTLIBRARIES = libLightApp.la salomeinclude_HEADERS = \ @@ -157,8 +161,7 @@ endif if ENABLE_PLOT2DVIEWER MOC_FILES += LightApp_Plot2dSelector_moc.cxx endif -nodist_libLightApp_la_SOURCES = $(MOC_FILES) - +nodist_libLightApp_la_SOURCES = $(MOC_FILES) $(QRC_FILES) dist_salomeres_DATA = \ resources/icon_about.png \ resources/icon_applogo.png \ @@ -171,7 +174,8 @@ dist_salomeres_DATA = \ nodist_salomeres_DATA = \ LightApp_images.qm \ - LightApp_msg_en.qm + LightApp_msg_en.qm \ + LightApp_msg_fr.qm libLightApp_la_CPPFLAGS = $(PYTHON_INCLUDES) $(QT_INCLUDES) $(CAS_CPPFLAGS) \ $(HDF5_INCLUDES) @KERNEL_CXXFLAGS@ -I$(srcdir)/../SUIT -I$(srcdir)/../STD \ diff --git a/src/LightApp/images/en.png b/src/LightApp/images/en.png new file mode 100644 index 0000000000000000000000000000000000000000..ff701e19f6d2c0658fb23b1d94124cba4ce60851 GIT binary patch literal 599 zcmV-d0;v6oP)U(k2*|8J(R-+sudaynhucHbwAMTnor{mwqO^w7JHzaBsT z{O^B8RYf5+LvDs&KmRKVd78=o{`1#HTiEo_OolaGleS)G+IQ#sUI`b*pv<`1zCJ=H0jd{{2S>p`ri%{LsXJ%FbMS z$#S`6f|?OG!^Jxczkf6Q`UNF{l0Sd`ad7zm>({^EzyAS6{{CgrkluOb3l1A>ZU2~A zK+FZ=zkmP!`TOVhpFbzBzFaPmD2$N3;+$pK?>zdet`f0002ovPDHLkV1gy;I?Vt8 literal 0 HcmV?d00001 diff --git a/src/LightApp/images/fr.png b/src/LightApp/images/fr.png new file mode 100644 index 0000000000000000000000000000000000000000..8332c4ec23c853944c29b02d7b32a88033f48a71 GIT binary patch literal 545 zcmV++0^a?JP)lgG%);U`26kn-@hOg zU%!6+4+cOs(0HIde9xZz`}Onxub&LUB0x(30+2WcIRJn#2ut|?gWYu1Cf+!-K%B8# zdf?1WA}#uZ8oj7u>$I1i0Al&`=O0k%-@icgAIJnM0xA6maSq6BK-ECw|NZ*S`0Lj% z1_pot6puj;05Ax`F!=umqj7^frO?t|3^&I1kxUq9yECc+jQpY84SWH_0#pxl$?v~F z@*hy-KN0|X07U)z`4{NpU%#2aHUI<=%a31wK(7Du52Oc(|3O^?R1IN+RRjI-n*kVB z3=9AP#PZ|EACPLGJ%9cJNh|>9B%spYzZw7h1%?tp0I_@ndg9MNE>313@6R75NcceF zkr51-#U+7;F#`Sf7i0rK0I_`g_NQ&Z
+
@@ -55,6 +56,8 @@
+ + @@ -175,4 +178,27 @@
+ +
+ +
+
+ + +
+
+ + + + + + + +
+
+ + + + +
diff --git a/src/LightApp/resources/LightApp_msg_en.ts b/src/LightApp/resources/LightApp_msg_en.ts index 1d391cd0f..aabf97e72 100644 --- a/src/LightApp/resources/LightApp_msg_en.ts +++ b/src/LightApp/resources/LightApp_msg_en.ts @@ -1,27 +1,6 @@ - - + + + @default @@ -58,6 +37,11 @@ CEA/DEN, CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS LightApp_Application + + LANG_CHANGED + Application language has been changed. +The changes will be applied on the next application session. + MEN_DESK_THEME Theme @@ -462,6 +446,14 @@ CEA/DEN, CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITASPREF_HOR_AXIS_SCALE Horizontal axis scale: + + PREF_GROUP_LANGUAGE + Language + + + PREF_CURRENT_LANGUAGE + Current language + PREF_GROUP_STUDY Study properties @@ -641,8 +633,17 @@ File does not exist PREFERENCES_NOT_SUPPORTED - Preferences for module "%1" not supported + Preferences for module "%1" not supported + + + PREF_TAB_SHORTCUTS + Shortcuts + + + PREF_GROUP_SHORTCUTS + Shortcuts settings + LightApp_Module @@ -699,7 +700,7 @@ File does not exist LightApp_ModuleDlg DESCRIPTION - You're activating module + You're activating module <b>%1</b>.<br>Please, select required action by pressing the corresponding button below. diff --git a/src/LightApp/resources/LightApp_msg_fr.ts b/src/LightApp/resources/LightApp_msg_fr.ts new file mode 100755 index 000000000..c1491a8ba --- /dev/null +++ b/src/LightApp/resources/LightApp_msg_fr.ts @@ -0,0 +1,752 @@ + + + + + @default + + EXTERNAL_BROWSER_CANNOT_SHOW_PAGE + Le navigateur externe "%1" ne peut pas trouver la page de référence "%2". Voulez-vous changer sa location dans les préférences? + + + ABOUT_COPYRIGHT + Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE + +Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, +CEA/DEN, CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS + + + ABOUT_CAPTION + A propos de %1 + + + APP_NAME + SALOME + + + ABOUT_LICENSE + GNU LGPL + + + ABOUT_VERSION + Version %1 + + + ENTRY_COLUMN + Entrée + + + + LightApp_Application + + LANG_CHANGED + La langue de l'application a été modifié. +Les modifications seront appliquées à la suivante session de l'application. + + + MEN_DESK_THEME + T&hème + + + TOT_THEME + Thème + + + PRP_THEME + Changer les propriétés du style + + + INF_TOOLBAR_MODULES + Modules + + + PREF_SHOW_LEGEND + Montrer la légende + + + MEN_DESK_RENAME + &Renommer + + + PREF_MULTI_FILE + Sauvegarder multi-fichier + + + MEN_DESK_PREFERENCES + &Préférences... + + + PREF_TRIHEDRON_SHOW + Montrer le trièdre + + + PREF_TRIHEDRON_SIZE + Taille du Trièdre + + + OBJECT_BROWSER + Navigateur d'Objets + + + PRP_DESK_PREFERENCES + Permettre de changer les préférences + + + PREF_GROUP_DIRECTORIES + Liste rapide de répertoires + + + PREF_GROUP_VTKVIEWER + Visualisateur VTK 3D + + + PREF_STORE_POS + Retenir les positions des fenêtres + + + PREF_AUTO_SAVE + Intervale d'enregistrement automatique (min) + + + PREF_AUTO_SAVE_DISABLED + Désactivé + + + PREF_PROJECTION_MODE + Mode de Projection: + + + PREF_ORTHOGRAPHIC + Orthogonal + + + PREF_PERSPECTIVE + Perspective + + + PREF_NAVIGATION + Navigation: + + + PREF_STANDARD_STYLE + Contrôles types Salomé + + + PREF_KEYFREE_STYLE + Style sans clavier + + + PREF_INCREMENTAL_SPEED + Incrément de vitesse: + + + PREF_INCREMENTAL_SPEED_MODE + Mode de Modification: + + + PREF_ARITHMETIC + Progression Arithmétique + + + PREF_GEOMETRICAL + Progression Géométrique + + + PREF_FRAME_SPACEMOUSE + Souris Spaciale + + + PREF_SHOW_STATIC_TRIHEDRON + Montrer le trièdre statique + + + PREF_SPACEMOUSE_FUNC_1 + Rediure l'incrément de vitesse + + + PREF_SPACEMOUSE_FUNC_2 + Rediure l'incrément de vitesse + + + PREF_SPACEMOUSE_FUNC_3 + Changement Dominant / Combiné + + + PREF_SPACEMOUSE_BTN_1 + Bouton 1 + + + PREF_SPACEMOUSE_BTN_2 + Bouton 2 + + + PREF_SPACEMOUSE_BTN_3 + Bouton 3 + + + PREF_SPACEMOUSE_BTN_4 + Bouton 4 + + + PREF_SPACEMOUSE_BTN_5 + Bouton 5 + + + PREF_SPACEMOUSE_BTN_6 + Bouton 6 + + + PREF_SPACEMOUSE_BTN_7 + Bouton 7 + + + PREF_SPACEMOUSE_BTN_8 + Bouton 8 + + + PREF_SPACEMOUSE_BTN_* + Bouton * + + + PREF_SPACEMOUSE_BTN_10 + Bouton 10 + + + PREF_SPACEMOUSE_BTN_11 + Bouton 11 + + + PREF_FRAME_RECORDING + Renregistrement AVI + + + PREF_ALL_DISLPAYED_FRAMES + Enregistrer tous les cadres visualisés + + + PREF_FPS + FPS + + + PREF_GROUP_TTL + Paramètres + + + PREF_PROGRESSIVE + Progressive + + + PREF_QUALITY + Qualité + + + PREF_RECORDING_MODE + Mode + + + PREF_SKIPPED_FRAMES + Enregistrer aux FPS donnés + + + PREF_FRAME_GROUP_NAMES + Noms des groupes + + + PREF_GROUP_NAMES_TEXT_COLOR + Couleur du Texte + + + PREF_GROUP_NAMES_TRANSPARENCY + Transparence + + + PREF_BOTTOM + Dessous + + + PREF_CURVE_TYPE + Type de Courbe: + + + PREF_ISOS_U + Numéro des isolignes au long de U + + + PREF_ISOS_V + Numéro des isolignes au long de V + + + PREF_POINTS + Points + + + PRP_MODULE + Changer au module "%1" + + + PREF_ASCII_FILE + Enregistrement ASCII + + + PREFERENCES_NOT_LOADED + Les préférences du module "<b>%N</b>" seront accessibles aussitôt que le module soit choisi + + + PREF_LINEAR + Linéaire + + + DATA_MODELS + Modèles de Données + + + PRP_RENAME + Renommer la fenêtre active + + + TOT_RENAME + Renommer + + + LOG_WINDOW + Fenêtre de Messages + + + PREF_SPLINE + Spline + + + PREF_OBJ_BROWSER_SEARCH_TOOL + Outil de recherche + + + PREF_AUTO_HIDE_SEARCH_TOOL + Activer auto-cacher + + + PREF_OBJ_BROWSER_SETTINGS + Paramètres du Navigateur d'Objets + + + PRP_APP_MODULE + Tourner au point neutre de la plate-forme SALOME + + + PREF_GROUP_PY_CONSOLE + Propriétés du console Python + + + PREF_GROUP_STYLE + Style Salomé + + + PREF_USE_SALOME_STYLE + Utiliser le style Salome + + + PREF_MARKER_SIZE + Taille de repère: + + + PREF_TAB_VIEWERS + Visualisateurs + + + PREF_APP + Application + + + PREF_TOP + Dessus + + + MEN_REFRESH + Rafraîchir + + + PREF_AUTO_SIZE_FIRST + Taille automatique pour la première colonne + + + PREF_RESIZE_ON_EXPAND_ITEM + Redimensionner les colonnes de l'objet agrandi + + + PREF_GROUP_SUPERV + Superviseur des Graphes + + + PREF_TAB_OBJBROWSER + Navigateur d'objets + + + PREF_TAB_GENERAL + Général + + + NEW_WINDOW_0 + Vue &GL + + + NEW_WINDOW_1 + Vue &Plot2d + + + NEW_WINDOW_2 + Vue &OCC + + + NEW_WINDOW_3 + Vue VT&K + + + NEW_WINDOW_4 + Vue &QxGraph + + + NEW_WINDOW_5 + Vue Qx&Scene + + + OBJ_BROWSER_NAME + Objet + + + PREF_LEGEND_POSITION + Position de la Légende: + + + PREF_RELATIVE_SIZE + Taille Relative + + + PREF_VIEWER_BACKGROUND + Couleur de l'arrière-plan + + + PREF_FONT + Font + + + PREF_LEFT + Gauche + + + PREF_TAB_DIRECTORIES + Répertoires + + + ACTIVATING_MODULE + Essayer d'activer le module "%1" + + + PREF_VERT_AXIS_SCALE + Echelle de l'axe verticale: + + + PREF_HOR_AXIS_SCALE + Echelle de l'axe horisontale: + + + PREF_GROUP_LANGUAGE + Langue + + + PREF_CURRENT_LANGUAGE + Langue actuel + + + PREF_GROUP_STUDY + Propiétés d'une Etude + + + PREF_CATEGORY_SALOME + SALOME + + + PREF_GROUP_OCCVIEWER + Visualisateur OCC 3D + + + PREF_LOGARITHMIC + Logarithmique + + + MEN_DESK_MODULE_HELP + Module &Aide + + + PREF_SUPERV_TITLE_COLOR + Couleur titre + + + PREF_PARAM + Paramètres + + + PREF_RIGHT + Droit + + + PREF_LINES + Lignes + + + INF_CANCELLED + L'activation du module est annulée + + + PREF_GROUP_EXT_BROWSER + Navigateur Externe + + + PREF_SUPERV_CTRL_COLOR + Couleur alternatif + + + PREF_GROUP_DEF_COLUMNS + Colonnnes de Défaut + + + PREF_GROUP_PLOT2DVIEWER + Visualisateur Plot2d + + + MEN_DESK_MRU + &Récemment Utilisés + + + TOT_DESK_PREFERENCES + Préférences + + + DEFINE_EXTERNAL_BROWSER + Le navigateur externe n'est pas trouvé. Voulez-vous le définir dans les préférences? + + + PREF_AUTO_SIZE + Taille automatique pour les autres colonnes + + + TOT_DESK_MRU + Récemment utilisés + + + ACTIVATE_MODULE_OP_NEW + &Nouveau + + + ACTIVATE_MODULE_OP_OPEN + &Ouvrir... + + + PYTHON_CONSOLE + Console Python + + + PREF_USE_ADVANCED_SELECTION_ALGORITHM + Utiliser l'Algorithme Avancé de Sélection + + + TOT_CLOSE + Fermer + + + MEN_DESK_CLOSE + &Fermer + + + PRP_CLOSE + Fermer la fenêtre active + + + TOT_CLOSE_ALL + Fermer tous + + + MEN_DESK_CLOSE_ALL + Fermer &Tous + + + PRP_CLOSE_ALL + Fermer toutes les fenêtres + + + TOT_GROUP_ALL + Grouper Tous + + + MEN_DESK_GROUP_ALL + &Grouper Tous + + + PRP_GROUP_ALL + Grouper toutes les fenêtres + + + ERR_DOC_NOT_EXISTS + Impossible d'ouvrir %1. +Le fichier n'existe pas + + + PREF_GROUP_MRU + Montrer les objets MRU + + + PREF_MRU_VISIBLE_COUNT + Numéro d'objets MRU + + + PREF_MRU_INSERT_MODE + Mode d'Insértion + + + PREF_MRU_MOVE_FIRST + Placer au commencement + + + PREF_MRU_MOVE_LAST + Placer à la fin + + + PREF_MRU_ADD_FIRST + Ajouter au commencement + + + PREF_MRU_ADD_LAST + Ajouter à la fin + + + PREF_MRU_LINK_TYPE + Référence type + + + PREF_MRU_LINK_AUTO + Auto + + + PREF_MRU_LINK_SHORT + Court + + + PREF_MRU_LINK_FULL + Complet + + + PREFERENCES_NOT_SUPPORTED + Les préférences du module "%1" ne sont pas supportées + + + PREF_TAB_SHORTCUTS + Shortcuts + + + PREF_GROUP_SHORTCUTS + Shortcuts settings + + + + LightApp_Module + + MEN_HIDE + Cacher + + + TOP_DISPLAY_ONLY + Montrer seulement + + + STB_DISPLAY_ONLY + Montrer seulement + + + MEN_DISPLAY_ONLY + Montrer Seulement + + + TOP_HIDE + Cacher + + + MEN_ERASE_ALL + Cacher tous + + + STB_HIDE + Cacher + + + STB_SHOW + Montrer + + + TOP_SHOW + Montrer + + + MEN_SHOW + Montrer + + + STB_ERASE_ALL + Cacher tous + + + TOP_ERASE_ALL + Cacher Tous + + + + LightApp_ModuleDlg + + DESCRIPTION + Vous activez le module + <b>%1</b>.<br>Choisissez l'action nécessaire avec la touche correspondante ci-dessous + + + CANCEL + &Annuler + + + CAPTION + Activer le module + + + + LightApp_NameDlg + + TLT_RENAME + Renommer + + + NAME_LBL + Nom: + + + + LightApp_PreferencesDlg + + IMPORT_PREFERENCES + Importer les préférences + + + CAPTION + Préférences + + + WARNING + Avertissement + + + IMPORT_BTN_TEXT + Importer + + + DEFAULT_QUESTION + Voulez-vous restaurer les préférences de défaut? + + + DEFAULT_BTN_TEXT + Defauts + + + diff --git a/src/LogWindow/Makefile.am b/src/LogWindow/Makefile.am index 492ebb8ff..166a2ac56 100755 --- a/src/LogWindow/Makefile.am +++ b/src/LogWindow/Makefile.am @@ -37,7 +37,8 @@ MOC_FILES = LogWindow_moc.cxx nodist_libLogWindow_la_SOURCES = $(MOC_FILES) nodist_salomeres_DATA = \ - LogWindow_msg_en.qm + LogWindow_msg_en.qm \ + LogWindow_msg_fr.qm libLogWindow_la_CPPFLAGS = $(QT_INCLUDES) -I$(srcdir)/../SUIT -I$(srcdir)/../Qtx libLogWindow_la_LDFLAGS = $(QT_MT_LIBS) diff --git a/src/LogWindow/resources/LogWindow_msg_en.ts b/src/LogWindow/resources/LogWindow_msg_en.ts index 91681176b..a7421d837 100644 --- a/src/LogWindow/resources/LogWindow_msg_en.ts +++ b/src/LogWindow/resources/LogWindow_msg_en.ts @@ -1,27 +1,6 @@ - - + + LogWindow diff --git a/src/LogWindow/resources/LogWindow_msg_fr.ts b/src/LogWindow/resources/LogWindow_msg_fr.ts new file mode 100755 index 000000000..1fc2bc231 --- /dev/null +++ b/src/LogWindow/resources/LogWindow_msg_fr.ts @@ -0,0 +1,42 @@ + + + + + LogWindow + + + EDIT_COPY_CMD + &Copier + + + + EDIT_CLEAR_CMD + &Effacer + + + + EDIT_SELECTALL_CMD + Choisir &Tous + + + + EDIT_SAVETOFILE_CMD + &Sauvegarder le journal au fichier... + + + + ERR_ERROR + Erreur + + + + ERR_CANT_SAVE_FILE + Impossible de sauvegarder le fichier + + + + BUT_OK + &OK + + + diff --git a/src/OCCViewer/Makefile.am b/src/OCCViewer/Makefile.am index 65d59fc7e..a9ab7c7c7 100755 --- a/src/OCCViewer/Makefile.am +++ b/src/OCCViewer/Makefile.am @@ -105,7 +105,8 @@ dist_salomeres_DATA = \ nodist_salomeres_DATA = \ OCCViewer_images.qm \ - OCCViewer_msg_en.qm + OCCViewer_msg_en.qm \ + OCCViewer_msg_fr.qm libOCCViewer_la_CPPFLAGS = $(QT_INCLUDES) $(OGL_INCLUDES) $(CAS_CPPFLAGS) \ -I$(srcdir)/../SUIT -I$(srcdir)/../Qtx -I$(srcdir)/../OpenGLUtils diff --git a/src/OCCViewer/OCCViewer_ViewWindow.cxx b/src/OCCViewer/OCCViewer_ViewWindow.cxx index ee2ba5cb8..fd0992fba 100755 --- a/src/OCCViewer/OCCViewer_ViewWindow.cxx +++ b/src/OCCViewer/OCCViewer_ViewWindow.cxx @@ -1039,46 +1039,54 @@ void OCCViewer_ViewWindow::createActions() // Projections aAction = new QtxAction(tr("MNU_FRONT_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_FRONT" ) ), - tr( "MNU_FRONT_VIEW" ), 0, this); + tr( "MNU_FRONT_VIEW" ), 0, this, false, "Viewers:Front view"); aAction->setStatusTip(tr("DSC_FRONT_VIEW")); connect(aAction, SIGNAL(triggered()), this, SLOT(onFrontView())); + this->addAction(aAction); toolMgr()->registerAction( aAction, FrontId ); aAction = new QtxAction(tr("MNU_BACK_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_BACK" ) ), - tr( "MNU_BACK_VIEW" ), 0, this); + tr( "MNU_BACK_VIEW" ), 0, this, false, "Viewers:Back view"); aAction->setStatusTip(tr("DSC_BACK_VIEW")); connect(aAction, SIGNAL(triggered()), this, SLOT(onBackView())); + this->addAction(aAction); toolMgr()->registerAction( aAction, BackId ); aAction = new QtxAction(tr("MNU_TOP_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_TOP" ) ), - tr( "MNU_TOP_VIEW" ), 0, this); + tr( "MNU_TOP_VIEW" ), 0, this, false, "Viewers:Top view"); aAction->setStatusTip(tr("DSC_TOP_VIEW")); connect(aAction, SIGNAL(triggered()), this, SLOT(onTopView())); + this->addAction(aAction); toolMgr()->registerAction( aAction, TopId ); aAction = new QtxAction(tr("MNU_BOTTOM_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_BOTTOM" ) ), - tr( "MNU_BOTTOM_VIEW" ), 0, this); + tr( "MNU_BOTTOM_VIEW" ), 0, this, false, "Viewers:Bottom view"); aAction->setStatusTip(tr("DSC_BOTTOM_VIEW")); connect(aAction, SIGNAL(triggered()), this, SLOT(onBottomView())); + this->addAction(aAction); + this->addAction(aAction); toolMgr()->registerAction( aAction, BottomId ); - + aAction = new QtxAction(tr("MNU_LEFT_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_LEFT" ) ), - tr( "MNU_LEFT_VIEW" ), 0, this); + tr( "MNU_LEFT_VIEW" ), 0, this, false, "Viewers:Left view"); aAction->setStatusTip(tr("DSC_LEFT_VIEW")); connect(aAction, SIGNAL(triggered()), this, SLOT(onLeftView())); + this->addAction(aAction); toolMgr()->registerAction( aAction, LeftId ); aAction = new QtxAction(tr("MNU_RIGHT_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_RIGHT" ) ), - tr( "MNU_RIGHT_VIEW" ), 0, this); + tr( "MNU_RIGHT_VIEW" ), 0, this, false, "Viewers:Right view"); aAction->setStatusTip(tr("DSC_RIGHT_VIEW")); connect(aAction, SIGNAL(triggered()), this, SLOT(onRightView())); + this->addAction(aAction); toolMgr()->registerAction( aAction, RightId ); // Reset aAction = new QtxAction(tr("MNU_RESET_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_RESET" ) ), - tr( "MNU_RESET_VIEW" ), 0, this); + tr( "MNU_RESET_VIEW" ), 0, this, false, "Viewers:Reset view"); aAction->setStatusTip(tr("DSC_RESET_VIEW")); connect(aAction, SIGNAL(triggered()), this, SLOT(onResetView())); + this->addAction(aAction); toolMgr()->registerAction( aAction, ResetId ); // Clone diff --git a/src/OCCViewer/resources/OCCViewer_msg_en.ts b/src/OCCViewer/resources/OCCViewer_msg_en.ts index 5fcc11b74..8b19e4c5b 100644 --- a/src/OCCViewer/resources/OCCViewer_msg_en.ts +++ b/src/OCCViewer/resources/OCCViewer_msg_en.ts @@ -1,27 +1,6 @@ - - + + + @default diff --git a/src/OCCViewer/resources/OCCViewer_msg_fr.ts b/src/OCCViewer/resources/OCCViewer_msg_fr.ts new file mode 100755 index 000000000..501547e8a --- /dev/null +++ b/src/OCCViewer/resources/OCCViewer_msg_fr.ts @@ -0,0 +1,310 @@ + + + + + @default + + MNU_FRONT_VIEW + Devant + + + ERROR + Erreur + + + MNU_DUMP_VIEW + Sauvegarder la scène + + + DSC_TOP_VIEW + Vue de dessus + + + MNU_PAN_VIEW + Panoramique + + + MNU_CLONE_VIEW + Dupliquer la scène + + + DSC_SHOW_TRIHEDRE + Monter/Cacher les axes de coordonnées dans la scène + + + MNU_SHOW_TRIHEDRE + Monter/Cacher les axes de coordonnées + + + MNU_TOP_VIEW + Dessus + + + DSC_GLOBALPAN_VIEW + Sélection d'un nouveau centre de la vue + + + DSC_ROTATE_VIEW + Tourner le point de vue autour du centre de la scène + + + MNU_ZOOM_VIEW + Zoom + + + DSC_PAN_VIEW + Redimensionner la vue + + + DSC_LEFT_VIEW + Vue de gauche + + + DSC_SHOOT_VIEW + Memorizer l'état courant de la scène et l'ajouter dans la liste + + + DSC_FITALL + Redimentionner la scène pour montrer tous les objets + + + MNU_FITALL + Montrer tous + + + MNU_ROTATE_VIEW + Rotation + + + DSC_FRONT_VIEW + Vue de devant + + + MNU_ROTATIONPOINTGRAVITY_VIEW + Point de Rotation : le centre de gravité + + + MNU_GLOBALPAN_VIEW + Panoramique globale + + + INF_APP_DUMP_VIEW + Clicher la vue + + + DSC_CLIPPING + Définir le plan de découpe + + + DSC_CLONE_VIEW + Ouvrir une nouvelle fenêtre de visualisation pour la scène en cours + + + INF_APP_SHOOT_VIEW + Sauvegarder la scène + + + MNU_CLIPPING + Plan de coupe + + + MNU_BACK_VIEW + Arrière + + + MNU_SHOOT_VIEW + Memorizer la Vue + + + DSC_CHANGINGROTATIONPOINT_VIEW + Changer le point, autour duquel la scène est tournée + + + MNU_BOTTOM_VIEW + Dessous + + + MNU_RESET_VIEW + Restaurer le point de vue + + + MNU_LEFT_VIEW + Gauche + + + DSC_RIGHT_VIEW + Vue de droit + + + MNU_CHANGINGROTATIONPOINT_VIEW + Changer le point de rotation + + + DSC_FITRECT + Redimensionner la scène pour ne montrer que sa partie choisie par l'encadré + + + MNU_FITRECT + Montrer l'encadré + + + DSC_BOTTOM_VIEW + Vue de dessous + + + DSC_DUMP_VIEW + Sauvegarder la scène en cours au fichier image + + + DSC_ZOOM_VIEW + Zoom la vue + + + MNU_ROTATIONPOINT000_VIEW + Point de Rotation : (0,0,0) + + + MNU_ROTATIONPOINTSELECTED_VIEW + Point de Rotation : le point choisi par l'utilisateur + + + DSC_RESET_VIEW + Restaurer le point de vue + + + ERR_DOC_CANT_SAVE_FILE + Il est impossible de sauvegarder le fichier + + + DSC_PRESETS_VIEW + Restaurer l'état mémorisé de la scène courante + + + MNU_PRESETS_VIEW + Restaurer la vue + + + MNU_RIGHT_VIEW + Droit + + + INF_APP_PRESETS_VIEW + Restaurer la scène + + + LBL_TOOLBAR_LABEL + Opérations de visualisation + + + DSC_BACK_VIEW + Vue d'arrière + + + DSC_SCALING + Changer l'échelle des axes de coordonnées + + + MNU_SCALING + Changer l'échelle + + + DSC_AMBIENT + Ne montrer que la lumière d'ambiance + + + MNU_AMBIENT + Ne montrer que la lumière d'ambiance + + + DSC_STYLE_SWITCH + Changer le style d'intéraction + + + MNU_STYLE_SWITCH + Changer le style d'intéraction + + + OCC_IMAGE_FILES + Fichiers Images (*.bmp *.png *.jpg *.jpeg) + + + + OCCViewer_CreateRestoreViewDlg + + CAPTION + Restaurer la vue + + + + OCCViewer_SetRotationPointDlg + + LBL_X + X: + + + LBL_Y + Y: + + + LBL_Z + Z: + + + USE_BBCENTER + Utiliser le Centre du Cadre d'Objet + + + LBL_TOORIGIN + Implanter á l'Origine + + + CAPTION + Indiquer le point de rotation + + + LBL_SELECTPOINT + Choisir le Point dans la Vue + + + + OCCViewer_ViewManager + + OCC_VIEW_TITLE + Scène OCC :%M - visualisateur:%V + + + + OCCViewer_Viewer + + MEN_DUMP_VIEW + Sauvegarder la Vue + + + MEN_SHOW_TOOLBAR + Montrer la Barre d'Outils + + + MEN_CHANGE_BACKGROUD + Changer l'Arrière Plan + + + + OCCViewer_AxialScaleDlg + + DLG_SCALING + Changer l'échelle des axes + + + LBL_X + X: + + + LBL_Y + Y: + + + LBL_Z + Z: + + + diff --git a/src/ObjBrowser/Makefile.am b/src/ObjBrowser/Makefile.am index aa46ccd37..0e0f32a6e 100755 --- a/src/ObjBrowser/Makefile.am +++ b/src/ObjBrowser/Makefile.am @@ -45,7 +45,7 @@ MOC_FILES = \ nodist_libObjBrowser_la_SOURCES = $(MOC_FILES) -nodist_salomeres_DATA = OB_msg_en.qm +nodist_salomeres_DATA = OB_msg_en.qm OB_msg_fr.qm libObjBrowser_la_CPPFLAGS = $(QT_INCLUDES) -I$(srcdir)/../Qtx libObjBrowser_la_LDFLAGS = $(QT_MT_LIBS) diff --git a/src/ObjBrowser/resources/OB_msg_en.ts b/src/ObjBrowser/resources/OB_msg_en.ts index cddaea49a..ae666a88d 100644 --- a/src/ObjBrowser/resources/OB_msg_en.ts +++ b/src/ObjBrowser/resources/OB_msg_en.ts @@ -1,26 +1,6 @@ - - + + + OB_Browser diff --git a/src/ObjBrowser/resources/OB_msg_fr.ts b/src/ObjBrowser/resources/OB_msg_fr.ts new file mode 100755 index 000000000..5717c12ee --- /dev/null +++ b/src/ObjBrowser/resources/OB_msg_fr.ts @@ -0,0 +1,38 @@ + + + + + OB_Browser + + MEN_EXPAND_ALL + Afficher Tous + + + MEN_COLLAPSE_ALL + Réduire Tous + + + MEN_FIND + Chercher + + + + OB_FindDlg + + FIND + Chercher + + + CLOSE + Fermer + + + CASE_SENSITIVE + Sensible à la casse + + + IS_REG_EXP + Expression Régulaire + + + diff --git a/src/Plot2d/Makefile.am b/src/Plot2d/Makefile.am index dac45b6e1..8cb2b6e21 100755 --- a/src/Plot2d/Makefile.am +++ b/src/Plot2d/Makefile.am @@ -87,7 +87,8 @@ dist_salomeres_DATA = \ nodist_salomeres_DATA = \ Plot2d_images.qm \ - Plot2d_msg_en.qm + Plot2d_msg_en.qm \ + Plot2d_msg_fr.qm libPlot2d_la_CPPFLAGS = $(QT_INCLUDES) $(PYTHON_INCLUDES) $(QWT_INCLUDES) \ -I$(srcdir)/../Qtx -I$(srcdir)/../SUIT diff --git a/src/Plot2d/Plot2d_ViewFrame.cxx b/src/Plot2d/Plot2d_ViewFrame.cxx index b2fc5e26e..7dcafc445 100755 --- a/src/Plot2d/Plot2d_ViewFrame.cxx +++ b/src/Plot2d/Plot2d_ViewFrame.cxx @@ -363,6 +363,10 @@ bool Plot2d_ViewFrame::eventFilter( QObject* watched, QEvent* e ) } break; } + case QEvent::ContextMenu: + // Fix from SLN + // Do nothing because context menu is called from MouseRelease + return true; } } return QWidget::eventFilter( watched, e ); diff --git a/src/Plot2d/Plot2d_ViewModel.cxx b/src/Plot2d/Plot2d_ViewModel.cxx index 2e912da1a..a36346e0b 100755 --- a/src/Plot2d/Plot2d_ViewModel.cxx +++ b/src/Plot2d/Plot2d_ViewModel.cxx @@ -121,7 +121,9 @@ void Plot2d_Viewer::update() void Plot2d_Viewer::clearPrs() { SUIT_ViewManager* aMgr = getViewManager(); - QVector aViews = aMgr->getViews(); + QVector aViews; + if ( aMgr ) + aViews = aMgr->getViews(); unsigned int aSize = aViews.size(); for (uint i = 0; i < aSize; i++) { Plot2d_ViewWindow* aView = (Plot2d_ViewWindow*)aViews[i]; diff --git a/src/Plot2d/resources/Plot2d_msg_en.ts b/src/Plot2d/resources/Plot2d_msg_en.ts index 3a084267f..08b09ca76 100644 --- a/src/Plot2d/resources/Plot2d_msg_en.ts +++ b/src/Plot2d/resources/Plot2d_msg_en.ts @@ -1,27 +1,6 @@ - - + + + @default diff --git a/src/Plot2d/resources/Plot2d_msg_fr.ts b/src/Plot2d/resources/Plot2d_msg_fr.ts new file mode 100755 index 000000000..01ee4c8fe --- /dev/null +++ b/src/Plot2d/resources/Plot2d_msg_fr.ts @@ -0,0 +1,511 @@ + + + + + @default + + PLOT2D_CURVE_TYPE_LBL + Type de Courbe: + + + ERROR + Erreur + + + PLOT2D_SET_AS_DEFAULT_CHECK + Enregistrer comme les paramètres de defaut + + + TLT_SETUP_CURVE + Initialiser une Courbe + + + MNU_DUMP_VIEW + Clicher la vue... + + + PLOT2D_SCALE_MODE_HOR + Axe Horizontale: + + + PLOT2D_SCALE_MODE_VER + Axe Verticale: + + + MNU_PAN_VIEW + Panoramique + + + MNU_CLONE_VIEW + Cloner la Vue + + + POSTSCRIPT_FILES + Fichiers PostScript (*.ps) + + + ENCAPSULATED_POSTSCRIPT_FILES + Fichiers PostScript Encapsulés (*.eps) + + + DSC_GLOBALPAN_VIEW + Sélection d'un nouveau centre de la vue + + + PRP_PLOT2D_MODE_LINEAR_VER + Changer la vue au mode d'échelle linéaire au long de l'axe verticale + + + PRP_PLOT2D_MODE_LINEAR_HOR + Changer la vue au mode d'échelle linéaire au long de l'axe horizontale + + + CURVE_LINE_WIDTH_LAB + Largeur de la Ligne: + + + CURVE_TYPE_POPUP + Type de Courbe + + + TOT_PLOT2D_MODE_LINEAR_VER + Axe verticale: linéaire + + + TOT_PLOT2D_MODE_LINEAR_HOR + Axe horizontale: linéaire + + + FIT_DATA_TLT + Montrer le diapason des données + + + MNU_ZOOM_VIEW + Zoom + + + PLOT2D_GRID_TLT + Maillage / Repères des Axes + + + DSC_PAN_VIEW + Redimensionner la vue + + + DASHDOT_LINE_LBL + TiretPoint + + + PRP_PLOT2D_CURVES_SPLINES + Changer le mode de vue aux splines + + + INF_AXES_X + Axe X + + + PLOT2D_SCALE_TLT + Mode d'échelle + + + DSC_FITALL + Montrer tous les objets + + + MNU_FITALL + Montrer tous + + + TOT_PLOT2D_MODE_LOGARITHMIC_HOR + Axe horizontale: logarithmique + + + TOT_PLOT2D_MODE_LOGARITHMIC_VER + Axe Verticale: logarithmique + + + MNU_GLOBALPAN_VIEW + Panoramique Globale + + + INF_APP_DUMP_VIEW + Clicher la vue + + + PLOT2D_LEGEND_POSITION_BOTTOM + Dessous + + + INF_COORDINATES + Coordonnées: X : %1, Y : %2 + + + DSC_CLONE_VIEW + Ouvrir un nouveau visualisateur OCC pour la scène actuelle + + + DASH_LINE_LBL + Tiret + + + DTRIANGLE_MARKER_LBL + Triangle orienté en bas + + + UTRIANGLE_MARKER_LBL + Triangle orienté en haut + + + LTRIANGLE_MARKER_LBL + Triangle orienté à Gauche + + + RTRIANGLE_MARKER_LBL + Triangle orienté à droit + + + RECTANGLE_MARKER_LBL + Rectangle + + + TLT_SETUP_PLOT2D_VIEW + Plot 2d Paramètres de Visualisation + + + CURVE_LINE_TYPE_LAB + Type de la Ligne: + + + CROSS_MARKER_LBL + Croix + + + XCROSS_MARKER_LBL + Croix Diagonale + + + PLOT2D_ENABLE_VER_TITLE + Titre de l'axe Verticale + + + PLOT2D_ENABLE_HOR_TITLE + Titre d'Axe Horizontale + + + TOT_PLOT2D_SETTINGS + Paramètres + + + PLOT2D_CURVE_TYPE_LINES + Lignes + + + MEN_PLOT2D_CURVES_SPLINES + Dessiner les Splines + + + PRP_PLOT2D_MODE_LOGARITHMIC_HOR + Changer la vue au mode d'échelle logarithmique au long de l'axe horizontale + + + PRP_PLOT2D_MODE_LOGARITHMIC_VER + Changer la vue au mode d'échelle logarithmique au long de l'axe verticale + + + PLOT2D_IMAGE_FILES + Fichiers Images (*.bmp *.png *.jpg *.jpeg) + + + PLOT2D_MAX_INTERVALS + Intervalles Maximaux + + + INF_AXES_Y_LEFT + Axe Y Gauche + + + CURVE_COLOR_LAB + Couleur: + + + CURVE_PREVIEW_LAB + Prévisualiser + + + DIAMOND_MARKER_LBL + Diamant + + + PLOT2D_LEGEND_POSITION_TOP + Dessus + + + TOT_PLOT2D_CHANGE_BACKGROUND + Changer l'arrière-plan + + + MEN_PLOT2D_CHANGE_BACKGROUND + Changer l'Arrère-Plan... + + + PRP_PLOT2D_CHANGE_BACKGROUND + Changer la couleur d'arrière plan + + + SOLID_LINE_LBL + Solide + + + PLOT2D_GRID_ENABLE_VER_MAJOR + La Verticale majeure + + + PLOT2D_GRID_ENABLE_HOR_MAJOR + La horizontale majeure + + + PLOT2D_GRID_ENABLE_VER_MINOR + La Verticale mineure + + + TOT_PLOT2D_CURVES_POINTS + Dessiner points + + + PLOT2D_GRID_ENABLE_HOR_MINOR + La horizontale mineure + + + PLOT2D_BACKGROUND_COLOR_LBL + Couleur d'arrière-plan: + + + WRN_XLOG_NOT_ALLOWED + On a détecté des points avec les valeurs non-positives sur l'abscisse. +L'échelle logarithmique de l'abscisse n'est pas permise. + + + WRN_YLOG_NOT_ALLOWED + On a détecté des points avec les valeurs non-positives sur l'ordonnée. +L'échelle logarithmique de l'ordonnée n'est pas permise. + + + DSC_FITRECT + Montrer la zone choisie par l'encadré + + + PLOT2D_LEGEND_POSITION_LEFT + Gauche + + + MNU_FITRECT + Montrer la Zone + + + DOT_LINE_LBL + Point + + + MEN_PLOT2D_CURVES_POINTS + Dessiner les Points + + + PRP_PLOT2D_CURVES_POINTS + Changer le mode de vue aux points + + + PLOT2D_SCALE_MODE_LOGARITHMIC + Logarithmique + + + PLOT2D_LEGEND_POSITION_RIGHT + Droit + + + DSC_DUMP_VIEW + Sauvegarder la vue actuelle au fichier image + + + WARNING + Avertissement + + + PLOT2D_ENABLE_LEGEND + Montrer la légende + + + DSC_ZOOM_VIEW + Zoomer la vue + + + PRP_PLOT2D_SETTINGS + Indiquer les paramètres de visualisation + + + INF_COORDINATES_SOME_Y + Coordonnées: X : %1, Y : %2 ( %3 ) + + + SCALING_POPUP + Echelle + + + PLOT2D_SCALE_MODE_LINEAR + Linéaire + + + TOT_PLOT2D_FITDATA + Montrer le Diapason + + + PLOT2D_CURVE_TYPE_POINTS + Points + + + PLOT2D_CURVE_TYPE_SPLINE + Spline + + + MEN_PLOT2D_FITDATA + Montrer &Ranger + + + MEN_PLOT2D_MODE_LOGARITHMIC_HOR + Axe Horizontale: Logarithmique + + + MEN_PLOT2D_MODE_LOGARITHMIC_VER + Axe Verticale: Logarithmique + + + PRP_PLOT2D_FITDATA + Monter le diapason de données indiqué + + + MEN_PLOT2D_MODE_LINEAR_VER + Axe Verticale: Linéaire + + + MEN_PLOT2D_MODE_LINEAR_HOR + Axe Horizontale: Linéaire + + + NONE_MARKER_LBL + Zéro + + + ERR_DOC_CANT_SAVE_FILE + Impossible de sauvegarder le fichier + + + MEN_PLOT2D_SHOW_LEGEND + Montrer &Légende + + + PRP_PLOT2D_SHOW_LEGEND + Activer/désactiver la légende + + + TOT_PLOT2D_SHOW_LEGEND + Montrer la Légende + + + INF_AXES_Y_RIGHT + Axe Y Droite + + + DAHSDOTDOT_LINE_LBL + TiretPointPoint + + + TOT_PLOT2D_CURVES_SPLINES + Dessiner splines + + + CURVE_MARKER_TYPE_LAB + Type de Repère: + + + MEN_PLOT2D_SETTINGS + &Paramètres + + + CIRCLE_MARKER_LBL + Circle + + + LBL_TOOLBAR_LABEL + Opérations de visualisation + + + NONE_LINE_LBL + Zéro + + + PLOT2D_MARKER_SIZE_LBL + Repère de Taille: + + + PLOT2D_ENABLE_MAIN_TITLE + Titre principal + + + TOT_PLOT2D_CURVES_LINES + Dessiner Lignes + + + PRP_PLOT2D_CURVES_LINES + Changer le mode de vue aux lignes + + + MEN_PLOT2D_CURVES_LINES + Dessiner les Lignes + + + + Plot2d_FitDataDlg + + FIT_HORIZONTAL + Montrer horizontale + + + MIN_VALUE_LAB + Min: + + + VERTICAL_AXIS + Axe Verticale + + + MAX_VALUE_LAB + Max: + + + HORIZONTAL_AXIS + Axe Horizontale + + + VERTICAL_LEFT_AXIS + Axe Gauche Verticale + + + FIT_ALL + Montrer tous + + + VERTICAL_RIGHT_AXIS + Axe droite verticale + + + FIT_VERTICAL + Montrer verticale + + + + Plot2d_ViewManager + + PLOT2D_VIEW_TITLE + Plot2d scène:%M - visualisateur:%V + + + diff --git a/src/PyConsole/Makefile.am b/src/PyConsole/Makefile.am index fe0b4a1f6..e28a2b67f 100755 --- a/src/PyConsole/Makefile.am +++ b/src/PyConsole/Makefile.am @@ -44,7 +44,8 @@ MOC_FILES = \ nodist_libPyConsole_la_SOURCES = $(MOC_FILES) nodist_salomeres_DATA = \ - PyConsole_msg_en.qm + PyConsole_msg_en.qm \ + PyConsole_msg_fr.qm libPyConsole_la_CPPFLAGS = $(PYTHON_INCLUDES) $(QT_INCLUDES) \ -I$(srcdir)/../PyInterp -I$(srcdir)/../SUIT -I$(srcdir)/../Qtx diff --git a/src/PyConsole/resources/PyConsole_msg_en.ts b/src/PyConsole/resources/PyConsole_msg_en.ts index 986b476b1..85393a2bf 100644 --- a/src/PyConsole/resources/PyConsole_msg_en.ts +++ b/src/PyConsole/resources/PyConsole_msg_en.ts @@ -1,28 +1,6 @@ - - + + PyConsole_Console @@ -50,7 +28,6 @@ D&ump commands - PyConsole_Editor @@ -58,8 +35,8 @@ Dump commands - PYTHON_FILES_FILTER - PYTHON Files (*.py) + PYTHON_FILES_FILTER + PYTHON Files (*.py) diff --git a/src/PyConsole/resources/PyConsole_msg_fr.ts b/src/PyConsole/resources/PyConsole_msg_fr.ts new file mode 100755 index 000000000..c582d387e --- /dev/null +++ b/src/PyConsole/resources/PyConsole_msg_fr.ts @@ -0,0 +1,42 @@ + + + + + PyConsole_Console + + + EDIT_COPY_CMD + &Copier + + + + EDIT_PASTE_CMD + C&oller + + + + EDIT_CLEAR_CMD + &Effacer + + + + EDIT_SELECTALL_CMD + Choisir &Tous + + + EDIT_DUMPCOMMANDS_CMD + C&licher les commandes + + + + PyConsole_Editor + + TOT_DUMP_PYCOMMANDS + C&licher les commandes + + + PYTHON_FILES_FILTER + Fichiers PYTHON (*.py) + + + diff --git a/src/QDS/Makefile.am b/src/QDS/Makefile.am index cd641de0d..ff1bdea07 100755 --- a/src/QDS/Makefile.am +++ b/src/QDS/Makefile.am @@ -82,7 +82,7 @@ MOC_FILES = \ nodist_libQDS_la_SOURCES = $(MOC_FILES) -nodist_salomeres_DATA = QDS_msg_en.qm +nodist_salomeres_DATA = QDS_msg_en.qm QDS_msg_fr.qm libQDS_la_CPPFLAGS = $(QT_INCLUDES) $(CAS_CPPFLAGS) \ -I$(srcdir)/../Qtx -I$(srcdir)/../DDS diff --git a/src/QDS/resources/QDS_msg_en.ts b/src/QDS/resources/QDS_msg_en.ts index 0caa8c1f2..2388719f0 100644 --- a/src/QDS/resources/QDS_msg_en.ts +++ b/src/QDS/resources/QDS_msg_en.ts @@ -1,27 +1,6 @@ - - + + + QDS_Datum @@ -50,7 +29,7 @@ DATA_SHOULD_BE_VALUE - Should be%1 value + Should be %1 value DATA_INTEGER diff --git a/src/QDS/resources/QDS_msg_fr.ts b/src/QDS/resources/QDS_msg_fr.ts new file mode 100755 index 000000000..c31b476a1 --- /dev/null +++ b/src/QDS/resources/QDS_msg_fr.ts @@ -0,0 +1,51 @@ + + + + + QDS_Datum + + DATA_ERR_TITLE + Valeur incorrecte du paramètre + + + DATA_STRING + ligne non-vide + + + DATA_NON_EMPTY + non-vide + + + DATA_MIN_LIMIT + est plus de %1 + + + DATA_FLOAT + réelle + + + DATA_RANGE + au diapason [%1, %2] + + + DATA_SHOULD_BE_VALUE + Une valeur %1 est nécessaire + + + DATA_INTEGER + entière + + + DATA_INCORRECT_VALUE + La Valeur du paramètre "%1" n'est pas correcte. + + + DATA_MAX_LIMIT + est moins de %1 + + + DATA_INPUT_VALUE + Indiquez une valeur correcte. + + + diff --git a/src/Qtx/Makefile.am b/src/Qtx/Makefile.am index 771008a03..610935c55 100755 --- a/src/Qtx/Makefile.am +++ b/src/Qtx/Makefile.am @@ -67,7 +67,7 @@ salomeinclude_HEADERS = \ QtxResourceMgr.h \ QtxRubberBand.h \ QtxSearchTool.h \ - QtxShortcutEdit.h \ + QtxShortcutEdit.h \ QtxSplash.h \ QtxToolBar.h \ QtxToolTip.h \ @@ -192,3 +192,6 @@ nodist_libqtx_la_SOURCES = $(MOC_FILES) libqtx_la_CPPFLAGS = $(QT_INCLUDES) libqtx_la_LDFLAGS = $(QT_MT_LIBS) + +nodist_salomeres_DATA = \ + Qtx_msg_fr.qm diff --git a/src/Qtx/QtxAction.cxx b/src/Qtx/QtxAction.cxx index 0bc9508aa..b706f850a 100755 --- a/src/Qtx/QtxAction.cxx +++ b/src/Qtx/QtxAction.cxx @@ -67,14 +67,19 @@ private: Creates an action owned by \a parent. Parameter \a toggle can be used to make the action checkable. + Parameter \a shortcutAction can be used to assign the shortcut from + preferences. This parameter value corresponds to shortcut action identifier + in shortcut preferences. \param parent parent object \param toggle if \c true the action will be a toggle action + \param shortcutAction shortcut action identifier */ -QtxAction::QtxAction( QObject* parent, bool toggle ) +QtxAction::QtxAction( QObject* parent, bool toggle, const QString& shortcutAction ) : QWidgetAction( parent ) { setCheckable( toggle ); + setShortcutActionName(shortcutAction); QApplication::instance()->installEventFilter( this ); } @@ -85,6 +90,9 @@ QtxAction::QtxAction( QObject* parent, bool toggle ) Creates an action owned by \a parent. Parameters \a text, \a icon, \a menuText and \a accel specify the action's attributes. Parameter \a toggle can be used to make the action checkable. + Parameter \a shortcutAction can be used to assign the shortcut from + preferences. This parameter value corresponds to shortcut action identifier + in shortcut preferences. \param text tooltip text \param icon iconset @@ -92,9 +100,10 @@ QtxAction::QtxAction( QObject* parent, bool toggle ) \param accel shortcut key sequence \param parent parent object \param toggle if \c true the action will be a toggle action + \param shortcutAction shortcut action identifier */ -QtxAction::QtxAction( const QString& text, const QIcon& icon, - const QString& menuText, int accel, QObject* parent, bool toggle ) +QtxAction::QtxAction( const QString& text, const QIcon& icon, const QString& menuText, + int accel, QObject* parent, bool toggle, const QString& shortcutAction ) : QWidgetAction( parent ) { setIcon( icon ); @@ -102,6 +111,7 @@ QtxAction::QtxAction( const QString& text, const QIcon& icon, setToolTip( text ); setShortcut( accel ); setCheckable( toggle ); + setShortcutActionName(shortcutAction); QApplication::instance()->installEventFilter( this ); } @@ -112,22 +122,27 @@ QtxAction::QtxAction( const QString& text, const QIcon& icon, Creates an action owned by \a parent. Parameters \a text, \a menuText and \a accel specify the action's attributes. Parameter \a toggle can be used to make the action checkable. + Parameter \a shortcutAction can be used to assign the shortcut from + preferences. This parameter value corresponds to shortcut action identifier + in shortcut preferences. \param text tooltip text \param menuText menu text \param accel shortcut key sequence \param parent parent object \param toggle if \c true the action is a toggle action + \param shortcutAction shortcut action identifier */ QtxAction::QtxAction( const QString& text, const QString& menuText, - int accel, QObject* parent, bool toggle ) + int accel, QObject* parent, bool toggle, const QString& shortcutAction ) : QWidgetAction( parent ) { setText( menuText ); setToolTip( text ); setShortcut( accel ); setCheckable( toggle ); - + setShortcutActionName(shortcutAction); + QApplication::instance()->installEventFilter( this ); } @@ -208,3 +223,27 @@ void QtxAction::customEvent( QEvent* e ) else removedFrom( ae->widget() ); } + +/*! + \brief Return shortcut action name for the action. + + \return shortcut action name + \sa setShortcutActionName() +*/ +QString QtxAction::shortcutActionName() const +{ + return myShortcutActionName; +} + +/*! + \brief Set shortcut action name to the action. + + Shortcut action name is used for shortcuts customization. + + \param shortcutAction shortcut action name + \sa shortcutActionName() +*/ +void QtxAction::setShortcutActionName( const QString& shortcutAction ) +{ + myShortcutActionName = shortcutAction; +} diff --git a/src/Qtx/QtxAction.h b/src/Qtx/QtxAction.h index c7a87293f..4536fa5ba 100755 --- a/src/Qtx/QtxAction.h +++ b/src/Qtx/QtxAction.h @@ -43,18 +43,24 @@ class QTX_EXPORT QtxAction : public QWidgetAction class ActionNotify; public: - QtxAction( QObject* = 0, bool = false ); - QtxAction( const QString&, const QString&, int, QObject*, bool = false ); - QtxAction( const QString&, const QIcon&, const QString&, int, QObject*, bool = false ); + QtxAction( QObject* = 0, bool = false, const QString& = QString() ); + QtxAction( const QString&, const QString&, int, QObject*, bool = false, const QString& = QString() ); + QtxAction( const QString&, const QIcon&, const QString&, int, QObject*, bool = false, const QString& = QString() ); virtual ~QtxAction(); virtual bool eventFilter( QObject*, QEvent* ); + QString shortcutActionName() const; + void setShortcutActionName( const QString& ); + protected: virtual void addedTo( QWidget* ); virtual void removedFrom( QWidget* ); virtual void customEvent( QEvent* ); + +private: + QString myShortcutActionName; }; #ifdef WIN32 diff --git a/src/Qtx/QtxColorButton.cxx b/src/Qtx/QtxColorButton.cxx index af9a76673..173516dae 100644 --- a/src/Qtx/QtxColorButton.cxx +++ b/src/Qtx/QtxColorButton.cxx @@ -54,7 +54,7 @@ QtxColorButton::QtxColorButton( QWidget* parent ) : QToolButton( parent ) { setCheckable( false ); - setPopupMode( MenuButtonPopup ); + setPopupMode( InstantPopup ); QMenu* pm = new QMenu( this ); QGridLayout* grid = new QGridLayout( pm ); diff --git a/src/Qtx/QtxPagePrefMgr.cxx b/src/Qtx/QtxPagePrefMgr.cxx index 28a9db0d8..a67e97a5e 100644 --- a/src/Qtx/QtxPagePrefMgr.cxx +++ b/src/Qtx/QtxPagePrefMgr.cxx @@ -3071,7 +3071,7 @@ void QtxPagePrefSpinItem::setPrecision( const QVariant& prec ) if ( QtxDoubleSpinBox* dsb = ::qobject_cast( control() ) ) { if ( prec.canConvert( QVariant::Int ) ) { - dsb->setDecimals( prec.toInt() ); + dsb->setDecimals( qAbs( prec.toInt() ) ); dsb->setPrecision( prec.toInt() ); } } @@ -4245,7 +4245,17 @@ QtxPagePrefShortcutTreeItem::QtxPagePrefShortcutTreeItem( const QString& title, const QString& param ): QtxPageNamedPrefItem( title, parent, sect, "" ) { mySection = sect; + myShortcutTree = new QtxShortcutTree(); + + // Retrieve shortcuts common sections from resources + QtxResourceMgr* resMgr = resourceMgr(); + if ( resMgr ){ + QString generalSections = resourceMgr()->stringValue( "shortcuts_settings", "general_sections", QString() ); + QStringList sectionsList = generalSections.split( ";", QString::SkipEmptyParts ); + myShortcutTree->setGeneralSections( sectionsList ); + } + setControl( myShortcutTree ); } diff --git a/src/Qtx/QtxResourceMgr.cxx b/src/Qtx/QtxResourceMgr.cxx index 0afcf7799..8328d8a0a 100644 --- a/src/Qtx/QtxResourceMgr.cxx +++ b/src/Qtx/QtxResourceMgr.cxx @@ -31,6 +31,7 @@ #include #include #include +#include #ifndef QT_NO_DOM #include #include @@ -2436,6 +2437,14 @@ void QtxResourceMgr::loadLanguage( const QString& pref, const QString& l ) else prefixList = parameters( resSection() ); + if ( pref.isEmpty() && lang != "en" ) { + // load Qt resources + QString qt_translations = QLibraryInfo::location( QLibraryInfo::TranslationsPath ); + QTranslator* trans = new QtxTranslator( 0 ); + if ( trans->load( QString("qt_%1").arg( lang ), qt_translations ) ) + QApplication::instance()->installTranslator( trans ); + } + for ( QStringList::ConstIterator iter = prefixList.begin(); iter != prefixList.end(); ++iter ) { QString prefix = *iter; diff --git a/src/Qtx/QtxShortcutEdit.cxx b/src/Qtx/QtxShortcutEdit.cxx index c5aa6eaa7..efa555de1 100755 --- a/src/Qtx/QtxShortcutEdit.cxx +++ b/src/Qtx/QtxShortcutEdit.cxx @@ -26,6 +26,7 @@ #include #include #include +#include #include #include @@ -251,13 +252,14 @@ bool QtxShortcutTree::eventFilter(QObject* obj, QEvent* event) if ( keyEvent->key() == Qt::Key_Delete || keyEvent->key() == Qt::Key_Backspace ) currentItem()->setText( 1, "" ); if ( text != "" ) { - currentItem()->setText( 1, text ); + if ( text.endsWith( "+" ) || checkUniqueness( currentItem(), text ) ) + currentItem()->setText( 1, text ); } return true; } if ( event->type() == QEvent::KeyRelease ) { if ( currentItem()->text( 1 ).endsWith( "+" ) ) - currentItem()->setText( 1, myPrevBindings[ currentItem()->parent()->text( 0 ) ][ currentItem()->text( 0 ) ] ); + currentItem()->setText( 1, myPrevBindings[ currentItem()->parent()->text( 0 ) ][ currentItem()->text( 0 ) ] ); else myPrevBindings[ currentItem()->parent()->text( 0 ) ][ currentItem()->text( 0 ) ] = currentItem()->text( 1 ); return true; @@ -277,7 +279,6 @@ void QtxShortcutTree::onCurrentItemChanged( QTreeWidgetItem* cur, QTreeWidgetIte prev->setText( 1, myPrevBindings[ prev->parent()->text( 0 ) ][ prev->text( 0 ) ] ); } - /*! \brief Set key bindings to the tree \param title the name of top-level item @@ -286,8 +287,12 @@ void QtxShortcutTree::onCurrentItemChanged( QTreeWidgetItem* cur, QTreeWidgetIte void QtxShortcutTree::setBindings( const QString& title, const ShortcutMap& theShortcutMap ) { QTreeWidgetItem* item= new QTreeWidgetItem(); + QFont font = item->font(0); + font.setBold(true); + if ( findItems( title, Qt::MatchFixedString ).isEmpty() ) { item->setText( 0, title ); + item->setFont( 0, font ); addTopLevelItem( item ); item->setFlags( Qt::ItemIsEnabled ); } else { @@ -315,10 +320,12 @@ ShortcutMap* QtxShortcutTree::bindings( const QString& sec ) const { ShortcutMap* aMap = new ShortcutMap(); QTreeWidgetItem* item = findItems( sec, Qt::MatchFixedString ).first(); - QList< QTreeWidgetItem* > childLst = item->takeChildren(); + int nbChildren = item->childCount(); - for( int i = 0; i < childLst.size(); i++ ) - aMap->insert( childLst.at(i)->text( 0 ), childLst.at(i)->text(1) ); + for( int i = 0; i < nbChildren; i++ ) { + QTreeWidgetItem* child = item->child(i); + aMap->insert( child->text( 0 ), child->text( 1 ) ); + } return aMap; } @@ -326,6 +333,72 @@ ShortcutMap* QtxShortcutTree::bindings( const QString& sec ) const void QtxShortcutTree::focusOutEvent ( QFocusEvent* event ) { QWidget::focusOutEvent( event ); - if ( currentItem()->isSelected() ) + if ( currentItem() && currentItem()->isSelected() ) currentItem()->setText( 1, myPrevBindings[ currentItem()->parent()->text( 0 ) ][ currentItem()->text( 0 ) ] ); } + +/*! + \brief Set the list of shortcuts general sections. + + Key combinations in general sections should not intersect + with any other key combinations. + + \param sectionsList list of common section names +*/ +void QtxShortcutTree::setGeneralSections( const QStringList& sectionsList ) +{ + myGeneralSections = sectionsList; +} + +/*! + \brief Check uniqueness of the shortcut. + \param item current item of the shortcut tree + \param shortcut shortcut appointed for the current item + \return \c true if the given shortcut is allowed +*/ +bool QtxShortcutTree::checkUniqueness( QTreeWidgetItem* item, const QString& shortcut ) +{ + // List of sections to check shortcut intersections + QStringList sectionsList; + + // Current section + QString currentSection = currentItem()->parent()->text( 0 ); + + // If the current section is general + if ( myGeneralSections.contains(currentSection) ) { + sectionsList = sections(); + int currentSectionIndex = sectionsList.indexOf(currentSection); + sectionsList.move( currentSectionIndex, 0); + } + else { + sectionsList = myGeneralSections; + sectionsList.prepend(currentSection); + } + + // Iterate on sections + QStringList::const_iterator it; + for( it = sectionsList.constBegin(); it != sectionsList.constEnd(); ++it ) { + QString section = *it; + + // Iterate on actual section + QTreeWidgetItem* sectionRoot = findItems( section, Qt::MatchFixedString ).first(); + int nbChildren = sectionRoot->childCount(); + + for( int i = 0; i < nbChildren; i++ ) { + QTreeWidgetItem* child = sectionRoot->child(i); + + if ( (child != item) && (shortcut == child->text( 1 )) ) { + bool res = QMessageBox::warning( parentWidget(), tr("Warning"), + tr("The \"%1\" shortcut has already used by the \"%2\" action.\n") + .arg(shortcut, section + ":" + child->text( 0 ) ) + + tr("Do you want to reassign it from that action to the current one?"), + QMessageBox::Yes, QMessageBox::No ) == QMessageBox::Yes; + if (res) + child->setText( 1, "" ); + return res; + } + } + } + + return true; +} diff --git a/src/Qtx/QtxShortcutEdit.h b/src/Qtx/QtxShortcutEdit.h index 782402288..01791d761 100755 --- a/src/Qtx/QtxShortcutEdit.h +++ b/src/Qtx/QtxShortcutEdit.h @@ -69,16 +69,19 @@ public: void setBindings( const QString&, const ShortcutMap& ); ShortcutMap* bindings( const QString& ) const; QStringList sections() const; + void setGeneralSections( const QStringList& ); protected: virtual bool eventFilter( QObject*, QEvent* ); virtual void focusOutEvent( QFocusEvent* ); + virtual bool checkUniqueness( QTreeWidgetItem*, const QString& ); private slots: void onCurrentItemChanged( QTreeWidgetItem*, QTreeWidgetItem* ); private: QMap< QString, ShortcutMap > myPrevBindings; + QStringList myGeneralSections; }; #endif // QTXSHORTCUTEDIT_H diff --git a/src/Qtx/QtxTreeView.cxx b/src/Qtx/QtxTreeView.cxx index d86270d85..437092838 100644 --- a/src/Qtx/QtxTreeView.cxx +++ b/src/Qtx/QtxTreeView.cxx @@ -124,7 +124,7 @@ void QtxTreeView::Header::contextMenuEvent( QContextMenuEvent* e ) QAction* sortAction = 0; if ( count() > 0 && myEnableSortMenu ) { menu.addSeparator(); - sortAction = menu.addAction( tr( "Enable sorting" ) ); + sortAction = menu.addAction( QtxTreeView::tr( "Enable sorting" ) ); sortAction->setCheckable( true ); sortAction->setChecked( isSortIndicatorShown() ); } diff --git a/src/Qtx/resources/Qtx_msg_fr.ts b/src/Qtx/resources/Qtx_msg_fr.ts new file mode 100644 index 000000000..346d564eb --- /dev/null +++ b/src/Qtx/resources/Qtx_msg_fr.ts @@ -0,0 +1,286 @@ + + + + + QtxTreeView + + Enable sorting + Activer le triage + + + + QtxWorkspaceAction + + Arranges the windows as overlapping tiles + Ranger les fenêtres en pavés superposés + + + Cascade + Cascade + + + Arranges the windows as nonoverlapping tiles + Ranger les fenêtres en pavés sans superposition + + + Tile + Pavé + + + Arranges the windows as nonoverlapping horizontal tiles + Ranger les fenêtres en pavés à l'horisontale et sans superposition + + + Tile horizontally + Ranger à l'horisontale + + + Arranges the windows as nonoverlapping vertical tiles + Ranger les fenêtres en pavés à la verticale et sans superposition + + + Tile vertically + Ranger au verticale + + + + QtxMainWindow + + Menu bar + Barre de menu + + + Status bar + Barre de statut + + + + QtxPathDialog + + Open file + Ouvrir le fichier + + + Save file + Sauvegarder le fichier + + + File name + Nom du fichier + + + File name not specified + Le nom du fichier n'est pas indiqué + + + File \"%1\" does not exist + Le fichier \"%1\" n'existe pas + + + File \"%1\" already exist. Do you want to overwrite it? + Le fichier \"%1\" déjà existe. Voulez-vous le réécrire? + + + Directory \"%1\" does not exist + Le répertoire \"%1\" n'existe pas + + + Directory \"%1\" can't be created because file with the same name exist + Il est impossible de créer le répertoire \"%1\" parce qu'un fichier avec ce nom déjà existe + + + Directory \"%1\" not empty. Do you want to remove all files in this directory? + Le répertoire \"%1\" n'est pas vide. Voulez-vous supprimer tous les fichier dans ce répertoire? + + + File dialog + Dialogue de fichier + + + All files (*.*) + Tous les fichiers (*.*) + + + + QtxFontEdit + + B + Bold + G + + + I + Italic + I + + + U + Underline + S + + + S + Strikethrough + R + + + + QtxPathListEdit + + Warning + Avertissement + + + Path \"%1\" doesn't exist. Add it to list anyway? + Le chemin \"%1\" n'existe pas. Faut-il l'ajouter dans la liste? + + + Error + Erreur + + + Location \"%1\" doesn't point to file + La location \"%1\" ne contient pas d'indication du fichier + + + Location \"%1\" doesn't point to directory + La location \"%1\" ne contient pas d'indication du répertoire + + + Path \"%1\" already exist in the list + Le chemin \"%1\" déjà existe dans la liste + + + + QtxMRUAction + + Most Recently Used + Récemment utilisés + + + Clear + Effacer + + + <Empty> + <Vide> + + + + QtxDialog + + &OK + &OK + + + &Cancel + &Annuler + + + C&lose + &Fermer + + + &Help + &Aide + + + &Apply + A&ppliquer + + + &Yes + &Oui + + + &No + &Non + + + + QtxSearchTool + + Case sensitive + Sensible à la casse + + + Regular expression + Expression régulaire + + + Wrap search + Terminer la recherche + + + + QtxSplash + + Error + Erreur + + + &OK + &OK + + + + QtxWorkstack + + Split vertically + Diviser verticalement + + + Split horizontally + Diviser horisontalement + + + Close + Fermer + + + Rename + Renommer + + + Enter new name: + Indiquer un nouveau nom + + + + QtxWorkstackAction + + Split the active window on two vertical parts + Diviser la fenêtre actuelle en deux parties verticales + + + Split vertically + Diviser à la verticale + + + Split the active window on two horizontal parts + Diviser la fenêtre actuelle en deux parties horisontales + + + Split horizontally + Diviser à l'horisontale + + + + QtxColorButton + + Auto + Auto + + + Other colors... + Autres couleurs... + + + + QtxColorScale + + Color scale + Echelle de couleurs + + + diff --git a/src/QxGraph/Makefile.am b/src/QxGraph/Makefile.am index a3ee2853c..d7366aee2 100755 --- a/src/QxGraph/Makefile.am +++ b/src/QxGraph/Makefile.am @@ -63,7 +63,8 @@ dist_salomeres_DATA = \ nodist_salomeres_DATA = \ QxGraph_images.qm \ - QxGraph_msg_en.qm + QxGraph_msg_en.qm \ + QxGraph_msg_fr.qm libQxGraph_la_CPPFLAGS = $(QT_INCLUDES) $(CAS_CPPFLAGS) $(PYTHON_INCLUDES) $(BOOST_CPPFLAGS) \ -I$(srcdir)/../Qtx -I$(srcdir)/../SUIT diff --git a/src/QxGraph/resources/QxGraph_msg_en.ts b/src/QxGraph/resources/QxGraph_msg_en.ts index ddd193551..08f6833f9 100644 --- a/src/QxGraph/resources/QxGraph_msg_en.ts +++ b/src/QxGraph/resources/QxGraph_msg_en.ts @@ -1,27 +1,6 @@ - - + + + @default diff --git a/src/QxGraph/resources/QxGraph_msg_fr.ts b/src/QxGraph/resources/QxGraph_msg_fr.ts new file mode 100755 index 000000000..0a67787e4 --- /dev/null +++ b/src/QxGraph/resources/QxGraph_msg_fr.ts @@ -0,0 +1,31 @@ + + + + + @default + + MEN_CHANGE_BACKGROUND + Changer l'arrier-plan... + + + MNU_PAN_VIEW + Redimensionnement + + + DSC_PAN_VIEW + Redimensionner la vue + + + MNU_RESET_VIEW + Restaurer + + + DSC_RESET_VIEW + Restaurer le Point de Vue + + + LBL_TOOLBAR_LABEL + Opérations de Visualisation + + + diff --git a/src/QxScene/Makefile.am b/src/QxScene/Makefile.am index d877bf81e..72f9947c2 100755 --- a/src/QxScene/Makefile.am +++ b/src/QxScene/Makefile.am @@ -55,7 +55,8 @@ dist_salomeres_DATA= \ nodist_salomeres_DATA= \ QxSceneViewer_images.qm \ - QxSceneViewer_msg_en.qm + QxSceneViewer_msg_en.qm \ + QxSceneViewer_msg_fr.qm libQxScene_la_CPPFLAGS=$(QT_INCLUDES) $(CAS_CPPFLAGS) $(PYTHON_INCLUDES) $(BOOST_CPPFLAGS) \ -I$(srcdir)/../Qtx -I$(srcdir)/../SUIT diff --git a/src/QxScene/resources/QxSceneViewer_msg_en.ts b/src/QxScene/resources/QxSceneViewer_msg_en.ts index 4ad001ec8..fe62d243d 100644 --- a/src/QxScene/resources/QxSceneViewer_msg_en.ts +++ b/src/QxScene/resources/QxSceneViewer_msg_en.ts @@ -1,27 +1,6 @@ - - + + + @default diff --git a/src/QxScene/resources/QxSceneViewer_msg_fr.ts b/src/QxScene/resources/QxSceneViewer_msg_fr.ts new file mode 100755 index 000000000..27fa779ac --- /dev/null +++ b/src/QxScene/resources/QxSceneViewer_msg_fr.ts @@ -0,0 +1,38 @@ + + + + + @default + + MEN_CHANGE_BACKGROUND + Changer l'arrier-plan + + + MNU_PAN_VIEW + Redimensionnement + + + DSC_PAN_VIEW + Redimensionner la vue + + + MNU_RESET_VIEW + Restaurer + + + DSC_RESET_VIEW + Restaurer le Point de Vue + + + LBL_TOOLBAR_LABEL + Opérations de Visualisation + + + + QxScene_ViewManager + + QXSCENE_VIEW_TITLE + QGraphics scène:%M - visualisateur:%V + + + diff --git a/src/STD/Makefile.am b/src/STD/Makefile.am index 7c023b577..2e8d99fb4 100755 --- a/src/STD/Makefile.am +++ b/src/STD/Makefile.am @@ -71,7 +71,8 @@ dist_salomeres_DATA = \ nodist_salomeres_DATA = \ STD_images.qm \ - STD_msg_en.qm + STD_msg_en.qm \ + STD_msg_fr.qm libstd_la_CPPFLAGS = $(QT_INCLUDES) -I$(srcdir)/../SUIT -I$(srcdir)/../Qtx libstd_la_LDFLAGS = $(QT_MT_LIBS) diff --git a/src/STD/resources/STD_msg_en.ts b/src/STD/resources/STD_msg_en.ts index b6c4b838d..d4b65578c 100644 --- a/src/STD/resources/STD_msg_en.ts +++ b/src/STD/resources/STD_msg_en.ts @@ -1,27 +1,6 @@ - - + + + @default diff --git a/src/STD/resources/STD_msg_fr.ts b/src/STD/resources/STD_msg_fr.ts new file mode 100755 index 000000000..caf464c0b --- /dev/null +++ b/src/STD/resources/STD_msg_fr.ts @@ -0,0 +1,490 @@ + + + + + @default + + TOT_DESK_EDIT_CUT + Découpe + + + PRP_DESK_EDIT_CUT + Couper la sélection et la placer dans la presse-papier + + + MEN_DESK_EDIT_CUT + &Découper + + + ERR_APP_NOAPP + Pas d'application + + + MEN_DESK_WINDOW + &Fenêtre + + + TOT_DESK_EDIT_COPY + Copier + + + MEN_DESK_WINDOW_CASCADE + &Cascade + + + PRP_DESK_EDIT_COPY + Copier la sélection dans la presse-papiers + + + PRP_DESK_WINDOW_CASCADE + Ranger les fenêtres en pavés superposés + + + TOT_DESK_FILE_SAVEAS + Enregistrer le document sous... + + + MEN_DESK_EDIT_COPY + &Copier + + + MSG_CANT_SAVE + Impossible de sauvegarder le fichier "%1". + + + INF_DESK_TOOLBAR_STANDARD + Standard + + + ALL_FILES + Tous les Fichiers (*.*) + + + DESK_DEFAULTTITLE + Qt Framework d'Applications + + + QUE_DESK_EXIT + Etes-vous sûr que vous voulez abandonner? + + + INF_INFO + Information + + + ERR_DOC_UNKNOWNTYPE_OPEN + Vous essayez d'ouvrir le document d'un type inconnu +( %1 ) + + + ERR_DOC_UNKNOWNTYPE_SAVE + Vous essayez de sauvegarder le document sous un type inconnu +( %1 ) + + + TOT_DESK_NEWWINDOW + Créer une nouvelle fenêtre + + + BUT_CANCEL + &Annuler + + + MEN_DESK_HELP_ABOUT + &A propos de... + + + PRP_DESK_NEWWINDOW + Créer une nouvelle Fenêtre + + + MEN_DESK_VIEW_STATUSBAR + &Barre de Status + + + MEN_DESK_NEWWINDOW + &Nouvelle Fenêtre + + + PRP_DESK_VIEW_STATUSBAR + Activer ou désactiver la barre de status + + + ERR_DOC_DIRWITHNAMEEXIST_SAVE + Impossible de sauvegarder le fichier %1. +Le répertoir avec ce nom existe sur la disque. Essayez d'utiliser un autre nom + + + BUT_NO + N&on + + + BUT_OK + O&k + + + FILTER_FILES + %1 Fichiers (%2) + + + PRP_DESK_WINDOW_ACTIVATE + Activer la fenêtre + + + TOT_DESK_FILE_PRINT + Imprimer un document + + + TOT_DESK_FILE_CLOSE + Fermer le document + + + TOT_DESK_FILE_NEW + Créer un nouveau document + + + PRP_DESK_FILE_NEW + Créer un nouveau document + + + PRP_DESK_FILE_MRU + Ouvrir un document + + + MEN_DESK_FILE_NEW + &Nouveau + + + MEN_DESK_FILE_MRU + &Fichiers Recents + + + TOT_DESK_EDIT_PASTE + Coller + + + MEN_DESK_VIEW_DOCKWINDOWS + W&indows + + + BUT_YES + O&ui + + + MEN_DESK_VIEW + &Vue + + + PRP_DESK_HELP_ABOUT + Montre la dialogue 'A propos' + + + MEN_DESK_FILE + Fic&hier + + + MEN_DESK_EDIT + &Editer + + + MEN_DESK_HELP + A&ide + + + ERR_ERROR + Erreur + + + ERR_DESK_NOAPP + Pas d'applications enregistrées + + + INF_DESK_DOC_CREATE + Créer un nouveau document + + + QUE_DOC_ALREADYOPEN + Le document %1 est déjà ouvert. +Voulez-vous le rouvrir? + + + BUT_APPLY + A&ppliquer + + + BUT_CLOSE + &Fermer + + + INF_DESK_EXIT + Abandonner + + + ERR_UNKNOWN + Erreur Inconnue + + + BUT_HELP + A&ide + + + PRP_DESK_FILE_CLOSE + Fermer le document actuel + + + PRP_DESK_FILE_PRINT + imprimer le document actuel + + + WRN_WARNING + Avertissement + + + TOT_DESK_HELP_ABOUT + A propos... + + + MEN_DESK_VIEW_TOOLBARS + Barres d'&Outils + + + PRP_DESK_WINDOW_HSPLIT + Diviser la fenêtre actuelle en deux parties horizontales + + + MEN_DESK_WINDOW_HSPLIT + Division &Horizontale + + + PRP_DESK_EDIT_PASTE + Insérer le contenu du Presse-papiers au point d'insertion + + + DLG_LOAD_STUDY_CAPTION + Ouvrir une Etude + + + PRP_DESK_HELP_SEARCH + Chercher de l'information sur le sujet + + + PRP_DESK_FILE_SAVEAS + Sauvegarder le document actuel sous un nouveau nom + + + INF_READY + Prêt + + + INF_CANCELLED + Annulé + + + PRP_DESK_WINDOW_VSPLIT + Diviser la fenêtre actuelle en deux parties verticales + + + MEN_DESK_WINDOW_VSPLIT + Division &Verticale + + + PRP_DESK_WINDOW_TILE + Ranger les fenêtres en pavés non-superposés + + + MEN_DESK_HELP_CONTENTS + &Contenu + + + PRP_DESK_HELP_CONTENTS + Montre le sommaire de la référence documentaire + + + MEN_DESK_WINDOW_HTILE + &Paver Horizontalement + + + MEN_DESK_WINDOW_VTILE + Paver Vertica&lement + + + ERR_DOC_PERMISSIONDENIED_SAVE + Impossible de sauvegardet le fichier %1. Authorisaton refusée. + + + INF_DESK_DOCALREADYOPEN + Impossible de sauvegarder le document sous un nom du document déjà ouvert. +Indiquez un autre nom du document que vous allez sauvegarder. +( %1 ) + + + TIT_FILE_SAVEAS + Enregistrer sous + + + MEN_DESK_FILE_CLOSE + Fer&mer + + + MSG_FILE_EXISTS + Le Fichier "%1" déjà existe. +Voulez-vous le réécrire? + + + MEN_DESK_FILE_PRINT + &Imprimer + + + MEN_DESK_HELP_SEARCH + &Recherche... + + + MEN_DESK_VIEW_STDTOOLBAR + &Standard + + + MEN_DESK_FILE_SAVEAS + Enre&gistrer Sous... + + + PRP_DESK_VIEW_STDTOOLBAR + Activer ou désactiver la barre usuelle + + + TOT_DESK_FILE_SAVE + Enregistrer un document + + + TOT_DESK_FILE_EXIT + Abandonner l'application + + + TOT_DESK_FILE_LOAD + Ouvrir le document + + + TOT_DESK_FILE_OPEN + Ouvrir un document + + + TOT_DESK_FILE_REOPEN + Rouvrir un document + + + PRP_DESK_FILE_EXIT + Abandonner l'application + + + PRP_DESK_FILE_OPEN + Ouvrir un document + + + PRP_DESK_FILE_REOPEN + Rouvrir le document actuel d'un fichier + + + PRP_DESK_FILE_SAVE + Sauvegarder le document actuel + + + PRP_DESK_FILE_LOAD + Ouvrir un document + + + PRP_DESK_WINDOW_HTILE + Ranger les fenêtres en pavés horizontales non-superposés + + + PRP_DESK_WINDOW_VTILE + Ranger les fenêtres en pavés verticales non-superposés + + + MEN_DESK_WINDOW_TILE + &Pavé + + + MEN_DESK_FILE_EXIT + A&bandonner + + + MEN_DESK_FILE_OPEN + &Ouvrir... + + + MEN_DESK_FILE_REOPEN + &Rouvrir + + + MEN_DESK_FILE_LOAD + Connec&ter... + + + MEN_DESK_FILE_SAVE + &Enregistrer + + + MEN_DESK_EDIT_PASTE + Co&ller + + + MEN_STUDIES_CHOICE + Choisir l'Etude Existante + + + + STD_Application + + INF_DOC_MODIFIED + Le document a été modifié. +Voulez-vous sauvegarder les modifications? + + + INF_DOC_SAVING + Sauvegarder l'étude + + + INF_DOC_SAVED + L'étude %1 est sauvegardée + + + TOT_DOCK_WINDOWS + Montrer / cacher les fenêtres encrables et les barres d'outils + + + MEN_DOCK_WINDOWS + Fenêtres et Barres d'outils + + + ABOUT_INFO + SUIT Std application + + + INF_DOC_SAVING_FAILS + Impossible de sauvegarder le fichier "%1". +Probablement, l'action n'est pas authorisée ou la disque est remplie. +Essayez d'utiliser un autre nom de fichier. + + + INF_DOCUMENT_MODIFIED + Le document "%1" a été modifié. +Voulez-vous sauvegarder les changements? + + + CLOSE_STUDY + Fermer l'étude actuelle + + + CLOSE_QUESTION + Voulez-vous sauvegarder l'étude avant de la fermer? + + + REOPEN_STUDY + Rouvrir l'étude + + + REOPEN_QUESTION + Voulez-vous rouvrir l'étude? +Toutes les modifications introduites après le dernier enregistrement seront perdues. + + + diff --git a/src/SUIT/Makefile.am b/src/SUIT/Makefile.am index 1cf970288..9b1df08d9 100755 --- a/src/SUIT/Makefile.am +++ b/src/SUIT/Makefile.am @@ -61,7 +61,8 @@ salomeinclude_HEADERS = \ SUIT_TreeModel.h \ SUIT_ViewManager.h \ SUIT_ViewModel.h \ - SUIT_ViewWindow.h + SUIT_ViewWindow.h \ + SUIT_ShortcutMgr.h dist_libsuit_la_SOURCES = \ SUIT_Accel.cxx \ @@ -92,7 +93,8 @@ dist_libsuit_la_SOURCES = \ SUIT_TreeModel.cxx \ SUIT_ViewManager.cxx \ SUIT_ViewModel.cxx \ - SUIT_ViewWindow.cxx + SUIT_ViewWindow.cxx \ + SUIT_ShortcutMgr.cxx MOC_FILES = \ SUIT_Accel_moc.cxx \ @@ -113,12 +115,14 @@ MOC_FILES = \ SUIT_TreeModel_moc.cxx \ SUIT_ViewManager_moc.cxx \ SUIT_ViewModel_moc.cxx \ - SUIT_ViewWindow_moc.cxx + SUIT_ViewWindow_moc.cxx \ + SUIT_ShortcutMgr_moc.cxx nodist_libsuit_la_SOURCES = $(MOC_FILES) nodist_salomeres_DATA = \ - SUIT_msg_en.qm + SUIT_msg_en.qm \ + SUIT_msg_fr.qm libsuit_la_CPPFLAGS = $(QT_INCLUDES) -I$(srcdir)/../Qtx -I$(srcdir)/../ObjBrowser diff --git a/src/SUIT/SUIT_Application.cxx b/src/SUIT/SUIT_Application.cxx index 7624b5c6a..e7129b5e8 100755 --- a/src/SUIT/SUIT_Application.cxx +++ b/src/SUIT/SUIT_Application.cxx @@ -26,6 +26,7 @@ #include "SUIT_Session.h" #include "SUIT_Desktop.h" #include "SUIT_ResourceMgr.h" +#include "SUIT_ShortcutMgr.h" #include #include @@ -37,6 +38,7 @@ #include #include + /*! \class StatusLabel \brief Status bar customization label. Used to workaroubd desktop resizing bug. @@ -123,6 +125,9 @@ void SUIT_Application::start() { if ( desktop() ) desktop()->show(); + + // Initialize shortcut manager + SUIT_ShortcutMgr::Init(); } /*! @@ -174,6 +179,15 @@ SUIT_ResourceMgr* SUIT_Application::resourceMgr() const return SUIT_Session::session()->resourceMgr(); } +/*! + \brief Get access to shortcut manager. + \return global shortcut manager +*/ +SUIT_ShortcutMgr* SUIT_Application::shortcutMgr() const +{ + return SUIT_ShortcutMgr::getShortcutMgr(); +} + #define DEFAULT_MESSAGE_DELAY 3000 /*! @@ -612,9 +626,10 @@ QList SUIT_Application::actionIds() const */ QAction* SUIT_Application::createAction( const int id, const QString& text, const QIcon& icon, const QString& menu, const QString& tip, const int key, - QObject* parent, const bool toggle, QObject* reciever, const char* member ) + QObject* parent, const bool toggle, QObject* reciever, + const char* member, const QString& shortcutAction ) { - QtxAction* a = new QtxAction( text, icon, menu, key, parent, toggle ); + QtxAction* a = new QtxAction( text, icon, menu, key, parent, toggle, shortcutAction ); a->setStatusTip( tip ); if ( reciever && member ) diff --git a/src/SUIT/SUIT_Application.h b/src/SUIT/SUIT_Application.h index e04cee4f5..3773977fc 100755 --- a/src/SUIT/SUIT_Application.h +++ b/src/SUIT/SUIT_Application.h @@ -37,6 +37,7 @@ class QWidget; class SUIT_Desktop; class SUIT_ViewModel; class SUIT_ResourceMgr; +class SUIT_ShortcutMgr; class SUIT_Study; #ifdef WIN32 @@ -97,6 +98,8 @@ public: SUIT_ResourceMgr* resourceMgr() const; + SUIT_ShortcutMgr* shortcutMgr() const; + //! Puts the message to the status bar void putInfo ( const QString&, const int = 0 ); @@ -164,7 +167,8 @@ protected: int registerAction( const int, QAction* ); QAction* createAction( const int, const QString&, const QIcon&, const QString&, const QString&, const int, QObject* = 0, - const bool = false, QObject* = 0, const char* = 0 ); + const bool = false, QObject* = 0, const char* = 0, + const QString& = QString() ); protected slots: virtual void onDesktopActivated(); @@ -173,6 +177,7 @@ private: SUIT_Study* myStudy; SUIT_Desktop* myDesktop; QMap myActionMap; + SUIT_ShortcutMgr* myShortcutMgr; QLabel* myStatusLabel; }; diff --git a/src/SUIT/SUIT_ShortcutMgr.cxx b/src/SUIT/SUIT_ShortcutMgr.cxx new file mode 100644 index 000000000..44eb8a950 --- /dev/null +++ b/src/SUIT/SUIT_ShortcutMgr.cxx @@ -0,0 +1,187 @@ +// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "SUIT_ShortcutMgr.h" + +#include "SUIT_Session.h" +#include "SUIT_ResourceMgr.h" + +#include + +#include +#include + +SUIT_ShortcutMgr* SUIT_ShortcutMgr::myShortcutMgr = NULL; + +/*! + \brief Constructor +*/ +SUIT_ShortcutMgr::SUIT_ShortcutMgr() +: QObject() +{ + qApp->installEventFilter( this ); +} + +/*! + \brief Destructor +*/ +SUIT_ShortcutMgr::~SUIT_ShortcutMgr() +{ + qApp->removeEventFilter( this ); +} + +/*! + \brief Create new instance of shortcut manager. +*/ +void SUIT_ShortcutMgr::Init() +{ + if( myShortcutMgr==NULL ) + myShortcutMgr = new SUIT_ShortcutMgr(); +} + +/*! + \brief Return shortcut manager. +*/ +SUIT_ShortcutMgr* SUIT_ShortcutMgr::getShortcutMgr() +{ + Init(); + + return myShortcutMgr; +} + +/*! + \brief Custom event filter for qapplication . + + Redefined from QObject::eventFilter(); +*/ +bool SUIT_ShortcutMgr::eventFilter( QObject* o, QEvent* e ) +{ + if ( e->type() == QEvent::ActionAdded ) { + QActionEvent* anActionEvent = (QActionEvent*)e; + if (anActionEvent) { + QtxAction* anAction = qobject_cast( anActionEvent->action() ); + if ( anAction ) + processAction( anAction ); + } + } + + return QObject::eventFilter( o, e ); +} + +/*! + \brief Return key sequence for shortcut action name. + \param actionName name of shortcut action in preferences + \return key sequence defined in preferences or empty sequence +*/ +QKeySequence SUIT_ShortcutMgr::getShortcutByActionName( const QString& actionName ) const +{ + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + + QString section = actionName.section( resMgr->sectionsToken(), 0, 0 ); + section.prepend( QString("shortcuts") + resMgr->sectionsToken() ); + QString parameter = actionName.section( resMgr->sectionsToken(), 1, 1 ); + + QString shortcutValue; + bool hasValue = resMgr->value( section, parameter, shortcutValue, false ); + + if ( !hasValue ) + return QKeySequence(); + + return QKeySequence::fromString( shortcutValue ); +} + +/*! + \brief Set shortcut to the given action if the shortcut is defined. + \param action action to process + */ +void SUIT_ShortcutMgr::processAction( QtxAction* action ) +{ + QString shortcutActionName = action->shortcutActionName(); + + if ( !shortcutActionName.isEmpty() ) { + // Add action to the actions map + if ( !myShortcutActions.contains( shortcutActionName, action ) ) { + myShortcutActions.insert( shortcutActionName, action ); + connect( action, SIGNAL( destroyed( QObject* ) ), + this, SLOT ( onActionDestroyed( QObject* ) ) ); + } + + QKeySequence keySeq = getShortcutByActionName( shortcutActionName ); + action->setShortcut( keySeq ); + } +} + +/*! + \brief Enable/disable a shortcuts section. + + Enables or disables actions which belong to the given shortcuts section. + Only actions which have an active desktop as a parent widget + are taken into account. + + \param section shorcuts section + \param on if \c true - action will be enabled, otherwise - disabled +*/ +void SUIT_ShortcutMgr::setSectionEnabled( const QString& section, const bool on ) +{ + QMap::ConstIterator it; + for ( it = myShortcutActions.constBegin(); it != myShortcutActions.constEnd(); ++it ) { + QtxAction* action = it.value(); + QString shortcutActionName = action->shortcutActionName(); + QString actionSection = shortcutActionName.section( ":", 0, 0 ); + if ( actionSection == section ) { + // Check if the action parent widget equals to the active desktop + SUIT_Application* app = SUIT_Session::session()->activeApplication(); + if ( !app ) + return; + if ( action->parentWidget() == (QWidget*)app->desktop() ) + action->setEnabled( on ); + } + } +} + +/*! + \brief Update shortcuts from preferences. +*/ +void SUIT_ShortcutMgr::updateShortcuts() +{ + QMap::ConstIterator it; + for ( it = myShortcutActions.constBegin(); it != myShortcutActions.constEnd(); ++it ) { + QtxAction* action = it.value(); + QKeySequence keySeq = getShortcutByActionName( action->shortcutActionName() ); + action->setShortcut( keySeq ); + } +} + +/*! + \brief Called when the corresponding action is destroyed. + + Removes destroyed action from the actions list. + + \param obj action being destroyed +*/ +void SUIT_ShortcutMgr::onActionDestroyed( QObject* obj ) +{ + QtxAction* anAction = (QtxAction*)obj; + + if ( anAction ) + myShortcutActions.remove( anAction->shortcutActionName(), anAction ); +} diff --git a/src/SUIT/SUIT_ShortcutMgr.h b/src/SUIT/SUIT_ShortcutMgr.h new file mode 100644 index 000000000..eafd854e2 --- /dev/null +++ b/src/SUIT/SUIT_ShortcutMgr.h @@ -0,0 +1,75 @@ +// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef SUIT_SHORTCUTMGR_H +#define SUIT_SHORTCUTMGR_H + +#include "SUIT.h" + +#include +#include + +class QtxAction; + +class QKeySequence; + +#if defined WIN32 +#pragma warning( disable: 4251 ) +#endif + +/*! + \class SUIT_ShortcutMgr + \brief Class which manages shortcuts customization. +*/ +class SUIT_EXPORT SUIT_ShortcutMgr: public QObject +{ + Q_OBJECT +public: + static void Init(); + static SUIT_ShortcutMgr* getShortcutMgr(); + + void setSectionEnabled( const QString&, const bool = true ); + void updateShortcuts(); + +protected: + SUIT_ShortcutMgr(); + virtual ~SUIT_ShortcutMgr(); + +private slots: + void onActionDestroyed( QObject* ); + +private: + virtual bool eventFilter( QObject* o, QEvent* e ); + + void processAction( QtxAction* ); + QKeySequence getShortcutByActionName( const QString& ) const; + +private: + static SUIT_ShortcutMgr* myShortcutMgr; + QMultiMap myShortcutActions; +}; + +#if defined WIN32 +#pragma warning( default: 4251 ) +#endif + +#endif diff --git a/src/SUIT/resources/SUIT_msg_en.ts b/src/SUIT/resources/SUIT_msg_en.ts index d477c7f9c..c9465cf2c 100644 --- a/src/SUIT/resources/SUIT_msg_en.ts +++ b/src/SUIT/resources/SUIT_msg_en.ts @@ -1,27 +1,6 @@ - - + + + @default diff --git a/src/SUIT/resources/SUIT_msg_fr.ts b/src/SUIT/resources/SUIT_msg_fr.ts new file mode 100755 index 000000000..cf287361a --- /dev/null +++ b/src/SUIT/resources/SUIT_msg_fr.ts @@ -0,0 +1,150 @@ + + + + + @default + + MEN_DESK_WINDOW + &Fenêtre + + + ERR_CANT_DUMP_VIEW + Impossible de clicher le contenu de la vue au fichier. + + + TLT_IMAGE_FILES + Fichiers Images (*.bmp *.png *.jpg *.jpeg) + + + MEN_DESK_WINDOW_CASCADE + &Cascade + + + PRP_DESK_WINDOW_CASCADE + Superposer les fenêtres + + + ERR_DIR_NOT_EXIST + Le répertoire "%1" n'existe pas! + + + ERR_FILE_NOT_DIR + "%1" n'est pas un répertoire! + + + CONTINUE + Continuer + + + CANCEL + Annuler + + + ERR_FILE_NOT_EXIST + Le fichier "%1" n'existe pas! + + + QUE_DOC_FILEEXISTS + Le fichier %1 déjà existe. Faut-il le réécrire? + + + PRP_DESK_WINDOW_ACTIVATE + Activer la fenêtre + + + ERR_PERMISSION_DENIED + Impossible de sauvegarder le fichier "%1". +Autorisation interdite. + + + ERR_OPEN_PERMISSION_DENIED + Impossible de sauvegarder le fichier "%1". +Autorisation interdite. + + + ERR_DIR_READ_PERMISSION_DENIED + Impossible de sauvegarder le répertoire "%1". +Autorisation interdite. + + + ERR_DIR_WRITE_PERMISSION_DENIED + Impossible de sauvegarder le répertoire "%1". +Autorisation interdite. + + + ERR_ERROR + Erreur + + + QUE_FILE_EXISTS + Le fichier "%1" déjà existe. +Faut-il le réécrire? + + + WRN_WARNING + Avertissement + + + TLT_DUMP_VIEW + Clicher la Vue au Fichier + + + PRP_DESK_WINDOW_TILE + Placer les fenêtres sans superposition + + + MEN_DESK_WINDOW_VTILE + Paver &Verticalement + + + INF_DIRECTORIES_FILTER + Répertoires + + + PRP_DESK_WINDOW_VTILE + Placer les fenêtres verticalement et sans superposition + + + MEN_DESK_WINDOW_TILE + &Paver + + + NAME_COLUMN + Nom + + + + SUIT_Study + + OPERATION_LAUNCH + Lancer l'Opération + + + PREVIOUS_NOT_FINISHED + L'opération précédente n'est pas aboutie et sera interrompue + + + + SUIT_FileDlg + + LAB_QUICK_PATH + Chemin Court: + + + BUT_ADD_PATH + Ajouter un chemin + + + INF_DESK_DOC_OPEN + Ouvrir un Fichier + + + INF_DESK_DOC_SAVE + Sauvegarder un Fichier + + + ALL_FILES_FILTER + Tous les Fichiers (*) + + + diff --git a/src/SUITApp/Makefile.am b/src/SUITApp/Makefile.am index 30e2e8264..cc87c70de 100644 --- a/src/SUITApp/Makefile.am +++ b/src/SUITApp/Makefile.am @@ -46,7 +46,7 @@ MOC_FILES = \ nodist_libSUITApp_la_SOURCES = $(MOC_FILES) -nodist_salomeres_DATA = SUITApp_msg_en.qm +nodist_salomeres_DATA = SUITApp_msg_en.qm SUITApp_msg_fr.qm libSUITApp_la_CPPFLAGS = $(QT_INCLUDES) $(PYTHON_INCLUDES) \ -I$(srcdir)/../SUIT -I$(srcdir)/../Qtx -I$(srcdir)/../Style diff --git a/src/SUITApp/SUITApp.cxx b/src/SUITApp/SUITApp.cxx index 989542ba4..9668c4e18 100644 --- a/src/SUITApp/SUITApp.cxx +++ b/src/SUITApp/SUITApp.cxx @@ -248,7 +248,7 @@ int main( int argc, char* argv[] ) { if ( resMgr ) { - resMgr->loadLanguage( false ); + resMgr->loadLanguage(); splash = QtxSplash::splash( QPixmap() ); splash->readSettings( resMgr ); diff --git a/src/SUITApp/resources/SUITApp_msg_en.ts b/src/SUITApp/resources/SUITApp_msg_en.ts index 23ba569c8..b67d2ec37 100644 --- a/src/SUITApp/resources/SUITApp_msg_en.ts +++ b/src/SUITApp/resources/SUITApp_msg_en.ts @@ -1,27 +1,6 @@ - - + + + @default diff --git a/src/SUITApp/resources/SUITApp_msg_fr.ts b/src/SUITApp/resources/SUITApp_msg_fr.ts new file mode 100755 index 000000000..92f8f53fb --- /dev/null +++ b/src/SUITApp/resources/SUITApp_msg_fr.ts @@ -0,0 +1,19 @@ + + + + + @default + + APP_OK + Ok + + + APP_ERROR + Erreur + + + APP_UNK_EXCEPTION + Exception inconnue + + + diff --git a/src/SUPERVGraph/Makefile.am b/src/SUPERVGraph/Makefile.am index f33bbbbcd..35e262500 100755 --- a/src/SUPERVGraph/Makefile.am +++ b/src/SUPERVGraph/Makefile.am @@ -49,7 +49,8 @@ dist_salomeres_DATA = \ nodist_salomeres_DATA = \ SUPERVGraph_images.qm \ - SUPERVGraph_msg_en.qm + SUPERVGraph_msg_en.qm \ + SUPERVGraph_msg_fr.qm libSUPERVGraph_la_CPPFLAGS = $(QT_INCLUDES) $(CAS_CPPFLAGS) $(PYTHON_INCLUDES) $(BOOST_CPPFLAGS) \ -I$(srcdir)/../Qtx -I$(srcdir)/../SUIT -I$(srcdir)/../OBJECT diff --git a/src/SUPERVGraph/resources/SUPERVGraph_msg_en.ts b/src/SUPERVGraph/resources/SUPERVGraph_msg_en.ts index 922fe3dcd..6a21a259e 100644 --- a/src/SUPERVGraph/resources/SUPERVGraph_msg_en.ts +++ b/src/SUPERVGraph/resources/SUPERVGraph_msg_en.ts @@ -1,27 +1,6 @@ - - + + + @default diff --git a/src/SUPERVGraph/resources/SUPERVGraph_msg_fr.ts b/src/SUPERVGraph/resources/SUPERVGraph_msg_fr.ts new file mode 100755 index 000000000..047e85194 --- /dev/null +++ b/src/SUPERVGraph/resources/SUPERVGraph_msg_fr.ts @@ -0,0 +1,27 @@ + + + + + @default + + MNU_PAN_VIEW + Redimensionnement + + + DSC_PAN_VIEW + Redimensionnement de la vue + + + MNU_RESET_VIEW + Restaurer + + + DSC_RESET_VIEW + Restaurer le Point de Vue + + + LBL_TOOLBAR_LABEL + Opérations de Visualisation + + + diff --git a/src/SVTK/Makefile.am b/src/SVTK/Makefile.am index 6f626d02f..9ecf180b4 100755 --- a/src/SVTK/Makefile.am +++ b/src/SVTK/Makefile.am @@ -136,6 +136,7 @@ dist_salomeres_DATA=\ nodist_salomeres_DATA = \ SVTK_msg_en.qm \ + SVTK_msg_fr.qm \ SVTK_images.qm libSVTK_la_CPPFLAGS = \ diff --git a/src/SVTK/SVTK_ViewWindow.cxx b/src/SVTK/SVTK_ViewWindow.cxx index 10c16646e..a8fa48f19 100755 --- a/src/SVTK/SVTK_ViewWindow.cxx +++ b/src/SVTK/SVTK_ViewWindow.cxx @@ -1634,52 +1634,59 @@ void SVTK_ViewWindow::createActions(SUIT_ResourceMgr* theResourceMgr) // Projections anAction = new QtxAction(tr("MNU_FRONT_VIEW"), theResourceMgr->loadPixmap( "VTKViewer", tr( "ICON_VTKVIEWER_VIEW_FRONT" ) ), - tr( "MNU_FRONT_VIEW" ), 0, this); + tr( "MNU_FRONT_VIEW" ), 0, this, false, "Viewers:Front view"); anAction->setStatusTip(tr("DSC_FRONT_VIEW")); connect(anAction, SIGNAL(activated()), this, SLOT(onFrontView())); + this->addAction(anAction); mgr->registerAction( anAction, FrontId ); anAction = new QtxAction(tr("MNU_BACK_VIEW"), theResourceMgr->loadPixmap( "VTKViewer", tr( "ICON_VTKVIEWER_VIEW_BACK" ) ), - tr( "MNU_BACK_VIEW" ), 0, this); + tr( "MNU_BACK_VIEW" ), 0, this, false, "Viewers:Back view"); anAction->setStatusTip(tr("DSC_BACK_VIEW")); connect(anAction, SIGNAL(activated()), this, SLOT(onBackView())); + this->addAction(anAction); mgr->registerAction( anAction, BackId ); anAction = new QtxAction(tr("MNU_TOP_VIEW"), theResourceMgr->loadPixmap( "VTKViewer", tr( "ICON_VTKVIEWER_VIEW_TOP" ) ), - tr( "MNU_TOP_VIEW" ), 0, this); + tr( "MNU_TOP_VIEW" ), 0, this, false, "Viewers:Top view"); anAction->setStatusTip(tr("DSC_TOP_VIEW")); connect(anAction, SIGNAL(activated()), this, SLOT(onTopView())); + this->addAction(anAction); mgr->registerAction( anAction, TopId ); anAction = new QtxAction(tr("MNU_BOTTOM_VIEW"), theResourceMgr->loadPixmap( "VTKViewer", tr( "ICON_VTKVIEWER_VIEW_BOTTOM" ) ), - tr( "MNU_BOTTOM_VIEW" ), 0, this); + tr( "MNU_BOTTOM_VIEW" ), 0, this, false, "Viewers:Bottom view"); anAction->setStatusTip(tr("DSC_BOTTOM_VIEW")); connect(anAction, SIGNAL(activated()), this, SLOT(onBottomView())); + this->addAction(anAction); mgr->registerAction( anAction, BottomId ); anAction = new QtxAction(tr("MNU_LEFT_VIEW"), theResourceMgr->loadPixmap( "VTKViewer", tr( "ICON_VTKVIEWER_VIEW_LEFT" ) ), - tr( "MNU_LEFT_VIEW" ), 0, this); + tr( "MNU_LEFT_VIEW" ), 0, this, false, "Viewers:Left view"); anAction->setStatusTip(tr("DSC_LEFT_VIEW")); connect(anAction, SIGNAL(activated()), this, SLOT(onLeftView())); + this->addAction(anAction); mgr->registerAction( anAction, LeftId ); anAction = new QtxAction(tr("MNU_RIGHT_VIEW"), theResourceMgr->loadPixmap( "VTKViewer", tr( "ICON_VTKVIEWER_VIEW_RIGHT" ) ), - tr( "MNU_RIGHT_VIEW" ), 0, this); + tr( "MNU_RIGHT_VIEW" ), 0, this, false, "Viewers:Right view"); anAction->setStatusTip(tr("DSC_RIGHT_VIEW")); connect(anAction, SIGNAL(activated()), this, SLOT(onRightView())); + this->addAction(anAction); mgr->registerAction( anAction, RightId ); // Reset anAction = new QtxAction(tr("MNU_RESET_VIEW"), theResourceMgr->loadPixmap( "VTKViewer", tr( "ICON_VTKVIEWER_VIEW_RESET" ) ), - tr( "MNU_RESET_VIEW" ), 0, this); + tr( "MNU_RESET_VIEW" ), 0, this, false, "Viewers:Reset view"); anAction->setStatusTip(tr("DSC_RESET_VIEW")); connect(anAction, SIGNAL(activated()), this, SLOT(onResetView())); + this->addAction(anAction); mgr->registerAction( anAction, ResetId ); // onViewTrihedron: Shows - Hides Trihedron diff --git a/src/SVTK/resources/SVTK_msg_en.ts b/src/SVTK/resources/SVTK_msg_en.ts index 9d7454fcf..3663ce51e 100644 --- a/src/SVTK/resources/SVTK_msg_en.ts +++ b/src/SVTK/resources/SVTK_msg_en.ts @@ -1,27 +1,6 @@ - - + + + @default @@ -534,11 +513,11 @@ Please, refer to the documentation. LBL_TOBBCENTER Set to Bounding Box Center - + LBL_TOORIGIN Set to Origin - + LBL_SELECTPOINT Select Point from View diff --git a/src/SVTK/resources/SVTK_msg_fr.ts b/src/SVTK/resources/SVTK_msg_fr.ts new file mode 100755 index 000000000..be1f001ae --- /dev/null +++ b/src/SVTK/resources/SVTK_msg_fr.ts @@ -0,0 +1,622 @@ + + + + + @default + + MNU_FRONT_VIEW + Arrière + + + ERROR + Erreur + + + MNU_DUMP_VIEW + Clicher la scène... + + + DSC_TOP_VIEW + Vue de dessus + + + MNU_PAN_VIEW + Panoramique + + + MNU_TOP_VIEW + Devant + + + DSC_GLOBALPAN_VIEW + Sélection d'un nouveau centre de la vue + + + DSC_ROTATE_VIEW + Tourner le point de vue autour du centre de la scène + + + MNU_ZOOM_VIEW + Zoom + + + DSC_PAN_VIEW + Redimensionner la vue + + + DSC_LEFT_VIEW + Vue de gauche + + + DSC_FITALL + Redimensionner la scène pour montrer tous les objets + + + MNU_FITALL + Montrer Tous + + + MNU_ROTATE_VIEW + Rotation + + + DSC_SHOW_TRIHEDRON + Montrer/Cacher les axes de coordonnées dans la scène + + + DSC_FRONT_VIEW + Vue de devant + + + MNU_GLOBALPAN_VIEW + Panoramique globale + + + INF_APP_DUMP_VIEW + Clicher la vue + + + MNU_BACK_VIEW + Arrière + + + MNU_SHOW_TRIHEDRON + Montrer les axes de coordonnées + + + DSC_CHANGINGROTATIONPOINT_VIEW + Changer le point, autour duquel la scène est tournée + + + MNU_BOTTOM_VIEW + Dessous + + + MNU_RESET_VIEW + Restaurer + + + MNU_LEFT_VIEW + Gauche + + + DSC_RIGHT_VIEW + Vue de droit + + + MNU_CHANGINGROTATIONPOINT_VIEW + Changer le Point de Rotation + + + DSC_FITRECT + Redimensionner la scène pour ne montrer que sa partie choisie par l'encadré + + + MNU_FITRECT + Montrer l'encadré + + + DSC_BOTTOM_VIEW + Vue de dessous + + + DSC_DUMP_VIEW + Sauvegarder la scène actuelle au fichier image + + + DSC_ZOOM_VIEW + Zoomer la vue + + + VTK_IMAGE_FILES + Fichiers Images (*.bmp *.png *.jpg *.jpeg) + + + DSC_RESET_VIEW + Restaurer le Point de Vue + + + ERR_DOC_CANT_SAVE_FILE + Impossible de sauvegarder le fichier + + + MNU_RIGHT_VIEW + Droit + + + LBL_TOOLBAR_LABEL + Opérations de Visualisation + + + DSC_BACK_VIEW + Vue d'arrière + + + SVTK_IMAGE_FILES + Fichiers Images (*.bmp *.png *.jpg *.jpeg *.pdf *.ps *.eps) + + + MNU_VIEWPARAMETERS_VIEW + Changer les Paramètres de Visualisation + + + DSC_VIEWPARAMETERS_VIEW + Changer les paramètres de la vue + + + MNU_SVTK_PARALLEL_MODE + Mode Orthogonal + + + DSC_SVTK_PARALLEL_MODE + Choisir la projection orthogonale + + + MNU_SVTK_PERSPECTIVE_MODE + Mode Perspective + + + DSC_SVTK_PERSPECTIVE_MODE + Choisir la projection perspective + + + DSC_SVTK_STYLE_SWITCH + Changer le style d'intéraction + + + MNU_SVTK_STYLE_SWITCH + Changer le Style d'Interaction + + + + SVTK_CubeAxesDlg + + X_AXIS + Axe X + + + Y_AXIS + Axe Y + + + Z_AXIS + Axe Z + + + CAPTION + Axes Graduées + + + IS_VISIBLE + Est visible + + + FONT + Font + + + NAME + Nom + + + TICK_MARKS + Marques de Graduation + + + LABELS + Repères + + + LENGTH + Longueur + + + NUMBER + Numéro + + + OFFSET + Décalage + + + AXIS_NAME + Nom de l'Axe + + + + SVTK_FontWidget + + BOLD + Gras + + + ARIAL + Arial + + + TIMES + Times + + + ITALIC + Italique + + + SHADOW + Ombré + + + COURIER + Courier + + + + SVTK_ViewWindow + + DSC_SVTK_UPDATE_RATE + Fréquence de mise à jour + + + DSC_SVTK_SCALING + Mise à l'échelle + + + MNU_SVTK_SCALING + Echelle + + + MNU_SVTK_GRADUATED_AXES + Axes Graduées + + + DSC_SVTK_GRADUATED_AXES + Axes Graduées + + + MNU_SVTK_UPDATE_RATE + Fréquence de mise à jour + + + DSC_SVTK_RECORDING_START + Commencer l'enregistrement + + + MNU_SVTK_RECORDING_START + Commencer + + + DSC_SVTK_RECORDING_PLAY + Reprendre l'enregistrement + + + MNU_SVTK_RECORDING_PLAY + Reprendre + + + DSC_SVTK_RECORDING_PAUSE + Pauser l'enregistrement + + + MNU_SVTK_RECORDING_PAUSE + Pauser + + + DSC_SVTK_RECORDING_STOP + Arrêter l'enregistrement + + + MNU_SVTK_RECORDING_STOP + Arrêter + + + LBL_TOOLBAR_RECORD_LABEL + Opérations d'Enregistrement + + + MSG_NO_AVI_MAKER + l'outil jpeg2yuv, requis pour enregistrer les fichiers AVI, n'est pas disponible. +Adressez-vous à la documentation. + + + + SVTK_NonIsometricDlg + + LBL_X + X: + + + LBL_Y + Y: + + + LBL_Z + Z: + + + MEN_SCALING + Echelle + + + DLG_TITLE + Mise à l'échelle + + + + SVTK_RecorderDlg + + ALL_DISLPAYED_FRAMES + Enregistrer tous les cadres visualisés + + + CLOSE + Fermer + + + DLG_RECORDER_TITLE + Enregistrer + + + FILE_NAME + Sauvegarder au fichier : + + + FLT_ALL_FILES + Tous les Fichiers (*.*) + + + FLT_AVI_FILES + Fichiers AVI (*.avi) + + + FPS + FPS : + + + HELP + Aide + + + PROGRESSIVE + Progressive + + + QUALITY + Qualité : + + + RECORDING_MODE + Mode : + + + SETTINGS + Paramètres + + + SKIPPED_FRAMES + Enregistrer avec FPS donné + + + START + Commencer + + + + SVTK_SetRotationPointDlg + + LBL_X + X: + + + LBL_Y + Y: + + + LBL_Z + Z: + + + LBL_CENTER_OF_BOUNDING_BOX + Centre de la boîte englobante + + + RBUTTONGROUP_TITLE + Le type du point de rotation + + + USE_BBCENTER + Utiliser le Centre de la boîte englobante + + + LBL_ORIGIN + Origine du système de coordonnées + + + LBL_SELECTED_POINT + Point Choisi + + + LBL_TOORIGIN + Réinitialiser + + + LBL_SELECTPOINT + Choisir un Point dans la Vue + + + DLG_TITLE + Définir le Point de Rotation + + + + SVTK_ViewParameterDlg + + LBL_X + X : + + + LBL_Y + Y : + + + LBL_Z + Z : + + + LBL_DX + DX : + + + LBL_DY + DY : + + + LBL_DZ + DZ : + + + PROJECTION_MODE + Mode de Projection + + + ORTHOGONAL_MODE + Orthogonal + + + PERSPECTIVE_MODE + Perspective + + + USE_BBCENTER + Utiliser le Centre de la Boîte Englobante + + + LBL_TOBBCENTER + Initialiser au Centre de la Boîte Englobante + + + LBL_TOORIGIN + Initialiser à l'Origine + + + LBL_SELECTPOINT + Choisir un Point de la Vue + + + FOCAL_POINT + Point Focal + + + CAMERA_POSITION + Position de la Caméra + + + WORLD_COORDINATES + Coordonnées du Monde + + + FOCAL_RELATIVE + Relative au Point Focal + + + PROJECTION_DIRECTION + Direction de la Projection : + + + FOCAL_DISTANCE + Distance Focale : + + + VIEW_UP_DIRECTION + Direction du Regard en Haut: + + + ZOOMING + Zoom + + + LBL_SCALE + Echelle + + + LBL_VIEW_ANGLE + Angle de Visualisation + + + DLG_TITLE + Paramètres de la Visualisation + + + + SVTK_UpdateRateDlg + + INFORMATION_FRAME_TITLE + Information sur le Rendu + + + STILL + La fréquence réduite de mise à jour , FPS + + + INPUT_FRAME_TITLE + Activer + + + NUMBER_CELLS + Nombre de Cellules, - + + + DESIRED + La fréquence de mise à jour requise, FPS + + + CURRENT_FPS + La fréquence actuelle de mise à jour , FPS + + + DLG_TITLE + Fréquence de mise à jour + + + + SVTK_ViewManager + + VTK_VIEW_TITLE + VTK scène:%1 - visualisateur:%2 + + + + SVTK_Viewer + + MEN_DUMP_VIEW + Clicher la Vue... + + + MEN_SHOW_TOOLBAR + Montrer la barre d'outils + + + MEN_CHANGE_BACKGROUD + Changer l'arrière-plan... + + + diff --git a/src/SalomeApp/Makefile.am b/src/SalomeApp/Makefile.am index 9c94a2680..c82f8e5eb 100755 --- a/src/SalomeApp/Makefile.am +++ b/src/SalomeApp/Makefile.am @@ -98,13 +98,16 @@ nodist_libSalomeApp_la_SOURCES = $(MOC_FILES) # python modules salomepython_PYTHON = salome_pluginsmanager.py +dist_salomescript_DATA = addvars2notebook.py + dist_salomeres_DATA = \ resources/SalomeApp.ini \ resources/SalomeApp.xml nodist_salomeres_DATA = \ SalomeApp_images.qm \ - SalomeApp_msg_en.qm + SalomeApp_msg_en.qm \ + SalomeApp_msg_fr.qm libSalomeApp_la_CPPFLAGS = $(PYTHON_INCLUDES) $(QT_INCLUDES) $(QWT_INCLUDES) \ $(CAS_CPPFLAGS) $(VTK_INCLUDES) $(BOOST_CPPFLAGS) @KERNEL_CXXFLAGS@ \ diff --git a/src/SalomeApp/SalomeApp_Application.cxx b/src/SalomeApp/SalomeApp_Application.cxx index 8dc5250f3..00bf15f8f 100644 --- a/src/SalomeApp/SalomeApp_Application.cxx +++ b/src/SalomeApp/SalomeApp_Application.cxx @@ -84,6 +84,7 @@ #include #include #include +#include #include #include @@ -205,26 +206,45 @@ void SalomeApp_Application::start() // import/execute python scripts if ( pyfiles.count() > 0 && activeStudy() ) { SalomeApp_Study* appStudy = dynamic_cast( activeStudy() ); - if ( appStudy ) { + PyConsole_Console* pyConsole = pythonConsole(); + if ( appStudy && pyConsole ) { _PTR(Study) aStudy = appStudy->studyDS(); if ( !aStudy->GetProperties()->IsLocked() ) { for (uint j = 0; j < pyfiles.count(); j++ ) { QFileInfo fi ( pyfiles[j] ); - PyConsole_Console* pyConsole = pythonConsole(); - if ( pyConsole ) { - QString extension = fi.suffix().toLower(); - if ( fi.exists() ) { - // execute python script - QString command = QString( "execfile(r\"%1\")" ).arg( fi.absoluteFilePath() ); - pyConsole->exec( command ); - } - else { - // import python module - QString command = QString( "import %1" ).arg( pyfiles[j] ); - if ( extension == "py" ) - command = QString( "import %1" ).arg( fi.completeBaseName() ); - pyConsole->exec( command ); - } + QFileInfo fipy ( pyfiles[j] + ".py" ); + QString command = QString( "execfile(r\"%1\")" ); + if ( fi.isAbsolute() ) { + if ( fi.exists() ) + pyConsole->exec( command.arg( fi.absoluteFilePath() ) ); + else if ( fipy.exists() ) + pyConsole->exec( command.arg( fipy.absoluteFilePath() ) ); + else + qDebug() << "Can't execute file" << pyfiles[j]; + } + else { + bool found = false; + QStringList dirs; + dirs << QDir::currentPath(); + if ( ::getenv( "PYTHONPATH" ) ) + dirs += QString( ::getenv( "PYTHONPATH" ) ).split( QRegExp( "[:|;]" ) ); + foreach( QString dir, dirs ) { + qDebug() << "try" << QFileInfo( dir, pyfiles[j] ).absoluteFilePath(); + qDebug() << "try" << QFileInfo( dir, pyfiles[j] + ".py" ).absoluteFilePath(); + if ( QFileInfo( dir, pyfiles[j] ).exists() ) { + pyConsole->exec( command.arg( QFileInfo( dir, pyfiles[j] ).absoluteFilePath() ) ); + found = true; + break; + } + else if ( QFileInfo( dir, pyfiles[j] + ".py" ).exists() ) { + pyConsole->exec( command.arg( QFileInfo( dir, pyfiles[j] + ".py" ).absoluteFilePath() ) ); + found = true; + break; + } + } + if ( !found ) { + qDebug() << "Can't execute file" << pyfiles[j]; + } } } } diff --git a/src/SalomeApp/addvars2notebook.py b/src/SalomeApp/addvars2notebook.py new file mode 100644 index 000000000..6f2375543 --- /dev/null +++ b/src/SalomeApp/addvars2notebook.py @@ -0,0 +1,67 @@ + +import os +import os.path + +def addvars2notebook(filename): + # + vars_and_values = [] + contents = [] + # + directory = os.path.dirname(filename) + base = os.path.basename(filename) + prefix = base[:-3] # remove ".py" + prefix = prefix + '_' + from os import listdir + l = listdir(directory) + for f in l: + if f.find(prefix) != 0: continue + if f[-3:] != ".py": continue + module = f[len(prefix):-3] + try: + mod = __import__("addvars2notebook_%s"%(module)) + except ImportError: + continue + try: + func = mod.addvars2notebook + except AttributeError: + continue + fff = os.path.join(directory, f) + content = func(fff, vars_and_values) + contents.append([fff, content]) + pass + # + if vars_and_values: + stream = open(filename) + content = stream.read() + stream.close() + fields = content.split("import iparameters") + if len(fields) == 2: + begin = fields[0] + if begin.find("## NoteBook E.A.") >= 0: + begin = begin.split("## NoteBook E.A.")[0] + pass + end = "import iparameters" + fields[1] + content = begin + content += "## NoteBook E.A.\n" + for var, value in vars_and_values: + content += "notebook.set(%s,%s)\n"%(var.__repr__(), value) + pass + content += end + stream = open(filename, "w") + stream.write(content) + stream.close() + # + for fff, content in contents: + stream = open(fff, "w") + stream.write(content) + stream.close() + pass + pass + pass + # + return + +if __name__ == "__main__": + import sys + addvars2notebook(sys.argv[1]) + pass diff --git a/src/SalomeApp/resources/SalomeApp.xml b/src/SalomeApp/resources/SalomeApp.xml index 46ab023a5..542811fc7 100644 --- a/src/SalomeApp/resources/SalomeApp.xml +++ b/src/SalomeApp/resources/SalomeApp.xml @@ -42,6 +42,7 @@
+
@@ -64,6 +65,8 @@
+ + @@ -223,4 +226,27 @@
+ +
+ +
+
+ + +
+
+ + + + + + + +
+
+ + + + +
diff --git a/src/SalomeApp/resources/SalomeApp_msg_en.ts b/src/SalomeApp/resources/SalomeApp_msg_en.ts index e12a7d532..2e04655b5 100644 --- a/src/SalomeApp/resources/SalomeApp_msg_en.ts +++ b/src/SalomeApp/resources/SalomeApp_msg_en.ts @@ -1,27 +1,6 @@ - - + + + @default @@ -87,15 +66,15 @@ Python file must include only letters, digits and underscores and start from let ERR_INCOMPATIBLE_TYPE - Variable with name "%1" has incompatible numeric type + Variable with name "%1" has incompatible numeric type ERR_INVALID_VALUE - Value hasn't been validated + Value hasn't been validated ERR_NO_VARIABLE - Variable with name "%1" doesn't exist + Variable with name "%1" doesn't exist @@ -185,6 +164,10 @@ Do you want to reload it ? TOT_DESK_CATALOG_GENERATOR Catalog generator
+ + TOT_DESK_ADD_VARS_TO_NOTEBOOK + Add vars to notebook + PUBLISH_IN_STUDY Publish in study @@ -277,6 +260,10 @@ Do you want to reload it ? PRP_DESK_CATALOG_GENERATOR Generates XML catalog of a component's interface + + PRP_DESK_ADD_VARS_TO_NOTEBOOK + Add variables of the study to the notebook + PRP_DESK_FILE_DUMP_STUDY Dumps study to the python script @@ -309,6 +296,10 @@ Do you want to reload it ? MEN_DESK_CATALOG_GENERATOR Catalog &Generator + + MEN_DESK_ADD_VARS_TO_NOTEBOOK + Add vars to NoteBook + APPCLOSE_CAPTION Close active study @@ -382,101 +373,101 @@ Do you want to reload it ?
NoteBook_Table - - REMOVE_VARIABLE_IS_USED - Variable with name "%1" is used in the study. + + REMOVE_VARIABLE_IS_USED + Variable with name "%1" is used in the study. Do you really want to remove it? - - - RENAME_VARIABLE_IS_USED - Variable with name "%1" is used in the study. + + + RENAME_VARIABLE_IS_USED + Variable with name "%1" is used in the study. Do you really want to rename it? - - - VARNAME_COLUMN - Variable Name - - - VARVALUE_COLUMN - Variable Value - - - VARVALUE_INCORRECT - Variable Value Incorrect: %1 - - - VARNAME_INCORRECT - Variable Name Incorrect :%1 - - - VARNAME_EXISTS - Variable with name "%1" exists - + + + VARNAME_COLUMN + Variable Name + + + VARVALUE_COLUMN + Variable Value + + + VARVALUE_INCORRECT + Variable Value Incorrect: %1 + + + VARNAME_INCORRECT + Variable Name Incorrect :%1 + + + VARNAME_EXISTS + Variable with name "%1" exists + SalomeApp_NoteBookDlg - - NOTEBOOK_TITLE - Salome NoteBook - - - BUT_UPDATE_STUDY - &Update Study - - - BUT_REMOVE - &Remove - - - BUT_APPLY_AND_CLOSE - A&pply and Close - - - BUT_HELP - &Help - - - CLOSE_CAPTION - Close NoteBook - - - CLOSE_DESCRIPTION - Do you want to save changes you made to NoteBook? - - - INCORRECT_DATA - At least one variable has been defined incorrectly. + + NOTEBOOK_TITLE + Salome NoteBook + + + BUT_UPDATE_STUDY + &Update Study + + + BUT_REMOVE + &Remove + + + BUT_APPLY_AND_CLOSE + A&pply and Close + + + BUT_HELP + &Help + + + CLOSE_CAPTION + Close NoteBook + + + CLOSE_DESCRIPTION + Do you want to save changes you made to NoteBook? + + + INCORRECT_DATA + At least one variable has been defined incorrectly. Please edit its parameters or remove it from table. - - - ERR_UPDATE_STUDY_FAILED - Failed to update study! - + + + ERR_UPDATE_STUDY_FAILED + Failed to update study! + - SalomeApp_DoubleSpinBox - - VALID_RANGE_VAR_MSG - Specify either a variable name or + SalomeApp_DoubleSpinBox + + VALID_RANGE_VAR_MSG + Specify either a variable name or a floating-point value in range ( %1; %2 ) with %3-digit precision - - - VALID_RANGE_NOVAR_MSG - Specify a floating-point value in range ( %1; %2 ) + + + VALID_RANGE_NOVAR_MSG + Specify a floating-point value in range ( %1; %2 ) with %3-digit precision - + - SalomeApp_IntSpinBox - - VALID_RANGE_VAR_MSG - Specify either a variable name or + SalomeApp_IntSpinBox + + VALID_RANGE_VAR_MSG + Specify either a variable name or an integer value in range ( %1; %2 ) - - - VALID_RANGE_NOVAR_MSG - Specify an integer value in range ( %1; %2 ) - + + + VALID_RANGE_NOVAR_MSG + Specify an integer value in range ( %1; %2 ) +
diff --git a/src/SalomeApp/resources/SalomeApp_msg_fr.ts b/src/SalomeApp/resources/SalomeApp_msg_fr.ts new file mode 100755 index 000000000..16e6b53e1 --- /dev/null +++ b/src/SalomeApp/resources/SalomeApp_msg_fr.ts @@ -0,0 +1,461 @@ + + + + + @default + + WRN_FILE_NAME_BAD + Indiquez le nom de fichier correctement. +Le fichier Python ne devrait inclure que de lettres, chiffres et soulignages et commencer avec une lettre ou soulignage. + + + WRN_FILE_NOT_EXIST + Le fichier %1 n'existe pas. + + + CLOSE_LOCKED_STUDY + Fermer l'étude? + + + PUBLISH_IN_STUDY + Publier dans l'étude + + + BUT_NEW + &Nouvelle + + + SAVE_POINT_ROOT_NAME + Etats d'IHM + + + SAVE_POINT_ROOT_TOOLTIP + Etats d'IHM persistents + + + SAVE_GUI_STATE + Sauvegarder l'état d'IHM + + + BUT_LOAD + &Charger + + + BUT_OPEN + &Ouvrir + + + SAVE_POINT_OBJECT_TOOLTIP + Sauvegarder l'état d'IHM: %1 + + + SAVE_POINT_DEF_NAME + L'état d'IHM: + + + VALUE_COLUMN + Valeur + + + IOR_COLUMN + IOR + + + REFENTRY_COLUMN + Ref.Entrée + + + ERR_INCOMPATIBLE_TYPE + Le tupe numérique de la variable "%1" n'est pas compatible + + + ERR_INVALID_VALUE + La valeur n'a pas été validée + + + ERR_NO_VARIABLE + La variable "%1" n'existe pas. + + + + SalomeApp_Application + + ALL_FILES_FILTER + Tous les fichiers (*.*) + + + APPCLOSE_UNLOAD + V&ider + + + APPCLOSE_CLOSE + &Fermer sans modifications + + + MEN_WINDOWS_NEW + Nouvelle Fenêtre + + + MEN_DELETE_INVALID_REFERENCE + Supprimer la Référence Invalide + + + TOT_FILE_DESK_PREFERENCES + Préférences + + + MEN_DELETE_VS + Supprimer + + + MEN_OPENWITH + Activer Module %1 + + + MEN_DESK_REGISTRY_DISPLAY + Enregistrer &Visualiser + + + APPCLOSE_SAVE + &Sauvegarder && Fermer + + + TOT_DESK_FILE_LOAD_SCRIPT + Ouvrit un script python + + + PREF_STORE_VISUAL_STATE + Sauvegarder/restaurer le dernier ètat d'IHM + + + PRP_DESK_FILE_SAVE_GUI_STATE + Sauvegarder l'état actuel des visualisateurs, des scènes, etc. + + + MEN_DESK_FILE_SAVE_GUI_STATE + Sauvegarder l'état d'IHM + + + TOT_DESK_FILE_SAVE_GUI_STATE + Sauvegarder l'état d'IHM + + + MEN_RESTORE_VS + Restaurer + + + WRN_DUMP_STUDY_FAILED + Impossible de clipper l'Sauvegarder l'étude + + + MEN_DESK_PROPERTIES + Pro&priétés... + + + QUE_DOC_ALREADYEXIST + Ce document %1 déjà existe dans l'étude. +Allez-vous rouvrir ce document ? + + + MEN_RENAME_VS + Renommer + + + TOT_DESK_CATALOG_GENERATOR + Générateur du Catalogue + + + PUBLISH_IN_STUDY + Publier dans l'étude + + + PREF_OBJ_BROWSER_SETTINGS + Paramètres + + + PRP_DESK_REGISTRY_DISPLAY + Visualiser le contenu du Registre du serveur CORBA + + + PYTHON_FILES_FILTER + Fichiers PYTHON (*.py) + + + APPCLOSE_DESCRIPTION + Voulez-vous fermer ou vider l'étude avant de la fermer? + + + PRP_DESK_PROPERTIES + Editer les propriétés de l'étude + + + PREF_TAB_OBJBROWSER + Navigateur d'Objets + + + STUDY_LOCKED + BLOQUEE + + + APPCLOSE_CANCEL + &Annuler + + + OBJ_BROWSER_NAME + Objet + + + TOT_DESK_REGISTRY_DISPLAY + Visualiser Registre + + + OBJ_BROWSER_COLUMN_0 + Entrée + + + OBJ_BROWSER_COLUMN_1 + Valeur + + + OBJ_BROWSER_COLUMN_2 + IOR + + + OBJ_BROWSER_COLUMN_3 + Entrée de Référence + + + PREF_CATEGORY_SALOME + SALOME + + + PYTHON_CONSOLE + Console Python + + + MEN_DESK_FILE_LOAD_SCRIPT + Ouvrir Scrip&t... + + + MEN_DESK_TOOLS + &Outils + + + TOT_DESK_FILE_DUMP_STUDY + Clicher l'étude + + + MEN_VIEW_WNDS + Windows + + + MEN_DESK_FILE_DUMP_STUDY + &Clicher l'étude... + + + PRP_DESK_CATALOG_GENERATOR + Générer une catalogue XML de l'interface du composant + + + PRP_DESK_FILE_DUMP_STUDY + Clicher l'étude au script python + + + TOT_DESK_FILE_NOTEBOOK + Ouvrir le Carnet + + + MEN_DESK_FILE_NOTEBOOK + Car&net... + + + PRP_DESK_FILE_NOTEBOOK + Ouvrir le Carnet + + + TOT_DESK_PROPERTIES + Propriétés de l'étude + + + PREF_GROUP_DEF_COLUMNS + Colonnes de Défaut + + + PRP_DESK_FILE_LOAD_SCRIPT + Ouvrir le script python du fichier + + + MEN_DESK_CATALOG_GENERATOR + Catalogue &Générateur + + + APPCLOSE_CAPTION + Fermer l'étude actuelle + + + MEN_DESK_MRU + Le plus recemment utilisé + + + TOT_DESK_MRU + Le plus recemment utilisé + + + ACTIVATE_MODULE_OP_LOAD + &Charger... + + + + SalomeApp_StudyPropertiesDlg + + PRP_MODE_FROM_SCRATCH + du début + + + PRP_AUTHOR + Autheur + + + PRP_LOCKED + Bloqué + + + PRP_MODIFICATIONS + Modifications + + + PRP_NO + Non + + + PRP_YES + Oui + + + PRP_MODIFIED + Modifié + + + PRP_DATE + Crée + + + PRP_MODE + Mode + + + PRP_MODE_FROM_COPYFROM + copier de + + + TLT_STUDY_PROPERTIES + Propriétés de l'étude + + + + SalomeApp_ExitDlg + + SHUTDOWN_SERVERS + Arreter les serveurs autonomes + + + + NoteBook_Table + + REMOVE_VARIABLE_IS_USED + La variable "%1" est utilisée dans l'étude. +Est-ce que vous allez vraiment la supprimer? + + + RENAME_VARIABLE_IS_USED + La variable "%1" est utilisée dans l'étude. +Est-ce que vous allez vraiment la renommer? + + + VARNAME_COLUMN + Nom de la Variable + + + VARVALUE_COLUMN + Valeur de la Variable + + + VARVALUE_INCORRECT + La Valeur de la Variable n'est pas correcte: %1 + + + VARNAME_INCORRECT + Le Nom de la Variable n'est pas correct: %1 + + + VARNAME_EXISTS + La Variable "%1" existe + + + + SalomeApp_NoteBookDlg + + NOTEBOOK_TITLE + Carnet Salome + + + BUT_UPDATE_STUDY + &Mettre l'étude à jour + + + BUT_REMOVE + &Supprimer + + + BUT_APPLY_AND_CLOSE + A&ppliquer et Fermer + + + BUT_HELP + &Aide + + + CLOSE_CAPTION + Fermer le Carnet + + + CLOSE_DESCRIPTION + Allez-vous sauvegarder les changements faits au Carnet? + + + INCORRECT_DATA + Au moins une variable a été définie incorrectement. +Editez ses paramètres ou l'éliminez de la table. + + + ERR_UPDATE_STUDY_FAILED + Impossible de mettre l'étude à jour! + + + + SalomeApp_DoubleSpinBox + + VALID_RANGE_VAR_MSG + Indiquez le nom de la variable ou +la valeur du point flottant au diapason ( %1; %2 ) +avec la précision de %3 chiffres + + + VALID_RANGE_NOVAR_MSG + Indiquez la valeur du point flottant au diapason ( %1; %2 ) +avec la précision de %3 chiffres + + + + SalomeApp_IntSpinBox + + VALID_RANGE_VAR_MSG + Indiquez le nom de la variable ou +une valeur entière au diapason ( %1; %2 ) + + + VALID_RANGE_NOVAR_MSG + Indiquez une valeur entière au diapason ( %1; %2 ) + + + diff --git a/src/Session/SALOME_Session_Server.cxx b/src/Session/SALOME_Session_Server.cxx index 7e3be00c3..594ca26fb 100755 --- a/src/Session/SALOME_Session_Server.cxx +++ b/src/Session/SALOME_Session_Server.cxx @@ -401,7 +401,6 @@ void shutdownServers( SALOME_NamingService* theNS ) // ---------------------------- MAIN ----------------------- int main( int argc, char **argv ) { - if(getenv ("DEBUGGER")) { setsig(SIGSEGV,&Handler); @@ -440,7 +439,7 @@ int main( int argc, char **argv ) SUIT_ResourceMgr resMgr( "SalomeApp", QString( "%1Config" ) ); resMgr.setCurrentFormat( "xml" ); resMgr.setWorkingMode( QtxResourceMgr::IgnoreUserValues ); - resMgr.loadLanguage( "LightApp", "en" ); + resMgr.loadLanguage( "LightApp" ); // splash = QtxSplash::splash( QPixmap() ); splash->readSettings( &resMgr ); diff --git a/src/Style/Makefile.am b/src/Style/Makefile.am index 4b2d215a5..ec4efbf62 100644 --- a/src/Style/Makefile.am +++ b/src/Style/Makefile.am @@ -65,3 +65,5 @@ libSalomeStyle_la_LDFLAGS = $(QT_MT_LIBS) \ ../Qtx/libqtx.la dist_salomeres_DATA = resources/SalomeStyle.xml + +nodist_salomeres_DATA = Style_msg_fr.qm diff --git a/src/Style/Style_PrefDlg.cxx b/src/Style/Style_PrefDlg.cxx index 326dbcc03..e748d06c6 100644 --- a/src/Style/Style_PrefDlg.cxx +++ b/src/Style/Style_PrefDlg.cxx @@ -127,7 +127,7 @@ void Style_PrefDlg::PaletteEditor::addColumn( const QString& title ) l->addWidget( myActiveLab = new QLabel( tr( "Active" ), myContainer ), myCurrentRow, myCurrentColumn*4+1 ); l->addWidget( myInactiveLab = new QLabel( tr( "Inactive" ), myContainer ), myCurrentRow, myCurrentColumn*4+2 ); - l->addWidget( myDisabledLab = new QLabel( tr( "Disable" ), myContainer ), myCurrentRow, myCurrentColumn*4+3 ); + l->addWidget( myDisabledLab = new QLabel( tr( "Disabled" ), myContainer ), myCurrentRow, myCurrentColumn*4+3 ); int w = 0; w = qMax( w, myActiveLab->sizeHint().width() ); w = qMax( w, myInactiveLab->sizeHint().width() ); @@ -376,7 +376,7 @@ QString Style_PrefDlg::PaletteEditor::idToName( int id ) case Style_Model::BrightText: // 7 name = tr( "Bright text" ); break; case Style_Model::ButtonText: // 8 - name = tr( "Buttont text" ); break; + name = tr( "Button text" ); break; case Style_Model::Base: // 9 name = tr( "Base" ); break; case Style_Model::Window: // 10 @@ -496,7 +496,7 @@ Style_PrefDlg::Style_PrefDlg( QWidget* parent ) main->setMargin( 0 ); main->setSpacing( SPACING ); // create main widgets - myStyleCheck = new QCheckBox( tr( "Use SALOME Style" ), this ); + myStyleCheck = new QCheckBox( tr( "Enable SALOME Style" ), this ); QFrame* fr = new QFrame( this ); fr->setFrameStyle( QFrame::Box | QFrame::Sunken ); diff --git a/src/Style/resources/Style_msg_fr.ts b/src/Style/resources/Style_msg_fr.ts new file mode 100644 index 000000000..8ff55f0d4 --- /dev/null +++ b/src/Style/resources/Style_msg_fr.ts @@ -0,0 +1,287 @@ + + + + + Style_PrefDlg + + Quick + Rapide + + + Auto + Auto + + + Base colors + Couleurs de base + + + Additional colors + Couleurs supplémentaires + + + Active + Actif + + + Inactive + Désactivé + + + Disabled + Désactivé + + + Window text + Texte du fenêtre + + + Button + Touche + + + Light + Clair + + + Midlight + Demi-clair + + + Dark + Foncé + + + Mid + Moyen + + + Text + Texte + + + Bright text + Texte éclairé + + + Button text + Texte de la touche + + + Base + Base + + + Window + Fenêtre + + + Shadow + Ombre + + + Highlight + Surligner + + + Highlighted text + Texte surligné + + + Link + Lien + + + Visited link + Lien visité + + + Alternate base + Base alternative + + + Tooltip base + Base d'infobulle + + + Tooltip text + Texte d'infobulle + + + Border top + Frontière de dessus + + + Border bottom + Frontière de dessous + + + Tab border top + Frontière de dessus de l'onglet + + + Tab border bottom + Frontière de dessous de l'onglet + + + Field light + Champ clair + + + Field dark + Champ foncé + + + Slider + Barre de défilement + + + Lines + Lignes + + + Widget center + Centre de l'objet-fenêtre + + + Widget border + Frontière de l'objet-fenêtre + + + Header + Titre + + + Progress bar + Barre de progrès + + + Pointer + Pointeur + + + Checked + Coché + + + Table grid + Maillage de la table + + + SALOME style preferences + Préférences de style Salomé + + + Enable SALOME Style + Activer le style Salomé + + + Font + Caractères + + + Type + Type + + + None + Aucun + + + Horizontal + Horisontal + + + Inclined + Incliné + + + Transparency + Transparence + + + Widgets rounding + Arrondi des objets-fenêtres + + + Buttons + Touches + + + Edit boxes + Editer les boîtes + + + Frames + Cadres + + + Sliders + Barres de défilement + + + Anti-aliased borders + Frontières d'anticrénelage + + + Handle + Pointeur + + + Horizontal spacin + Espacement horisontal + + + Vertical spacing + Espacement vertical + + + Splitter handle size + Taille du pointeur du diviseur + + + Slider handle size + Taille du curseur de la barre de défilement + + + Widget effect + Effet de l'objet-fenêtre + + + Highlight widgets + Surligner les objets fenêtres + + + Auto raise widgets + Activer l'objet fenêtre automatiquement + + + Colors + Couleurs + + + Properties + Paramètres + + + [ Current ] + [ Actuel ] + + + [ Default ] + [ Défaut ] + + + Delete user theme + Supprimer la thème d'utilisateur + + + Remove theme %1? + Supprimer la thème %1? + + + Custom schema + Schéma actuel + + + diff --git a/src/TOOLSGUI/Makefile.am b/src/TOOLSGUI/Makefile.am index 0c41e9a8d..462bb6d65 100755 --- a/src/TOOLSGUI/Makefile.am +++ b/src/TOOLSGUI/Makefile.am @@ -48,7 +48,8 @@ nodist_libToolsGUI_la_SOURCES = $(MOC_FILES) # .po files to transform in .qm nodist_salomeres_DATA = \ - ToolsGUI_msg_en.qm + ToolsGUI_msg_en.qm \ + ToolsGUI_msg_fr.qm libToolsGUI_la_CPPFLAGS = $(QT_INCLUDES) $(CAS_CPPFLAGS) $(BOOST_CPPFLAGS) \ @KERNEL_CXXFLAGS@ @CORBA_CXXFLAGS@ @CORBA_INCLUDES@ \ diff --git a/src/TOOLSGUI/ToolsGUI_RegWidget.cxx b/src/TOOLSGUI/ToolsGUI_RegWidget.cxx index ef267b1e3..bc4a9f85d 100755 --- a/src/TOOLSGUI/ToolsGUI_RegWidget.cxx +++ b/src/TOOLSGUI/ToolsGUI_RegWidget.cxx @@ -20,48 +20,30 @@ // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // -// SALOME RegistryDisplay : GUI for Registry server implementation -// File : ToolsGUI_RegWidget.cxx -// Author : Pascale NOYRET, EDF -// # include "ToolsGUI_RegWidget.h" -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include - -# include -# include -# include -# include - -# include -# include - -# include - -typedef int PIXELS; +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include #define MARGIN_SIZE 11 #define SPACING_SIZE 6 #define MIN_SPIN_WIDTH 100 -#define BOLD( text ) ( QString( "" ) + QString( text ) + QString( "" ) ) +#define BOLD( text ) QString( "%1" ).arg( QString( text ) ) static const char* const time_data[] = { "16 16 6 1", @@ -138,315 +120,32 @@ static const char* const refresh_data[] = { "......aaaaa....."}; /*! - \brief Create components list. + \brief Get access to the Registry service \internal \param orb CORBA ORB reference - \return list of registered components + \return reference to the Registry service */ -static Registry::Components_var MakeRegistry( CORBA::ORB_var& orb ) +static Registry::Components_ptr GetRegistry( CORBA::ORB_ptr orb ) { - - const char *registryName="Registry" ; + static const char* registryName = "Registry"; + Registry::Components_var aRegistry; - SALOME_NamingService &naming = *SINGLETON_::Instance() ; - naming.init_orb( orb ) ; + SALOME_NamingService& naming = *SINGLETON_::Instance(); + naming.init_orb( orb ); - // Recuperation de la reference de l'objet - CORBA::Object_var object = 0 ; + CORBA::Object_var object = 0; try { - SCRUTE(registryName) ; - object = naming.Resolve( registryName ) ; - if(CORBA::is_nil(object)) throw CommException( "unable to find the RegistryService" ) ; + object = naming.Resolve( registryName ); + if ( CORBA::is_nil( object ) ) throw CommException( "Unable to find the Registry service" ); + aRegistry = Registry::Components::_narrow( object ); } - catch( const ServiceUnreachable& ex ) + catch( const CORBA::Exception& ex ) { - MESSAGE( ex.what() ) - exit( EXIT_FAILURE ) ; - } - catch( const CORBA::Exception& ) - { - exit( EXIT_FAILURE ) ; - } - - // Specialisation de l'objet generique - - return Registry::Components::_narrow( object ) ; -} - -/*! - \class ToolsGUI_RegWidget::InfoWindow - \brief Information window. - \internal -*/ - -class ToolsGUI_RegWidget::InfoWindow : public QMainWindow -{ -public: - InfoWindow( QWidget* parent ); - - void setText( const QString& text ); - -protected: - void keyPressEvent( QKeyEvent * e ); - -private: - QTextEdit* myTextView; -}; - -/*! - \brief Constructor. - \internal - \param parent parent widget -*/ -ToolsGUI_RegWidget::InfoWindow::InfoWindow( QWidget* parent ) -: QMainWindow( parent ) -{ - setAttribute( Qt::WA_DeleteOnClose ); - - myTextView = new QTextEdit( this ); - myTextView->setReadOnly( true ); - setCentralWidget( myTextView ); - setMinimumSize( 450, 250 ); -} - -/*! - \brief Set text to the information window. - \internal - \param text ionfo text -*/ -void ToolsGUI_RegWidget::InfoWindow::setText( const QString& text ) -{ - myTextView->setText( text ); -} - -/*! - \brief Key press event handler. Closeswindow on \c Escape key pressing. - \internal - \param e key press event -*/ -void ToolsGUI_RegWidget::InfoWindow::keyPressEvent( QKeyEvent * e ) -{ - QMainWindow::keyPressEvent( e ); - if ( e->key() == Qt::Key_Escape ) - close(); -} - -/*! - \class ToolsGUI_RegWidget::HelpWindow - \brief Help window. - \internal -*/ - -class ToolsGUI_RegWidget::HelpWindow : public QMainWindow -{ -public: - HelpWindow( QWidget* parent ); - ~HelpWindow(); - - void setText( const QString& text ); - -private: - QTextEdit* myTextView; -}; - -/*! - \brief Constructor. - \internal - \param parent parent widget -*/ -ToolsGUI_RegWidget::HelpWindow::HelpWindow( QWidget* parent ) -: QMainWindow( parent ) -{ - setAttribute( Qt::WA_DeleteOnClose ); - setWindowTitle( tr( "Help" ) ); - - myTextView = new QTextEdit( this ); - myTextView->setReadOnly( true ); - QPalette pal = myTextView->palette(); - - pal.setBrush( QPalette::Active, QPalette::Highlight, QBrush( QColor( 0, 0, 128 ) ) ); - pal.setBrush( QPalette::Active, QPalette::HighlightedText, QBrush( Qt::white ) ); - pal.setBrush( QPalette::Active, QPalette::Base, QBrush( QColor( 255,255,220 ) ) ); - pal.setBrush( QPalette::Active, QPalette::Text, QBrush( Qt::black ) ); - - pal.setBrush( QPalette::Inactive, QPalette::Highlight, QBrush( QColor( 0, 0, 128 ) ) ); - pal.setBrush( QPalette::Inactive, QPalette::HighlightedText, QBrush( Qt::white ) ); - pal.setBrush( QPalette::Inactive, QPalette::Base, QBrush( QColor( 255,255,220 ) ) ); - pal.setBrush( QPalette::Inactive, QPalette::Text, QBrush( Qt::black ) ); - - pal.setBrush( QPalette::Disabled, QPalette::Highlight, QBrush( QColor( 0, 0, 128 ) ) ); - pal.setBrush( QPalette::Disabled, QPalette::HighlightedText, QBrush( Qt::white ) ); - pal.setBrush( QPalette::Disabled, QPalette::Base, QBrush( QColor( 255,255,220 ) ) ); - pal.setBrush( QPalette::Disabled, QPalette::Text, QBrush( Qt::black ) ); - - myTextView->setPalette( pal ); - - setCentralWidget( myTextView ); - setMinimumSize( 450, 250 ); - - QFile f ( "tmp.txt" ); - if ( f.open( QIODevice::ReadOnly ) ) { - QTextStream t( &f ); - while ( !t.atEnd() ) { - myTextView->append( t.readLine() ); - } + MESSAGE( "Error: can't access Registry server" ); } - f.close(); -} - -/*! - \brief Destructor. - \internal -*/ -ToolsGUI_RegWidget::HelpWindow::~HelpWindow() -{ -}; - -/*! - \brief Set text to the help window. - \internal - \param text help text -*/ -void ToolsGUI_RegWidget::HelpWindow::setText( const QString& text ) -{ - myTextView->setText( text ); -} - -/*! - \class ToolsGUI_RegWidget::IntervalWindow - \brief Dialog box to enter time delay between registry window updates - \internal -*/ - -class ToolsGUI_RegWidget::IntervalWindow : public QDialog -{ -public: - IntervalWindow( QWidget* parent ); - ~IntervalWindow(); - - QPushButton* Ok(); - QPushButton* Cancel(); - - int getValue(); - void setValue( int ); - -private: - QSpinBox* mySpinBox; - QPushButton* myButtonOk; - QPushButton* myButtonCancel; -}; - -/*! - \brief Constructor. - \internal - \param parent parent widget -*/ -ToolsGUI_RegWidget::IntervalWindow::IntervalWindow ( QWidget* parent ) -: QDialog( parent ) -{ - setModal( true ); - setAttribute( Qt::WA_DeleteOnClose ); - - setWindowTitle( tr( "Refresh Interval" ) ); - setSizeGripEnabled( true ); - - QGridLayout* topLayout = new QGridLayout( this ); - topLayout->setSpacing( SPACING_SIZE ); - topLayout->setMargin( MARGIN_SIZE ); - - QGroupBox* intervalGrp = new QGroupBox( this ); - intervalGrp->setObjectName( "intervalGrp" ); - QGridLayout* intervalGrpLayout = new QGridLayout( intervalGrp ); - intervalGrpLayout->setAlignment( Qt::AlignTop ); - intervalGrpLayout->setSpacing( SPACING_SIZE ); - intervalGrpLayout->setMargin( MARGIN_SIZE ); - - QHBoxLayout* aBtnLayout = new QHBoxLayout; - aBtnLayout->setSpacing( SPACING_SIZE ); - aBtnLayout->setMargin( 0 ); - - myButtonOk = new QPushButton( this ); - myButtonOk->setObjectName( "buttonOk" ); - myButtonOk->setText( tr( "BUT_OK" ) ); - myButtonOk->setAutoDefault( TRUE ); - myButtonOk->setDefault( TRUE ); - - myButtonCancel = new QPushButton( this ); - myButtonCancel->setObjectName( "buttonCancel" ); - myButtonCancel->setText( tr( "BUT_CANCEL" ) ); - myButtonCancel->setAutoDefault( TRUE ); - - QLabel* TextLabel = new QLabel( intervalGrp ); - TextLabel->setObjectName( "TextLabel" ); - TextLabel->setText( tr( "Please, enter a number of seconds:" ) ); - - mySpinBox = new QSpinBox( intervalGrp ); - mySpinBox->setMinimum( 1 ); - mySpinBox->setMaximum( 999999999 ); - mySpinBox->setSingleStep( 1 ); - mySpinBox->setObjectName( "SpinBox" ); - mySpinBox->setValue( 100 ); - mySpinBox->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); - mySpinBox->setMinimumWidth(MIN_SPIN_WIDTH); - - intervalGrpLayout->addWidget(TextLabel, 0, 0); - intervalGrpLayout->addWidget(mySpinBox, 0, 1); - - aBtnLayout->addWidget( myButtonOk ); - aBtnLayout->addItem( new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum ) ); - aBtnLayout->addWidget( myButtonCancel ); - - topLayout->addWidget( intervalGrp, 0, 0 ); - topLayout->addLayout( aBtnLayout, 1, 0 ); -} - -/*! - \brief Destructor - \internal -*/ -ToolsGUI_RegWidget::IntervalWindow::~IntervalWindow() -{ -} - -/*! - \brief Set time interval value - \internal - \param size interval value -*/ -void ToolsGUI_RegWidget::IntervalWindow::setValue( const int size ) -{ - mySpinBox->setValue(size); -} - -/*! - \brief Get time interval value - \internal - \return interval value -*/ -int ToolsGUI_RegWidget::IntervalWindow::getValue() -{ - return mySpinBox->value(); -} -/*! - \brief Get \c OK button - \internal - \return a pointer to \c OK button -*/ -QPushButton* ToolsGUI_RegWidget::IntervalWindow::Ok() -{ - return myButtonOk; -} - -/*! - \brief Get \c Cancel button - \internal - \return a pointer to \c Cancel button -*/ -QPushButton* ToolsGUI_RegWidget::IntervalWindow::Cancel() -{ - return myButtonCancel; + return aRegistry._retn(); } /*! @@ -462,7 +161,7 @@ ToolsGUI_RegWidget* ToolsGUI_RegWidget::myRegWidgetPtr = 0; \param orb CORBA ORB reference \param parent parent widget */ -ToolsGUI_RegWidget* ToolsGUI_RegWidget::GetRegWidget( CORBA::ORB_var& orb, +ToolsGUI_RegWidget* ToolsGUI_RegWidget::GetRegWidget( CORBA::ORB_ptr orb, QWidget* parent ) { if ( !myRegWidgetPtr ) @@ -470,99 +169,108 @@ ToolsGUI_RegWidget* ToolsGUI_RegWidget::GetRegWidget( CORBA::ORB_var& orb, return myRegWidgetPtr; } -/*! - \brief This virtual function is reimplenented to disable popup menu on dock areas - (instead of QMainWindow::setDockMenuEnabled( false ) method used in Qt3). - \return always 0 to disable menu -*/ -QMenu* ToolsGUI_RegWidget::createPopupMenu() -{ - QMenu* aPopup = 0; - return aPopup; -} - /*! \brief Constructor \param orb CORBA ORB reference \param parent parent widget */ -ToolsGUI_RegWidget::ToolsGUI_RegWidget( CORBA::ORB_var& orb, QWidget* parent ) -: QMainWindow( parent, Qt::Window ), - _VarComponents( MakeRegistry(orb) ), - _clients( 0 ), - _history( 0 ), - _parent( parent ), - _tabWidget( 0 ), - _refresh( 0 ), - _interval( 0 ), - myInfoWindow( 0 ), - myHelpWindow( 0 ), - myIntervalWindow( 0 ) +ToolsGUI_RegWidget::ToolsGUI_RegWidget( CORBA::ORB_ptr orb, QWidget* parent ) +: QMainWindow( parent ) { - setAttribute( Qt::WA_DeleteOnClose ); + myOrb = CORBA::ORB::_duplicate( orb ); - if ( parent ) - setWindowIcon( parent->windowIcon() ); - - // pixmap for buttons - QPixmap image_refresh ( ( const char** ) refresh_data ); - QPixmap image_interval( ( const char** ) time_data ); - QPixmap image_close ( ( const char** ) close_data ); + // set window attributes + setAttribute( Qt::WA_DeleteOnClose ); + setWindowTitle( tr( "TLT_REGISTRY" ) ); - // Buttons definition - QToolBar* topbar = new QToolBar( tr("Toolbar"), this ); - topbar->setToolButtonStyle( Qt::ToolButtonTextBesideIcon ); - addToolBar( Qt::TopToolBarArea, topbar ); + // show status bar + statusBar(); - _refresh = topbar->addAction(image_refresh, tr( "Refresh" ), this, SLOT( slotListeSelect() )); - _refresh->setToolTip( "" ); - _refresh->setStatusTip( tr("Immediately updates list of components") ); + // get main menu bar + QMenuBar* mainMenu = menuBar(); - /* PAL5540 - this button is needless - QPushButton* help = new QPushButton( tr( "Help" ), topbar ); - connect( help, SIGNAL( clicked() ), this, SLOT( slotHelp() ) ); - QToolTip::add( help, "", toolTipGroup(), tr("Opens Help window") ); - */ + // add 'Actions' menu + QMenu* m = mainMenu->addMenu( tr( "MNU_ACTIONS" ) ); + // add 'Actions' toolbar + QToolBar* tb = addToolBar( tr( "TB_ACTIONS" ) ); + + // create actions + myActions[Refresh] = new QAction( QPixmap( refresh_data ), tr( "MEN_REFRESH" ), this ); + myActions[Refresh]->setStatusTip( tr( "STB_REFRESH" ) ); + connect( myActions[Refresh], SIGNAL( triggered() ), this, SLOT( refresh() ) ); + m->addAction( myActions[Refresh] ); + tb->addAction( myActions[Refresh] ); - _interval = topbar->addAction(image_interval, tr( "Interval" ), this, SLOT( slotSelectRefresh() )); - _interval->setToolTip( "" ); - _interval->setStatusTip( tr("Changes refresh interval") ); - - topbar->addSeparator(); - - _close = topbar->addAction( image_close, tr("Close"), this, SLOT( close() )); - _close->setToolTip( "" ); - _close->setStatusTip( tr("Closes Registry window") ); + myActions[Interval] = new QAction( QPixmap( time_data ), tr( "MEN_INTERVAL" ), this ); + myActions[Interval]->setStatusTip( tr( "STB_INTERVAL" ) ); + connect( myActions[Interval], SIGNAL( triggered() ), this, SLOT( refreshInterval() ) ); + m->addAction( myActions[Interval] ); + tb->addAction( myActions[Interval] ); - // Display area and associated slots definition - _tabWidget = new QTabWidget( this ); - _clients = new QTreeWidget( _tabWidget ); - SetListe(); - _history = new QTreeWidget( _tabWidget ); - SetListeHistory(); - - _tabWidget->addTab( _clients, tr( "Running" ) ); - _tabWidget->addTab( _history, tr( "History" ) ); - connect( _tabWidget, SIGNAL( currentChanged( QWidget* )), this, SLOT( slotListeSelect() ) ); - connect( _clients, SIGNAL( itemDoubleClicked( QTreeWidgetItem*, int ) ), this, SLOT( slotClientChanged( QTreeWidgetItem* , int ) ) ); - connect( _history, SIGNAL( itemDoubleClicked( QTreeWidgetItem*, int ) ), this, SLOT( slotHistoryChanged( QTreeWidgetItem* , int ) ) ); - setCentralWidget( _tabWidget ); + m->addSeparator(); + tb->addSeparator(); + + myActions[Close] = new QAction( QPixmap( close_data ), tr( "MEN_CLOSE" ), this ); + myActions[Close]->setStatusTip( tr( "STB_CLOSE" ) ); + connect( myActions[Close], SIGNAL( triggered() ), this, SLOT( close() ) ); + m->addAction( myActions[Close] ); + tb->addAction( myActions[Close] ); + + // central widget + setCentralWidget( new QWidget( this ) ); + + // Create tab widget: SALOME serives list (running and history) + QTabWidget* tabWidget = new QTabWidget( centralWidget() ); + + myViews[Clients] = new QTreeWidget( tabWidget ); + myViews[Clients]->setColumnCount( 6 ); + myViews[Clients]->setAllColumnsShowFocus( true ); + myViews[Clients]->setRootIsDecorated( false ); + QStringList runningLabels; + runningLabels << tr( "HDR_COMPONENT" ) << tr( "HDR_PID" ) << tr( "HDR_USERNAME" ) + << tr( "HDR_HOSTNAME" ) << tr( "HDR_STARTED" ) << tr( "HDR_HELLO" ); + myViews[Clients]->setHeaderLabels( runningLabels ); + tabWidget->addTab( myViews[Clients], tr( "TAB_RUNNING" ) ); + + myViews[History] = new QTreeWidget( tabWidget ); + myViews[History]->setColumnCount(6); + myViews[History]->setAllColumnsShowFocus( true ); + myViews[History]->setRootIsDecorated( false ); + QStringList historyLabels; + historyLabels << tr( "HDR_COMPONENT" ) << tr( "HDR_PID" ) << tr( "HDR_USERNAME" ) + << tr( "HDR_HOSTNAME" ) << tr( "HDR_STARTED" ) << tr( "HDR_FINISHED" ); + myViews[History]->setHeaderLabels( historyLabels ); + tabWidget->addTab( myViews[History], tr( "TAB_HISTORY" ) ); + + connect( tabWidget, SIGNAL( currentChanged( int ) ), this, SLOT( refresh() ) ); + connect( myViews[Clients], SIGNAL( itemActivated( QTreeWidgetItem*, int ) ), + this, SLOT( showDetails( QTreeWidgetItem*, int ) ) ); + connect( myViews[History], SIGNAL( itemActivated( QTreeWidgetItem*, int ) ), + this, SLOT( showDetails( QTreeWidgetItem*, int ) ) ); + + // create information window + myDetails = new QTextEdit( centralWidget() ); + myDetails->setReadOnly( true ); + myDetails->setMinimumHeight( 100 ); + + // layout widgets + QVBoxLayout* topLayout = new QVBoxLayout( centralWidget() ); + topLayout->setMargin( 0 ); + topLayout->setSpacing( SPACING_SIZE ); + topLayout->addWidget( tabWidget ); + topLayout->addWidget( myDetails ); - // Timer definition (used to automaticaly refresh the display area) - _counter = new QTimer( this ); - connect( _counter, SIGNAL( timeout() ), this, SLOT( slotListeSelect() ) ); - myRefreshInterval = 10; - _counter->start( myRefreshInterval * 1000 ); + // install auto-update timer + myTimer = new QTimer( this ); + connect( myTimer, SIGNAL( timeout() ), this, SLOT( refresh() ) ); + myTimer->start( 10000 ); // 10 seconds by default - PIXELS xpos = 160 ; - PIXELS ypos = 100 ; - PIXELS largeur = 800 ; - PIXELS hauteur = 350 ; - setGeometry( xpos, ypos, largeur, hauteur ) ; - setWindowTitle( tr( "Registry" ) ) ; - statusBar()->showMessage(" "); - - slotListeSelect(); + // resize window and set its position + resize( 800, 400 ); + Qtx::alignWidget( (QWidget*)this, (QWidget*)QApplication::desktop(), Qtx::AlignCenter ); + + // refresh registry information + refresh(); } /*! @@ -570,277 +278,115 @@ ToolsGUI_RegWidget::ToolsGUI_RegWidget( CORBA::ORB_var& orb, QWidget* parent ) */ ToolsGUI_RegWidget::~ToolsGUI_RegWidget() { - _counter->stop(); myRegWidgetPtr = 0; }; /*! - \brief Event filter - \param object event receiver - \param event event being processed - \return \c true if event processing should be stopped -*/ -bool ToolsGUI_RegWidget::eventFilter( QObject* object, QEvent* event ) -{ - if ( object ) { - if ( object == myHelpWindow && event->type() == QEvent::Close ) { - myHelpWindow = 0; - } - else if ( object == myInfoWindow && event->type() == QEvent::Close ) { - myInfoWindow = 0; - } - else if ( object == myIntervalWindow && event->type() == QEvent::Close ) { - myIntervalWindow = 0; - } - else if ( object == _clients && event->type() == QEvent::KeyPress ) { - QKeyEvent* ke = (QKeyEvent*)event; - if ( ke->key() == Qt::Key_Enter || ke->key() == Qt::Key_Return ) { - slotClientChanged( _clients->currentItem(), 0 ); - } - } - else if ( object == _history && event->type() == QEvent::KeyPress ) { - QKeyEvent* ke = (QKeyEvent*)event; - if ( ke->key() == Qt::Key_Enter || ke->key() == Qt::Key_Return ) { - slotHistoryChanged( _history->currentItem(), 0 ); - } - } - } - return QMainWindow::eventFilter( object, event ); -} - -/*! - \brief Search item in the list. - \param name component name - \param pid PID - \param machine machine name - \param listclient list of registry data - \return item index or -1 if it is not found. -*/ -int ToolsGUI_RegWidget::numitem( const QString& name, - const QString& pid, - const QString& machine, - const Registry::AllInfos* listclient ) -{ - for (CORBA::ULong i=0; ilength(); i++) { - const Registry::Infos & c_info=(*listclient)[i]; - ASSERT( c_info.name!=NULL); - QString b; - b.setNum(int(c_info.pid)); - if ( (name.compare(QString(c_info.name)) == 0) && - (machine.compare(QString(c_info.machine)) == 0) && - (pid.compare(b) == 0) ) { - return i; - } - } - return -1; -} - -/*! - \brief Get description text, containing information about client. + \brief Get description text, containing information about the service. \param c_info client info data \return formatted client description */ -QString ToolsGUI_RegWidget::setlongText( const Registry::Infos& c_info ) +QString ToolsGUI_RegWidget::getDetails( const Registry::Infos& c_info ) { - ASSERT( c_info.name != NULL ); - QString a = QString( "

" ) + tr( "Code" ) + QString( " : " ); - a.append( QString( c_info.name ) ); - a.append( "



" ); - a.append( "" ); // ASV: 28.07.06 : added tags to make the text font be - // fixed width (looks much better on Windows) - a.append( tr( "Process Id" ) + QString( " : " ) ); - a.append( BOLD( QString::number( int( c_info.pid ) ) ) ); - a.append( QString( " " ) + tr( "on machine" ) + QString( " " ) ); - a.append( BOLD( c_info.machine ) ); - a.append( QString( " " ) + tr( "ip address" ) + QString( " : " ) ); - a.append( BOLD( c_info.adip ) ); - a.append( "
" ); - - a.append( tr( "launched by user" ) + QString( " " ) ); - a.append( BOLD( c_info.pwname ) ); - a.append( QString( " ( " ) + tr( "pid" ) + QString( " : " ) ); - a.append( BOLD( QString::number( int( c_info.uid ) ) ) ); - a.append( QString( " )
" ) + tr( "in directory" ) + QString( " " )); - a.append( BOLD( c_info.cdir ) ); - - time_t aTime; - a.append( QString( "
" ) + tr( "begins" ) + QString( " " ) ); - aTime = time_t(c_info.tc_start); - char * t1 = (char * )duplicate(ctime(&aTime)); - t1 [strlen(t1) -1 ] = ' '; - a.append( BOLD( t1 ) ); - delete [] t1; - a.append( "
" ); - - if (c_info.tc_hello != 0 ) { - aTime = time_t(c_info.tc_hello); - char * t2 = (char * )duplicate(ctime(&aTime)); - t2 [strlen(t2) -1 ] = ' '; - a.append( tr( "last signal" ) + QString(" : ") ); - a.append( BOLD( t2 ) ); + QString a; + if ( c_info.name != NULL ) { + time_t aStarted( c_info.tc_start ); + time_t aLastPing( c_info.tc_hello ); + time_t aFinished( c_info.tc_end ); + + a.append( BOLD( tr( "INFO_SERVICE" ).arg( QString( c_info.name ) ) ) ); a.append( "
" ); - delete [] t2; - } - if ((c_info.tc_end - c_info.difftime) != 0) { - aTime = time_t(c_info.tc_end); - char * t3 = (char * )duplicate(ctime(&aTime)); - t3 [strlen(t3) -1 ] = ' '; - a.append( tr( "ends" ) + QString( " " ) ); - a.append( BOLD( t3 ) ); a.append( "
" ); - delete [] t3; - } - else { - a.append( tr( "still running" ) + QString( "
" ) ); - } - - SCRUTE(c_info.difftime); - if (c_info.difftime!= 0) { - a.append( QString( "(" ) + tr( "Time on" ) + QString( " " ) ); - a.append( BOLD( c_info.machine ) ); - a.append( QString( " " ) + tr( "differs from server's time. The difference is" ) + QString( " " )); - a.append( BOLD( QString::number( int( c_info.difftime ) ) ) ); - a.append( QString( " " ) + tr( "seconds" ) + QString( ")
" ) ); + a.append( tr( "INFO_PROCESS" ).arg( BOLD( QString::number( c_info.pid ) ), + BOLD( c_info.machine ), + BOLD( c_info.adip ), + BOLD( c_info.pwname ), + BOLD( QString::number( c_info.uid ) ), + BOLD( c_info.cdir ) ) ); + a.append( "
" ); + a.append( "
" ); + a.append( tr( "INFO_STARTED" ).arg( BOLD( QString( ctime( &aStarted ) ).trimmed() ) ) ); + a.append( "
" ); + if ( c_info.tc_hello != 0 ) { + a.append( tr( "INFO_LAST_PING" ).arg( BOLD( QString( ctime( &aLastPing ) ).trimmed() ) ) ); + a.append( "
" ); + } + if ( c_info.tc_end - c_info.difftime != 0 ) { + a.append( tr( "INFO_FINISHED" ).arg( BOLD( QString( ctime( &aFinished ) ).trimmed() ) ) ); + a.append( "
" ); + } + else { + a.append( tr( "INFO_RUNNING" ) ); + a.append( "
" ); + } + if ( c_info.difftime != 0 ) { + a.append( tr( "INFO_TIME_DIFF" ).arg( BOLD( c_info.machine ), BOLD( QString::number( c_info.difftime ) ) ) ); + a.append( "
" ); + } + a.append( "
" ); // ASV: 28.07.06 : added tags to make the text font be + // fixed width (looks much better on Windows) } - a.append( "" ); // ASV: 28.07.06 : added tags to make the text font be - // fixed width (looks much better on Windows) return a; - } /*! - \brief Close event handler. - \param e close event + \brief Refresh registry information */ -void ToolsGUI_RegWidget::closeEvent( QCloseEvent* e ) +void ToolsGUI_RegWidget::refresh() { - if ( myInfoWindow ) - myInfoWindow->close(); - if ( myHelpWindow ) - myHelpWindow->close(); - if (myIntervalWindow) - myIntervalWindow->close(); - e->accept(); -}; - -/*! - \brief Setup clients list. -*/ -void ToolsGUI_RegWidget::SetListe() -{ - _clients->installEventFilter( this ); - _clients->setColumnCount(6); - _clients->setAllColumnsShowFocus( true ); - QStringList aLabels; - aLabels << tr("Component") << tr("PID") << tr("User Name") << tr("Machine") << tr("begins") << tr("hello"); - _clients->setHeaderLabels( aLabels ); - //_clients->setColumnAlignment( 1, Qt::AlignRight ); -} - -/*! - \brief Setup history list. -*/ -void ToolsGUI_RegWidget::SetListeHistory() -{ - _history->installEventFilter( this ); - _history->setColumnCount(6); - _history->setAllColumnsShowFocus( true ); - QStringList aLabels; - aLabels << tr("Component") << tr("PID") << tr("User Name") << tr("Machine") << tr("begins") << tr("ends"); - _history->setHeaderLabels( aLabels ); - //_history->setColumnAlignment( 1, Qt::AlignRight ); -} - -/*! - \brief Update history list -*/ -void ToolsGUI_RegWidget::InfoHistory() -{ - - _history->clear(); try { - time_t aTime; - _serverhistory = _VarComponents->history(); - for (CORBA::ULong i=0; i<_serverhistory->length(); i++) { - const Registry::Infos & c_info=(*_serverhistory)[i]; - ASSERT( c_info.name!=NULL); - QString a; - a.setNum(int(c_info.pid)); - aTime = time_t(c_info.tc_start); - char * t1 = (char * )duplicate(ctime(&aTime)); - t1 [strlen(t1) -1 ] = ' '; - aTime = time_t(c_info.tc_end); - char * t2 = (char * )duplicate(ctime(&aTime)); - t2 [strlen(t2) -1 ] = ' '; - QStringList anItem; - anItem << QString(c_info.name) << a << QString(c_info.pwname) << QString(c_info.machine) << QString(t1) << QString(t2); - QTreeWidgetItem * item = new QTreeWidgetItem(_history, anItem); - item=0 ; - delete [] t1; - delete [] t2; - + // get reference to the Registry service + Registry::Components_var aRegistry = GetRegistry( myOrb ); + if ( aRegistry->_is_nil() ) { + myActions[Interval]->setDisabled( true ); + myActions[Refresh]->setDisabled( true ); + myTimer->stop(); + MESSAGE( "Sorry, no more Registry Server" ); + statusBar()->showMessage( tr( "ERR_NO_REGISTRY" ) ); + return; } - } - catch( ... ) { - _interval->setDisabled( TRUE ) ; - _refresh->setDisabled( TRUE ) ; - _counter->stop(); - MESSAGE("Sorry, No more Registry Server") ; - statusBar()->showMessage( tr( "Sorry, No more Registry Server" ) ) ; - } -} -/*! - \brief Update clients list -*/ -void ToolsGUI_RegWidget::InfoReg() -{ - _clients->clear(); - try { - time_t aTime; - _serverclients = _VarComponents->getall(); - for (CORBA::ULong i=0; i<_serverclients->length(); i++) { - const Registry::Infos & c_info=(*_serverclients)[i]; - ASSERT( c_info.name!=NULL); - QString a; - a.setNum(int(c_info.pid)); - aTime = time_t(c_info.tc_start); - char * t1 = (char * )duplicate(ctime(&aTime)); - t1 [strlen(t1) -1 ] = ' '; - aTime = time_t(c_info.tc_hello); - char * t2 = (char * )duplicate(ctime(&aTime)); - t2 [strlen(t2) -1 ] = ' '; - QStringList anItem; - anItem << QString(c_info.name) << a << QString(c_info.pwname) << QString(c_info.machine) << QString(t1) << QString(t2); - QTreeWidgetItem * item = new QTreeWidgetItem(_clients, anItem); - item=0 ; - delete [] t1; - delete [] t2; - + myData[Clients] = aRegistry->getall(); + myData[History] = aRegistry->history(); + + // update current services list + myViews[Clients]->clear(); + for ( int i = 0; i < myData[Clients]->length(); i++ ) { + const Registry::Infos& c_info = (*myData[Clients])[i]; + time_t aStarted = time_t( c_info.tc_start ); + time_t aLastPing = time_t( c_info.tc_hello ); + QStringList aData; + aData << QString( c_info.name ) + << QString::number( c_info.pid ) + << QString( c_info.pwname ) + << QString( c_info.machine ) + << QString( ctime( &aStarted ) ).trimmed() + << QString( ctime( &aLastPing ) ).trimmed(); + myViews[Clients]->addTopLevelItem( new QTreeWidgetItem( aData ) ); } - } - catch( ... ) { - _interval->setDisabled( TRUE ) ; - _refresh->setDisabled( TRUE ) ; - _counter->stop(); - MESSAGE("Sorry, No more Registry Server") ; - statusBar()->showMessage( tr( "Sorry, No more Registry Server" ) ) ; - } -} -/*! - \brief Called when \c Refresh button is clicked -*/ -void ToolsGUI_RegWidget::slotListeSelect() -{ - try { - ASSERT(_tabWidget->currentWidget() != NULL); - if (_tabWidget->currentWidget () == _clients) InfoReg(); - else if (_tabWidget->currentWidget () == _history) InfoHistory(); + // update history + myViews[History]->clear(); + for ( int i = 0; i < myData[History]->length(); i++ ) { + const Registry::Infos& c_info = (*myData[History])[i]; + time_t aStarted = time_t( c_info.tc_start ); + time_t aFinished = time_t( c_info.tc_end ); + QStringList aData; + aData << QString( c_info.name ) + << QString::number( c_info.pid ) + << QString( c_info.pwname ) + << QString( c_info.machine ) + << QString( ctime( &aStarted ) ).trimmed() + << QString( ctime( &aFinished ) ).trimmed(); + myViews[History]->addTopLevelItem( new QTreeWidgetItem( aData ) ); + } } catch( ... ) { - MESSAGE("Sorry, No more Registry Server") ; - statusBar()->showMessage( tr( "Sorry, No more Registry Server" ) ) ; + myActions[Interval]->setDisabled( true ); + myActions[Refresh]->setDisabled( true ); + myTimer->stop(); + MESSAGE( "Sorry, no more Registry Server" ); + statusBar()->showMessage( tr( "ERR_NO_REGISTRY" ) ); } } @@ -848,105 +394,27 @@ void ToolsGUI_RegWidget::slotListeSelect() \brief Called when \c Interval button is clicked (open dialog box to change refresh interval). */ -void ToolsGUI_RegWidget::slotSelectRefresh() +void ToolsGUI_RegWidget::refreshInterval() { - myIntervalWindow = new ToolsGUI_RegWidget::IntervalWindow(this); - myIntervalWindow->installEventFilter( this ); - myIntervalWindow->setValue(myRefreshInterval); - myIntervalWindow->show(); - connect( myIntervalWindow->Cancel(), SIGNAL( clicked() ), myIntervalWindow, SLOT( close() ) ); - connect( myIntervalWindow->Ok(), SIGNAL( clicked() ), this, SLOT( slotIntervalOk() ) ); + bool ok; + int sec = QInputDialog::getInt( this, tr( "TLT_REFRESH_INTERVAL" ), tr( "LAB_REFRESH_INTERVAL" ), + myTimer->interval() / 1000, 1, 24 * 60 * 60, 1, &ok ); + if ( ok ) + myTimer->start( sec * 1000 ); } /*! - \brief Called when IntervalWindow's \c OK button is clicked -*/ -void ToolsGUI_RegWidget::slotIntervalOk() -{ - myRefreshInterval = myIntervalWindow->getValue(); - _counter->start( myRefreshInterval * 1000 ); - SCRUTE(myRefreshInterval); - myIntervalWindow->close(); -} -/*! - \brief Called when \c Help button is clicked + \brief Show details about the chosen service. + \param item item activated by the user + \param column column index */ -void ToolsGUI_RegWidget::slotHelp() +void ToolsGUI_RegWidget::showDetails( QTreeWidgetItem* item, int column ) { - if ( !myHelpWindow ) { - myHelpWindow = new ToolsGUI_RegWidget::HelpWindow( this ); - myHelpWindow->installEventFilter( this ); - } - myHelpWindow->show(); - myHelpWindow->raise(); - myHelpWindow->activateWindow(); + if ( !item || column < 0 ) return; + int i = sender() == myViews[Clients] ? Clients : History; + int idx = myViews[i]->indexOfTopLevelItem( item ); + int size = myData[i]->length(); + if ( idx < 0 || idx > size-1 ) return; + const Registry::Infos& c_info = (*myData[i])[idx]; + myDetails->setText( getDetails( c_info ) ); } - -/*! - \brief Called when user clicks on item in \c Running list - \param item item clicked by the user -*/ -void ToolsGUI_RegWidget::slotClientChanged( QTreeWidgetItem* item, int col ) -{ - if ( !item || col < 0 ) - return; - - blockSignals( true ); // for sure that item will not be deleted when refreshing - - int numeroItem = numitem(item->text(0), item->text(1), item->text(3), _serverclients); - SCRUTE(numeroItem) ; - SCRUTE(item->text(1).toLatin1().constData()) ; - - ASSERT(numeroItem>=0) ; - ASSERT((size_t)numeroItem<_serverclients->length()) ; - const Registry::Infos & c_info=(*_serverclients)[numeroItem]; - ASSERT( c_info.name!=NULL); - - if ( !myInfoWindow ) { - myInfoWindow = new ToolsGUI_RegWidget::InfoWindow( this ); - myInfoWindow->installEventFilter( this ); - } - QString a = tr( "More about" ) + QString( " " ) + QString( c_info.name ); - myInfoWindow->setWindowTitle(a); - myInfoWindow->setText( ToolsGUI_RegWidget::setlongText( c_info) ); - myInfoWindow->show(); - myInfoWindow->raise(); - myInfoWindow->activateWindow(); - - blockSignals( false ); // enabling signals again -} - -/*! - \brief Called when user clicks on item in \c History list - \param item item clicked by the user -*/ -void ToolsGUI_RegWidget::slotHistoryChanged( QTreeWidgetItem* item, int col ) -{ - if ( !item || col < 0 ) - return; - - blockSignals( true ); // for sure that item will not be deleted when refreshing - - int numeroItem = numitem(item->text(0), item->text(1), item->text(3), _serverhistory); - - SCRUTE(numeroItem) ; - SCRUTE(item->text(1).toLatin1().constData()) ; - ASSERT(numeroItem>=0) ; - ASSERT((size_t)numeroItem<_serverhistory->length()) ; - const Registry::Infos & c_info=(*_serverhistory)[numeroItem]; - ASSERT( c_info.name!=NULL); - - if ( !myInfoWindow ) { - myInfoWindow = new ToolsGUI_RegWidget::InfoWindow( this ); - myInfoWindow->installEventFilter( this ); - } - QString a = tr( "More about" ) + QString( " " ) + QString( c_info.name ); - myInfoWindow->setWindowTitle(a); - myInfoWindow->setText( ToolsGUI_RegWidget::setlongText( c_info ) ); - myInfoWindow->show(); - myInfoWindow->raise(); - myInfoWindow->activateWindow(); - - blockSignals( false ); // enabling signals again -} - diff --git a/src/TOOLSGUI/ToolsGUI_RegWidget.h b/src/TOOLSGUI/ToolsGUI_RegWidget.h index 586cc9867..657bed022 100755 --- a/src/TOOLSGUI/ToolsGUI_RegWidget.h +++ b/src/TOOLSGUI/ToolsGUI_RegWidget.h @@ -20,88 +20,55 @@ // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // -// SALOME RegistryDisplay : GUI for Registry server implementation -// File : ToolsGUI_RegWidget.h -// Author : Pascale NOYRET, EDF -// #ifndef TOOLSGUI_REGWIDGET_H #define TOOLSGUI_REGWIDGET_H #include "ToolsGUI.h" #include +#include #include #include CORBA_CLIENT_HEADER(SALOME_Registry) -class QTabWidget; class QTreeWidget; class QTreeWidgetItem; -class QWidget; class QTimer; -class QCloseEvent; class QAction; +class QTextEdit; class TOOLSGUI_EXPORT ToolsGUI_RegWidget : public QMainWindow { Q_OBJECT - class HelpWindow; - class IntervalWindow; - class InfoWindow; + enum { Refresh, Interval, Close }; + enum { Clients, History }; - ToolsGUI_RegWidget( CORBA::ORB_var& orb, QWidget* parent = 0 ); + ToolsGUI_RegWidget( CORBA::ORB_ptr orb, QWidget* parent = 0 ); public: ~ToolsGUI_RegWidget(); - void SetListe(); - void SetListeHistory(); - void InfoReg(); - void InfoHistory(); - - bool eventFilter( QObject* object, QEvent* event ); - - static ToolsGUI_RegWidget* GetRegWidget( CORBA::ORB_var& orb, + static ToolsGUI_RegWidget* GetRegWidget( CORBA::ORB_ptr orb, QWidget* parent = 0 ); - virtual QMenu* createPopupMenu(); +private slots: + void refresh(); + void showDetails( QTreeWidgetItem*, int ); + void refreshInterval(); -public slots: - void slotHelp(); - void slotListeSelect(); - void slotClientChanged( QTreeWidgetItem*, int ); - void slotHistoryChanged( QTreeWidgetItem*, int ); - void slotSelectRefresh(); - void slotIntervalOk(); - -protected: - static QString setlongText( const Registry::Infos& c_info ); - int numitem( const QString& name, - const QString& pid, - const QString& machine, - const Registry::AllInfos* clistclient ); - void closeEvent( QCloseEvent* e ); +private: + static QString getDetails( const Registry::Infos& c_info ); -protected : - QTreeWidget* _clients; - QTreeWidget* _history; - QWidget* _parent; - QTabWidget* _tabWidget; - QAction* _refresh; - QAction* _interval; - QAction* _close; - QTimer* _counter; - Registry::AllInfos* _serverhistory; - Registry::AllInfos* _serverclients; - InfoWindow* myInfoWindow; - HelpWindow* myHelpWindow; - IntervalWindow* myIntervalWindow; - int myRefreshInterval; - private: - const Registry::Components_var _VarComponents; - static ToolsGUI_RegWidget* myRegWidgetPtr; + static ToolsGUI_RegWidget* myRegWidgetPtr; + + CORBA::ORB_var myOrb; + QMap myData; + QMap myActions; + QMap myViews; + QTextEdit* myDetails; + QTimer* myTimer; }; #endif // TOOLSGUI_REGWIDGET_H diff --git a/src/TOOLSGUI/resources/ToolsGUI_msg_en.ts b/src/TOOLSGUI/resources/ToolsGUI_msg_en.ts index 8f25a61e5..4337da127 100644 --- a/src/TOOLSGUI/resources/ToolsGUI_msg_en.ts +++ b/src/TOOLSGUI/resources/ToolsGUI_msg_en.ts @@ -1,27 +1,6 @@ - - + + + @default @@ -125,4 +104,119 @@ File doesn't exist IDL : + + ToolsGUI_RegWidget + + TLT_REFRESH_INTERVAL + Refresh Interval + + + LAB_REFRESH_INTERVAL + New refresh interval (in seconds) + + + TLT_REGISTRY + Registry + + + MNU_ACTIONS + Actions + + + TB_ACTIONS + Actions + + + MEN_REFRESH + Refresh + + + STB_REFRESH + Immediately updates list of components + + + MEN_INTERVAL + Refresh interval... + + + STB_INTERVAL + Change refresh interval + + + MEN_CLOSE + Close + + + STB_CLOSE + Close Registry window + + + TAB_RUNNING + Running + + + TAB_HISTORY + History + + + HDR_COMPONENT + Component + + + HDR_PID + PID + + + HDR_USERNAME + User name + + + HDR_HOSTNAME + Host name + + + HDR_STARTED + Started + + + HDR_FINISHED + Finished + + + HDR_HELLO + Last ping + + + ERR_NO_REGISTRY + Error: Registry Server is not found + + + INFO_SERVICE + Service : %1 + + + INFO_PROCESS + Process ( PID : %1 ) on the machine %2 ( ip address : %3 ); launched by the user %4 ( UID : %5 ) in directory %6. + + + INFO_STARTED + Started : %1 + + + INFO_LAST_PING + Last signal : %1 + + + INFO_FINISHED + Finished : %1 + + + INFO_RUNNING + Still running + + + INFO_TIME_DIFF + Time on %1 differs from server's time. The difference is %2 seconds. + + diff --git a/src/TOOLSGUI/resources/ToolsGUI_msg_fr.ts b/src/TOOLSGUI/resources/ToolsGUI_msg_fr.ts new file mode 100755 index 000000000..189eeccaa --- /dev/null +++ b/src/TOOLSGUI/resources/ToolsGUI_msg_fr.ts @@ -0,0 +1,222 @@ + + + + + @default + + TOOLS_WRN_WARNING + Avertissement + + + TOOLS_BUT_BROWSE + Naviquer... + + + TOOLS_ERR_ERROR + Erreur + + + TOOLS_ERR_FILE_NOT_EXIST + %1 +Le fichier n'existe pas + + + TOOLS_BUT_OK + &Ok + + + TOOLS_BUT_APPLY + &Appliquer + + + TOOLS_BUT_CLOSE + &Fermer + + + + ToolsGUI_CatalogGeneratorDlg + + TOOLS_MEN_EXPORT + Exporter + + + TOOLS_MEN_IMPORT + Importer + + + TOOLS_VERSION + Version : + + + TOOLS_COMP_NAME + Nom : + + + TOOLS_COMP_TYPE + Type : + + + TOOLS_XML_FILE + XML : + + + TOOLS_PNG_FILE + Icône : + + + TOOLS_SUPPLEMENT + Données du Composant Supplémentaires + + + TOOLS_AUTHOR + Autheur : + + + TOOLS_COMP_MULTISTD + Multiétude : + + + TOOLS_COMP_USERNAME + NomUtilisateur : + + + TOOLS_CATALOG_GENERATOR + Générateur du Catalogue + + + TOOLS_FILES + Fichiers + + + TOOLS_MEN_IMPORT_PNG + Fichiers PNG ( *.png ) + + + TOOLS_MEN_IMPORT_IDL + Fichiers IDL ( *.idl ) + + + TOOLS_MEN_EXPORT_XML + Fichiers XML ( *.xml ) + + + TOOLS_IDL_FILE + IDL : + + + + ToolsGUI_RegWidget + + TLT_REFRESH_INTERVAL + Fréquence d'actualisation + + + LAB_REFRESH_INTERVAL + Nouvelle fréquence d'actualisation (en secondes) + + + TLT_REGISTRY + Registre + + + MNU_ACTIONS + Actions + + + TB_ACTIONS + Actions + + + MEN_REFRESH + Refresh + + + STB_REFRESH + Met à jour toutb de suite la liste des composants + + + MEN_INTERVAL + Fréquence d'actualisation... + + + STB_INTERVAL + Changer la fréquence d'actualisation + + + MEN_CLOSE + Fermer + + + STB_CLOSE + Fermer la fenêtre du Registre + + + TAB_RUNNING + En cours + + + TAB_HISTORY + Historique + + + HDR_COMPONENT + Composant + + + HDR_PID + PID + + + HDR_USERNAME + Nom de l'utilisateur + + + HDR_HOSTNAME + Nom de l'hôte + + + HDR_STARTED + Commencé + + + HDR_FINISHED + Fini + + + HDR_HELLO + Dernier ping + + + ERR_NO_REGISTRY + Erreur: le Serveur du Registre n'est pas trouvé + + + INFO_SERVICE + Service : %1 + + + INFO_PROCESS + Le procédé ( PID : %1 ) sur la station %2 ( ip adresse : %3 ); lancé par l'utilisateur %4 ( UID : %5 ) au répertoire %6. + + + INFO_STARTED + Commencé : %1 + + + INFO_LAST_PING + Dernier signal : %1 + + + INFO_FINISHED + Fini : %1 + + + INFO_RUNNING + Demeure en cours + + + INFO_TIME_DIFF + Le temps de la station %1 est différent du temps du serveur. La différence est %2 secondes. + + + diff --git a/src/VTKViewer/Makefile.am b/src/VTKViewer/Makefile.am index b5187b295..56da23db4 100755 --- a/src/VTKViewer/Makefile.am +++ b/src/VTKViewer/Makefile.am @@ -59,7 +59,8 @@ salomeinclude_HEADERS = \ VTKViewer_MarkerWidget.h \ VTKViewer_MarkerDlg.h \ VTKViewer_PolyDataMapper.h \ - VTKViewer_DataSetMapper.h + VTKViewer_DataSetMapper.h \ + VTKViewer_CellCenters.h dist_libVTKViewer_la_SOURCES = \ VTKViewer_CellLocationsArray.cxx \ @@ -87,7 +88,8 @@ dist_libVTKViewer_la_SOURCES = \ VTKViewer_MarkerWidget.cxx \ VTKViewer_MarkerDlg.cxx \ VTKViewer_PolyDataMapper.cxx \ - VTKViewer_DataSetMapper.cxx + VTKViewer_DataSetMapper.cxx \ + VTKViewer_CellCenters.cxx MOC_FILES = \ VTKViewer_RenderWindow_moc.cxx \ @@ -131,7 +133,8 @@ dist_salomeres_DATA = \ nodist_salomeres_DATA = \ VTKViewer_images.qm \ - VTKViewer_msg_en.qm + VTKViewer_msg_en.qm \ + VTKViewer_msg_fr.qm libVTKViewer_la_CPPFLAGS = $(QT_INCLUDES) $(VTK_INCLUDES) $(CAS_CPPFLAGS) \ -I$(srcdir)/../Qtx -I$(srcdir)/../SUIT diff --git a/src/VTKViewer/VTKViewer_CellCenters.cxx b/src/VTKViewer/VTKViewer_CellCenters.cxx new file mode 100644 index 000000000..91c998856 --- /dev/null +++ b/src/VTKViewer/VTKViewer_CellCenters.cxx @@ -0,0 +1,184 @@ +// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "VTKViewer_CellCenters.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +vtkCxxRevisionMacro(VTKViewer_CellCenters, "$Revision$"); +vtkStandardNewMacro(VTKViewer_CellCenters); + +/*! + * Class : VTKViewer_CellCenters + * Description : Filter computing geometrical centers of given cells + * (differs from native vtk filter by small fix for VTK_CONVEX_POINT_SET cells) + */ + +/*! + Constructor +*/ +VTKViewer_CellCenters::VTKViewer_CellCenters() +{ +} + +/*! + Redefined main method +*/ +int VTKViewer_CellCenters::RequestData( + vtkInformation *vtkNotUsed(request), + vtkInformationVector **inputVector, + vtkInformationVector *outputVector) +{ + // get the info objects + vtkInformation *inInfo = inputVector[0]->GetInformationObject(0); + vtkInformation *outInfo = outputVector->GetInformationObject(0); + + // get the input and ouptut + vtkDataSet *input = vtkDataSet::SafeDownCast( + inInfo->Get(vtkDataObject::DATA_OBJECT())); + vtkPolyData *output = vtkPolyData::SafeDownCast( + outInfo->Get(vtkDataObject::DATA_OBJECT())); + + vtkIdType cellId, numCells; + int subId; + vtkCellData *inCD; + vtkPointData *outPD; + vtkPoints *newPts; + vtkCell *cell; + double x[3], pcoords[3]; + double *weights; + + inCD=input->GetCellData(); + outPD=output->GetPointData(); + + if ( (numCells = input->GetNumberOfCells()) < 1 ) + { + vtkWarningMacro(<<"No cells to generate center points for"); + return 1; + } + + newPts = vtkPoints::New(); + newPts->SetNumberOfPoints(numCells); + weights = new double [input->GetMaxCellSize()]; + + int abort=0; + vtkIdType progressInterval = numCells/10 + 1; + int hasEmptyCells = 0; + for (cellId=0; cellId < numCells && !abort; cellId++) + { + if ( ! (cellId % progressInterval) ) + { + vtkDebugMacro(<<"Processing #" << cellId); + this->UpdateProgress (0.5*cellId/numCells); + abort = this->GetAbortExecute(); + } + + cell = input->GetCell(cellId); + if (cell->GetCellType() != VTK_EMPTY_CELL) + { + // fix for VTK_CONVEX_POINT_SET cells + if (cell->GetCellType() == VTK_CONVEX_POINT_SET ) + { + x[0] = x[1] = x[2] = 0; + vtkPoints* aPoints = cell->GetPoints(); + int aNbPoints = aPoints->GetNumberOfPoints(); + for( int i = 0; i < aNbPoints; i++ ) + { + double aCoord[3]; + aPoints->GetPoint( i, aCoord ); + x[0] += aCoord[0]; + x[1] += aCoord[1]; + x[2] += aCoord[2]; + } + x[0] /= aNbPoints; + x[1] /= aNbPoints; + x[2] /= aNbPoints; + } + else + { + subId = cell->GetParametricCenter(pcoords); + cell->EvaluateLocation(subId, pcoords, x, weights); + } + newPts->SetPoint(cellId,x); + } + else + { + hasEmptyCells = 1; + } + } + + if ( this->VertexCells ) + { + vtkIdType pts[1]; + vtkCellData *outCD=output->GetCellData(); + vtkCellArray *verts = vtkCellArray::New(); + verts->Allocate(verts->EstimateSize(1,numCells),1); + + for (cellId=0; cellId < numCells && !abort; cellId++) + { + if ( ! (cellId % progressInterval) ) + { + vtkDebugMacro(<<"Processing #" << cellId); + this->UpdateProgress (0.5+0.5*cellId/numCells); + abort = this->GetAbortExecute(); + } + + cell = input->GetCell(cellId); + if (cell->GetCellType() != VTK_EMPTY_CELL) + { + pts[0] = cellId; + verts->InsertNextCell(1,pts); + } + } + + output->SetVerts(verts); + verts->Delete(); + if (!hasEmptyCells) + { + outCD->PassData(inCD); //only if verts are generated + } + } + + // clean up and update output + output->SetPoints(newPts); + newPts->Delete(); + + if (!hasEmptyCells) + { + outPD->PassData(inCD); //because number of points = number of cells + } + if (weights) + { + delete [] weights; + } + + return 1; +} diff --git a/src/VTKViewer/VTKViewer_CellCenters.h b/src/VTKViewer/VTKViewer_CellCenters.h new file mode 100644 index 000000000..7057d7961 --- /dev/null +++ b/src/VTKViewer/VTKViewer_CellCenters.h @@ -0,0 +1,60 @@ +// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef VTKVIEWER_CELLCENTERS_H +#define VTKVIEWER_CELLCENTERS_H + +#include "VTKViewer.h" + +#include + +#ifdef WIN32 +#pragma warning ( disable:4251 ) +#endif + +/*! + * Class : VTKViewer_CellCenters + * Description : Filter computing geometrical centers of given cells + * (differs from native vtk filter by small fix for VTK_CONVEX_POINT_SET cells) + */ +class VTKVIEWER_EXPORT VTKViewer_CellCenters : public vtkCellCenters +{ +public: + vtkTypeRevisionMacro(VTKViewer_CellCenters,vtkCellCenters); + + static VTKViewer_CellCenters *New(); + +protected: + VTKViewer_CellCenters(); + + virtual int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *); + +private: + VTKViewer_CellCenters(const VTKViewer_CellCenters&); // Not implemented. + void operator=(const VTKViewer_CellCenters&); // Not implemented. +}; + +#ifdef WIN32 +#pragma warning ( default:4251 ) +#endif + +#endif diff --git a/src/VTKViewer/resources/VTKViewer_msg_en.ts b/src/VTKViewer/resources/VTKViewer_msg_en.ts index 76b6902fa..c737763d7 100644 --- a/src/VTKViewer/resources/VTKViewer_msg_en.ts +++ b/src/VTKViewer/resources/VTKViewer_msg_en.ts @@ -1,27 +1,6 @@ - - + + + @default diff --git a/src/VTKViewer/resources/VTKViewer_msg_fr.ts b/src/VTKViewer/resources/VTKViewer_msg_fr.ts new file mode 100755 index 000000000..530b17a89 --- /dev/null +++ b/src/VTKViewer/resources/VTKViewer_msg_fr.ts @@ -0,0 +1,207 @@ + + + + + @default + + MNU_FRONT_VIEW + Devant + + + ERROR + Erreur + + + MNU_DUMP_VIEW + Clipper une vue... + + + DSC_TOP_VIEW + Vue de dessus + + + MNU_PAN_VIEW + Panoramique + + + MNU_TOP_VIEW + Dessus + + + DSC_GLOBALPAN_VIEW + Sélection d'un nouveau centre de la vue + + + DSC_ROTATE_VIEW + Tourner le point de vue autour du centre de la scène + + + MNU_ZOOM_VIEW + Zoom + + + DSC_PAN_VIEW + Redimensionner la vue + + + DSC_LEFT_VIEW + Vue de gauche + + + DSC_FITALL + Redimensionner la scène pour montrer tous les objets + + + MNU_FITALL + Montrer tous + + + MNU_ROTATE_VIEW + Rotation + + + DSC_SHOW_TRIHEDRON + Montrer/Cacher les axes de coordonnées dans la scène + + + DSC_FRONT_VIEW + Vue de Devant + + + MNU_GLOBALPAN_VIEW + Panoramique Globale + + + INF_APP_DUMP_VIEW + Clicher la vue + + + MNU_BACK_VIEW + Arrière + + + MNU_SHOW_TRIHEDRON + Montrer/Cacher les axes de coordonnées + + + MNU_BOTTOM_VIEW + Dessous + + + MNU_RESET_VIEW + Restaurer le point de vue + + + MNU_LEFT_VIEW + Gauche + + + DSC_RIGHT_VIEW + Veu de Droit + + + DSC_FITRECT + Redimensionner la scène pour ne montrer que la partie choisie par l'encadré + + + MNU_FITRECT + Montrer l'encadré + + + DSC_BOTTOM_VIEW + Vue de Dessous + + + DSC_DUMP_VIEW + Sauvegarder la scène en cours au fichier image + + + DSC_ZOOM_VIEW + Zoom la vue + + + VTK_IMAGE_FILES + Fichiers Images (*.bmp *.png *.jpg *.jpeg) + + + DSC_RESET_VIEW + Restaurer le Point de Vue + + + ERR_DOC_CANT_SAVE_FILE + Il est impossible de sauvegarder le fichier + + + MNU_RIGHT_VIEW + Droit + + + LBL_TOOLBAR_LABEL + Visualiser les Opérations + + + DSC_BACK_VIEW + Vue d'Arrière + + + + VTKViewer_MarkerDlg + + SET_MARKER_TLT + Définir le Repère Point + + + + VTKViewer_MarkerWidget + + STANDARD_MARKER + Standard + + + CUSTOM_MARKER + Personnalisé + + + TYPE + Type: + + + SCALE + Echelle: + + + CUSTOM + Texture: + + + BROWSE + Naviguer... + + + LOAD_TEXTURE_TLT + Charger une Texture + + + + VTKViewer_ViewManager + + VTK_VIEW_TITLE + VTK scène:%M - visualisateur:%V + + + + VTKViewer_Viewer + + MEN_DUMP_VIEW + Clicher la Vue... + + + MEN_SHOW_TOOLBAR + Montrer la Barre d'Outils + + + MEN_CHANGE_BACKGROUD + Changer l'Arrière-Plan... + + + -- 2.39.2