import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.resource.ColorDescriptor;
import org.simantics.browsing.ui.SelectionDataResolver;
import org.simantics.browsing.ui.SelectionFilter;
import org.simantics.browsing.ui.StatePersistor;
+import org.simantics.browsing.ui.common.AdaptableHintContext;
import org.simantics.browsing.ui.common.ColumnKeys;
import org.simantics.browsing.ui.common.ErrorLogger;
import org.simantics.browsing.ui.common.NodeContextBuilder;
import org.simantics.browsing.ui.common.processors.IsExpandedProcessor;
import org.simantics.browsing.ui.common.processors.NoSelectionRequestProcessor;
import org.simantics.browsing.ui.common.processors.ProcessorLifecycle;
+import org.simantics.browsing.ui.common.state.ExplorerStates;
import org.simantics.browsing.ui.content.Labeler;
import org.simantics.browsing.ui.content.Labeler.CustomModifier;
import org.simantics.browsing.ui.content.Labeler.DialogModifier;
import org.simantics.browsing.ui.content.Labeler.Modifier;
import org.simantics.browsing.ui.nattable.override.DefaultTreeLayerConfiguration2;
import org.simantics.browsing.ui.swt.Activator;
-import org.simantics.browsing.ui.swt.AdaptableHintContext;
import org.simantics.browsing.ui.swt.DefaultImageDecoratorsProcessor;
import org.simantics.browsing.ui.swt.DefaultIsExpandedProcessor;
import org.simantics.browsing.ui.swt.DefaultLabelDecoratorsProcessor;
import org.simantics.utils.threads.ThreadUtils;
import org.simantics.utils.ui.AdaptionUtils;
import org.simantics.utils.ui.ISelectionUtils;
+import org.simantics.utils.ui.SWTUtils;
import org.simantics.utils.ui.jface.BasePostSelectionProvider;
import gnu.trove.map.hash.THashMap;
private void initializeState() {
if (persistor == null)
return;
+ ExplorerStates.scheduleRead(getRoot(), persistor)
+ .thenAccept(state -> SWTUtils.asyncExec(natTable, () -> restoreState(state)));
+ }
- ExplorerState state = persistor.deserialize(
- Platform.getStateLocation(Activator.getDefault().getBundle()).toFile(),
- getRoot());
-
-
+ private void restoreState(ExplorerState state) {
Object processor = getPrimitiveProcessor(BuiltinKeys.IS_EXPANDED);
if (processor instanceof DefaultIsExpandedProcessor) {
DefaultIsExpandedProcessor isExpandedProcessor = (DefaultIsExpandedProcessor)processor;
for(NodeContext expanded : state.expandedNodes) {
- isExpandedProcessor.setExpanded(expanded, true);
+ isExpandedProcessor.replaceExpanded(expanded, true);
}
}
}
// we have to remove all references here to reduce memory consumption.
//
// Proper fix would be to remove references between QueryCache and GENodeQueryManagers.
+
+ // Clearing explorerContext replaces GECache with dummy implementation, which makes node disposal much faster.
+ explorerContext.close();
if (rootNode != null) {
- rootNode.dispose();
+ // Using fastDispose bypasses item removal from nodeMap, which is cleared later.
+ rootNode.fastDispose();
rootNode = null;
}
- explorerContext.dispose();
+ explorerContext.dispose();
explorerContext = null;
processors.clear();
detachPrimitiveProcessors();
}
resourceManager.dispose();
resourceManager = null;
-
- contextToNodeMap.clear(); // should be empty at this point.
+ contextToNodeMap.clear();
contextToNodeMap = null;
if (postSelectionProvider != null) {
postSelectionProvider.dispose();
// } else {
// viewer.refresh(element,true);
// }
+ element.initData();
natTable.redraw();
}
final ExecutorService queryUpdateScheduler = Threads.getExecutor();
- private double getDisplayScale() {
+ public static double getDisplayScale() {
Point dpi = Display.getCurrent().getDPI();
return (double)dpi.x/96.0;
}
if (modifier == null)
return false;
- String err = modifier.isValid(newValue.toString());
+ String err = modifier.isValid(newValue != null ? newValue.toString() : "");
if (err == null)
return true;
- modifier.isValid(newValue.toString());
throw new ValidationFailedException(err);
}
}
}
};
+ public void close() {
+ cache.dispose();
+ cache = new DummyCache();
+ scheduleList.clear();
+ autoExpanded.clear();
+ }
+
@Override
public void dispose() {
cache.dispose();
final HashMap<GECacheKey, IGECacheEntry> entries = new HashMap<GECacheKey, IGECacheEntry>();
final HashMap<GECacheKey, Set<UIElementReference>> treeReferences = new HashMap<GECacheKey, Set<UIElementReference>>();
final HashMap<NodeContext, Set<GECacheKey>> keyRefs = new HashMap<NodeContext, Set<GECacheKey>>();
+ private TObjectIntHashMap<NodeContext> references = new TObjectIntHashMap<NodeContext>();
/**
* This single instance is used for all get operations from the cache. This
return references.get(context) > 0;
}
- private TObjectIntHashMap<NodeContext> references = new TObjectIntHashMap<NodeContext>();
+
@Override
public void incRef(NodeContext context) {