unknowIfGuestInDream / tlstudio

Currently includes SWT examples, and will support jface and other examples in the future
Eclipse Public License 2.0
1 stars 0 forks source link

[KnowHow] toolbar and menu #21

Closed unknowIfGuestInDream closed 3 months ago

unknowIfGuestInDream commented 5 months ago

Describe the knowHow

org.jkiss.dbeaver.core.disconnect org.jkiss.dbeaver.folder.disconnect https://stackoverflow.com/questions/27918050/using-propertytester-in-e4

unknowIfGuestInDream commented 5 months ago
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.2"?>

<!--
 * DBeaver - Universal Database Manager
 * Copyright (C) 2010-2023 DBeaver Corp and others
 *
 * 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.
  -->

<plugin>
    <!-- UI extensions -->
    <extension-point id="org.jkiss.dbeaver.workbenchHandler" name="Workbench handlers" schema="schema/org.jkiss.dbeaver.workbenchHandler.exsd"/>
    <extension-point id="org.jkiss.dbeaver.clearHistoryHandler" name="Clear history handlers" schema="schema/org.jkiss.dbeaver.clearHistoryHandler.exsd"/>
    <extension-point id="org.jkiss.dbeaver.toolBarConfiguration" name="Toolbar configurations" schema="schema/org.jkiss.dbeaver.toolBarConfiguration.exsd" />

    <extension point="org.eclipse.core.expressions.propertyTesters">
        <propertyTester
            class="org.jkiss.dbeaver.ui.actions.DataSourcePropertyTester"
            id="org.jkiss.dbeaver.ui.actions.DataSourcePropertyTester"
            namespace="org.jkiss.dbeaver.core.datasource"
            properties="connected,transactional,synchronizable,transactionActive,supportsTransactions,editable,projectResourceEditable,projectResourceViewable"
            type="org.jkiss.dbeaver.model.DBPContextProvider"/>
        <propertyTester
            class="org.jkiss.dbeaver.ui.actions.DataSourceContainerPropertyTester"
            id="org.jkiss.dbeaver.ui.actions.DataSourceContainerPropertyTester"
            namespace="org.jkiss.dbeaver.core.datasourceContainer"
            properties="driverId,driverClass,connected"
            type="org.jkiss.dbeaver.model.DBPDataSourceContainer"/>
        <propertyTester
            class="org.jkiss.dbeaver.ui.actions.FolderPropertyTester"
            id="org.jkiss.dbeaver.ui.actions.FolderPropertyTester"
            namespace="org.jkiss.dbeaver.core.folder"
            properties="connected"
            type="org.jkiss.dbeaver.model.navigator.DBNLocalFolder"/>
        <propertyTester
            class="org.jkiss.dbeaver.ui.views.process.ProcessPropertyTester"
            id="org.jkiss.dbeaver.ui.views.process.ProcessPropertyTester"
            namespace="org.jkiss.dbeaver.runtime.process"
            properties="running"
            type="org.eclipse.ui.IWorkbenchPart"/>
        <propertyTester
            class="org.jkiss.dbeaver.ui.actions.ToolBarConfigurationPropertyTester"
            id="org.jkiss.dbeaver.ui.actions.ToolBarConfigurationPropertyTester"
            namespace="org.jkiss.dbeaver.ui.toolbar.configuration"
            properties="visible"
            type="java.lang.Object"/>
    </extension>

    <extension point="org.eclipse.ui.views">
        <view
                id="org.jkiss.dbeaver.core.queryManager"
                category="org.jkiss.dbeaver.core.category"
                class="org.jkiss.dbeaver.ui.views.qm.QueryManagerView"
                allowMultiple="false"
                icon="platform:/plugin/org.jkiss.dbeaver.ui/icons/misc/qm.png"
                name="%view.query.manager.title">
            <description>%view.query.manager.description</description>
        </view>
        <view
                id="org.jkiss.dbeaver.core.shellProcess"
                category="org.jkiss.dbeaver.core.category"
                class="org.jkiss.dbeaver.ui.views.process.ShellProcessView"
                allowMultiple="true"
                restorable="false"
                icon="platform:/plugin/org.jkiss.dbeaver.ui/icons/misc/shell.png"
                name="%view.shell.process.title">
            <description>%view.shell.process.description</description>
        </view>
<!--
        <view
                id="org.jkiss.dbeaver.core.databaseOutput"
                category="org.jkiss.dbeaver.core.category"
                class="org.jkiss.dbeaver.ui.views.DatabaseOutputView"
                allowMultiple="false"
                icon="platform:/plugin/org.jkiss.dbeaver.ui/icons/sql/page_output.png"
                name="%view.database.output.title"/>
-->
    </extension>

    <extension point="org.eclipse.ui.commands">
        <category id="org.jkiss.dbeaver.core.util" name="%category.utility.name" description="%category.utility.description"/>
        <command id="org.jkiss.dbeaver.core.eula.showPopup" name="%command.org.jkiss.dbeaver.ui.eula.showPopup.name" description="%command.org.jkiss.dbeaver.ui.eula.showPopup.description" categoryId="org.jkiss.dbeaver.core.navigator"/>

        <command id="org.jkiss.dbeaver.core.new.connection" name="%command.org.jkiss.dbeaver.core.new.connection.name" description="%command.org.jkiss.dbeaver.core.new.connection.description" categoryId="org.jkiss.dbeaver.core.navigator"/>
        <command id="org.jkiss.dbeaver.core.new.connection.from.url" name="%command.org.jkiss.dbeaver.core.new.connection.from.url.name" description="%command.org.jkiss.dbeaver.core.new.connection.from.url.description" categoryId="org.jkiss.dbeaver.core.navigator"/>
        <command id="org.jkiss.dbeaver.core.migrate.connection" name="%command.org.jkiss.dbeaver.core.migrate.connection.name" description="%command.org.jkiss.dbeaver.core.migrate.connection.description" categoryId="org.jkiss.dbeaver.core.navigator"/>
        <command id="org.jkiss.dbeaver.core.navigator.bookmark.add" name="%command.org.jkiss.dbeaver.core.navigator.bookmark.add.name" description="%command.org.jkiss.dbeaver.core.navigator.bookmark.add.description" categoryId="org.jkiss.dbeaver.core.navigator"/>
        <command id="org.jkiss.dbeaver.core.navigator.bookmark.navigate" name="%command.org.jkiss.dbeaver.core.navigator.bookmark.navigate.name" description="%command.org.jkiss.dbeaver.core.navigator.bookmark.navigate.description" categoryId="org.jkiss.dbeaver.core.navigator"/>

        <command id="org.jkiss.dbeaver.core.connect" name="%command.org.jkiss.dbeaver.core.connect.name" description="%command.org.jkiss.dbeaver.core.connect.description" categoryId="org.jkiss.dbeaver.core.database"/>
        <command id="org.jkiss.dbeaver.core.disconnect" name="%command.org.jkiss.dbeaver.core.disconnect.name" description="%command.org.jkiss.dbeaver.core.disconnect.description" categoryId="org.jkiss.dbeaver.core.database"/>
        <command id="org.jkiss.dbeaver.folder.disconnect" name="%command.org.jkiss.dbeaver.core.disconnect.name" description="%command.org.jkiss.dbeaver.core.disconnect.description" categoryId="org.jkiss.dbeaver.core.database"/>
        <command id="org.jkiss.dbeaver.core.invalidate" name="%command.org.jkiss.dbeaver.core.invalidate.name" description="%command.org.jkiss.dbeaver.core.invalidate.description" categoryId="org.jkiss.dbeaver.core.database"/>
        <command id="org.jkiss.dbeaver.core.disconnectProject" name="%command.org.jkiss.dbeaver.core.disconnectProject.name" description="%command.org.jkiss.dbeaver.core.disconnectProject.description" categoryId="org.jkiss.dbeaver.core.database"/>
        <command id="org.jkiss.dbeaver.core.disconnectAll" name="%command.org.jkiss.dbeaver.core.disconnectAll.name" description="%command.org.jkiss.dbeaver.core.disconnectAll.description" categoryId="org.jkiss.dbeaver.core.database"/>
        <command id="org.jkiss.dbeaver.core.disconnectOther" name="%command.org.jkiss.dbeaver.core.disconnectOther.name" description="%command.org.jkiss.dbeaver.core.disconnectOther.description" categoryId="org.jkiss.dbeaver.core.database"/>
        <command id="org.jkiss.dbeaver.core.commit" name="%command.org.jkiss.dbeaver.core.commit.name" description="%command.org.jkiss.dbeaver.core.commit.description" categoryId="org.jkiss.dbeaver.core.database"/>
        <command id="org.jkiss.dbeaver.core.rollback" name="%command.org.jkiss.dbeaver.core.rollback.name" description="%command.org.jkiss.dbeaver.core.rollback.description" categoryId="org.jkiss.dbeaver.core.database"/>
        <command id="org.jkiss.dbeaver.core.txn.autocommit" name="%command.org.jkiss.dbeaver.core.txn.autocommit.name" description="%command.org.jkiss.dbeaver.core.txn.autocommit.description" categoryId="org.jkiss.dbeaver.core.database"/>
        <command id="org.jkiss.dbeaver.core.connection.synchronize" name="%command.org.jkiss.dbeaver.core.connection.synchronize.name" description="%command.org.jkiss.dbeaver.core.connection.synchronize.description" categoryId="org.jkiss.dbeaver.core.database" />
        <command id="org.jkiss.dbeaver.core.connection.readonly" name="%command.org.jkiss.dbeaver.core.connection.readonly.name" description="%command.org.jkiss.dbeaver.core.connection.readonly.description" categoryId="org.jkiss.dbeaver.core.database" />
        <command id="org.jkiss.dbeaver.core.txn.log" name="%command.org.jkiss.dbeaver.core.txn.log.name" description="%command.org.jkiss.dbeaver.core.txn.log.description" categoryId="org.jkiss.dbeaver.core.database"/>
        <command id="org.jkiss.dbeaver.core.txn.pending" name="%command.org.jkiss.dbeaver.core.txn.pending.name" description="%command.org.jkiss.dbeaver.core.txn.pending.description" categoryId="org.jkiss.dbeaver.core.database"/>

        <command id="org.jkiss.dbeaver.core.edit.copy.special" name="%command.org.jkiss.dbeaver.core.edit.copy.special.name" description="%command.org.jkiss.dbeaver.core.edit.copy.special.description" categoryId="org.jkiss.dbeaver.core.util"/>
        <command id="org.jkiss.dbeaver.core.edit.paste.special" name="%command.org.jkiss.dbeaver.core.edit.paste.special.name" description="%command.org.jkiss.dbeaver.core.edit.paste.special.description" categoryId="org.jkiss.dbeaver.core.util"/>

        <command id="org.jkiss.dbeaver.core.qm.filter" name="%command.org.jkiss.dbeaver.core.qm.filter.name" description="%command.org.jkiss.dbeaver.core.qm.filter.description" categoryId="org.jkiss.dbeaver.core.util"/>
        <command id="org.jkiss.dbeaver.core.qm.clear" name="%command.org.jkiss.dbeaver.core.qm.clear.name" description="%command.org.jkiss.dbeaver.core.qm.clear.description" categoryId="org.jkiss.dbeaver.core.util"/>

        <command id="org.jkiss.dbeaver.core.process.stop" name="%command.org.jkiss.dbeaver.core.process.stop.name" description="%command.org.jkiss.dbeaver.core.process.stop.description" categoryId="org.jkiss.dbeaver.core.util"/>

        <command id="org.jkiss.dbeaver.ui.tools.menu" name="%command.org.jkiss.dbeaver.ui.tools.menu.name" description="%command.org.jkiss.dbeaver.ui.tools.menu.description" categoryId="org.jkiss.dbeaver.core.database"/>
    </extension>

    <extension point="org.eclipse.ui.commandImages">
        <image commandId="org.jkiss.dbeaver.core.new.connection" icon="platform:/plugin/org.jkiss.dbeaver.ui/icons/database_connect.png"/>
        <image commandId="org.jkiss.dbeaver.core.new.connection.from.url" icon="platform:/plugin/org.jkiss.dbeaver.model/icons/connection/database_icon.png"/>
        <image commandId="org.jkiss.dbeaver.core.navigator.bookmark.add" icon="platform:/plugin/org.jkiss.dbeaver.ui/icons/bookmark.png"/>

        <image commandId="org.jkiss.dbeaver.core.connect" icon="platform:/plugin/org.jkiss.dbeaver.ui/icons/sql/connect.png"/>
        <image commandId="org.jkiss.dbeaver.core.invalidate" icon="platform:/plugin/org.jkiss.dbeaver.ui/icons/sql/reconnect.png"/>
        <image commandId="org.jkiss.dbeaver.core.disconnect" icon="platform:/plugin/org.jkiss.dbeaver.ui/icons/sql/disconnect.png"/>
        <image commandId="org.jkiss.dbeaver.core.connection.synchronize" icon="platform:/plugin/org.jkiss.dbeaver.ui/icons/sync_connection.png"/>
        <image commandId="org.jkiss.dbeaver.core.connection.readonly" icon="platform:/plugin/org.jkiss.dbeaver.ui/icons/sql/readonly.png" />
        <image commandId="org.jkiss.dbeaver.folder.disconnect" icon="platform:/plugin/org.jkiss.dbeaver.ui/icons/sql/disconnect.png"/>
        <image commandId="org.jkiss.dbeaver.core.commit" icon="platform:/plugin/org.jkiss.dbeaver.ui/icons/sql/commit.png"/>
        <image commandId="org.jkiss.dbeaver.core.rollback" icon="platform:/plugin/org.jkiss.dbeaver.ui/icons/sql/rollback.png"/>
        <image commandId="org.jkiss.dbeaver.core.txn.log" icon="platform:/plugin/org.jkiss.dbeaver.ui/icons/sql/txn_log.png"/>

        <image commandId="org.jkiss.dbeaver.core.qm.filter" icon="platform:/plugin/org.jkiss.dbeaver.ui/icons/misc/filter.png"/>
        <image commandId="org.jkiss.dbeaver.core.qm.clear" icon="platform:/plugin/org.jkiss.dbeaver.ui/icons/erase.png"/>

        <image commandId="org.jkiss.dbeaver.core.process.stop" icon="platform:/plugin/org.jkiss.dbeaver.ui/icons/misc/cancel.png"/>
    </extension>

    <extension point="org.eclipse.core.expressions.definitions">
        <definition id="org.jkiss.dbeaver.core.ui.querylog.control">
            <with variable="activeFocusControlId">
                <equals value="org.jkiss.dbeaver.ui.qm.log"/>
            </with>
        </definition>
        <definition id="org.jkiss.dbeaver.core.transactionActive">
            <with variable="activeEditor">
                <adapt type="org.jkiss.dbeaver.model.DBPContextProvider">
                    <test property="org.jkiss.dbeaver.core.datasource.transactionActive" value="true"/>
                </adapt>
            </with>
        </definition>
<!--
        <definition id="org.jkiss.dbeaver.core.ui.inlineWidgetEditor">
            <with variable="activeFocusControlId">
                <equals value="org.jkiss.dbeaver.ui.InlineWidgetEditor"/>
            </with>
        </definition>
        <definition id="org.jkiss.dbeaver.core.ui.inlineWidgetStyledText">
            <and>
                <with variable="activeFocusControlId">
                    <equals value="org.jkiss.dbeaver.ui.InlineWidgetEditor"/>
                </with>
                <with variable="activeFocusControl">
                    <instanceof value="org.eclipse.swt.custom.StyledText"/>
                </with>
            </and>
        </definition>
-->

        <definition id="org.jkiss.dbeaver.core.ui.querylog.view">
            <with variable="activePart">
                <instanceof value="org.jkiss.dbeaver.ui.views.qm.QueryManagerView"/>
            </with>
        </definition>
        <definition id="org.jkiss.dbeaver.core.ui.toolbar.general.visible">
            <reference definitionId="DBeaverPerspectiveActive"/>
        </definition>
        <definition id="org.jkiss.dbeaver.core.ui.editor.transactional">
            <with variable="activeEditor">
                <adapt type="org.jkiss.dbeaver.model.DBPContextProvider">
                    <test property="org.jkiss.dbeaver.core.datasource.supportsTransactions" value="true"/>
                </adapt>
            </with>
        </definition>
        <definition id="org.jkiss.dbeaver.core.preferences.datasource">
            <or>
                <instanceof value="org.jkiss.dbeaver.model.navigator.DBNDataSource"/>
                <instanceof value="org.jkiss.dbeaver.ui.controls.resultset.ResultSetViewer"/>
                <adapt type="org.jkiss.dbeaver.model.DBPDataSourceContainer"/>
            </or>
        </definition>

        <definition id="org.jkiss.dbeaver.core.datasource.connected">
            <or>
                <with variable="selection">
                    <count value="1"/>
                    <iterate operator="and">
                        <adapt type="org.jkiss.dbeaver.model.DBPContextProvider">
                            <test property="org.jkiss.dbeaver.core.datasource.connected" value="true"/>
                        </adapt>
                    </iterate>
                </with>
                <with variable="activePart">
                    <adapt type="org.jkiss.dbeaver.model.DBPContextProvider">
                        <test property="org.jkiss.dbeaver.core.datasource.connected" value="true"/>
                    </adapt>
                </with>
            </or>
        </definition>

        <definition id="org.jkiss.dbeaver.core.folder.connected">
            <with variable="selection">
                <count value="+"/>
                <iterate operator="and">
                    <adapt type="org.jkiss.dbeaver.model.navigator.DBNLocalFolder">
                        <test property="org.jkiss.dbeaver.core.folder.connected" value="true"/>
                    </adapt>
                </iterate>
            </with>
        </definition>

        <definition id="org.jkiss.dbeaver.core.datasource.disconnected">
            <or>
                <with variable="selection">
                    <count value="1"/>
                    <iterate operator="and">
                        <adapt type="org.jkiss.dbeaver.model.DBPContextProvider">
                            <test property="org.jkiss.dbeaver.core.datasource.connected" value="false"/>
                        </adapt>
                    </iterate>
                </with>
                <with variable="activePart">
                    <adapt type="org.jkiss.dbeaver.model.DBPContextProvider">
                        <test property="org.jkiss.dbeaver.core.datasource.connected" value="false"/>
                    </adapt>
                </with>
            </or>
        </definition>

        <definition id="org.jkiss.dbeaver.core.datasource.synchronizable">
            <or>
                <with variable="selection">
                    <count value="1"/>
                    <iterate operator="and">
                        <adapt type="org.jkiss.dbeaver.model.DBPContextProvider">
                            <test property="org.jkiss.dbeaver.core.datasource.synchronizable" value="true"/>
                        </adapt>
                    </iterate>
                </with>
                <with variable="activePart">
                    <adapt type="org.jkiss.dbeaver.model.DBPContextProvider">
                        <test property="org.jkiss.dbeaver.core.datasource.synchronizable" value="true"/>
                    </adapt>
                </with>
            </or>
        </definition>

    </extension>

    <extension point="org.eclipse.ui.handlers">
        <handler commandId="org.jkiss.dbeaver.core.eula.showPopup" class="org.jkiss.dbeaver.ui.eula.EULAHandler"/>
        <handler commandId="org.jkiss.dbeaver.core.new.connection" class="org.jkiss.dbeaver.ui.actions.datasource.DataSourceCreateHandler">
            <enabledWhen>
                <with variable="activePart">
                    <test property="org.jkiss.dbeaver.core.global.canCreateConnection"/>
                </with>
            </enabledWhen>
        </handler>
        <handler commandId="org.jkiss.dbeaver.core.new.connection.from.url" class="org.jkiss.dbeaver.ui.actions.datasource.DataSourceCreateFromUrlHandler">
            <enabledWhen>
                <with variable="activePart">
                    <test property="org.jkiss.dbeaver.core.global.canCreateConnection"/>
                </with>
            </enabledWhen>
        </handler>
        <handler commandId="org.jkiss.dbeaver.core.migrate.connection" class="org.jkiss.dbeaver.ui.actions.datasource.DataSourceMigrateHandler">
            <enabledWhen>
                <with variable="selection">
                    <count value="+"/>
                    <iterate operator="and">
                        <instanceof value="org.jkiss.dbeaver.model.navigator.DBNDataSource"/>
                    </iterate>
                </with>
            </enabledWhen>
        </handler>
        <handler commandId="org.jkiss.dbeaver.core.navigator.bookmark.add" class="org.jkiss.dbeaver.ui.actions.common.AddBookmarkHandler">
            <enabledWhen>
                <with variable="selection">
                    <count value="1"/>
                    <iterate operator="and">
                        <and>
                            <adapt type="org.jkiss.dbeaver.model.navigator.DBNDatabaseNode"/>
                            <test property="org.jkiss.dbeaver.core.object.projectResourceEditable"/>
                        </and>
                    </iterate>
                </with>
            </enabledWhen>
        </handler>
        <handler commandId="org.jkiss.dbeaver.core.navigator.bookmark.navigate" class="org.jkiss.dbeaver.ui.actions.common.NavigateBookmarkHandler">
            <enabledWhen>
                <with variable="selection">
                    <count value="1"/>
                    <iterate operator="and">
                        <instanceof value="org.jkiss.dbeaver.ui.resources.bookmarks.DBNBookmark"/>
                    </iterate>
                </with>
            </enabledWhen>
        </handler>

        <handler commandId="org.jkiss.dbeaver.core.connect" class="org.jkiss.dbeaver.ui.actions.datasource.DataSourceConnectHandler">
            <enabledWhen><reference definitionId="org.jkiss.dbeaver.core.datasource.disconnected"/></enabledWhen>
        </handler>
        <handler commandId="org.jkiss.dbeaver.core.disconnect" class="org.jkiss.dbeaver.ui.actions.datasource.DataSourceDisconnectHandler">
            <enabledWhen><reference definitionId="org.jkiss.dbeaver.core.datasource.connected"/></enabledWhen>
        </handler>
        <handler commandId="org.jkiss.dbeaver.folder.disconnect" class="org.jkiss.dbeaver.ui.actions.datasource.FolderDisconnectHandler">
            <enabledWhen><reference definitionId="org.jkiss.dbeaver.core.folder.connected"/></enabledWhen>
        </handler>
        <handler commandId="org.jkiss.dbeaver.core.disconnectAll" class="org.jkiss.dbeaver.ui.actions.datasource.DataSourceDisconnectAllHandler"/>
        <handler commandId="org.jkiss.dbeaver.core.disconnectOther" class="org.jkiss.dbeaver.ui.actions.datasource.DataSourceDisconnectOtherHandler">
            <enabledWhen>
                <with variable="selection">
                    <count value="1"/>
                    <iterate operator="and">
                        <instanceof value="org.jkiss.dbeaver.model.navigator.DBNDataSource"/>
                    </iterate>
                </with>
            </enabledWhen>
        </handler>
        <handler commandId="org.jkiss.dbeaver.core.disconnectProject" class="org.jkiss.dbeaver.ui.actions.datasource.DataSourceDisconnectProjectHandler">
            <enabledWhen>
                <with variable="selection">
                    <test property="org.jkiss.dbeaver.core.global.hasMultipleProjects"/>
                </with>
            </enabledWhen>
        </handler>
        <handler commandId="org.jkiss.dbeaver.core.invalidate" class="org.jkiss.dbeaver.ui.actions.datasource.DataSourceInvalidateHandler">
            <enabledWhen><reference definitionId="org.jkiss.dbeaver.core.datasource.connected"/></enabledWhen>
        </handler>
        <handler commandId="org.jkiss.dbeaver.core.connection.synchronize" class="org.jkiss.dbeaver.ui.actions.datasource.DataSourceSynchronizeHandler">
            <enabledWhen><reference definitionId="org.jkiss.dbeaver.core.datasource.synchronizable"/></enabledWhen>
        </handler>
        <handler commandId="org.jkiss.dbeaver.core.commit" class="org.jkiss.dbeaver.ui.actions.datasource.DataSourceCommitHandler">
            <enabledWhen>
                <reference definitionId="org.jkiss.dbeaver.core.transactionActive"/>
            </enabledWhen>
        </handler>
        <handler commandId="org.jkiss.dbeaver.core.rollback" class="org.jkiss.dbeaver.ui.actions.datasource.DataSourceRollbackHandler">
            <enabledWhen>
                <reference definitionId="org.jkiss.dbeaver.core.transactionActive"/>
            </enabledWhen>
        </handler>
        <handler commandId="org.jkiss.dbeaver.core.txn.autocommit" class="org.jkiss.dbeaver.ui.actions.datasource.DataSourceAutoCommitHandler">
            <enabledWhen><reference definitionId="org.jkiss.dbeaver.core.ui.editor.transactional"/></enabledWhen>
        </handler>
        <handler commandId="org.jkiss.dbeaver.core.connection.readonly" class="org.jkiss.dbeaver.ui.actions.datasource.DataSourceReadonlyHandler">
            <enabledWhen>
                <or>
                    <reference definitionId="org.jkiss.dbeaver.core.datasource.connected"/>
                    <reference definitionId="org.jkiss.dbeaver.core.datasource.disconnected"/>
                </or>
            </enabledWhen>
        </handler>
        <handler commandId="org.jkiss.dbeaver.core.txn.log" class="org.jkiss.dbeaver.ui.actions.datasource.DataSourceTransactionLogHandler">\
            <enabledWhen><reference definitionId="org.jkiss.dbeaver.core.ui.editor.transactional"/></enabledWhen>
        </handler>
        <handler commandId="org.jkiss.dbeaver.core.txn.pending" class="org.jkiss.dbeaver.ui.actions.datasource.DataSourcePendingTransactionsHandler">
            <enabledWhen><reference definitionId="org.jkiss.dbeaver.core.ui.editor.transactional"/></enabledWhen>
        </handler>

        <!-- Set default behaviour for standard widgets -->
<!--
        <handler commandId="org.eclipse.ui.edit.copy" class="org.eclipse.ui.internal.handlers.WidgetMethodHandler:copy">
            <activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.inlineWidgetEditor"/></activeWhen>
        </handler>
        <handler commandId="org.eclipse.ui.edit.paste" class="org.eclipse.ui.internal.handlers.WidgetMethodHandler:paste">
            <activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.inlineWidgetEditor"/></activeWhen>
        </handler>
        <handler commandId="org.eclipse.ui.edit.cut" class="org.eclipse.ui.internal.handlers.WidgetMethodHandler:cut">
            <activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.inlineWidgetEditor"/></activeWhen>
        </handler>
        <handler commandId="org.eclipse.ui.edit.selectAll" class="org.eclipse.ui.internal.handlers.SelectAllHandler">
            <activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.inlineWidgetEditor"/></activeWhen>
        </handler>
-->

        <!--
            Inline control handlers.
            Commented because we use workaround - see UIUtils.enableHostEditorKeyBindings()
         -->
<!--
                <handler commandId="org.eclipse.ui.edit.text.goto.lineStart" class="org.jkiss.dbeaver.ui.editors.WidgetCommandDirector:lineStart">
                    <activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.inlineWidgetStyledText"/></activeWhen>
                </handler>
                <handler commandId="org.eclipse.ui.edit.text.goto.lineEnd" class="org.jkiss.dbeaver.ui.editors.WidgetCommandDirector:lineEnd">
                    <activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.inlineWidgetStyledText"/></activeWhen>
                </handler>
                <handler commandId="org.eclipse.ui.edit.text.goto.textStart" class="org.jkiss.dbeaver.ui.editors.WidgetCommandDirector:textStart">
                    <activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.inlineWidgetStyledText"/></activeWhen>
                </handler>
                <handler commandId="org.eclipse.ui.edit.text.goto.textEnd" class="org.jkiss.dbeaver.ui.editors.WidgetCommandDirector:textEnd">
                    <activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.inlineWidgetStyledText"/></activeWhen>
                </handler>
                <handler commandId="org.eclipse.ui.edit.text.goto.pageUp" class="org.jkiss.dbeaver.ui.editors.WidgetCommandDirector:pageUp">
                    <activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.inlineWidgetStyledText"/></activeWhen>
                </handler>
                <handler commandId="org.eclipse.ui.edit.text.goto.pageDown" class="org.jkiss.dbeaver.ui.editors.WidgetCommandDirector:pageDown">
                    <activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.inlineWidgetStyledText"/></activeWhen>
                </handler>
                <handler commandId="org.eclipse.ui.edit.text.goto.wordPrevious" class="org.jkiss.dbeaver.ui.editors.WidgetCommandDirector:wordPrevious">
                    <activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.inlineWidgetStyledText"/></activeWhen>
                </handler>
                <handler commandId="org.eclipse.ui.edit.text.goto.wordNext" class="org.jkiss.dbeaver.ui.editors.WidgetCommandDirector:wordNext">
                    <activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.inlineWidgetStyledText"/></activeWhen>
                </handler>
-->

<!--
                <handler commandId="org.eclipse.ui.edit.text.select.lineStart" class="org.jkiss.dbeaver.ui.editors.WidgetCommandDirector:lineStart">
                    <activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.inlineWidgetEditor"/></activeWhen>
                </handler>
                <handler commandId="org.eclipse.ui.edit.text.select.lineEnd" class="org.jkiss.dbeaver.ui.editors.WidgetCommandDirector:lineEnd">
                    <activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.inlineWidgetEditor"/></activeWhen>
                </handler>
                <handler commandId="org.eclipse.ui.edit.text.select.textStart" class="org.jkiss.dbeaver.ui.editors.WidgetCommandDirector:textStart">
                    <activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.inlineWidgetEditor"/></activeWhen>
                </handler>
                <handler commandId="org.eclipse.ui.edit.text.select.textEnd" class="org.jkiss.dbeaver.ui.editors.WidgetCommandDirector:textEnd">
                    <activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.inlineWidgetEditor"/></activeWhen>
                </handler>
                <handler commandId="org.eclipse.ui.edit.text.select.pageUp" class="org.jkiss.dbeaver.ui.editors.WidgetCommandDirector:pageUp">
                    <activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.inlineWidgetEditor"/></activeWhen>
                </handler>
                <handler commandId="org.eclipse.ui.edit.text.select.pageDown" class="org.jkiss.dbeaver.ui.editors.WidgetCommandDirector:pageDown">
                    <activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.inlineWidgetEditor"/></activeWhen>
                </handler>
                <handler commandId="org.eclipse.ui.edit.text.select.wordPrevious" class="org.jkiss.dbeaver.ui.editors.WidgetCommandDirector:wordPrevious">
                    <activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.inlineWidgetEditor"/></activeWhen>
                </handler>
                <handler commandId="org.eclipse.ui.edit.text.select.wordNext" class="org.jkiss.dbeaver.ui.editors.WidgetCommandDirector:wordNext">
                    <activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.inlineWidgetEditor"/></activeWhen>
                </handler>
-->

        <!-- Query log control handlers -->
        <handler commandId="org.eclipse.ui.file.refresh" class="org.jkiss.dbeaver.ui.controls.querylog.QueryLogCommandHandler">
            <activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.querylog.control"/></activeWhen>
        </handler>
        <handler commandId="org.eclipse.ui.edit.selectAll" class="org.jkiss.dbeaver.ui.controls.querylog.QueryLogCommandHandler">
           <activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.querylog.control"/></activeWhen>
        </handler>
        <handler commandId="org.eclipse.ui.edit.copy" class="org.jkiss.dbeaver.ui.controls.querylog.QueryLogCommandHandler">
           <activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.querylog.control"/></activeWhen>
        </handler>
        <handler commandId="org.jkiss.dbeaver.core.edit.copy.special" class="org.jkiss.dbeaver.ui.controls.querylog.QueryLogCommandHandler">
           <activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.querylog.control"/></activeWhen>
        </handler>
        <handler commandId="org.eclipse.ui.edit.delete" class="org.jkiss.dbeaver.ui.controls.querylog.QueryLogCommandHandler">
            <activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.querylog.control"/></activeWhen>
        </handler>

        <!-- Query log view handlers -->
        <handler commandId="org.jkiss.dbeaver.core.qm.filter" class="org.jkiss.dbeaver.ui.views.qm.QueryManagerFilterHandler"/>
        <handler commandId="org.jkiss.dbeaver.core.qm.clear" class="org.jkiss.dbeaver.ui.views.qm.QueryManagerClearHandler"/>

        <!-- Process view handlers -->
        <handler commandId="org.jkiss.dbeaver.core.process.stop" class="org.jkiss.dbeaver.ui.views.process.ShellProcessStopHandler">
            <enabledWhen>
                <with variable="activePart">
                    <test property="org.jkiss.dbeaver.runtime.process.running"/>
                </with>
            </enabledWhen>
        </handler>

        <!-- Tools menu -->
        <handler commandId="org.jkiss.dbeaver.ui.tools.menu" class="org.jkiss.dbeaver.ui.actions.datasource.ToolsContextMenuHandler">
            <activeWhen>
                <and>
                    <test property="org.jkiss.dbeaver.core.global.hasPermission" value="database-developer"/>
                    <or>
                        <reference definitionId="org.jkiss.dbeaver.core.ui.navigator.part"/>
                        <reference definitionId="org.jkiss.dbeaver.core.ui.datasource.part"/>
                    </or>
                </and>
            </activeWhen>
        </handler>

    </extension>

    <extension point="org.eclipse.ui.menus">

        <!-- Database menu -->
        <menuContribution allPopups="false" locationURI="menu:org.eclipse.ui.main.menu?before=window">
            <menu id="dataSourceMenu" label="%menu.database">
                <visibleWhen><reference definitionId="DBeaverPerspectiveActive"/></visibleWhen>

                <separator name="driverGroup" visible="true"/>
                <command commandId="org.jkiss.dbeaver.core.new.connection">
                    <visibleWhen checkEnabled="true"><test property="org.jkiss.dbeaver.core.global.canCreateConnection"/></visibleWhen>
                </command>
                <command commandId="org.jkiss.dbeaver.core.new.connection.from.url">
                    <visibleWhen checkEnabled="true"><test property="org.jkiss.dbeaver.core.global.canCreateConnection"/></visibleWhen>
                </command>
                <command commandId="org.jkiss.dbeaver.core.driver.manager">
                    <visibleWhen checkEnabled="true"/>
                </command>
                <separator name="connection" visible="true"/>
                <command commandId="org.jkiss.dbeaver.core.connect"/>
                <command commandId="org.jkiss.dbeaver.core.invalidate"/>
                <command commandId="org.jkiss.dbeaver.core.disconnect"/>
                <command commandId="org.jkiss.dbeaver.core.disconnectAll"/>
                <command commandId="org.jkiss.dbeaver.core.disconnectOther"/>
                <command commandId="org.jkiss.dbeaver.core.disconnectProject">
                    <visibleWhen checkEnabled="true"/>
                </command>
                <command commandId="org.jkiss.dbeaver.core.connection.synchronize">
                    <visibleWhen checkEnabled="true"/>
                </command>
                <separator name="session" visible="true"/>
                <command commandId="org.jkiss.dbeaver.core.commit">
                    <visibleWhen><reference definitionId="org.jkiss.dbeaver.core.ui.editor.transactional"/></visibleWhen>
                </command>
                <command commandId="org.jkiss.dbeaver.core.rollback">
                    <visibleWhen><reference definitionId="org.jkiss.dbeaver.core.ui.editor.transactional"/></visibleWhen>
                </command>
                <menu label="%command.org.jkiss.dbeaver.core.transaction_mode.name">
                    <dynamic id="org.jkiss.dbeaver.core.menu.txn" class="org.jkiss.dbeaver.ui.actions.datasource.DataSourceTransactionModeContributor"/>
                    <visibleWhen><reference definitionId="org.jkiss.dbeaver.core.ui.editor.transactional"/></visibleWhen>
                </menu>
                <command commandId="org.jkiss.dbeaver.core.txn.log">
                    <visibleWhen><reference definitionId="org.jkiss.dbeaver.core.ui.editor.transactional"/></visibleWhen>
                </command>
                <command commandId="org.jkiss.dbeaver.core.txn.pending">
                    <visibleWhen><reference definitionId="org.jkiss.dbeaver.core.ui.editor.transactional"/></visibleWhen>
                </command>
                <command commandId="org.jkiss.dbeaver.core.connection.readonly" style="toggle"/>
                <separator name="transactions" visible="false"/>
                <separator name="tools" visible="true"/>
                <command commandId="org.jkiss.dbeaver.core.migrate.connection">
                    <visibleWhen checkEnabled="true"/>
                </command>

                <separator name="additions" visible="false"/>
            </menu>
        </menuContribution>

        <!-- Database toolbar -->
        <menuContribution allPopups="false" locationURI="toolbar:org.eclipse.ui.main.toolbar?before=additions">
            <toolbar id="dbeaver-general" label="%toolbar.dbeaver-general.label">
                <command commandId="org.jkiss.dbeaver.core.new.connection" id="org.jkiss.dbeaver.core.menu.newConnection" style="pulldown">
                    <visibleWhen checkEnabled="true">
                        <and>
                            <test property="org.jkiss.dbeaver.core.global.canCreateConnection"/>
                            <reference definitionId="org.jkiss.dbeaver.core.ui.toolbar.general.visible"/>
                        </and>
                    </visibleWhen>
                </command>
                <separator name="connection-tools" visible="true"/>
                <command commandId="org.jkiss.dbeaver.core.connect">
                    <visibleWhen><reference definitionId="org.jkiss.dbeaver.core.ui.toolbar.general.visible"/></visibleWhen>
                </command>
                <command commandId="org.jkiss.dbeaver.core.invalidate">
                    <visibleWhen><reference definitionId="org.jkiss.dbeaver.core.ui.toolbar.general.visible"/></visibleWhen>
                </command>
                <command commandId="org.jkiss.dbeaver.core.disconnect">
                    <visibleWhen><reference definitionId="org.jkiss.dbeaver.core.ui.toolbar.general.visible"/></visibleWhen>
                </command>
                <command commandId="org.jkiss.dbeaver.core.connection.synchronize">
                    <visibleWhen>
                        <and>
                            <reference definitionId="org.jkiss.dbeaver.core.ui.toolbar.general.visible"/>
                            <reference definitionId="org.jkiss.dbeaver.core.datasource.synchronizable"/>
                        </and>
                    </visibleWhen>
                </command>
                <separator name="sql_tools" visible="true"/>
                <separator name="additions" visible="false"/>
            </toolbar>
            <toolbar id="dbeaver-transactions" label="%toolbar.dbeaver-transactions.label">
                <visibleWhen><reference definitionId="org.jkiss.dbeaver.core.ui.datasource.editor"/></visibleWhen>
                <command commandId="org.jkiss.dbeaver.core.commit" style="push" mode="FORCE_TEXT">
                    <visibleWhen><reference definitionId="org.jkiss.dbeaver.core.ui.datasource.editor"/></visibleWhen>
                </command>
                <command commandId="org.jkiss.dbeaver.core.rollback" style="push" mode="FORCE_TEXT">
                    <visibleWhen><reference definitionId="org.jkiss.dbeaver.core.ui.datasource.editor"/></visibleWhen>
                </command>
                <command
                      commandId="org.jkiss.dbeaver.core.txn.autocommit"
                      icon="platform:/plugin/org.jkiss.dbeaver.ui/icons/sql/txn_auto.png"
                      id="org.jkiss.dbeaver.core.menu.txn"
                      style="pulldown"
                      tooltip="%command.org.jkiss.dbeaver.core.txn.autocommit.description">
                    <visibleWhen><reference definitionId="org.jkiss.dbeaver.core.ui.datasource.editor"/></visibleWhen>
                </command>
                <command commandId="org.jkiss.dbeaver.core.connection.readonly" style="toggle">
                    <visibleWhen><reference definitionId="org.jkiss.dbeaver.core.ui.toolbar.general.visible"/></visibleWhen>
                </command>
                <separator name="additions" visible="false"/>
            </toolbar>

            <toolbar id="dbeaver-transaction-monitor" label="%toolbar.dbeaver-transaction-monitor.label">
                <visibleWhen><reference definitionId="org.jkiss.dbeaver.core.ui.datasource.editor"/></visibleWhen>
                <control class="org.jkiss.dbeaver.ui.controls.txn.TransactionMonitorToolbar$ToolbarContribution" id="Transaction monitor toolbar">
                    <visibleWhen><reference definitionId="org.jkiss.dbeaver.core.ui.datasource.editor"/></visibleWhen>
                </control>
                <command
                      commandId="org.jkiss.dbeaver.core.txn.log"
                      id="org.jkiss.dbeaver.core.menu.txn.log"
                      style="pulldown">
                    <visibleWhen><reference definitionId="org.jkiss.dbeaver.core.ui.datasource.editor"/></visibleWhen>
                </command>
            </toolbar>

<!--
            <toolbar id="dbeaver-edit" label="%toolbar.dbeaver-edit.label">
                <command commandId="org.eclipse.ui.file.save"/>
                <command commandId="org.eclipse.ui.file.revert" icon="platform:/plugin/org.jkiss.dbeaver.ui/icons/file/reset.png"/>
                <command commandId="org.eclipse.ui.edit.undo"/>
                <command commandId="org.eclipse.ui.edit.redo"/>
                <command commandId="org.eclipse.ui.file.refresh"/>
            </toolbar>
-->

            <toolbar id="dbeaver-connection-selector" label="%toolbar.dbeaver-datasource-selector.label">
                <visibleWhen><reference definitionId="org.jkiss.dbeaver.core.ui.datasource.editor"/></visibleWhen>
                <command
                    commandId="org.jkiss.dbeaver.ui.tools.select.connection"
                    id="org.jkiss.dbeaver.core.menu.select.connection"
                    style="pulldown"
                    mode="FORCE_TEXT">
                    <visibleWhen>
                        <reference definitionId="org.jkiss.dbeaver.core.ui.datasource.editor"/>
                    </visibleWhen>
                </command>
                <command
                    commandId="org.jkiss.dbeaver.ui.tools.select.schema"
                    id="org.jkiss.dbeaver.core.menu.select.schema"
                    style="pulldown"
                    mode="FORCE_TEXT">
                    <visibleWhen><reference definitionId="org.jkiss.dbeaver.core.ui.datasource.editor"/></visibleWhen>
                </command>
                <separator name="additions" visible="false"/>
            </toolbar>

        </menuContribution>

        <!-- All Context menus -->
        <menuContribution allPopups="false" locationURI="popup:org.eclipse.ui.popup.any?after=navigator_additions">
            <separator name="sql_tools" visible="true"/>

            <command commandId="org.jkiss.dbeaver.core.project.active">
                <visibleWhen checkEnabled="true"/>
            </command>

            <separator name="create" visible="true"/>

            <command commandId="org.jkiss.dbeaver.core.object.open">
                <visibleWhen checkEnabled="true"/>
            </command>
            <menu label="%menu.org.jkiss.dbeaver.core.connection.settings.label">
                <dynamic id="org.jkiss.dbeaver.core.connection.settings" class="org.jkiss.dbeaver.ui.actions.datasource.ConnectionViewSettingsContributor">
                </dynamic>
                <visibleWhen>
                    <with variable="selection">
                        <count value="1"/>
                        <iterate operator="and">
                            <adapt type="org.jkiss.dbeaver.model.navigator.DBNDataSource">
                                <and>
                                    <test property="org.jkiss.dbeaver.core.global.hasPermission" value="database-developer"/>
                                    <test property="org.jkiss.dbeaver.core.datasource.editable"/>
                                </and>
                            </adapt>
                        </iterate>
                    </with>
                </visibleWhen>
            </menu>
            <command commandId="org.jkiss.dbeaver.core.navigator.bookmark.navigate">
                <visibleWhen checkEnabled="true"/>
            </command>

            <command commandId="org.jkiss.dbeaver.core.navigator.open.browser">
                <visibleWhen checkEnabled="true"/>
            </command>

            <menu
                  icon="platform:/plugin/org.jkiss.dbeaver.ui/icons/misc/filter.png"
                  label="%menu.filter.label">
                <command commandId="org.jkiss.dbeaver.core.object.filter.add.exclude">
                    <visibleWhen checkEnabled="true"/>
                </command>
                <command commandId="org.jkiss.dbeaver.core.object.filter.add.include">
                    <visibleWhen checkEnabled="true"/>
                </command>
                <command commandId="org.jkiss.dbeaver.core.object.filter.config">
                    <visibleWhen checkEnabled="true"/>
                </command>
                <command commandId="org.jkiss.dbeaver.core.object.filter.toggle">
                    <visibleWhen checkEnabled="true"/>
                </command>
                <command commandId="org.jkiss.dbeaver.core.object.filter.clear">
                    <visibleWhen checkEnabled="true"/>
                </command>
            </menu>

<!--
            <command commandId="org.jkiss.dbeaver.core.object.move.up">
                <visibleWhen checkEnabled="true"/>
            </command>
            <command commandId="org.jkiss.dbeaver.core.object.move.down">
                <visibleWhen checkEnabled="true"/>
            </command>
-->

            <command commandId="org.jkiss.dbeaver.core.sql.script.associate">
                <visibleWhen checkEnabled="true"/>
            </command>
            <command commandId="org.jkiss.dbeaver.core.sql.script.run.scriptNative">
                <visibleWhen checkEnabled="true"/>
            </command>
            <command commandId="org.jkiss.dbeaver.core.show.in.explorer">
                <visibleWhen checkEnabled="true"/>
            </command>

            <separator name="connection-tools" visible="true"/>

            <command commandId="org.jkiss.dbeaver.core.connect">
                <visibleWhen>
                    <with variable="selection">
                        <count value="1"/>
                        <iterate operator="and">
                            <instanceof value="org.jkiss.dbeaver.model.navigator.DBNDataSource"/>
                        </iterate>
                    </with>
                </visibleWhen>
            </command>
            <command commandId="org.jkiss.dbeaver.core.invalidate">
                <visibleWhen>
                    <with variable="selection">
                        <count value="1"/>
                        <iterate operator="and">
                            <instanceof value="org.jkiss.dbeaver.model.navigator.DBNDataSource"/>
                        </iterate>
                    </with>
                </visibleWhen>
            </command>
            <command commandId="org.jkiss.dbeaver.core.disconnect">
                <visibleWhen>
                    <with variable="selection">
                        <count value="1"/>
                        <iterate operator="and">
                            <instanceof value="org.jkiss.dbeaver.model.navigator.DBNDataSource"/>
                        </iterate>
                    </with>
                </visibleWhen>
            </command>
            <command commandId="org.jkiss.dbeaver.folder.disconnect">
                <visibleWhen checkEnabled="true"/>
            </command>
        </menuContribution>

        <!-- Additions end - Copy/Paste/etc -->

        <menuContribution allPopups="false" locationURI="popup:org.eclipse.ui.popup.any?after=navigator_additions_end">
            <separator name="copy" visible="true"/>

            <command commandId="org.eclipse.ui.edit.copy" label="%command.org.eclipse.ui.edit.copy.name">
                <visibleWhen checkEnabled="true"/>
            </command>
            <command commandId="org.eclipse.ui.edit.paste" label="%command.org.eclipse.ui.edit.paste.name">
                <visibleWhen checkEnabled="true"/>
            </command>
            <command commandId="org.jkiss.dbeaver.core.edit.copy.special" label="%command.org.jkiss.dbeaver.core.edit.copy.adv_info">
                <visibleWhen checkEnabled="true"/>
            </command>
            <command commandId="org.eclipse.ui.edit.delete" label="%command.org.eclipse.ui.edit.delete.name">
                <visibleWhen checkEnabled="true"/>
            </command>
            <command commandId="org.eclipse.ui.edit.rename" label="%command.org.eclipse.ui.edit.rename.name">
                <visibleWhen checkEnabled="true"/>
            </command>

        </menuContribution>

        <menuContribution allPopups="false" locationURI="menu:org.eclipse.ui.main.menu?after=additions">
            <menu id="navigate" label="%menu.navigate">
                <command commandId="org.jkiss.dbeaver.core.object.goto"><visibleWhen checkEnabled="true"/></command>
                <command commandId="org.jkiss.dbeaver.ui.editors.sql.navigate.object">
                      <visibleWhen checkEnabled="true"/>
                </command>
            </menu>
        </menuContribution><menuContribution allPopups="false" locationURI="menu:help?after=additions">
            <command commandId="org.jkiss.dbeaver.core.eula.showPopup" label="%command.org.jkiss.dbeaver.ui.eula.showPopup.name"/>
        </menuContribution>
        <!-- Transaction mode menu -->
        <menuContribution allPopups="false" locationURI="menu:org.jkiss.dbeaver.core.menu.txn">
            <dynamic id="org.jkiss.dbeaver.core.menu.txn.isolation" class="org.jkiss.dbeaver.ui.actions.datasource.DataSourceTransactionModeContributor"/>
        </menuContribution>

        <menuContribution allPopups="false" locationURI="menu:org.jkiss.dbeaver.core.menu.project">
            <dynamic id="org.jkiss.dbeaver.core.menu.project.active" class="org.jkiss.dbeaver.ui.navigator.actions.NavigatorActiveProjectContributor"/>
        </menuContribution>

        <!-- New connection menu -->
        <menuContribution allPopups="false" locationURI="menu:org.jkiss.dbeaver.core.menu.newConnection">
            <separator name="additions" visible="false"/>
            <dynamic id="org.jkiss.dbeaver.core.menu.newConnection.select" class="org.jkiss.dbeaver.ui.actions.datasource.NewConnectionDriverSelectorContributor"/>
            <separator name="footer" visible="true"/>
            <command commandId="org.jkiss.dbeaver.core.new.connection.from.url" label="%command.org.jkiss.dbeaver.core.new.connection.from.url.name_short"/>
            <separator name="custom" visible="true"/>
            <command commandId="org.jkiss.dbeaver.core.new.connection"/>
        </menuContribution>

        <!-- QM menu & toolbar -->

        <menuContribution allPopups="false" locationURI="menu:org.jkiss.dbeaver.core.queryManager">
            <command commandId="org.jkiss.dbeaver.core.qm.filter"/>
            <command commandId="org.jkiss.dbeaver.core.qm.clear"/>
            <command commandId="org.eclipse.ui.file.refresh" label="%command.org.jkiss.dbeaver.core.qm.refresh.name" tooltip="%command.org.jkiss.dbeaver.core.qm.refresh.description"/>
            <separator name="additions" visible="true"/>
            <separator name="settings" visible="false"/>
        </menuContribution>

        <menuContribution allPopups="false" locationURI="toolbar:org.jkiss.dbeaver.core.queryManager">
            <command commandId="org.jkiss.dbeaver.core.qm.filter"/>
            <separator name="refresh" visible="true"/>
            <command commandId="org.jkiss.dbeaver.core.qm.clear"/>
            <command commandId="org.eclipse.ui.file.refresh" label="%command.org.jkiss.dbeaver.core.qm.refresh.name" tooltip="%command.org.jkiss.dbeaver.core.qm.refresh.description"/>
            <separator name="additions" visible="true"/>
            <separator name="settings" visible="false"/>
        </menuContribution>

        <menuContribution allPopups="false" locationURI="menu:org.jkiss.dbeaver.core.shellProcess">
            <command commandId="org.jkiss.dbeaver.core.process.stop"/>
        </menuContribution>

        <menuContribution allPopups="false" locationURI="toolbar:org.jkiss.dbeaver.core.shellProcess">
            <command commandId="org.jkiss.dbeaver.core.process.stop"/>
        </menuContribution>

        <!-- Connection and schema selector menus -->
        <menuContribution allPopups="false" locationURI="menu:org.jkiss.dbeaver.core.menu.select.connection">
            <dynamic id="org.jkiss.dbeaver.core.menu.select.connection.list" class="org.jkiss.dbeaver.ui.actions.datasource.SelectActiveDataSourceHandler$MenuContributor"/>
        </menuContribution>
        <menuContribution allPopups="false" locationURI="menu:org.jkiss.dbeaver.core.menu.select.schema">
            <dynamic id="org.jkiss.dbeaver.core.menu.select.schema.list" class="org.jkiss.dbeaver.ui.actions.datasource.SelectActiveSchemaHandler$MenuContributor"/>
        </menuContribution>

        <!-- Transaction log menu -->
        <menuContribution allPopups="false" locationURI="menu:org.jkiss.dbeaver.core.menu.txn.log">
            <command commandId="org.jkiss.dbeaver.core.txn.log"/>
            <command commandId="org.jkiss.dbeaver.core.txn.pending"/>
            <command commandId="org.eclipse.ui.views.showView" icon="platform:/plugin/org.jkiss.dbeaver.ui/icons/misc/qm.png" label="%command.org.eclipse.ui.views.showView.label" style="push">
                <parameter name="org.eclipse.ui.views.showView.viewId" value="org.jkiss.dbeaver.core.queryManager"/>
            </command>
        </menuContribution>

        <!-- Database Navigator menu & toolbar -->
        <menuContribution allPopups="false" locationURI="menu:org.jkiss.dbeaver.core.databaseNavigator">
            <command commandId="org.jkiss.dbeaver.core.new.connection" id="org.jkiss.dbeaver.core.menu.newConnection" style="pulldown">
                <visibleWhen checkEnabled="true"/>
            </command>
            <command commandId="org.jkiss.dbeaver.core.driver.manager">
                <visibleWhen checkEnabled="true"/>
            </command>
            <separator name="projects" visible="true"/>
            <menu commandId="org.jkiss.dbeaver.core.project.select" label="%menu.org.jkiss.dbeaver.core.project.select.label">
                <dynamic id="org.jkiss.dbeaver.core.menu.project.active" class="org.jkiss.dbeaver.ui.navigator.actions.NavigatorActiveProjectContributor"/>
            </menu>
            <command commandId="org.jkiss.dbeaver.core.new.folder"/>
            <separator name="additions" visible="true"/>
            <command commandId="org.eclipse.ui.navigate.collapseAll"/>
            <command commandId="org.jkiss.dbeaver.core.navigator.linkeditor"/>
            <command commandId="org.jkiss.dbeaver.core.navigator.preferences"/>
        </menuContribution>

        <menuContribution allPopups="false" locationURI="toolbar:org.jkiss.dbeaver.core.databaseNavigator">
            <command commandId="org.jkiss.dbeaver.core.new.connection" id="org.jkiss.dbeaver.core.menu.newConnection" style="pulldown">
                <visibleWhen checkEnabled="true"/>
            </command>
            <command commandId="org.jkiss.dbeaver.core.new.folder"/>
            <separator name="additions" visible="true"/>
            <command commandId="org.eclipse.ui.navigate.collapseAll"/>
            <command commandId="org.jkiss.dbeaver.core.navigator.linkeditor"/>
        </menuContribution>

        <!-- Project Navigator menu & toolbar -->
        <menuContribution allPopups="false" locationURI="menu:org.jkiss.dbeaver.core.projectNavigator">
            <command commandId="org.jkiss.dbeaver.core.project.create">
                <visibleWhen checkEnabled="true"/>
            </command>
            <command commandId="org.jkiss.dbeaver.core.project.refresh"/>
            <separator name="additions" visible="true"/>
            <command commandId="org.eclipse.ui.navigate.collapseAll"/>
            <command commandId="org.jkiss.dbeaver.core.navigator.linkeditor"/>
            <command commandId="org.jkiss.dbeaver.core.navigator.preferences"/>
        </menuContribution>

        <menuContribution allPopups="false" locationURI="toolbar:org.jkiss.dbeaver.core.projectNavigator">
            <command commandId="org.jkiss.dbeaver.core.project.create">
                <visibleWhen checkEnabled="true"/>
            </command>
            <separator name="additions" visible="true"/>
            <command commandId="org.eclipse.ui.navigate.collapseAll"/>
            <command commandId="org.jkiss.dbeaver.core.navigator.linkeditor"/>
            <command commandId="org.jkiss.dbeaver.core.navigator.view.configure"/>
            <separator name="additions_end" visible="true"/>
            <command commandId="org.jkiss.dbeaver.core.project.refresh"/>
        </menuContribution>

        <!-- Project explorer menu & toolbar -->
        <menuContribution allPopups="false" locationURI="toolbar:org.jkiss.dbeaver.core.projectExplorer">
            <command commandId="org.jkiss.dbeaver.core.navigator.view.configure"/>
            <command commandId="org.eclipse.ui.navigate.collapseAll"/>
            <command commandId="org.eclipse.ui.navigate.expandAll"/>
            <command commandId="org.jkiss.dbeaver.core.navigator.linkeditor"/>
        </menuContribution>

    </extension>

    <extension point="org.eclipse.ui.bindings">

        <key commandId="org.jkiss.dbeaver.ui.tools.menu" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" platform="win32" sequence="ALT+`"/>
        <key commandId="org.jkiss.dbeaver.ui.tools.menu" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" platform="gtk" sequence="ALT+`"/>
        <key commandId="org.jkiss.dbeaver.ui.tools.menu" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" platform="cocoa" sequence="CTRL+V"/>

        <key commandId="org.jkiss.dbeaver.core.edit.copy.special" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" sequence="CTRL+SHIFT+C"/>
        <key commandId="org.jkiss.dbeaver.core.edit.paste.special" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" sequence="CTRL+SHIFT+V"/>
        <key commandId="org.jkiss.dbeaver.core.navigator.bookmark.add" contextId="org.jkiss.dbeaver.ui.context.navigator.view" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" sequence="CTRL+ALT+SHIFT+D"/>

        <key commandId="org.jkiss.dbeaver.core.new.connection" contextId="org.eclipse.ui.contexts.window" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" sequence="CTRL+SHIFT+N"/>
        <key commandId="org.jkiss.dbeaver.core.commit" contextId="org.eclipse.ui.contexts.window" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" platform="cocoa" sequence="CTRL+4"/>
        <key commandId="org.jkiss.dbeaver.core.commit" contextId="org.eclipse.ui.contexts.window" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" platform="gtk" sequence="CTRL+4"/>
        <key commandId="org.jkiss.dbeaver.core.commit" contextId="org.eclipse.ui.contexts.window" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" platform="win32" sequence="CTRL+ALT+SHIFT+K"/>
        <key commandId="org.jkiss.dbeaver.core.rollback" contextId="org.eclipse.ui.contexts.window" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" platform="cocoa" sequence="CTRL+8"/>
        <key commandId="org.jkiss.dbeaver.core.rollback" contextId="org.eclipse.ui.contexts.window" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" platform="gtk" sequence="CTRL+8"/>
        <key commandId="org.jkiss.dbeaver.core.rollback" contextId="org.eclipse.ui.contexts.window" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" platform="win32" sequence="CTRL+ALT+SHIFT+R"/>
    </extension>

    <extension point="org.eclipse.core.runtime.preferences">
        <initializer class="org.jkiss.dbeaver.core.DesktopPreferencesInitializer"/>
    </extension>

    <extension point="org.eclipse.ui.propertyPages">
        <page id="org.jkiss.dbeaver.preferences.main.errorHandle" class="org.jkiss.dbeaver.ui.preferences.PrefPageErrorHandle" name="%page.org.jkiss.dbeaver.preferences.main.errorHandle.name">
            <enabledWhen><reference definitionId="org.jkiss.dbeaver.core.preferences.datasource"/></enabledWhen>
        </page>
        <page id="org.jkiss.dbeaver.preferences.main.connections" class="org.jkiss.dbeaver.ui.preferences.PrefPageConnectionClient" name="%page.org.jkiss.dbeaver.preferences.main.connections.name">
            <enabledWhen>
                <or>
                    <instanceof value="org.jkiss.dbeaver.model.navigator.DBNDataSource"/>
                    <adapt type="org.jkiss.dbeaver.model.DBPDataSourceContainer"/>
                </or>
            </enabledWhen>
        </page>
        <page id="org.jkiss.dbeaver.preferences.main.transactions" class="org.jkiss.dbeaver.ui.preferences.PrefPageTransactions" name="%page.org.jkiss.dbeaver.preferences.main.transactions.name">
            <enabledWhen>
                <or>
                    <instanceof value="org.jkiss.dbeaver.model.navigator.DBNDataSource"/>
                    <adapt type="org.jkiss.dbeaver.model.DBPDataSourceContainer"/>
                </or>
            </enabledWhen>
        </page>
        <page id="org.jkiss.dbeaver.preferences.main.meta" class="org.jkiss.dbeaver.ui.preferences.PrefPageMetaData" name="%page.org.jkiss.dbeaver.preferences.main.meta.name">
            <enabledWhen><reference definitionId="org.jkiss.dbeaver.core.preferences.datasource"/></enabledWhen>
        </page>

        <page class="org.jkiss.dbeaver.ui.preferences.PrefPageDatabaseEditors" id="org.jkiss.dbeaver.preferences.editors" name="%page.org.jkiss.dbeaver.preferences.editors.name">
            <enabledWhen>
                <or>
                    <instanceof value="org.jkiss.dbeaver.model.navigator.DBNDataSource"/>
                    <instanceof value="org.jkiss.dbeaver.ui.controls.resultset.ResultSetViewer"/>
                    <instanceof value="org.jkiss.dbeaver.ui.navigator.database.NavigatorViewBase"/>
                    <adapt type="org.jkiss.dbeaver.model.DBPDataSourceContainer"/>
                </or>
            </enabledWhen>
        </page>

        <page class="org.jkiss.dbeaver.ui.preferences.PrefPageQueryManager" id="org.jkiss.dbeaver.preferences.main.qm" name="%page.org.jkiss.dbeaver.preferences.main.qm.name">
           <enabledWhen>
              <instanceof value="org.jkiss.dbeaver.ui.views.qm.QueryManagerView"/>
           </enabledWhen>
        </page>
        <page class="org.jkiss.dbeaver.ui.preferences.PrefPageConnectionTypes" id="org.jkiss.dbeaver.preferences.connectionTypes" name="%page.org.jkiss.dbeaver.preferences.connectionTypes.name">
            <enabledWhen>
                <or>
                    <instanceof value="org.jkiss.dbeaver.model.connection.DBPConnectionType"/>
                    <instanceof value="org.jkiss.dbeaver.ui.navigator.database.NavigatorViewBase"/>
                </or>
            </enabledWhen>
        </page>

        <page id="org.jkiss.dbeaver.preferences.main.toolbar.customization"
              class="org.jkiss.dbeaver.ui.preferences.PrefPageToolbarCustomization"
              name="%org.jkiss.dbeaver.preferences.main.toolbar.customization.name">
            <enabledWhen>
                <reference definitionId="org.jkiss.dbeaver.core.preferences.datasource"/>
            </enabledWhen>
        </page>
    </extension>

    <extension point="org.eclipse.core.runtime.adapters">
        <factory adaptableType="org.jkiss.dbeaver.runtime.DBWorkbench" class="org.jkiss.dbeaver.core.DesktopAdapterFactory">
            <adapter type="org.jkiss.dbeaver.model.app.DBPPlatform"/>
            <adapter type="org.jkiss.dbeaver.runtime.ui.DBPPlatformUI"/>
        </factory>
    </extension>

    <extension point="org.eclipse.ui.themes">

        <!-- Colors for transactions -->
        <themeElementCategory label="%themeElementCategory.org.jkiss.dbeaver.ui.presentation.txn.label" id="org.jkiss.dbeaver.ui.presentation.qm">
            <description>%themeElementCategory.org.jkiss.dbeaver.ui.presentation.txn.description</description>
        </themeElementCategory>

        <colorDefinition
                label="%colorDefinition.org.jkiss.dbeaver.txn.color.committed.background.label"
                categoryId="org.jkiss.dbeaver.ui.presentation.qm"
                id="org.jkiss.dbeaver.txn.color.committed.background"
                value="189, 254, 191">
            <description>%colorDefinition.org.jkiss.dbeaver.txn.color.committed.background.description</description>
        </colorDefinition>
        <colorDefinition
                label="%colorDefinition.org.jkiss.dbeaver.txn.color.reverted.background.label"
                categoryId="org.jkiss.dbeaver.ui.presentation.qm"
                id="org.jkiss.dbeaver.txn.color.reverted.background"
                value="255, 99, 71">
            <description>%colorDefinition.org.jkiss.dbeaver.txn.color.reverted.background.description</description>
        </colorDefinition>
        <colorDefinition
                label="%colorDefinition.org.jkiss.dbeaver.txn.color.transaction.background.label"
                categoryId="org.jkiss.dbeaver.ui.presentation.qm"
                id="org.jkiss.dbeaver.txn.color.transaction.background"
                value="255, 228, 181">
            <description>%colorDefinition.org.jkiss.dbeaver.txn.color.transaction.background.description</description>
        </colorDefinition>

        <!-- Colors for connection types -->
        <themeElementCategory label="%themeElementCategory.org.jkiss.dbeaver.ui.presentation.colors.connectionTypes.label" id="org.jkiss.dbeaver.ui.presentation.colors.connectionTypes">
            <description>%themeElementCategory.org.jkiss.dbeaver.ui.presentation.colors.connectionTypes.description</description>
        </themeElementCategory>

        <colorDefinition
            label="Test"
            categoryId="org.jkiss.dbeaver.ui.presentation.colors.connectionTypes"
            id="org.jkiss.dbeaver.color.connectionType.qa.background"
            value="196,255,181">
            <description>QA/Test/Stage server</description>
        </colorDefinition>
        <colorDefinition
            label="Production"
            categoryId="org.jkiss.dbeaver.ui.presentation.colors.connectionTypes"
            id="org.jkiss.dbeaver.color.connectionType.prod.background"
            value="247,159,129">
            <description>Production server</description>
        </colorDefinition>

    </extension>

    <extension point="org.eclipse.ui.exportWizards">
        <category id="org.jkiss.dbeaver.core.export.resources" name="%category.org.jkiss.dbeaver.core.export.resources.name"/>
        <wizard
             category="org.jkiss.dbeaver.core.export.resources"
             class="org.jkiss.dbeaver.tools.project.ProjectExportWizard"
             icon="platform:/plugin/org.jkiss.dbeaver.ui/icons/project.png"
             id="org.jkiss.dbeaver.core.wizard.export.project"
             name="%wizard.org.jkiss.dbeaver.core.wizard.export.project.name">
           <description>
               %wizard.org.jkiss.dbeaver.core.wizard.export.project.description
           </description>
        </wizard>
        <wizard
             category="org.jkiss.dbeaver.core.export.resources"
             class="org.jkiss.dbeaver.tools.scripts.ScriptsExportWizard"
             icon="platform:/plugin/org.jkiss.dbeaver.model/icons/tree/script.png"
             id="org.jkiss.dbeaver.core.wizard.export.scripts"
             name="%wizard.org.jkiss.dbeaver.core.wizard.export.scripts.name">
           <description>
               %wizard.org.jkiss.dbeaver.core.wizard.export.scripts.description
           </description>
        </wizard>
        <wizard
                category="org.jkiss.dbeaver.core.export.resources"
                class="org.jkiss.dbeaver.tools.configuration.ConfigurationExportWizard"
                icon="platform:/plugin/org.jkiss.dbeaver.ui/icons/configuration.png"
                id="org.jkiss.dbeaver.core.wizard.export.workspace"
                name="%wizard.org.jkiss.dbeaver.core.wizard.export.workspace.name">
            <description>
                %wizard.org.jkiss.dbeaver.core.wizard.export.workspace.description
            </description>
        </wizard>

    </extension>

    <extension point="org.eclipse.ui.importWizards">
        <category id="org.jkiss.dbeaver.core.import.resources" name="%category.org.jkiss.dbeaver.core.import.resources.name"/>
        <wizard
            category="org.jkiss.dbeaver.core.import.resources"
            class="org.jkiss.dbeaver.tools.project.ProjectImportWizard"
            icon="platform:/plugin/org.jkiss.dbeaver.ui/icons/project.png"
            id="org.jkiss.dbeaver.core.wizard.import.project"
            name="%wizard.org.jkiss.dbeaver.core.wizard.import.project.name">
            <description>
                %wizard.org.jkiss.dbeaver.core.wizard.import.project.description
            </description>
        </wizard>
        <wizard
            category="org.jkiss.dbeaver.core.import.resources"
            class="org.jkiss.dbeaver.tools.scripts.ScriptsImportWizard"
            icon="platform:/plugin/org.jkiss.dbeaver.model/icons/tree/script.png"
            id="org.jkiss.dbeaver.core.wizard.import.scripts"
            name="%wizard.org.jkiss.dbeaver.core.wizard.import.scripts.name">
            <description>
                %wizard.org.jkiss.dbeaver.core.wizard.import.scripts.description
            </description>
        </wizard>
        <wizard
                category="org.jkiss.dbeaver.core.import.resources"
                class="org.jkiss.dbeaver.tools.configuration.ConfigurationImportWizard"
                icon="platform:/plugin/org.jkiss.dbeaver.ui/icons/configuration.png"
                id="org.jkiss.dbeaver.core.wizard.import.workspace"
                name="%wizard.org.jkiss.dbeaver.core.wizard.import.workspace.name">
            <description>
                %wizard.org.jkiss.dbeaver.core.wizard.import.workspace.description
            </description>
        </wizard>

    </extension>

    <extension point="org.eclipse.ui.newWizards">
        <wizard
             category="org.jkiss.dbeaver.core.new.general"
             class="org.jkiss.dbeaver.ui.dialogs.connection.NewConnectionWizard"
             icon="platform:/plugin/org.jkiss.dbeaver.ui/icons/database.png"
             id="org.jkiss.dbeaver.core.wizard.new.connection"
             name="%wizard.org.jkiss.dbeaver.core.wizard.new.connection.name">
           <description>
               %wizard.org.jkiss.dbeaver.core.wizard.new.connection.description
           </description>
        </wizard>
    </extension>

    <extension point="org.eclipse.help.toc">
       <toc file="docs/help/toc.xml" primary="true">
       </toc>
    </extension>

    <extension point="org.eclipse.help.contexts">
       <contexts plugin="org.jkiss.dbeaver.core" file="docs/help/contexts.xml">
       </contexts>
    </extension>

    <extension point="org.eclipse.ui.keywords">
        <keyword id="org.jkiss.dbeaver.core.keyword.pref.db.general" label="%keyword.org.jkiss.dbeaver.core.keyword.pref.db.general.label"/>
        <keyword id="org.jkiss.dbeaver.core.keyword.pref.db.dataformat" label="%keyword.org.jkiss.dbeaver.core.keyword.pref.db.dataformat.label"/>
        <keyword id="org.jkiss.dbeaver.core.keyword.pref.db.qm" label="%keyword.org.jkiss.dbeaver.core.keyword.pref.db.qm.label"/>
        <keyword id="org.jkiss.dbeaver.core.keyword.pref.editor.binary" label="%keyword.org.jkiss.dbeaver.core.keyword.pref.editor.binary.label"/>
        <keyword id="org.jkiss.dbeaver.core.keyword.pref.editor.data" label="%keyword.org.jkiss.dbeaver.core.keyword.pref.editor.data.label"/>
        <keyword id="org.jkiss.dbeaver.core.keyword.pref.editor.content" label="%keyword.org.jkiss.dbeaver.core.keyword.pref.editor.content.label"/>
        <keyword id="org.jkiss.dbeaver.core.keyword.pref.editor.erd" label="%keyword.org.jkiss.dbeaver.core.keyword.pref.editor.erd.label"/>
        <keyword id="org.jkiss.dbeaver.core.keyword.pref.editor.sql" label="%keyword.org.jkiss.dbeaver.core.keyword.pref.editor.sql.label"/>
        <keyword id="org.jkiss.dbeaver.core.keyword.pref.editor.entity" label="%keyword.org.jkiss.dbeaver.core.keyword.pref.editor.entity.label"/>
        <keyword id="org.jkiss.dbeaver.core.keyword.pref.ui.general" label="%keyword.org.jkiss.dbeaver.core.keyword.pref.ui.general.label"/>
        <keyword id="org.jkiss.dbeaver.core.keyword.pref.ui.notifications" label="%keyword.org.jkiss.dbeaver.core.keyword.pref.ui.notifications.label"/>
        <keyword id="org.jkiss.dbeaver.core.keyword.dbeaver" label="dbeaver beaver"/>
        <keyword id="org.jkiss.dbeaver.core.keyword.connection" label="%keyword.org.jkiss.dbeaver.core.keyword.connection"/>
        <keyword id="org.jkiss.dbeaver.core.keyword.pref.resultset.grid" label="%keyword.org.jkiss.dbeaver.core.keyword.pref.resultset.grid.label"/>
        <keyword id="org.jkiss.dbeaver.core.keyword.pref.resultset.plain.text" label="%keyword.org.jkiss.dbeaver.core.keyword.pref.resultset.plain.text.label"/>
        <keyword id="org.jkiss.dbeaver.core.keyword.database.connection" label="%keyword.org.jkiss.dbeaver.core.keyword.database.connection.label"/>
        <keyword id="org.jkiss.dbeaver.core.keyword.user.interface" label="%keyword.org.jkiss.dbeaver.core.keyword.user.interface.label"/>

    </extension>

    <!-- DBeaver extensions -->

    <extension point="org.jkiss.dbeaver.objectManager">
        <manager class="org.jkiss.dbeaver.registry.DataSourceDescriptorManager" objectType="org.jkiss.dbeaver.model.DBPDataSourceContainer"/>
    </extension>

    <extension point="org.jkiss.dbeaver.resourceHandler">
        <handler type="default" class="org.jkiss.dbeaver.ui.resources.DefaultResourceHandlerImpl"/>
        <handler type="project" class="org.jkiss.dbeaver.ui.resources.projects.ProjectHandlerImpl"/>
        <handler type="bookmark" class="org.jkiss.dbeaver.ui.resources.bookmarks.BookmarksHandlerImpl"/>
        <handler type="shortcut" class="org.jkiss.dbeaver.ui.resources.shortcuts.ShortcutsHandlerImpl"/>
    </extension>

    <extension point="org.jkiss.dbeaver.ui.propertyConfigurator">
        <propertyConfigurator class="org.jkiss.dbeaver.model.impl.net.SocksProxyImpl" uiClass="org.jkiss.dbeaver.ui.dialogs.net.SocksProxyConfiguratorUI"/>
    </extension>

    <extension point="org.eclipse.e4.ui.css.swt.theme">
        <stylesheet uri="css/e4-dbeaver_prefstyle.css">
            <themeid refid="org.eclipse.e4.ui.css.theme.e4_default"/>
        </stylesheet>
        <stylesheet uri="css/e4-dark_dbeaver_prefstyle.css">
            <themeid refid="org.eclipse.e4.ui.css.theme.e4_dark"/>
        </stylesheet>
    </extension>

    <extension point="org.jkiss.dbeaver.service">
        <service name="org.jkiss.dbeaver.runtime.ui.UIServiceSQL" class="org.jkiss.dbeaver.ui.editors.sql.UIServiceSQLImpl"/>
        <service name="org.jkiss.dbeaver.runtime.ui.UIServiceConnections" class="org.jkiss.dbeaver.ui.actions.datasource.UIServiceConnectionsImpl"/>
        <service name="org.jkiss.dbeaver.runtime.DBServiceConnections" class="org.jkiss.dbeaver.ui.actions.datasource.UIServiceConnectionsImpl"/>
    </extension>

    <extension point="org.jkiss.dbeaver.pluginService">
        <service class="org.jkiss.dbeaver.ui.actions.GlobalPropertyTester$ResourceListener"/>
        <service class="org.jkiss.dbeaver.ui.actions.DataSourcePropertyTester$QMService"/>
    </extension>

    <extension point="org.jkiss.dbeaver.mavenRepository">
        <repository id="maven-central" name="%maven.respository.central" url="https://repo1.maven.org/maven2/" order="0"/>
        <repository id="oss.sonatype.org" snapshot="true" name="%maven.repository.sonatype" url="https://oss.sonatype.org/content/repositories/snapshots/" order="0"/>

        <!-- Non-HTTPS Maven Central is no longer alive. Hooray. -->
<!--
        <repository id="maven-central-unsecure" name="%maven.respository.central.unsecure" url="http://central.maven.org/maven2/" order="99999"/>
-->
    </extension>

    <!-- Perspective -->
    <extension point="org.eclipse.ui.perspectives">
        <perspective
                class="org.jkiss.dbeaver.ui.perspective.DBeaverPerspective"
                icon="platform:/plugin/org.jkiss.dbeaver.ui/icons/dbeaver_perspective.png"
                id="org.jkiss.dbeaver.core.perspective"
                name="%perspective.name">
        </perspective>
    </extension>

    <extension point="org.eclipse.ui.perspectiveExtensions">
        <perspectiveExtension targetID="org.jkiss.dbeaver.core.perspective">
            <hiddenToolBarItem id="org.eclipse.ui.edit.text.gotoNextEditPosition"/>
            <hiddenToolBarItem id="org.eclipse.ui.edit.text.gotoLastEditPosition"/>
        </perspectiveExtension>
    </extension>

    <extension point="org.jkiss.dbeaver.confirmations">
        <confirmation
                id="exit"
                title="%confirm.exit.title"
                description="%confirm.exit.tip"
                message="%confirm.exit.message"
                toggleMessage="%confirm.general.toggleMessage"
                group="%confirmation.group.general.actions"/>
        <confirmation
                id="disconnect_txn"
                title="%confirm.disconnect_txn.title"
                description="%confirm.disconnect_txn.tip"
                message="%confirm.disconnect_txn.message"
                toggleMessage="%confirm.general.toggleMessage"
                group="%confirmation.group.general.actions"/>
        <confirmation
                id="reconnect_txn"
                title="%confirm.reconnect_txn.title"
                description="%confirm.reconnect_txn.tip"
                message="%confirm.reconnect_txn.message"
                toggleMessage="%confirm.general.toggleMessage"
                group="%confirmation.group.general.actions"/>
        <confirmation
                id="driver_download"
                title="%confirm.driver_download.title"
                description="%confirm.driver_download.tip"
                message="%confirm.driver_download.message"
                toggleMessage="%confirm.general.toggleMessage"
                group="%confirmation.group.general.actions"/>
        <confirmation
                id="disable_network_handler"
                title="%confirm.disable_network_handler.title"
                description="%confirm.disable_network_handler.tip"
                message="%confirm.disable_network_handler.message"
                toggleMessage="%confirm.general.toggleMessage"
                group="%confirmation.group.general.actions"/>
    </extension>

    <extension point="org.eclipse.ui.preferencePages">
        <page
            category="org.jkiss.dbeaver.preferences.main"
            id="org.jkiss.dbeaver.preferences.main.toolbar.customization"
            class="org.jkiss.dbeaver.ui.preferences.PrefPageToolbarCustomization"
            name="%org.jkiss.dbeaver.preferences.main.toolbar.customization.name"/>
         <page 
             id="org.jkiss.dbeaver.preferences.accessibility" 
             category="org.jkiss.dbeaver.preferences.main"
             class="org.jkiss.dbeaver.ui.preferences.PrefPageAccessibility" 
             name="%page.org.jkiss.dbeaver.preferences.accessibility.name">
        </page>
    </extension>

    <extension point="org.jkiss.dbeaver.notifications">
        <notification id="commit" name="Transaction commit"/>
        <notification id="rollback" name="Transaction rollback"/>
        <notification id="rollback.idle" name="Transaction rollback after long idle period"/>
        <notification id="reconnect.success" name="Datasource invalidation success"/>
        <notification id="reconnect.failure" name="Datasource invalidation failure"/>
        <notification id="agent.notify" name="Long-time operations" description="This is a notification for long-time operations.&#10;It will be shown for all operations that have exceeded the specified timeout." soundEnabled="true"/>
    </extension>

</plugin>
unknowIfGuestInDream commented 5 months ago
public class FolderDisconnectHandler extends AbstractHandler {

    @Override
    public Object execute(ExecutionEvent event) throws ExecutionException {
        ISelection selection = HandlerUtil.getCurrentSelection(event);

        if (selection instanceof IStructuredSelection) {
            IStructuredSelection treeSelection = (IStructuredSelection) selection;
            @SuppressWarnings("rawtypes")
            Iterator it = treeSelection.iterator();
            while (it.hasNext()) {
                Object el = it.next();
                if (el instanceof DBNLocalFolder) {
                    DBNLocalFolder localFolder = (DBNLocalFolder) el;
                    localFolder.getNestedDataSources().forEach(ds -> {
                        final DBPDataSourceContainer dataSourceContainer = ds.getObject();
                        if (ds != null && ds.getObject().isConnected()) {
                            DataSourceHandler.disconnectDataSource(dataSourceContainer, null);
                        }
                    });
                }
            }
        }
        return null;
    }
}
unknowIfGuestInDream commented 5 months ago
public class DataSourceDisconnectHandler extends AbstractDataSourceHandler
{
    @Override
    public Object execute(ExecutionEvent event) throws ExecutionException
    {
        final DataSourceDescriptor dataSourceContainer = (DataSourceDescriptor) getActiveDataSourceContainer(event, false);
        if (dataSourceContainer != null) {
            DataSourceHandler.disconnectDataSource(dataSourceContainer, null);
        }
        return null;
    }

}
unknowIfGuestInDream commented 5 months ago
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.handlers.HandlerUtil;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.*;
import org.jkiss.dbeaver.model.exec.DBCExecutionContext;
import org.jkiss.dbeaver.model.navigator.DBNDatabaseNode;
import org.jkiss.dbeaver.model.navigator.DBNNode;
import org.jkiss.dbeaver.model.struct.DBSObject;
import org.jkiss.dbeaver.ui.navigator.NavigatorUtils;

public abstract class AbstractDataSourceHandler extends AbstractHandler {

    static protected final Log log = Log.getLog(AbstractDataSourceHandler.class);

    /**
     * Get execution context from active editor or active selection
     */
    public static DBCExecutionContext getActiveExecutionContext(ExecutionEvent event, boolean useEditor) {
        if (useEditor) {
            IEditorPart editor = HandlerUtil.getActiveEditor(event);
            if (editor instanceof DBPContextProvider) {
                return ((DBPContextProvider) editor).getExecutionContext();
            }
            return null;
        }
        IWorkbenchPart activePart = HandlerUtil.getActivePart(event);

        if (activePart instanceof DBPContextProvider) {
            return ((DBPContextProvider) activePart).getExecutionContext();
        }

        ISelection selection = HandlerUtil.getCurrentSelection(event);
        DBSObject selectedObject = NavigatorUtils.getSelectedObject(selection);
        if (selectedObject != null) {
            return DBUtils.getDefaultContext(selectedObject, false);
        }

        return null;
    }

    public static DBSObject getActiveObject(ExecutionEvent event) {
        IWorkbenchPart activePart = HandlerUtil.getActivePart(event);

        IStructuredSelection navSelection = NavigatorUtils.getSelectionFromPart(activePart);
        if (navSelection != null) {
            DBNNode selectedNode = NavigatorUtils.getSelectedNode(navSelection);
            if (selectedNode instanceof DBNDatabaseNode) {
                return ((DBNDatabaseNode) selectedNode).getObject();
            }
        }

        return null;
    }

    public static DBCExecutionContext getExecutionContextFromPart(IWorkbenchPart activePart) {
        if (activePart instanceof DBPContextProvider) {
            return ((DBPContextProvider) activePart).getExecutionContext();
        }
        return null;
    }

    public static DBPDataSourceContainer getActiveDataSourceContainer(ExecutionEvent event, boolean useEditor) {
        if (useEditor) {
            IEditorPart editor = HandlerUtil.getActiveEditor(event);
            if (editor != null) {
                DBPDataSourceContainer container = getDataSourceContainerFromPart(editor);
                if (container != null) {
                    return container;
                }
            }
            return null;
        }
        IWorkbenchPart activePart = HandlerUtil.getActivePart(event);
        DBPDataSourceContainer container = getDataSourceContainerFromPart(activePart);
        if (container != null) {
            return container;
        }
        ISelection selection = HandlerUtil.getCurrentSelection(event);

        DBSObject selectedObject = NavigatorUtils.getSelectedObject(selection);
        if (selectedObject instanceof DBPDataSourceContainer) {
            return (DBPDataSourceContainer) selectedObject;
        } else if (selectedObject != null) {
            DBPDataSource dataSource = selectedObject.getDataSource();
            return dataSource == null ? null : dataSource.getContainer();
        }

        return null;
    }

    public static DBPDataSourceContainer getDataSourceContainerFromPart(IWorkbenchPart activePart) {
        if (activePart instanceof DBPDataSourceContainerProvider) {
            return ((DBPDataSourceContainerProvider) activePart).getDataSourceContainer();
        }
        if (activePart instanceof DBPContextProvider) {
            DBCExecutionContext context = ((DBPContextProvider) activePart).getExecutionContext();
            return context == null ? null : context.getDataSource().getContainer();
        }
        return null;
    }

}
unknowIfGuestInDream commented 5 months ago

org.eclipse.core.expressions.definitions

        <definition id="org.jkiss.dbeaver.core.datasource.connected">
            <or>
                <with variable="selection">
                    <count value="1"/>
                    <iterate operator="and">
                        <adapt type="org.jkiss.dbeaver.model.DBPContextProvider">
                            <test property="org.jkiss.dbeaver.core.datasource.connected" value="true"/>
                        </adapt>
                    </iterate>
                </with>
                <with variable="activePart">
                    <adapt type="org.jkiss.dbeaver.model.DBPContextProvider">
                        <test property="org.jkiss.dbeaver.core.datasource.connected" value="true"/>
                    </adapt>
                </with>
            </or>
        </definition>
unknowIfGuestInDream commented 5 months ago
        <propertyTester
            class="org.jkiss.dbeaver.ui.actions.DataSourcePropertyTester"
            id="org.jkiss.dbeaver.ui.actions.DataSourcePropertyTester"
            namespace="org.jkiss.dbeaver.core.datasource"
            properties="connected,transactional,synchronizable,transactionActive,supportsTransactions,editable,projectResourceEditable,projectResourceViewable"
            type="org.jkiss.dbeaver.model.DBPContextProvider"/>
unknowIfGuestInDream commented 5 months ago
import org.eclipse.core.expressions.PropertyTester;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IWorkbenchWindow;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.*;
import org.jkiss.dbeaver.model.app.DBPProject;
import org.jkiss.dbeaver.model.exec.*;
import org.jkiss.dbeaver.model.navigator.DBNDataSource;
import org.jkiss.dbeaver.model.navigator.DBNDatabaseNode;
import org.jkiss.dbeaver.model.qm.QMUtils;
import org.jkiss.dbeaver.model.rm.RMConstants;
import org.jkiss.dbeaver.runtime.IPluginService;
import org.jkiss.dbeaver.runtime.qm.DefaultExecutionHandler;
import org.jkiss.dbeaver.ui.ActionUtils;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.editors.EditorUtils;
import org.jkiss.dbeaver.ui.editors.IStatefulEditor;
import org.jkiss.dbeaver.utils.GeneralUtils;

/**
 * DatabaseEditorPropertyTester
 */
public class DataSourcePropertyTester extends PropertyTester {

    static protected final Log log = Log.getLog(DataSourcePropertyTester.class);

    public static final String NAMESPACE = "org.jkiss.dbeaver.core.datasource";
    public static final String PROP_CONNECTED = "connected";
    public static final String PROP_TRANSACTIONAL = "transactional";
    public static final String PROP_SYNCHRONIZABLE = "synchronizable";
    public static final String PROP_SUPPORTS_TRANSACTIONS = "supportsTransactions";
    public static final String PROP_TRANSACTION_ACTIVE = "transactionActive";
    public static final String PROP_EDITABLE = "editable";
    public static final String PROP_PROJECT_RESOURCE_EDITABLE = "projectResourceEditable";
    public static final String PROP_PROJECT_RESOURCE_VIEWABLE = "projectResourceViewable";

    @Override
    public boolean test(Object receiver, String property, Object[] args, Object expectedValue) {
        try {
            // Get root datasource node (we don't want to
            while (receiver instanceof DBNDatabaseNode && !(receiver instanceof DBNDataSource)) {
                receiver = ((DBNDatabaseNode) receiver).getParentNode();
            }
            if (!(receiver instanceof DBPContextProvider)) {
                return false;
            }
            DBPContextProvider contextProvider = (DBPContextProvider) receiver;
            @Nullable
            DBCExecutionContext context = contextProvider.getExecutionContext();
            @Nullable
            DBPProject resourceProject = receiver instanceof IEditorPart
                ? EditorUtils.getFileProject(((IEditorPart) receiver).getEditorInput())
                : null;

            switch (property) {
                case PROP_CONNECTED:
                    boolean isConnected;
                    if (context != null) {
                        isConnected = context.getDataSource().getContainer().isConnected();
                    } else if (receiver instanceof DBPDataSourceContainerProvider) {
                        DBPDataSourceContainer container = ((DBPDataSourceContainerProvider) receiver).getDataSourceContainer();
                        isConnected = container != null && container.isConnected();
                    } else {
                        isConnected = false;
                    }
                    boolean checkConnected = Boolean.TRUE.equals(expectedValue);
                    return checkConnected == isConnected;
                case PROP_TRANSACTIONAL: {
                    if (context == null) {
                        return false;
                    }
                    if (!context.isConnected()) {
                        return Boolean.FALSE.equals(expectedValue);
                    }
                    DBCTransactionManager txnManager = DBUtils.getTransactionManager(context);
                    try {
                        return txnManager != null && Boolean.valueOf(!txnManager.isAutoCommit()).equals(expectedValue);
                    } catch (DBCException e) {
                        log.debug("Error checking auto-commit state", e);
                        return false;
                    }
                }
                case PROP_SYNCHRONIZABLE:
                    if (context == null || !context.isConnected()) {
                        return false;
                    } else {
                        final var container = context.getDataSource().getContainer();
                        final var provider = container.getDriver().getDataSourceProvider();
                        final var providerSynchronizable = GeneralUtils.adapt(provider, DBPDataSourceProviderSynchronizable.class);
                        return providerSynchronizable != null && providerSynchronizable.isSynchronizationEnabled(container);
                    }
                case PROP_SUPPORTS_TRANSACTIONS: {
                    if (context == null || !context.isConnected()) {
                        return false;
                    }
                    DBCTransactionManager txnManager = DBUtils.getTransactionManager(context);
                    return txnManager != null && txnManager.isSupportsTransactions();
                }
                case PROP_TRANSACTION_ACTIVE: {
                    if (context != null && context.isConnected()) {
                        DBCTransactionManager txnManager = DBUtils.getTransactionManager(context);
                        return txnManager != null && !txnManager.isAutoCommit();
//                        boolean active = QMUtils.isTransactionActive(context);
//                        return Boolean.valueOf(active).equals(expectedValue);
                    }
                    return Boolean.FALSE.equals(expectedValue);
                }
                case PROP_EDITABLE:
                    return resourceProject == null || resourceProject.hasRealmPermission(RMConstants.PERMISSION_PROJECT_DATASOURCES_EDIT);
                case PROP_PROJECT_RESOURCE_EDITABLE:
                    return resourceProject == null || resourceProject.hasRealmPermission(RMConstants.PERMISSION_PROJECT_RESOURCE_EDIT);
                case PROP_PROJECT_RESOURCE_VIEWABLE:
                    return resourceProject == null || resourceProject.hasRealmPermission(RMConstants.PERMISSION_PROJECT_RESOURCE_VIEW);
            }
            return false;
        } catch (Exception e) {
            log.debug("Error testing property " + property + ": " + e.getMessage());
            return false;
        }
    }

    public static void firePropertyChange(String propName)
    {
        ActionUtils.evaluatePropertyState(NAMESPACE + "." + propName);
    }

    public static class QMService implements IPluginService {

        private QMEventsHandler qmHandler;

        @Override
        public void activateService() {
            qmHandler = new QMEventsHandler();
            QMUtils.registerHandler(qmHandler);
        }

        @Override
        public void deactivateService() {
            QMUtils.unregisterHandler(qmHandler);
        }
    }

    // QM events handler
    private static class QMEventsHandler extends DefaultExecutionHandler {
        @NotNull
        @Override
        public String getHandlerName() {
            return DataSourcePropertyTester.class.getName();
        }

        @Override
        public synchronized void handleTransactionAutocommit(@NotNull DBCExecutionContext context, boolean autoCommit) {
            updateUI(() -> {
                // Fire transactional mode change
                DataSourcePropertyTester.firePropertyChange(DataSourcePropertyTester.PROP_TRANSACTIONAL);
                DataSourcePropertyTester.firePropertyChange(DataSourcePropertyTester.PROP_TRANSACTION_ACTIVE);
                ActionUtils.fireCommandRefresh(ConnectionCommands.CMD_TOGGLE_AUTOCOMMIT);
            });
        }

        @Override
        public synchronized void handleTransactionCommit(@NotNull DBCExecutionContext context) {
            updateUI(() -> {
                DataSourcePropertyTester.firePropertyChange(DataSourcePropertyTester.PROP_TRANSACTION_ACTIVE);
                updateEditorsDirtyFlag();
            });
        }

        @Override
        public synchronized void handleTransactionRollback(@NotNull DBCExecutionContext context, DBCSavepoint savepoint) {
            updateUI(() -> {
                DataSourcePropertyTester.firePropertyChange(DataSourcePropertyTester.PROP_TRANSACTION_ACTIVE);
                updateEditorsDirtyFlag();
            });
        }

        @Override
        public synchronized void handleStatementExecuteBegin(@NotNull DBCStatement statement) {
            updateUI(() -> DataSourcePropertyTester.firePropertyChange(DataSourcePropertyTester.PROP_TRANSACTION_ACTIVE));
        }

        private void updateUI(Runnable runnable) {
            UIUtils.asyncExec(runnable);
        }
    }

    /**
     * This is a hack.
     * Editors should listen txn commit/rollback and update their dirty flag (active transaction makes SQL editor dirty).
     * Making each editor QM listener is too expensive.
     */
    private static void updateEditorsDirtyFlag() {
        IWorkbenchWindow workbenchWindow = UIUtils.findActiveWorkbenchWindow();
        if (workbenchWindow == null) {
            return;
        }
        IEditorReference[] editors = workbenchWindow.getActivePage().getEditorReferences();
        for (IEditorReference ref : editors) {
            final IEditorPart editor = ref.getEditor(false);
            if (editor instanceof IStatefulEditor) {
                UIUtils.asyncExec(((IStatefulEditor) editor)::updateDirtyFlag);
            }
        }
    }

}
github-actions[bot] commented 4 months ago

This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 5 days