From ec424c3f2d21c448e7d68fe60e774f8500faeed9 Mon Sep 17 00:00:00 2001 From: Serge Rider Date: Thu, 18 Jul 2019 11:38:55 +0200 Subject: [PATCH] #5384 Virtual entity edit dialog improvements --- .../model/virtual/DBVEntityForeignKey.java | 9 +- .../object/struct/AttributesSelectorPage.java | 88 ++++++++++--------- .../object/struct/EditForeignKeyPage.java | 8 +- .../resultset/EditVirtualEntityDialog.java | 48 +++++++++- .../controls/resultset/ResultSetViewer.java | 62 +++++-------- .../ValidateUniqueKeyUsageDialog.java | 8 +- 6 files changed, 124 insertions(+), 99 deletions(-) diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/virtual/DBVEntityForeignKey.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/virtual/DBVEntityForeignKey.java index 5b9feffcab..cd8369a983 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/virtual/DBVEntityForeignKey.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/virtual/DBVEntityForeignKey.java @@ -33,12 +33,11 @@ public class DBVEntityForeignKey implements DBSEntityConstraint, DBSEntityReferr @NotNull private final DBVEntity entity; - private final DBSEntityConstraint refEntityConstraint; + private DBSEntityConstraint refEntityConstraint; private final List attributes = new ArrayList<>(); - public DBVEntityForeignKey(DBVEntity entity, DBSEntityConstraint refEntityConstraint) throws DBException { + public DBVEntityForeignKey(@NotNull DBVEntity entity) { this.entity = entity; - this.refEntityConstraint = refEntityConstraint; /* if (refEntityConstraint instanceof DBSEntityReferrer) { for (DBSEntityAttributeRef attrRef : ((DBSEntityReferrer) refEntityConstraint).getAttributeReferences(monitor)) { @@ -58,6 +57,10 @@ public class DBVEntityForeignKey implements DBSEntityConstraint, DBSEntityReferr return refEntityConstraint; } + public void setReferencedConstraint(DBSEntityConstraint refEntityConstraint) { + this.refEntityConstraint = refEntityConstraint; + } + @Override public DBSEntity getAssociatedEntity() { return refEntityConstraint.getParentObject(); diff --git a/plugins/org.jkiss.dbeaver.ui.editors.base/src/org/jkiss/dbeaver/ui/editors/object/struct/AttributesSelectorPage.java b/plugins/org.jkiss.dbeaver.ui.editors.base/src/org/jkiss/dbeaver/ui/editors/object/struct/AttributesSelectorPage.java index ce55ea3d10..6b58b13e49 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.base/src/org/jkiss/dbeaver/ui/editors/object/struct/AttributesSelectorPage.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.base/src/org/jkiss/dbeaver/ui/editors/object/struct/AttributesSelectorPage.java @@ -16,6 +16,10 @@ */ package org.jkiss.dbeaver.ui.editors.object.struct; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.IJobChangeEvent; +import org.eclipse.core.runtime.jobs.JobChangeAdapter; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; @@ -27,19 +31,20 @@ import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.model.DBPEvaluationContext; import org.jkiss.dbeaver.model.DBUtils; import org.jkiss.dbeaver.model.navigator.DBNDatabaseNode; +import org.jkiss.dbeaver.model.runtime.AbstractJob; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; -import org.jkiss.dbeaver.model.runtime.DBRRunnableWithProgress; import org.jkiss.dbeaver.model.struct.DBSEntity; import org.jkiss.dbeaver.model.struct.DBSEntityAttribute; import org.jkiss.dbeaver.runtime.DBWorkbench; import org.jkiss.dbeaver.ui.DBeaverIcons; +import org.jkiss.dbeaver.ui.UITask; import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.dbeaver.ui.controls.CustomTableEditor; import org.jkiss.dbeaver.ui.controls.TableColumnSortListener; import org.jkiss.dbeaver.ui.editors.internal.EditorsMessages; +import org.jkiss.dbeaver.utils.GeneralUtils; import org.jkiss.utils.CommonUtils; -import java.lang.reflect.InvocationTargetException; import java.util.*; import java.util.List; @@ -237,54 +242,51 @@ public abstract class AttributesSelectorPage extends BaseObjectEditPage { //item.setText(index, control.getText()); } - protected void fillAttributes(final DBSEntity entity) + private void fillAttributes(final DBSEntity entity) { - // Collect attributes - final List attributes = new ArrayList<>(); - try { - UIUtils.runInProgressService(new DBRRunnableWithProgress() { - @Override - public void run(DBRProgressMonitor monitor) throws InvocationTargetException, InterruptedException - { - try { - for (DBSEntityAttribute attr : CommonUtils.safeCollection(entity.getAttributes(monitor))) { - if (!DBUtils.isHiddenObject(attr)) { - attributes.add(attr); - } + final List attrList = new ArrayList<>(); + AbstractJob loadJob = new AbstractJob("Load entity attributes") { + @Override + protected IStatus run(DBRProgressMonitor monitor) { + try { + for (DBSEntityAttribute attr : CommonUtils.safeCollection(entity.getAttributes(monitor))) { + if (!DBUtils.isHiddenObject(attr)) { + attrList.add(attr); } - } catch (DBException e) { - throw new InvocationTargetException(e); } + } catch (DBException e) { + return GeneralUtils.makeErrorStatus("Error loading attributes", e); } - }); - } catch (InvocationTargetException e) { - DBWorkbench.getPlatformUI().showError( - EditorsMessages.dialog_struct_columns_select_error_load_columns_title, - EditorsMessages.dialog_struct_columns_select_error_load_columns_message, - e.getTargetException()); - } catch (InterruptedException e) { - // do nothing - } - - for (DBSEntityAttribute attribute : attributes) { - TableItem columnItem = new TableItem(columnsTable, SWT.NONE); + return Status.OK_STATUS; + } + }; + loadJob.addJobChangeListener(new JobChangeAdapter() { + @Override + public void done(IJobChangeEvent event) { + UIUtils.syncExec(() -> { + for (DBSEntityAttribute attribute : attrList) { + TableItem columnItem = new TableItem(columnsTable, SWT.NONE); - AttributeInfo col = new AttributeInfo(attribute); - this.attributes.add(col); + AttributeInfo col = new AttributeInfo(attribute); + attributes.add(col); - DBNDatabaseNode attributeNode = DBWorkbench.getPlatform().getNavigatorModel().findNode(attribute); - if (attributeNode != null) { - columnItem.setImage(0, DBeaverIcons.getImage(attributeNode.getNodeIcon())); - } - fillAttributeColumns(attribute, col, columnItem); - columnItem.setData(col); - if (isColumnSelected(attribute)) { - columnItem.setChecked(true); - handleItemSelect(columnItem, false); + DBNDatabaseNode attributeNode = DBWorkbench.getPlatform().getNavigatorModel().findNode(attribute); + if (attributeNode != null) { + columnItem.setImage(0, DBeaverIcons.getImage(attributeNode.getNodeIcon())); + } + fillAttributeColumns(attribute, col, columnItem); + columnItem.setData(col); + if (isColumnSelected(attribute)) { + columnItem.setChecked(true); + handleItemSelect(columnItem, false); + } + } + UIUtils.packColumns(columnsTable); + updateToggleButton(); + }); } - } - UIUtils.packColumns(columnsTable); - updateToggleButton(); + }); + loadJob.schedule(); } private Composite createTableNameInput(Composite panel) { diff --git a/plugins/org.jkiss.dbeaver.ui.editors.base/src/org/jkiss/dbeaver/ui/editors/object/struct/EditForeignKeyPage.java b/plugins/org.jkiss.dbeaver.ui.editors.base/src/org/jkiss/dbeaver/ui/editors/object/struct/EditForeignKeyPage.java index 505e08af09..a22f146eeb 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.base/src/org/jkiss/dbeaver/ui/editors/object/struct/EditForeignKeyPage.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.base/src/org/jkiss/dbeaver/ui/editors/object/struct/EditForeignKeyPage.java @@ -83,7 +83,7 @@ public class EditForeignKeyPage extends BaseObjectEditPage { } private DBSForeignKeyModifyRule[] supportedModifyRules; - private DBSTableForeignKey foreignKey; + private DBSEntityAssociation foreignKey; private DBSTable curRefTable; private List curConstraints; private DBNDatabaseNode ownerTableNode; @@ -102,7 +102,7 @@ public class EditForeignKeyPage extends BaseObjectEditPage { public EditForeignKeyPage( String title, - DBSTableForeignKey foreignKey, + DBSEntityAssociation foreignKey, DBSForeignKeyModifyRule[] supportedModifyRules) { super(title); @@ -124,7 +124,7 @@ public class EditForeignKeyPage extends BaseObjectEditPage { { final Composite tableGroup = UIUtils.createPlaceholder(panel, 2, 5); tableGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - UIUtils.createLabelText(tableGroup, EditorsMessages.dialog_struct_edit_fk_label_table, foreignKey.getParentObject().getFullyQualifiedName(DBPEvaluationContext.UI), SWT.READ_ONLY | SWT.BORDER); + UIUtils.createLabelText(tableGroup, EditorsMessages.dialog_struct_edit_fk_label_table, DBUtils.getObjectFullName(foreignKey, DBPEvaluationContext.UI), SWT.READ_ONLY | SWT.BORDER); if (ownerTableNode != null) { try { @@ -459,7 +459,7 @@ public class EditForeignKeyPage extends BaseObjectEditPage { UIUtils.packColumns(columnsTable, true); } - private static List getValidAttributes(DBSTable table) throws DBException { + private static List getValidAttributes(DBSEntity table) throws DBException { List result = new ArrayList<>(); for (DBSEntityAttribute attr : table.getAttributes(new VoidProgressMonitor())) { if (!DBUtils.isHiddenObject(attr) && !DBUtils.isPseudoAttribute(attr)) { diff --git a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/EditVirtualEntityDialog.java b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/EditVirtualEntityDialog.java index 0e60f934bd..fc68818064 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/EditVirtualEntityDialog.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/EditVirtualEntityDialog.java @@ -17,6 +17,7 @@ package org.jkiss.dbeaver.ui.controls.resultset; import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; @@ -33,7 +34,9 @@ import org.jkiss.dbeaver.model.data.DBDAttributeTransformerDescriptor; import org.jkiss.dbeaver.model.data.DBDRowIdentifier; import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor; import org.jkiss.dbeaver.model.struct.DBSEntity; +import org.jkiss.dbeaver.model.struct.DBSEntityAssociation; import org.jkiss.dbeaver.model.struct.DBSEntityAttribute; +import org.jkiss.dbeaver.model.struct.rdb.DBSForeignKeyModifyRule; import org.jkiss.dbeaver.model.virtual.*; import org.jkiss.dbeaver.runtime.DBWorkbench; import org.jkiss.dbeaver.ui.DBeaverIcons; @@ -41,6 +44,7 @@ import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.dbeaver.ui.dialogs.BaseDialog; import org.jkiss.dbeaver.ui.editors.object.struct.EditConstraintPage; import org.jkiss.dbeaver.ui.editors.object.struct.EditDictionaryPage; +import org.jkiss.dbeaver.ui.editors.object.struct.EditForeignKeyPage; import org.jkiss.utils.CommonUtils; import java.util.ArrayList; @@ -50,6 +54,8 @@ class EditVirtualEntityDialog extends BaseDialog { private static final Log log = Log.getLog(EditVirtualEntityDialog.class); + private static final String DIALOG_ID = "DBeaver.EditVirtualEntityDialog";//$NON-NLS-1$ + public static final int ID_CREATE_UNIQUE_KEY = 1000; public static final int ID_REMOVE_UNIQUE_KEY = 1001; public static final int ID_CREATE_FOREIGN_KEY = 2000; @@ -63,6 +69,14 @@ class EditVirtualEntityDialog extends BaseDialog { private EditDictionaryPage editDictionaryPage; private EditConstraintPage editUniqueKeyPage; private DBVEntityConstraint uniqueConstraint; + private InitPage initPage = InitPage.ATTRIBUTES; + + public enum InitPage { + ATTRIBUTES, + UNIQUE_KEY, + FOREIGN_KEYS, + DICTIONARY, + } public EditVirtualEntityDialog(ResultSetViewer viewer, @Nullable DBSEntity entity, @NotNull DBVEntity vEntity) { super(viewer.getControl().getShell(), "Edit logical structure / presentation", null); @@ -71,6 +85,20 @@ class EditVirtualEntityDialog extends BaseDialog { this.vEntity = vEntity; } + @Override + protected IDialogSettings getDialogBoundsSettings() + { + return UIUtils.getDialogSettings(DIALOG_ID); + } + + public InitPage getInitPage() { + return initPage; + } + + public void setInitPage(InitPage initPage) { + this.initPage = initPage; + } + @Override protected Composite createDialogArea(Composite parent) { @@ -84,7 +112,12 @@ class EditVirtualEntityDialog extends BaseDialog { createForeignKeysPage(tabFolder); createDictionaryPage(tabFolder); - tabFolder.setSelection(0); + for (TabItem item : tabFolder.getItems()) { + if (item.getData() == initPage) { + tabFolder.setSelection(item); + break; + } + } UIUtils.createInfoLabel(composite, "Entity logical structure is defined on client-side.\nYou can define virtual unique/foreign keys even if physical database\n" + "doesn't have or doesn't support them. Also you can define how to view column values."); @@ -99,6 +132,7 @@ class EditVirtualEntityDialog extends BaseDialog { TabItem dictItem = new TabItem(tabFolder, SWT.NONE); dictItem.setText("Dictionary"); dictItem.setControl(editDictionaryPage.getControl()); + dictItem.setData(InitPage.DICTIONARY); } } @@ -109,6 +143,7 @@ class EditVirtualEntityDialog extends BaseDialog { } TabItem ukItem = new TabItem(tabFolder, SWT.NONE); ukItem.setText("Virtual Unique Key"); + ukItem.setData(InitPage.UNIQUE_KEY); uniqueConstraint = (DBVEntityConstraint) virtualEntityIdentifier.getUniqueKey(); @@ -122,6 +157,7 @@ class EditVirtualEntityDialog extends BaseDialog { private void createForeignKeysPage(TabFolder tabFolder) { TabItem fkItem = new TabItem(tabFolder, SWT.NONE); fkItem.setText("Virtual Foreign Keys"); + fkItem.setData(InitPage.FOREIGN_KEYS); Composite panel = new Composite(tabFolder, 1); panel.setLayout(new GridLayout(1, false)); @@ -140,7 +176,14 @@ class EditVirtualEntityDialog extends BaseDialog { btnAdd.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { - UIUtils.showMessageBox(getShell(), "Not implemented", "Not Implemented Yet", SWT.ICON_ERROR); + + DBSEntityAssociation virtualFK = new DBVEntityForeignKey(vEntity); + EditForeignKeyPage editDialog = new EditForeignKeyPage( + "Define virtual foreign keys", virtualFK, new DBSForeignKeyModifyRule[] { DBSForeignKeyModifyRule.NO_ACTION }); + if (!editDialog.edit()) { + return; + } + // Save } }); Button btnRemove = createButton(buttonsPanel, ID_REMOVE_FOREIGN_KEY, "Remove", false); @@ -158,6 +201,7 @@ class EditVirtualEntityDialog extends BaseDialog { private void createColumnsPage(TabFolder tabFolder) { TabItem colItem = new TabItem(tabFolder, SWT.NONE); colItem.setText("Columns view"); + colItem.setData(InitPage.ATTRIBUTES); Composite panel = new Composite(tabFolder, 1); panel.setLayout(new GridLayout(1, false)); diff --git a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetViewer.java b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetViewer.java index 4407a34bda..81f88da371 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetViewer.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetViewer.java @@ -103,8 +103,6 @@ import org.jkiss.dbeaver.ui.dialogs.ConfirmationDialog; import org.jkiss.dbeaver.ui.editors.data.internal.DataEditorsMessages; import org.jkiss.dbeaver.ui.editors.data.preferences.PrefPageDataFormat; import org.jkiss.dbeaver.ui.editors.data.preferences.PrefPageResultSetMain; -import org.jkiss.dbeaver.ui.editors.object.struct.EditConstraintPage; -import org.jkiss.dbeaver.ui.editors.object.struct.EditDictionaryPage; import org.jkiss.dbeaver.ui.navigator.NavigatorCommands; import org.jkiss.dbeaver.utils.GeneralUtils; import org.jkiss.dbeaver.utils.PrefUtils; @@ -114,8 +112,8 @@ import org.jkiss.utils.CommonUtils; import java.lang.reflect.InvocationTargetException; import java.text.DecimalFormat; -import java.util.List; import java.util.*; +import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; /** @@ -3643,6 +3641,12 @@ public class ResultSetViewer extends Viewer } } + private DBVEntity getVirtualEntity(DBSEntity entity) { + return entity != null ? + DBVUtils.getVirtualEntity(entity, true) : + DBVUtils.getVirtualEntity(getDataContainer(), true); + } + private void checkEntityIdentifiers(ResultSetPersister persister) throws DBException { @@ -3707,33 +3711,11 @@ public class ResultSetViewer extends Viewer } } - boolean editEntityIdentifier(DBRProgressMonitor monitor) throws DBException - { - DBDRowIdentifier virtualEntityIdentifier = getVirtualEntityIdentifier(); - if (virtualEntityIdentifier == null) { - log.warn("No virtual identifier"); - return false; - } - DBVEntityConstraint constraint = (DBVEntityConstraint) virtualEntityIdentifier.getUniqueKey(); - - EditConstraintPage page = new EditConstraintPage( - "Define virtual unique identifier", - constraint); - if (!page.edit()) { - return false; - } - - Collection uniqueAttrs = page.getSelectedAttributes(); - constraint.setAttributes(uniqueAttrs); - virtualEntityIdentifier = getVirtualEntityIdentifier(); - if (virtualEntityIdentifier == null) { - log.warn("No virtual identifier defined"); - return false; - } - virtualEntityIdentifier.reloadAttributes(monitor, model.getAttributes()); - persistConfig(); - - return true; + boolean editEntityIdentifier(DBRProgressMonitor monitor) { + EditVirtualEntityDialog dialog = new EditVirtualEntityDialog( + ResultSetViewer.this, model.getSingleSource(), getVirtualEntity(model.getSingleSource())); + dialog.setInitPage(EditVirtualEntityDialog.InitPage.UNIQUE_KEY); + return dialog.open() != IDialogConstants.OK_ID; } private void clearEntityIdentifier(DBRProgressMonitor monitor) throws DBException @@ -4431,30 +4413,28 @@ public class ResultSetViewer extends Viewer return; } DBSEntity entity = model.isSingleSource() ? model.getSingleSource() : null; - DBVEntity vEntity = entity != null ? - DBVUtils.getVirtualEntity(entity, true) : - DBVUtils.getVirtualEntity(dataContainer, true); + DBVEntity vEntity = getVirtualEntity(entity); EditVirtualEntityDialog dialog = new EditVirtualEntityDialog(ResultSetViewer.this, entity, vEntity); + dialog.setInitPage(EditVirtualEntityDialog.InitPage.ATTRIBUTES); dialog.open(); } } private class DictionaryEditAction extends Action { - DictionaryEditAction() - { + DictionaryEditAction() { super("Define dictionary"); } @Override - public void run() - { - EditDictionaryPage page = new EditDictionaryPage(model.getSingleSource()); - page.edit(); + public void run() { + EditVirtualEntityDialog dialog = new EditVirtualEntityDialog( + ResultSetViewer.this, model.getSingleSource(), getVirtualEntity(model.getSingleSource())); + dialog.setInitPage(EditVirtualEntityDialog.InitPage.DICTIONARY); + dialog.open(); } @Override - public boolean isEnabled() - { + public boolean isEnabled() { final DBSEntity singleSource = model.getSingleSource(); return singleSource != null; } diff --git a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/ValidateUniqueKeyUsageDialog.java b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/ValidateUniqueKeyUsageDialog.java index c906042581..68d0886889 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/ValidateUniqueKeyUsageDialog.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/ValidateUniqueKeyUsageDialog.java @@ -93,12 +93,8 @@ class ValidateUniqueKeyUsageDialog extends MessageDialogWithToggle { private void editCustomKey() { // Edit custom key - try { - if (viewer.editEntityIdentifier(new VoidProgressMonitor())) { - super.buttonPressed(IDialogConstants.OK_ID); - } - } catch (DBException e) { - DBWorkbench.getPlatformUI().showError("Virtual key edit", "Error editing virtual key", e); + if (viewer.editEntityIdentifier(new VoidProgressMonitor())) { + super.buttonPressed(IDialogConstants.OK_ID); } } -- GitLab