From 9e7e23cd4048308d688dcfddf50381fbc88dd767 Mon Sep 17 00:00:00 2001 From: Serge Rider Date: Fri, 31 Jan 2020 15:22:48 +0300 Subject: [PATCH] #7790 Reference panel refresh fix --- .../panel/references/ReferencesPanel.java | 29 +++++++++++---- .../ReferencesResultsContainer.java | 37 +++++++++---------- 2 files changed, 39 insertions(+), 27 deletions(-) diff --git a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/panel/references/ReferencesPanel.java b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/panel/references/ReferencesPanel.java index 32594f1072..464d5a9652 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/panel/references/ReferencesPanel.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/panel/references/ReferencesPanel.java @@ -20,15 +20,16 @@ import org.eclipse.jface.action.IContributionManager; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; +import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.jkiss.dbeaver.ui.UIUtils; -import org.jkiss.dbeaver.ui.controls.resultset.IResultSetPanel; -import org.jkiss.dbeaver.ui.controls.resultset.IResultSetPresentation; -import org.jkiss.dbeaver.ui.controls.resultset.ResultSetListenerAdapter; -import org.jkiss.dbeaver.ui.controls.resultset.ResultSetUtils; +import org.jkiss.dbeaver.ui.controls.resultset.*; +import org.jkiss.utils.CommonUtils; + +import java.util.List; /** * RSV references panel @@ -71,11 +72,23 @@ public class ReferencesPanel implements IResultSetPanel { presentation.getControl().addDisposeListener(e -> presentation.getController().removeListener(dataListener)); if (presentation instanceof ISelectionProvider) { - ISelectionChangedListener selectionListener = event -> { - if (presentation.getController().getVisiblePanel() != ReferencesPanel.this) { - return; + ISelectionChangedListener selectionListener = new ISelectionChangedListener() { + private List prevSelection; + @Override + public void selectionChanged(SelectionChangedEvent event) { + if (presentation.getController().getVisiblePanel() != ReferencesPanel.this) { + return; + } + if (!(event.getSelection() instanceof IResultSetSelection)) { + return; + } + List selectedItems = ((IResultSetSelection) event.getSelection()).getSelectedRows(); + if (CommonUtils.equalObjects(prevSelection, selectedItems)) { + return; + } + this.prevSelection = selectedItems; + getResultsContainer().refreshReferences(); } - getResultsContainer().refreshReferences(); }; ((ISelectionProvider) presentation).addSelectionChangedListener(selectionListener); presentation.getControl().addDisposeListener(e -> ((ISelectionProvider) presentation).removeSelectionChangedListener(selectionListener)); diff --git a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/panel/references/ReferencesResultsContainer.java b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/panel/references/ReferencesResultsContainer.java index 8fc4d7eb3e..07f5c62274 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/panel/references/ReferencesResultsContainer.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/panel/references/ReferencesResultsContainer.java @@ -42,7 +42,6 @@ import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.struct.*; import org.jkiss.dbeaver.model.virtual.DBVEntity; import org.jkiss.dbeaver.model.virtual.DBVUtils; -import org.jkiss.dbeaver.runtime.DBWorkbench; import org.jkiss.dbeaver.ui.DBeaverIcons; import org.jkiss.dbeaver.ui.UIIcon; import org.jkiss.dbeaver.ui.UIUtils; @@ -51,7 +50,6 @@ import org.jkiss.dbeaver.ui.controls.resultset.*; import org.jkiss.dbeaver.utils.GeneralUtils; import org.jkiss.utils.CommonUtils; -import java.lang.reflect.InvocationTargetException; import java.util.*; class ReferencesResultsContainer implements IResultSetContainer { @@ -317,37 +315,41 @@ class ReferencesResultsContainer implements IResultSetContainer { //log.error("No active reference key"); return; } - try { - UIUtils.runInProgressService(monitor -> { - + new AbstractJob("Read references") { + { + //setUser(true); + //setSystem(false); + } + @Override + protected IStatus run(DBRProgressMonitor monitor) { try { DBSEntity realEntity = DBVUtils.getRealEntity(monitor, activeReferenceKey.refEntity); if (!(realEntity instanceof DBSDataContainer)) { log.error("Referencing entity is not a data container"); - return; + return Status.OK_STATUS; } dataContainer = (DBSDataContainer) realEntity; List selectedRows = parentController.getSelection().getSelectedRows(); if (!force && CommonUtils.equalObjects(lastSelectedRows, selectedRows)) { - return; + return Status.OK_STATUS; } lastSelectedRows = selectedRows; if (selectedRows.isEmpty()) { UIUtils.asyncExec(() -> { - this.dataViewer.clearData(); - this.dataViewer.showEmptyPresentation(); + dataViewer.clearData(); + dataViewer.showEmptyPresentation(); }); } else { if (activeReferenceKey.isReference) { - this.dataViewer.navigateReference( + dataViewer.navigateReference( monitor, parentController.getModel(), activeReferenceKey.refAssociation, selectedRows, false); } else { - this.dataViewer.navigateAssociation( + dataViewer.navigateAssociation( monitor, parentController.getModel(), activeReferenceKey.refAssociation, @@ -355,15 +357,12 @@ class ReferencesResultsContainer implements IResultSetContainer { } } - } catch (DBException e) { - throw new InvocationTargetException(e); + } catch (Exception e) { + return GeneralUtils.makeExceptionStatus(e); } - }); - } catch (InvocationTargetException e) { - DBWorkbench.getPlatformUI().showError("Can't show references", "Error opening '" + dataContainer.getName() + "' references", e.getTargetException()); - } catch (InterruptedException e) { - // Ignore - } + return Status.OK_STATUS; + } + }.schedule(); } static class ReferenceKey { -- GitLab