--- /dev/null
+package org.simantics.ui.workspace.tracker.internal.contributions;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.e4.core.contexts.IEclipseContext;
+import org.eclipse.e4.ui.model.application.MApplication;
+import org.eclipse.e4.ui.model.application.ui.MUIElement;
+import org.eclipse.e4.ui.model.application.ui.menu.MToolControl;
+import org.eclipse.e4.ui.workbench.modeling.EModelService;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.PlatformUI;
+import org.simantics.filesystem.services.sizetracker.DirectorySizeService;
+import org.simantics.filesystem.services.sizetracker.SizeTracker;
+import org.simantics.ui.workspace.tracker.internal.Activator;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author Tuukka Lehtonen
+ * @since 1.31.0
+ */
+public class WorkspaceSizeTrackerContribution {
+
+ private Logger logger = LoggerFactory.getLogger(WorkspaceSizeTrackerContribution.class);
+
+ private SizeTracker workspaceSizeTracker;
+
+ @PostConstruct
+ void createControls(Composite parent, MToolControl toolControl) {
+ String trackSize = System.getProperty("org.simantics.filesystem.services.sizeTracker", null);
+ if (trackSize != null && trackSize.equalsIgnoreCase("false"))
+ return;
+ Path ws = getWorkspacePath();
+ if (ws != null && !Files.isDirectory(ws))
+ return;
+ DirectorySizeService dss = Activator.getDefault().getDirectorySizeService();
+ if (dss == null)
+ return;
+
+ try {
+ workspaceSizeTracker = dss.track(ws);
+ new WorkspaceSizeTrackerTrim(parent, toolControl, workspaceSizeTracker, Activator.getDefault().getPreferenceStore());
+ } catch (IOException e) {
+ logger.error("Failed to start workspace size tracking for {}", ws, e);
+ }
+ }
+
+ @PreDestroy
+ void dispose() {
+ try (SizeTracker t = workspaceSizeTracker) {
+ } catch (IOException e) {
+ logger.error("Failed to shutdown workspace size tracking for {}", workspaceSizeTracker, e);
+ } finally {
+ workspaceSizeTracker = null;
+ }
+ }
+
+ private static Path getWorkspacePath() {
+ IPath ip = Platform.getLocation();
+ return ip != null ? ip.toFile().toPath() : null;
+ }
+
+ public static void showTracker(boolean show) {
+ IEclipseContext context = PlatformUI.getWorkbench().getService(IEclipseContext.class);
+ if (context == null)
+ return;
+
+ EModelService modelService = context.get(EModelService.class);
+ MApplication app = context.get(MApplication.class);
+ if (modelService == null || app == null)
+ return;
+
+ MUIElement element = modelService.find("org.simantics.ui.workspace.tracker.toolcontrol.0", app);
+ if (element != null && element.isToBeRendered() != show) {
+ element.setToBeRendered(show);
+ Object widget = element.getWidget();
+ if (widget instanceof Control) {
+ ((Control) widget).getShell().layout(null, SWT.ALL | SWT.CHANGED | SWT.DEFER);
+ }
+ }
+ }
+
+}
\ No newline at end of file