diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGConstants.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGConstants.java index d514a278610befe4aad05eedfadc7bd48f00a3c4..c9229cd7b69dc872294e0a1f6db58bfa9f8fd91a 100644 --- a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGConstants.java +++ b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGConstants.java @@ -29,6 +29,8 @@ public class DBGConstants { public static final String ATTR_PROCEDURE_NAME = BUNDLE_SYMBOLIC_NAME + ".ATTR_PROCEDURE_NAME"; //$NON-NLS-1$ public static final String ATTR_PROCEDURE_OID = BUNDLE_SYMBOLIC_NAME + ".ATTR_PROCEDURE_OID"; //$NON-NLS-1$ public static final String ATTR_DATASOURCE_ID = BUNDLE_SYMBOLIC_NAME + ".ATTR_DATASOURCE_ID"; //$NON-NLS-1$ + public static final String ATTR_DEBUG_TYPE = BUNDLE_SYMBOLIC_NAME + ".ATTR_DEBUG_TYPE"; //$NON-NLS-1$ + public static final String SOURCE_CONTAINER_TYPE_DATASOURCE = BUNDLE_SYMBOLIC_NAME + ".datasourceSourceContainerType"; //$NON-NLS-1$ public static final String BREAKPOINT_ATTRIBUTE_PROCEDURE_OID = BUNDLE_SYMBOLIC_NAME + ".procedureOid"; //$NON-NLS-1$ public static final String BREAKPOINT_ATTRIBUTE_PROCEDURE_NAME = BUNDLE_SYMBOLIC_NAME + ".procedureName"; //$NON-NLS-1$ diff --git a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/internal/DebugConfigurationPanelDescriptor.java b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/internal/DebugConfigurationPanelDescriptor.java new file mode 100644 index 0000000000000000000000000000000000000000..cf568292c23685aae38894a76d5f9808a6111e73 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/internal/DebugConfigurationPanelDescriptor.java @@ -0,0 +1,78 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2018 Serge Rider (serge@jkiss.org) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jkiss.dbeaver.debug.internal; + +import org.eclipse.core.runtime.IConfigurationElement; +import org.jkiss.code.NotNull; +import org.jkiss.dbeaver.DBException; +import org.jkiss.dbeaver.debug.ui.DBGConfigurationPanel; +import org.jkiss.dbeaver.registry.AbstractContextDescriptor; +import org.jkiss.dbeaver.registry.RegistryConstants; +import org.jkiss.utils.CommonUtils; + +/** + * DebugConfigurationPanelDescriptor + */ +public class DebugConfigurationPanelDescriptor extends AbstractContextDescriptor +{ + public static final String EXTENSION_ID = "org.jkiss.dbeaver.debug.ui.configurationPanels"; //$NON-NLS-1$ + + private final String id; + private final String name; + private final String description; + private final ObjectType implType; + + public DebugConfigurationPanelDescriptor( + IConfigurationElement config) + { + super(config); + + this.id = config.getAttribute(RegistryConstants.ATTR_ID); + this.name = config.getAttribute(RegistryConstants.ATTR_NAME); + this.description = config.getAttribute(RegistryConstants.ATTR_DESCRIPTION); + this.implType = new ObjectType(config, RegistryConstants.ATTR_CLASS); + } + + @NotNull + public String getId() { + return id; + } + + @NotNull + public String getName() + { + return name; + } + + public String getDescription() + { + return description; + } + + public boolean isValid() { + return !CommonUtils.isEmpty(implType.getImplName()); + } + + public DBGConfigurationPanel createPanel() throws DBException { + return implType.createInstance(DBGConfigurationPanel.class); + } + + @Override + public String toString() { + return id; + } +} diff --git a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/internal/DebugConfigurationPanelRegistry.java b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/internal/DebugConfigurationPanelRegistry.java new file mode 100644 index 0000000000000000000000000000000000000000..f32a7116cbffd4f5ea9a764ac0eef216b63d97de --- /dev/null +++ b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/internal/DebugConfigurationPanelRegistry.java @@ -0,0 +1,73 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2018 Serge Rider (serge@jkiss.org) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jkiss.dbeaver.debug.internal; + +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.IExtensionRegistry; +import org.eclipse.core.runtime.Platform; +import org.jkiss.dbeaver.model.DBPDataSourceContainer; + +import java.util.ArrayList; +import java.util.List; + +public class DebugConfigurationPanelRegistry +{ + private static DebugConfigurationPanelRegistry instance = null; + + public synchronized static DebugConfigurationPanelRegistry getInstance() + { + if (instance == null) { + instance = new DebugConfigurationPanelRegistry(Platform.getExtensionRegistry()); + } + return instance; + } + + private final List descriptors = new ArrayList<>(); + + private DebugConfigurationPanelRegistry(IExtensionRegistry registry) + { + // Load data descriptors from external plugins + { + IConfigurationElement[] extElements = registry.getConfigurationElementsFor(DebugConfigurationPanelDescriptor.EXTENSION_ID); + for (IConfigurationElement ext : extElements) { + DebugConfigurationPanelDescriptor formatterDescriptor = new DebugConfigurationPanelDescriptor(ext); + descriptors.add(formatterDescriptor); + } + } + } + + public List getPanels() + { + return descriptors; + } + + public List getPanels(DBPDataSourceContainer dataSource) + { + return descriptors; + } + + public DebugConfigurationPanelDescriptor getPanel(String id) + { + for (DebugConfigurationPanelDescriptor descriptor : descriptors) { + if (descriptor.getId().equals(id)) { + return descriptor; + } + } + return null; + } + +} diff --git a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/internal/ui/DebugUIMessages.java b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/internal/ui/DebugUIMessages.java index c3b6a184fe545f9c505f386e78d40dab4cb9bc40..607d93c4e11ad3fc806f3da20dd52769ab837583 100644 --- a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/internal/ui/DebugUIMessages.java +++ b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/internal/ui/DebugUIMessages.java @@ -31,14 +31,8 @@ public class DebugUIMessages extends NLS { public static String DatabaseTab_driver_label_text; public static String DatabaseTab_datasource_label_text; - public static String DatabaseTab_procedure_group_text; - public static String DatabaseTab_database_label_text; - public static String DatabaseTab_schema_label_text; - public static String DatabaseTab_oid_label_text; - public static String DatabaseTab_name_label_text; - - public static String DatabaseTab_attach_group_text; - public static String DatabaseTab_script_execute_text; + public static String DatabaseTab_debug_type_group_text; + public static String DatabaseTab_configuration_group_text; public static String DatabaseTab_name; diff --git a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/internal/ui/DebugUIMessages.properties b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/internal/ui/DebugUIMessages.properties index e0d5861cf1e577320c4b071c157fc9b80c14e79e..181f2561ab7510d0e765bb4904eedb3f1d4625f2 100644 --- a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/internal/ui/DebugUIMessages.properties +++ b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/internal/ui/DebugUIMessages.properties @@ -21,16 +21,10 @@ DatabaseTab_connection_group_text=Connection settings DatabaseTab_driver_label_text=Driver DatabaseTab_datasource_label_text=DataSource -DatabaseTab_procedure_group_text=Procedure settings -DatabaseTab_database_label_text=Database -DatabaseTab_schema_label_text=Schema -DatabaseTab_oid_label_text=OID -DatabaseTab_name_label_text=Name +DatabaseTab_debug_type_group_text=Type +DatabaseTab_configuration_group_text=Configuration -DatabaseTab_attach_group_text=Attach settings -DatabaseTab_script_execute_text=Execute script - -DatabaseTab_name=&Main +DatabaseTab_name=&Settings DatabaseLaunchShortcut_e_launch=Launch error diff --git a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DBGConfigurationPanel.java b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DBGConfigurationPanel.java index a32f0cd671bdfa2b8af384067d42165782bb7111..a64ad74a02c615158d507a1cc6f518a29e521e3c 100644 --- a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DBGConfigurationPanel.java +++ b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DBGConfigurationPanel.java @@ -16,17 +16,19 @@ */ package org.jkiss.dbeaver.debug.ui; -import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.swt.widgets.Composite; import org.jkiss.code.NotNull; import org.jkiss.dbeaver.model.DBPDataSourceContainer; +import java.util.Map; + public interface DBGConfigurationPanel { void createPanel(@NotNull Composite parent); - void loadConfiguration(@NotNull DBPDataSourceContainer dataSource, @NotNull ILaunchConfiguration configuration); + void loadConfiguration(@NotNull DBPDataSourceContainer dataSource, @NotNull Map configuration); - void saveConfiguration(@NotNull DBPDataSourceContainer dataSource, @NotNull ILaunchConfiguration configuration); + void saveConfiguration(@NotNull DBPDataSourceContainer dataSource, @NotNull Map configuration); + boolean isValid(); } diff --git a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DatabaseDebugConfigurationTab.java b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DatabaseDebugConfigurationTab.java index 731437296a720dda0174a5abe8c4a6c1191c46f2..0a3dce93b956a60a54e13526e98097437d0479a5 100644 --- a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DatabaseDebugConfigurationTab.java +++ b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DatabaseDebugConfigurationTab.java @@ -23,16 +23,19 @@ import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.debug.ui.AbstractLaunchConfigurationTab; -import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.swt.SWT; -import org.eclipse.swt.events.*; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.*; import org.eclipse.ui.PlatformUI; +import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.debug.DBGConstants; -import org.jkiss.dbeaver.debug.DBGController; +import org.jkiss.dbeaver.debug.internal.DebugConfigurationPanelDescriptor; +import org.jkiss.dbeaver.debug.internal.DebugConfigurationPanelRegistry; import org.jkiss.dbeaver.debug.internal.ui.DebugUIMessages; import org.jkiss.dbeaver.model.DBIcon; import org.jkiss.dbeaver.model.DBPDataSourceContainer; @@ -41,24 +44,23 @@ import org.jkiss.dbeaver.registry.DataSourceDescriptor; import org.jkiss.dbeaver.registry.DataSourceProviderRegistry; import org.jkiss.dbeaver.registry.DataSourceRegistry; import org.jkiss.dbeaver.registry.driver.DriverDescriptor; +import org.jkiss.dbeaver.runtime.ui.DBUserInterface; import org.jkiss.dbeaver.ui.DBeaverIcons; import org.jkiss.dbeaver.ui.UIUtils; -import org.jkiss.dbeaver.ui.controls.CSmartSelector; -import org.jkiss.dbeaver.ui.controls.DatabaseLabelProviders; import org.jkiss.dbeaver.ui.controls.SelectDataSourceCombo; -import org.jkiss.dbeaver.ui.perspective.DataSourceManagementToolbar; import org.jkiss.utils.CommonUtils; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + public class DatabaseDebugConfigurationTab extends AbstractLaunchConfigurationTab { - private Text driverText; - private Text oidText; - private Text nameText; + private DebugConfigurationPanelDescriptor selectedDebugType; + private DBGConfigurationPanel selectedDebugPanel; + private ILaunchConfiguration currentConfiguration; - private Button attachLocal; - private Button attachGlobal; - private Text processText; - private Text scriptText; + private Text driverText; /** * Modify listener that simply updates the owning launch configuration @@ -66,6 +68,8 @@ public class DatabaseDebugConfigurationTab extends AbstractLaunchConfigurationTa */ protected ModifyListener modifyListener = evt -> scheduleUpdateJob(); private SelectDataSourceCombo connectionCombo; + private Group typesGroup; + private Composite panelPlaceholder; @Override public void createControl(Composite parent) { @@ -80,8 +84,7 @@ public class DatabaseDebugConfigurationTab extends AbstractLaunchConfigurationTa protected void createComponents(Composite comp) { createConnectionSettingsGroup(comp); - createDatabaseSettingsGroup(comp); - createAttachSettingsGroup(comp); + createPanelListGroup(comp); } protected void createConnectionSettingsGroup(Composite composite) { @@ -98,6 +101,8 @@ public class DatabaseDebugConfigurationTab extends AbstractLaunchConfigurationTa protected void onDataSourceChange(DBPDataSourceContainer dataSource) { String driverName = dataSource == null ? "" : dataSource.getDriver().getFullName(); driverText.setText(driverName); + loadConnectionDebugTypes(); + scheduleUpdateJob(); } }; connectionCombo.addItem(null); @@ -108,52 +113,91 @@ public class DatabaseDebugConfigurationTab extends AbstractLaunchConfigurationTa driverText = UIUtils.createLabelText(group, DebugUIMessages.DatabaseTab_driver_label_text, "", SWT.READ_ONLY); } - protected void createDatabaseSettingsGroup(Composite composite) { - String groupLabel = DebugUIMessages.DatabaseTab_procedure_group_text; - Group group = UIUtils.createControlGroup(composite, groupLabel, 2, GridData.FILL_HORIZONTAL, SWT.DEFAULT); - { - String label = DebugUIMessages.DatabaseTab_oid_label_text; - oidText = UIUtils.createLabelText(group, label, "", SWT.READ_ONLY); + protected void createPanelListGroup(Composite composite) { + typesGroup = UIUtils.createControlGroup(composite, DebugUIMessages.DatabaseTab_debug_type_group_text, 3, GridData.FILL_HORIZONTAL, SWT.DEFAULT); + panelPlaceholder = UIUtils.createControlGroup(composite, DebugUIMessages.DatabaseTab_configuration_group_text, 1, GridData.FILL_BOTH, SWT.DEFAULT); + loadConnectionDebugTypes(); + } + + private void loadConnectionDebugTypes() { + for (Control c : typesGroup.getChildren()) { + c.dispose(); } - { - String label = DebugUIMessages.DatabaseTab_name_label_text; - nameText = UIUtils.createLabelText(group, label, "", SWT.READ_ONLY); + + DBPDataSourceContainer dataSource = connectionCombo.getSelectedItem(); + if (dataSource == null) { + UIUtils.createInfoLabel(typesGroup, "Select a connection to see available debug types"); + } else { + List panels = DebugConfigurationPanelRegistry.getInstance().getPanels(dataSource); + if (CommonUtils.isEmpty(panels)) { + UIUtils.createInfoLabel(typesGroup, "Driver '" + dataSource.getDriver().getFullName() + "' doesn't support debugging"); + } else { + for (DebugConfigurationPanelDescriptor panel : panels) { + Button typeSelector = new Button(typesGroup, SWT.RADIO); + typeSelector.setText(panel.getName()); + if (!CommonUtils.isEmpty(panel.getDescription())) { + typeSelector.setToolTipText(panel.getDescription()); + } + typeSelector.setData(panel); + if (panel.isValid()) { + typeSelector.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + if (typeSelector.getSelection()) { + setDebugType(connectionCombo.getSelectedItem(), (DebugConfigurationPanelDescriptor) typeSelector.getData()); + updateLaunchConfigurationDialog(); + } + } + }); + } else { + typeSelector.setEnabled(false); + } + } + } } + setDebugType(dataSource, null); + typesGroup.getParent().layout(true, true); } - protected void createAttachSettingsGroup(Composite composite) { - String groupLabel = DebugUIMessages.DatabaseTab_attach_group_text; - Group group = UIUtils.createControlGroup(composite, groupLabel, 2, - GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL | GridData.GRAB_VERTICAL, SWT.DEFAULT); - group.setLayout(new GridLayout(3, false)); - - SelectionListener attachKindListener = new SelectionAdapter() { - public void widgetSelected(SelectionEvent event) { - Object data = event.widget.getData(); - String attachKind = String.valueOf(data); - handleAttachKind(attachKind); + private void setDebugType(DBPDataSourceContainer dataSource, DebugConfigurationPanelDescriptor debugPanel) { + if (selectedDebugType == debugPanel) { + return; + } + for (Control c : panelPlaceholder.getChildren()) { + c.dispose(); + } + if (debugPanel != null) { + try { + selectedDebugType = debugPanel; + selectedDebugPanel = debugPanel.createPanel(); + selectedDebugPanel.createPanel(panelPlaceholder); + if (dataSource != null && currentConfiguration != null) { + try { + selectedDebugPanel.loadConfiguration(dataSource, currentConfiguration.getAttributes()); + } catch (CoreException e) { + setWarningMessage("Error loading panel configuration: " + e.getMessage()); + } + } + } catch (DBException e) { + selectedDebugType = null; + selectedDebugPanel = null; + DBUserInterface.getInstance().showError("Panel create error", "Can't create debugger config panel " + debugPanel.getId(), e); } - }; - - attachLocal = new Button(group, SWT.RADIO); - attachLocal.setData(DBGController.ATTACH_KIND_LOCAL); - attachLocal.setText("Local"); - attachLocal.addSelectionListener(attachKindListener); - attachLocal.setLayoutData(GridDataFactory.swtDefaults().span(3, 1).create()); - - attachGlobal = new Button(group, SWT.RADIO); - attachGlobal.setData(DBGController.ATTACH_KIND_GLOBAL); - attachGlobal.setText("Global"); - attachGlobal.addSelectionListener(attachKindListener); - attachGlobal.setLayoutData(GridDataFactory.swtDefaults().span(1, 1).create()); - - processText = UIUtils.createLabelText(group, "PID", "", SWT.READ_ONLY, - GridDataFactory.swtDefaults().span(1, 1).create()); - processText.addModifyListener(modifyListener); - - scriptText = new Text(group, SWT.MULTI); - scriptText.setLayoutData(GridDataFactory.fillDefaults().span(3, 1).grab(true, true).create()); - scriptText.addModifyListener(modifyListener); + } else { + selectedDebugType = null; + selectedDebugPanel = null; + } + if (selectedDebugType == null) { + UIUtils.createInfoLabel(panelPlaceholder, "Select a debug type to see debug configuration"); + } else { + for (Control c : typesGroup.getChildren()) { + if (c instanceof Button && c.getData() == debugPanel) { + ((Button) c).setSelection(true); + break; + } + } + } + updateLaunchConfigurationDialog(); } @Override @@ -162,6 +206,7 @@ public class DatabaseDebugConfigurationTab extends AbstractLaunchConfigurationTa @Override public void initializeFrom(ILaunchConfiguration configuration) { + this.currentConfiguration = configuration; try { String dsId = configuration.getAttribute(DBGConstants.ATTR_DATASOURCE_ID, (String) null); DataSourceDescriptor dataSource = DataSourceRegistry.findDataSource(dsId); @@ -169,42 +214,20 @@ public class DatabaseDebugConfigurationTab extends AbstractLaunchConfigurationTa if (dataSource != null) { driverText.setText(dataSource.getDriver().getFullName()); } - - oidText.setText( - configuration.getAttribute(DBGConstants.ATTR_PROCEDURE_OID, "")); - - nameText.setText( - configuration.getAttribute(DBGConstants.ATTR_PROCEDURE_NAME, "")); - - processText.setText( - configuration.getAttribute(DBGConstants.ATTR_ATTACH_PROCESS, "")); - - String extracted = configuration.getAttribute(DBGConstants.ATTR_ATTACH_KIND, (String)null); - if (DBGController.ATTACH_KIND_GLOBAL.equals(extracted)) { - attachGlobal.setSelection(true); - attachLocal.setSelection(false); - } else { - attachGlobal.setSelection(false); - attachLocal.setSelection(true); + loadConnectionDebugTypes(); + + String typeId = configuration.getAttribute(DBGConstants.ATTR_DEBUG_TYPE, (String) null); + DebugConfigurationPanelDescriptor savedPanel = null; + if (typeId != null) { + savedPanel = DebugConfigurationPanelRegistry.getInstance().getPanel(typeId); + if (savedPanel == null) { + setWarningMessage("Debug type '" + typeId + "' cannot be resolved"); + } } - handleAttachKind(extracted); - - scriptText.setText( - configuration.getAttribute(DBGConstants.ATTR_SCRIPT_TEXT, "")); + setDebugType(dataSource, savedPanel); } catch (CoreException e) { - e.printStackTrace(); - } - } - - void handleAttachKind(String attachKind) { - if (DBGController.ATTACH_KIND_GLOBAL.equals(attachKind)) { - processText.setEditable(true); - scriptText.setEnabled(false); - } else { - processText.setText(""); - processText.setEditable(false); - scriptText.setEnabled(true); + setWarningMessage("Error loading debug configuration: " + e.getMessage()); } updateLaunchConfigurationDialog(); } @@ -234,12 +257,22 @@ public class DatabaseDebugConfigurationTab extends AbstractLaunchConfigurationTa public void performApply(ILaunchConfigurationWorkingCopy configuration) { DBPDataSourceContainer dataSource = connectionCombo.getSelectedItem(); configuration.setAttribute(DBGConstants.ATTR_DATASOURCE_ID, dataSource == null ? null : dataSource.getId()); - configuration.setAttribute(DBGConstants.ATTR_PROCEDURE_OID, oidText.getText()); - configuration.setAttribute(DBGConstants.ATTR_PROCEDURE_NAME, nameText.getText()); - configuration.setAttribute(DBGConstants.ATTR_ATTACH_PROCESS, processText.getText()); - Widget kind = attachGlobal.getSelection() ? attachGlobal : attachLocal; - configuration.setAttribute(DBGConstants.ATTR_ATTACH_KIND, String.valueOf(kind.getData())); - configuration.setAttribute(DBGConstants.ATTR_SCRIPT_TEXT, scriptText.getText()); + configuration.setAttribute(DBGConstants.ATTR_DEBUG_TYPE, selectedDebugType == null ? null : selectedDebugType.getId()); + if (selectedDebugPanel != null) { + Map attrs = new HashMap<>(); + selectedDebugPanel.saveConfiguration(dataSource, attrs); + for (Map.Entry entry : attrs.entrySet()) { + if (entry.getValue() == null) { + configuration.removeAttribute(entry.getKey()); + } else if (entry.getValue() instanceof Integer) { + configuration.setAttribute(entry.getKey(), (Integer)entry.getValue()); + } else if (entry.getValue() instanceof Boolean) { + configuration.setAttribute(entry.getKey(), (Boolean)entry.getValue()); + } else { + configuration.setAttribute(entry.getKey(), entry.getValue().toString()); + } + } + } } @Override @@ -247,4 +280,13 @@ public class DatabaseDebugConfigurationTab extends AbstractLaunchConfigurationTa return DebugUIMessages.DatabaseTab_name; } + @Override + public boolean isValid(ILaunchConfiguration launchConfig) { + return connectionCombo.getSelectedItem() != null && selectedDebugType != null && selectedDebugPanel.isValid(); + } + + @Override + public boolean canSave() { + return connectionCombo.getSelectedItem() != null && selectedDebugType != null; + } } diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/plugin.xml b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/plugin.xml index e40b8ac905eddf975d8d270a964303a626316479..2070016fb0721148630f17772860951066bcde6a 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/plugin.xml +++ b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/plugin.xml @@ -26,6 +26,11 @@ class="org.jkiss.dbeaver.ext.postgresql.debug.ui.internal.PostgreDebugPanelFunction"> + + + diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PostgreDebugPanelFunction.java b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PostgreDebugPanelFunction.java index e904ccae173845b588a2b77e6339147085b9756d..fe830bd174dae6b3784ce31eca0369e47f8b5cd3 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PostgreDebugPanelFunction.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PostgreDebugPanelFunction.java @@ -18,25 +18,36 @@ package org.jkiss.dbeaver.ext.postgresql.debug.ui.internal; -import org.eclipse.debug.core.ILaunchConfiguration; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.jkiss.dbeaver.debug.ui.DBGConfigurationPanel; import org.jkiss.dbeaver.model.DBPDataSourceContainer; +import java.util.Map; + public class PostgreDebugPanelFunction implements DBGConfigurationPanel { @Override public void createPanel(Composite parent) { - + Button kindLocal = new Button(parent, SWT.RADIO); + kindLocal.setText("Local"); + Button kindGlobal = new Button(parent, SWT.RADIO); + kindGlobal.setText("Global"); } @Override - public void loadConfiguration(DBPDataSourceContainer dataSource, ILaunchConfiguration configuration) { + public void loadConfiguration(DBPDataSourceContainer dataSource, Map configuration) { } @Override - public void saveConfiguration(DBPDataSourceContainer dataSource, ILaunchConfiguration configuration) { + public void saveConfiguration(DBPDataSourceContainer dataSource, Map configuration) { } + + @Override + public boolean isValid() { + return false; + } }