From 9bc3b15d0710aa0073761262e505b0d3f3c3c3fa Mon Sep 17 00:00:00 2001 From: Serge Rider Date: Sun, 25 Dec 2016 16:15:17 +0300 Subject: [PATCH] VCC columns repacking fix --- .../ui/controls/ViewerColumnController.java | 51 +++++--- .../ui/controls/ViewerColumnRegistry.java | 1 + .../controls/itemlist/ObjectListControl.java | 109 +++++++++--------- 3 files changed, 94 insertions(+), 67 deletions(-) diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/ViewerColumnController.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/ViewerColumnController.java index 0a71e61c22..68b6227b38 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/ViewerColumnController.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/ViewerColumnController.java @@ -56,6 +56,9 @@ public class ViewerColumnController { private boolean clickOnHeader; private boolean isPacking; + private transient DisposeListener disposeListener; + private transient Listener menuListener; + public static ViewerColumnController getFromControl(Control control) { return (ViewerColumnController)control.getData(DATA_KEY); @@ -67,27 +70,43 @@ public class ViewerColumnController { this.viewer = viewer; final Control control = this.viewer.getControl(); control.setData(DATA_KEY, this); - control.addDisposeListener(new DisposeListener() { + disposeListener = new DisposeListener() { @Override public void widgetDisposed(DisposeEvent e) { saveColumnConfig(); } - }); + }; + control.addDisposeListener(disposeListener); if (control instanceof Tree || control instanceof Table) { - control.addListener(SWT.MenuDetect, new Listener() { + menuListener = new Listener() { @Override - public void handleEvent(Event event) - { + public void handleEvent(Event event) { Point pt = control.getDisplay().map(null, control, new Point(event.x, event.y)); - Rectangle clientArea = ((Composite)control).getClientArea(); + Rectangle clientArea = ((Composite) control).getClientArea(); if (control instanceof Tree) { clickOnHeader = clientArea.y <= pt.y && pt.y < (clientArea.y + ((Tree) control).getHeaderHeight()); } else { clickOnHeader = clientArea.y <= pt.y && pt.y < (clientArea.y + ((Table) control).getHeaderHeight()); } } - }); + }; + control.addListener(SWT.MenuDetect, menuListener); + } + } + + public void dispose() { + clearColumns(); + final Control control = this.viewer.getControl(); + if (!control.isDisposed()) { + if (disposeListener != null) { + control.removeDisposeListener(disposeListener); + disposeListener = null; + } + if (menuListener != null) { + control.removeListener(SWT.MenuDetect, menuListener); + menuListener = null; + } } } @@ -127,7 +146,7 @@ public class ViewerColumnController { columns.size())); } - public void clearColumns() { + private void clearColumns() { for (ColumnInfo columnInfo : columns) { if (columnInfo.column != null) { columnInfo.column.dispose(); @@ -137,7 +156,11 @@ public class ViewerColumnController { columns.clear(); } - public void createColumns() + public void createColumns() { + this.createColumns(true); + } + + public void createColumns(boolean pack) { try { readColumnsConfiguration(); @@ -145,10 +168,10 @@ public class ViewerColumnController { // Possibly incompatible format from previous version log.warn("Failed to load configuration for '" + this.configId + "'", e); } - recreateColumns(); + recreateColumns(pack); } - private void recreateColumns() + private void recreateColumns(boolean pack) { final Control control = viewer.getControl(); control.setRedraw(false); @@ -162,7 +185,7 @@ public class ViewerColumnController { } } createVisibleColumns(); - if (!isAllSized()) { + if (pack && !isAllSized()) { repackColumns(); control.addControlListener(new ControlAdapter() { @Override @@ -208,7 +231,7 @@ public class ViewerColumnController { if (((TreeViewer) viewer).getTree().getColumnCount() == 2) { ratios = new float[]{0.6f, 0.4f}; } - UIUtils.packColumns(((TreeViewer) viewer).getTree(), true, ratios); + UIUtils.packColumns(((TreeViewer) viewer).getTree(), false, ratios); } else if (viewer instanceof TableViewer) { UIUtils.packColumns(((TableViewer)viewer).getTable()); } @@ -498,7 +521,7 @@ public class ViewerColumnController { } } if (recreateColumns) { - recreateColumns(); + recreateColumns(true); } super.okPressed(); } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/ViewerColumnRegistry.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/ViewerColumnRegistry.java index f0711fdfeb..426dd7450e 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/ViewerColumnRegistry.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/ViewerColumnRegistry.java @@ -84,6 +84,7 @@ class ViewerColumnRegistry { } columnsConfig.put(controlId, newStates); + // TODO: Flush in separate job once per 5 seconds flushConfig(); } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/itemlist/ObjectListControl.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/itemlist/ObjectListControl.java index 37f0cc36db..07cea05a12 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/itemlist/ObjectListControl.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/itemlist/ObjectListControl.java @@ -399,69 +399,72 @@ public abstract class ObjectListControl extends ProgressPageControl } } } + + if (itemsControl.isDisposed()) { + return; + } if (reload) { - columnController.createColumns(); + columnController.createColumns(false); } + if (reload || objectList.isEmpty()) { + // Set viewer content + objectList = CommonUtils.isEmpty(items) ? new ArrayList() : new ArrayList<>(items); + + // Pack columns + sampleItems = true; + try { + List sampleList; + if (objectList.size() > 200) { + sampleList = objectList.subList(0, 100); + } else { + sampleList = objectList; + } + itemsViewer.setInput(sampleList); - if (!itemsControl.isDisposed()) { - if (reload || objectList.isEmpty()) { - // Set viewer content - objectList = CommonUtils.isEmpty(items) ? new ArrayList() : new ArrayList<>(items); - - // Pack columns - sampleItems = true; - try { - List sampleList; - if (objectList.size() > 200) { - sampleList = objectList.subList(0, 100); - } else { - sampleList = objectList; - } - itemsViewer.setInput(sampleList); - - if (renderer.isTree()) { - ((TreeViewer)itemsViewer).expandToLevel(4); - } + if (renderer.isTree()) { + ((TreeViewer)itemsViewer).expandToLevel(4); + } + if (reload) { columnController.repackColumns(); - } finally { - sampleItems = false; } - // Set real content - itemsViewer.setInput(objectList); - } else if (items != null) { - if (append) { - // Simply append new list to the tail - for (OBJECT_TYPE newObject : items) { - if (!objectList.contains(newObject)) { - objectList.add(newObject); - } + } finally { + sampleItems = false; + } + // Set real content + itemsViewer.setInput(objectList); + } else if (items != null) { + if (append) { + // Simply append new list to the tail + for (OBJECT_TYPE newObject : items) { + if (!objectList.contains(newObject)) { + objectList.add(newObject); } - } else { - // Update object list - if (!objectList.equals(items)) { - int newListSize = items.size(); - int itemIndex = 0; - for (OBJECT_TYPE newObject : items) { - if (itemIndex >= objectList.size()) { - // Add to tail - objectList.add(itemIndex, newObject); - } else { - OBJECT_TYPE oldObject = objectList.get(itemIndex); - if (!CommonUtils.equalObjects(oldObject, newObject)) { - // Replace old object - objectList.set(itemIndex, newObject); - } + } + } else { + // Update object list + if (!objectList.equals(items)) { + int newListSize = items.size(); + int itemIndex = 0; + for (OBJECT_TYPE newObject : items) { + if (itemIndex >= objectList.size()) { + // Add to tail + objectList.add(itemIndex, newObject); + } else { + OBJECT_TYPE oldObject = objectList.get(itemIndex); + if (!CommonUtils.equalObjects(oldObject, newObject)) { + // Replace old object + objectList.set(itemIndex, newObject); } - itemIndex++; - } - while (objectList.size() > newListSize) { - objectList.remove(objectList.size() - 1); } + itemIndex++; + } + while (objectList.size() > newListSize) { + objectList.remove(objectList.size() - 1); } } - - itemsViewer.refresh(); } + + itemsViewer.refresh(); } } finally { itemsControl.setRedraw(true); @@ -481,7 +484,7 @@ public abstract class ObjectListControl extends ProgressPageControl public void clearListData() { if (columnController != null) { - columnController.clearColumns(); + columnController.dispose(); columnController = null; } -- GitLab