Skip to content

Commit af24e60

Browse files
committed
Merge remote-tracking branch 'origin/galite-02GR' :
- Fix : Implement ImageHandler in Vaadin Flow to fix fatal error when loading an image list and show images on the list [APPS-02GR][PR#642]
2 parents 3609a71 + 3d02092 commit af24e60

File tree

8 files changed

+88
-32
lines changed

8 files changed

+88
-32
lines changed

galite-core/src/main/java/org/kopi/vkopi/lib/ui/swing/visual/JImageHandler.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,14 +102,14 @@ public JImage(URL location) {
102102
/**
103103
*
104104
*/
105-
public int getWidth() {
105+
public int getImageWidth() {
106106
return getIconWidth();
107107
}
108108

109109
/**
110110
*
111111
*/
112-
public int getHeight() {
112+
public int getImageHeight() {
113113
return getIconHeight();
114114
}
115115

galite-core/src/main/kotlin/org/kopi/galite/visual/base/Image.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,13 @@ interface Image : Serializable {
3030
* Returns the `Image` width
3131
* @return The image width
3232
*/
33-
fun getWidth(): Int
33+
fun getImageWidth(): Int
3434

3535
/**
3636
* Returns the `Image` height
3737
* @return The image height
3838
*/
39-
fun getHeight(): Int
39+
fun getImageHeight(): Int
4040

4141
/**
4242
* Returns the `Image` description

galite-core/src/main/kotlin/org/kopi/galite/visual/list/VColorColumn.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class VColorColumn(title: String,
3737
column,
3838
table,
3939
VConstants.ALG_LEFT,
40-
7,
40+
12,
4141
sortAscending) {
4242

4343
// --------------------------------------------------------------------

galite-core/src/main/kotlin/org/kopi/galite/visual/ui/vaadin/base/Image.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,22 +18,23 @@
1818
package org.kopi.galite.visual.ui.vaadin.base
1919

2020
import org.kopi.galite.visual.base.Image
21+
import org.kopi.galite.visual.ui.vaadin.common.VImage
2122

2223
/**
2324
* The vaadin implementation of an image model.
2425
*
2526
* @param resource The resource file attached to this image.
2627
*/
27-
class Image(val resource: String) : Image {
28+
class Image(val resource: String = "image", val source: ByteArray? = null) : VImage(), Image {
2829
//---------------------------------------------------
2930
// IMAGE IMPLEMENTATION
3031
//---------------------------------------------------
3132

32-
override fun getWidth(): Int {
33+
override fun getImageWidth(): Int {
3334
return -1
3435
}
3536

36-
override fun getHeight(): Int {
37+
override fun getImageHeight(): Int {
3738
return -1
3839
}
3940

galite-core/src/main/kotlin/org/kopi/galite/visual/ui/vaadin/common/VImage.kt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,16 @@
1717
*/
1818
package org.kopi.galite.visual.ui.vaadin.common
1919

20+
import java.time.LocalDateTime
21+
import java.time.format.DateTimeFormatter
22+
2023
import com.vaadin.flow.component.Focusable
2124
import com.vaadin.flow.component.html.Image
2225

2326
/**
2427
* A widget that wraps image element.
2528
*/
26-
class VImage : Image(), Focusable<VImage> {
29+
open class VImage : Image(), Focusable<VImage> {
2730
//---------------------------------------------------
2831
// IMPLEMENTATIONS
2932
//---------------------------------------------------
@@ -41,4 +44,13 @@ class VImage : Image(), Focusable<VImage> {
4144
*/
4245
val isEmpty: Boolean
4346
get() = src == null || "" == src
47+
48+
/**
49+
* Creates the dynamic image name.
50+
* @param baseName The base name.
51+
* @return The dynamic image name.
52+
*/
53+
fun createFileName(baseName: String): String =
54+
baseName + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS")) + ".png"
4455
}
56+

galite-core/src/main/kotlin/org/kopi/galite/visual/ui/vaadin/list/ListFilter.kt

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,20 @@ class ListFilter(private val filterFields: List<TextField>,
3131

3232
override fun test(t: ListTable.ListDialogItem): Boolean {
3333
for (i in model.columns.indices) {
34-
val filterString = if(ignoreCase) filterFields[i].value.lowercase(Locale.getDefault()) else filterFields[i].value
35-
val value = if (ignoreCase) t.getValueAt(i).lowercase(Locale.getDefault()) else t.getValueAt(i)
34+
val item = t.getValueAt(i)
3635

37-
if (onlyMatchPrefix) {
38-
if (!value.startsWith(filterString)) {
39-
return false
40-
}
41-
} else {
42-
if (!value.contains(filterString)) {
43-
return false
36+
if (item is String) {
37+
val filterString = if(ignoreCase) filterFields[i].value.lowercase(Locale.getDefault()) else filterFields[i].value
38+
val value = if (ignoreCase) item.lowercase(Locale.getDefault()) else item
39+
40+
if (onlyMatchPrefix) {
41+
if (!value.startsWith(filterString)) {
42+
return false
43+
}
44+
} else {
45+
if (!value.contains(filterString)) {
46+
return false
47+
}
4448
}
4549
}
4650
}

galite-core/src/main/kotlin/org/kopi/galite/visual/ui/vaadin/list/ListTable.kt

Lines changed: 51 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,12 @@
1717
*/
1818
package org.kopi.galite.visual.ui.vaadin.list
1919

20+
import java.io.ByteArrayInputStream
21+
2022
import org.kopi.galite.visual.form.VListDialog
23+
import org.kopi.galite.visual.list.VImageColumn
24+
import org.kopi.galite.visual.ui.vaadin.base.Image
25+
import org.kopi.galite.visual.ui.vaadin.form.DImageField
2126

2227
import com.vaadin.flow.component.ComponentEventListener
2328
import com.vaadin.flow.component.KeyDownEvent
@@ -30,6 +35,7 @@ import com.vaadin.flow.component.icon.Icon
3035
import com.vaadin.flow.component.icon.VaadinIcon
3136
import com.vaadin.flow.component.textfield.TextField
3237
import com.vaadin.flow.data.provider.ListDataProvider
38+
import com.vaadin.flow.data.renderer.ComponentRenderer
3339
import com.vaadin.flow.data.value.ValueChangeMode
3440

3541
@CssImport("./styles/galite/list.css")
@@ -52,10 +58,31 @@ class ListTable(val model: VListDialog) : Grid<ListTable.ListDialogItem>() {
5258

5359
private fun buildColumns() {
5460
for(col in 0 until model.getColumnCount()) {
55-
addColumn {
56-
it.getValueAt(col)
57-
}.setHeader(Span(model.getColumnName(col)))
58-
.setKey(col.toString())
61+
if (model.columns[col] is VImageColumn) {
62+
addColumn(
63+
ComponentRenderer { item: ListDialogItem ->
64+
val image = (item.getValueAt(col) as? Image)
65+
66+
if (image != null) {
67+
image.apply {
68+
element.style["outline"] = "1px solid lightgreen"
69+
width = "100px"
70+
height = "100px"
71+
setBorder(0)
72+
element.setProperty("borderStyle", "none")
73+
setSrc(DImageField.DynamicImageResource(createFileName("image")) { ByteArrayInputStream(image.source) })
74+
}
75+
image
76+
} else {
77+
Image()
78+
}
79+
}
80+
).setHeader(Span(model.getColumnName(col))).setKey(col.toString())
81+
} else {
82+
addColumn {
83+
it.getValueAt(col)
84+
}.setHeader(Span(model.getColumnName(col))).setKey(col.toString())
85+
}
5986
}
6087
}
6188

@@ -66,19 +93,23 @@ class ListTable(val model: VListDialog) : Grid<ListTable.ListDialogItem>() {
6693
val filterRow = appendHeaderRow()
6794

6895
filterRow.also { element.classList.add("list-filter") }
69-
val filterFields = this.columns.mapIndexed { _, column ->
96+
val filterFields = this.columns.mapIndexed { i, column ->
7097
val cell = filterRow.getCell(column)
7198
val filterField = TextField()
7299
val search = Icon(VaadinIcon.SEARCH)
73100

74101
filterField.setWidthFull()
75102
filterField.suffixComponent = search
76103
filterField.className = "filter-text"
77-
filterField.addValueChangeListener {
78-
(dataProvider as ListDataProvider).refreshAll()
104+
if (this.model.columns[i] !is VImageColumn) {
105+
filterField.addValueChangeListener {
106+
(dataProvider as ListDataProvider).refreshAll()
107+
}
108+
109+
filterField.valueChangeMode = ValueChangeMode.EAGER
110+
} else {
111+
filterField.isReadOnly = true
79112
}
80-
81-
filterField.valueChangeMode = ValueChangeMode.EAGER
82113
cell.setComponent(filterField)
83114
filterField
84115
}
@@ -122,7 +153,11 @@ class ListTable(val model: VListDialog) : Grid<ListTable.ListDialogItem>() {
122153
width = 0
123154
for (row in 0 until model.count) {
124155
val value = model.columns[col]!!.formatObject(model.getValueAt(row, col)).toString()
125-
width = width.coerceAtLeast(value.length.coerceAtLeast(model.titles[col]!!.length))
156+
width = if (model.columns[col]!! is VImageColumn) {
157+
model.columns[col]!!.width
158+
} else {
159+
width.coerceAtLeast(value.length.coerceAtLeast(model.titles[col]!!.length))
160+
}
126161
}
127162
return 8 * width
128163
}
@@ -150,8 +185,12 @@ class ListTable(val model: VListDialog) : Grid<ListTable.ListDialogItem>() {
150185
* @param o The object to be formatted.
151186
* @return The formatted property object.
152187
*/
153-
private fun formatObject(o: Any?, col: Int): String {
154-
return model.columns[col]!!.formatObject(o).toString()
188+
private fun formatObject(o: Any?, col: Int): Any?{
189+
return if (model.columns[col]!!.formatObject(o) is Image) {
190+
model.columns[col]!!.formatObject(o)
191+
} else {
192+
model.columns[col]!!.formatObject(o).toString()
193+
}
155194
}
156195
}
157196
}

galite-core/src/main/kotlin/org/kopi/galite/visual/ui/vaadin/visual/VImageHandler.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@
1818

1919
package org.kopi.galite.visual.ui.vaadin.visual
2020

21-
import org.kopi.galite.visual.base.Image
21+
import org.kopi.galite.visual.ui.vaadin.base.Image
2222
import org.kopi.galite.visual.ImageHandler
2323

2424
class VImageHandler : ImageHandler() {
2525
override fun getImage(image: String): Image? = null
2626

27-
override fun getImage(image: ByteArray): Image? = null
27+
override fun getImage(image: ByteArray): Image = Image(source = image)
2828

2929
override fun getURL(image: String): String = "ui/vaadin/$image" // FIXME
3030
}

0 commit comments

Comments
 (0)