/** * @file WorkflowPlugin.cpp * @date 2011-6-27 */ #include #include #include #include #include #include #include "WorkflowPlugin.h" #include "ModuleGraphicsItem.h" #include "ConsoleGUIService.h" #include "ViewExtension.h" #include "WorkflowWidget.h" #include "PaiWorkflowSubmitter.h" #include "PaiSurvey.h" #include "ObjectModelService.h" #include "PaiModuleTree.h" #include "PaiMessageBox.h" #include "PaiTextEdit.h" #include "WorkflowSceneManager.h" #include "PaiModuleToolBarView.h" #include "WorkflowToolBarView.h" #include "WorkflowConst.h" #include "ParameterEditorModel.h" #include "PaiWorkflowMaster.h" #include "PaiObjectSelection.h" #include "PAIConst.h" #include "ParameterProperty.h" #include "GlobalUtility.h" #include "ModuleInformation.h" #include "PaiBalloonTip.h" #include "Utils.h" #include "PaiWebViewWidget.h" #include "SaveHelper.h" #include "BrowseWorkflowCmd.h" #include "PaiWorkflowTemplateTree.h" #include "ParameterEditor.h" #include "ShareActionExtension.h" #include "PaiAction.h" #include "PaiHelp.h" using namespace pai; using namespace pai::gui; using namespace pai::graphics2d; using namespace pai::objectmodel; CPaiWorkflowPlugin::CPaiWorkflowPlugin() : m_pParameterEditor(NULL), m_control(GetID()) { } CPaiWorkflowPlugin::~CPaiWorkflowPlugin() { } void CPaiWorkflowPlugin::Integrate() { connect(&pai::objectmodel::PaiObject::m_EventAgent, SIGNAL(PropertyChanged(pai::objectmodel::PaiObject* ,const QString&,const QVariant& )), &m_control, SLOT(slotOnWorkflowPropertyChanged(pai::objectmodel::PaiObject* ,const QString&,const QVariant& ))); // 注册菜单扩展管理 Register(new ShareActionExtension(&m_control), ILocation()); } void CPaiWorkflowPlugin::slotActiveAreaTabPage(const QString& strAreaName, const std::string& activedViewID) { WorkflowWidget* pWorkflowView = m_control.GetActiveWorkflowView(); if(pWorkflowView != NULL && pWorkflowView->GetScene() != NULL && strAreaName == g_szB1) { if(QString::fromStdString(activedViewID) == g_szModules || QString::fromStdString(activedViewID) == g_szParameters) { PaiBalloonTip::HideBalloon(); } QWebPage* pWebInfo = GetWebHelpInfo(); if(pWebInfo && pWebInfo != NULL && pWebInfo->mainFrame() != NULL) { //获取B1区CPaiModuleToolBarView PageService* pPageService = GetConsoleGUIService()->GetViewTabService()->GetPageService(GetID()); ViewExtension *pModuleViewExtension = NULL; CPaiModuleToolBarView* moduleToolBar = NULL; if(pPageService) { pModuleViewExtension = dynamic_cast< ViewExtension* > (pPageService->GetExtension(QString(tr(g_szModules)).toStdString())); if(pModuleViewExtension) { moduleToolBar = dynamic_cast< CPaiModuleToolBarView* > (pModuleViewExtension->GetView()); } } //场景中没有选中模块时 if(pWorkflowView->GetScene()->selectedItems().count() == 0) { // 工作流模块列表。
您可以通过展开分类来浏览和选择模块 if(QString::fromStdString(activedViewID) == g_szModules) { if(moduleToolBar) { moduleToolBar->GetModuleTree()->selectModules(""); } pWebInfo->mainFrame()->setHtml(tr(g_szSelectModule)); } // 选择模块之后,你可以在此处填写模块参数 else if(QString::fromStdString(activedViewID) == g_szParameters) { if(m_pParameterEditor) { m_pParameterEditor->Clear(); } pWebInfo->mainFrame()->setHtml(tr(g_szSetparameters)); } } else { //更新提示信息 if(QString::fromStdString(activedViewID) == g_szModules) { if(moduleToolBar && moduleToolBar->GetModuleTree()) { QList itemLst = moduleToolBar->GetModuleTree()->selectedItems (); //如果模块树上选中模块或者场景中选中模块个数不等于1时,设置B2区信息 if(itemLst.isEmpty() || pWorkflowView->GetScene()->selectedItems().count() != 1) { moduleToolBar->GetModuleTree()->selectModules(""); pWebInfo->mainFrame()->setHtml(tr(g_szSelectModule)); } else { slotShowHelpDoc(itemLst.last(),1); } } } else if(QString::fromStdString(activedViewID) == g_szParameters) { if(m_pParameterEditor) { slotShowDescription(m_pParameterEditor->currentIndex()); } } } // 工作流模版列表。
您可以选择需要的模版快速进行工作流编辑 if(QString::fromStdString(activedViewID) == g_szTemplates) { pWebInfo->mainFrame()->setHtml(tr(g_szTemplateList)); } } } } pai::objectmodel::PaiWorkflowDataModel* CPaiWorkflowPlugin::GetActiveWorkflow() { if(m_control.GetActiveWorkflowView()) { return m_control.GetActiveWorkflowView()->GetWorkflow(); } return NULL; } void CPaiWorkflowPlugin::slotOnActiveTabPage(const QString &id) { if(id == QString::fromStdString(GetStringID())) { if(GetActiveWorkflow() != NULL) { //切换页签时对权限进行处理即设置按钮的可用性 m_control.UpdateSaveActions(true, GetActiveWorkflow()); GetObjectModelService()->GetObjectSelection()->Select(GetActiveWorkflow()->GetID(), true); if(m_pParameterEditor != NULL) { ParameterEditorModel* editorModel = dynamic_cast< ParameterEditorModel * > (m_pParameterEditor->model()); if(editorModel != NULL) { editorModel->SetCurrentWorkflowID(QUuid(GetActiveWorkflow()->GetID())); } } } } } void CPaiWorkflowPlugin::Dispose() { disconnect(&pai::objectmodel::PaiObject::m_EventAgent, SIGNAL(PropertyChanged(pai::objectmodel::PaiObject* ,const QString&,const QVariant& )), &m_control, SLOT(slotOnWorkflowPropertyChanged(pai::objectmodel::PaiObject* ,const QString&,const QVariant& ))); // 关闭界面并析构资源 if(GetConsoleGUIService()->GetViewTabService()->GetExtension(GetStringID())) { GetConsoleGUIService()->GetViewTabService()->Unregister(GetStringID()); } } bool CPaiWorkflowPlugin::Show(PaiObject *obj) { if(dynamic_cast< PaiWorkflowDataModel* > (obj)) { PaiWorkflowDataModel* pWorkflow = dynamic_cast< PaiWorkflowDataModel* > (obj); if(!pWorkflow) { return false; } if(!_ShowWorkflow(pWorkflow)) { return false; } if(m_pParameterEditor != NULL) { ParameterEditorModel* pEditorModel = dynamic_cast< ParameterEditorModel * > (m_pParameterEditor->model()); if(pEditorModel != NULL && GetActiveWorkflow()) { pEditorModel->SetCurrentWorkflowID(QUuid(GetActiveWorkflow()->GetID())); } } Active(obj); return true; } return false; } bool CPaiWorkflowPlugin::Active(pai::objectmodel::PaiObject* pObj) { GetConsoleGUIService()->GetViewTabService()->ActivateTabWidget(this->GetStringID()); // to fix 27548, 如果是工作流模板对象,则不试图在数据树上选中节点 PaiWorkflowDataModel *pWorkflow = dynamic_cast< PaiWorkflowDataModel* > (pObj); if(pWorkflow && !pWorkflow->IsTemplate()) { GetObjectModelService()->GetObjectSelection()->Select(pWorkflow->GetID(), true); } return true; } PluginInformation CPaiWorkflowPlugin::GetInformation() { PluginInformation info; info.SetID(GetID()); info.SetName("PaiWorkflowPlugin"); info.SetProvider("Qunzhihe"); info.SetVersion("1.0.0.0"); info.SetBrief("PaiWorkflowPlugin Display"); return info; } void CPaiWorkflowPlugin::OpenWorkflowHelp() { //要跳转到的html文档的名称 pai::gui::PaiHelp::Show("2.2.7workflowmanagement"); } bool CPaiWorkflowPlugin::OpenView() { try { //pageService注册到主控台内容区划分3部分A、B1、B2 PageService* pPageService = GetConsoleGUIService()->GetViewTabService()->Register(GetID(), QIcon(g_szWorkflowPng), g_szWorkflowEditor, g_szAB); //让A区页签的标题显示从左下开始 pPageService->SetTabPosition(g_szA, QTabWidget::South); //设置A区主区域,可修改编辑 pPageService->SetPrimaryArea(g_szA); // 工作流内容区和参数编辑区的默认宽度比例应该是7:3 GetConsoleGUIService()->GetViewTabService()->SetDefaultPageStretchFactor(GetID(), g_szA, 7); GetConsoleGUIService()->GetViewTabService()->SetDefaultPageStretchFactor(GetID(), g_szB, 3); //当点击A区页签的关闭按钮时,关闭整个插件 connect(pPageService,SIGNAL(PageWillBeClosed(const QString&)), &m_control, SLOT(slotOnClosePluginTabPage(const QString&))); //当切换到当前插件页签时,把当前页签激活并且更新控件 GetConsoleGUIService()->GetViewTabService()->ConnectWithTabWidget(SIGNAL(CurrentTabChanged(const QString&)), this, SLOT(slotOnActiveTabPage(const QString&))); //"Save" action,初始化置灰,有更新权限,然后注册到toolbar PaiAction* pSaveAction = new PaiAction(QIcon(g_szSavePng), g_szSave, NULL); pSaveAction->setEnabled(false); pSaveAction->SetPermission(pai::gui::PaiAction::UPDATE); connect(pSaveAction, SIGNAL(triggered()), &m_control, SLOT(slotSaveWorkflow())); pPageService->GetToolBarService()->Register(pSaveAction); pPageService->GetMenuService()->Register(pSaveAction, g_szMenu); //注册save as菜单到MENU QMenu* saveasMenu = new QMenu(); saveasMenu->setTitle(tr(g_szSaveAs)); pPageService->GetMenuService()->Register(saveasMenu, tr(g_szMenu)); //"Save as Workflow" action,初始化可用,有更新权限,然后注册到toolbar PaiAction* pSaveasWorkflowAction = new PaiAction(QIcon(g_szSaveasPng), g_szSaveasWfDot, NULL); pSaveasWorkflowAction->setEnabled(true); //因有可能本工区没有Upadate权限但其他工区有update权限,故此Action不能根据本工区的Update权限变化可用性 connect(pSaveasWorkflowAction, SIGNAL(triggered()), &m_control, SLOT(slotSaveAsWorkflow())); pPageService->GetToolBarService()->Register(pSaveasWorkflowAction); pPageService->GetMenuService()->Register(pSaveasWorkflowAction, g_szMenuSaveAs); //"Save as Template" action,初始化可用,有更新权限,然后注册到toolbar PaiAction* pSaveasTemplateAction = new PaiAction(QIcon(g_szSaveTempPng), g_szSaveTempDot, NULL); pSaveasTemplateAction->setEnabled(true); connect(pSaveasTemplateAction, SIGNAL(triggered()), &m_control, SLOT(slotSaveAsTemplate())); pPageService->GetToolBarService()->Register(pSaveasTemplateAction); pPageService->GetMenuService()->Register(pSaveasTemplateAction, g_szMenuSaveAs); //"Save as Picture" action,初始化可用,有更新权限,然后注册到toolbar PaiAction* pSaveasPictureAction = new PaiAction(QIcon(g_szSavePicture), g_szSaveAsPictureDot, NULL); pSaveasPictureAction->setEnabled(false); connect(pSaveasPictureAction, SIGNAL(triggered()), &m_control, SLOT(slotSaveWorkflowAsImageFile())); pPageService->GetToolBarService()->Register(pSaveasPictureAction); pPageService->GetMenuService()->Register(pSaveasPictureAction, g_szMenuSaveAs); //"Save as All" action,初始化置灰,有更新权限,然后注册到toolbar PaiAction* pSaveallAction = new PaiAction(QIcon(g_szSaveallPng), g_szSaveall, NULL); pSaveallAction->setEnabled(false); connect(pSaveallAction, SIGNAL(triggered()), &m_control, SLOT(slotSaveAllWorkflows())); pPageService->GetToolBarService()->Register(pSaveallAction); pPageService->GetMenuService()->Register(pSaveallAction, g_szMenu); //添加分割线 QAction* pMenuSeparatorAction = new QAction("", NULL); pMenuSeparatorAction->setSeparator(true); pPageService->GetToolBarService()->Register(pMenuSeparatorAction); pPageService->GetMenuService()->Register(pMenuSeparatorAction, g_szMenu); //添加Undo Action QAction *pUndoAction = m_control.GetUndoAction(); pPageService->GetToolBarService()->Register(pUndoAction); pPageService->GetMenuService()->Register(pUndoAction, g_szMenu); //添加Redo Action QAction *pRedoAction = m_control.GetRedoAction(); pPageService->GetToolBarService()->Register(pRedoAction); pPageService->GetMenuService()->Register(pRedoAction, g_szMenu); //添加剪切 Action PaiAction* pCutAction = new PaiAction(QIcon(g_szCutPng), g_szCut, NULL); pCutAction->setEnabled(false); pPageService->GetToolBarService()->Register(pCutAction); pPageService->GetMenuService()->Register(pCutAction, g_szMenu); connect(pCutAction, SIGNAL(triggered()), &m_control, SLOT(slotCutItems())); //添加Copy Action PaiAction* pCopyAction = new PaiAction(QIcon(g_szCopyPng), g_szCopy, NULL); pCopyAction->setEnabled(false); pPageService->GetToolBarService()->Register(pCopyAction); pPageService->GetMenuService()->Register(pCopyAction, g_szMenu); connect(pCopyAction, SIGNAL(triggered()), &m_control, SLOT(slotCopyItems())); //添加Paste Action PaiAction* pPasteAction = new PaiAction(QIcon(g_szPastePng), g_szPaste, NULL); pPasteAction->setEnabled(false); pPageService->GetToolBarService()->Register(pPasteAction); pPageService->GetMenuService()->Register(pPasteAction, g_szMenu); connect(pPasteAction, SIGNAL(triggered()), &m_control, SLOT(slotPasteItems())); //添加分割符 QAction* pSndMenuSeparatorAction = new QAction("", NULL); pSndMenuSeparatorAction->setSeparator(true); pPageService->GetToolBarService()->Register(pSndMenuSeparatorAction); pPageService->GetMenuService()->Register(pSndMenuSeparatorAction, g_szMenu); //添加详细信息预览 Action QAction* pBrowseAction = new QAction(QIcon(g_szBrowsePng), g_szDetailsDot, NULL); pBrowseAction->setEnabled(false); connect(pBrowseAction, SIGNAL(triggered()), this, SLOT(slotBrowseWorkflow())); pPageService->GetToolBarService()->Register(pBrowseAction); pPageService->GetMenuService()->Register(pBrowseAction, g_szMenu); //添加Submit Action PaiAction* pSubmitAction = new PaiAction(QIcon(g_szSubmitPng), g_szSubmit, NULL); connect(pSubmitAction, SIGNAL(triggered()), &m_control, SLOT(slotPreSubmitWorkflow())); pSubmitAction->setEnabled(false); pSubmitAction->SetPermission(pai::gui::PaiAction::UPDATE); pPageService->GetToolBarService()->Register(pSubmitAction); pPageService->GetMenuService()->Register(pSubmitAction, g_szMenu); //添加尝试运行 Action QAction* pTryRunAction = new QAction(QIcon(g_szWValidataPng), g_szTryRunDot, NULL); pTryRunAction->setEnabled(false); pPageService->GetToolBarService()->Register(pTryRunAction); pPageService->GetMenuService()->Register(pTryRunAction, g_szMenu); //添加对比 Action QAction* pCompareAction = new QAction(QIcon(g_szComparePng), g_szCompare, NULL); pCompareAction->setEnabled(false); pPageService->GetToolBarService()->Register(pCompareAction); pPageService->GetMenuService()->Register(pCompareAction, g_szMenu); //添加分割符 QAction* pFourthMenuSeparatorAction = new QAction("", NULL); pFourthMenuSeparatorAction->setSeparator(true); pPageService->GetToolBarService()->Register(pFourthMenuSeparatorAction); pPageService->GetMenuService()->Register(pFourthMenuSeparatorAction, g_szMenu); //添加弹簧 pPageService->GetToolBarService()->AddSpacer(); //添加打印 Action QAction* pPrintAction = new QAction(QIcon(g_szPrintPng), g_szPrint, NULL); pPrintAction->setEnabled(false); connect(pPrintAction, SIGNAL(triggered()), &m_control, SLOT(slotSaveWorkflowAsImageFile())); pPageService->GetToolBarService()->Register(pPrintAction); pPageService->GetMenuService()->Register(pPrintAction, g_szMenu); //添加分割符 QAction* pThirdMenuSeparatorAction = new QAction("", NULL); pThirdMenuSeparatorAction->setSeparator(true); pPageService->GetToolBarService()->Register(pThirdMenuSeparatorAction); pPageService->GetMenuService()->Register(pThirdMenuSeparatorAction, g_szMenu); //把ParameterEditor树添加到B1区 m_pParameterEditor = new CParameterEditor(NULL); pPageService->Register(new ViewExtension(m_pParameterEditor, g_szParameters, "", "", false), g_szB1); //把ModuleToolBarView添加到B1区 CPaiModuleToolBarView* moduleToolBar = new CPaiModuleToolBarView(NULL); pPageService->Register(new ViewExtension(moduleToolBar, g_szModules, "", "", false), g_szB1); connect(moduleToolBar->GetModuleTree(),SIGNAL(itemClicked(QTreeWidgetItem * , int )),this,SLOT(slotShowHelpDoc(QTreeWidgetItem * , int))); //把WorkflowTemplateTree树添加到B1区 CPaiWorkflowTemplateTree *pTemplateTree = new CPaiWorkflowTemplateTree(QUuid()); pPageService->Register(new ViewExtension(pTemplateTree, g_szTemplates, "", "", false), g_szB1); m_control.SetActiveTemplate(pTemplateTree); connect(pTemplateTree, SIGNAL(itemEdit(QList< pai::objectmodel::PaiObject* > )), this, SLOT(slotShowTemplate(QList< pai::objectmodel::PaiObject* > ))); connect(pTemplateTree, SIGNAL(itemDelete(QList< pai::objectmodel::PaiObject* > )), this, SLOT(slotDeleteTemplate(QList< pai::objectmodel::PaiObject* > ))); connect(pTemplateTree, SIGNAL(importTemplates(ImportType)), &m_control, SLOT(slotImportWorkflows(ImportType))); connect(pTemplateTree, SIGNAL(exportTemplates(ImportType)), &m_control, SLOT(slotExportWorkflows(ImportType))); //向B2区添加tab PaiTextEdit* pLblDataRelation = new PaiTextEdit(g_szDataInfoDot, NULL); pPageService->Register(new ViewExtension(pLblDataRelation, g_szDataRelation, "", "", false), g_szB2); pLblDataRelation->setReadOnly(true); //向B2区添加tab PaiWebViewWidget *pWebviewWidget = new PaiWebViewWidget(NULL); QWebPage* pWebInfo = new QWebPage(pWebviewWidget->GetWebView()); pWebviewWidget->setPage(pWebInfo); pWebInfo->mainFrame()->setHtml(tr(g_szSelectModule)); pPageService->Register(new ViewExtension(pWebviewWidget, g_szInfo, "", "", false), g_szB2); connect(pPageService,SIGNAL(AreaActiveViewChanged(const QString&, const std::string&)), this, SLOT(slotActiveAreaTabPage(const QString&,const std::string&))); connect(m_pParameterEditor,SIGNAL(clicked(const QModelIndex &)),this,SLOT(slotShowDescription(const QModelIndex&))); pPageService->RegisterViewsMenu(); //添加workflowhHelp QAction* pWorkflowHelpAction = new QAction("Help", NULL); connect(pWorkflowHelpAction,SIGNAL(triggered()),this,SLOT(OpenWorkflowHelp())); pPageService->GetMenuService()->Register(pWorkflowHelpAction, g_szMenu); // 为了美观,向B区下边缘添加一个空白让B2的底边提高一点使其与工作流的工作区域平齐 pPageService->AddPagePlaceHolder(g_szB, 0, 0, 0, 22); return true; } catch(pai::error::generic_error & e) { pai::gui::PaiMessageBox::Critical(NULL, PAI_NAME, QString(g_szOpenView).append(e.what())); pai::log::Info(_FLF(g_szOpenView + e.what())); GetConsoleGUIService()->GetViewTabService()->Unregister(GetID().toString().toStdString()); return false; } } bool CPaiWorkflowPlugin::_ShowWorkflow(PaiWorkflowDataModel* pWorkflowObject) { try { PageService* pPageService = GetConsoleGUIService()->GetViewTabService()->GetPageService(GetID()); if(pPageService != NULL) { ViewExtension *pViewExtension = dynamic_cast< ViewExtension* > (pPageService->GetExtension(pWorkflowObject->GetID().toString().toStdString())); if(pViewExtension == NULL) { WorkflowWidget* pWorkflowView = new WorkflowWidget(pWorkflowObject); WorkflowSceneManager *pWorkflowScene = new WorkflowSceneManager(0,0,800,750); pWorkflowView->SetScene(pWorkflowScene); pWorkflowScene->SetSubToolBarName(pWorkflowView->GetID() + g_szStyleToolBarName); CWorkflowToolBarView* pWorkflowTool = new CWorkflowToolBarView(pWorkflowView, GetID()); pWorkflowScene->SetParameterEditor(m_pParameterEditor); //处理数据树上添加或者删除地震数据时,对工作流的影响 // connect(&pai::objectmodel::PaiObject::m_EventAgent, // SIGNAL(ObjectRemoveChild(pai::objectmodel::PaiObject* ,pai::objectmodel::PaiObject* )), pWorkflowScene, // SLOT(slotOnObjectRemoveChild(pai::objectmodel::PaiObject* ,pai::objectmodel::PaiObject* ))); connect(&pai::objectmodel::PaiObject::m_EventAgent, SIGNAL(ObjectAddChildren(pai::objectmodel::PaiObject* ,QList&)), pWorkflowScene, SLOT(slotOnObjectAddChildren(pai::objectmodel::PaiObject* ,QList&))); connect(&pai::graphics2d::ModuleGraphicsItem::m_EventAgent, SIGNAL(signalClick(CModuleInformation*, bool)), m_pParameterEditor, SLOT(slotOpen(CModuleInformation*, bool))); disconnect(pWorkflowView->GetScene(), SIGNAL(signalOpenModuleParam(CModuleInformation*)), m_pParameterEditor, SLOT(slotForceOpen(CModuleInformation*))); connect(pWorkflowView->GetScene(), SIGNAL(signalOpenModuleParam(CModuleInformation*)), m_pParameterEditor, SLOT(slotForceOpen(CModuleInformation*))); connect(pWorkflowView->GetScene(), SIGNAL(doubleClickModule(CModuleInformation* ,bool)), m_pParameterEditor, SLOT(slotOpen(CModuleInformation*, bool))); connect(pWorkflowView->GetScene(), SIGNAL(doubleClickModule(CModuleInformation*, bool)), &m_control, SLOT( slotActivateParameterEditor(CModuleInformation*, bool))); connect(pWorkflowView->GetScene(), SIGNAL(signalSelectModule(CModuleInformation*)), this, SLOT(slotShowHelpDocForSceneSelect(CModuleInformation*))); connect(pWorkflowView->GetScene(), SIGNAL(signalSelectModule(CModuleInformation*)), &m_control, SLOT(slotActivateModuleTree(CModuleInformation*))); connect(&pai::graphics2d::ModuleGraphicsItem::m_EventAgent, SIGNAL(signalClick(CModuleInformation*, bool)), &m_control, SLOT(slotActivateModuleTree(CModuleInformation*, bool)));//当当前模块为空时将B1区切换到模块树为当前激活页签 connect(m_pParameterEditor->model(), SIGNAL(signalErrorInfoChanged(CModuleInformation *,bool,const pai::module::CModuleCheckResult, ValidateEventSource)), pWorkflowView->GetScene(), SLOT(slotOnModuleParameterError(CModuleInformation*,bool ,const pai::module::CModuleCheckResult, ValidateEventSource))); //该链接用来当用户修改参数编辑面版的参数后,通知工作流对象的状态为已修改,属于暂时的做法 connect(m_pParameterEditor->itemDelegate(), SIGNAL(commitData(QWidget*)), pWorkflowView->GetScene(), SLOT(slotOnModuleParamDataChanged())); ViewExtension *pModuleViewExtension = dynamic_cast< ViewExtension* > (pPageService->GetExtension(QString(tr(g_szModules)).toStdString())); CPaiModuleToolBarView* moduleToolBar = dynamic_cast< CPaiModuleToolBarView* > (pModuleViewExtension->GetView()); connect(moduleToolBar->GetModuleTree(),SIGNAL(DeliverModule(const QString&)),pWorkflowView->GetScene(),SLOT(slotAddModule(const QString&))); connect(m_control.GetTemplateTree(),SIGNAL(itemDoubleClicked(pai::objectmodel::PaiObject*)),pWorkflowView->GetScene(),SLOT(slotApplyTemplate(pai::objectmodel::PaiObject*))); // connect the module selected signal for module tree menu sensitive connect(pWorkflowView->GetScene(),SIGNAL(moduleSelectedSignal(bool)), moduleToolBar->GetModuleTree() ,SLOT(moduleSelectedSlot(bool)) ); // connect the module selected signal for module tree menu sensitive connect( moduleToolBar->GetModuleTree() ,SIGNAL(menuClicked(const QString&,const QString&)), pWorkflowView->GetScene() ,SLOT(slotOnModuleMenuClick(const QString& ,const QString&)) ); connect(pWorkflowView->GetScene(), SIGNAL(signalSelectModule(CModuleInformation*)), moduleToolBar->GetModuleTree(), SLOT(slotSelectModule(CModuleInformation*))); pViewExtension = new ViewExtension(pWorkflowTool, pWorkflowObject->GetName(), "", pWorkflowObject->GetID().toString().toStdString()); pViewExtension->SetSubtilte(pWorkflowObject->GetFullPathName()); pPageService->Register(pViewExtension, g_szA, true); pPageService->SetSubtilte(pWorkflowObject->GetFullPathName()); QObject::connect(pPageService, SIGNAL(AreaBecameEmpty(QString)), &m_control, SLOT(slotCloseWorkflowPlugin(QString)), Qt::UniqueConnection); //syr //当用户点击下方的关闭按钮时,提示用户保存 QObject::connect(pViewExtension, SIGNAL(ViewWillBeClosed(const QString&)), &m_control, SLOT(slotCloseWorkflowWidget(const QString&)), Qt::UniqueConnection); connect(pViewExtension, SIGNAL(CurrentTabChanged(const QString&)), &m_control, SLOT(slotOnActiveCurrentWorkflow(const QString&)), Qt::UniqueConnection); //第一次打开工作流插件时,设置活动的workflowWidget,其它情况下活动workflowWidget设置在切换页签时做 QTabWidget* pTabWidget = dynamic_cast (pPageService->GetWidgetView(g_szA)); if( pTabWidget && pTabWidget->count() == 1) { SaveHelper::SetActiveWorkflowView(pWorkflowView); } m_control.GetUndoGroup()->addStack(pWorkflowScene->GetUndoStack()); connect(&pai::objectmodel::PaiObject::m_EventAgent, SIGNAL(ObjectRefreshed(pai::objectmodel::PaiObject*)), &m_control, SLOT(slotOnWorkflowRefreshed(pai::objectmodel::PaiObject*))); } QTabWidget* pTabWidget = dynamic_cast (pPageService->GetWidgetView(g_szA)); if (pTabWidget != NULL) { pTabWidget->setCurrentWidget(dynamic_cast (pViewExtension->GetView())); } if(pTabWidget!=NULL && pTabWidget->count()==1) { //QApplication::processEvent及PageService的UpdateLayout方法不再在这里调用,因为PageService里的WorkspaceSplitter已经handle了这部分功能 //将当前窗口设置为活动窗口,用于接收键盘事件 QWidget *w = dynamic_cast (pViewExtension->GetView()); w->activateWindow(); //将当前窗口设置为活动窗口,用于接收键盘事件 //为前一个WorkflowWidget保存B类页选择的ExtensionID, 必须在设置新的工作流数据模型之前调用 m_control.HandleCurrentWorkEnvironment(HandleEnvironment_BeforeUnselect); m_control.HandleCurrentWorkEnvironment(HandleEnvironment_AfterSelect); } //使得模块树激活 pPageService->ActiveView(g_szModules); return true; } } catch(pai::error::generic_error & e) { pai::gui::PaiMessageBox::Critical(NULL, PAI_NAME, QString(g_szShowWorkflow).append(e.what())); pai::log::Info(_FLF(g_szShowWorkflow + e.what())); GetConsoleGUIService()->GetViewTabService()->Unregister(GetID().toString().toStdString()); } return false; } QList< QUuid > CPaiWorkflowPlugin::GetSupportedTypeIDs() const { QList < QUuid > lstTypeIDs; lstTypeIDs << QUuid(PaiWorkflowDataModel::GetTypeIDString()); lstTypeIDs << QUuid(); //设定一个Null值的QUuid作为分隔符,分割符之前的支持显示,分割符之后的用来支持其他业务。 lstTypeIDs << QUuid(PaiSurvey::GetTypeIDString()); lstTypeIDs << QUuid(PaiWorkflowMaster::GetTypeIDString()); //暂时支持下WorkflowMaster,因为目前阶段和步骤都没做,工作流暂时挂到WorkflowMaster下 return lstTypeIDs; } bool CPaiWorkflowPlugin::Handle(QList< pai::objectmodel::PaiObject* > & contextObjs, QList & actions) { //双击工区或右键单击工区注册new workflow Action if(contextObjs.count() == 1) { //获取对象的SurveyID和对象类型 long long SurveyID = contextObjs.first()->GetDBID(); QUuid typeID = contextObjs.first()->GetTypeID(); if (typeID == QUuid(PaiSurvey::GetTypeIDString())) { PaiAction* pNewWorkflowAction = new PaiAction(QIcon(":/f_new_workflow.png"), tr(g_szNewWorkflowDot), this); pNewWorkflowAction->SetActionFlags(pNewWorkflowAction->GetFlags() | PaiAction::TreeFloatingAct); pNewWorkflowAction->SetPermissions(pai::gui::PaiAction::UPDATE); pNewWorkflowAction->setData(QVariant(SurveyID)); connect(pNewWorkflowAction, SIGNAL(triggered()), &m_control, SLOT(slotNewWorkflow())); actions.append(pNewWorkflowAction); return true; } } QList< PaiAction* > lstAppendedActions; if(m_control.BuildTreeMenuActionsForObject(contextObjs, lstAppendedActions)) { actions.append(lstAppendedActions); return true; } return false; } void CPaiWorkflowPlugin::slotShowDescription(const QModelIndex & index) { ParameterProperty* param = static_cast< ParameterProperty* > (index.internalPointer()); if(param != NULL && param->IsParameterItem()) { QWebPage* pWebInfo = GetWebHelpInfo(); if(pWebInfo != NULL) { pWebInfo->mainFrame()->setHtml(QString::fromStdString(param->GetParamItem()->GetDescription())); } } else //如果没有选择ModelIndex,则清空Info信息显示 { QWebPage* pTempWebInfo = GetWebHelpInfo(); if(pTempWebInfo != NULL) { pTempWebInfo->mainFrame()->setHtml(QString::fromStdString("")); } } } void CPaiWorkflowPlugin::slotShowHelpDoc(QTreeWidgetItem * item, int /*column*/) { QString Helpdoc = item->data(0, pai::gui::HintRole).toString(); ShowHelpDoc(Helpdoc.toStdString()); } void CPaiWorkflowPlugin::slotShowTemplate(QList< pai::objectmodel::PaiObject* > objectList) { if(objectList.isEmpty()) { return; } foreach(PaiObject* pObject, objectList) { PaiWorkflowDataModel* pWorkflow = dynamic_cast(pObject); pWorkflow->SetEventEnabled(true); if (_ShowWorkflow(pWorkflow) == false) { return; } if (m_pParameterEditor) { ParameterEditorModel* editorModel = dynamic_cast (m_pParameterEditor->model()); if (editorModel && GetActiveWorkflow()) { editorModel->SetCurrentWorkflowID(QUuid(GetActiveWorkflow()->GetID())); } } Active(pObject); } } void CPaiWorkflowPlugin::slotDeleteTemplate(QList< pai::objectmodel::PaiObject* > objectList) { PageService* pPageService = GetConsoleGUIService()->GetViewTabService()->GetPageService(m_control.GetViewID()); foreach(PaiObject* pObj, objectList) { pai::objectmodel::PaiWorkflowDataModel* pWorkflow = dynamic_cast(pObj); if (NULL == pWorkflow) { continue; } std::string strWorkflowID = pWorkflow->GetID().toString().toStdString(); ViewExtension* pViewExtension = dynamic_cast (pPageService->GetExtension(strWorkflowID)); //找到要重设工作流模型的Extension if (pViewExtension) { pPageService->Unregister(strWorkflowID); } } } void CPaiWorkflowPlugin::slotShowHelpDocForSceneSelect(pai::workflow::CModuleInformation* pModuleInformation) { if(NULL != pModuleInformation && (!pModuleInformation->IsBlankModule())) { pai::module::CModule *pModule = pModuleInformation->GetModule(); if(NULL != pModule) { ShowHelpDoc(pModule->GetMetaData()->GetHelpDoc()); } } else { PageService* pPageService = GetConsoleGUIService()->GetViewTabService()->GetPageService(GetID()); if(pPageService != NULL) { QWidget *pActiveWidget = pPageService->GetCurrentView(g_szB1); if(pActiveWidget != NULL) { QString strExtensionID = pActiveWidget->property(g_szExtensionID).toString(); slotActiveAreaTabPage(g_szB1, strExtensionID.toStdString()); } } } } QWebPage* CPaiWorkflowPlugin::GetWebHelpInfo() { PageService* pPageService = GetConsoleGUIService()->GetViewTabService()->GetPageService(GetID()); if(pPageService != NULL) { ViewExtension* pViewExtension = dynamic_cast< ViewExtension* > (pPageService->GetExtension(g_szInfo)); if(pViewExtension != NULL) { PaiWebViewWidget* pWebViewWidget = dynamic_cast< PaiWebViewWidget* > (pViewExtension->GetView()); if(pWebViewWidget != NULL) { return pWebViewWidget->GetWebView()->page(); } } } return NULL; } void CPaiWorkflowPlugin::ShowHelpDoc(std::string strHelp) { QString strHelpDoc = QString::fromStdString(pai::utils::CUtils::GetPaiHome()) + "/doc/" + QString::fromStdString(strHelp); QFile doc(strHelpDoc); doc.open(QIODevice::ReadOnly); QTextStream out(&doc); QFileInfo fileInfo(strHelpDoc); QWebPage* pWebInfo = GetWebHelpInfo(); if(pWebInfo != NULL) { pWebInfo->mainFrame()->setHtml(out.readAll(), QUrl::fromLocalFile(fileInfo.absolutePath() + "/")); } doc.close(); } void CPaiWorkflowPlugin::slotBrowseWorkflow() { if(m_control.GetActiveWorkflowView()) { BrowseWorkflowCmd browseWorkflowCmd(m_control.GetActiveWorkflowView()); browseWorkflowCmd.redo(); } } Q_EXPORT_PLUGIN2(WorkflowView, pai::CPaiWorkflowPlugin)