]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.browsing.ui.swt/src/org/simantics/browsing/ui/swt/widgets/GraphExplorerComposite.java
UI locking fixes for GraphExplorer implementations
[simantics/platform.git] / bundles / org.simantics.browsing.ui.swt / src / org / simantics / browsing / ui / swt / widgets / GraphExplorerComposite.java
index 42ee2bdf812fe788e20b040139ac9ae9df4fdce6..2f52153a1192b45e2a6c33e42afd2da58a86e1a1 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2012 Association for Decentralized Information Management
+ * Copyright (c) 2007, 2018 Association for Decentralized Information Management
  * in Industry THTH ry.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -17,10 +17,8 @@ import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 import java.util.function.BiFunction;
-import java.util.function.Consumer;
 
 import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.Platform;
 import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.jface.layout.GridDataFactory;
 import org.eclipse.jface.layout.GridLayoutFactory;
@@ -45,7 +43,6 @@ import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Event;
 import org.eclipse.swt.widgets.Listener;
 import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeColumn;
 import org.eclipse.swt.widgets.TreeItem;
 import org.eclipse.ui.ISelectionListener;
 import org.eclipse.ui.IWorkbenchSite;
@@ -72,6 +69,7 @@ import org.simantics.browsing.ui.common.processors.LabelerFactoryResolver;
 import org.simantics.browsing.ui.common.processors.UserSelectedComparableFactoryQueryProcessor;
 import org.simantics.browsing.ui.common.processors.UserSelectedViewpointFactoryQueryProcessor;
 import org.simantics.browsing.ui.common.processors.ViewpointFactoryResolver;
+import org.simantics.browsing.ui.common.state.ExplorerStates;
 import org.simantics.browsing.ui.common.views.FilterAreaSource;
 import org.simantics.browsing.ui.common.views.IFilterArea;
 import org.simantics.browsing.ui.common.views.IFilterAreaProvider;
@@ -83,7 +81,6 @@ import org.simantics.browsing.ui.graph.impl.RelatedObjectsQueryProcessor;
 import org.simantics.browsing.ui.graph.impl.SessionContextInputSource;
 import org.simantics.browsing.ui.model.browsecontexts.BrowseContext;
 import org.simantics.browsing.ui.model.nodetypes.NodeType;
-import org.simantics.browsing.ui.swt.Activator;
 import org.simantics.browsing.ui.swt.ComparatorSelector;
 import org.simantics.browsing.ui.swt.ContextMenuInitializer;
 import org.simantics.browsing.ui.swt.DefaultExplorerSelectionListener;
@@ -135,6 +132,7 @@ import org.simantics.utils.datastructures.hints.IHintContext.Key;
 import org.simantics.utils.datastructures.hints.IHintListener;
 import org.simantics.utils.datastructures.hints.IHintObservable;
 import org.simantics.utils.datastructures.hints.IHintTracker;
+import org.simantics.utils.ui.SWTUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -1194,52 +1192,48 @@ public class GraphExplorerComposite extends Composite implements Widget, IAdapta
     }
 
     private int getColumnWidth(Column column, ExplorerState state) {
-       // Get saved width from the persistor if there is one.
+        // Get saved width from the persistor if there is one.
         if (state != null && state.columnWidths != null) {
-               Integer width = state.columnWidths.get(column.getLabel());
-               if (width != null)
-                       return width;
+            Integer width = state.columnWidths.get(column.getLabel());
+            if (width != null)
+                return width;
         }
         return column.getWidth();
     }
-    
-    public void setColumns(Column[] columns) {
-
-        explorer.setColumns(columns, new Consumer<Map<Column, Object>>() {
-
-            @Override
-            public void accept(Map<Column, Object> objects) {
-               ExplorerState state = null;
-               if (persistor != null) {
-                       state = persistor.deserialize(
-                               Platform.getStateLocation(Activator.getDefault().getBundle()).toFile(),
-                               explorer.getRoot());
-               }
-
-                for(Map.Entry<Column, Object> entry : objects.entrySet()) {
-                    Column column = entry.getKey();
-                    TreeColumn treeColumn = (TreeColumn)entry.getValue();
-
-                    if (column.getWidth() < 0) {
-                        throw new IllegalArgumentException("Column minimum width cannot be < 0, got " + column.getWidth());
-                    }
-
-                    int width = getColumnWidth(column, state);
-                    if(column.hasGrab()) {
-                       
-                        ad.setColumnData(treeColumn, new ColumnWeightData(column.getWeight(), width));
-
-                    } else {
-
-                        ad.setColumnData(treeColumn, new ColumnWeightData(0, width));
 
-                    }
-
-                }
-            }
+    protected void restoreColumnSizes(Map<Column, Object> columns) {
+        if (persistor != null) {
+            setColumnData(columns, null);
+            ExplorerStates.scheduleRead(explorer.getRoot(), persistor).thenAccept(state -> {
+                SWTUtils.asyncExec(GraphExplorerComposite.this, () -> {
+                    if (explorerComposite.isDisposed())
+                        setColumnData(columns, state);
+                });
+            });
+        } else {
+            setColumnData(columns, null);
+        }
+    }
 
+    protected void setColumnData(Map<Column, Object> columns, ExplorerState state) {
+        columns.forEach((column, widget) -> {
+            org.eclipse.swt.widgets.Widget columnWidget = (org.eclipse.swt.widgets.Widget) widget;
+            ad.setColumnData(columnWidget,
+                    new ColumnWeightData(
+                            column.hasGrab() ? column.getWeight() : 0,
+                            getColumnWidth(column, state)));
         });
+    }
 
+    public void setColumns(Column[] columns) {
+        // ColumnWeightData does not support column weight/width < 0
+        for (Column column : columns) {
+            if (column.getWeight() < 0)
+                throw new IllegalArgumentException("Column weight must be >= 0, got " + column.getWeight() + " for " + column);
+            if (column.getWidth() < 0)
+                throw new IllegalArgumentException("Column minimum width must be >= 0, got " + column.getWidth() + " for " + column);
+        }
+        explorer.setColumns(columns, this::restoreColumnSizes);
     }
 
     @Override