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)
- }
-
}