diff --git a/features/org.jkiss.dbeaver.core.feature/feature.xml b/features/org.jkiss.dbeaver.core.feature/feature.xml
index 98568ea3dce5f1a61fa87857db793f47c7d60c43..0145800a269bf25a8c4722067007987cd72a894f 100644
--- a/features/org.jkiss.dbeaver.core.feature/feature.xml
+++ b/features/org.jkiss.dbeaver.core.feature/feature.xml
@@ -54,6 +54,7 @@
+
diff --git a/plugins/org.jkiss.dbeaver.core/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.core/META-INF/MANIFEST.MF
index 1ee85e67e02983d43f15039375e9b517e4e8b635..a7d216473789597aa5b3cc37720b902f72bb20f7 100644
--- a/plugins/org.jkiss.dbeaver.core/META-INF/MANIFEST.MF
+++ b/plugins/org.jkiss.dbeaver.core/META-INF/MANIFEST.MF
@@ -36,15 +36,12 @@ Export-Package: org.jkiss.dbeaver,
org.jkiss.dbeaver.ui.data.dialogs,
org.jkiss.dbeaver.ui.data.editors,
org.jkiss.dbeaver.ui.data.managers,
- org.jkiss.dbeaver.ui.data.managers.stream,
- org.jkiss.dbeaver.ui.data.registry,
org.jkiss.dbeaver.ui.dialogs,
org.jkiss.dbeaver.ui.dialogs.connection,
org.jkiss.dbeaver.ui.dialogs.driver,
org.jkiss.dbeaver.ui.dialogs.net,
org.jkiss.dbeaver.ui.dialogs.tools,
org.jkiss.dbeaver.ui.e4,
- org.jkiss.dbeaver.ui.editors.content,
org.jkiss.dbeaver.ui.editors.data,
org.jkiss.dbeaver.ui.editors.sql,
org.jkiss.dbeaver.ui.editors.sql.convert,
@@ -61,7 +58,6 @@ Export-Package: org.jkiss.dbeaver,
org.jkiss.dbeaver.ui.editors.sql.syntax.tokens,
org.jkiss.dbeaver.ui.editors.sql.templates,
org.jkiss.dbeaver.ui.editors.sql.util,
- org.jkiss.dbeaver.ui.editors.xml,
org.jkiss.dbeaver.ui.perspective,
org.jkiss.dbeaver.ui.preferences,
org.jkiss.dbeaver.ui.resources,
diff --git a/plugins/org.jkiss.dbeaver.core/OSGI-INF/l10n/bundle.properties b/plugins/org.jkiss.dbeaver.core/OSGI-INF/l10n/bundle.properties
index f26ea66186b8e9e2222b1c493595998eef6ef0f3..86900639eab09e6f7e5a861c04686e49327e4a76 100644
--- a/plugins/org.jkiss.dbeaver.core/OSGI-INF/l10n/bundle.properties
+++ b/plugins/org.jkiss.dbeaver.core/OSGI-INF/l10n/bundle.properties
@@ -388,9 +388,6 @@ meta.org.jkiss.dbeaver.registry.DriverDescriptor.name.name=Driver Name
meta.org.jkiss.dbeaver.registry.DriverDescriptor.description.name=Description
meta.org.jkiss.dbeaver.registry.DriverDescriptor.driverClassName.name=Driver Class
meta.org.jkiss.dbeaver.registry.DriverDescriptor.sampleURL.name=URL
-meta.org.jkiss.dbeaver.ui.dialogs.ColumnInfoPanel$CellKeyInfo.type.name=Type
-meta.org.jkiss.dbeaver.ui.dialogs.ColumnInfoPanel$CellKeyInfo.name.name=Name
-meta.org.jkiss.dbeaver.ui.dialogs.ColumnInfoPanel$CellKeyInfo.columns.name=Columns
meta.org.jkiss.dbeaver.ui.search.data.SearchDataObject.name.name=Name
meta.org.jkiss.dbeaver.ui.search.data.SearchDataObject.foundRows.name=Rows Found (>=)
diff --git a/plugins/org.jkiss.dbeaver.core/OSGI-INF/l10n/bundle_de.properties b/plugins/org.jkiss.dbeaver.core/OSGI-INF/l10n/bundle_de.properties
index 80307a2bb8727e02d87a5ba11e91c4e42492d9cb..028fbbe9818d50049791c8b71e25c88f44cb4473 100644
--- a/plugins/org.jkiss.dbeaver.core/OSGI-INF/l10n/bundle_de.properties
+++ b/plugins/org.jkiss.dbeaver.core/OSGI-INF/l10n/bundle_de.properties
@@ -468,9 +468,6 @@ meta.org.jkiss.dbeaver.registry.DriverDescriptor.description.name =
meta.org.jkiss.dbeaver.registry.DriverDescriptor.driverClassName.name = Treiberklasse
meta.org.jkiss.dbeaver.registry.DriverDescriptor.name.name = Treibername
meta.org.jkiss.dbeaver.registry.DriverDescriptor.sampleURL.name = URL
-meta.org.jkiss.dbeaver.ui.dialogs.ColumnInfoPanel$CellKeyInfo.columns.name = Spalten
-meta.org.jkiss.dbeaver.ui.dialogs.ColumnInfoPanel$CellKeyInfo.name.name = Name
-meta.org.jkiss.dbeaver.ui.dialogs.ColumnInfoPanel$CellKeyInfo.type.name = Typ
meta.org.jkiss.dbeaver.ui.search.data.SearchDataObject.foundRows.name = Gefundene Zeilen (>=)
meta.org.jkiss.dbeaver.ui.search.data.SearchDataObject.name.name = Name
diff --git a/plugins/org.jkiss.dbeaver.core/OSGI-INF/l10n/bundle_fr.properties b/plugins/org.jkiss.dbeaver.core/OSGI-INF/l10n/bundle_fr.properties
index 570f90d2645e956644417f9e3d3710034994aeca..3cd1e8cacf689a0e0c880c439525089114433d11 100644
--- a/plugins/org.jkiss.dbeaver.core/OSGI-INF/l10n/bundle_fr.properties
+++ b/plugins/org.jkiss.dbeaver.core/OSGI-INF/l10n/bundle_fr.properties
@@ -353,9 +353,6 @@ meta.org.jkiss.dbeaver.registry.DriverDescriptor.description.name
meta.org.jkiss.dbeaver.registry.DriverDescriptor.driverClassName.name = Classe de pilote
meta.org.jkiss.dbeaver.registry.DriverDescriptor.name.name = Nom du pilote
meta.org.jkiss.dbeaver.registry.DriverDescriptor.sampleURL.name = URL
-meta.org.jkiss.dbeaver.ui.dialogs.ColumnInfoPanel$CellKeyInfo.columns.name = Colonnes
-meta.org.jkiss.dbeaver.ui.dialogs.ColumnInfoPanel$CellKeyInfo.name.name = Nom
-meta.org.jkiss.dbeaver.ui.dialogs.ColumnInfoPanel$CellKeyInfo.type.name = Type
meta.org.jkiss.dbeaver.ui.search.data.SearchDataObject.foundRows.name = Lignes trouv\u00E9es (>=)
meta.org.jkiss.dbeaver.ui.search.data.SearchDataObject.name.name = Nom
diff --git a/plugins/org.jkiss.dbeaver.core/OSGI-INF/l10n/bundle_ja.properties b/plugins/org.jkiss.dbeaver.core/OSGI-INF/l10n/bundle_ja.properties
index 7f9c44da39bb253a48234a11efc48248506f627d..69adfefeebf2d5ff410c159a63496e0e55d61b69 100644
--- a/plugins/org.jkiss.dbeaver.core/OSGI-INF/l10n/bundle_ja.properties
+++ b/plugins/org.jkiss.dbeaver.core/OSGI-INF/l10n/bundle_ja.properties
@@ -367,9 +367,6 @@ meta.org.jkiss.dbeaver.registry.DriverDescriptor.name.name=\u30C9\u30E9\u30A4\u3
meta.org.jkiss.dbeaver.registry.DriverDescriptor.description.name=\u8AAC\u660E
meta.org.jkiss.dbeaver.registry.DriverDescriptor.driverClassName.name=\u30C9\u30E9\u30A4\u30D0\u30FC\u30AF\u30E9\u30B9
meta.org.jkiss.dbeaver.registry.DriverDescriptor.sampleURL.name=URL
-meta.org.jkiss.dbeaver.ui.dialogs.ColumnInfoPanel$CellKeyInfo.type.name=\u30BF\u30A4\u30D7
-meta.org.jkiss.dbeaver.ui.dialogs.ColumnInfoPanel$CellKeyInfo.name.name=\u540D
-meta.org.jkiss.dbeaver.ui.dialogs.ColumnInfoPanel$CellKeyInfo.columns.name=\u5217
meta.org.jkiss.dbeaver.ui.search.data.SearchDataObject.name.name=\u540D
meta.org.jkiss.dbeaver.ui.search.data.SearchDataObject.foundRows.name=\u898B\u3064\u304B\u3063\u305F\u884C\uFF08>\uFF09
diff --git a/plugins/org.jkiss.dbeaver.core/OSGI-INF/l10n/bundle_ru.properties b/plugins/org.jkiss.dbeaver.core/OSGI-INF/l10n/bundle_ru.properties
index 158bfc4107212d19fb563ed1c5ed3aae33f02d04..8a6b0457fb2cbd06b8d9e0ad49c9a0968fe22dfd 100644
--- a/plugins/org.jkiss.dbeaver.core/OSGI-INF/l10n/bundle_ru.properties
+++ b/plugins/org.jkiss.dbeaver.core/OSGI-INF/l10n/bundle_ru.properties
@@ -279,9 +279,6 @@ meta.org.jkiss.dbeaver.registry.DriverDescriptor.description.name =
meta.org.jkiss.dbeaver.registry.DriverDescriptor.driverClassName.name = \u041A\u043B\u0430\u0441\u0441 \u0414\u0440\u0430\u0439\u0432\u0435\u0440\u0430
meta.org.jkiss.dbeaver.registry.DriverDescriptor.name.name = \u0418\u043C\u044F \u0414\u0440\u0430\u0439\u0432\u0435\u0440\u0430
meta.org.jkiss.dbeaver.registry.DriverDescriptor.sampleURL.name = URL
-meta.org.jkiss.dbeaver.ui.dialogs.ColumnInfoPanel$CellKeyInfo.columns.name = \u041A\u043E\u043B\u043E\u043D\u043A\u0438
-meta.org.jkiss.dbeaver.ui.dialogs.ColumnInfoPanel$CellKeyInfo.name.name = \u0418\u043C\u044F
-meta.org.jkiss.dbeaver.ui.dialogs.ColumnInfoPanel$CellKeyInfo.type.name = \u0422\u0438\u043F
search.page.label.db.fulltext = \u041F\u043E\u043B\u043D\u043E\u0442\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0439 \u043F\u043E\u0438\u0441\u043A \u0411\u0414
search.page.label.db.metadata = \u041F\u043E\u0438\u0441\u043A \u043E\u0431\u044A\u0435\u043A\u0442\u043E\u0432 \u0411\u0414
diff --git a/plugins/org.jkiss.dbeaver.core/OSGI-INF/l10n/bundle_zh.properties b/plugins/org.jkiss.dbeaver.core/OSGI-INF/l10n/bundle_zh.properties
index 1eaa4cb81ede0a8c10dafe37216881b95b534efa..3b231526752aa2c4b82cd3475d02972c39432131 100644
--- a/plugins/org.jkiss.dbeaver.core/OSGI-INF/l10n/bundle_zh.properties
+++ b/plugins/org.jkiss.dbeaver.core/OSGI-INF/l10n/bundle_zh.properties
@@ -467,9 +467,6 @@ meta.org.jkiss.dbeaver.registry.DriverDescriptor.description.name =
meta.org.jkiss.dbeaver.registry.DriverDescriptor.driverClassName.name = \u9A71\u52A8\u7C7B
meta.org.jkiss.dbeaver.registry.DriverDescriptor.name.name = \u9A71\u52A8\u540D\u79F0
meta.org.jkiss.dbeaver.registry.DriverDescriptor.sampleURL.name = URL
-meta.org.jkiss.dbeaver.ui.dialogs.ColumnInfoPanel$CellKeyInfo.columns.name = \u5B57\u6BB5
-meta.org.jkiss.dbeaver.ui.dialogs.ColumnInfoPanel$CellKeyInfo.name.name = \u540D\u79F0
-meta.org.jkiss.dbeaver.ui.dialogs.ColumnInfoPanel$CellKeyInfo.type.name = \u7C7B\u578B
meta.org.jkiss.dbeaver.ui.search.data.SearchDataObject.foundRows.name = \u627E\u5230\u7684\u884C(>=)
meta.org.jkiss.dbeaver.ui.search.data.SearchDataObject.name.name = \u540D\u79F0
diff --git a/plugins/org.jkiss.dbeaver.core/plugin.xml b/plugins/org.jkiss.dbeaver.core/plugin.xml
index f022c348e96917c02a76b4b7c359d8a31f9d82e7..66f093fa5f88a664d85511a84690a40eb27f586c 100644
--- a/plugins/org.jkiss.dbeaver.core/plugin.xml
+++ b/plugins/org.jkiss.dbeaver.core/plugin.xml
@@ -3626,10 +3626,9 @@
-->
-
-
+
+
+
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreMessages.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreMessages.java
index 111203a10188e2edfe4d8e6f1dac53892881f0e2..8f26dd8ac7dddf9c88de7ceb904dcc970671efba 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreMessages.java
+++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreMessages.java
@@ -149,7 +149,6 @@ public class CoreMessages extends NLS {
public static String controls_client_homes_panel_label_path;
public static String controls_client_homes_panel_label_product_name;
public static String controls_client_homes_panel_label_product_version;
- public static String controls_column_info_panel_property_key;
public static String controls_driver_tree_column_connections;
public static String controls_driver_tree_column_name;
public static String controls_itemlist_action_copy;
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreResources.properties b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreResources.properties
index 6a12dd6e2ddcb51412db5e9d4d5a45fc87090c93..f941b7f085cdc4934f268083585e568aa3179c64 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreResources.properties
+++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreResources.properties
@@ -124,7 +124,6 @@ controls_client_homes_panel_label_name = Name
controls_client_homes_panel_label_path = Path
controls_client_homes_panel_label_product_name = Product Name
controls_client_homes_panel_label_product_version = Product Version
-controls_column_info_panel_property_key = Key
controls_connection_properties_action_add_property = Add new property
controls_connection_properties_action_remove_property = Remove property
controls_connection_properties_category_user_properties = User Properties
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreResources_de.properties b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreResources_de.properties
index c53a35486a009f66ba32bac2f75d5c00b5ef45bc..3288c98863c8a8175a4aa525530df13d3bbd23bd 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreResources_de.properties
+++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreResources_de.properties
@@ -204,8 +204,6 @@ controls_client_homes_panel_label_product_name = Produktname
controls_client_homes_panel_label_product_version = Produktversion
-controls_column_info_panel_property_key = Schl\u00FCssel
-
controls_connection_properties_action_add_property = Neue Eigenschaft hinzuf\u00FCgen
controls_connection_properties_action_remove_property = Eigenschaft entfernen
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreResources_fr.properties b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreResources_fr.properties
index 7d108388b69f2166e0bbd2ef11973ef7b37e6bea..084d2a74a842178216a33aaa11a9e81924c9834f 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreResources_fr.properties
+++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreResources_fr.properties
@@ -153,8 +153,6 @@ controls_client_homes_panel_label_product_name = Nom du produit
controls_client_homes_panel_label_product_version = Version du produit
-controls_column_info_panel_property_key = Clef
-
controls_connection_properties_action_add_property = Ajouter une nouvelle propri\u00E9t\u00E9
controls_connection_properties_action_remove_property = Supprimer la propri\u00E9t\u00E9
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreResources_ja.properties b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreResources_ja.properties
index a0981aa41e65b54402055709193dbb2ac7f9f7ae..3ffb1f9742cc837159ccb885cd6a4f9f336a2dba 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreResources_ja.properties
+++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreResources_ja.properties
@@ -116,7 +116,6 @@ controls_client_homes_panel_label_name =\u540D
controls_client_homes_panel_label_path =\u30D1\u30B9
controls_client_homes_panel_label_product_name =\u5546\u54C1\u540D
controls_client_homes_panel_label_product_version =\u88FD\u54C1\u30D0\u30FC\u30B8\u30E7\u30F3
-controls_column_info_panel_property_key =\u30AD\u30FC
controls_connection_properties_action_add_property =\u65B0\u3057\u3044\u30D7\u30ED\u30D1\u30C6\u30A3\u3092\u8FFD\u52A0\u3059\u308B
controls_connection_properties_action_remove_property =\u30D7\u30ED\u30D1\u30C6\u30A3\u3092\u524A\u9664
controls_connection_properties_category_user_properties =\u30E6\u30FC\u30B6\u30FC\u306E\u30D7\u30ED\u30D1\u30C6\u30A3
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreResources_ru.properties b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreResources_ru.properties
index 1227eb1a5235e514f87ad8ee7b8f7eb988745f68..cd225b76c728009ae9f2a10fb9c49f5e369fa4e5 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreResources_ru.properties
+++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreResources_ru.properties
@@ -1015,7 +1015,6 @@ controls_client_homes_panel_button_remove_home=\u0423\u0434\u0430\u043B\u0438\u0
controls_client_homes_panel_confirm_remove_home_text=\u0412\u044B \u0443\u0432\u0435\u0440\u0435\u043D\u044B, \u0447\u0442\u043E \u0445\u043E\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043B\u0438\u0442\u044C \u043A\u043B\u0438\u0435\u043D\u0442\u0430 "{0}"?
controls_client_homes_panel_confirm_remove_home_title=\u0423\u0434\u0430\u043B\u0435\u043D\u0438\u0435 \u043A\u043B\u0438\u0435\u043D\u0442\u0430
controls_client_homes_panel_dialog_title=\u041A\u043B\u0438\u0435\u043D\u0442\u044B \u0411\u0414
-controls_column_info_panel_property_key=\u041A\u043B\u044E\u0447
controls_driver_tree_column_connections=\u0421\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F
controls_driver_tree_column_name=\u0418\u043C\u044F
controls_rs_pump_job_name=\u0427\u0442\u0435\u043D\u0438\u0435 \u0434\u0430\u043D\u043D\u044B\u0445
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreResources_zh.properties b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreResources_zh.properties
index a5fa00c49cf50a8e59e4a2188b77f9f7538fa95f..de23a8a18ea66cc1873ecd83ae298ed2fe939f6c 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreResources_zh.properties
+++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreResources_zh.properties
@@ -204,8 +204,6 @@ controls_client_homes_panel_label_product_name = \u4EA7\u54C1\u540D\u79F0
controls_client_homes_panel_label_product_version = \u4EA7\u54C1\u7248\u672C
-controls_column_info_panel_property_key = \u952E
-
controls_connection_properties_action_add_property = \u6DFB\u52A0\u65B0\u5C5E\u6027
controls_connection_properties_action_remove_property = \u5220\u9664\u5C5E\u6027
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/dialogs/ValueViewDialog.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/dialogs/ValueViewDialog.java
index c12b2c2cda867f4ae07978523a2badec6d7554ae..f1e9331e31c1c1642d8b75d81b2be7ddb3346c80 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/dialogs/ValueViewDialog.java
+++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/dialogs/ValueViewDialog.java
@@ -44,7 +44,7 @@ import org.jkiss.dbeaver.runtime.DBWorkbench;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.data.*;
import org.jkiss.dbeaver.ui.data.managers.BaseValueManager;
-import org.jkiss.dbeaver.ui.dialogs.ColumnInfoPanel;
+import org.jkiss.dbeaver.ui.controls.ColumnInfoPanel;
import org.jkiss.utils.CommonUtils;
/**
diff --git a/plugins/org.jkiss.dbeaver.ui.editors.data/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.ui.editors.data/META-INF/MANIFEST.MF
index 74ef8aa8ef0b48dd315352332ac90a8bf18196d4..cb5f6070e0ef8c49b4f0dba892e7911b5f2b03ed 100644
--- a/plugins/org.jkiss.dbeaver.ui.editors.data/META-INF/MANIFEST.MF
+++ b/plugins/org.jkiss.dbeaver.ui.editors.data/META-INF/MANIFEST.MF
@@ -12,11 +12,21 @@ Require-Bundle: org.eclipse.core.runtime,
org.eclipse.core.resources,
org.eclipse.core.expressions,
org.eclipse.ui,
+ org.eclipse.jface.text,
+ org.eclipse.ui.editors,
+ org.eclipse.ui.ide,
+ org.eclipse.ui.workbench.texteditor,
org.jkiss.dbeaver.model,
org.jkiss.dbeaver.ui,
org.jkiss.dbeaver.ui.editors.base,
org.jkiss.dbeaver.ui.navigator
Bundle-ClassPath: .
-Export-Package: org.jkiss.dbeaver.ui.controls.lightgrid,
+Export-Package: org.jkiss.dbeaver.ui.controls,
+ org.jkiss.dbeaver.ui.controls.lightgrid,
org.jkiss.dbeaver.ui.data,
+ org.jkiss.dbeaver.ui.data.managers,
+ org.jkiss.dbeaver.ui.data.managers.stream,
+ org.jkiss.dbeaver.ui.data.registry,
+ org.jkiss.dbeaver.ui.editors.content,
org.jkiss.dbeaver.ui.editors.data
+
diff --git a/plugins/org.jkiss.dbeaver.ui.editors.data/OSGI-INF/l10n/bundle.properties b/plugins/org.jkiss.dbeaver.ui.editors.data/OSGI-INF/l10n/bundle.properties
index f444a01f3a4d1a39c0061d4086f66c03acf43428..f5cc76a5cbb05cd87ca2581de7f350fced9f468d 100644
--- a/plugins/org.jkiss.dbeaver.ui.editors.data/OSGI-INF/l10n/bundle.properties
+++ b/plugins/org.jkiss.dbeaver.ui.editors.data/OSGI-INF/l10n/bundle.properties
@@ -1,3 +1,6 @@
Bundle-Vendor = DBeaver Corp
Bundle-Name = DBeaver UI Editors - Data
+meta.org.jkiss.dbeaver.ui.controls.ColumnInfoPanel$CellKeyInfo.type.name=Type
+meta.org.jkiss.dbeaver.ui.controls.ColumnInfoPanel$CellKeyInfo.name.name=Name
+meta.org.jkiss.dbeaver.ui.controls.ColumnInfoPanel$CellKeyInfo.columns.name=Columns
diff --git a/plugins/org.jkiss.dbeaver.ui.editors.data/OSGI-INF/l10n/bundle_de.properties b/plugins/org.jkiss.dbeaver.ui.editors.data/OSGI-INF/l10n/bundle_de.properties
new file mode 100644
index 0000000000000000000000000000000000000000..1801e0373fd561e8bb62b4299eb1466c404637d6
--- /dev/null
+++ b/plugins/org.jkiss.dbeaver.ui.editors.data/OSGI-INF/l10n/bundle_de.properties
@@ -0,0 +1,3 @@
+meta.org.jkiss.dbeaver.ui.controls.ColumnInfoPanel$CellKeyInfo.columns.name = Spalten
+meta.org.jkiss.dbeaver.ui.controls.ColumnInfoPanel$CellKeyInfo.name.name = Name
+meta.org.jkiss.dbeaver.ui.controls.ColumnInfoPanel$CellKeyInfo.type.name = Typ
diff --git a/plugins/org.jkiss.dbeaver.ui.editors.data/OSGI-INF/l10n/bundle_fr.properties b/plugins/org.jkiss.dbeaver.ui.editors.data/OSGI-INF/l10n/bundle_fr.properties
new file mode 100644
index 0000000000000000000000000000000000000000..7a64cfa0cb873fefb9da3e533c566b3b0311f4da
--- /dev/null
+++ b/plugins/org.jkiss.dbeaver.ui.editors.data/OSGI-INF/l10n/bundle_fr.properties
@@ -0,0 +1,3 @@
+meta.org.jkiss.dbeaver.ui.controls.ColumnInfoPanel$CellKeyInfo.columns.name = Colonnes
+meta.org.jkiss.dbeaver.ui.controls.ColumnInfoPanel$CellKeyInfo.name.name = Nom
+meta.org.jkiss.dbeaver.ui.controls.ColumnInfoPanel$CellKeyInfo.type.name = Type
diff --git a/plugins/org.jkiss.dbeaver.ui.editors.data/OSGI-INF/l10n/bundle_ja.properties b/plugins/org.jkiss.dbeaver.ui.editors.data/OSGI-INF/l10n/bundle_ja.properties
new file mode 100644
index 0000000000000000000000000000000000000000..7596b99dfe5245734cea6bc3c4a89119d74b03eb
--- /dev/null
+++ b/plugins/org.jkiss.dbeaver.ui.editors.data/OSGI-INF/l10n/bundle_ja.properties
@@ -0,0 +1,3 @@
+meta.org.jkiss.dbeaver.ui.controls.ColumnInfoPanel$CellKeyInfo.type.name=\u30BF\u30A4\u30D7
+meta.org.jkiss.dbeaver.ui.controls.ColumnInfoPanel$CellKeyInfo.name.name=\u540D
+meta.org.jkiss.dbeaver.ui.controls.ColumnInfoPanel$CellKeyInfo.columns.name=\u5217
diff --git a/plugins/org.jkiss.dbeaver.ui.editors.data/OSGI-INF/l10n/bundle_ru.properties b/plugins/org.jkiss.dbeaver.ui.editors.data/OSGI-INF/l10n/bundle_ru.properties
new file mode 100644
index 0000000000000000000000000000000000000000..814983ae5fc146f6ec3e2d04934c0d9634f93881
--- /dev/null
+++ b/plugins/org.jkiss.dbeaver.ui.editors.data/OSGI-INF/l10n/bundle_ru.properties
@@ -0,0 +1,3 @@
+meta.org.jkiss.dbeaver.ui.controls.ColumnInfoPanel$CellKeyInfo.columns.name = \u041A\u043E\u043B\u043E\u043D\u043A\u0438
+meta.org.jkiss.dbeaver.ui.controls.ColumnInfoPanel$CellKeyInfo.name.name = \u0418\u043C\u044F
+meta.org.jkiss.dbeaver.ui.controls.ColumnInfoPanel$CellKeyInfo.type.name = \u0422\u0438\u043F
diff --git a/plugins/org.jkiss.dbeaver.ui.editors.data/OSGI-INF/l10n/bundle_zh.properties b/plugins/org.jkiss.dbeaver.ui.editors.data/OSGI-INF/l10n/bundle_zh.properties
new file mode 100644
index 0000000000000000000000000000000000000000..ded6689f1252cd1a987b6e8111293d0f8e8c9f36
--- /dev/null
+++ b/plugins/org.jkiss.dbeaver.ui.editors.data/OSGI-INF/l10n/bundle_zh.properties
@@ -0,0 +1,3 @@
+meta.org.jkiss.dbeaver.ui.controls.ColumnInfoPanel$CellKeyInfo.columns.name = \u5B57\u6BB5
+meta.org.jkiss.dbeaver.ui.controls.ColumnInfoPanel$CellKeyInfo.name.name = \u540D\u79F0
+meta.org.jkiss.dbeaver.ui.controls.ColumnInfoPanel$CellKeyInfo.type.name = \u7C7B\u578B
diff --git a/plugins/org.jkiss.dbeaver.ui.editors.data/plugin.xml b/plugins/org.jkiss.dbeaver.ui.editors.data/plugin.xml
index 3ebb9580918bf9062f7ca09c6169208379bb9b01..2a619d4f4f2af027de018052aaa686a064f704ee 100644
--- a/plugins/org.jkiss.dbeaver.ui.editors.data/plugin.xml
+++ b/plugins/org.jkiss.dbeaver.ui.editors.data/plugin.xml
@@ -3,5 +3,10 @@
+
+
+
+
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/ColumnInfoPanel.java b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/ColumnInfoPanel.java
similarity index 96%
rename from plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/ColumnInfoPanel.java
rename to plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/ColumnInfoPanel.java
index 9f81aa417872e0f6fdc8a343bb4b6f9f32405b8b..d554de45a11a809cd83116f3b8dd4086eb84fdfe 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/ColumnInfoPanel.java
+++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/ColumnInfoPanel.java
@@ -15,14 +15,13 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.jkiss.dbeaver.ui.dialogs;
+package org.jkiss.dbeaver.ui.controls;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
-import org.jkiss.dbeaver.core.CoreMessages;
import org.jkiss.dbeaver.model.DBConstants;
import org.jkiss.dbeaver.model.DBPNamedObject;
import org.jkiss.dbeaver.model.DBPObject;
@@ -34,6 +33,7 @@ import org.jkiss.dbeaver.runtime.properties.PropertyCollector;
import org.jkiss.dbeaver.ui.data.IAttributeController;
import org.jkiss.dbeaver.ui.data.IRowController;
import org.jkiss.dbeaver.ui.data.IValueController;
+import org.jkiss.dbeaver.ui.editors.data.internal.DataEditorsMessages;
import org.jkiss.dbeaver.ui.properties.PropertyTreeViewer;
import java.util.ArrayList;
@@ -63,7 +63,7 @@ public class ColumnInfoPanel extends Composite {
infoItem.addProperty(
null,
"Key",
- CoreMessages.controls_column_info_panel_property_key,
+ DataEditorsMessages.controls_column_info_panel_property_key,
new CellKeyInfo(valueController.getRowController(), rowIdentifier)
);
}
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/managers/stream/AbstractTextPanelEditor.java b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/data/managers/AbstractTextPanelEditor.java
similarity index 87%
rename from plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/managers/stream/AbstractTextPanelEditor.java
rename to plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/data/managers/AbstractTextPanelEditor.java
index fb7695e483bd92b53f1a998754c2e7829486d5fa..a6db7bafb1c3694159ffcd97d3948b60f5a2a2e4 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/managers/stream/AbstractTextPanelEditor.java
+++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/data/managers/AbstractTextPanelEditor.java
@@ -14,12 +14,13 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.jkiss.dbeaver.ui.data.managers.stream;
+package org.jkiss.dbeaver.ui.data.managers;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IContributionManager;
import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.text.IUndoManager;
import org.eclipse.jface.text.TextViewer;
import org.eclipse.jface.text.source.ISourceViewer;
@@ -31,19 +32,18 @@ import org.eclipse.ui.PartInitException;
import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
-import org.jkiss.dbeaver.model.DBPDataKind;
import org.jkiss.dbeaver.model.DBPMessageType;
import org.jkiss.dbeaver.model.data.DBDContent;
import org.jkiss.dbeaver.model.exec.DBCException;
import org.jkiss.dbeaver.model.impl.StringContentStorage;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.ui.UIUtils;
-import org.jkiss.dbeaver.ui.controls.resultset.panel.valueviewer.ValueViewerPanel;
import org.jkiss.dbeaver.ui.data.IStreamValueEditor;
import org.jkiss.dbeaver.ui.data.IValueController;
import org.jkiss.dbeaver.ui.editors.StringEditorInput;
import org.jkiss.dbeaver.ui.editors.SubEditorSite;
import org.jkiss.dbeaver.ui.editors.content.ContentEditorInput;
+import org.jkiss.dbeaver.ui.editors.data.internal.DataEditorsActivator;
import org.jkiss.dbeaver.ui.editors.text.BaseTextEditor;
import org.jkiss.dbeaver.utils.RuntimeUtils;
@@ -97,7 +97,7 @@ public abstract class AbstractTextPanelEditor imp
boolean newWW = !editorControl.getWordWrap();
setChecked(newWW);
editorControl.setWordWrap(newWW);
- ValueViewerPanel.getPanelSettings().put(PREF_TEXT_EDITOR_WORD_WRAP, newWW);
+ getPanelSettings().put(PREF_TEXT_EDITOR_WORD_WRAP, newWW);
}
};
wwAction.setChecked(editorControl.getWordWrap());
@@ -109,13 +109,13 @@ public abstract class AbstractTextPanelEditor imp
final Action afAction = new Action("Auto Format", Action.AS_CHECK_BOX) {
@Override
public void run() {
- boolean newAF = !ValueViewerPanel.getPanelSettings().getBoolean(PREF_TEXT_EDITOR_AUTO_FORMAT);
+ boolean newAF = !getPanelSettings().getBoolean(PREF_TEXT_EDITOR_AUTO_FORMAT);
setChecked(newAF);
- ValueViewerPanel.getPanelSettings().put(PREF_TEXT_EDITOR_AUTO_FORMAT, newAF);
+ getPanelSettings().put(PREF_TEXT_EDITOR_AUTO_FORMAT, newAF);
applyEditorStyle();
}
};
- afAction.setChecked(ValueViewerPanel.getPanelSettings().getBoolean(PREF_TEXT_EDITOR_AUTO_FORMAT));
+ afAction.setChecked(getPanelSettings().getBoolean(PREF_TEXT_EDITOR_AUTO_FORMAT));
manager.add(afAction);
}
}
@@ -125,7 +125,7 @@ public abstract class AbstractTextPanelEditor imp
}
private void initEditorSettings(StyledText control) {
- boolean wwEnabled = ValueViewerPanel.getPanelSettings().getBoolean(PREF_TEXT_EDITOR_WORD_WRAP);
+ boolean wwEnabled = getPanelSettings().getBoolean(PREF_TEXT_EDITOR_WORD_WRAP);
if (wwEnabled != control.getWordWrap()) {
control.setWordWrap(wwEnabled);
}
@@ -133,7 +133,7 @@ public abstract class AbstractTextPanelEditor imp
private void applyEditorStyle() {
BaseTextEditor textEditor = getTextEditor();
- if (textEditor != null && ValueViewerPanel.getPanelSettings().getBoolean(PREF_TEXT_EDITOR_AUTO_FORMAT)) {
+ if (textEditor != null && getPanelSettings().getBoolean(PREF_TEXT_EDITOR_AUTO_FORMAT)) {
try {
if (textEditor.getViewer().canDoOperation(ISourceViewer.FORMAT)) {
textEditor.getViewer().doOperation(ISourceViewer.FORMAT);
@@ -205,4 +205,15 @@ public abstract class AbstractTextPanelEditor imp
}
}
+ private static IDialogSettings viewerSettings;
+
+ public static IDialogSettings getPanelSettings() {
+ if (viewerSettings == null) {
+ viewerSettings = UIUtils.getSettingsSection(
+ DataEditorsActivator.getDefault().getDialogSettings(),
+ AbstractTextPanelEditor.class.getSimpleName());
+ }
+ return viewerSettings;
+ }
+
}
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/managers/stream/PlainTextViewerConfiguration.java b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/data/managers/stream/PlainTextViewerConfiguration.java
similarity index 100%
rename from plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/managers/stream/PlainTextViewerConfiguration.java
rename to plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/data/managers/stream/PlainTextViewerConfiguration.java
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/managers/stream/TextEditorPart.java b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/data/managers/stream/TextEditorPart.java
similarity index 96%
rename from plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/managers/stream/TextEditorPart.java
rename to plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/data/managers/stream/TextEditorPart.java
index b001bca5a75c5d0bf5844b7bc6c08b8112d0520b..9887efad0b826346f8f9b0aca79270ad5d21798e 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/managers/stream/TextEditorPart.java
+++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/data/managers/stream/TextEditorPart.java
@@ -27,7 +27,6 @@ import org.jkiss.dbeaver.model.DBIcon;
import org.jkiss.dbeaver.ui.DBeaverIcons;
import org.jkiss.dbeaver.ui.editors.text.BaseTextEditor;
import org.jkiss.dbeaver.ui.editors.text.FileRefDocumentProvider;
-import org.jkiss.dbeaver.ui.editors.xml.XMLSourceViewerConfiguration;
/**
* CONTENT text editor
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/managers/stream/TextPanelEditor.java b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/data/managers/stream/TextPanelEditor.java
similarity index 93%
rename from plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/managers/stream/TextPanelEditor.java
rename to plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/data/managers/stream/TextPanelEditor.java
index 839920a39554c8f3f6f8e8fff1ce1bd39265ec1e..64272e5ae2ab57ac482795f0118b163b153cad88 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/managers/stream/TextPanelEditor.java
+++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/data/managers/stream/TextPanelEditor.java
@@ -17,7 +17,7 @@
package org.jkiss.dbeaver.ui.data.managers.stream;
import org.jkiss.dbeaver.ui.data.IValueController;
-import org.jkiss.dbeaver.ui.editors.text.BaseTextEditor;
+import org.jkiss.dbeaver.ui.data.managers.AbstractTextPanelEditor;
/**
* TextPanelEditor
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/managers/stream/TextStreamValueManager.java b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/data/managers/stream/TextStreamValueManager.java
similarity index 100%
rename from plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/managers/stream/TextStreamValueManager.java
rename to plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/data/managers/stream/TextStreamValueManager.java
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/registry/StreamValueManagerDescriptor.java b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/data/registry/StreamValueManagerDescriptor.java
similarity index 87%
rename from plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/registry/StreamValueManagerDescriptor.java
rename to plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/data/registry/StreamValueManagerDescriptor.java
index ff09b7fc06a25cb24a55051bd8bc453f0fe505f4..f81d1a90a68185adb6a7579f5e72cfd23b812c7d 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/registry/StreamValueManagerDescriptor.java
+++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/data/registry/StreamValueManagerDescriptor.java
@@ -20,7 +20,6 @@ import org.eclipse.core.runtime.IConfigurationElement;
import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.model.DBPImage;
import org.jkiss.dbeaver.model.impl.AbstractDescriptor;
-import org.jkiss.dbeaver.registry.RegistryConstants;
import org.jkiss.dbeaver.ui.data.IStreamValueManager;
import org.jkiss.utils.ArrayUtils;
import org.jkiss.utils.CommonUtils;
@@ -48,11 +47,11 @@ public class StreamValueManagerDescriptor extends AbstractDescriptor
{
super(config);
- this.id = config.getAttribute(RegistryConstants.ATTR_ID);
- this.implType = new ObjectType(config.getAttribute(RegistryConstants.ATTR_CLASS));
- this.label = config.getAttribute(RegistryConstants.ATTR_LABEL);
- this.description = config.getAttribute(RegistryConstants.ATTR_DESCRIPTION);
- this.icon = iconToImage(config.getAttribute(RegistryConstants.ATTR_ICON));
+ this.id = config.getAttribute("id");
+ this.implType = new ObjectType(config.getAttribute("class"));
+ this.label = config.getAttribute("label");
+ this.description = config.getAttribute("description");
+ this.icon = iconToImage(config.getAttribute("icon"));
this.primaryMime = config.getAttribute(ATTR_PRIMARY_MIME);
String supportedMimeString = config.getAttribute(ATTR_SUPPORTED_MIME);
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/registry/ValueManagerDescriptor.java b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/data/registry/ValueManagerDescriptor.java
similarity index 94%
rename from plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/registry/ValueManagerDescriptor.java
rename to plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/data/registry/ValueManagerDescriptor.java
index 268f8fa56e884e33b71108a1b934d853b6f5972d..75b5456ac45ca7d3cf49864aeacc843b6799b857 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/registry/ValueManagerDescriptor.java
+++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/data/registry/ValueManagerDescriptor.java
@@ -22,12 +22,11 @@ import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBPDataKind;
import org.jkiss.dbeaver.model.DBPDataSource;
+import org.jkiss.dbeaver.model.connection.DBPDriver;
import org.jkiss.dbeaver.model.impl.AbstractDescriptor;
import org.jkiss.dbeaver.model.struct.DBSDataType;
import org.jkiss.dbeaver.model.struct.DBSTypedObject;
import org.jkiss.dbeaver.model.struct.DBSTypedObjectEx;
-import org.jkiss.dbeaver.registry.RegistryConstants;
-import org.jkiss.dbeaver.registry.driver.DriverDescriptor;
import org.jkiss.dbeaver.ui.data.IValueManager;
import org.jkiss.utils.CommonUtils;
@@ -68,8 +67,8 @@ public class ValueManagerDescriptor extends AbstractDescriptor
{
super(config);
- this.id = config.getAttribute(RegistryConstants.ATTR_ID);
- this.implType = new ObjectType(config.getAttribute(RegistryConstants.ATTR_CLASS));
+ this.id = config.getAttribute("id");
+ this.implType = new ObjectType(config.getAttribute("class"));
IConfigurationElement[] typeElements = config.getChildren(TAG_SUPPORTS);
for (IConfigurationElement typeElement : typeElements) {
@@ -128,7 +127,7 @@ public class ValueManagerDescriptor extends AbstractDescriptor
final DBPDataKind dataKind = typedObject.getDataKind();
for (SupportInfo info : supportInfos) {
if (dataSource != null && info.dataSource != null) {
- DriverDescriptor driver = (DriverDescriptor) dataSource.getContainer().getDriver();
+ DBPDriver driver = dataSource.getContainer().getDriver();
if (!info.dataSource.equals(driver.getProviderId()) && !info.dataSource.equals(dataSource.getClass().getName())) {
continue;
}
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/registry/ValueManagerRegistry.java b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/data/registry/ValueManagerRegistry.java
similarity index 98%
rename from plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/registry/ValueManagerRegistry.java
rename to plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/data/registry/ValueManagerRegistry.java
index 43ed17c7711a1e29090bb82778a23de034c717b0..4e5f64c46cff6c76c70ec95739c1a884878eb2ec 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/registry/ValueManagerRegistry.java
+++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/data/registry/ValueManagerRegistry.java
@@ -28,7 +28,6 @@ import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.struct.DBSTypedObject;
import org.jkiss.dbeaver.ui.data.IStreamValueManager;
import org.jkiss.dbeaver.ui.data.IValueManager;
-import org.jkiss.dbeaver.ui.data.managers.DefaultValueManager;
import org.jkiss.utils.CommonUtils;
import org.jkiss.utils.MimeType;
@@ -80,7 +79,7 @@ public class ValueManagerRegistry {
manager = findManager(dataSource, dataKind, valueType, false, false);
}
if (manager == null) {
- manager = DefaultValueManager.INSTANCE;
+ throw new IllegalStateException("Can't find default data manager for " + dataKind);
}
return manager;
}
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/content/ContentEditor.java b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/content/ContentEditor.java
similarity index 96%
rename from plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/content/ContentEditor.java
rename to plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/content/ContentEditor.java
index 362acb26945d7da4693f75cb150b41485ca43269..316e20a212936bf97ae724e69a68bf62fd40d808 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/content/ContentEditor.java
+++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/content/ContentEditor.java
@@ -1,587 +1,587 @@
-/*
- * DBeaver - Universal Database Manager
- * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jkiss.dbeaver.ui.editors.content;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.action.IContributionManager;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.*;
-import org.eclipse.ui.part.MultiPageEditorSite;
-import org.jkiss.code.NotNull;
-import org.jkiss.code.Nullable;
-import org.jkiss.dbeaver.DBException;
-import org.jkiss.dbeaver.Log;
-import org.jkiss.dbeaver.model.data.DBDContent;
-import org.jkiss.dbeaver.model.exec.DBCException;
-import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
-import org.jkiss.dbeaver.model.runtime.DBRRunnableWithProgress;
-import org.jkiss.dbeaver.model.runtime.DefaultProgressMonitor;
-import org.jkiss.dbeaver.runtime.DBWorkbench;
-import org.jkiss.dbeaver.ui.IRefreshablePart;
-import org.jkiss.dbeaver.ui.UIUtils;
-import org.jkiss.dbeaver.ui.controls.resultset.IResultSetContainer;
-import org.jkiss.dbeaver.ui.data.IStreamValueManager;
-import org.jkiss.dbeaver.ui.data.IValueController;
-import org.jkiss.dbeaver.ui.data.IValueEditorStandalone;
-import org.jkiss.dbeaver.ui.data.managers.stream.TextStreamValueManager;
-import org.jkiss.dbeaver.ui.data.registry.StreamValueManagerDescriptor;
-import org.jkiss.dbeaver.ui.data.registry.ValueManagerRegistry;
-import org.jkiss.dbeaver.ui.dialogs.ColumnInfoPanel;
-import org.jkiss.dbeaver.ui.dialogs.DialogUtils;
-import org.jkiss.dbeaver.ui.editors.MultiPageAbstractEditor;
-import org.jkiss.dbeaver.ui.editors.entity.EntityEditor;
-
-import java.io.File;
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * LOBEditor
- */
-public class ContentEditor extends MultiPageAbstractEditor implements IValueEditorStandalone, IRefreshablePart
-{
- @Override
- public ContentEditorInput getEditorInput()
- {
- return (ContentEditorInput)super.getEditorInput();
- }
-
- @Nullable
- public static ContentEditor openEditor(IValueController valueController)
- {
- ContentEditorInput editorInput;
- // Save data to file
- try {
- LOBInitializer initializer = new LOBInitializer(valueController);
- //valueController.getValueSite().getWorkbenchWindow().run(true, true, initializer);
- UIUtils.runInProgressService(initializer);
- editorInput = initializer.editorInput;
- } catch (Throwable e) {
- if (e instanceof InvocationTargetException) {
- e = ((InvocationTargetException)e).getTargetException();
- }
- DBWorkbench.getPlatformUI().showError("Cannot open content editor", null, e);
- return null;
- }
- try {
- return (ContentEditor) valueController.getValueSite().getWorkbenchWindow().getActivePage().openEditor(
- editorInput,
- ContentEditor.class.getName());
- }
- catch (PartInitException e) {
- log.error("Can't open CONTENT editorPart", e);
- return null;
- }
- }
-
- //public static final long MAX_TEXT_LENGTH = 10 * 1024 * 1024;
- //public static final long MAX_IMAGE_LENGTH = 10 * 1024 * 1024;
-
- private static final Log log = Log.getLog(ContentEditor.class);
-
- static class ContentPartInfo {
- IEditorPart editorPart;
- boolean isDefault;
- boolean activated;
- public int index = -1;
-
- private ContentPartInfo(IEditorPart editorPart, boolean isDefault) {
- this.editorPart = editorPart;
- this.isDefault = isDefault;
- }
- }
-
- private static class LOBInitializer implements DBRRunnableWithProgress {
- IValueController valueController;
- Object value;
- IEditorPart[] editorParts;
- IEditorPart defaultPart;
- ContentEditorInput editorInput;
-
- public LOBInitializer(IValueController valueController) {
- this.valueController = valueController;
- this.value = valueController.getValue();
- }
-
- private LOBInitializer(IValueController valueController, IEditorPart[] editorParts, IEditorPart defaultPart, @Nullable ContentEditorInput editorInput)
- {
- this.valueController = valueController;
- this.editorParts = editorParts;
- this.defaultPart = defaultPart;
- this.editorInput = editorInput;
- }
-
- @Override
- public void run(DBRProgressMonitor monitor) throws InvocationTargetException, InterruptedException
- {
- try {
- if (value != null && editorParts == null) {
- List parts = new ArrayList<>();
- if (value instanceof String) {
- TextStreamValueManager valueManager = new TextStreamValueManager();
- defaultPart = valueManager.createEditorPart(valueController);
- parts.add(defaultPart);
- } else if (value instanceof DBDContent) {
- DBDContent content = (DBDContent) value;
- Map streamManagers =
- ValueManagerRegistry.getInstance().getApplicableStreamManagers(monitor, valueController.getValueType(), content);
- IStreamValueManager.MatchType defaultMatch = null;
- for (Map.Entry entry : streamManagers.entrySet()) {
- IStreamValueManager streamValueManager = entry.getKey().getInstance();
- try {
- IEditorPart editorPart = streamValueManager.createEditorPart(valueController);
- IStreamValueManager.MatchType matchType = entry.getValue();
- if (defaultPart == null) {
- defaultPart = editorPart;
- defaultMatch = matchType;
- } else {
- boolean setDefault = false;
- switch (matchType) {
- case EXCLUSIVE:
- case PRIMARY:
- setDefault = true;
- break;
- case DEFAULT:
- setDefault = (defaultMatch == IStreamValueManager.MatchType.APPLIES);
- break;
- default:
- break;
- }
- if (setDefault) {
- defaultPart = editorPart;
- defaultMatch = matchType;
- }
- }
- parts.add(editorPart);
- } catch (DBException e) {
- log.error(e);
- }
- }
- }
- editorParts = parts.toArray(new IEditorPart[parts.size()]);
- }
-
- if (editorInput == null) {
- editorInput = new ContentEditorInput(
- valueController,
- editorParts,
- defaultPart,
- monitor);
- } else {
- editorInput.refreshContent(monitor, valueController);
- }
- } catch (DBException e) {
- throw new InvocationTargetException(e);
- }
- }
-
- }
-
- private List contentParts = new ArrayList<>();
- private ColumnInfoPanel infoPanel;
- private boolean dirty;
- private boolean partsLoaded;
- private boolean saveInProgress;
-
- public ContentEditor()
- {
- }
-
- @Override
- public void doSave(final IProgressMonitor monitor)
- {
- if (!isDirty()) {
- // Nothing to save
- return;
- }
- // Execute save in UI thread
- UIUtils.syncExec(() -> {
- try {
- // Check for dirty parts
- final List dirtyParts = new ArrayList<>();
- for (ContentPartInfo partInfo : contentParts) {
- if (partInfo.activated && partInfo.editorPart.isDirty()) {
- dirtyParts.add(partInfo.editorPart);
- }
- }
-
- IEditorPart dirtyPart = null;
- if (dirtyParts.isEmpty()) {
- // No modified parts - no additional save required
- } else if (dirtyParts.size() == 1) {
- // Single part modified - save it
- dirtyPart = dirtyParts.get(0);
- } else {
- // Multiple parts modified - need to choose one
- dirtyPart = SelectContentPartDialog.selectContentPart(getSite().getShell(), dirtyParts);
- }
-
- if (dirtyPart != null) {
- saveInProgress = true;
- try {
- dirtyPart.doSave(monitor);
- } finally {
- saveInProgress = false;
- }
- }
- // Set dirty flag - if error will occur during content save
- // then document remains dirty
- ContentEditor.this.dirty = true;
-
- ContentEditorInput editorInput = getEditorInput();
- editorInput.updateContentFromFile(new DefaultProgressMonitor(monitor), editorInput.getValue());
- editorInput.getValueController().updateValue(editorInput.getValue(), true);
-
- // Activate owner editor and focus on cell corresponding to this content editor
- IWorkbenchPartSite parentEditorSite = editorInput.getValueController().getValueSite();
- IWorkbenchPart parentEditor;
- if (parentEditorSite instanceof MultiPageEditorSite) {
- parentEditor = ((MultiPageEditorSite) parentEditorSite).getMultiPageEditor();
- if (parentEditor instanceof EntityEditor) {
- ((EntityEditor) parentEditor).setActiveEditor(IResultSetContainer.class);
- }
- } else {
- parentEditor = parentEditorSite.getPart();
- }
- parentEditorSite.getWorkbenchWindow().getActivePage().activate(parentEditor);
-
- // Close editor
- closeValueEditor();
- } catch (Exception e) {
- DBWorkbench.getPlatformUI().showError(
- "Can't save content",
- "Can't save content to database",
- e);
- }
- });
- }
-
- @Override
- public void doSaveAs()
- {
- Shell shell = getSite().getShell();
- final File saveFile = DialogUtils.selectFileForSave(shell, getPartName());
- if (saveFile == null) {
- return;
- }
- try {
- getSite().getWorkbenchWindow().run(true, true, monitor -> {
- try {
- getEditorInput().saveToExternalFile(saveFile, monitor);
- }
- catch (CoreException e) {
- throw new InvocationTargetException(e);
- }
- });
- }
- catch (InvocationTargetException e) {
- DBWorkbench.getPlatformUI().showError(
- "Can't save content",
- "Can't save content to file '" + saveFile.getAbsolutePath() + "'",
- e.getTargetException());
- }
- catch (InterruptedException e) {
- // do nothing
- }
- }
-
- @Override
- public void init(IEditorSite site, IEditorInput input)
- throws PartInitException
- {
- super.init(site, input);
- setPartName(input.getName());
-
- // Fill nested editorParts info
- IEditorPart[] editorParts = getEditorInput().getEditors();
- for (IEditorPart editorPart : editorParts) {
- contentParts.add(new ContentPartInfo(editorPart, editorPart == getEditorInput().getDefaultEditor()));
- //editorPart.init(site, input);
- }
-
- //ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
- }
-
- @Override
- public void dispose()
- {
- this.partsLoaded = true;
- //ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
-
- if (getEditorInput() != null) {
- // Release CONTENT input resources
- try {
- getEditorInput().release();
- } catch (Throwable e) {
- log.warn("Error releasing CONTENT input", e);
- }
- }
- super.dispose();
- }
-
- @Override
- public boolean isDirty()
- {
- if (dirty) {
- return true;
- }
- for (ContentPartInfo contentPart : contentParts) {
- if (contentPart.activated && contentPart.editorPart.isDirty()) {
- return true;
- }
- }
- return false;
- }
-
- @Override
- public void setDirty(boolean dirty) {
- this.dirty = dirty;
- }
-
- @Override
- public boolean isSaveAsAllowed()
- {
- return true;
- }
-
- @Override
- protected IEditorSite createSite(IEditorPart editor)
- {
- return new ContentEditorSite(this, editor);
- }
-
- @Override
- protected void createPages() {
- super.createPages();
- ContentPartInfo defaultPage = null;
- for (ContentPartInfo contentPart : contentParts) {
- if (contentPart.isDefault) {
- defaultPage = contentPart;
- }
- IEditorPart editorPart = contentPart.editorPart;
- try {
- int index = addPage(editorPart, getEditorInput());
- setPageText(index, editorPart.getTitle());
- setPageImage(index, editorPart.getTitleImage());
- contentPart.activated = true;
- contentPart.index = index;
- } catch (PartInitException e) {
- log.error(e);
- }
- }
- if (defaultPage != null) {
- setActiveEditor(defaultPage.editorPart);
- }
-
- this.partsLoaded = true;
- }
-
- @Override
- public void removePage(int pageIndex) {
- for (ContentPartInfo contentPart : contentParts) {
- if (contentPart.index == pageIndex) {
- contentPart.index = -1;
- } else if (contentPart.index > pageIndex) {
- contentPart.index--;
- }
- }
- super.removePage(pageIndex);
- }
-
- @Override
- protected Composite createPageContainer(Composite parent)
- {
- SashForm panel = UIUtils.createPartDivider(this, parent, SWT.VERTICAL);
-/*
- GridLayout layout = new GridLayout(1, false);
- layout.marginHeight = 0;
- layout.marginWidth = 0;
- layout.verticalSpacing = 0;
- layout.horizontalSpacing = 0;
- panel.setLayout(layout);
-*/
- if (parent.getLayout() instanceof GridLayout) {
- panel.setLayoutData(new GridData(GridData.FILL_BOTH));
- }
-
- {
- IValueController valueController = getValueController();
- assert valueController != null;
- infoPanel = new ColumnInfoPanel(panel, SWT.NONE, valueController);
- GridData gd = new GridData(GridData.FILL_HORIZONTAL);
- gd.exclude = true;
- infoPanel.setLayoutData(gd);
- }
-
- Composite editorPanel = new Composite(panel, SWT.NONE);
- GridLayout layout = new GridLayout(1, false);
- layout.marginHeight = 0;
- layout.marginWidth = 0;
- layout.verticalSpacing = 0;
- layout.horizontalSpacing = 0;
- editorPanel.setLayout(layout);
- editorPanel.setLayoutData(new GridData(GridData.FILL_BOTH));
-
- panel.setMaximizedControl(editorPanel);
-
- return editorPanel;
- }
-
- void toggleInfoBar()
- {
- SashForm sashForm = (SashForm) infoPanel.getParent();
- boolean visible = sashForm.getMaximizedControl() == null;
- if (visible) {
- sashForm.setMaximizedControl(sashForm.getChildren()[1]);
- } else {
- sashForm.setMaximizedControl(null);
- infoPanel.layoutProperties();
- }
- }
-
- @Nullable
- Object getValue()
- {
- IValueController valueController = getValueController();
- return valueController == null? null : valueController.getValue();
- }
-
- @Nullable
- public IValueController getValueController()
- {
- ContentEditorInput input = getEditorInput();
- return input == null ? null : input.getValueController();
- }
-
- @Override
- public void createControl() {
-
- }
-
- @Override
- public Control getControl()
- {
- // Return container control
- // Don't return active page because container may be already disposed (#2805)
- return super.getContainer();
-/*
- int activePage = getActivePage();
- return activePage < 0 ? null : getControl(activePage);
-*/
- }
-
- @Override
- public Object extractEditorValue() throws DBException
- {
- UIUtils.runInUI(monitor -> {
- try {
- getEditorInput().updateContentFromFile(monitor, getEditorInput().getValue());
- } catch (DBException e) {
- throw new InvocationTargetException(e);
- }
- });
-
- return getEditorInput().getValue();
- }
-
- @Override
- public void primeEditorValue(@Nullable Object value) throws DBException
- {
- ContentEditorInput input = getEditorInput();
- IValueController valueController = input.getValueController();
- LOBInitializer initializer = new LOBInitializer(valueController, input.getEditors(), input.getDefaultEditor(), input);
- try {
- //valueController.getValueSite().getWorkbenchWindow().run(true, true, initializer);
- UIUtils.runInProgressService(initializer);
- } catch (InvocationTargetException e) {
- DBWorkbench.getPlatformUI().showError("Cannot refresh content editor", null, e);
- } catch (InterruptedException e) {
- // ignore
- }
- }
-
- @Override
- public void contributeActions(@NotNull IContributionManager manager, @NotNull IValueController controller) throws DBCException {
-
- }
-
- @Override
- public void showValueEditor()
- {
- this.getEditorSite().getWorkbenchWindow().getActivePage().activate(this);
- }
-
- @Override
- public void closeValueEditor()
- {
- IWorkbenchPage workbenchPage = this.getEditorSite().getWorkbenchWindow().getActivePage();
- if (workbenchPage != null) {
- workbenchPage.closeEditor(this, false);
- }
- }
-
- @Override
- public void refreshPart(Object source, boolean force) {
- getEditorInput().refreshContentParts(source);
- fireContentChanged();
- }
-
- public void fireContentChanged() {
- firePropertyChange(ContentEditor.PROP_DIRTY);
- }
-
-/*
- @Override
- public void resourceChanged(IResourceChangeEvent event)
- {
- if (!partsLoaded || saveInProgress) {
- // No content change before all parts are loaded
- return;
- }
- IResourceDelta delta= event.getDelta();
- if (delta == null) {
- return;
- }
- delta = delta.findMember(ContentUtils.convertPathToWorkspacePath(getEditorInput().getPath()));
- if (delta == null) {
- return;
- }
- if (delta.getKind() == IResourceDelta.CHANGED &&
- (delta.getFlags() & IResourceDelta.CONTENT) != 0)
- {
- // Content was changed somehow so mark editor as dirty
- dirty = true;
- DBeaverUI.asyncExec(new Runnable() {
- @Override
- public void run() {
- firePropertyChange(PROP_DIRTY);
- }
- });
- }
- }
-*/
-
+/*
+ * DBeaver - Universal Database Manager
+ * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jkiss.dbeaver.ui.editors.content;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.action.IContributionManager;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.*;
+import org.eclipse.ui.part.MultiPageEditorSite;
+import org.jkiss.code.NotNull;
+import org.jkiss.code.Nullable;
+import org.jkiss.dbeaver.DBException;
+import org.jkiss.dbeaver.Log;
+import org.jkiss.dbeaver.model.data.DBDContent;
+import org.jkiss.dbeaver.model.exec.DBCException;
+import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
+import org.jkiss.dbeaver.model.runtime.DBRRunnableWithProgress;
+import org.jkiss.dbeaver.model.runtime.DefaultProgressMonitor;
+import org.jkiss.dbeaver.runtime.DBWorkbench;
+import org.jkiss.dbeaver.ui.IRefreshablePart;
+import org.jkiss.dbeaver.ui.UIUtils;
+import org.jkiss.dbeaver.ui.controls.ColumnInfoPanel;
+import org.jkiss.dbeaver.ui.data.IStreamValueManager;
+import org.jkiss.dbeaver.ui.data.IValueController;
+import org.jkiss.dbeaver.ui.data.IValueEditorStandalone;
+import org.jkiss.dbeaver.ui.data.managers.stream.TextStreamValueManager;
+import org.jkiss.dbeaver.ui.data.registry.StreamValueManagerDescriptor;
+import org.jkiss.dbeaver.ui.data.registry.ValueManagerRegistry;
+import org.jkiss.dbeaver.ui.dialogs.DialogUtils;
+import org.jkiss.dbeaver.ui.editors.MultiPageAbstractEditor;
+import org.jkiss.dbeaver.ui.editors.entity.EntityEditor;
+import org.jkiss.dbeaver.ui.editors.entity.IEntityDataContainer;
+
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * LOBEditor
+ */
+public class ContentEditor extends MultiPageAbstractEditor implements IValueEditorStandalone, IRefreshablePart
+{
+ @Override
+ public ContentEditorInput getEditorInput()
+ {
+ return (ContentEditorInput)super.getEditorInput();
+ }
+
+ @Nullable
+ public static ContentEditor openEditor(IValueController valueController)
+ {
+ ContentEditorInput editorInput;
+ // Save data to file
+ try {
+ LOBInitializer initializer = new LOBInitializer(valueController);
+ //valueController.getValueSite().getWorkbenchWindow().run(true, true, initializer);
+ UIUtils.runInProgressService(initializer);
+ editorInput = initializer.editorInput;
+ } catch (Throwable e) {
+ if (e instanceof InvocationTargetException) {
+ e = ((InvocationTargetException)e).getTargetException();
+ }
+ DBWorkbench.getPlatformUI().showError("Cannot open content editor", null, e);
+ return null;
+ }
+ try {
+ return (ContentEditor) valueController.getValueSite().getWorkbenchWindow().getActivePage().openEditor(
+ editorInput,
+ ContentEditor.class.getName());
+ }
+ catch (PartInitException e) {
+ log.error("Can't open CONTENT editorPart", e);
+ return null;
+ }
+ }
+
+ //public static final long MAX_TEXT_LENGTH = 10 * 1024 * 1024;
+ //public static final long MAX_IMAGE_LENGTH = 10 * 1024 * 1024;
+
+ private static final Log log = Log.getLog(ContentEditor.class);
+
+ static class ContentPartInfo {
+ IEditorPart editorPart;
+ boolean isDefault;
+ boolean activated;
+ public int index = -1;
+
+ private ContentPartInfo(IEditorPart editorPart, boolean isDefault) {
+ this.editorPart = editorPart;
+ this.isDefault = isDefault;
+ }
+ }
+
+ private static class LOBInitializer implements DBRRunnableWithProgress {
+ IValueController valueController;
+ Object value;
+ IEditorPart[] editorParts;
+ IEditorPart defaultPart;
+ ContentEditorInput editorInput;
+
+ public LOBInitializer(IValueController valueController) {
+ this.valueController = valueController;
+ this.value = valueController.getValue();
+ }
+
+ private LOBInitializer(IValueController valueController, IEditorPart[] editorParts, IEditorPart defaultPart, @Nullable ContentEditorInput editorInput)
+ {
+ this.valueController = valueController;
+ this.editorParts = editorParts;
+ this.defaultPart = defaultPart;
+ this.editorInput = editorInput;
+ }
+
+ @Override
+ public void run(DBRProgressMonitor monitor) throws InvocationTargetException, InterruptedException
+ {
+ try {
+ if (value != null && editorParts == null) {
+ List parts = new ArrayList<>();
+ if (value instanceof String) {
+ TextStreamValueManager valueManager = new TextStreamValueManager();
+ defaultPart = valueManager.createEditorPart(valueController);
+ parts.add(defaultPart);
+ } else if (value instanceof DBDContent) {
+ DBDContent content = (DBDContent) value;
+ Map streamManagers =
+ ValueManagerRegistry.getInstance().getApplicableStreamManagers(monitor, valueController.getValueType(), content);
+ IStreamValueManager.MatchType defaultMatch = null;
+ for (Map.Entry entry : streamManagers.entrySet()) {
+ IStreamValueManager streamValueManager = entry.getKey().getInstance();
+ try {
+ IEditorPart editorPart = streamValueManager.createEditorPart(valueController);
+ IStreamValueManager.MatchType matchType = entry.getValue();
+ if (defaultPart == null) {
+ defaultPart = editorPart;
+ defaultMatch = matchType;
+ } else {
+ boolean setDefault = false;
+ switch (matchType) {
+ case EXCLUSIVE:
+ case PRIMARY:
+ setDefault = true;
+ break;
+ case DEFAULT:
+ setDefault = (defaultMatch == IStreamValueManager.MatchType.APPLIES);
+ break;
+ default:
+ break;
+ }
+ if (setDefault) {
+ defaultPart = editorPart;
+ defaultMatch = matchType;
+ }
+ }
+ parts.add(editorPart);
+ } catch (DBException e) {
+ log.error(e);
+ }
+ }
+ }
+ editorParts = parts.toArray(new IEditorPart[parts.size()]);
+ }
+
+ if (editorInput == null) {
+ editorInput = new ContentEditorInput(
+ valueController,
+ editorParts,
+ defaultPart,
+ monitor);
+ } else {
+ editorInput.refreshContent(monitor, valueController);
+ }
+ } catch (DBException e) {
+ throw new InvocationTargetException(e);
+ }
+ }
+
+ }
+
+ private List contentParts = new ArrayList<>();
+ private ColumnInfoPanel infoPanel;
+ private boolean dirty;
+ private boolean partsLoaded;
+ private boolean saveInProgress;
+
+ public ContentEditor()
+ {
+ }
+
+ @Override
+ public void doSave(final IProgressMonitor monitor)
+ {
+ if (!isDirty()) {
+ // Nothing to save
+ return;
+ }
+ // Execute save in UI thread
+ UIUtils.syncExec(() -> {
+ try {
+ // Check for dirty parts
+ final List dirtyParts = new ArrayList<>();
+ for (ContentPartInfo partInfo : contentParts) {
+ if (partInfo.activated && partInfo.editorPart.isDirty()) {
+ dirtyParts.add(partInfo.editorPart);
+ }
+ }
+
+ IEditorPart dirtyPart = null;
+ if (dirtyParts.isEmpty()) {
+ // No modified parts - no additional save required
+ } else if (dirtyParts.size() == 1) {
+ // Single part modified - save it
+ dirtyPart = dirtyParts.get(0);
+ } else {
+ // Multiple parts modified - need to choose one
+ dirtyPart = SelectContentPartDialog.selectContentPart(getSite().getShell(), dirtyParts);
+ }
+
+ if (dirtyPart != null) {
+ saveInProgress = true;
+ try {
+ dirtyPart.doSave(monitor);
+ } finally {
+ saveInProgress = false;
+ }
+ }
+ // Set dirty flag - if error will occur during content save
+ // then document remains dirty
+ ContentEditor.this.dirty = true;
+
+ ContentEditorInput editorInput = getEditorInput();
+ editorInput.updateContentFromFile(new DefaultProgressMonitor(monitor), editorInput.getValue());
+ editorInput.getValueController().updateValue(editorInput.getValue(), true);
+
+ // Activate owner editor and focus on cell corresponding to this content editor
+ IWorkbenchPartSite parentEditorSite = editorInput.getValueController().getValueSite();
+ IWorkbenchPart parentEditor;
+ if (parentEditorSite instanceof MultiPageEditorSite) {
+ parentEditor = ((MultiPageEditorSite) parentEditorSite).getMultiPageEditor();
+ if (parentEditor instanceof EntityEditor) {
+ ((EntityEditor) parentEditor).setActiveEditor(IEntityDataContainer.class);
+ }
+ } else {
+ parentEditor = parentEditorSite.getPart();
+ }
+ parentEditorSite.getWorkbenchWindow().getActivePage().activate(parentEditor);
+
+ // Close editor
+ closeValueEditor();
+ } catch (Exception e) {
+ DBWorkbench.getPlatformUI().showError(
+ "Can't save content",
+ "Can't save content to database",
+ e);
+ }
+ });
+ }
+
+ @Override
+ public void doSaveAs()
+ {
+ Shell shell = getSite().getShell();
+ final File saveFile = DialogUtils.selectFileForSave(shell, getPartName());
+ if (saveFile == null) {
+ return;
+ }
+ try {
+ getSite().getWorkbenchWindow().run(true, true, monitor -> {
+ try {
+ getEditorInput().saveToExternalFile(saveFile, monitor);
+ }
+ catch (CoreException e) {
+ throw new InvocationTargetException(e);
+ }
+ });
+ }
+ catch (InvocationTargetException e) {
+ DBWorkbench.getPlatformUI().showError(
+ "Can't save content",
+ "Can't save content to file '" + saveFile.getAbsolutePath() + "'",
+ e.getTargetException());
+ }
+ catch (InterruptedException e) {
+ // do nothing
+ }
+ }
+
+ @Override
+ public void init(IEditorSite site, IEditorInput input)
+ throws PartInitException
+ {
+ super.init(site, input);
+ setPartName(input.getName());
+
+ // Fill nested editorParts info
+ IEditorPart[] editorParts = getEditorInput().getEditors();
+ for (IEditorPart editorPart : editorParts) {
+ contentParts.add(new ContentPartInfo(editorPart, editorPart == getEditorInput().getDefaultEditor()));
+ //editorPart.init(site, input);
+ }
+
+ //ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
+ }
+
+ @Override
+ public void dispose()
+ {
+ this.partsLoaded = true;
+ //ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
+
+ if (getEditorInput() != null) {
+ // Release CONTENT input resources
+ try {
+ getEditorInput().release();
+ } catch (Throwable e) {
+ log.warn("Error releasing CONTENT input", e);
+ }
+ }
+ super.dispose();
+ }
+
+ @Override
+ public boolean isDirty()
+ {
+ if (dirty) {
+ return true;
+ }
+ for (ContentPartInfo contentPart : contentParts) {
+ if (contentPart.activated && contentPart.editorPart.isDirty()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public void setDirty(boolean dirty) {
+ this.dirty = dirty;
+ }
+
+ @Override
+ public boolean isSaveAsAllowed()
+ {
+ return true;
+ }
+
+ @Override
+ protected IEditorSite createSite(IEditorPart editor)
+ {
+ return new ContentEditorSite(this, editor);
+ }
+
+ @Override
+ protected void createPages() {
+ super.createPages();
+ ContentPartInfo defaultPage = null;
+ for (ContentPartInfo contentPart : contentParts) {
+ if (contentPart.isDefault) {
+ defaultPage = contentPart;
+ }
+ IEditorPart editorPart = contentPart.editorPart;
+ try {
+ int index = addPage(editorPart, getEditorInput());
+ setPageText(index, editorPart.getTitle());
+ setPageImage(index, editorPart.getTitleImage());
+ contentPart.activated = true;
+ contentPart.index = index;
+ } catch (PartInitException e) {
+ log.error(e);
+ }
+ }
+ if (defaultPage != null) {
+ setActiveEditor(defaultPage.editorPart);
+ }
+
+ this.partsLoaded = true;
+ }
+
+ @Override
+ public void removePage(int pageIndex) {
+ for (ContentPartInfo contentPart : contentParts) {
+ if (contentPart.index == pageIndex) {
+ contentPart.index = -1;
+ } else if (contentPart.index > pageIndex) {
+ contentPart.index--;
+ }
+ }
+ super.removePage(pageIndex);
+ }
+
+ @Override
+ protected Composite createPageContainer(Composite parent)
+ {
+ SashForm panel = UIUtils.createPartDivider(this, parent, SWT.VERTICAL);
+/*
+ GridLayout layout = new GridLayout(1, false);
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ layout.verticalSpacing = 0;
+ layout.horizontalSpacing = 0;
+ panel.setLayout(layout);
+*/
+ if (parent.getLayout() instanceof GridLayout) {
+ panel.setLayoutData(new GridData(GridData.FILL_BOTH));
+ }
+
+ {
+ IValueController valueController = getValueController();
+ assert valueController != null;
+ infoPanel = new ColumnInfoPanel(panel, SWT.NONE, valueController);
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ gd.exclude = true;
+ infoPanel.setLayoutData(gd);
+ }
+
+ Composite editorPanel = new Composite(panel, SWT.NONE);
+ GridLayout layout = new GridLayout(1, false);
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ layout.verticalSpacing = 0;
+ layout.horizontalSpacing = 0;
+ editorPanel.setLayout(layout);
+ editorPanel.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ panel.setMaximizedControl(editorPanel);
+
+ return editorPanel;
+ }
+
+ void toggleInfoBar()
+ {
+ SashForm sashForm = (SashForm) infoPanel.getParent();
+ boolean visible = sashForm.getMaximizedControl() == null;
+ if (visible) {
+ sashForm.setMaximizedControl(sashForm.getChildren()[1]);
+ } else {
+ sashForm.setMaximizedControl(null);
+ infoPanel.layoutProperties();
+ }
+ }
+
+ @Nullable
+ Object getValue()
+ {
+ IValueController valueController = getValueController();
+ return valueController == null? null : valueController.getValue();
+ }
+
+ @Nullable
+ public IValueController getValueController()
+ {
+ ContentEditorInput input = getEditorInput();
+ return input == null ? null : input.getValueController();
+ }
+
+ @Override
+ public void createControl() {
+
+ }
+
+ @Override
+ public Control getControl()
+ {
+ // Return container control
+ // Don't return active page because container may be already disposed (#2805)
+ return super.getContainer();
+/*
+ int activePage = getActivePage();
+ return activePage < 0 ? null : getControl(activePage);
+*/
+ }
+
+ @Override
+ public Object extractEditorValue() throws DBException
+ {
+ UIUtils.runInUI(monitor -> {
+ try {
+ getEditorInput().updateContentFromFile(monitor, getEditorInput().getValue());
+ } catch (DBException e) {
+ throw new InvocationTargetException(e);
+ }
+ });
+
+ return getEditorInput().getValue();
+ }
+
+ @Override
+ public void primeEditorValue(@Nullable Object value) throws DBException
+ {
+ ContentEditorInput input = getEditorInput();
+ IValueController valueController = input.getValueController();
+ LOBInitializer initializer = new LOBInitializer(valueController, input.getEditors(), input.getDefaultEditor(), input);
+ try {
+ //valueController.getValueSite().getWorkbenchWindow().run(true, true, initializer);
+ UIUtils.runInProgressService(initializer);
+ } catch (InvocationTargetException e) {
+ DBWorkbench.getPlatformUI().showError("Cannot refresh content editor", null, e);
+ } catch (InterruptedException e) {
+ // ignore
+ }
+ }
+
+ @Override
+ public void contributeActions(@NotNull IContributionManager manager, @NotNull IValueController controller) throws DBCException {
+
+ }
+
+ @Override
+ public void showValueEditor()
+ {
+ this.getEditorSite().getWorkbenchWindow().getActivePage().activate(this);
+ }
+
+ @Override
+ public void closeValueEditor()
+ {
+ IWorkbenchPage workbenchPage = this.getEditorSite().getWorkbenchWindow().getActivePage();
+ if (workbenchPage != null) {
+ workbenchPage.closeEditor(this, false);
+ }
+ }
+
+ @Override
+ public void refreshPart(Object source, boolean force) {
+ getEditorInput().refreshContentParts(source);
+ fireContentChanged();
+ }
+
+ public void fireContentChanged() {
+ firePropertyChange(ContentEditor.PROP_DIRTY);
+ }
+
+/*
+ @Override
+ public void resourceChanged(IResourceChangeEvent event)
+ {
+ if (!partsLoaded || saveInProgress) {
+ // No content change before all parts are loaded
+ return;
+ }
+ IResourceDelta delta= event.getDelta();
+ if (delta == null) {
+ return;
+ }
+ delta = delta.findMember(ContentUtils.convertPathToWorkspacePath(getEditorInput().getPath()));
+ if (delta == null) {
+ return;
+ }
+ if (delta.getKind() == IResourceDelta.CHANGED &&
+ (delta.getFlags() & IResourceDelta.CONTENT) != 0)
+ {
+ // Content was changed somehow so mark editor as dirty
+ dirty = true;
+ DBeaverUI.asyncExec(new Runnable() {
+ @Override
+ public void run() {
+ firePropertyChange(PROP_DIRTY);
+ }
+ });
+ }
+ }
+*/
+
}
\ No newline at end of file
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/content/ContentEditorContributor.java b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/content/ContentEditorContributor.java
similarity index 100%
rename from plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/content/ContentEditorContributor.java
rename to plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/content/ContentEditorContributor.java
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/content/ContentEditorInput.java b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/content/ContentEditorInput.java
similarity index 95%
rename from plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/content/ContentEditorInput.java
rename to plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/content/ContentEditorInput.java
index bf0fed0eb49c887528f320b68e9e48ed8720421d..47bbde639e322b9e52f7a2db716bef5445ea0acd 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/content/ContentEditorInput.java
+++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/content/ContentEditorInput.java
@@ -1,413 +1,413 @@
-/*
- * DBeaver - Universal Database Manager
- * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jkiss.dbeaver.ui.editors.content;
-
-import org.eclipse.core.resources.IStorage;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.*;
-import org.eclipse.ui.editors.text.IEncodingSupport;
-import org.jkiss.code.Nullable;
-import org.jkiss.dbeaver.DBException;
-import org.jkiss.dbeaver.Log;
-import org.jkiss.dbeaver.core.DBeaverCore;
-import org.jkiss.dbeaver.model.DBIcon;
-import org.jkiss.dbeaver.model.DBPContextProvider;
-import org.jkiss.dbeaver.model.DBValueFormatting;
-import org.jkiss.dbeaver.model.data.DBDContent;
-import org.jkiss.dbeaver.model.data.DBDContentCached;
-import org.jkiss.dbeaver.model.data.DBDContentStorage;
-import org.jkiss.dbeaver.model.data.DBDContentStorageLocal;
-import org.jkiss.dbeaver.model.exec.DBCException;
-import org.jkiss.dbeaver.model.exec.DBCExecutionContext;
-import org.jkiss.dbeaver.model.impl.BytesContentStorage;
-import org.jkiss.dbeaver.model.impl.ExternalContentStorage;
-import org.jkiss.dbeaver.model.impl.StringContentStorage;
-import org.jkiss.dbeaver.model.impl.TemporaryContentStorage;
-import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
-import org.jkiss.dbeaver.model.runtime.DefaultProgressMonitor;
-import org.jkiss.dbeaver.runtime.LocalFileStorage;
-import org.jkiss.dbeaver.ui.DBeaverIcons;
-import org.jkiss.dbeaver.ui.IRefreshablePart;
-import org.jkiss.dbeaver.ui.data.IAttributeController;
-import org.jkiss.dbeaver.ui.data.IValueController;
-import org.jkiss.dbeaver.ui.editors.IStatefulEditorInput;
-import org.jkiss.dbeaver.ui.editors.StringEditorInput;
-import org.jkiss.dbeaver.utils.ContentUtils;
-import org.jkiss.dbeaver.utils.GeneralUtils;
-import org.jkiss.dbeaver.utils.RuntimeUtils;
-import org.jkiss.utils.CommonUtils;
-import org.jkiss.utils.IOUtils;
-
-import java.io.*;
-
-/**
- * ContentEditorInput
- */
-public class ContentEditorInput implements IPathEditorInput, IStatefulEditorInput, DBPContextProvider, IEncodingSupport
-{
- private static final Log log = Log.getLog(ContentEditorInput.class);
-
- private IValueController valueController;
- private IEditorPart[] editorParts;
- private IEditorPart defaultPart;
-
- private boolean contentDetached = false;
- private File contentFile;
- private String fileCharset;
- private StringEditorInput.StringStorage stringStorage;
-
- public ContentEditorInput(
- IValueController valueController,
- IEditorPart[] editorParts,
- IEditorPart defaultPart,
- DBRProgressMonitor monitor)
- throws DBException
- {
- this.valueController = valueController;
- this.editorParts = editorParts;
- this.defaultPart = defaultPart;
- this.fileCharset = getDefaultEncoding();
- this.prepareContent(monitor);
- }
-
- public IValueController getValueController()
- {
- return valueController;
- }
-
- public void refreshContent(DBRProgressMonitor monitor, IValueController valueController) throws DBException
- {
- this.valueController = valueController;
- this.prepareContent(monitor);
- }
-
- IEditorPart[] getEditors()
- {
- return editorParts;
- }
-
- public IEditorPart getDefaultEditor() {
- return defaultPart;
- }
-
- @Override
- public boolean exists()
- {
- return false;
- }
-
- @Override
- public ImageDescriptor getImageDescriptor()
- {
- return DBeaverIcons.getImageDescriptor(DBIcon.TYPE_LOB);
- }
-
- @Override
- public String getName()
- {
- String inputName;
- if (valueController instanceof IAttributeController) {
- inputName = ((IAttributeController) valueController).getColumnId();
- } else {
- inputName = valueController.getValueName();
- }
- if (isReadOnly()) {
- inputName += " [Read Only]";
- }
- return inputName;
- }
-
- @Nullable
- @Override
- public IPersistableElement getPersistable()
- {
- return null;
- }
-
- @Override
- public String getToolTipText()
- {
- return getName();
- }
-
- @Nullable
- @Override
- public T getAdapter(Class adapter)
- {
- if (adapter == IStorage.class) {
- if (stringStorage != null) {
- return adapter.cast(stringStorage);
- } else {
- return adapter.cast(new LocalFileStorage(contentFile, fileCharset));
- }
- }
- return null;
- }
-
- public Object getValue() {
- return valueController.getValue();
- }
-
- private void prepareContent(DBRProgressMonitor monitor)
- throws DBException
- {
- Object value = getValue();
- DBDContent content;
- if (value instanceof DBDContent) {
- content = (DBDContent) value;
- } else {
- // No need to do init
- stringStorage = new StringEditorInput(getName(), CommonUtils.toString(value), isReadOnly(), fileCharset).getStorage();
- return;
- }
-
- DBDContentStorage storage = content.getContents(monitor);
-
- if (contentDetached) {
- release();
- contentDetached = false;
- }
- if (storage instanceof DBDContentStorageLocal) {
- // User content's storage directly
- contentFile = ((DBDContentStorageLocal)storage).getDataFile();
- contentDetached = true;
- } else {
- // Copy content to local file
- try {
- // Create file
- if (contentFile == null) {
- String valueId;
- if (valueController instanceof IAttributeController) {
- valueId = ((IAttributeController) valueController).getColumnId();
- } else {
- valueId = valueController.getValueName();
- }
-
- contentFile = ContentUtils.createTempContentFile(monitor, DBeaverCore.getInstance(), valueId);
- }
-
- // Write value to file
- copyContentToFile(content, monitor);
- }
- catch (IOException e) {
- // Delete temp file
- if (contentFile != null && contentFile.exists()) {
- if (!contentFile.delete()) {
- log.warn("Can't delete temporary content file '" + contentFile.getAbsolutePath() + "'");
- }
- }
- throw new DBException("Can't delete content file", e);
- }
- }
-
- // Mark file as readonly
- if (valueController.isReadOnly()) {
- markReadOnly(true);
- }
- }
-
- private void markReadOnly(boolean readOnly) throws DBException
- {
- if (!contentFile.setWritable(!readOnly)) {
- throw new DBException("Can't set content read-only");
- }
- }
-
- public void release()
- {
- if (contentFile != null && !contentDetached) {
- if (!contentFile.delete()) {
- log.warn("Can't delete temp file '" + contentFile.getAbsolutePath() + "'");
- }
- contentDetached = true;
- }
- stringStorage = null;
- }
-
- @Nullable
- @Override
- public IPath getPath()
- {
- return contentFile == null ? null : new Path(contentFile.getAbsolutePath());
- }
-
- public boolean isReadOnly() {
- return valueController.isReadOnly();
- }
-
- void saveToExternalFile(File file, IProgressMonitor monitor)
- throws CoreException
- {
- try (InputStream is = openContents()) {
- ContentUtils.saveContentToFile(
- is,
- file,
- RuntimeUtils.makeMonitor(monitor));
- }
- catch (Exception e) {
- throw new CoreException(GeneralUtils.makeExceptionStatus(e));
- }
- }
-
- private InputStream openContents() throws Exception {
- return stringStorage == null ? new FileInputStream(contentFile) : stringStorage.getContents();
- }
-
- void loadFromExternalFile(File extFile, IProgressMonitor monitor)
- throws CoreException
- {
- try {
- release();
- contentFile = extFile;
- contentDetached = true;
- Object value = getValue();
- if (value instanceof DBDContent) {
- ((DBDContent)value).updateContents(
- new DefaultProgressMonitor(monitor),
- new ExternalContentStorage(DBeaverCore.getInstance(), extFile));
- } else {
- updateStringValueFromFile(extFile);
- }
- refreshContentParts(extFile);
- }
- catch (Throwable e) {
- throw new CoreException(GeneralUtils.makeExceptionStatus(e));
- }
- }
-
- private void updateStringValueFromFile(File extFile) throws DBException {
- try (FileReader is = new FileReader(extFile)) {
- String str = IOUtils.readToString(is);
- stringStorage.setString(str);
- valueController.updateValue(str, false);
-
- } catch (IOException e) {
- throw new DBException("Error reading content from file", e);
- }
- }
-
- void refreshContentParts(Object source) {
- // Refresh editor parts
- for (IEditorPart cePart : editorParts) {
- if (cePart instanceof IRefreshablePart) {
- ((IRefreshablePart) cePart).refreshPart(source, false);
- }
- }
- }
-
- private void copyContentToFile(DBDContent contents, DBRProgressMonitor monitor)
- throws DBException, IOException
- {
- DBDContentStorage storage = contents.getContents(monitor);
-
- markReadOnly(false);
-
- try (OutputStream os = new FileOutputStream(contentFile)) {
- if (contents.isNull()) {
- ContentUtils.copyStreams(new ByteArrayInputStream(new byte[0]), 0, os, monitor);
- } else {
- if (storage == null) {
- log.warn("Can't get data from null storage");
- return;
- }
- try (InputStream is = storage.getContentStream()) {
- ContentUtils.copyStreams(is, storage.getContentLength(), os, monitor);
- }
- }
- }
-
- markReadOnly(valueController.isReadOnly());
- }
-
- public void updateContentFromFile(DBRProgressMonitor monitor, Object value)
- throws DBException
- {
- if (valueController.isReadOnly()) {
- throw new DBCException("Can't update read-only value");
- }
-
- if (value instanceof DBDContent) {
- DBDContent content = (DBDContent) value;
- DBDContentStorage storage = content.getContents(monitor);
- if (storage instanceof DBDContentStorageLocal) {
- // Nothing to update - we use content's storage
- content.updateContents(monitor, storage);
- contentDetached = true;
- } else if (storage instanceof DBDContentCached) {
- // Create new storage and pass it to content
- try (FileInputStream is = new FileInputStream(contentFile)) {
- if (ContentUtils.isTextContent(content)) {
- try (Reader reader = new InputStreamReader(is, fileCharset)) {
- storage = StringContentStorage.createFromReader(reader);
- }
- } else {
- storage = BytesContentStorage.createFromStream(is, contentFile.length(), fileCharset);
- }
- //StringContentStorage.
- contentDetached = content.updateContents(monitor, storage);
- } catch (IOException e) {
- throw new DBException("Error reading content from file", e);
- }
- } else {
- // Create new storage and pass it to content
- storage = new TemporaryContentStorage(DBeaverCore.getInstance(), contentFile, fileCharset);
- contentDetached = content.updateContents(monitor, storage);
- }
- } else if (stringStorage != null) {
- // Just read as string
- valueController.updateValue(stringStorage.getString(), false);
- contentDetached = true;
- }
- }
-
- @Nullable
- @Override
- public DBCExecutionContext getExecutionContext() {
- return valueController.getExecutionContext();
- }
-
- public String getEncoding() {
- return fileCharset;
- }
-
- @Override
- public String getDefaultEncoding() {
- if (valueController.getExecutionContext() == null) {
- return GeneralUtils.getDefaultFileEncoding();
- }
- return DBValueFormatting.getDefaultBinaryFileEncoding(valueController.getExecutionContext().getDataSource());
- }
-
- public void setEncoding(String fileCharset) {
- this.fileCharset = fileCharset;
- for (IEditorPart part : editorParts) {
- try {
- if (part instanceof IReusableEditor) {
- ((IReusableEditor) part).setInput(this);
- } else {
- part.init(part.getEditorSite(), this);
- }
- } catch (PartInitException e) {
- log.error("Error refreshing content editor part " + part, e);
- }
- }
- }
+/*
+ * DBeaver - Universal Database Manager
+ * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jkiss.dbeaver.ui.editors.content;
+
+import org.eclipse.core.resources.IStorage;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.*;
+import org.eclipse.ui.editors.text.IEncodingSupport;
+import org.jkiss.code.Nullable;
+import org.jkiss.dbeaver.DBException;
+import org.jkiss.dbeaver.Log;
+import org.jkiss.dbeaver.model.DBIcon;
+import org.jkiss.dbeaver.model.DBPContextProvider;
+import org.jkiss.dbeaver.model.DBValueFormatting;
+import org.jkiss.dbeaver.model.data.DBDContent;
+import org.jkiss.dbeaver.model.data.DBDContentCached;
+import org.jkiss.dbeaver.model.data.DBDContentStorage;
+import org.jkiss.dbeaver.model.data.DBDContentStorageLocal;
+import org.jkiss.dbeaver.model.exec.DBCException;
+import org.jkiss.dbeaver.model.exec.DBCExecutionContext;
+import org.jkiss.dbeaver.model.impl.BytesContentStorage;
+import org.jkiss.dbeaver.model.impl.ExternalContentStorage;
+import org.jkiss.dbeaver.model.impl.StringContentStorage;
+import org.jkiss.dbeaver.model.impl.TemporaryContentStorage;
+import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
+import org.jkiss.dbeaver.model.runtime.DefaultProgressMonitor;
+import org.jkiss.dbeaver.runtime.DBWorkbench;
+import org.jkiss.dbeaver.runtime.LocalFileStorage;
+import org.jkiss.dbeaver.ui.DBeaverIcons;
+import org.jkiss.dbeaver.ui.IRefreshablePart;
+import org.jkiss.dbeaver.ui.data.IAttributeController;
+import org.jkiss.dbeaver.ui.data.IValueController;
+import org.jkiss.dbeaver.ui.editors.IStatefulEditorInput;
+import org.jkiss.dbeaver.ui.editors.StringEditorInput;
+import org.jkiss.dbeaver.utils.ContentUtils;
+import org.jkiss.dbeaver.utils.GeneralUtils;
+import org.jkiss.dbeaver.utils.RuntimeUtils;
+import org.jkiss.utils.CommonUtils;
+import org.jkiss.utils.IOUtils;
+
+import java.io.*;
+
+/**
+ * ContentEditorInput
+ */
+public class ContentEditorInput implements IPathEditorInput, IStatefulEditorInput, DBPContextProvider, IEncodingSupport
+{
+ private static final Log log = Log.getLog(ContentEditorInput.class);
+
+ private IValueController valueController;
+ private IEditorPart[] editorParts;
+ private IEditorPart defaultPart;
+
+ private boolean contentDetached = false;
+ private File contentFile;
+ private String fileCharset;
+ private StringEditorInput.StringStorage stringStorage;
+
+ public ContentEditorInput(
+ IValueController valueController,
+ IEditorPart[] editorParts,
+ IEditorPart defaultPart,
+ DBRProgressMonitor monitor)
+ throws DBException
+ {
+ this.valueController = valueController;
+ this.editorParts = editorParts;
+ this.defaultPart = defaultPart;
+ this.fileCharset = getDefaultEncoding();
+ this.prepareContent(monitor);
+ }
+
+ public IValueController getValueController()
+ {
+ return valueController;
+ }
+
+ public void refreshContent(DBRProgressMonitor monitor, IValueController valueController) throws DBException
+ {
+ this.valueController = valueController;
+ this.prepareContent(monitor);
+ }
+
+ IEditorPart[] getEditors()
+ {
+ return editorParts;
+ }
+
+ public IEditorPart getDefaultEditor() {
+ return defaultPart;
+ }
+
+ @Override
+ public boolean exists()
+ {
+ return false;
+ }
+
+ @Override
+ public ImageDescriptor getImageDescriptor()
+ {
+ return DBeaverIcons.getImageDescriptor(DBIcon.TYPE_LOB);
+ }
+
+ @Override
+ public String getName()
+ {
+ String inputName;
+ if (valueController instanceof IAttributeController) {
+ inputName = ((IAttributeController) valueController).getColumnId();
+ } else {
+ inputName = valueController.getValueName();
+ }
+ if (isReadOnly()) {
+ inputName += " [Read Only]";
+ }
+ return inputName;
+ }
+
+ @Nullable
+ @Override
+ public IPersistableElement getPersistable()
+ {
+ return null;
+ }
+
+ @Override
+ public String getToolTipText()
+ {
+ return getName();
+ }
+
+ @Nullable
+ @Override
+ public T getAdapter(Class adapter)
+ {
+ if (adapter == IStorage.class) {
+ if (stringStorage != null) {
+ return adapter.cast(stringStorage);
+ } else {
+ return adapter.cast(new LocalFileStorage(contentFile, fileCharset));
+ }
+ }
+ return null;
+ }
+
+ public Object getValue() {
+ return valueController.getValue();
+ }
+
+ private void prepareContent(DBRProgressMonitor monitor)
+ throws DBException
+ {
+ Object value = getValue();
+ DBDContent content;
+ if (value instanceof DBDContent) {
+ content = (DBDContent) value;
+ } else {
+ // No need to do init
+ stringStorage = new StringEditorInput(getName(), CommonUtils.toString(value), isReadOnly(), fileCharset).getStorage();
+ return;
+ }
+
+ DBDContentStorage storage = content.getContents(monitor);
+
+ if (contentDetached) {
+ release();
+ contentDetached = false;
+ }
+ if (storage instanceof DBDContentStorageLocal) {
+ // User content's storage directly
+ contentFile = ((DBDContentStorageLocal)storage).getDataFile();
+ contentDetached = true;
+ } else {
+ // Copy content to local file
+ try {
+ // Create file
+ if (contentFile == null) {
+ String valueId;
+ if (valueController instanceof IAttributeController) {
+ valueId = ((IAttributeController) valueController).getColumnId();
+ } else {
+ valueId = valueController.getValueName();
+ }
+
+ contentFile = ContentUtils.createTempContentFile(monitor, DBWorkbench.getPlatform(), valueId);
+ }
+
+ // Write value to file
+ copyContentToFile(content, monitor);
+ }
+ catch (IOException e) {
+ // Delete temp file
+ if (contentFile != null && contentFile.exists()) {
+ if (!contentFile.delete()) {
+ log.warn("Can't delete temporary content file '" + contentFile.getAbsolutePath() + "'");
+ }
+ }
+ throw new DBException("Can't delete content file", e);
+ }
+ }
+
+ // Mark file as readonly
+ if (valueController.isReadOnly()) {
+ markReadOnly(true);
+ }
+ }
+
+ private void markReadOnly(boolean readOnly) throws DBException
+ {
+ if (!contentFile.setWritable(!readOnly)) {
+ throw new DBException("Can't set content read-only");
+ }
+ }
+
+ public void release()
+ {
+ if (contentFile != null && !contentDetached) {
+ if (!contentFile.delete()) {
+ log.warn("Can't delete temp file '" + contentFile.getAbsolutePath() + "'");
+ }
+ contentDetached = true;
+ }
+ stringStorage = null;
+ }
+
+ @Nullable
+ @Override
+ public IPath getPath()
+ {
+ return contentFile == null ? null : new Path(contentFile.getAbsolutePath());
+ }
+
+ public boolean isReadOnly() {
+ return valueController.isReadOnly();
+ }
+
+ void saveToExternalFile(File file, IProgressMonitor monitor)
+ throws CoreException
+ {
+ try (InputStream is = openContents()) {
+ ContentUtils.saveContentToFile(
+ is,
+ file,
+ RuntimeUtils.makeMonitor(monitor));
+ }
+ catch (Exception e) {
+ throw new CoreException(GeneralUtils.makeExceptionStatus(e));
+ }
+ }
+
+ private InputStream openContents() throws Exception {
+ return stringStorage == null ? new FileInputStream(contentFile) : stringStorage.getContents();
+ }
+
+ void loadFromExternalFile(File extFile, IProgressMonitor monitor)
+ throws CoreException
+ {
+ try {
+ release();
+ contentFile = extFile;
+ contentDetached = true;
+ Object value = getValue();
+ if (value instanceof DBDContent) {
+ ((DBDContent)value).updateContents(
+ new DefaultProgressMonitor(monitor),
+ new ExternalContentStorage(DBWorkbench.getPlatform(), extFile));
+ } else {
+ updateStringValueFromFile(extFile);
+ }
+ refreshContentParts(extFile);
+ }
+ catch (Throwable e) {
+ throw new CoreException(GeneralUtils.makeExceptionStatus(e));
+ }
+ }
+
+ private void updateStringValueFromFile(File extFile) throws DBException {
+ try (FileReader is = new FileReader(extFile)) {
+ String str = IOUtils.readToString(is);
+ stringStorage.setString(str);
+ valueController.updateValue(str, false);
+
+ } catch (IOException e) {
+ throw new DBException("Error reading content from file", e);
+ }
+ }
+
+ void refreshContentParts(Object source) {
+ // Refresh editor parts
+ for (IEditorPart cePart : editorParts) {
+ if (cePart instanceof IRefreshablePart) {
+ ((IRefreshablePart) cePart).refreshPart(source, false);
+ }
+ }
+ }
+
+ private void copyContentToFile(DBDContent contents, DBRProgressMonitor monitor)
+ throws DBException, IOException
+ {
+ DBDContentStorage storage = contents.getContents(monitor);
+
+ markReadOnly(false);
+
+ try (OutputStream os = new FileOutputStream(contentFile)) {
+ if (contents.isNull()) {
+ ContentUtils.copyStreams(new ByteArrayInputStream(new byte[0]), 0, os, monitor);
+ } else {
+ if (storage == null) {
+ log.warn("Can't get data from null storage");
+ return;
+ }
+ try (InputStream is = storage.getContentStream()) {
+ ContentUtils.copyStreams(is, storage.getContentLength(), os, monitor);
+ }
+ }
+ }
+
+ markReadOnly(valueController.isReadOnly());
+ }
+
+ public void updateContentFromFile(DBRProgressMonitor monitor, Object value)
+ throws DBException
+ {
+ if (valueController.isReadOnly()) {
+ throw new DBCException("Can't update read-only value");
+ }
+
+ if (value instanceof DBDContent) {
+ DBDContent content = (DBDContent) value;
+ DBDContentStorage storage = content.getContents(monitor);
+ if (storage instanceof DBDContentStorageLocal) {
+ // Nothing to update - we use content's storage
+ content.updateContents(monitor, storage);
+ contentDetached = true;
+ } else if (storage instanceof DBDContentCached) {
+ // Create new storage and pass it to content
+ try (FileInputStream is = new FileInputStream(contentFile)) {
+ if (ContentUtils.isTextContent(content)) {
+ try (Reader reader = new InputStreamReader(is, fileCharset)) {
+ storage = StringContentStorage.createFromReader(reader);
+ }
+ } else {
+ storage = BytesContentStorage.createFromStream(is, contentFile.length(), fileCharset);
+ }
+ //StringContentStorage.
+ contentDetached = content.updateContents(monitor, storage);
+ } catch (IOException e) {
+ throw new DBException("Error reading content from file", e);
+ }
+ } else {
+ // Create new storage and pass it to content
+ storage = new TemporaryContentStorage(DBWorkbench.getPlatform(), contentFile, fileCharset);
+ contentDetached = content.updateContents(monitor, storage);
+ }
+ } else if (stringStorage != null) {
+ // Just read as string
+ valueController.updateValue(stringStorage.getString(), false);
+ contentDetached = true;
+ }
+ }
+
+ @Nullable
+ @Override
+ public DBCExecutionContext getExecutionContext() {
+ return valueController.getExecutionContext();
+ }
+
+ public String getEncoding() {
+ return fileCharset;
+ }
+
+ @Override
+ public String getDefaultEncoding() {
+ if (valueController.getExecutionContext() == null) {
+ return GeneralUtils.getDefaultFileEncoding();
+ }
+ return DBValueFormatting.getDefaultBinaryFileEncoding(valueController.getExecutionContext().getDataSource());
+ }
+
+ public void setEncoding(String fileCharset) {
+ this.fileCharset = fileCharset;
+ for (IEditorPart part : editorParts) {
+ try {
+ if (part instanceof IReusableEditor) {
+ ((IReusableEditor) part).setInput(this);
+ } else {
+ part.init(part.getEditorSite(), this);
+ }
+ } catch (PartInitException e) {
+ log.error("Error refreshing content editor part " + part, e);
+ }
+ }
+ }
}
\ No newline at end of file
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/content/ContentEditorSite.java b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/content/ContentEditorSite.java
similarity index 96%
rename from plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/content/ContentEditorSite.java
rename to plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/content/ContentEditorSite.java
index a1ef43502d8f9d5b99131346e295186914b19ac4..9b3f36f4340600283509ccd4d00af8f5e334b61e 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/content/ContentEditorSite.java
+++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/content/ContentEditorSite.java
@@ -1,38 +1,38 @@
-/*
- * DBeaver - Universal Database Manager
- * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jkiss.dbeaver.ui.editors.content;
-
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.part.MultiPageEditorSite;
-
-/**
- * Content Editor Site
- */
-class ContentEditorSite extends MultiPageEditorSite {
-
- public ContentEditorSite(ContentEditor contentEditor, IEditorPart editor)
- {
- super(contentEditor, editor);
- }
-
- @Override
- public IWorkbenchPart getPart() {
- return getMultiPageEditor();
- }
-
-}
+/*
+ * DBeaver - Universal Database Manager
+ * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jkiss.dbeaver.ui.editors.content;
+
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.part.MultiPageEditorSite;
+
+/**
+ * Content Editor Site
+ */
+class ContentEditorSite extends MultiPageEditorSite {
+
+ public ContentEditorSite(ContentEditor contentEditor, IEditorPart editor)
+ {
+ super(contentEditor, editor);
+ }
+
+ @Override
+ public IWorkbenchPart getPart() {
+ return getMultiPageEditor();
+ }
+
+}
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/content/SelectContentPartDialog.java b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/content/SelectContentPartDialog.java
similarity index 96%
rename from plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/content/SelectContentPartDialog.java
rename to plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/content/SelectContentPartDialog.java
index ebc95ac240203d999d861612dd965744405fa331..b9783b6dca96bcc42ac5e3eff12bdf6edb3a1544 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/content/SelectContentPartDialog.java
+++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/content/SelectContentPartDialog.java
@@ -1,111 +1,111 @@
-/*
- * DBeaver - Universal Database Manager
- * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jkiss.dbeaver.ui.editors.content;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.IEditorPart;
-
-import java.util.List;
-
-/**
- * SelectContentPartDialog
- *
- * @author Serge Rider
- */
-class SelectContentPartDialog extends Dialog {
-
- private List dirtyParts;
- private IEditorPart selectedPart;
-
- private SelectContentPartDialog(Shell parentShell, List dirtyParts)
- {
- super(parentShell);
- this.dirtyParts = dirtyParts;
- }
-
- @Override
- protected boolean isResizable()
- {
- return true;
- }
-
- @Override
- protected Control createDialogArea(Composite parent)
- {
- getShell().setText("Choose content editor");
-
- Composite group = (Composite) super.createDialogArea(parent);
- GridData gd = new GridData(GridData.FILL_BOTH);
- group.setLayoutData(gd);
-
- Label infoLabel = new Label(group, SWT.NONE);
- infoLabel.setText("Content was modified in mutliple editors. Choose correct one:");
- gd = new GridData(GridData.FILL_HORIZONTAL);
- infoLabel.setLayoutData(gd);
-
- final Combo combo = new Combo(group, SWT.READ_ONLY | SWT.DROP_DOWN);
- gd = new GridData(GridData.FILL_HORIZONTAL);
- combo.setLayoutData(gd);
- combo.add("");
- for (IEditorPart part : dirtyParts) {
- combo.add(part.getTitle());
- }
- combo.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e)
- {
- if (combo.getSelectionIndex() >= 1) {
- selectedPart = dirtyParts.get(combo.getSelectionIndex() - 1);
- } else {
- selectedPart = null;
- }
- getButton(IDialogConstants.OK_ID).setEnabled(selectedPart != null);
- }
- });
-
- return group;
- }
-
- @Override
- protected Control createContents(Composite parent)
- {
- Control ctl = super.createContents(parent);
- getButton(IDialogConstants.OK_ID).setEnabled(false);
- return ctl;
- }
-
- public IEditorPart getSelectedPart()
- {
- return selectedPart;
- }
-
- public static IEditorPart selectContentPart(Shell parentShell, List dirtyParts)
- {
- SelectContentPartDialog scDialog = new SelectContentPartDialog(parentShell, dirtyParts);
- if (scDialog.open() == IDialogConstants.OK_ID) {
- return scDialog.getSelectedPart();
- } else {
- return null;
- }
- }
+/*
+ * DBeaver - Universal Database Manager
+ * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jkiss.dbeaver.ui.editors.content;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.*;
+import org.eclipse.ui.IEditorPart;
+
+import java.util.List;
+
+/**
+ * SelectContentPartDialog
+ *
+ * @author Serge Rider
+ */
+class SelectContentPartDialog extends Dialog {
+
+ private List dirtyParts;
+ private IEditorPart selectedPart;
+
+ private SelectContentPartDialog(Shell parentShell, List dirtyParts)
+ {
+ super(parentShell);
+ this.dirtyParts = dirtyParts;
+ }
+
+ @Override
+ protected boolean isResizable()
+ {
+ return true;
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent)
+ {
+ getShell().setText("Choose content editor");
+
+ Composite group = (Composite) super.createDialogArea(parent);
+ GridData gd = new GridData(GridData.FILL_BOTH);
+ group.setLayoutData(gd);
+
+ Label infoLabel = new Label(group, SWT.NONE);
+ infoLabel.setText("Content was modified in mutliple editors. Choose correct one:");
+ gd = new GridData(GridData.FILL_HORIZONTAL);
+ infoLabel.setLayoutData(gd);
+
+ final Combo combo = new Combo(group, SWT.READ_ONLY | SWT.DROP_DOWN);
+ gd = new GridData(GridData.FILL_HORIZONTAL);
+ combo.setLayoutData(gd);
+ combo.add("");
+ for (IEditorPart part : dirtyParts) {
+ combo.add(part.getTitle());
+ }
+ combo.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e)
+ {
+ if (combo.getSelectionIndex() >= 1) {
+ selectedPart = dirtyParts.get(combo.getSelectionIndex() - 1);
+ } else {
+ selectedPart = null;
+ }
+ getButton(IDialogConstants.OK_ID).setEnabled(selectedPart != null);
+ }
+ });
+
+ return group;
+ }
+
+ @Override
+ protected Control createContents(Composite parent)
+ {
+ Control ctl = super.createContents(parent);
+ getButton(IDialogConstants.OK_ID).setEnabled(false);
+ return ctl;
+ }
+
+ public IEditorPart getSelectedPart()
+ {
+ return selectedPart;
+ }
+
+ public static IEditorPart selectContentPart(Shell parentShell, List dirtyParts)
+ {
+ SelectContentPartDialog scDialog = new SelectContentPartDialog(parentShell, dirtyParts);
+ if (scDialog.open() == IDialogConstants.OK_ID) {
+ return scDialog.getSelectedPart();
+ } else {
+ return null;
+ }
+ }
}
\ No newline at end of file
diff --git a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/data/internal/DataEditorsMessages.java b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/data/internal/DataEditorsMessages.java
index 65ab404b41e965c3dabdb94e04d801374460f6ec..956f3e22abbb8c425c5e48e0058e4c08d80b9d37 100644
--- a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/data/internal/DataEditorsMessages.java
+++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/data/internal/DataEditorsMessages.java
@@ -24,8 +24,9 @@ public class DataEditorsMessages extends NLS {
public static String grid_tooltip_sort_by_column;
public static String grid_tooltip_filter_by_column;
+ public static String controls_column_info_panel_property_key;
- static {
+ static {
// initialize resource bundle
NLS.initializeMessages(BUNDLE_NAME, DataEditorsMessages.class);
}
diff --git a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/data/internal/DataEditorsResources.properties b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/data/internal/DataEditorsResources.properties
index 2c99e5d42f8becf1f0b50826ba7db8fff0034c52..e47987212b1a77ffed18585d170fe986114290f6 100644
--- a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/data/internal/DataEditorsResources.properties
+++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/data/internal/DataEditorsResources.properties
@@ -1,3 +1,4 @@
grid_tooltip_sort_by_column = Sort by column
grid_tooltip_filter_by_column = Filter by column value
+controls_column_info_panel_property_key = Key
diff --git a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/data/internal/DataEditorsResources_de.properties b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/data/internal/DataEditorsResources_de.properties
index e1aadd16d15e3b7579e6fe4bf77d6ebc5adb0eff..4315892e2ac352c028c731dd5fcc2b64e9bc1271 100644
--- a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/data/internal/DataEditorsResources_de.properties
+++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/data/internal/DataEditorsResources_de.properties
@@ -1,2 +1,5 @@
grid_tooltip_filter_by_column = Filtern mit Spaltenwert
grid_tooltip_sort_by_column = Sortieren mit Spalte
+
+controls_column_info_panel_property_key = Schl\u00FCssel
+
diff --git a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/data/internal/DataEditorsResources_fr.properties b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/data/internal/DataEditorsResources_fr.properties
index c51f02cdd22f679bbcd62b39c5a961c2e991b105..b290cdc49157f061164bd1eb4bc9cef95efbfef0 100644
--- a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/data/internal/DataEditorsResources_fr.properties
+++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/data/internal/DataEditorsResources_fr.properties
@@ -1,2 +1,4 @@
grid_tooltip_sort_by_column = Trier par colonne
grid_tooltip_filter_by_column = Filtrer par la valeur de colonne
+
+controls_column_info_panel_property_key = Clef
diff --git a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/data/internal/DataEditorsResources_ja.properties b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/data/internal/DataEditorsResources_ja.properties
new file mode 100644
index 0000000000000000000000000000000000000000..8c54e4456d95a1604fcfad51db21c7149a1d2fcf
--- /dev/null
+++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/data/internal/DataEditorsResources_ja.properties
@@ -0,0 +1 @@
+controls_column_info_panel_property_key =\u30AD\u30FC
diff --git a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/data/internal/DataEditorsResources_ru.properties b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/data/internal/DataEditorsResources_ru.properties
index 3b65ba0c5d7132e6ae1c12a1fa6dc5b1a1072bb8..303f6f7ead111cc463f5debe0735772f2f9f4782 100644
--- a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/data/internal/DataEditorsResources_ru.properties
+++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/data/internal/DataEditorsResources_ru.properties
@@ -1,2 +1,4 @@
grid_tooltip_sort_by_column = \u0421\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u043A\u0430 \u043F\u043E \u043A\u043E\u043B\u043E\u043D\u043A\u0435
grid_tooltip_filter_by_column = \u0424\u0438\u043B\u044C\u0442\u0440 \u043F\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044E \u043A\u043E\u043B\u043E\u043D\u043A\u0438
+
+controls_column_info_panel_property_key=\u041A\u043B\u044E\u0447
diff --git a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/data/internal/DataEditorsResources_zh.properties b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/data/internal/DataEditorsResources_zh.properties
index a643d648d9ad007d833a9b58b6b3a49e9046d6b4..0a495b08b6bfa2fab314100c9b3acc5874b03cfd 100644
--- a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/data/internal/DataEditorsResources_zh.properties
+++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/data/internal/DataEditorsResources_zh.properties
@@ -1,3 +1,5 @@
grid_tooltip_filter_by_column = \u6309\u5217\u503C\u8FC7\u6EE4
grid_tooltip_sort_by_column = \u6309\u5217\u8FC7\u6EE4
+controls_column_info_panel_property_key = \u952E
+
diff --git a/plugins/org.jkiss.dbeaver.ui.editors.xml/.classpath b/plugins/org.jkiss.dbeaver.ui.editors.xml/.classpath
new file mode 100644
index 0000000000000000000000000000000000000000..43b986286a9e5fd1828793fa4b2353d02ab8625f
--- /dev/null
+++ b/plugins/org.jkiss.dbeaver.ui.editors.xml/.classpath
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/plugins/org.jkiss.dbeaver.ui.editors.xml/.project b/plugins/org.jkiss.dbeaver.ui.editors.xml/.project
new file mode 100644
index 0000000000000000000000000000000000000000..7ec0771a488374073ba9f020b1c914f986256ece
--- /dev/null
+++ b/plugins/org.jkiss.dbeaver.ui.editors.xml/.project
@@ -0,0 +1,34 @@
+
+
+ org.jkiss.dbeaver.ui.editors.xml
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.pde.ManifestBuilder
+
+
+
+
+ org.eclipse.pde.SchemaBuilder
+
+
+
+
+ org.eclipse.m2e.core.maven2Builder
+
+
+
+
+
+ org.eclipse.m2e.core.maven2Nature
+ org.eclipse.pde.PluginNature
+ org.eclipse.jdt.core.javanature
+
+
diff --git a/plugins/org.jkiss.dbeaver.ui.editors.xml/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.ui.editors.xml/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..fa3554084bf3030ba95c7d748f5fb9a3059a48f0
--- /dev/null
+++ b/plugins/org.jkiss.dbeaver.ui.editors.xml/META-INF/MANIFEST.MF
@@ -0,0 +1,24 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Vendor: %Bundle-Vendor
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: org.jkiss.dbeaver.ui.editors.xml;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Release-Date: 20181224
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.core.resources,
+ org.eclipse.core.expressions,
+ org.eclipse.jface.text,
+ org.eclipse.ui,
+ org.eclipse.ui.editors,
+ org.eclipse.ui.ide,
+ org.eclipse.ui.workbench.texteditor,
+ org.jkiss.dbeaver.model,
+ org.jkiss.dbeaver.ui,
+ org.jkiss.dbeaver.ui.editors.base,
+ org.jkiss.dbeaver.ui.editors.data
+Bundle-ClassPath: .
+Export-Package: org.jkiss.dbeaver.ui.editors.xml,
+ org.jkiss.dbeaver.ui.data.managers.stream
diff --git a/plugins/org.jkiss.dbeaver.ui.editors.xml/OSGI-INF/l10n/bundle.properties b/plugins/org.jkiss.dbeaver.ui.editors.xml/OSGI-INF/l10n/bundle.properties
new file mode 100644
index 0000000000000000000000000000000000000000..1d181c6d19343890967cbcd565a4ca52624f58e2
--- /dev/null
+++ b/plugins/org.jkiss.dbeaver.ui.editors.xml/OSGI-INF/l10n/bundle.properties
@@ -0,0 +1,3 @@
+Bundle-Vendor = DBeaver Corp
+Bundle-Name = DBeaver UI Editors - XML
+
diff --git a/plugins/org.jkiss.dbeaver.ui.editors.xml/build.properties b/plugins/org.jkiss.dbeaver.ui.editors.xml/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..3c833df018f8d70ced93e47092c72a9f05b1bc58
--- /dev/null
+++ b/plugins/org.jkiss.dbeaver.ui.editors.xml/build.properties
@@ -0,0 +1,6 @@
+source.. = src/
+output.. = target/classes/
+bin.includes = .,\
+ META-INF/,\
+ OSGI-INF/,\
+ plugin.xml
diff --git a/plugins/org.jkiss.dbeaver.ui.editors.xml/plugin.xml b/plugins/org.jkiss.dbeaver.ui.editors.xml/plugin.xml
new file mode 100644
index 0000000000000000000000000000000000000000..16e0cdf7aaa19c8a428267cb0a27901aee0d605b
--- /dev/null
+++ b/plugins/org.jkiss.dbeaver.ui.editors.xml/plugin.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/plugins/org.jkiss.dbeaver.ui.editors.xml/pom.xml b/plugins/org.jkiss.dbeaver.ui.editors.xml/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9d8677114a20f7ed51ea9b6f143c9e074bbff136
--- /dev/null
+++ b/plugins/org.jkiss.dbeaver.ui.editors.xml/pom.xml
@@ -0,0 +1,14 @@
+
+
+ 4.0.0
+
+ org.jkiss.dbeaver
+ plugins
+ 1.0.0-SNAPSHOT
+ ../
+
+ org.jkiss.dbeaver.ui.editors.xml
+ 1.0.0-SNAPSHOT
+ eclipse-plugin
+
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/managers/stream/XMLEditorPart.java b/plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/data/managers/stream/XMLEditorPart.java
similarity index 100%
rename from plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/managers/stream/XMLEditorPart.java
rename to plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/data/managers/stream/XMLEditorPart.java
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/managers/stream/XMLPanelEditor.java b/plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/data/managers/stream/XMLPanelEditor.java
similarity index 93%
rename from plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/managers/stream/XMLPanelEditor.java
rename to plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/data/managers/stream/XMLPanelEditor.java
index d1e46fed1d73c191be2f6bafafd4cea7a7bf46a6..422f75f7204f3d878bb651a5cca54321d23c1070 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/managers/stream/XMLPanelEditor.java
+++ b/plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/data/managers/stream/XMLPanelEditor.java
@@ -17,7 +17,7 @@
package org.jkiss.dbeaver.ui.data.managers.stream;
import org.jkiss.dbeaver.ui.data.IValueController;
-import org.jkiss.dbeaver.ui.editors.text.BaseTextEditor;
+import org.jkiss.dbeaver.ui.data.managers.AbstractTextPanelEditor;
import org.jkiss.dbeaver.ui.editors.xml.XMLEditor;
/**
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/managers/stream/XMLStreamValueManager.java b/plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/data/managers/stream/XMLStreamValueManager.java
similarity index 100%
rename from plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/managers/stream/XMLStreamValueManager.java
rename to plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/data/managers/stream/XMLStreamValueManager.java
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/xml/NonRuleBasedDamagerRepairer.java b/plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/editors/xml/NonRuleBasedDamagerRepairer.java
similarity index 96%
rename from plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/xml/NonRuleBasedDamagerRepairer.java
rename to plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/editors/xml/NonRuleBasedDamagerRepairer.java
index 4c7581c8b21d90137485fd62cb2562c0824268da..3a519aa1def1186d60de31863818ed7c8582d637 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/xml/NonRuleBasedDamagerRepairer.java
+++ b/plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/editors/xml/NonRuleBasedDamagerRepairer.java
@@ -1,147 +1,147 @@
-/*
- * DBeaver - Universal Database Manager
- * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jkiss.dbeaver.ui.editors.xml;
-
-import org.eclipse.jface.text.*;
-import org.eclipse.jface.text.presentation.IPresentationDamager;
-import org.eclipse.jface.text.presentation.IPresentationRepairer;
-import org.eclipse.swt.custom.StyleRange;
-import org.jkiss.dbeaver.Log;
-
-public class NonRuleBasedDamagerRepairer implements IPresentationDamager, IPresentationRepairer {
-
- private static final Log log = Log.getLog(NonRuleBasedDamagerRepairer.class);
-
- /** The document this object works on */
- protected IDocument fDocument;
- /** The default text attribute if non is returned as data by the current token */
- protected TextAttribute fDefaultTextAttribute;
-
- public NonRuleBasedDamagerRepairer(TextAttribute defaultTextAttribute) {
- fDefaultTextAttribute = defaultTextAttribute;
- }
-
- /**
- * @see IPresentationRepairer#setDocument(IDocument)
- */
- @Override
- public void setDocument(IDocument document) {
- fDocument = document;
- }
-
- /**
- * Returns the end offset of the line that contains the specified offset or
- * if the offset is inside a line delimiter, the end offset of the next line.
- *
- * @param offset the offset whose line end offset must be computed
- * @return the line end offset for the given offset
- * @exception BadLocationException if offset is invalid in the current document
- */
- protected int endOfLineOf(int offset) throws BadLocationException {
-
- IRegion info = fDocument.getLineInformationOfOffset(offset);
- if (offset <= info.getOffset() + info.getLength())
- return info.getOffset() + info.getLength();
-
- int line = fDocument.getLineOfOffset(offset);
- try {
- info = fDocument.getLineInformation(line + 1);
- return info.getOffset() + info.getLength();
- } catch (BadLocationException x) {
- return fDocument.getLength();
- }
- }
-
- /**
- * @see IPresentationDamager#getDamageRegion(ITypedRegion, DocumentEvent, boolean)
- */
- @Override
- public IRegion getDamageRegion(
- ITypedRegion partition,
- DocumentEvent event,
- boolean documentPartitioningChanged) {
- if (!documentPartitioningChanged) {
- try {
-
- IRegion info =
- fDocument.getLineInformationOfOffset(event.getOffset());
- int start = Math.max(partition.getOffset(), info.getOffset());
-
- int end =
- event.getOffset()
- + (event.getText() == null
- ? event.getLength()
- : event.getText().length());
-
- if (info.getOffset() <= end
- && end <= info.getOffset() + info.getLength()) {
- // optimize the case of the same line
- end = info.getOffset() + info.getLength();
- } else
- end = endOfLineOf(end);
-
- end =
- Math.min(
- partition.getOffset() + partition.getLength(),
- end);
- return new Region(start, end - start);
-
- } catch (BadLocationException e) {
- log.debug(e);
- }
- }
-
- return partition;
- }
-
- /**
- * @see IPresentationRepairer#createPresentation(TextPresentation, ITypedRegion)
- */
- @Override
- public void createPresentation(
- TextPresentation presentation,
- ITypedRegion region) {
- addRange(
- presentation,
- region.getOffset(),
- region.getLength(),
- fDefaultTextAttribute);
- }
-
- /**
- * Adds style information to the given text presentation.
- *
- * @param presentation the text presentation to be extended
- * @param offset the offset of the range to be styled
- * @param length the length of the range to be styled
- * @param attr the attribute describing the style of the range to be styled
- */
- protected void addRange(
- TextPresentation presentation,
- int offset,
- int length,
- TextAttribute attr) {
- if (attr != null)
- presentation.addStyleRange(
- new StyleRange(
- offset,
- length,
- attr.getForeground(),
- attr.getBackground(),
- attr.getStyle()));
- }
+/*
+ * DBeaver - Universal Database Manager
+ * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jkiss.dbeaver.ui.editors.xml;
+
+import org.eclipse.jface.text.*;
+import org.eclipse.jface.text.presentation.IPresentationDamager;
+import org.eclipse.jface.text.presentation.IPresentationRepairer;
+import org.eclipse.swt.custom.StyleRange;
+import org.jkiss.dbeaver.Log;
+
+public class NonRuleBasedDamagerRepairer implements IPresentationDamager, IPresentationRepairer {
+
+ private static final Log log = Log.getLog(NonRuleBasedDamagerRepairer.class);
+
+ /** The document this object works on */
+ protected IDocument fDocument;
+ /** The default text attribute if non is returned as data by the current token */
+ protected TextAttribute fDefaultTextAttribute;
+
+ public NonRuleBasedDamagerRepairer(TextAttribute defaultTextAttribute) {
+ fDefaultTextAttribute = defaultTextAttribute;
+ }
+
+ /**
+ * @see IPresentationRepairer#setDocument(IDocument)
+ */
+ @Override
+ public void setDocument(IDocument document) {
+ fDocument = document;
+ }
+
+ /**
+ * Returns the end offset of the line that contains the specified offset or
+ * if the offset is inside a line delimiter, the end offset of the next line.
+ *
+ * @param offset the offset whose line end offset must be computed
+ * @return the line end offset for the given offset
+ * @exception BadLocationException if offset is invalid in the current document
+ */
+ protected int endOfLineOf(int offset) throws BadLocationException {
+
+ IRegion info = fDocument.getLineInformationOfOffset(offset);
+ if (offset <= info.getOffset() + info.getLength())
+ return info.getOffset() + info.getLength();
+
+ int line = fDocument.getLineOfOffset(offset);
+ try {
+ info = fDocument.getLineInformation(line + 1);
+ return info.getOffset() + info.getLength();
+ } catch (BadLocationException x) {
+ return fDocument.getLength();
+ }
+ }
+
+ /**
+ * @see IPresentationDamager#getDamageRegion(ITypedRegion, DocumentEvent, boolean)
+ */
+ @Override
+ public IRegion getDamageRegion(
+ ITypedRegion partition,
+ DocumentEvent event,
+ boolean documentPartitioningChanged) {
+ if (!documentPartitioningChanged) {
+ try {
+
+ IRegion info =
+ fDocument.getLineInformationOfOffset(event.getOffset());
+ int start = Math.max(partition.getOffset(), info.getOffset());
+
+ int end =
+ event.getOffset()
+ + (event.getText() == null
+ ? event.getLength()
+ : event.getText().length());
+
+ if (info.getOffset() <= end
+ && end <= info.getOffset() + info.getLength()) {
+ // optimize the case of the same line
+ end = info.getOffset() + info.getLength();
+ } else
+ end = endOfLineOf(end);
+
+ end =
+ Math.min(
+ partition.getOffset() + partition.getLength(),
+ end);
+ return new Region(start, end - start);
+
+ } catch (BadLocationException e) {
+ log.debug(e);
+ }
+ }
+
+ return partition;
+ }
+
+ /**
+ * @see IPresentationRepairer#createPresentation(TextPresentation, ITypedRegion)
+ */
+ @Override
+ public void createPresentation(
+ TextPresentation presentation,
+ ITypedRegion region) {
+ addRange(
+ presentation,
+ region.getOffset(),
+ region.getLength(),
+ fDefaultTextAttribute);
+ }
+
+ /**
+ * Adds style information to the given text presentation.
+ *
+ * @param presentation the text presentation to be extended
+ * @param offset the offset of the range to be styled
+ * @param length the length of the range to be styled
+ * @param attr the attribute describing the style of the range to be styled
+ */
+ protected void addRange(
+ TextPresentation presentation,
+ int offset,
+ int length,
+ TextAttribute attr) {
+ if (attr != null)
+ presentation.addStyleRange(
+ new StyleRange(
+ offset,
+ length,
+ attr.getForeground(),
+ attr.getBackground(),
+ attr.getStyle()));
+ }
}
\ No newline at end of file
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/xml/XMLContentAssistantProcessor.java b/plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/editors/xml/XMLContentAssistantProcessor.java
similarity index 100%
rename from plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/xml/XMLContentAssistantProcessor.java
rename to plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/editors/xml/XMLContentAssistantProcessor.java
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/xml/XMLDoubleClickStrategy.java b/plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/editors/xml/XMLDoubleClickStrategy.java
similarity index 95%
rename from plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/xml/XMLDoubleClickStrategy.java
rename to plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/editors/xml/XMLDoubleClickStrategy.java
index f5fc5733b6ec2a7cd257ab83ebb4c1e3c4eb7f8e..9d32e079135d4246aec349902cc4e0f55a6975d4 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/xml/XMLDoubleClickStrategy.java
+++ b/plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/editors/xml/XMLDoubleClickStrategy.java
@@ -1,138 +1,138 @@
-/*
- * DBeaver - Universal Database Manager
- * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jkiss.dbeaver.ui.editors.xml;
-
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.ITextDoubleClickStrategy;
-import org.eclipse.jface.text.ITextViewer;
-import org.jkiss.dbeaver.Log;
-
-
-public class XMLDoubleClickStrategy implements ITextDoubleClickStrategy {
- private static final Log log = Log.getLog(XMLDoubleClickStrategy.class);
-
- protected ITextViewer fText;
-
- @Override
- public void doubleClicked(ITextViewer part) {
- int pos = part.getSelectedRange().x;
-
- if (pos < 0)
- return;
-
- fText = part;
-
- if (!selectComment(pos)) {
- selectWord(pos);
- }
- }
- protected boolean selectComment(int caretPos) {
- IDocument doc = fText.getDocument();
- int startPos, endPos;
-
- try {
- int pos = caretPos;
- char c = ' ';
-
- while (pos >= 0) {
- c = doc.getChar(pos);
- if (c == '\\') {
- pos -= 2;
- continue;
- }
- if (c == Character.LINE_SEPARATOR || c == '\"')
- break;
- --pos;
- }
-
- if (c != '\"')
- return false;
-
- startPos = pos;
-
- pos = caretPos;
- int length = doc.getLength();
- c = ' ';
-
- while (pos < length) {
- c = doc.getChar(pos);
- if (c == Character.LINE_SEPARATOR || c == '\"')
- break;
- ++pos;
- }
- if (c != '\"')
- return false;
-
- endPos = pos;
-
- int offset = startPos + 1;
- int len = endPos - offset;
- fText.setSelectedRange(offset, len);
- return true;
- } catch (BadLocationException e) {
- log.debug(e);
- }
-
- return false;
- }
- protected boolean selectWord(int caretPos) {
-
- IDocument doc = fText.getDocument();
- int startPos, endPos;
-
- try {
-
- int pos = caretPos;
- char c;
-
- while (pos >= 0) {
- c = doc.getChar(pos);
- if (!Character.isJavaIdentifierPart(c))
- break;
- --pos;
- }
-
- startPos = pos;
-
- pos = caretPos;
- int length = doc.getLength();
-
- while (pos < length) {
- c = doc.getChar(pos);
- if (!Character.isJavaIdentifierPart(c))
- break;
- ++pos;
- }
-
- endPos = pos;
- selectRange(startPos, endPos);
- return true;
-
- } catch (BadLocationException e) {
- log.debug(e);
- }
-
- return false;
- }
-
- private void selectRange(int startPos, int stopPos) {
- int offset = startPos + 1;
- int length = stopPos - offset;
- fText.setSelectedRange(offset, length);
- }
+/*
+ * DBeaver - Universal Database Manager
+ * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jkiss.dbeaver.ui.editors.xml;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextDoubleClickStrategy;
+import org.eclipse.jface.text.ITextViewer;
+import org.jkiss.dbeaver.Log;
+
+
+public class XMLDoubleClickStrategy implements ITextDoubleClickStrategy {
+ private static final Log log = Log.getLog(XMLDoubleClickStrategy.class);
+
+ protected ITextViewer fText;
+
+ @Override
+ public void doubleClicked(ITextViewer part) {
+ int pos = part.getSelectedRange().x;
+
+ if (pos < 0)
+ return;
+
+ fText = part;
+
+ if (!selectComment(pos)) {
+ selectWord(pos);
+ }
+ }
+ protected boolean selectComment(int caretPos) {
+ IDocument doc = fText.getDocument();
+ int startPos, endPos;
+
+ try {
+ int pos = caretPos;
+ char c = ' ';
+
+ while (pos >= 0) {
+ c = doc.getChar(pos);
+ if (c == '\\') {
+ pos -= 2;
+ continue;
+ }
+ if (c == Character.LINE_SEPARATOR || c == '\"')
+ break;
+ --pos;
+ }
+
+ if (c != '\"')
+ return false;
+
+ startPos = pos;
+
+ pos = caretPos;
+ int length = doc.getLength();
+ c = ' ';
+
+ while (pos < length) {
+ c = doc.getChar(pos);
+ if (c == Character.LINE_SEPARATOR || c == '\"')
+ break;
+ ++pos;
+ }
+ if (c != '\"')
+ return false;
+
+ endPos = pos;
+
+ int offset = startPos + 1;
+ int len = endPos - offset;
+ fText.setSelectedRange(offset, len);
+ return true;
+ } catch (BadLocationException e) {
+ log.debug(e);
+ }
+
+ return false;
+ }
+ protected boolean selectWord(int caretPos) {
+
+ IDocument doc = fText.getDocument();
+ int startPos, endPos;
+
+ try {
+
+ int pos = caretPos;
+ char c;
+
+ while (pos >= 0) {
+ c = doc.getChar(pos);
+ if (!Character.isJavaIdentifierPart(c))
+ break;
+ --pos;
+ }
+
+ startPos = pos;
+
+ pos = caretPos;
+ int length = doc.getLength();
+
+ while (pos < length) {
+ c = doc.getChar(pos);
+ if (!Character.isJavaIdentifierPart(c))
+ break;
+ ++pos;
+ }
+
+ endPos = pos;
+ selectRange(startPos, endPos);
+ return true;
+
+ } catch (BadLocationException e) {
+ log.debug(e);
+ }
+
+ return false;
+ }
+
+ private void selectRange(int startPos, int stopPos) {
+ int offset = startPos + 1;
+ int length = stopPos - offset;
+ fText.setSelectedRange(offset, length);
+ }
}
\ No newline at end of file
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/xml/XMLEditor.java b/plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/editors/xml/XMLEditor.java
similarity index 97%
rename from plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/xml/XMLEditor.java
rename to plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/editors/xml/XMLEditor.java
index 46f4828bb218f3ba449dc802300c56f3f2057187..d4b1f4eab885d97168a170d0fddeffbd5c015ab3 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/xml/XMLEditor.java
+++ b/plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/editors/xml/XMLEditor.java
@@ -1,125 +1,125 @@
-/*
- * DBeaver - Universal Database Manager
- * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jkiss.dbeaver.ui.editors.xml;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IDocumentExtension3;
-import org.eclipse.jface.text.IDocumentPartitioner;
-import org.eclipse.jface.text.Position;
-import org.eclipse.jface.text.rules.FastPartitioner;
-import org.eclipse.jface.text.source.Annotation;
-import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.jface.text.source.IVerticalRuler;
-import org.eclipse.jface.text.source.projection.ProjectionAnnotation;
-import org.eclipse.jface.text.source.projection.ProjectionAnnotationModel;
-import org.eclipse.jface.text.source.projection.ProjectionSupport;
-import org.eclipse.jface.text.source.projection.ProjectionViewer;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.texteditor.ITextEditorExtension3;
-import org.jkiss.dbeaver.ui.editors.text.BaseTextEditor;
-import org.jkiss.dbeaver.ui.editors.text.FileRefDocumentProvider;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-
-public class XMLEditor extends BaseTextEditor {
-
- private ProjectionSupport projectionSupport;
- private Annotation[] oldAnnotations;
- private ProjectionAnnotationModel annotationModel;
-
- public XMLEditor() {
- configureInsertMode(ITextEditorExtension3.SMART_INSERT, false);
- setSourceViewerConfiguration(new XMLSourceViewerConfiguration(this));
- setDocumentProvider(new FileRefDocumentProvider());
- }
-
- @Override
- public void dispose() {
- super.dispose();
- }
-
- @Override
- protected void doSetInput(IEditorInput input) throws CoreException {
- super.doSetInput(input);
- setupDocument();
- }
-
- @Override
- public void createPartControl(Composite parent) {
- super.createPartControl(parent);
-
- ProjectionViewer viewer = (ProjectionViewer) getSourceViewer();
-
- projectionSupport = new ProjectionSupport(viewer, getAnnotationAccess(), getSharedColors());
- projectionSupport.install();
-
- //turn projection mode on
- viewer.doOperation(ProjectionViewer.TOGGLE);
-
- annotationModel = viewer.getProjectionAnnotationModel();
- }
-
- private void setupDocument() {
- IDocument document = getDocument();
- if (document != null) {
- IDocumentPartitioner partitioner =
- new FastPartitioner(
- new XMLPartitionScanner(),
- new String[]{
- XMLPartitionScanner.XML_TAG,
- XMLPartitionScanner.XML_COMMENT});
- partitioner.connect(document);
- ((IDocumentExtension3) document).setDocumentPartitioner(XMLPartitionScanner.XML_PARTITIONING, partitioner);
- }
- }
-
- protected ISourceViewer createSourceViewer(Composite parent, IVerticalRuler ruler, int styles)
- {
- ISourceViewer viewer = new ProjectionViewer(parent, ruler, getOverviewRuler(), isOverviewRulerVisible(), styles);
-
- // ensure decoration support has been created and configured.
- getSourceViewerDecorationSupport(viewer);
-
- return viewer;
- }
-
- void updateFoldingStructure(List positions) {
- Annotation[] annotations = new Annotation[positions.size()];
-
- //this will hold the new annotations along
- //with their corresponding positions
- Map newAnnotations = new HashMap<>();
-
- for (int i = 0; i < positions.size(); i++) {
- ProjectionAnnotation annotation = new ProjectionAnnotation();
-
- newAnnotations.put(annotation, positions.get(i));
-
- annotations[i] = annotation;
- }
-
- annotationModel.modifyAnnotations(oldAnnotations, newAnnotations, null);
-
- oldAnnotations = annotations;
- }
-
-}
+/*
+ * DBeaver - Universal Database Manager
+ * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jkiss.dbeaver.ui.editors.xml;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IDocumentExtension3;
+import org.eclipse.jface.text.IDocumentPartitioner;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.rules.FastPartitioner;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.IVerticalRuler;
+import org.eclipse.jface.text.source.projection.ProjectionAnnotation;
+import org.eclipse.jface.text.source.projection.ProjectionAnnotationModel;
+import org.eclipse.jface.text.source.projection.ProjectionSupport;
+import org.eclipse.jface.text.source.projection.ProjectionViewer;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.texteditor.ITextEditorExtension3;
+import org.jkiss.dbeaver.ui.editors.text.BaseTextEditor;
+import org.jkiss.dbeaver.ui.editors.text.FileRefDocumentProvider;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+public class XMLEditor extends BaseTextEditor {
+
+ private ProjectionSupport projectionSupport;
+ private Annotation[] oldAnnotations;
+ private ProjectionAnnotationModel annotationModel;
+
+ public XMLEditor() {
+ configureInsertMode(ITextEditorExtension3.SMART_INSERT, false);
+ setSourceViewerConfiguration(new XMLSourceViewerConfiguration(this));
+ setDocumentProvider(new FileRefDocumentProvider());
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ }
+
+ @Override
+ protected void doSetInput(IEditorInput input) throws CoreException {
+ super.doSetInput(input);
+ setupDocument();
+ }
+
+ @Override
+ public void createPartControl(Composite parent) {
+ super.createPartControl(parent);
+
+ ProjectionViewer viewer = (ProjectionViewer) getSourceViewer();
+
+ projectionSupport = new ProjectionSupport(viewer, getAnnotationAccess(), getSharedColors());
+ projectionSupport.install();
+
+ //turn projection mode on
+ viewer.doOperation(ProjectionViewer.TOGGLE);
+
+ annotationModel = viewer.getProjectionAnnotationModel();
+ }
+
+ private void setupDocument() {
+ IDocument document = getDocument();
+ if (document != null) {
+ IDocumentPartitioner partitioner =
+ new FastPartitioner(
+ new XMLPartitionScanner(),
+ new String[]{
+ XMLPartitionScanner.XML_TAG,
+ XMLPartitionScanner.XML_COMMENT});
+ partitioner.connect(document);
+ ((IDocumentExtension3) document).setDocumentPartitioner(XMLPartitionScanner.XML_PARTITIONING, partitioner);
+ }
+ }
+
+ protected ISourceViewer createSourceViewer(Composite parent, IVerticalRuler ruler, int styles)
+ {
+ ISourceViewer viewer = new ProjectionViewer(parent, ruler, getOverviewRuler(), isOverviewRulerVisible(), styles);
+
+ // ensure decoration support has been created and configured.
+ getSourceViewerDecorationSupport(viewer);
+
+ return viewer;
+ }
+
+ void updateFoldingStructure(List positions) {
+ Annotation[] annotations = new Annotation[positions.size()];
+
+ //this will hold the new annotations along
+ //with their corresponding positions
+ Map newAnnotations = new HashMap<>();
+
+ for (int i = 0; i < positions.size(); i++) {
+ ProjectionAnnotation annotation = new ProjectionAnnotation();
+
+ newAnnotations.put(annotation, positions.get(i));
+
+ annotations[i] = annotation;
+ }
+
+ annotationModel.modifyAnnotations(oldAnnotations, newAnnotations, null);
+
+ oldAnnotations = annotations;
+ }
+
+}
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/xml/XMLFormattingStrategy.java b/plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/editors/xml/XMLFormattingStrategy.java
similarity index 97%
rename from plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/xml/XMLFormattingStrategy.java
rename to plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/editors/xml/XMLFormattingStrategy.java
index 9c767ae1ef0ad1c26608d7dc04a3642880127799..774a8fe1eaeecb1cff20cb2364a81032523807ae 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/xml/XMLFormattingStrategy.java
+++ b/plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/editors/xml/XMLFormattingStrategy.java
@@ -64,7 +64,7 @@ public class XMLFormattingStrategy extends ContextBasedFormattingStrategy
transformer.transform(source, result);
return result.getWriter().toString();
} catch (Throwable e) {
- log.debug("Error formatting XML", e);
+ log.debug("Error formatting XML: " + e.getMessage());
return content;
}
}
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/xml/XMLPartitionScanner.java b/plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/editors/xml/XMLPartitionScanner.java
similarity index 97%
rename from plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/xml/XMLPartitionScanner.java
rename to plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/editors/xml/XMLPartitionScanner.java
index 84265518ffb5b017079851ca608874505f597220..8f4b9ce4e42c8c35259fb4f224acc4ad663ae7f2 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/xml/XMLPartitionScanner.java
+++ b/plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/editors/xml/XMLPartitionScanner.java
@@ -1,41 +1,41 @@
-/*
- * DBeaver - Universal Database Manager
- * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jkiss.dbeaver.ui.editors.xml;
-
-import org.eclipse.jface.text.rules.*;
-
-
-
-public class XMLPartitionScanner extends RuleBasedPartitionScanner {
- public static final String XML_PARTITIONING= "__xml_partitioning"; //$NON-NLS-1$
- public final static String XML_DEFAULT = "__xml_default"; //$NON-NLS-1$
- public final static String XML_COMMENT = "__xml_comment"; //$NON-NLS-1$
- public final static String XML_TAG = "__xml_tag"; //$NON-NLS-1$
-
- public XMLPartitionScanner() {
-
- IToken xmlComment = new Token(XMLPartitionScanner.XML_COMMENT);
- IToken tag = new Token(XMLPartitionScanner.XML_TAG);
-
- IPredicateRule[] rules = new IPredicateRule[2];
-
- rules[0] = new MultiLineRule("", xmlComment); //$NON-NLS-1$//$NON-NLS-2$
- rules[1] = new XMLTagRule(tag);
-
- setPredicateRules(rules);
- }
-}
+/*
+ * DBeaver - Universal Database Manager
+ * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jkiss.dbeaver.ui.editors.xml;
+
+import org.eclipse.jface.text.rules.*;
+
+
+
+public class XMLPartitionScanner extends RuleBasedPartitionScanner {
+ public static final String XML_PARTITIONING= "__xml_partitioning"; //$NON-NLS-1$
+ public final static String XML_DEFAULT = "__xml_default"; //$NON-NLS-1$
+ public final static String XML_COMMENT = "__xml_comment"; //$NON-NLS-1$
+ public final static String XML_TAG = "__xml_tag"; //$NON-NLS-1$
+
+ public XMLPartitionScanner() {
+
+ IToken xmlComment = new Token(XMLPartitionScanner.XML_COMMENT);
+ IToken tag = new Token(XMLPartitionScanner.XML_TAG);
+
+ IPredicateRule[] rules = new IPredicateRule[2];
+
+ rules[0] = new MultiLineRule("", xmlComment); //$NON-NLS-1$//$NON-NLS-2$
+ rules[1] = new XMLTagRule(tag);
+
+ setPredicateRules(rules);
+ }
+}
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/xml/XMLReconcilingStrategy.java b/plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/editors/xml/XMLReconcilingStrategy.java
similarity index 100%
rename from plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/xml/XMLReconcilingStrategy.java
rename to plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/editors/xml/XMLReconcilingStrategy.java
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/xml/XMLScanner.java b/plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/editors/xml/XMLScanner.java
similarity index 97%
rename from plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/xml/XMLScanner.java
rename to plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/editors/xml/XMLScanner.java
index 8017cc29822010e2d57c3cb23f5f673ff642eb29..c73da5d64b0caab4312badb9b6df76ea29ba2fb6 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/xml/XMLScanner.java
+++ b/plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/editors/xml/XMLScanner.java
@@ -1,41 +1,41 @@
-/*
- * DBeaver - Universal Database Manager
- * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jkiss.dbeaver.ui.editors.xml;
-
-import org.eclipse.jface.text.TextAttribute;
-import org.eclipse.jface.text.rules.*;
-import org.eclipse.jface.text.source.ISharedTextColors;
-import org.jkiss.dbeaver.ui.editors.text.TextWhiteSpaceDetector;
-
-
-public class XMLScanner extends RuleBasedScanner {
-
- public XMLScanner(ISharedTextColors manager) {
- IToken procInstr =
- new Token(
- new TextAttribute(
- manager.getColor(XMLSourceViewerConfiguration.COLOR_PROC_INSTR)));
-
- IRule[] rules = new IRule[2];
- //Add rule for processing instructions
- rules[0] = new SingleLineRule("", "?>", procInstr); //$NON-NLS-1$ //$NON-NLS-2$
- // Add generic whitespace rule.
- rules[1] = new WhitespaceRule(new TextWhiteSpaceDetector());
-
- setRules(rules);
- }
-}
+/*
+ * DBeaver - Universal Database Manager
+ * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jkiss.dbeaver.ui.editors.xml;
+
+import org.eclipse.jface.text.TextAttribute;
+import org.eclipse.jface.text.rules.*;
+import org.eclipse.jface.text.source.ISharedTextColors;
+import org.jkiss.dbeaver.ui.editors.text.TextWhiteSpaceDetector;
+
+
+public class XMLScanner extends RuleBasedScanner {
+
+ public XMLScanner(ISharedTextColors manager) {
+ IToken procInstr =
+ new Token(
+ new TextAttribute(
+ manager.getColor(XMLSourceViewerConfiguration.COLOR_PROC_INSTR)));
+
+ IRule[] rules = new IRule[2];
+ //Add rule for processing instructions
+ rules[0] = new SingleLineRule("", "?>", procInstr); //$NON-NLS-1$ //$NON-NLS-2$
+ // Add generic whitespace rule.
+ rules[1] = new WhitespaceRule(new TextWhiteSpaceDetector());
+
+ setRules(rules);
+ }
+}
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/xml/XMLSourceViewerConfiguration.java b/plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/editors/xml/XMLSourceViewerConfiguration.java
similarity index 100%
rename from plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/xml/XMLSourceViewerConfiguration.java
rename to plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/editors/xml/XMLSourceViewerConfiguration.java
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/xml/XMLTagRule.java b/plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/editors/xml/XMLTagRule.java
similarity index 96%
rename from plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/xml/XMLTagRule.java
rename to plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/editors/xml/XMLTagRule.java
index 7cf7546bb26a397992844178527f59ac2c8999a2..6e0e8a4287e9e17112db0a7b35d3556f62005101 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/xml/XMLTagRule.java
+++ b/plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/editors/xml/XMLTagRule.java
@@ -1,51 +1,51 @@
-/*
- * DBeaver - Universal Database Manager
- * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jkiss.dbeaver.ui.editors.xml;
-
-import org.eclipse.jface.text.rules.ICharacterScanner;
-import org.eclipse.jface.text.rules.IToken;
-import org.eclipse.jface.text.rules.MultiLineRule;
-
-
-public class XMLTagRule extends MultiLineRule {
-
- public XMLTagRule(IToken token) {
- super("<", ">", token); //$NON-NLS-1$//$NON-NLS-2$
- }
- @Override
- protected boolean sequenceDetected(
- ICharacterScanner scanner,
- char[] sequence,
- boolean eofAllowed) {
- int c = scanner.read();
- if (sequence[0] == '<') {
- if (c == '?') {
- // processing instruction - abort
- scanner.unread();
- return false;
- }
- if (c == '!') {
- scanner.unread();
- // comment - abort
- return false;
- }
- } else if (sequence[0] == '>') {
- scanner.unread();
- }
- return super.sequenceDetected(scanner, sequence, eofAllowed);
- }
-}
+/*
+ * DBeaver - Universal Database Manager
+ * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jkiss.dbeaver.ui.editors.xml;
+
+import org.eclipse.jface.text.rules.ICharacterScanner;
+import org.eclipse.jface.text.rules.IToken;
+import org.eclipse.jface.text.rules.MultiLineRule;
+
+
+public class XMLTagRule extends MultiLineRule {
+
+ public XMLTagRule(IToken token) {
+ super("<", ">", token); //$NON-NLS-1$//$NON-NLS-2$
+ }
+ @Override
+ protected boolean sequenceDetected(
+ ICharacterScanner scanner,
+ char[] sequence,
+ boolean eofAllowed) {
+ int c = scanner.read();
+ if (sequence[0] == '<') {
+ if (c == '?') {
+ // processing instruction - abort
+ scanner.unread();
+ return false;
+ }
+ if (c == '!') {
+ scanner.unread();
+ // comment - abort
+ return false;
+ }
+ } else if (sequence[0] == '>') {
+ scanner.unread();
+ }
+ return super.sequenceDetected(scanner, sequence, eofAllowed);
+ }
+}
diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/xml/XMLTagScanner.java b/plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/editors/xml/XMLTagScanner.java
similarity index 97%
rename from plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/xml/XMLTagScanner.java
rename to plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/editors/xml/XMLTagScanner.java
index fab96ea2d32296ff996f03c1a79a606d43ab760e..cb213574bc69fd7455f0dbf1dc66b6697d2d1813 100644
--- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/xml/XMLTagScanner.java
+++ b/plugins/org.jkiss.dbeaver.ui.editors.xml/src/org/jkiss/dbeaver/ui/editors/xml/XMLTagScanner.java
@@ -1,43 +1,43 @@
-/*
- * DBeaver - Universal Database Manager
- * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jkiss.dbeaver.ui.editors.xml;
-
-import org.eclipse.jface.text.TextAttribute;
-import org.eclipse.jface.text.rules.*;
-import org.eclipse.jface.text.source.ISharedTextColors;
-import org.jkiss.dbeaver.ui.editors.text.TextWhiteSpaceDetector;
-
-
-public class XMLTagScanner extends RuleBasedScanner {
-
- public XMLTagScanner(ISharedTextColors manager) {
- IToken string =
- new Token(
- new TextAttribute(manager.getColor(XMLSourceViewerConfiguration.COLOR_STRING)));
-
- IRule[] rules = new IRule[3];
-
- // Add rule for double quotes
- rules[0] = new SingleLineRule("\"", "\"", string, '\\'); //$NON-NLS-1$ //$NON-NLS-2$
- // Add a rule for single quotes
- rules[1] = new SingleLineRule("'", "'", string, '\\'); //$NON-NLS-1$ //$NON-NLS-2$
- // Add generic whitespace rule.
- rules[2] = new WhitespaceRule(new TextWhiteSpaceDetector());
-
- setRules(rules);
- }
-}
+/*
+ * DBeaver - Universal Database Manager
+ * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jkiss.dbeaver.ui.editors.xml;
+
+import org.eclipse.jface.text.TextAttribute;
+import org.eclipse.jface.text.rules.*;
+import org.eclipse.jface.text.source.ISharedTextColors;
+import org.jkiss.dbeaver.ui.editors.text.TextWhiteSpaceDetector;
+
+
+public class XMLTagScanner extends RuleBasedScanner {
+
+ public XMLTagScanner(ISharedTextColors manager) {
+ IToken string =
+ new Token(
+ new TextAttribute(manager.getColor(XMLSourceViewerConfiguration.COLOR_STRING)));
+
+ IRule[] rules = new IRule[3];
+
+ // Add rule for double quotes
+ rules[0] = new SingleLineRule("\"", "\"", string, '\\'); //$NON-NLS-1$ //$NON-NLS-2$
+ // Add a rule for single quotes
+ rules[1] = new SingleLineRule("'", "'", string, '\\'); //$NON-NLS-1$ //$NON-NLS-2$
+ // Add generic whitespace rule.
+ rules[2] = new WhitespaceRule(new TextWhiteSpaceDetector());
+
+ setRules(rules);
+ }
+}
diff --git a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/internal/UINavigatorMessages_ru.properties b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/internal/UINavigatorMessages_ru.properties
index ac9a982702752f4095ad3bc680ee8a16fa771d56..ba6f17ca556dc01bf6c00bea4c6458f4f5a66622 100644
--- a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/internal/UINavigatorMessages_ru.properties
+++ b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/internal/UINavigatorMessages_ru.properties
@@ -25,9 +25,6 @@ actions_navigator_copy_fqn_title=\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u043
actions_navigator_copy_fqn_titles=\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u043E\u043B\u043D\u044B\u0435 \u0438\u043C\u0435\u043D\u0430
actions_navigator_copy_object_copy_node=\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C {0}
actions_navigator_copy_object_copy_objects=\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043E\u0431\u044A\u0435\u043A\u0442\u044B
-actions_navigator_bookmark_error_message=\u041E\u0448\u0438\u0431\u043A\u0430 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F \u0437\u0430\u043A\u043B\u0430\u0434\u043A\u0438
-actions_navigator_bookmark_error_title=\u041D\u043E\u0432\u0430\u044F \u0437\u0430\u043A\u043B\u0430\u0434\u043A\u0430
-actions_navigator_bookmark_title=\u0418\u043C\u044F \u0437\u0430\u043A\u043B\u0430\u0434\u043A\u0438
actions_navigator_create_folder_error_message=\u041E\u0448\u0438\u0431\u043A\u0430 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F \u043F\u0430\u043F\u043A\u0438 "{0}"
actions_navigator_create_folder_error_title=\u0421\u043E\u0437\u0434\u0430\u0442\u044C \u043F\u0430\u043F\u043A\u0443
actions_navigator_create_folder_folder_name=\u0421\u043E\u0437\u0434\u0430\u0442\u044C \u043F\u0430\u043F\u043A\u0443
diff --git a/plugins/pom.xml b/plugins/pom.xml
index a821378c9470c56ca18dce48984b743c2dc8b61c..e600dcc60503f656a4012425907347ba93b49f3f 100644
--- a/plugins/pom.xml
+++ b/plugins/pom.xml
@@ -23,6 +23,7 @@
org.jkiss.dbeaver.ui.editors.hex
org.jkiss.dbeaver.ui.editors.image
org.jkiss.dbeaver.ui.editors.sql
+ org.jkiss.dbeaver.ui.editors.xml
org.jkiss.dbeaver.ui.navigator
org.jkiss.dbeaver.debug.core