Salome HOME
updated copyright message
[modules/gui.git] / src / PVViewer / PVViewer_ViewManager.cxx
1 // Copyright (C) 2014-2023  CEA, EDF, OPEN CASCADE
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19 // Author: Adrien Bruneton (CEA)
20
21 #include "PVViewer_ViewManager.h"
22 #include "PVViewer_ViewWindow.h"
23 #include "PVViewer_ViewModel.h"
24 #include "PVViewer_GUIElements.h"
25 #include "PVViewer_Core.h"
26 #include "PVViewer_InitSingleton.h"
27 #include "PVServer_ServiceWrapper.h"
28
29 #include <utilities.h>
30
31 #include "SUIT_Desktop.h"
32 #include "SUIT_Study.h"
33 #include "SUIT_Session.h"
34 #include "SUIT_MessageBox.h"
35 #include "SUIT_ResourceMgr.h"
36
37 #include <pqServer.h>
38 #include <pqServerConnectReaction.h>
39 #include <pqActiveObjects.h>
40
41 /*!
42   Constructor
43 */
44 PVViewer_ViewManager::PVViewer_ViewManager(SUIT_Study* study, SUIT_Desktop* desktop)
45 : SUIT_ViewManager( study, desktop, new PVViewer_Viewer() )
46 {
47   MESSAGE("PVViewer - view manager created ...");
48   setTitle( tr( "PARAVIEW_VIEW_TITLE" ) );
49
50   // Initialize minimal paraview stuff (if not already done)
51   PVViewer_InitSingleton::Init(desktop);
52
53   connect( desktop, SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
54            this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ) );
55 }
56
57 PVServer_ServiceWrapper * PVViewer_ViewManager::GetService()
58 {
59   return PVServer_ServiceWrapper::GetInstance();
60 }
61
62 QString PVViewer_ViewManager::GetPVConfigPath()
63 {
64   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
65   return resMgr->stringValue("resources", "PVViewer", QString());
66 }
67
68 bool PVViewer_ViewManager::ConnectToExternalPVServer(QMainWindow* desktop)
69 {
70   SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
71   bool noConnect = aResourceMgr->booleanValue( "PARAVIS", "no_ext_pv_server", false );
72   if (noConnect)
73     return true;
74
75   pqServer* server = pqActiveObjects::instance().activeServer();
76   if (server && server->isRemote())
77   {
78     // Already connected to an external server, do nothing
79     MESSAGE("connectToExternalPVServer(): Already connected to an external PVServer, won't reconnect.");
80     return false;
81   }
82
83   if (GetService()->GetGUIConnected())
84   {
85     // Should never be there as the above should already tell us that we are connected.
86     std::stringstream msg2;
87     msg2 << "Internal error while connecting to the pvserver.";
88     msg2 << "ParaView doesn't see a connection, but PARAVIS engine tells us there is already one!" << std::endl;
89     qWarning(msg2.str().c_str());  // will go to the ParaView console (see ParavisMessageOutput below)
90     SUIT_MessageBox::warning( desktop,
91                               QString("Error connecting to PVServer"), QString(msg2.str().c_str()));
92     return false;
93   }
94
95   std::stringstream msg;
96
97   // Try to connect to the external PVServer - gives priority to an externally specified URL:
98   QString serverUrlEnv = Qtx::getenv("PARAVIEW_PVSERVER_URL");
99   std::string serverUrl;
100   if (!serverUrlEnv.isEmpty())
101   {
102     serverUrl = serverUrlEnv.toStdString();
103   }
104   else
105   {
106     // Get the URL from the engine (possibly starting the pvserver)
107     serverUrl = GetService()->FindOrStartPVServer(0);  // take the first free port
108   }
109   
110   msg << "connectToExternalPVServer(): Trying to connect to the external PVServer '" << serverUrl << "' ...";
111   MESSAGE(msg.str());
112
113   if (!pqServerConnectReaction::connectToServer(pqServerResource(serverUrl.c_str())))
114   {
115     std::stringstream msg2;
116     msg2 << "Error while connecting to the requested pvserver '" << serverUrl;
117     msg2 << "'. Might use default built-in connection instead!" << std::endl;
118     qWarning(msg2.str().c_str());  // will go to the ParaView console (see ParavisMessageOutput below)
119     SUIT_MessageBox::warning( desktop,
120                               QString("Error connecting to PVServer"), QString(msg2.str().c_str()));
121     return false;
122   }
123   else
124   {
125     MESSAGE("connectToExternalPVServer(): Connected!");
126     GetService()->SetGUIConnected(true);
127   }
128   return true;
129 }
130
131 /*!Enable toolbars if view \a view is ParaView viewer and disable otherwise.
132 */
133 void PVViewer_ViewManager::onWindowActivated(SUIT_ViewWindow* view)
134 {
135   if (view)
136   {
137     PVViewer_ViewWindow* pvWindow = dynamic_cast<PVViewer_ViewWindow*>(view);
138     PVViewer_GUIElements * guiElements = PVViewer_GUIElements::GetInstance( myDesktop );
139     guiElements->setToolBarEnabled(pvWindow!=0);
140   }
141 }