X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Workshop.cpp;h=60bad111dbc77e1b051e2f6df8c41965a11821cc;hb=3ccd62a2eedaf895c689d77ab4bfc698a592870e;hp=810e0344bc6b142ab5291c0556332c6f361afd20;hpb=43a3d2ddc3f899b5e1dcb36abd786148a0316814;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Workshop.cpp b/src/XGUI/XGUI_Workshop.cpp index 810e0344b..60bad111d 100644 --- a/src/XGUI/XGUI_Workshop.cpp +++ b/src/XGUI/XGUI_Workshop.cpp @@ -1,12 +1,45 @@ -#include "XGUI_Workshop.h" -#include "XGUI_MainWindow.h" -#include "XGUI_MainMenu.h" +#include "XGUI_Module.h" +#include "XGUI_Constants.h" #include "XGUI_Command.h" +#include "XGUI_MainMenu.h" +#include "XGUI_MainWindow.h" +#include "XGUI_MenuGroupPanel.h" #include "XGUI_Tools.h" +#include "XGUI_Workbench.h" +#include "XGUI_Workshop.h" +#include "XGUI_Viewer.h" +#include "ModuleBase_WidgetFactory.h" +#include "XGUI_SelectionMgr.h" +#include "XGUI_ObjectsBrowser.h" +#include "XGUI_Displayer.h" +#include "XGUI_OperationMgr.h" +#include "XGUI_SalomeConnector.h" +#include "XGUI_ActionsMgr.h" +#include "XGUI_ErrorDialog.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include #include #include #include +#include +#include +#include +#include + +#ifdef _DEBUG +#include +#endif #ifdef WIN32 #include @@ -14,11 +47,31 @@ #include #endif - -XGUI_Workshop::XGUI_Workshop() : - QObject() +XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) + : QObject(), + myCurrentFile(QString()), + myPartSetModule(NULL), + mySalomeConnector(theConnector), + myPropertyPanelDock(0), + myObjectBrowser(0), + myDisplayer(0) { - myMainWindow = new XGUI_MainWindow(); + myMainWindow = mySalomeConnector? 0 : new XGUI_MainWindow(); + + // In SALOME viewer is accessible only when module is initialized + // and in SALOME mode myDisplayer object has to be created later + // So, displayer will be created on demand. + + mySelector = new XGUI_SelectionMgr(this); + connect(mySelector, SIGNAL(selectionChanged()), this, SLOT(changeCurrentDocument())); + myOperationMgr = new XGUI_OperationMgr(this); + myActionsMgr = new XGUI_ActionsMgr(this); + myErrorDlg = new XGUI_ErrorDialog(myMainWindow); + + connect(myOperationMgr, SIGNAL(operationStarted()), this, SLOT(onOperationStarted())); + connect(myOperationMgr, SIGNAL(operationStopped(ModuleBase_Operation*)), + this, SLOT(onOperationStopped(ModuleBase_Operation*))); + connect(this, SIGNAL(errorOccurred(const QString&)), myErrorDlg, SLOT(addError(const QString&))); } //****************************************************** @@ -29,154 +82,386 @@ XGUI_Workshop::~XGUI_Workshop(void) //****************************************************** void XGUI_Workshop::startApplication() { - initMenu(); - activateModule(); + initMenu(); + //Initialize event listening + Events_Loop* aLoop = Events_Loop::loop(); + aLoop->registerListener(this, Events_Error::errorID()); //!< Listening application errors. + //TODO(sbh): Implement static method to extract event id [SEID] + Events_ID aFeatureId = aLoop->eventByName("FeatureEvent"); + aLoop->registerListener(this, aFeatureId); + Events_ID aPartSetId = aLoop->eventByName("PartSetModuleEvent"); + aLoop->registerListener(this, aPartSetId); + activateModule(); + if (myMainWindow) { myMainWindow->show(); + updateCommandStatus(); + } + onNew(); + // Testing of document creation + //boost::shared_ptr aMgr = ModelAPI_PluginManager::get(); + //boost::shared_ptr aPoint1 = aMgr->rootDocument()->addFeature("Point"); + //boost::shared_ptr aPart = aMgr->rootDocument()->addFeature("Part"); + //aPart->execute(); + //aMgr->setCurrentDocument(aPart->data()->docRef("PartDocument")->value()); + //boost::shared_ptr aPoint2 = aMgr->rootDocument()->addFeature("Point"); + //aPoint2 = aMgr->rootDocument()->addFeature("Point"); + + //aPart = aMgr->rootDocument()->addFeature("Part"); + //aPart->execute(); } //****************************************************** void XGUI_Workshop::initMenu() { - int aPageId = addWorkbench(tr("HOME_MENU_TITLE")); - - // File commands group - int aGroupId = addGroup(aPageId); - - XGUI_Command* aCommand; + if (isSalomeMode()) { + // Create only Undo, Redo commands + salomeConnector()->addEditCommand("UNDO_CMD", + tr("Undo"), tr("Undo last command"), + QIcon(":pictures/undo.png"), + false, this, SLOT(onUndo()), + QKeySequence::Undo); + salomeConnector()->addEditCommand("REDO_CMD", + tr("Redo"), tr("Redo last command"), + QIcon(":pictures/redo.png"), + false, this, SLOT(onRedo()), + QKeySequence::Redo); + salomeConnector()->addEditMenuSeparator(); + return; + } + XGUI_Workbench* aPage = myMainWindow->menuObject()->generalPage(); - //aCommand = createMenuCommand(aPageId, aGroupId, NEW_CMD, tr("NEW_MENU"), tr("NEW_MENU_TIP"), - // QIcon(":pictures/new.png"), QKeySequence::New); - //connect(aCommand, SIGNAL(triggered()), this, SLOT(onNew())); + // File commands group + XGUI_MenuGroupPanel* aGroup = aPage->addGroup("Default"); - //aCommand = createMenuCommand(aPageId, aGroupId, OPEN_CMD, tr("OPEN_MENU"), tr("OPEN_MENU_TIP"), - // QIcon(":pictures/open.png"), QKeySequence::Open); - //connect(aCommand, SIGNAL(triggered()), this, SLOT(onOpen())); + XGUI_Command* aCommand; - aCommand = createMenuCommand(aPageId, aGroupId, SAVE_CMD, tr("SAVE_MENU"), tr("SAVE_MENU_TIP"), - QIcon(":pictures/save.png"), QKeySequence::Save); - connect(aCommand, SIGNAL(triggered()), this, SLOT(onSave())); - aCommand->setEnabled(false); + aCommand = aGroup->addFeature("SAVE_CMD", tr("Save..."), tr("Save the document"), + QIcon(":pictures/save.png"), QKeySequence::Save); + aCommand->connectTo(this, SLOT(onSave())); + //aCommand->disable(); - aCommand = createMenuCommand(aPageId, aGroupId, SAVEAS_CMD, tr("SAVEAS_MENU"), tr("SAVEAS_MENU_TIP"), - QIcon(":pictures/save.png")); - connect(aCommand, SIGNAL(triggered()), this, SLOT(onSaveAs())); - aCommand->setEnabled(false); + aCommand = aGroup->addFeature("UNDO_CMD", tr("Undo"), tr("Undo last command"), + QIcon(":pictures/undo.png"), QKeySequence::Undo); + aCommand->connectTo(this, SLOT(onUndo())); + aCommand = aGroup->addFeature("REDO_CMD", tr("Redo"), tr("Redo last command"), + QIcon(":pictures/redo.png"), QKeySequence::Redo); + aCommand->connectTo(this, SLOT(onRedo())); - // Edit commands group - //aGroupId = addGroup(aPageId); + aCommand = aGroup->addFeature("REBUILD_CMD", tr("Rebuild"), tr("Rebuild data objects"), + QIcon(":pictures/rebuild.png")); - aCommand = createMenuCommand(aPageId, aGroupId, UNDO_CMD, tr("UNDO_MENU"), tr("UNDO_MENU_TIP"), - QIcon(":pictures/undo.png"), QKeySequence::Undo); + aCommand = aGroup->addFeature("SAVEAS_CMD", tr("Save as..."), tr("Save the document into a file"), + QIcon(":pictures/save.png")); + aCommand->connectTo(this, SLOT(onSaveAs())); + //aCommand->disable(); - aCommand = createMenuCommand(aPageId, aGroupId, REDO_CMD, tr("REDO_MENU"), tr("REDO_MENU_TIP"), - QIcon(":pictures/redo.png"), QKeySequence::Redo); + aCommand = aGroup->addFeature("OPEN_CMD", tr("Open..."), tr("Open a new document"), + QIcon(":pictures/open.png"), QKeySequence::Open); + aCommand->connectTo(this, SLOT(onOpen())); - //aCommand = createMenuCommand(aPageId, aGroupId, CUT_CMD, tr("CUT_MENU"), tr("CUT_MENU_TIP"), - // QIcon(":pictures/cut.png"), QKeySequence::Cut); + //aCommand = aGroup->addFeature("NEW_CMD", tr("New"), tr("Create a new document"), + // QIcon(":pictures/new.png"), QKeySequence::New); + //aCommand->connectTo(this, SLOT(onNew())); - //aCommand = createMenuCommand(aPageId, aGroupId, COPY_CMD, tr("COPY_MENU"), tr("COPY_MENU_TIP"), - // QIcon(":pictures/copy.png"), QKeySequence::Copy); + aCommand = aGroup->addFeature("EXIT_CMD", tr("Exit"), tr("Exit application"), + QIcon(":pictures/close.png"), QKeySequence::Close); + aCommand->connectTo(this, SLOT(onExit())); - //aCommand = createMenuCommand(aPageId, aGroupId, PASTE_CMD, tr("PASTE_MENU"), tr("PASTE_MENU_TIP"), - // QIcon(":pictures/paste.png"), QKeySequence::Paste); +} - aCommand = createMenuCommand(aPageId, aGroupId, EXIT_CMD, tr("EXIT_MENU"), tr("EXIT_MENU_TIP"), - QIcon(":pictures/close.png"), QKeySequence::Close); - connect(aCommand, SIGNAL(triggered()), this, SLOT(onExit())); +//****************************************************** +XGUI_Workbench* XGUI_Workshop::addWorkbench(const QString& theName) +{ + XGUI_MainMenu* aMenuBar = myMainWindow->menuObject(); + return aMenuBar->addWorkbench(theName); +} - // Tests - //aPageId = addWorkbench("Primitives"); - //aGroupId = addGroup(aPageId); - // - //aCommand = createMenuCommand(aPageId, aGroupId, LAST_CMD, "Box", "Create Box", QIcon(":pictures/box.png")); - //aCommand = createMenuCommand(aPageId, aGroupId, LAST_CMD, "Cylinder", "Create Cylinder", QIcon(":pictures/cylinder.png")); - //aCommand = createMenuCommand(aPageId, aGroupId, LAST_CMD, "Disk", "Create Disk", QIcon(":pictures/disk.png")); - //aCommand = createMenuCommand(aPageId, aGroupId, LAST_CMD, "Torus", "Create Torus", QIcon(":pictures/torus.png")); +//****************************************************** +void XGUI_Workshop::processEvent(const Events_Message* theMessage) +{ + static Events_ID aFeatureId = Events_Loop::loop()->eventByName("FeatureEvent"); + if (theMessage->eventID() == aFeatureId) { + const Config_FeatureMessage* aFeatureMsg = dynamic_cast(theMessage); + addFeature(aFeatureMsg); + return; + } + const Config_PointerMessage* aPartSetMsg = dynamic_cast(theMessage); + if (aPartSetMsg) { + ModuleBase_PropPanelOperation* anOperation = + (ModuleBase_PropPanelOperation*)(aPartSetMsg->pointer()); + + if (myOperationMgr->startOperation(anOperation)) { + if (anOperation->xmlRepresentation().isEmpty()) { + anOperation->commit(); + updateCommandStatus(); + } + } + return; + } + const Events_Error* anAppError = dynamic_cast(theMessage); + if (anAppError) { + emit errorOccurred(QString::fromLatin1(anAppError->description())); + myErrorDlg->show(); + myErrorDlg->raise(); + myErrorDlg->activateWindow(); + } - //aPageId = addWorkbench("Operations"); +#ifdef _DEBUG + qDebug() << "XGUI_Workshop::ProcessEvent: " + << "Catch message, but it can not be processed."; +#endif } //****************************************************** -XGUI_Command* XGUI_Workshop::createMenuCommand(int thePageId, int theGroupId, XCommandId theCmdId, - const QString& theTitle, const QString& theTip, - const QIcon& theIcon, const QKeySequence& theKeys) +void XGUI_Workshop::onOperationStarted() { - XGUI_Command* aCommand = new XGUI_Command(theIcon, theTitle, this); - aCommand->setToolTip(theTip); - if (!theKeys.isEmpty()) - aCommand->setShortcut(theKeys); - addCommand(theCmdId, thePageId, theGroupId, aCommand); - return aCommand; + ModuleBase_PropPanelOperation* aOperation = + (ModuleBase_PropPanelOperation*)(myOperationMgr->currentOperation()); + + if(!aOperation->xmlRepresentation().isEmpty()) { //!< No need for property panel + connectWithOperation(aOperation); + QWidget* aPropWidget = myPropertyPanelDock->findChild(XGUI::PROP_PANEL_WDG); + qDeleteAll(aPropWidget->children()); + + showPropertyPanel(); + + ModuleBase_WidgetFactory aFactory = ModuleBase_WidgetFactory(aOperation); + aFactory.createWidget(aPropWidget); + setPropertyPannelTitle(aOperation->description()); + } } //****************************************************** -int XGUI_Workshop::addWorkbench(const QString& theName) +void XGUI_Workshop::onOperationStopped(ModuleBase_Operation* theOperation) { - XGUI_MainMenu* aMenuBar = myMainWindow->menuObject(); - return aMenuBar->addWorkbench(theName); + ModuleBase_PropPanelOperation* aOperation = + (ModuleBase_PropPanelOperation*)(myOperationMgr->currentOperation()); + + if(aOperation->xmlRepresentation().isEmpty()) { //!< No need for property panel + updateCommandStatus(); + } else { + hidePropertyPanel(); + updateCommandStatus(); + + if (myMainWindow) { + myActionsMgr->restoreCommandState(); + } + } } -//****************************************************** -int XGUI_Workshop::addGroup(int thePageId) +/* + * + */ +void XGUI_Workshop::addFeature(const Config_FeatureMessage* theMessage) { + if (!theMessage) { +#ifdef _DEBUG + qDebug() << "XGUI_Workshop::addFeature: NULL message."; +#endif + return; + } + //Find or create Workbench + QString aWchName = QString::fromStdString(theMessage->workbenchId()); + if (isSalomeMode()) { + salomeConnector()->addFeature(aWchName, + QString::fromStdString(theMessage->id()), + QString::fromStdString(theMessage->text()), + QString::fromStdString(theMessage->tooltip()), + QIcon(theMessage->icon().c_str()), + false, this, + SLOT(onFeatureTriggered()), QKeySequence()); + } else { XGUI_MainMenu* aMenuBar = myMainWindow->menuObject(); - return aMenuBar->addGroup(thePageId); + XGUI_Workbench* aPage = aMenuBar->findWorkbench(aWchName); + if (!aPage) { + aPage = addWorkbench(aWchName); + } + //Find or create Group + QString aGroupName = QString::fromStdString(theMessage->groupId()); + XGUI_MenuGroupPanel* aGroup = aPage->findGroup(aGroupName); + if (!aGroup) { + aGroup = aPage->addGroup(aGroupName); + } + bool isUsePropPanel = theMessage->isUseInput(); + //Create feature... + XGUI_Command* aCommand = aGroup->addFeature(QString::fromStdString(theMessage->id()), + QString::fromStdString(theMessage->text()), + QString::fromStdString(theMessage->tooltip()), + QIcon(theMessage->icon().c_str()), + QKeySequence(), isUsePropPanel); + QString aNestedFeatures = QString::fromStdString(theMessage->nestedFeatures()); + aCommand->setUnblockableCommands(aNestedFeatures.split(" ")); + myActionsMgr->addCommand(aCommand); + myPartSetModule->featureCreated(aCommand); + } } -//****************************************************** -void XGUI_Workshop::addCommand(XCommandId theCommandId, int thePageId, int theGroupId, XGUI_Command* theCommand) +/* + * Makes a signal/slot connections between Property Panel + * and given operation. The given operation becomes a + * current operation and previous operation if exists + */ +void XGUI_Workshop::connectWithOperation(ModuleBase_Operation* theOperation) { - XGUI_MainMenu* aMenuBar = myMainWindow->menuObject(); - aMenuBar->addCommand(thePageId, theGroupId, theCommand); - myCommands[theCommandId] = theCommand; + QPushButton* aOkBtn = myPropertyPanelDock->findChild(XGUI::PROP_PANEL_OK); + connect(aOkBtn, SIGNAL(clicked()), theOperation, SLOT(commit())); + QPushButton* aCancelBtn = myPropertyPanelDock->findChild(XGUI::PROP_PANEL_CANCEL); + connect(aCancelBtn, SIGNAL(clicked()), theOperation, SLOT(abort())); + + QAction* aCommand = 0; + if (isSalomeMode()) { + aCommand = salomeConnector()->command(theOperation->operationId()); + } else { + XGUI_MainMenu* aMenu = myMainWindow->menuObject(); + aCommand = aMenu->feature(theOperation->operationId()); + } + //Abort operation on uncheck the command + connect(aCommand, SIGNAL(triggered(bool)), theOperation, SLOT(setRunning(bool))); } -//****************************************************** -XGUI_Command* XGUI_Workshop::command(XCommandId theId) const +/* + * Saves document with given name. + */ +void XGUI_Workshop::saveDocument(QString theName) { - if (myCommands.contains(theId)) - return myCommands[theId]; - return 0; + QApplication::restoreOverrideCursor(); + boost::shared_ptr aMgr = ModelAPI_PluginManager::get(); + boost::shared_ptr aDoc = aMgr->rootDocument(); + aDoc->save(theName.toLatin1().constData()); + QApplication::restoreOverrideCursor(); } //****************************************************** void XGUI_Workshop::onExit() { - qApp->exit(); + boost::shared_ptr aMgr = ModelAPI_PluginManager::get(); + boost::shared_ptr aDoc = aMgr->rootDocument(); + if(aDoc->isModified()) { + int anAnswer = QMessageBox::question( + myMainWindow, tr("Save current file"), + tr("The document is modified, save before exit?"), + QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Cancel); + if(anAnswer == QMessageBox::Save) { + onSave(); + } else if (anAnswer == QMessageBox::Cancel) { + return; + } + } + qApp->exit(); } //****************************************************** void XGUI_Workshop::onNew() { - myMainWindow->showObjectBrowser(); + QApplication::setOverrideCursor(Qt::WaitCursor); + if (objectBrowser() == 0) { + createDockWidgets(); + mySelector->connectViewers(); + } + showObjectBrowser(); + if (!isSalomeMode()) { + myMainWindow->showPythonConsole(); + QMdiSubWindow* aWnd = myMainWindow->viewer()->createView(); + aWnd->showMaximized(); + updateCommandStatus(); + } + QApplication::restoreOverrideCursor(); } //****************************************************** void XGUI_Workshop::onOpen() { - QString aFileName = QFileDialog::getOpenFileName(mainWindow()); + //save current file before close if modified + boost::shared_ptr aMgr = ModelAPI_PluginManager::get(); + boost::shared_ptr aDoc = aMgr->rootDocument(); + if(aDoc->isModified()) { + //TODO(sbh): re-launch the app? + int anAnswer = QMessageBox::question( + myMainWindow, tr("Save current file"), + tr("The document is modified, save before opening another?"), + QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Cancel); + if(anAnswer == QMessageBox::Save) { + onSave(); + } else if (anAnswer == QMessageBox::Cancel) { + return; + } + aDoc->close(); + myCurrentFile = ""; + } + + //show file dialog, check if readable and open + myCurrentFile = QFileDialog::getOpenFileName(mainWindow()); + if(myCurrentFile.isEmpty()) + return; + QFileInfo aFileInfo(myCurrentFile); + if(!aFileInfo.exists() || !aFileInfo.isReadable()) { + QMessageBox::critical(myMainWindow, tr("Warning"), tr("Unable to open the file.")); + myCurrentFile = ""; + return; + } + QApplication::setOverrideCursor(Qt::WaitCursor); + aDoc->load(myCurrentFile.toLatin1().constData()); + QApplication::restoreOverrideCursor(); + updateCommandStatus(); } //****************************************************** void XGUI_Workshop::onSave() { + if(myCurrentFile.isEmpty()) { + onSaveAs(); + return; + } + saveDocument(myCurrentFile); + updateCommandStatus(); } //****************************************************** void XGUI_Workshop::onSaveAs() { - QString aFileName = QFileDialog::getSaveFileName(mainWindow()); + QString aTemp = myCurrentFile; + myCurrentFile = QFileDialog::getSaveFileName(mainWindow()); + if(myCurrentFile.isEmpty()) { + myCurrentFile = aTemp; + return; + } + QFileInfo aFileInfo(myCurrentFile); + if(aFileInfo.exists() && !aFileInfo.isWritable()) { + QMessageBox::critical(myMainWindow, tr("Warning"), tr("Unable to save the file.")); + return; + } + onSave(); } //****************************************************** -IModule* XGUI_Workshop::loadModule(const QString& theModule) +void XGUI_Workshop::onUndo() { - QString libName = library( theModule ); - if ( libName.isEmpty() ) - { - qWarning( qPrintable( tr( "Information about module \"%1\" doesn't exist." ).arg( theModule ) ) ); + objectBrowser()->setCurrentIndex(QModelIndex()); + boost::shared_ptr aMgr = ModelAPI_PluginManager::get(); + boost::shared_ptr aDoc = aMgr->rootDocument(); + aDoc->undo(); + updateCommandStatus(); +} + +//****************************************************** +void XGUI_Workshop::onRedo() +{ + objectBrowser()->setCurrentIndex(QModelIndex()); + boost::shared_ptr aMgr = ModelAPI_PluginManager::get(); + boost::shared_ptr aDoc = aMgr->rootDocument(); + aDoc->redo(); + updateCommandStatus(); +} + +//****************************************************** +XGUI_Module* XGUI_Workshop::loadModule(const QString& theModule) +{ + QString libName = library(theModule); + if (libName.isEmpty()) { + qWarning( + qPrintable( tr( "Information about module \"%1\" doesn't exist." ).arg( theModule ) )); return 0; } @@ -185,48 +470,47 @@ IModule* XGUI_Workshop::loadModule(const QString& theModule) #ifdef WIN32 - HINSTANCE modLib = ::LoadLibrary( (LPTSTR) qPrintable(libName) ); - if ( !modLib ) - { + HINSTANCE modLib = ::LoadLibrary((LPTSTR) qPrintable(libName)); + if (!modLib) { LPVOID lpMsgBuf; - ::FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_IGNORE_INSERTS, 0, ::GetLastError(), 0, (LPTSTR)&lpMsgBuf, 0, 0 ); - QString aMsg((char*)&lpMsgBuf); - err = QString( "Failed to load %1. %2" ).arg( libName ).arg( aMsg ); - ::LocalFree( lpMsgBuf ); - } - else - { - crtInst = (CREATE_FUNC)::GetProcAddress( modLib, CREATE_MODULE ); - if ( !crtInst ) - { + ::FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + 0, ::GetLastError(), 0, (LPTSTR) & lpMsgBuf, 0, 0); + QString aMsg((char*) &lpMsgBuf); + err = QString("Failed to load %1. %2").arg(libName).arg(aMsg); + ::LocalFree(lpMsgBuf); + } else { + crtInst = (CREATE_FUNC) ::GetProcAddress(modLib, CREATE_MODULE); + if (!crtInst) { LPVOID lpMsgBuf; - ::FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_IGNORE_INSERTS, 0, ::GetLastError(), 0, (LPTSTR)&lpMsgBuf, 0, 0 ); - QString aMsg((char*)&lpMsgBuf); - err = QString( "Failed to find %1 function. %2" ).arg( CREATE_MODULE ).arg(aMsg ); - ::LocalFree( lpMsgBuf ); + ::FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM + | FORMAT_MESSAGE_IGNORE_INSERTS, + 0, ::GetLastError(), 0, (LPTSTR) & lpMsgBuf, 0, 0); + QString aMsg((char*) &lpMsgBuf); + err = QString("Failed to find %1 function. %2").arg( CREATE_MODULE).arg(aMsg); + ::LocalFree(lpMsgBuf); } } #else void* modLib = dlopen( libName.toLatin1(), RTLD_LAZY ); if ( !modLib ) - err = QString( "Can not load library %1. %2" ).arg( libName ).arg( dlerror() ); + err = QString( "Can not load library %1. %2" ).arg( libName ).arg( dlerror() ); else { - crtInst = (CREATE_FUNC)dlsym( modLib, GET_MODULE_NAME ); + crtInst = (CREATE_FUNC)dlsym( modLib, CREATE_MODULE ); if ( !crtInst ) - err = QString( "Failed to find function %1. %2" ).arg( CREATE_MODULE ).arg( dlerror() ); + err = QString( "Failed to find function %1. %2" ).arg( CREATE_MODULE ).arg( dlerror() ); } #endif - IModule* aModule = crtInst ? crtInst(this) : 0; + XGUI_Module* aModule = crtInst ? crtInst(this) : 0; - if ( !err.isEmpty() ) { - if ( mainWindow() && mainWindow()->isVisible() ) - QMessageBox::warning( mainWindow(), tr( "Error" ), err ); + if (!err.isEmpty()) { + if (mainWindow() && mainWindow()->isVisible()) + QMessageBox::warning(mainWindow(), tr("Error"), err); else - qWarning( qPrintable( err ) ); + qWarning( qPrintable( err )); } return aModule; } @@ -234,19 +518,200 @@ IModule* XGUI_Workshop::loadModule(const QString& theModule) //****************************************************** bool XGUI_Workshop::activateModule() { - // Test of modules loading - IModule* aModule = loadModule("GeomModule"); - if (!aModule) - return false; - aModule->createFeatures(); - return true; + myPartSetModule = loadModule("PartSet"); + if (!myPartSetModule) + return false; + myPartSetModule->createFeatures(); + return true; +} + +//****************************************************** +void XGUI_Workshop::updateCommandStatus() +{ + if (isSalomeMode()) // TODO: update commands in SALOME + return; + XGUI_MainMenu* aMenuBar = myMainWindow->menuObject(); + + QList aCommands = aMenuBar->features(); + QList::const_iterator aIt; + + boost::shared_ptr aMgr = ModelAPI_PluginManager::get(); + if (aMgr->hasRootDocument()) { + XGUI_Command* aUndoCmd; + XGUI_Command* aRedoCmd; + for (aIt = aCommands.constBegin(); aIt != aCommands.constEnd(); ++aIt) { + if ((*aIt)->id() == "UNDO_CMD") + aUndoCmd = (*aIt); + else if ((*aIt)->id() == "REDO_CMD") + aRedoCmd = (*aIt); + else // Enable all commands + (*aIt)->enable(); + } + boost::shared_ptr aDoc = aMgr->rootDocument(); + aUndoCmd->setEnabled(aDoc->canUndo()); + aRedoCmd->setEnabled(aDoc->canRedo()); + } else { + for (aIt = aCommands.constBegin(); aIt != aCommands.constEnd(); ++aIt) { + if ((*aIt)->id() == "NEW_CMD") + (*aIt)->enable(); + else if ((*aIt)->id() == "EXIT_CMD") + (*aIt)->enable(); + else + (*aIt)->disable(); + } + } +} + +//****************************************************** +QDockWidget* XGUI_Workshop::createObjectBrowser(QWidget* theParent) +{ + QDockWidget* aObjDock = new QDockWidget(theParent); + aObjDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); + aObjDock->setWindowTitle(tr("Object browser")); + myObjectBrowser = new XGUI_ObjectsBrowser(aObjDock); + aObjDock->setWidget(myObjectBrowser); + return aObjDock; +} + +//****************************************************** +QDockWidget* XGUI_Workshop::createPropertyPanel(QWidget* theParent) +{ + QDockWidget* aPropPanel = new QDockWidget(theParent); + aPropPanel->setWindowTitle(tr("Property Panel")); + QAction* aViewAct = aPropPanel->toggleViewAction(); + aPropPanel->setObjectName(XGUI::PROP_PANEL); + + QWidget* aContent = new QWidget(aPropPanel); + QVBoxLayout* aMainLay = new QVBoxLayout(aContent); + aMainLay->setContentsMargins(3, 3, 3, 3); + aPropPanel->setWidget(aContent); + + QFrame* aFrm = new QFrame(aContent); + aFrm->setFrameStyle(QFrame::Sunken); + aFrm->setFrameShape(QFrame::Panel); + QHBoxLayout* aBtnLay = new QHBoxLayout(aFrm); + aBtnLay->setContentsMargins(0, 0, 0, 0); + aMainLay->addWidget(aFrm); + + QPushButton* aBtn = new QPushButton(QIcon(":pictures/button_help.png"), "", aFrm); + aBtn->setFlat(true); + aBtnLay->addWidget(aBtn); + aBtnLay->addStretch(1); + aBtn = new QPushButton(QIcon(":pictures/button_ok.png"), "", aFrm); + aBtn->setObjectName(XGUI::PROP_PANEL_OK); + aBtn->setFlat(true); + aBtnLay->addWidget(aBtn); + aBtn = new QPushButton(QIcon(":pictures/button_cancel.png"), "", aFrm); + aBtn->setObjectName(XGUI::PROP_PANEL_CANCEL); + aBtn->setFlat(true); + aBtnLay->addWidget(aBtn); + + QWidget* aCustomWidget = new QWidget(aContent); + aCustomWidget->setObjectName(XGUI::PROP_PANEL_WDG); + aMainLay->addWidget(aCustomWidget); + aMainLay->addStretch(1); + + return aPropPanel; +} + +//****************************************************** +void XGUI_Workshop::setPropertyPannelTitle(const QString& theTitle) +{ + myPropertyPanelDock->setWindowTitle(theTitle); +} + +//****************************************************** +/* + * Creates dock widgets, places them in corresponding area + * and tabifies if necessary. + */ +void XGUI_Workshop::createDockWidgets() +{ + QMainWindow* aDesktop = isSalomeMode()? salomeConnector()->desktop() : + myMainWindow; + QDockWidget* aObjDock = createObjectBrowser(aDesktop); + aDesktop->addDockWidget(Qt::LeftDockWidgetArea, aObjDock); + myPropertyPanelDock = createPropertyPanel(aDesktop); + aDesktop->addDockWidget(Qt::LeftDockWidgetArea, myPropertyPanelDock); + hidePropertyPanel(); //tabifyDockWidget(aObjDock, myPropertyPanelDock); +} + +//****************************************************** +void XGUI_Workshop::showPropertyPanel() +{ + QAction* aViewAct = myPropertyPanelDock->toggleViewAction(); + //setEnabled(true); + myPropertyPanelDock->show(); + myPropertyPanelDock->raise(); +} + +//****************************************************** +void XGUI_Workshop::hidePropertyPanel() +{ + QAction* aViewAct = myPropertyPanelDock->toggleViewAction(); + //setEnabled(false); + myPropertyPanelDock->hide(); +} + +//****************************************************** +void XGUI_Workshop::showObjectBrowser() +{ + myObjectBrowser->parentWidget()->show(); +} + +//****************************************************** +void XGUI_Workshop::hideObjectBrowser() +{ + myObjectBrowser->parentWidget()->hide(); +} + +//****************************************************** +void XGUI_Workshop::onFeatureTriggered() +{ + QAction* aCmd = dynamic_cast(sender()); + if (aCmd) { + QString aId = salomeConnector()->commandId(aCmd); + if (!aId.isNull()) + myPartSetModule->launchOperation(aId); + } +} + +//****************************************************** +XGUI_Displayer* XGUI_Workshop::displayer() const +{ + // In SALOME viewer is accessible only when module is initialized + // and in SALOME mode myDisplayer object has to be created later (on demand) + if (!myDisplayer) { + XGUI_Workshop* that = (XGUI_Workshop*)this; + that->myDisplayer = isSalomeMode() ? + new XGUI_Displayer(salomeConnector()->AISContext()): + new XGUI_Displayer(myMainWindow->viewer()->AISContext()); + } + return myDisplayer; +} + +//****************************************************** +void XGUI_Workshop::changeCurrentDocument() +{ + QFeatureList aFeatures = objectBrowser()->selectedFeatures(); + + // Set current document + if (aFeatures.size() > 0) { + FeaturePtr aFeature = aFeatures.first(); + + boost::shared_ptr aMgr = ModelAPI_PluginManager::get(); + boost::shared_ptr aDocRef = aFeature->data()->docRef("PartDocument"); + if (aDocRef) + aMgr->setCurrentDocument(aDocRef->value()); + } } //****************************************************** -int XGUI_Workshop::addFeature(int thePageId, int theGroupId, - const QString& theTitle, const QString& theTip, - const QIcon& theIcon, - const QKeySequence& theKeys) +void XGUI_Workshop::salomeViewerSelectionChanged() { - return (int) createMenuCommand(thePageId, theGroupId, LAST_CMD, theTitle, theTip, theIcon, theKeys); + emit salomeViewerSelection(); }