package net.jeeeyul.eclipse.themes.rendering.internal; import net.jeeeyul.eclipse.themes.css.internal.CSSClasses; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.e4.ui.css.swt.theme.IThemeEngine; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.ui.progress.UIJob; /** * Tracks CTabFolder to add "empty" class when it has no items. * * @author Jeeeyul * @since 2.0.0 */ @SuppressWarnings({ "restriction", "javadoc" }) public class EmptyClassHook { private CTabFolder folder; private boolean isDisposed = false; private Listener selectionHook = new Listener() { @Override public void handleEvent(Event event) { getComputeJob().schedule(); } }; private UIJob computeJob; public EmptyClassHook(CTabFolder folder) { this.folder = folder; folder.addListener(SWT.Paint, selectionHook); getComputeJob().schedule(); } private void computeEmptyClass() { if (folder == null || folder.isDisposed()) { return; } IThemeEngine engine = getThemeEngine(); if (engine == null) { return; } CSSClasses styleClasses = CSSClasses.getStyleClasses(folder); boolean isEmpty = folder.getItemCount() == 0; if (isEmpty) { if (!styleClasses.contains("empty")) { styleClasses.add("empty"); CSSClasses.setStyleClasses(folder, styleClasses); engine.applyStyles(folder, true); } } else { if (styleClasses.contains("empty")) { styleClasses.remove("empty"); CSSClasses.setStyleClasses(folder, styleClasses); engine.applyStyles(folder, true); } } } public void dispose() { if (isDisposed) { return; } if (folder != null && !folder.isDisposed()) { folder.removeListener(SWT.Paint, selectionHook); } isDisposed = true; } private UIJob getComputeJob() { if (computeJob == null) { computeJob = new UIJob(Display.getDefault(), "Update Empty Class") { public IStatus runInUIThread(IProgressMonitor monitor) { if (!isDisposed) { computeEmptyClass(); } return Status.OK_STATUS; }; }; computeJob.setUser(false); computeJob.setSystem(true); } return computeJob; } private IThemeEngine getThemeEngine() { return (IThemeEngine) folder.getDisplay().getData("org.eclipse.e4.ui.css.swt.theme"); } }