/** * Copyright (c) 2014 - 2017 Frank Appel * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Frank Appel - initial API and implementation */ package com.codeaffine.eclipse.swt.widget.scrollable; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Scrollable; import com.codeaffine.eclipse.swt.widget.scrollable.context.ScrollableControl; class StructureScrollableRedrawInsurance { private final ScrollableControl<?> scrollable; private int actualRedrawRequestCount; private int previousRedrawRequestCount; StructureScrollableRedrawInsurance( ScrollableControl<?> scrollable ) { this.scrollable = scrollable; if( mustRedrawOnVerticalScrolling( scrollable ) ) { captureVerticalScrolling( scrollable.getControl() ); } } private static boolean mustRedrawOnVerticalScrolling( ScrollableControl<?> scrollable ) { return scrollable.isOwnerDrawn() && scrollable.hasStyle( SWT.VIRTUAL ) && scrollable.isStructuredScrollableType() && scrollable.hasStyle( SWT.V_SCROLL ); } private void captureVerticalScrolling( Scrollable scrollable ) { scrollable.getVerticalBar().addListener( SWT.Selection, evt -> mark() ); } private void mark() { actualRedrawRequestCount++; } public void run() { if( actualRedrawRequestCount > 0 ) { if( previousRedrawRequestCount == actualRedrawRequestCount ) { scrollable.getControl().redraw(); actualRedrawRequestCount = 0; previousRedrawRequestCount = 0; } else { previousRedrawRequestCount = actualRedrawRequestCount; } } } }