]> SALOME platform Git repositories - modules/gui.git/commitdiff
Salome HOME
Merge remote-tracking branch 'origin/master'
authorctn <charly.tendron@opencascade.com>
Wed, 7 May 2014 12:45:10 +0000 (14:45 +0200)
committerctn <charly.tendron@opencascade.com>
Wed, 7 May 2014 12:45:10 +0000 (14:45 +0200)
14 files changed:
doc/salome/gui/input/occ_3d_viewer.doc
doc/salome/gui/input/plot2d_viewer.doc
doc/salome/gui/input/vtk_3d_viewer.doc
src/LightApp/LightApp_Application.cxx
src/LightApp/LightApp_Application.h
src/LightApp/resources/LightApp_msg_en.ts
src/Qtx/QtxResourceMgr.cxx
src/Qtx/QtxResourceMgr.h
src/SALOME_PYQT/SALOME_PYQT_GUI/SALOME_PYQT_Module.cxx
src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_ModuleLight.cxx
src/SUITApp/SUITApp_init_python.cxx
src/SalomeApp/SalomeApp_Application.cxx
src/SalomeApp/SalomeApp_Application.h
src/SalomeApp/resources/SalomeApp_msg_en.ts

index 0ff585d9c2a86b6234dcabe07a9704143100997d..d372e793b8412cae23d6c480c3e71632f7325d77 100644 (file)
@@ -94,14 +94,14 @@ box of an object.
 
 \image html set_rotation_point_dialog2.png
 
-Unchecking <b>Use Bounding Box Center</b> checkbox allows you to
+Disabling <b>Use Bounding Box Center</b> check-box allows you to
 define the coordinates of the rotation point manually.
 
 - <b>Set to Origin</b> button restores the default rotation point
   coordinates.
 
-- <b>Gravity Center of Select Object</b> button allows to choose Point, Edge, Face or Solid in drop-down menu.
-  As soon as corresponding object is selected in the viewer, its gravity center will be used as center of the rotation point.
+- <b>Gravity Center of Selected Object</b> button allows using the gravity center of the object selected in the viewer as the center of the rotation point. 
+When you click this button, you should first choose the type of selectable object: Point, Edge, Face or Solid and only then proceed with selection in the viewer.
 
 <hr>
 
index b5072eb8530102e9e70a6e27446329d5a4e9a64b..823c8cf496d27239b925f82c653d0462d80bb4fd 100644 (file)
@@ -129,45 +129,40 @@ allows to specify advanced parameters for the Plot 2d Viewer.
 \anchor settings
 \image html plot2d_view_settings.png
 
-The options are as follows:
+The following options are available:
 
-- <b>Main title</b> the title of the XY plot. By default, it will
-  consist of the names of the tables, on the basis of which the curve
-  lines have been constructed.
+- <b>Main title</b> is the XY plot title. By default, it contains the names of tables, from which the curve
+  lines are constructed.
 
-- <b>Curve type</b> you can select from \em Points, \em Lines or
-  \em Spline.
+- <b>Curve type</b> allows selecting from \em Points, \em Lines or  \em Spline.
 
 - <b>Marker size</b> - size of the points (markers) forming curve lines.
 
 - <b>Background color</b> of the XY plot.
 
-- <b>Selection color</b> - this submenu allows to select the color of selected object in the viewer.
+- <b>Selection color</b> - defines the color of selected object in the viewer.
 
-- <b>Legend</b> allows specifying the properties of the legend.
+- <b>Legend</b> specifies the legend properties.
   
-  - <b>Show legend</b> - this options specifies if it's necessary to show legend by default.
+  - <b>Show legend</b> - specifies if the legend is shown by default.
 
-  - <b>Legend Position</b> here you can define the position of the
-  description table on the XY plot (to the \em Left, to the \em Right,
+  - <b>Legend Position</b> allows positioning the
+  description table on XY plot (to the \em Left, to the \em Right,
   on \em Top or on \em Bottom).
   
-  - <b>Symbol type</b> you can select the type of legend item symbol from "Marker on line" or "Marker above line"
+  - <b>Symbol type</b> allows positioning the legend item symbol: "Marker on line" or "Marker above line".
 
-  - <b>Legend font</b> here you can set type, face and color for the
-  font of Legend item.
+  - <b>Legend font</b> allows setting font variant, size and style for legend items.
   
-  - <b>Legend font color</b> - this allows to select the color of the font of the legend item.
+  - <b>Legend font color</b> allows selecting the font color for legend items.
 
-  - <b>Highlighted legend font color</b> - this submenu allows to select the color of the font of the selected legend item.
+  - <b>Highlighted legend font color</b> allows selecting font color for selected legend items.
 
-- <b>Deviation marker</b> allows specifying the properties of the
-  marker, which is used for drawing deviations data.
+- <b>Deviation marker</b> specifies the properties of the marker, which is used for drawing deviations data.
 
   - <b>Line width</b> line width of the marker.
 
-  - <b>Tick size</b> size of the upper and lower horizontal lines of
-    the marker.
+  - <b>Tick size</b> size of the upper and lower horizontal lines of the marker.
 
   - <b>Color</b> color of the marker.
 
index 7d044babbb81ece3b4736c8ffa815739accf62aa..3e50278806c7bd655a139fb4893efe8c120e36df 100644 (file)
@@ -99,8 +99,8 @@ define the coordinates of the rotation point manually.
 - <b>Set to Origin</b> button restores the default rotation point
   coordinates.
 
-- <b>Gravity Center of Select Object</b> button allows to choose Point, Edge, Face or Volume in drop-down menu.
-  As soon as corresponding object is selected in the viewer, its gravity center will be used as center of the rotation point.
+- <b>Gravity Center of Selected Object</b> button allows using the gravity center of the object selected in the viewer as the center of the rotation point. 
+When you click this button, you should first choose the type of selectable object: Point, Edge, Face or Solid and only then proceed with selection in the viewer.
 
 <hr>
 
index 976f9c8032f27411191db982a311f073f2048df1..2640effb99ec3c32e32fc75c8a33035a1a0491ee 100644 (file)
@@ -876,11 +876,12 @@ void LightApp_Application::onNewDoc()
   //asl: fix for 0020515
   if ( activeStudy() ) {
     saveDockWindowsState();
+  }
+  
 #ifdef SINGLE_DESKTOP
-    if ( !closeDoc() )
-      return;
+  if ( !checkExistingDoc() )
+    return;
 #endif
-  }
 
   CAM_Application::onNewDoc();
 }
@@ -892,15 +893,14 @@ void LightApp_Application::onOpenDoc()
 {
   SUIT_Study* study = activeStudy();
   saveDockWindowsState();
-  if (study) {
+  
 #ifdef SINGLE_DESKTOP
-    if ( !closeDoc() )
-      return;
+  if ( !checkExistingDoc() )
+    return;
 #endif
-  }
-
+  
   CAM_Application::onOpenDoc();
-
+  
   if ( !study ) // new study will be create in THIS application
   {
     updateWindows();
@@ -914,15 +914,13 @@ void LightApp_Application::onOpenDoc()
 */
 bool LightApp_Application::onOpenDoc( const QString& aName )
 {
-  if ( activeStudy() ) {
 #ifdef SINGLE_DESKTOP
-    if ( !closeDoc() )
-      return false;
+  if ( !checkExistingDoc() )
+    return false;
 #endif
-  }
   // We should take mru action first because this application instance can be deleted later.
   QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
-
+  
   bool res = CAM_Application::onOpenDoc( aName );
 
   if ( mru )
@@ -4425,3 +4423,11 @@ void LightApp_Application::onViewManagerRemoved( SUIT_ViewManager* )
       aStudy->setVisibilityStateForAll( Qtx::UnpresentableState );
   }
 }
+
+/*!
+  Check existing document.
+*/
+bool LightApp_Application::checkExistingDoc() {
+  return true;
+}
+
index 1fcef083d6aeeba8b3e0c667d3cd8e436b32d075..93b325c8a7e60d20989efbe6fedf476b371128bb 100644 (file)
@@ -179,6 +179,8 @@ public:
   void                                updateVisibilityState( DataObjectList& theList,
                                                              SUIT_ViewModel* theViewModel );  
 
+  virtual bool                        checkExistingDoc();
+
 signals:
   void                                studyOpened();
   void                                studySaved();
@@ -191,6 +193,7 @@ public slots:
   virtual void                        onHelpContextModule( const QString&, const QString&, const QString& = QString() );
   virtual void                        onNewDoc();
   virtual void                        onOpenDoc();
+
   virtual void                        onHelpAbout();
   virtual bool                        onOpenDoc( const QString& );
   virtual void                        onCopy();
index 8e44f37f91d432028f327b653ac246ebc13d221b..306362bd5aad07ffd43610007a5495fcc209c468 100644 (file)
@@ -597,7 +597,7 @@ The changes will be applied on the next application session.</translation>
     </message>
     <message>
         <source>PREF_CURRENT_LOCALE</source>
-        <translation>Use C locale</translation>
+        <translation>Use &quot;C&quot; locale</translation>
     </message>
     <message>
         <source>PREF_GROUP_LOOK_AND_FEEL</source>
index 0e74d6a8dc6da70eac854cea7db917a72024dd44..d3c2aa09886e3cc147263455fac25344a10a76f1 100644 (file)
@@ -66,8 +66,6 @@ static const char* pixmap_not_found_xpm[] = {
 "                ",
 "                "};
 
-QPixmap*  QtxResourceMgr::myDefaultPix = NULL;
-
 /*!
   \class QtxResourceMgr::Resources
   \internal
@@ -1239,6 +1237,7 @@ bool QtxResourceMgr::Format::save( Resources* res )
 QtxResourceMgr::QtxResourceMgr( const QString& appName, const QString& resVarTemplate )
 : myAppName( appName ),
   myCheckExist( true ),
+  myDefaultPix( 0 ),
   myIsPixmapCached( true ),
   myHasUserValues( true ),
   myWorkingMode( AllowUserValues )
@@ -1276,6 +1275,8 @@ QtxResourceMgr::~QtxResourceMgr()
 
   qDeleteAll( myResources );
   qDeleteAll( myFormats );
+
+  delete myDefaultPix;
 }
 
 /*!
@@ -2543,15 +2544,13 @@ QString QtxResourceMgr::sectionsToken() const
   \return default pixmap
   \sa setDefaultPixmap(), loadPixmap()
 */
-QPixmap QtxResourceMgr::defaultPixmap()
+QPixmap QtxResourceMgr::defaultPixmap() const
 {
-  QPixmap res;
-  if(!myDefaultPix)
-    myDefaultPix = new QPixmap( pixmap_not_found_xpm );
-  
-  if ( myDefaultPix && !myDefaultPix->isNull() )
-    res = *myDefaultPix;
-  return res;
+  static QPixmap* defpx = 0;
+  if ( !defpx ) 
+    defpx = new QPixmap( pixmap_not_found_xpm );
+
+  return myDefaultPix ? *myDefaultPix : *defpx;
 }
 
 /*!
@@ -2568,7 +2567,7 @@ void QtxResourceMgr::setDefaultPixmap( const QPixmap& pix )
   if ( pix.isNull() )
     myDefaultPix = 0;
   else
-    myDefaultPix = new QPixmap( pix ); 
+    myDefaultPix = new QPixmap( pix );
 }
 
 /*!
index 11eab4a4a5b7f0b41895b8fbd85203fb080a9313..6abab30100c71d21ec4b00239827dbd5cf35a9ce 100644 (file)
@@ -141,8 +141,8 @@ public:
   QString          option( const QString& ) const;
   void             setOption( const QString&, const QString& );
 
-  static QPixmap  defaultPixmap();
-  static void     setDefaultPixmap( const QPixmap& );
+  QPixmap          defaultPixmap() const;
+  virtual void     setDefaultPixmap( const QPixmap& );
 
   QString          resSection() const;
   QString          langSection() const;
@@ -201,7 +201,7 @@ private:
   ResList          myResources;               //!< resources list
   bool             myCheckExist;              //!< "check existance" flag
   TransListMap     myTranslator;              //!< map of loaded translators
-  static QPixmap*  myDefaultPix;              //!< default icon
+  QPixmap*         myDefaultPix;              //!< default icon
   bool             myIsPixmapCached;          //!< "cached pixmaps" flag
 
   bool             myHasUserValues;           //!< \c true if user preferences has been read
index 799522728ae27db9890b59de4b8251392e237d34..4b73279a700c3c34c38c8323852d078342d20d0c 100644 (file)
@@ -29,6 +29,8 @@
 #include <SALOME_LifeCycleCORBA.hxx>
 #include <Container_init_python.hxx>
 
+#include <QCoreApplication>
+
 //
 // NB: Python requests.
 // General rule for Python requests created by Python-based GUI modules
@@ -64,12 +66,13 @@ PyMODINIT_FUNC INIT_FUNCTION();
 extern "C" {
   SALOME_PYQT_EXPORT CAM_Module* createModule()
   {
-    static bool alreadyInitialized = false;
+    QCoreApplication* app = QCoreApplication::instance();
+    bool alreadyInitialized = app && app->property( "salome_pyqt_gui_light_initialized" ).toBool();
 
     if ( !alreadyInitialized ) {
       PyLockWrapper lck; // GIL acquisition
       INIT_FUNCTION();
-      alreadyInitialized = !alreadyInitialized;
+      if ( app ) app->setProperty( "salome_pyqt_gui_light_initialized", true );
     }
 
     return new SALOME_PYQT_Module();
index 2fb54675d69b6b39394cb646090d13a09af67a7e..da7043dbd9a0e06e657a0bfbea63f61b999dcc4a 100644 (file)
@@ -35,6 +35,8 @@
 #include <Container_init_python.hxx>
 #endif
 
+#include <QCoreApplication>
+
 // Py_ssize_t for old Pythons
 // This code is as recommended by"
 // http://www.python.org/dev/peps/pep-0353/#conversion-guidelines
@@ -80,13 +82,14 @@ extern "C"
 {
   SALOME_PYQT_LIGHT_EXPORT CAM_Module* createModule() 
   {
-    static bool alreadyInitialized = false;
+    QCoreApplication* app = QCoreApplication::instance();
+    bool alreadyInitialized = app && app->property( "salome_pyqt_gui_light_initialized" ).toBool();
 
     // make initialization only once (see comment above) !
     if ( !alreadyInitialized ) {
       PyLockWrapper lck; // GIL acquisition
       INIT_FUNCTION();
-      alreadyInitialized = !alreadyInitialized;
+      if ( app ) app->setProperty( "salome_pyqt_gui_light_initialized", true );
     }
 
     return new SALOME_PYQT_ModuleLight();
index 1b51a036b470601ac3605433141db97c4752fe19..504bd14d8fcee83c2ec1080baa617f3010cd8a37 100644 (file)
@@ -34,5 +34,6 @@ void SUIT_PYTHON::init_python(int argc, char **argv)
   Py_Initialize(); // Initialize the interpreter
   PySys_SetArgv(argc, argv);
   PyEval_InitThreads(); // Create (and acquire) the interpreter lock - can be called many times
+  SUIT_PYTHON::initialized = true;
 }
 
index 6bab8edef41dccea24b5996745aa9f23cbd1a46d..4182bfcb145eb352d8fe696b0e722b86999e625a 100644 (file)
@@ -320,12 +320,13 @@ void SalomeApp_Application::createActions()
                 tr( "MEN_DESK_REGISTRY_DISPLAY" ), tr( "PRP_DESK_REGISTRY_DISPLAY" ),
                 /*Qt::SHIFT+Qt::Key_D*/0, desk, false, this, SLOT( onRegDisplay() ) );
 
-  //SRN: BugID IPAL9021, add an action "Load"
-  createAction( FileLoadId, tr( "TOT_DESK_FILE_LOAD" ),
-                resourceMgr()->loadPixmap( "STD", tr( "ICON_FILE_OPEN" ) ),
-                tr( "MEN_DESK_FILE_LOAD" ), tr( "PRP_DESK_FILE_LOAD" ),
-                Qt::CTRL+Qt::Key_L, desk, false, this, SLOT( onLoadDoc() ) );
-  //SRN: BugID IPAL9021: End
+  //rnv commented : implementation of the mono-study in GUI
+  //
+  //createAction( FileLoadId, tr( "TOT_DESK_FILE_LOAD" ),
+  //              resourceMgr()->loadPixmap( "STD", tr( "ICON_FILE_OPEN" ) ),
+  //              tr( "MEN_DESK_FILE_LOAD" ), tr( "PRP_DESK_FILE_LOAD" ),
+  //              Qt::CTRL+Qt::Key_L, desk, false, this, SLOT( onLoadDoc() ) );
+
 
 #ifdef WITH_SIMANIO
   if (myIsSiman) {
@@ -345,7 +346,7 @@ void SalomeApp_Application::createActions()
   // creation of menu item is moved to VISU
   //  createMenu( SaveGUIStateId, fileMenu, 10, -1 );
 
-  createMenu( FileLoadId,   fileMenu, 0 );  //SRN: BugID IPAL9021, add a menu item "Load"
+  // createMenu( FileLoadId,   fileMenu, 0 );
 
 #ifdef WITH_SIMANIO
   if (myIsSiman) {
@@ -423,6 +424,11 @@ void SalomeApp_Application::onLoadDoc()
 
   std::vector<std::string> List = studyMgr()->GetOpenStudies();
 
+  // rnv: According to the single-study approach on the server side
+  //      can be only one study. So if it is exists connect to them,  
+  //      overwise show warning message: "No active study on the server"
+
+  /*
   SUIT_Session* aSession = SUIT_Session::session();
   QList<SUIT_Application*> aAppList = aSession->applications();
 
@@ -444,10 +450,19 @@ void SalomeApp_Application::onLoadDoc()
      if ( !isAlreadyOpen )
        unloadedStudies << studyName;
   }
-
   studyName = SalomeApp_LoadStudiesDlg::selectStudy( desktop(), unloadedStudies );
   if ( studyName.isEmpty() )
     return;
+  */
+
+  if(List.size() <= 0) {
+    SUIT_MessageBox::warning( desktop(),
+                              QObject::tr("WRN_WARNING"),
+                              QObject::tr("WRN_NO_STUDY_ON SERV") );
+    return;
+  }
+  
+  studyName = List[0].c_str();
 
 #ifndef WIN32
   // this code replaces marker of windows drive and path become invalid therefore
@@ -1138,15 +1153,16 @@ int SalomeApp_Application::closeChoice( const QString& docName )
 {
   int answer = SUIT_MessageBox::question( desktop(), tr( "APPCLOSE_CAPTION" ), tr( "APPCLOSE_DESCRIPTION" ).arg( docName ),
                                           tr ("APPCLOSE_SAVE"), tr ("APPCLOSE_CLOSE"),
-                                          tr ("APPCLOSE_UNLOAD"), tr ("APPCLOSE_CANCEL"), 0 );
+                                         //tr ("APPCLOSE_UNLOAD"), 
+                                         tr ("APPCLOSE_CANCEL"), 0 );
 
   int res = CloseCancel;
   if ( answer == 0 )
     res = CloseSave;
   else if ( answer == 1 )
     res = CloseDiscard;
-  else if ( answer == 2 )
-    res = CloseUnload;
+  // else if ( answer == 2 )
+  //   res = CloseUnload;
 
   return res;
 }
@@ -1249,7 +1265,10 @@ bool SalomeApp_Application::openAction( const int aChoice, const QString& aName
 QMap<int, QString> SalomeApp_Application::activateModuleActions() const
 {
   QMap<int, QString> opmap = LightApp_Application::activateModuleActions();
-  opmap.insert( LoadStudyId,     tr( "ACTIVATE_MODULE_OP_LOAD" ) );
+
+  // rnv commented : implementation of the mono-study in GUI
+  // opmap.insert( LoadStudyId,     tr( "ACTIVATE_MODULE_OP_LOAD" ) );
+
   opmap.insert( NewAndScriptId,  tr( "ACTIVATE_MODULE_OP_SCRIPT" ) );
   return opmap;
 }
@@ -1564,10 +1583,10 @@ void SalomeApp_Application::onStudyCreated( SUIT_Study* study )
 {
   LightApp_Application::onStudyCreated( study );
 
-#ifndef DISABLE_PYCONSOLE
-  desktop()->tabifyDockWidget( windowDock( getWindow( WT_NoteBook ) ),
-                               windowDock( getWindow( WT_ObjectBrowser ) ) );
-#endif
+//#ifndef DISABLE_PYCONSOLE
+//  desktop()->tabifyDockWidget( windowDock( getWindow( WT_NoteBook ) ),
+//                               windowDock( getWindow( WT_ObjectBrowser ) ) );
+//#endif
 
   loadDockWindowsState();
 
@@ -1579,10 +1598,10 @@ void SalomeApp_Application::onStudyOpened( SUIT_Study* study )
 {
   LightApp_Application::onStudyOpened( study );
 
-#ifndef DISABLE_PYCONSOLE
-  desktop()->tabifyDockWidget( windowDock( getWindow( WT_NoteBook ) ),
-                               windowDock( getWindow( WT_ObjectBrowser ) ) );
-#endif
+//#ifndef DISABLE_PYCONSOLE
+//  desktop()->tabifyDockWidget( windowDock( getWindow( WT_NoteBook ) ),
+//                               windowDock( getWindow( WT_ObjectBrowser ) ) );
+//#endif
 
   loadDockWindowsState();
 
@@ -2025,3 +2044,49 @@ void SalomeApp_Application::afterCloseDoc()
 #endif
   LightApp_Application::afterCloseDoc();
 }
+
+/*
+  Asks to close existing document.
+*/
+bool SalomeApp_Application::checkExistingDoc() {
+  bool result = true;
+  if( activeStudy() ) {
+    int answer = SUIT_MessageBox::question( desktop(), 
+                                           tr( "APPCLOSE_CAPTION" ), 
+                                           tr( "STUDYCLOSE_DESCRIPTION" ),
+                                           tr( "APPCLOSE_SAVE" ), 
+                                           tr( "APPCLOSE_CLOSE" ),
+                                           tr( "APPCLOSE_CANCEL" ), 0 );
+    if(answer == 0) {
+      if ( activeStudy()->isSaved() ) {
+       onSaveDoc();
+       closeDoc( false );
+      } else if ( onSaveAsDoc() ) {
+       if( !closeDoc( false ) ) {
+         result = false;
+       }
+      } else {
+       result = false;
+      }        
+    }
+    else if( answer == 1 ) {
+      closeDoc( false );
+    } else if( answer == 2 ) {
+      result = false;
+    }
+  } else {
+    SALOMEDSClient_StudyManager* aMgr = studyMgr();
+    if( aMgr ) {
+      std::vector<std::string> List = studyMgr()->GetOpenStudies();
+      if( List.size() > 0 ) {
+        int answer = SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "QUE_ACTIVEDOC_LOAD" ),
+                                                SUIT_MessageBox::Yes | SUIT_MessageBox::No, SUIT_MessageBox::No );
+        if ( answer == SUIT_MessageBox::Yes ) {
+         onLoadDoc();
+       }
+       result = false;
+      }
+    }
+  }
+  return result;
+}
index c715722bb4287cdb1887ded5d7ef81995dfa1098..5d999d1a9135e8fb063d7929021e4e9880fe34c8 100644 (file)
@@ -96,6 +96,8 @@ public:
   virtual bool                        checkDataObject(LightApp_DataObject* theObj);
 
   virtual void                        setDesktop( SUIT_Desktop* );
+  
+  virtual bool                        checkExistingDoc();
 
   static CORBA::ORB_var               orb();
   static SALOMEDSClient_StudyManager* studyMgr();
index d663c6ecb9e514d68e164b275ba383b08751f434..16e1ae5b53a3f6aa8348641c46e91874daaa5f64 100644 (file)
@@ -12,10 +12,26 @@ Python file must include only letters, digits and underscores and start from let
         <source>WRN_FILE_NOT_EXIST</source>
         <translation>The file %1 does not exist.</translation>
     </message>
+    <message>
+        <source>QUE_ACTIVEDOC_LOAD</source>
+        <translation>There is an active study in the session.
+Do you want to load it?
+</translation>
+    </message>
+    <message>
+        <source>STUDYCLOSE_DESCRIPTION</source>
+        <translation>You should close an existing study before.
+Do you want to close it?
+</translation>
+    </message>
     <message>
         <source>WRN_STUDY_LOCKED</source>
         <translation>Study is locked.</translation>
     </message>
+    <message>
+        <source>WRN_NO_STUDY_ON SERV</source>
+        <translation>No active study in this session.</translation>
+    </message>
     <message>
         <source>CLOSE_LOCKED_STUDY</source>
         <translation>Close locked study?</translation>
@@ -216,7 +232,7 @@ Do you want to reload it ?</translation>
     </message>
     <message>
         <source>APPCLOSE_DESCRIPTION</source>
-        <translation>Do you want to close or unload study before closing?</translation>
+        <translation>Do you want to save study before closing?</translation>
     </message>
     <message>
         <source>PRP_DESK_PROPERTIES</source>