diff --git a/code/library/src/main/kotlin/org/fbme/lib/iec61499/fbnetwork/FunctionBlockDeclarationBase.kt b/code/library/src/main/kotlin/org/fbme/lib/iec61499/fbnetwork/FunctionBlockDeclarationBase.kt index fb794383a..78c69dd18 100644 --- a/code/library/src/main/kotlin/org/fbme/lib/iec61499/fbnetwork/FunctionBlockDeclarationBase.kt +++ b/code/library/src/main/kotlin/org/fbme/lib/iec61499/fbnetwork/FunctionBlockDeclarationBase.kt @@ -27,15 +27,14 @@ interface FunctionBlockDeclarationBase : Declaration, ContainedElement { return result } - fun getAllPorts(): List { - return type.eventInputPorts + fun getAllPorts(): List = + type.eventInputPorts .union(type.eventOutputPorts) .union(type.dataInputPorts) .union(type.dataOutputPorts) .union(type.socketPorts) .union(type.plugPorts) .toList() - } var x: Int var y: Int diff --git a/code/richediting/src/main/kotlin/org/fbme/ide/richediting/adapters/fbnetwork/FunctionBlockController.kt b/code/richediting/src/main/kotlin/org/fbme/ide/richediting/adapters/fbnetwork/FunctionBlockController.kt index 42a295f24..79f90edf3 100644 --- a/code/richediting/src/main/kotlin/org/fbme/ide/richediting/adapters/fbnetwork/FunctionBlockController.kt +++ b/code/richediting/src/main/kotlin/org/fbme/ide/richediting/adapters/fbnetwork/FunctionBlockController.kt @@ -4,7 +4,6 @@ import jetbrains.mps.editor.runtime.style.CellAlign import jetbrains.mps.editor.runtime.style.Measure import jetbrains.mps.editor.runtime.style.Padding import jetbrains.mps.editor.runtime.style.StyleAttributes -import jetbrains.mps.findUsages.FindUsagesManager import jetbrains.mps.nodeEditor.MPSColors import jetbrains.mps.nodeEditor.cellLayout.CellLayout_Vertical import jetbrains.mps.nodeEditor.cells.EditorCell @@ -20,6 +19,9 @@ import org.fbme.ide.richediting.adapters.fbnetwork.fb.FBTypeCellComponent import org.fbme.ide.richediting.adapters.fbnetwork.fb.EditableFBTypeCell import org.fbme.ide.richediting.adapters.fbnetwork.port.PortActionFactory import org.fbme.ide.richediting.editor.RichEditorStyleAttributes +import org.fbme.ide.richediting.utils.Notifier +import org.fbme.ide.richediting.utils.ProjectProvider +import org.fbme.ide.richediting.utils.fb.FBUsageFinder import org.fbme.ide.richediting.viewmodel.* import org.fbme.lib.iec61499.DeclarationsScope import org.fbme.lib.iec61499.IEC61499Factory @@ -324,7 +326,21 @@ class FunctionBlockController( override fun executeInCommand(): Boolean = true override fun canExecute(context: EditorContext): Boolean { - //FindUsagesManager + val project = ProjectProvider.getInstance(context)!! + val res = FBUsageFinder + .findUsages(project, view.component.type.declaration!!) + .filter { + it.key.identifier != networkInstance.declaration.identifier + }.map { + it.key + } + if (res.isNotEmpty()) { + Notifier.showWarning( + "This function block uses also in " + + res.joinToString { it.name } + "!", + project.project + ) + } return true } diff --git a/code/richediting/src/main/kotlin/org/fbme/ide/richediting/utils/fb/FBUsageFinder.kt b/code/richediting/src/main/kotlin/org/fbme/ide/richediting/utils/fb/FBUsageFinder.kt new file mode 100644 index 000000000..9c531caf1 --- /dev/null +++ b/code/richediting/src/main/kotlin/org/fbme/ide/richediting/utils/fb/FBUsageFinder.kt @@ -0,0 +1,31 @@ +package org.fbme.ide.richediting.utils.fb + +import jetbrains.mps.findUsages.FindUsagesManager +import jetbrains.mps.project.MPSProject +import org.fbme.ide.iec61499.repository.PlatformElement +import org.fbme.ide.iec61499.repository.PlatformRepositoryProvider +import org.fbme.lib.common.Declaration +import org.jetbrains.mps.openapi.model.SNode + +object FBUsageFinder { + fun findUsages(project: MPSProject, fbBlock: Declaration) + : Map { + val manager = project.getComponent(FindUsagesManager::class.java) + val platformElement = (fbBlock as PlatformElement) + val nodes = manager.findUsages(project.scope, mutableSetOf(platformElement.node), null) + val repository = PlatformRepositoryProvider.getInstance(project) + + val result: MutableMap = HashMap() + nodes.mapNotNull { + it.sourceNode.parent + }.forEach { + val declaration = repository.getAdapter(it, Declaration::class.java) + + if (declaration != null) { + result[declaration] = it + } + } + + return result + } +}