diff --git a/.idea/modules.xml b/.idea/modules.xml
index 743b52d6e643..3723e719bf8d 100644
--- a/.idea/modules.xml
+++ b/.idea/modules.xml
@@ -407,6 +407,7 @@
+
diff --git a/grid/api/intellij.grid.iml b/grid/api/intellij.grid.iml
index 9d35fcd21a10..2483c7eab345 100644
--- a/grid/api/intellij.grid.iml
+++ b/grid/api/intellij.grid.iml
@@ -3,6 +3,7 @@
+
diff --git a/grid/api/resources/intellij.grid.xml b/grid/api/resources/intellij.grid.xml
new file mode 100644
index 000000000000..6fb76a66265d
--- /dev/null
+++ b/grid/api/resources/intellij.grid.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/grid/core-impl/intellij.grid.core.impl.iml b/grid/core-impl/intellij.grid.core.impl.iml
index 724f06b1826c..f0a4db936baf 100644
--- a/grid/core-impl/intellij.grid.core.impl.iml
+++ b/grid/core-impl/intellij.grid.core.impl.iml
@@ -11,7 +11,7 @@
-
+
diff --git a/grid/core-impl/resources/intellij.grid.core.impl.xml b/grid/core-impl/resources/intellij.grid.core.impl.xml
index b638b19ac667..62b9a2c413cc 100644
--- a/grid/core-impl/resources/intellij.grid.core.impl.xml
+++ b/grid/core-impl/resources/intellij.grid.core.impl.xml
@@ -1,5 +1,6 @@
+
diff --git a/grid/images/intellij.grid.images.impl.iml b/grid/images/intellij.grid.images.impl.iml
new file mode 100644
index 000000000000..1913e7c5faab
--- /dev/null
+++ b/grid/images/intellij.grid.images.impl.iml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/grid/images/resources/intellij.grid.images.impl.xml b/grid/images/resources/intellij.grid.images.impl.xml
new file mode 100644
index 000000000000..33b5d8279f42
--- /dev/null
+++ b/grid/images/resources/intellij.grid.images.impl.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/grid/impl/src/run/ui/ImageCellViewer.kt b/grid/images/src/com/intellij/grid/images/impl/ImageCellViewer.kt
similarity index 86%
rename from grid/impl/src/run/ui/ImageCellViewer.kt
rename to grid/images/src/com/intellij/grid/images/impl/ImageCellViewer.kt
index 3ccbd01ebf36..9b02dcd86990 100644
--- a/grid/impl/src/run/ui/ImageCellViewer.kt
+++ b/grid/images/src/com/intellij/grid/images/impl/ImageCellViewer.kt
@@ -1,10 +1,15 @@
-package com.intellij.database.run.ui
+package com.intellij.grid.images.impl
import com.intellij.database.datagrid.DataGrid
import com.intellij.database.datagrid.GridColumn
import com.intellij.database.datagrid.GridRow
import com.intellij.database.datagrid.ModelIndex
import com.intellij.database.extractors.ImageInfo
+import com.intellij.database.run.ui.CellViewer
+import com.intellij.database.run.ui.CellViewerFactory
+import com.intellij.database.run.ui.DataAccessType
+import com.intellij.database.run.ui.Suitability
+import com.intellij.database.run.ui.UpdateEvent
import com.intellij.openapi.Disposable
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.util.CheckedDisposable
@@ -28,8 +33,10 @@ class ImageCellViewer(private val grid: DataGrid) : CellViewer, CheckedDisposabl
override fun update(event: UpdateEvent?) {
if (event is UpdateEvent.ValueChanged) {
- if (event.value is ImageInfo) update(event.value)
- else clearContent()
+ when(val eventValue = event.value) {
+ is ImageInfo -> update(eventValue)
+ else -> clearContent()
+ }
return
}
@@ -82,7 +89,7 @@ class ImageCellViewer(private val grid: DataGrid) : CellViewer, CheckedDisposabl
override fun dispose() { }
}
-object ImageCellViewerFactory : CellViewerFactory {
+class ImageCellViewerFactory : CellViewerFactory {
override fun getSuitability(grid: DataGrid, row: ModelIndex, column: ModelIndex): Suitability {
if (!row.isValid(grid) || !column.isValid(grid)) return Suitability.NONE
val value = grid.getDataModel(DataAccessType.DATA_WITH_MUTATIONS).getValueAt(row, column)
@@ -90,4 +97,4 @@ object ImageCellViewerFactory : CellViewerFactory {
}
override fun createViewer(grid: DataGrid): CellViewer = ImageCellViewer(grid)
-}
\ No newline at end of file
+}
diff --git a/grid/impl/intellij.grid.impl.iml b/grid/impl/intellij.grid.impl.iml
index 00af6bda94e2..c54cbb14cf1c 100644
--- a/grid/impl/intellij.grid.impl.iml
+++ b/grid/impl/intellij.grid.impl.iml
@@ -21,7 +21,6 @@
-
diff --git a/grid/impl/resources/intellij.grid.impl.xml b/grid/impl/resources/intellij.grid.impl.xml
index 3cf2bea6d206..c19f0fa7c539 100644
--- a/grid/impl/resources/intellij.grid.impl.xml
+++ b/grid/impl/resources/intellij.grid.impl.xml
@@ -1,7 +1,5 @@
-
-
@@ -10,6 +8,7 @@
+
diff --git a/grid/impl/src/run/ui/CellViewer.kt b/grid/impl/src/run/ui/CellViewer.kt
index 3a3968ea79f1..285afc628437 100644
--- a/grid/impl/src/run/ui/CellViewer.kt
+++ b/grid/impl/src/run/ui/CellViewer.kt
@@ -5,6 +5,7 @@ import com.intellij.database.datagrid.GridColumn
import com.intellij.database.datagrid.GridRow
import com.intellij.database.datagrid.ModelIndex
import com.intellij.openapi.Disposable
+import com.intellij.openapi.extensions.ExtensionPointName
import com.intellij.openapi.util.Key
import javax.swing.JComponent
@@ -27,6 +28,11 @@ interface CellViewer : Disposable {
interface CellViewerFactory {
fun getSuitability(grid: DataGrid, row: ModelIndex, column: ModelIndex): Suitability
fun createViewer(grid: DataGrid): CellViewer
+
+ companion object {
+ private val EP_NAME = ExtensionPointName("com.intellij.database.datagrid.cellViewerFactory")
+ fun getExternalFactories(): List = EP_NAME.extensionList
+ }
}
sealed interface UpdateEvent {
diff --git a/grid/impl/src/run/ui/ValueTabInfoProvider.kt b/grid/impl/src/run/ui/ValueTabInfoProvider.kt
index 879e8aab5b0a..1a9722d179da 100644
--- a/grid/impl/src/run/ui/ValueTabInfoProvider.kt
+++ b/grid/impl/src/run/ui/ValueTabInfoProvider.kt
@@ -19,8 +19,12 @@ class EditorValueEditorTab : ValueEditorTab {
class ValueTabInfoProvider(private val grid: DataGrid) : TabInfoProvider(DataGridBundle.message("EditMaximized.ValueEditor.text"),
ActionManager.getInstance().getAction("Console.TableResult.EditMaximized.Value.Group") as? ActionGroup) {
private var currentViewerFactory: CellViewerFactory
- private val viewerFactories = listOf(EditorCellViewerFactory, ReadonlyEditorCellViewerFactory, EmptyCellViewerFactory,
- ImageCellViewerFactory)
+ private val viewerFactories = buildList {
+ add(EditorCellViewerFactory)
+ add(ReadonlyEditorCellViewerFactory)
+ add(EmptyCellViewerFactory)
+ addAll(CellViewerFactory.getExternalFactories())
+ }
private var viewer: CellViewer
init {