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