📄 dcfdiagram.c
字号:
SetNodeLineStyle(LineStyle::SOLID); break; case 5: SetNodeType(Code::EVENT_STORE); SetNodeShapeType(Code::HORIZONTAL_BAR); SetNodeLineStyle(LineStyle::DASHED); break; case 6: SetNodeType(Code::SPLIT_MERGE_NODE); SetNodeShapeType(Code::BLACK_DOT); SetNodeLineStyle(LineStyle::SOLID); break; case 7: SetNodeType(Code::COMMENT); SetNodeShapeType(Code::TEXT_BOX); SetNodeLineStyle(LineStyle::INVISIBLE); break; default: error("%s, line %d: impl error: " "unknown node type selected\n", __FILE__,__LINE__); }}void DCFDiagram::UpdateEdgeType(int num) { ((DiagramWindow *)GetMainWindow())->SetEdgeName(num); SetLineType(Code::LINE); switch(num) { case 1: SetEdgeType(Code::DATA_FLOW); SetLineEnd1(LineEnd::EMPTY); SetLineEnd2(LineEnd::FILLED_ARROW); SetEdgeLineStyle(LineStyle::SOLID); break; case 2: SetEdgeType(Code::EVENT_FLOW); SetLineEnd1(LineEnd::EMPTY); SetLineEnd2(LineEnd::FILLED_ARROW); SetEdgeLineStyle(LineStyle::DASHED); break; case 3: SetEdgeType(Code::BIDIRECTIONAL_DATA_FLOW); SetLineEnd1(LineEnd::FILLED_ARROW); SetLineEnd2(LineEnd::FILLED_ARROW); SetEdgeLineStyle(LineStyle::SOLID); break; case 4: SetEdgeType(Code::CONTINUOUS_DATA_FLOW); SetLineEnd1(LineEnd::EMPTY); SetLineEnd2(LineEnd::DOUBLE_FILLED_ARROW); SetEdgeLineStyle(LineStyle::SOLID); break; case 5: SetEdgeType(Code::CONTINUOUS_EVENT_FLOW); SetLineEnd1(LineEnd::EMPTY); SetLineEnd2(LineEnd::DOUBLE_FILLED_ARROW); SetEdgeLineStyle(LineStyle::DASHED); break; default: error("%s, line %d: impl error: " "unknown edge type selected\n", __FILE__,__LINE__); }}void DCFDiagram::AddSubject(Subject *subj) { DFDiagram::AddSubject(subj); int subjType = subj->GetClassType(); if (subjType == Code::CONTINUOUS_DATA_FLOW || subjType == Code::CONTINUOUS_EVENT_FLOW) { Subject *n = ((Edge *)subj)->GetSubject1(); if (n->GetClassType() == Code::DATA_PROCESS) ((DataProcess *)n)->SetInstantaneous(False); }}void DCFDiagram::EditPersistence(Subject *s) { if (s->GetClassType() != Code::DATA_PROCESS) { ShowDialog(MessageDialog::ERROR, "Not a data process", "Only the persistence of data processes can be set."); return; } SetEditProcess((DataProcess *)s); if (GetEditProcess()->IsProcessGroup()) { ShowDialog(MessageDialog::ERROR, "A process group", "This data process is a process group,\n" "so you cannot set the persistence"); SetEditProcess(0); return; } const string *n = GetEditProcess()->GetIndex(); string x = "Persistence of process "; string title = x + *n; persistenceDialog->SetTitle(&title); bool ins = GetEditProcess()->IsInstantaneous(); persistenceDialog->SetValue(ins); persistenceDialog->Popup();}void DCFDiagram::EditActivation(Subject *s) { if (s->GetClassType() != Code::DATA_PROCESS) { ShowDialog(MessageDialog::ERROR, "Not a data process", "Only activation mechanisms of data processes can be set."); return; } SetEditProcess((DataProcess *)s); if (GetEditProcess()->IsProcessGroup()) { ShowDialog(MessageDialog::ERROR, "A process group", "This data process is a process group,\n" "so you cannot set the activation mechanism"); SetEditProcess(0); return; } else if (!GetEditProcess()->IsInstantaneous()) { ShowDialog(MessageDialog::ERROR, "A continuing process", "This data process is continuing,\n" "so you cannot set the activation mechanism"); SetEditProcess(0); return; } const string *n = GetEditProcess()->GetIndex(); string x = "Activation of process "; string title = x + *n; activationDialog->SetTitle(&title); DataProcess::ActivationType at = GetEditProcess()-> GetActivationMechanism(); if (at == DataProcess::STIMULUS) UpdateActivationDialog(0); else if (at == DataProcess::TIME) UpdateActivationDialog(1); else if (at == DataProcess::TRIGGER) UpdateActivationDialog(2); else UpdateActivationDialog(3); activationDialog->Popup();}void DCFDiagram::UpdateActivationDialog(int n) { activationDialog->SetValue(min(n, 3)); if (n == 0) { activationDialog->ManageSelectionLabel(True); activationDialog->ManageTextString(True); activationDialog->SetSelectionLabel("Stimulus edge name"); activationDialog->SetTextString(GetEditProcess()->GetStimulus()); } else if (n == 1) { activationDialog->ManageSelectionLabel(True); activationDialog->ManageTextString(True); activationDialog->SetSelectionLabel("Time expression"); activationDialog->SetTextString(GetEditProcess()->GetTimeExpression()); } else { activationDialog->SetSelectionLabel(""); activationDialog->SetTextString(""); activationDialog->ManageSelectionLabel(False); activationDialog->ManageTextString(False); }} void DCFDiagram::SetPersistence() { SetStatus("action: Set persistence"); if (!check(GetEditProcess())) return; bool b = persistenceDialog->GetValue(); GetEditProcess()->SetInstantaneous(b);} void DCFDiagram::SetActivation() { SetStatus("action: Set activation"); if (!check(GetEditProcess())) return; int n = activationDialog->GetValue(); string s; if (n < 2) { activationDialog->GetTextString(&s); } if (n == 0) { GetEditProcess()->SetActivationMechanism(DataProcess::STIMULUS); GetEditProcess()->SetStimulus(&s); } else if (n == 1) { GetEditProcess()->SetActivationMechanism(DataProcess::TIME); GetEditProcess()->SetTimeExpression(&s); } else if (n == 2) GetEditProcess()->SetActivationMechanism(DataProcess::TRIGGER); else GetEditProcess()->SetActivationMechanism(DataProcess::UNSPECIFIED);}void DCFDiagram::UpdateActivationToggle() { SetStatus("action: Update activation toggle"); if (!check(GetEditProcess())) return; int n = activationDialog->GetValue(); UpdateActivationDialog(n);}bool DCFDiagram::CheckEdgeConstraints(Subject *s1, Subject *s2) { return DFDiagram::CheckEdgeConstraints(s1, s2);}void DCFDiagram::CheckDocument() { chkbuf = ""; unsigned total = 0; total += dcfChecks->CheckNamelessNodes(Code::DATA_PROCESS, chkbuf); total += dcfChecks->CheckNamelessNodes(Code::DATA_STORE, chkbuf); total += dcfChecks->CheckNamelessNodes(Code::EVENT_STORE, chkbuf); total += dcfChecks->CheckNamelessNodes(Code::EXTERNAL_ENTITY, chkbuf); total += dcfChecks->CheckNamelessNodes(Code::CONTROL_PROCESS, chkbuf); total += dcfChecks->CheckNamelessFlows(Code::DATA_FLOW, Code::EXTERNAL_ENTITY, Code::DATA_PROCESS, chkbuf); total += dcfChecks->CheckNamelessFlows(Code::EVENT_FLOW, Code::EXTERNAL_ENTITY, Code::DATA_PROCESS, chkbuf); total += dcfChecks->CheckNamelessFlows(Code::CONTINUOUS_DATA_FLOW, Code::EXTERNAL_ENTITY, Code::DATA_PROCESS, chkbuf); total += dcfChecks->CheckNamelessFlows(Code::CONTINUOUS_EVENT_FLOW, Code::EXTERNAL_ENTITY, Code::DATA_PROCESS, chkbuf); total += dcfChecks->CheckNamelessFlows(Code::EVENT_FLOW, Code::EXTERNAL_ENTITY, Code::CONTROL_PROCESS, chkbuf); total += dcfChecks->CheckNamelessFlows(Code::CONTINUOUS_EVENT_FLOW, Code::EXTERNAL_ENTITY, Code::CONTROL_PROCESS, chkbuf); total += dcfChecks->CheckNamelessFlows(Code::DATA_FLOW, Code::DATA_PROCESS, Code::EXTERNAL_ENTITY, chkbuf); total += dcfChecks->CheckNamelessFlows(Code::EVENT_FLOW, Code::DATA_PROCESS, Code::EXTERNAL_ENTITY, chkbuf); total += dcfChecks->CheckNamelessFlows(Code::CONTINUOUS_DATA_FLOW, Code::DATA_PROCESS, Code::EXTERNAL_ENTITY, chkbuf); total += dcfChecks->CheckNamelessFlows(Code::CONTINUOUS_EVENT_FLOW, Code::DATA_PROCESS, Code::EXTERNAL_ENTITY, chkbuf); total += dcfChecks->CheckNamelessFlows(Code::DATA_FLOW, Code::DATA_PROCESS, Code::DATA_PROCESS, chkbuf); total += dcfChecks->CheckNamelessFlows(Code::EVENT_FLOW, Code::DATA_PROCESS, Code::DATA_PROCESS, chkbuf); total += dcfChecks->CheckNamelessFlows(Code::CONTINUOUS_DATA_FLOW, Code::DATA_PROCESS, Code::DATA_PROCESS, chkbuf); total += dcfChecks->CheckNamelessFlows(Code::CONTINUOUS_EVENT_FLOW, Code::DATA_PROCESS, Code::DATA_PROCESS, chkbuf); total += dcfChecks->CheckNamelessFlows(Code::EVENT_FLOW, Code::DATA_PROCESS, Code::CONTROL_PROCESS, chkbuf); total += dcfChecks->CheckNamelessFlows(Code::CONTINUOUS_EVENT_FLOW, Code::DATA_PROCESS, Code::CONTROL_PROCESS, chkbuf); // nb. controlprocess -> data process should be a prompt. total += dcfChecks->CheckNamelessFlows(Code::EVENT_FLOW, Code::CONTROL_PROCESS, Code::EXTERNAL_ENTITY, chkbuf); total += dcfChecks->CheckNamelessFlows(Code::EVENT_FLOW, Code::CONTROL_PROCESS, Code::CONTROL_PROCESS, chkbuf); total += dcfChecks->CheckNamelessFlows(Code::CONTINUOUS_EVENT_FLOW, Code::CONTROL_PROCESS, Code::CONTROL_PROCESS, chkbuf); total += dcfChecks->CheckNamelessFlows(Code::EVENT_FLOW, Code::CONTROL_PROCESS, Code::DATA_PROCESS, chkbuf); total += dcfChecks->CheckNamelessFlows(Code::CONTINUOUS_EVENT_FLOW, Code::CONTROL_PROCESS, Code::DATA_PROCESS, chkbuf); total += dcfChecks->CheckDoubleNodes(Code::DATA_PROCESS, chkbuf); total += dcfChecks->CheckDoubleNodes(Code::DATA_STORE, chkbuf); total += dcfChecks->CheckDoubleNodes(Code::EVENT_STORE, chkbuf); total += dcfChecks->CheckDoubleNodes(Code::EXTERNAL_ENTITY, chkbuf); total += dcfChecks->CheckDoubleNodes(Code::CONTROL_PROCESS, chkbuf); total += dcfChecks->CheckDoubleIndexes(chkbuf); total += dcfChecks->CheckDataProcessCoherence(chkbuf); total += dcfChecks->CheckControlProcessCoherence(chkbuf); total += dcfChecks->CheckConnected(Code::DATA_STORE, False, chkbuf); total += dcfChecks->CheckConnected(Code::EVENT_STORE, False, chkbuf); total += dcfChecks->CheckConnected( Code::EXTERNAL_ENTITY, False, chkbuf); total += dcfChecks->CheckSplitMergeNodeCoherence(chkbuf); total += dcfChecks->CheckNamelessSplitMergeEdges(chkbuf); total += dcfChecks->CheckContinuousSplitMergeEdges(chkbuf); total += dcfChecks->CheckPersistences(chkbuf); total += dcfChecks->CheckActivationMechanisms(chkbuf); total += dcfChecks->CheckMinispecs(chkbuf); ReportCheck(total, &chkbuf);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -