diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index 58d13c02c..85b274f26 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -9,23 +9,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
deleted file mode 100644
index 15a15b218..000000000
--- a/.idea/encodings.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/.idea/kotlinScripting.xml b/.idea/kotlinScripting.xml
deleted file mode 100644
index a6fe551d0..000000000
--- a/.idea/kotlinScripting.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 4981e477a..59b4d604e 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -10,6 +10,7 @@
+
diff --git a/code/cat_visual/src/main/kotlin/Main.kt b/code/cat_visual/src/main/kotlin/Main.kt
index 942d62ec4..879c16e8e 100644
--- a/code/cat_visual/src/main/kotlin/Main.kt
+++ b/code/cat_visual/src/main/kotlin/Main.kt
@@ -22,6 +22,7 @@ import androidx.compose.ui.zIndex
import canvas.items.impl.CustomItem
import canvas.items.impl.LampItem
import canvas.items.impl.TextItem
+import canvas.items.impl.ToggleItem
import canvas.items.interfaces.CanvasItemInterface
import canvas.items.model.JsonCanvasModel
import canvas.items.model.toItem
@@ -94,29 +95,62 @@ fun itemBar(
Column(
modifier = Modifier
.background(Color.LightGray)
- .width(100.dp)
+ .width(140.dp)
.fillMaxHeight()
.zIndex(-2f),
horizontalAlignment = Alignment.End,
) {
Button(
- modifier = Modifier.align(alignment = Alignment.CenterHorizontally),
+ modifier = Modifier.align(alignment = Alignment.CenterHorizontally).width(130.dp),
onClick = {
addNewItem(TextItem(content = "AddedText"))
}
) {
- Text(text = "Add text")
+ Text(text = "Text")
}
Button(
- modifier = Modifier.align(alignment = Alignment.CenterHorizontally),
+ modifier = Modifier.align(alignment = Alignment.CenterHorizontally).width(130.dp),
onClick = {
addNewItem(LampItem(client = client))
}
) {
- Text(text = "Add lamp")
+ Text(text = "Lamp")
}
Button(
- modifier = Modifier.align(alignment = Alignment.CenterHorizontally),
+ modifier = Modifier.align(alignment = Alignment.CenterHorizontally).width(130.dp),
+ onClick = {
+ addNewItem(ToggleItem(client = client))
+ }
+ ) {
+ Text(text = "Toggle")
+ }
+ Button(
+ modifier = Modifier.align(alignment = Alignment.CenterHorizontally).width(130.dp),
+ onClick = {
+ addNewItem(LampItem(client = client))
+ }
+ ) {
+ Text(text = "Box")
+ }
+ Button(
+ modifier = Modifier.align(alignment = Alignment.CenterHorizontally).width(130.dp),
+ onClick = {
+ addNewItem(LampItem(client = client))
+ }
+ ) {
+ Text(text = "CheckBox")
+ }
+ Button(
+ modifier = Modifier.align(alignment = Alignment.CenterHorizontally).width(130.dp),
+ onClick = {
+ addNewItem(LampItem(client = client))
+ }
+ ) {
+ Text(text = "RadioButton")
+ }
+
+ Button(
+ modifier = Modifier.align(alignment = Alignment.CenterHorizontally).width(130.dp),
onClick = {
val x = itemList.map {it.toModel()}
val json = Json.encodeToString(x)
@@ -142,7 +176,6 @@ fun main() = application {
.fillMaxWidth()
.fillMaxHeight(),
) {
-// CounterLampHMI(client, "1")
itemBar(itemList) { item ->
itemList += listOf(item)
}
diff --git a/code/cat_visual/src/main/kotlin/canvas/items/impl/LampItem.kt b/code/cat_visual/src/main/kotlin/canvas/items/impl/LampItem.kt
index 8b24df8df..041b0efa3 100644
--- a/code/cat_visual/src/main/kotlin/canvas/items/impl/LampItem.kt
+++ b/code/cat_visual/src/main/kotlin/canvas/items/impl/LampItem.kt
@@ -3,17 +3,21 @@ package canvas.items.impl
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
-import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.CircleShape
+import androidx.compose.material.DropdownMenu
+import androidx.compose.material.DropdownMenuItem
+import androidx.compose.material.Switch
import androidx.compose.material.Text
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.remember
+import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.RectangleShape
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
import canvas.items.Draggable
import canvas.items.interfaces.CanvasItemInterface
import canvas.items.interfaces.Focusable
@@ -50,22 +54,65 @@ class LampItem(
val localDensity = LocalDensity.current
val xPosition = remember { mutableStateOf(x) }
val yPosition = remember { mutableStateOf(y) }
- val focusRequester = remember { FocusRequester() }
- val color = remember { mutableStateOf(Color.Black) }
- Round(
+ var connectMenu by remember { mutableStateOf( false) }
+ var expandedDropDownMenu by remember { mutableStateOf(false) }
+ val idStaq by remember {mutableStateOf(id.toString())}
+ Box(
modifier = modifier
.makeDraggable(localDensity, xPosition, yPosition)
- .makeFocusable(focusRequester, color)
.background(brush = if (isLighting.value) LIGHT_RADIAL_BRUSH else DARK_RADIAL_BRUSH)
- .border(width = 10.dp, brush = METALLIC_BRUSH, shape = CircleShape)
- .clickable {
- isLighting.value = if (isLighting.value) false else true
- println("${xPosition.value} : ${yPosition.value}")
+ .border(width = 10.dp, brush = METALLIC_BRUSH, shape = RectangleShape)
+ .clickable{
+ expandedDropDownMenu = !expandedDropDownMenu
}
- .wrapContentSize(),
- height = 60.dp,
- width = 60.dp,
- )
+ .width(60.dp)
+ .height(60.dp)
+ ) {
+ DropdownMenu(
+ expanded = expandedDropDownMenu,
+ onDismissRequest = {
+ expandedDropDownMenu = false
+ },
+ modifier = Modifier.width(200.dp)
+ ) {
+ DropdownMenuItem(onClick = {
+ deleteCurrentItem(idStaq)
+ }) {
+ Text(
+ text = "Удалить",
+ modifier = Modifier
+ .padding(5.dp),
+ fontSize = 15.sp,
+ )
+ }
+ DropdownMenuItem(
+ onClick = {
+ connectMenu = !connectMenu
+ },
+ ) {
+ Text(
+ text = "Соединить",
+ modifier = Modifier
+ .padding(5.dp),
+ fontSize = 15.sp,
+ )
+ }
+ if (connectMenu) {
+ DropdownMenuItem(
+ onClick = {
+ connectMenu = false
+ },
+ ) {
+ Text(
+ text = "Lamp 1",
+ modifier = Modifier
+ .padding(10.dp),
+ fontSize = 15.sp,
+ )
+ }
+ }
+ }
+ }
x = xPosition.value
y = yPosition.value
}
diff --git a/code/cat_visual/src/main/kotlin/canvas/items/impl/ToggleItem.kt b/code/cat_visual/src/main/kotlin/canvas/items/impl/ToggleItem.kt
new file mode 100644
index 000000000..6f5f3de27
--- /dev/null
+++ b/code/cat_visual/src/main/kotlin/canvas/items/impl/ToggleItem.kt
@@ -0,0 +1,111 @@
+package canvas.items.impl
+
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.*
+import androidx.compose.material.*
+import androidx.compose.runtime.*
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.focus.FocusRequester
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import canvas.items.Draggable
+import canvas.items.interfaces.CanvasItemInterface
+import canvas.items.interfaces.Focusable
+import connection.AbstractClient
+import java.util.*
+
+class ToggleItem(
+ override val id: UUID = UUID.randomUUID(),
+ override var x: Float = 0f,
+ override var y: Float = 0f,
+ override val modifier: Modifier = Modifier,
+ override val client: AbstractClient,
+): AbstractItem(
+ x = x,
+ y = y,
+ modifier = modifier,
+ inputs = listOf(),
+ outputs = listOf(),
+ client = client,
+), Draggable, Focusable {
+
+
+ override val type = CanvasItemInterface.Type.TOGGLE
+
+ @Composable
+ override fun getContent(deleteCurrentItem: (String) -> Unit) {
+ val localDensity = LocalDensity.current
+ val xPosition = remember { mutableStateOf(x) }
+ val yPosition = remember { mutableStateOf(y) }
+ val focusRequester = remember { FocusRequester() }
+ val color = remember { mutableStateOf(Color.Black) }
+ val checkedStateToggle = remember { mutableStateOf(false) }
+ var connectMenu by remember { mutableStateOf( false) }
+ var expandedDropDownMenu by remember { mutableStateOf(false) }
+ val idStaq by remember {mutableStateOf(id.toString())}
+ Box(
+ modifier.makeDraggable(localDensity, xPosition, yPosition)
+ .makeFocusable(focusRequester, color)
+ .clickable{
+ expandedDropDownMenu = !expandedDropDownMenu
+ }
+ ) {
+ Switch(
+ modifier = modifier
+ .size(50.dp)
+ .wrapContentSize(),
+ checked = checkedStateToggle.value,
+ onCheckedChange = {checkedStateToggle.value = !checkedStateToggle.value},
+ )
+ DropdownMenu(
+ expanded = expandedDropDownMenu,
+ onDismissRequest = {
+ expandedDropDownMenu = false
+ },
+ modifier = Modifier.width(200.dp)
+ ) {
+ DropdownMenuItem(onClick = {
+ deleteCurrentItem(idStaq)
+ }) {
+ Text(
+ text = "Удалить",
+ modifier = Modifier
+ .padding(5.dp),
+ fontSize = 15.sp,
+ )
+ }
+ DropdownMenuItem(
+ onClick = {
+ connectMenu = !connectMenu
+ },
+ ) {
+ Text(
+ text = "Соединить",
+ modifier = Modifier
+ .padding(5.dp),
+ fontSize = 15.sp,
+ )
+ }
+ if (connectMenu) {
+ DropdownMenuItem(
+ onClick = {
+ connectMenu = false
+ },
+ ) {
+ Text(
+ text = "Toggle 1",
+ modifier = Modifier
+ .padding(10.dp),
+ fontSize = 15.sp,
+ )
+ }
+ }
+ }
+ }
+ x = xPosition.value
+ y = yPosition.value
+ }
+}
\ No newline at end of file
diff --git a/code/cat_visual/src/main/kotlin/canvas/items/interfaces/CanvasItemInterface.kt b/code/cat_visual/src/main/kotlin/canvas/items/interfaces/CanvasItemInterface.kt
index ef767567b..11d5a3285 100644
--- a/code/cat_visual/src/main/kotlin/canvas/items/interfaces/CanvasItemInterface.kt
+++ b/code/cat_visual/src/main/kotlin/canvas/items/interfaces/CanvasItemInterface.kt
@@ -23,6 +23,7 @@ interface CanvasItemInterface {
enum class Type {
TEXT,
LAMP,
+ TOGGLE,
UNKNOWN,
}
}
\ No newline at end of file
diff --git a/code/cat_visual/src/main/kotlin/canvas/items/model/JsonCanvasModel.kt b/code/cat_visual/src/main/kotlin/canvas/items/model/JsonCanvasModel.kt
index 5153435dd..bbb83ec89 100644
--- a/code/cat_visual/src/main/kotlin/canvas/items/model/JsonCanvasModel.kt
+++ b/code/cat_visual/src/main/kotlin/canvas/items/model/JsonCanvasModel.kt
@@ -4,9 +4,11 @@ import androidx.compose.ui.Modifier
import canvas.exceptions.UnknownTypeItemException
import canvas.items.impl.LampItem
import canvas.items.impl.TextItem
+import canvas.items.impl.ToggleItem
import canvas.items.interfaces.CanvasItemInterface
import connection.AbstractClient
import kotlinx.serialization.Serializable
+import lib.elements.setters.Toggle
import java.util.*
@Serializable
@@ -34,5 +36,11 @@ fun JsonCanvasModel.toItem(client: AbstractClient): CanvasItemInterface =
y = y,
client = client,
)
+ CanvasItemInterface.Type.TOGGLE.name -> ToggleItem(
+ id = UUID.fromString(id),
+ x = x,
+ y = y,
+ client = client
+ )
else -> throw UnknownTypeItemException(id, type)
}
\ No newline at end of file
diff --git a/code/cat_visual/src/main/kotlin/canvas/items/model/figures/Templates.kt b/code/cat_visual/src/main/kotlin/canvas/items/model/figures/Templates.kt
index 23fcee40e..90d998000 100644
--- a/code/cat_visual/src/main/kotlin/canvas/items/model/figures/Templates.kt
+++ b/code/cat_visual/src/main/kotlin/canvas/items/model/figures/Templates.kt
@@ -17,5 +17,6 @@ fun Round(modifier: Modifier, width: Dp, height: Dp) {
.width(width)
.height(height)
.clip(CircleShape)
- )
+ ){
+ }
}
\ No newline at end of file
diff --git a/code/cat_visual/src/main/kotlin/config/example.cfg b/code/cat_visual/src/main/kotlin/config/example.cfg
index 5807dfa1e..885cdc0ed 100644
--- a/code/cat_visual/src/main/kotlin/config/example.cfg
+++ b/code/cat_visual/src/main/kotlin/config/example.cfg
@@ -1,12 +1,17 @@
-
-
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/code/cat_visual/src/main/kotlin/serializer/SerializationUtils.kt b/code/cat_visual/src/main/kotlin/serializer/SerializationUtils.kt
index 5b48fbd58..63faa3390 100644
--- a/code/cat_visual/src/main/kotlin/serializer/SerializationUtils.kt
+++ b/code/cat_visual/src/main/kotlin/serializer/SerializationUtils.kt
@@ -26,11 +26,11 @@ class SerializationUtils {
private const val PATH: String = "/Users/sj/IdeaProjects/fbme/code/cat_visual/src/main/kotlin/serializer/saved"
fun saveSnapshot(json: String) {
- File(PATH, "test.json").writeText(json)
+ File(PATH, "example.json").writeText(json)
}
fun readSnapshot(): String {
- return File(PATH, "test.json").readText()
+ return File(PATH, "example.json").readText()
}
}
}
\ No newline at end of file
diff --git a/code/cat_visual/src/main/kotlin/serializer/saved/example.json b/code/cat_visual/src/main/kotlin/serializer/saved/example.json
new file mode 100644
index 000000000..4350fec07
--- /dev/null
+++ b/code/cat_visual/src/main/kotlin/serializer/saved/example.json
@@ -0,0 +1,38 @@
+[
+ {
+ "id": "7039d520-eb99-468f-9d7b-78c770588bb8",
+ "x": 250.0,
+ "y": -148.0,
+ "inputs": [],
+ "outputs": [],
+ "content": "Другой текст",
+ "type": "TEXT"
+ },
+ {
+ "id": "9728343a-a291-4d53-81bd-f4a95d2fec51",
+ "x": 421.75,
+ "y": 72.0,
+ "inputs": ["A8B344E30F0BAEE1"],
+ "outputs": ["A8B344E30FJH72F1"],
+ "content": "Тест",
+ "type": "TEXT"
+ },
+ {
+ "id": "1b4267f9-3d0f-43c5-b2db-a2a021725783",
+ "x": 246.0,
+ "y": 227.75,
+ "inputs": ["A8B344E30F0BAEE1"],
+ "outputs": ["A8B344E30FJH72F1"],
+ "content": "null",
+ "type": "LAMP"
+ },
+ {
+ "id": "c65328fe-8452-45d7-a054-454ed65aa2a6",
+ "x": 601.75,
+ "y": 132.0,
+ "inputs": ["B8B344E30F0BAEE1"],
+ "outputs": ["C8B344E30FJH72F1"],
+ "content": "null",
+ "type": "TOGGLE"
+ }
+]
\ No newline at end of file
diff --git a/code/cat_visual/src/main/kotlin/serializer/saved/test.json b/code/cat_visual/src/main/kotlin/serializer/saved/test.json
deleted file mode 100644
index 3cce12eae..000000000
--- a/code/cat_visual/src/main/kotlin/serializer/saved/test.json
+++ /dev/null
@@ -1,20 +0,0 @@
-[
- {
- "id": "1a83b4d3-98a2-47e2-b4f5-7a2c05ccc356",
- "x": 604.0,
- "y": 84.25,
- "inputs": [],
- "outputs": [],
- "content": "null",
- "type": "LAMP"
- },
- {
- "id": "997d8f1c-bfb6-4ade-8ac9-bdfb70a0e0cb",
- "x": 0.0,
- "y": 0.0,
- "inputs": [],
- "outputs": [],
- "content": "qwerty",
- "type": "TEXT"
- }
-]
\ No newline at end of file
diff --git a/code/language/languages/org.fbme.ide.st.lang/models/org.fbme.ide.st.lang.editor.mps b/code/language/languages/org.fbme.ide.st.lang/models/org.fbme.ide.st.lang.editor.mps
index 5a947bc38..f87885d00 100644
--- a/code/language/languages/org.fbme.ide.st.lang/models/org.fbme.ide.st.lang.editor.mps
+++ b/code/language/languages/org.fbme.ide.st.lang/models/org.fbme.ide.st.lang.editor.mps
@@ -40,6 +40,9 @@
+
+
+
@@ -312,6 +315,7 @@
+
@@ -412,6 +416,9 @@
+
+
+
@@ -492,6 +499,7 @@
+
@@ -531,6 +539,9 @@
+
+
+
@@ -564,6 +575,7 @@
+
@@ -706,7 +718,7 @@
-
+
@@ -960,6 +972,9 @@
+
+
+
@@ -994,6 +1009,9 @@
+
+
+
@@ -9077,7 +9095,7 @@
-
+
@@ -9704,7 +9722,7 @@
-
+
@@ -9713,12 +9731,12 @@
-
+
-
+
@@ -9874,5 +9892,248 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/code/library/src/main/kotlin/org/fbme/lib/iec61499/stringify/BasicFBTypePrinter.kt b/code/library/src/main/kotlin/org/fbme/lib/iec61499/stringify/BasicFBTypePrinter.kt
index 1824e429d..0c00bfbc7 100644
--- a/code/library/src/main/kotlin/org/fbme/lib/iec61499/stringify/BasicFBTypePrinter.kt
+++ b/code/library/src/main/kotlin/org/fbme/lib/iec61499/stringify/BasicFBTypePrinter.kt
@@ -64,11 +64,11 @@ class BasicFBTypePrinter(declaration: BasicFBTypeDeclaration) :
val conditionText: String = when {
guardCondition == null && eventPresentation.isEmpty() -> "1"
guardCondition != null && eventPresentation.isEmpty() -> {
- "[" + escapeXML(STPrinter.printExpression(guardCondition)) + "]"
+ "[" + STPrinter.printExpression(guardCondition) + "]"
}
guardCondition == null -> eventPresentation
- else -> "$eventPresentation[" + escapeXML(STPrinter.printExpression(guardCondition)) + "]"
+ else -> "$eventPresentation[" + STPrinter.printExpression(guardCondition) + "]"
}
element.setAttribute("Condition", conditionText)
return element
@@ -82,12 +82,12 @@ class BasicFBTypePrinter(declaration: BasicFBTypeDeclaration) :
ParameterDeclarationPrinter.printAll(this.element.temporaryVariables, element)
if (language === AlgorithmLanguage.ST) {
val st = Element("ST")
- st.setAttribute("Text", escapeXML(STPrinter.printStatementList((body as AlgorithmBody.ST).statements)))
+ st.setAttribute("Text", STPrinter.printStatementList((body as AlgorithmBody.ST).statements))
element.addContent(st)
} else if (AlgorithmLanguage.isUnknown(language)) {
val other = Element("Other")
other.setAttribute("Language", language.languageName)
- other.setAttribute("Text", escapeXML((body as AlgorithmBody.Unknown).text))
+ other.setAttribute("Text", (body as AlgorithmBody.Unknown).text)
element.addContent(other)
} else {
throw IllegalStateException("Unrecognized language")
diff --git a/code/library/src/main/kotlin/org/fbme/lib/iec61499/stringify/PrinterBase.kt b/code/library/src/main/kotlin/org/fbme/lib/iec61499/stringify/PrinterBase.kt
index bf53e39ae..4bae075d4 100644
--- a/code/library/src/main/kotlin/org/fbme/lib/iec61499/stringify/PrinterBase.kt
+++ b/code/library/src/main/kotlin/org/fbme/lib/iec61499/stringify/PrinterBase.kt
@@ -13,17 +13,5 @@ abstract class PrinterBase(protected val element: ElementT)
}
parent.addContent(child)
}
-
- @JvmStatic
- protected fun escapeXML(text: String?): String? {
- var text = text ?: return null
- text = text.replace("\n", "
")
- text = text.replace("\"", """)
- text = text.replace("&", "&")
- text = text.replace("'", "'")
- text = text.replace("<", "<")
- text = text.replace(">", ">")
- return text
- }
}
}
diff --git a/code/library/src/main/kotlin/org/fbme/lib/iec61499/stringify/RootDeclarationPrinter.kt b/code/library/src/main/kotlin/org/fbme/lib/iec61499/stringify/RootDeclarationPrinter.kt
index bda80f13a..959a941e0 100644
--- a/code/library/src/main/kotlin/org/fbme/lib/iec61499/stringify/RootDeclarationPrinter.kt
+++ b/code/library/src/main/kotlin/org/fbme/lib/iec61499/stringify/RootDeclarationPrinter.kt
@@ -8,7 +8,7 @@ import org.jdom.DocType
import org.jdom.Document
import org.jdom.Element
-class RootDeclarationPrinter(private val myDeclaration: Declaration, val converterArguments: Iec61499ConverterConfiguration) {
+class RootDeclarationPrinter(private val myDeclaration: Declaration, private val converterArguments: Iec61499ConverterConfiguration) {
fun print(): Document {
val rootElement: Element = when (myDeclaration) {
is AdapterTypeDeclaration -> AdapterTypePrinter(myDeclaration).print()
diff --git a/code/nxt-integration/src/test/java/org/fbme/integration/nxt/importer/BasicFbTypeNxtImporterTest.java b/code/nxt-integration/src/test/java/org/fbme/integration/nxt/importer/BasicFbTypeNxtImporterTest.java
deleted file mode 100644
index 91c1579b7..000000000
--- a/code/nxt-integration/src/test/java/org/fbme/integration/nxt/importer/BasicFbTypeNxtImporterTest.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.fbme.integration.nxt.importer;
-
-import org.fbme.ide.platform.testing.PlatformTestBase;
-import org.fbme.ide.platform.testing.PlatformTestRunner;
-import org.fbme.lib.iec61499.declarations.BasicFBTypeDeclaration;
-import org.fbme.lib.iec61499.stringify.BasicFBTypePrinter;
-import org.fbme.lib.st.types.ElementaryType;
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(PlatformTestRunner.class)
-public class BasicFbTypeNxtImporterTest extends PlatformTestBase {
- @Test
- public void parseTest1() {
- var fbType = rootConverterByPath("/boolMerge.fbt", NxtImporterConfiguration.FACTORY).convertFBType();
- Assert.assertNotNull(fbType);
- }
-
- @Test
- public void testParseAlgorithmWithTemporaryVariables() {
- var fbType = rootConverterByPath("/AlgorithmWithTemporaryVariables.fbt", NxtImporterConfiguration.FACTORY).convertFBType();
- Assert.assertTrue(fbType instanceof BasicFBTypeDeclaration);
- var basicFbType = (BasicFBTypeDeclaration) fbType;
- var algorithm = basicFbType.getAlgorithms().get(0);
- Assert.assertNotNull(algorithm);
- var temporaryVariable = algorithm.getTemporaryVariables().get(0);
- Assert.assertNotNull(temporaryVariable);
- Assert.assertEquals("temp", temporaryVariable.getName());
- Assert.assertEquals(ElementaryType.INT, temporaryVariable.getType());
- }
-}
diff --git a/code/platform/src/main/kotlin/org/fbme/ide/platform/persistence/Iec61499ModelFactory.kt b/code/platform/src/main/kotlin/org/fbme/ide/platform/persistence/Iec61499ModelFactory.kt
index 14c0a0e65..02e5e0ebc 100644
--- a/code/platform/src/main/kotlin/org/fbme/ide/platform/persistence/Iec61499ModelFactory.kt
+++ b/code/platform/src/main/kotlin/org/fbme/ide/platform/persistence/Iec61499ModelFactory.kt
@@ -9,18 +9,11 @@ import jetbrains.mps.extapi.model.SModelData
import jetbrains.mps.extapi.model.SModelSimpleHeader
import jetbrains.mps.extapi.persistence.FileDataSource
import jetbrains.mps.ide.MPSCoreComponents
-import jetbrains.mps.internal.collections.runtime.ISelector
import jetbrains.mps.internal.collections.runtime.ListSequence
import jetbrains.mps.persistence.DataLocationAwareModelFactory
import jetbrains.mps.smodel.SModel.ImportElement
import jetbrains.mps.smodel.SModelId
import jetbrains.mps.smodel.SNodeUtil
-import jetbrains.mps.smodel.adapter.ids.SContainmentLinkId
-import jetbrains.mps.smodel.adapter.ids.SPropertyId
-import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory
-import jetbrains.mps.smodel.adapter.structure.link.SContainmentLinkAdapter
-import jetbrains.mps.smodel.adapter.structure.link.SContainmentLinkAdapterById
-import jetbrains.mps.smodel.adapter.structure.property.SPropertyAdapter
import jetbrains.mps.util.FileUtil
import jetbrains.mps.util.JDOMUtil
import jetbrains.mps.util.NameUtil
@@ -30,14 +23,10 @@ import org.fbme.ide.iec61499.repository.PlatformElement
import org.fbme.ide.iec61499.repository.PlatformElementsOwner
import org.fbme.ide.iec61499.repository.PlatformRepository
import org.fbme.ide.platform.MpsLanguages
-import org.fbme.ide.platform.converter.PlatformConverter
import org.fbme.ide.platform.converter.PlatformConverter.create
import org.fbme.lib.common.Declaration
import org.fbme.lib.common.RootElement
import org.fbme.lib.iec61499.declarations.*
-import org.fbme.lib.iec61499.parser.Iec61499ConverterConfiguration
-import org.fbme.lib.iec61499.parser.StandardIec61499ConverterConfiguration
-import org.fbme.lib.iec61499.stringify.DependentDeclarationGenerator
import org.fbme.lib.iec61499.stringify.RootDeclarationPrinter
import org.jdom.Document
import org.jetbrains.mps.openapi.model.SModel
@@ -55,7 +44,6 @@ import java.io.InputStreamReader
import java.io.OutputStream
import java.util.*
import java.util.stream.Collectors
-import kotlin.io.path.Path
class Iec61499ModelFactory : ModelFactory, DataLocationAwareModelFactory {
private fun supportedFileExtension(fileExt: String): Boolean {
@@ -66,7 +54,6 @@ class Iec61499ModelFactory : ModelFactory, DataLocationAwareModelFactory {
|| fileExt == DEV_FILE_EXT
|| fileExt == SYS_FILE_EXT
|| fileExt == SEG_FILE_EXT
- || fileExt == CFG_FILE_EXT
}
override fun supports(dataSource: DataSource): Boolean {
@@ -251,12 +238,7 @@ class Iec61499ModelFactory : ModelFactory, DataLocationAwareModelFactory {
val importedModels = model.importedModels()
val richHeader = Iec61499ModelHeader(
header.modelReference,
- ListSequence.fromList(importedModels)
- .select(object : ISelector() {
- override fun select(it: ImportElement): SModelReference {
- return it.modelReference
- }
- }).toListSequence()
+ importedModels.map { it.modelReference }
)
richHeader.save(headerOS)
} finally {
@@ -280,46 +262,16 @@ class Iec61499ModelFactory : ModelFactory, DataLocationAwareModelFactory {
.getComponent(MPSCoreComponents::class.java).moduleRepository
val platformRepository = PlatformRepository(repository)
- val nodesToDelete = mutableListOf()
- val dependents = mutableListOf()
+ val errors = arrayListOf()
+ // Write nodes to xml files
for (rootNode in model.rootNodes) {
- if (rootNode.getProperty(SNodeUtil.property_BaseConcept_virtualPackage).orEmpty().endsWith("_dependent")) {
-// c.dropReference(it.link)
- nodesToDelete.add(rootNode)
+ val document = try {
+ val declaration = platformRepository.getAdapter(rootNode, Declaration::class.java)
+ RootDeclarationPrinter(declaration).print()
+ } catch (e: Exception) {
+ errors += PersistenceProblem(SModel.Problem.Kind.Save, e.message, rootNode.name, true)
continue
}
- val owner = PlatformElementsOwner()
- val conf = PlatformConverter.STANDARD_CONFIG_FACTORY.createConfiguration(owner)
- val declaration = platformRepository.getAdapter(rootNode, Declaration::class.java)
-
- val els = DependentDeclarationGenerator(declaration, conf).generate()
- els.forEach { element ->
- val node = (element as PlatformElement).node
- node.setProperty(SNodeUtil.property_BaseConcept_virtualPackage, rootNode.getProperty(SNodeUtil.property_BaseConcept_virtualPackage).orEmpty() + ".${rootNode.name}_dependent")
- dependents.add(node)
- }
- }
-
- LOG.info("Deleting nodes size: {}", nodesToDelete.size)
- nodesToDelete.forEach {
- model.enterUpdateMode()
- model.removeRootNode(it)
- it.delete()
- model.leaveUpdateMode()
- }
- LOG.info("Dependents size: {}", dependents.size)
- dependents.forEach {
- model.enterUpdateMode()
- model.addRootNode(it)
- model.leaveUpdateMode()
- }
-
- // Write nodes to xml files
- for (rootNode in model.rootNodes) {
- val conf = StandardIec61499ConverterConfiguration(platformRepository.iec61499Factory, platformRepository.stFactory)
-
- val declaration = platformRepository.getAdapter(rootNode, Declaration::class.java)
- val document = RootDeclarationPrinter(declaration!!, conf).print()
val folderName =
rootNode.getProperty(SNodeUtil.property_BaseConcept_virtualPackage).orEmpty().replace(".", "/")
val fileLocalName = rootNode.name + "." + getExtensionOfSource(rootNode, platformRepository)
@@ -338,6 +290,10 @@ class Iec61499ModelFactory : ModelFactory, DataLocationAwareModelFactory {
for (file in trackedSources) {
file.delete()
}
+
+ if (errors.isNotEmpty()) {
+ throw ModelSaveException("Multiple errors raised during save", errors, null)
+ }
} catch (e: IOException) {
LOG.error("Exception raised during save", e)
throw ModelSaveException("Exception raised during save", emptyList(), e)
@@ -345,8 +301,6 @@ class Iec61499ModelFactory : ModelFactory, DataLocationAwareModelFactory {
}
}
-
-
companion object {
private val LOG = LoggerFactory.getLogger(Iec61499ModelFactory::class.java)
@@ -357,7 +311,6 @@ class Iec61499ModelFactory : ModelFactory, DataLocationAwareModelFactory {
const val DEV_FILE_EXT = "dev"
const val SEG_FILE_EXT = "seg"
const val SYS_FILE_EXT = "sys"
- const val CFG_FILE_EXT = "cfg"
const val HEADER_FILE_EXT = "iec61499"
const val HEADER_FILE = "header.iec61499"
@@ -391,7 +344,6 @@ class Iec61499ModelFactory : ModelFactory, DataLocationAwareModelFactory {
DEV_FILE_EXT -> (converter.convertDeviceType() as PlatformElement).node
SEG_FILE_EXT -> (converter.convertSegmentType() as PlatformElement).node
SYS_FILE_EXT -> (converter.convertSystemConfiguration() as PlatformElement).node
- CFG_FILE_EXT -> (converter.convertCATConfiguration() as PlatformElement).node
else -> null
}
}
@@ -406,7 +358,6 @@ class Iec61499ModelFactory : ModelFactory, DataLocationAwareModelFactory {
is DeviceTypeDeclaration -> DEV_FILE_EXT
is SegmentTypeDeclaration -> SEG_FILE_EXT
is SystemDeclaration -> SYS_FILE_EXT
- is CATBlockTypeDeclaration -> CFG_FILE_EXT
else -> null
}
}