You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by jo...@apache.org on 2020/05/26 08:50:20 UTC

[isis] branch master updated: ISIS-2342 scale image 2/n, replacement works but scaling not yet

This is an automated email from the ASF dual-hosted git repository.

joergrade pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new ceccf9b  ISIS-2342 scale image 2/n, replacement works but scaling not yet
     new 4340168  Merge branch 'master' of https://github.com/apache/isis
ceccf9b is described below

commit ceccf9b865fd9a537adb7c90d94bd4f53e3738c3
Author: Jörg Rade <jo...@kuehne-nagel.com>
AuthorDate: Mon May 25 11:52:02 2020 +0200

    ISIS-2342 scale image 2/n, replacement works but scaling not yet
---
 .../kroviz/core/aggregator/DiagramDispatcher.kt    |  3 +-
 .../apache/isis/client/kroviz/ui/ImageDialog.kt    | 51 +++++-----------------
 .../apache/isis/client/kroviz/ui/kv/RoDialog.kt    | 25 ++++++++++-
 .../apache/isis/client/kroviz/utils/DomHelper.kt   | 44 ++++++++++++++-----
 .../client/kroviz/utils/ScalableVectorGraphic.kt   | 37 +++++++++++-----
 5 files changed, 95 insertions(+), 65 deletions(-)

diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/DiagramDispatcher.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/DiagramDispatcher.kt
index ace7afb..2ce0e7a 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/DiagramDispatcher.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/DiagramDispatcher.kt
@@ -1,10 +1,11 @@
 package org.apache.isis.client.kroviz.core.aggregator
 
+import org.apache.isis.client.kroviz.core.event.LogEntry
 import org.apache.isis.client.kroviz.utils.DomHelper
 
 class DiagramDispatcher(private val uuid: String) : BaseAggregator() {
 
-    override fun update(logEntry: org.apache.isis.client.kroviz.core.event.LogEntry, subType: String) {
+    override fun update(logEntry: LogEntry, subType: String) {
         val response = logEntry.response
         DomHelper.appendTo(response, uuid)
     }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/ImageDialog.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/ImageDialog.kt
index bd5ac96..a4166bd 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/ImageDialog.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/ImageDialog.kt
@@ -2,13 +2,12 @@ package org.apache.isis.client.kroviz.ui
 
 import org.apache.isis.client.kroviz.to.ValueType
 import org.apache.isis.client.kroviz.ui.kv.RoDialog
+import org.apache.isis.client.kroviz.utils.Direction
 import org.apache.isis.client.kroviz.utils.DomHelper
 import org.apache.isis.client.kroviz.utils.ScalableVectorGraphic
 import org.apache.isis.client.kroviz.utils.UmlUtils
-import org.w3c.dom.parsing.DOMParser
-import pl.treksoft.kvision.core.onEvent
-import kotlin.js.Date
 
+@ExperimentalUnsignedTypes
 class ImageDialog(
         var label: String = defaultLabel,
         var pumlCode: String = defaultPumlCode) : Command {
@@ -22,8 +21,9 @@ class ImageDialog(
                 "\""
     }
 
-    private val uuid: String = Date().toTimeString() //IMPROVE
+    val uuid: String = DomHelper.uuid()
     private var dialog: RoDialog
+    val formItems = mutableListOf<FormItem>()
 
     fun open() {
         dialog.open()
@@ -31,7 +31,6 @@ class ImageDialog(
     }
 
     init {
-        val formItems = mutableListOf<FormItem>()
         val img = FormItem("svg", ValueType.IMAGE.type, callBackId = uuid)
         formItems.add(img)
 
@@ -41,46 +40,18 @@ class ImageDialog(
                 items = formItems,
                 command = this,
                 heightPerc = 80)
-        console.log("[ImageDialog.init] $dialog")
- //       if (dialog.hasScalableContent()) {
-            dialog.onEvent {
-                keypress = { e ->
-                    console.log("[ImageDialog.open] keydown")
-                    console.log(e)
-                    if (e.key === "+" && e.ctrlKey) {
-                        scale(true)
-                        console.log("[<CTRL>-<Alt>-<+>]")
-                        e.stopPropagation()
-                        e.preventDefault()
-                    }
-                    if (e.key === "-" && e.ctrlKey) {
-                        scale(false)
-                        console.log("[<CTRL>-<Alt>-<->]")
-                        e.stopPropagation()
-                        e.preventDefault()
-                    }
-                }
-            }
- //       }
     }
 
-
-    private fun scale(upOrDown: Boolean) {
-        val mimeType = "image/svg+xml"
+    fun scale(direction: Direction) {
         val oldElement = DomHelper.getById(uuid)
-        val oldStr = oldElement.toString()
+        val oldStr = oldElement!!.innerHTML
         console.log(oldStr)
-        val p = DOMParser()
-        var svg = p.parseFromString(oldStr, mimeType)
-        val image = ScalableVectorGraphic(svg)
-        if (upOrDown) {
-            image.scaleUp()
-        } else {
-            image.scaleDown()
+        val newImage = ScalableVectorGraphic(oldStr)
+        when (direction) {
+            Direction.UP -> newImage.scaleUp()
+            Direction.DOWN -> newImage.scaleDown()
         }
-        val newStr = image.serialized()
-        svg = p.parseFromString(newStr, mimeType)
-        DomHelper.replaceWith(uuid, svg.documentElement!!)
+        DomHelper.replaceWith(uuid, newImage)
     }
 
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoDialog.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoDialog.kt
index d619817..d410d3b 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoDialog.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoDialog.kt
@@ -2,6 +2,7 @@ package org.apache.isis.client.kroviz.ui.kv
 
 import org.apache.isis.client.kroviz.to.ValueType
 import org.apache.isis.client.kroviz.ui.*
+import org.apache.isis.client.kroviz.utils.Direction
 import pl.treksoft.kvision.core.CssSize
 import pl.treksoft.kvision.core.UNIT
 import pl.treksoft.kvision.core.Widget
@@ -39,6 +40,22 @@ class RoDialog(
                 close()
             }
 
+    private val scaleUpButton = Button(
+            "",
+            "fas fa-plus",
+            ButtonStyle.OUTLINEINFO)
+            .onClick {
+                (command as ImageDialog).scale(Direction.UP)
+            }
+
+    private val scaleDownButton = Button(
+            "",
+            "fas fa-minus",
+            ButtonStyle.OUTLINEINFO)
+            .onClick {
+                (command as ImageDialog).scale(Direction.DOWN)
+            }
+
     var formPanel: FormPanel<String>? = null
 
     init {
@@ -63,6 +80,10 @@ class RoDialog(
             }
             buttonBar.add(okButton)
             buttonBar.add(cancelButton)
+            if (items.isNotEmpty() && hasScalableContent()) {
+                buttonBar.add(scaleDownButton)
+                buttonBar.add(scaleUpButton)
+            }
             add(buttonBar)
         }
     }
@@ -88,8 +109,8 @@ class RoDialog(
         dispose()
     }
 
-    fun hasScalableContent(): Boolean {
-        val scalable = items.first { it.type == ValueType.IMAGE.type }
+    private fun hasScalableContent(): Boolean {
+        val scalable = items.firstOrNull() { it.type == ValueType.IMAGE.type }
         return scalable != null
     }
 
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/DomHelper.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/DomHelper.kt
index b8e8278..a1414da 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/DomHelper.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/DomHelper.kt
@@ -1,8 +1,8 @@
 package org.apache.isis.client.kroviz.utils
 
 import org.w3c.dom.Element
-import org.w3c.dom.parsing.DOMParser
 import kotlin.browser.document
+import kotlin.random.Random
 
 external fun encodeURIComponent(encodedURI: String): String
 
@@ -11,20 +11,17 @@ external fun encodeURIComponent(encodedURI: String): String
  */
 object DomHelper {
 
-    fun appendTo(response: String, elementId: String, type: String = "image/svg+xml") {
-        val p = DOMParser()
-        val svg = p.parseFromString(response, type)
-        val element = document.getElementById(elementId)
-        element.asDynamic().appendChild(svg.documentElement)
+    fun appendTo(response: String, elementId: String) {
+        val svgDoc = ScalableVectorGraphic(response).document
+        val element = getById(elementId)
+        element.asDynamic().appendChild(svgDoc.documentElement)
     }
 
-    fun getById(elementId: String): Element {
-        return document.getElementById(elementId)!!
-    }
-
-    fun replaceWith(elementId: String, svgElement: Element) {
+    fun replaceWith(elementId: String, newImage: ScalableVectorGraphic) {
+        val svgDoc = newImage.document
         val element = getById(elementId)!!
-        element.replaceWith(svgElement)
+        element.firstChild?.let { element.removeChild(it) }
+        element.asDynamic().appendChild(svgDoc.documentElement)
     }
 
     fun download(filename: String, text: String) {
@@ -36,4 +33,27 @@ object DomHelper {
         document.body?.removeChild(element)
     }
 
+    fun getById(elementId: String): Element? {
+        return document.getElementById(elementId)
+    }
+
+    @ExperimentalUnsignedTypes
+    // Returns a 36-character string in the form
+    // XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
+    // 12345678 9012 3456 7890 123456789012
+    fun uuid(): String {
+        val abData = Random.Default.nextBytes(16)
+        abData[6] = (0x40 or (abData[6].toInt() and 0xf)).toByte()
+        abData[8] = (0x80 or (abData[8].toInt() and 0x3f)).toByte()
+
+        var strHex = abData.toHexString()
+        strHex = "$(strHex.substring(0, 8))-$(strHex.substring(8, 4))-$(strHex.substring(12, 4))-$(strHex.substring(16, 4))-$(strHex.substring(20, 12))"
+        return strHex
+    }
+
+    @ExperimentalUnsignedTypes // just to make it clear that the experimental unsigned types are used
+    fun ByteArray.toHexString() = asUByteArray().joinToString("") {
+        it.toString(16).padStart(2, '0')
+    }
+
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/ScalableVectorGraphic.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/ScalableVectorGraphic.kt
index 777ff76..d14a968 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/ScalableVectorGraphic.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/ScalableVectorGraphic.kt
@@ -1,30 +1,52 @@
 package org.apache.isis.client.kroviz.utils
 
 import org.w3c.dom.Document
+import org.w3c.dom.Element
+import org.w3c.dom.parsing.DOMParser
 import org.w3c.dom.parsing.XMLSerializer
 import org.w3c.dom.svg.SVGSVGElement
 
-class ScalableVectorGraphic(val document: Document) {
+enum class Direction(val id: String) {
+    UP("UP"),
+    DOWN("DOWN")
+}
+
+class ScalableVectorGraphic(val data: String) {
+
+    val parser = DOMParser()
+    val mimeType = "image/svg+xml"
+    var document: Document
+
+    init {
+        document = parser.parseFromString(data, mimeType)
+    }
+
+    fun asDocumentElement(): Element? {
+        val xs = XMLSerializer()
+        val str = xs.serializeToString(document)
+        val svg = parser.parseFromString(str, mimeType)
+        return svg.documentElement
+    }
 
     private fun root(): SVGSVGElement {
         return document.rootElement!!
     }
 
-    fun setHeight(height: Int) {
+    private fun setHeight(height: Int) {
         root().setAttribute("height", height.toString() + "px")
     }
 
-    fun getHeight(): Int {
+    private fun getHeight(): Int {
         val raw = root().getAttribute("height") as String
         val value = raw.replace("px", "")
         return value.toInt()
     }
 
-    fun setWidth(width: Int) {
+    private fun setWidth(width: Int) {
         root().setAttribute("width", width.toString() + "px")
     }
 
-    fun getWidth(): Int {
+    private fun getWidth(): Int {
         val raw = root().getAttribute("width") as String
         val value = raw.replace("px", "")
         return value.toInt()
@@ -43,9 +65,4 @@ class ScalableVectorGraphic(val document: Document) {
         scaleUp(factor * -1)
     }
 
-    fun serialized(): String {
-        val srlzr = XMLSerializer()
-        return srlzr.serializeToString(document)
-    }
-
 }