/** * 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.ui.swt.theme; import static com.codeaffine.util.ArgumentVerification.verifyNotNull; import static com.codeaffine.eclipse.ui.swt.theme.AttributeKey.key; import static com.codeaffine.eclipse.ui.swt.theme.ScrollableAdapterContribution.TOP_LEVEL_WINDOW_SELECTOR; import static java.lang.Boolean.valueOf; import java.util.function.Consumer; import java.util.function.Supplier; import org.eclipse.swt.widgets.Scrollable; class AttributeApplicationOperation { private final AttributePreserver styleAttributePreserver; private final Supplier<Boolean> topLevelWindowChecker; private final AttributeKey<?> key; private Consumer<AttributePreserver> topLevelApplicator; private Consumer<AttributePreserver> defaultApplicator; AttributeApplicationOperation( Scrollable scrollable, AttributeKey<?> key ) { this.styleAttributePreserver = new AttributePreserver( scrollable ); this.topLevelWindowChecker = () -> valueOf( scrollable.getShell().getParent() == null ); this.topLevelApplicator = preserver -> {}; this.defaultApplicator = preserver -> {}; this.key = key; } AttributeApplicationOperation onTopLevelWindow( Consumer<AttributePreserver> topLevelApplicator ) { verifyNotNull( topLevelApplicator, "topLevelApplicator" ); this.topLevelApplicator = topLevelApplicator; return this; } AttributeApplicationOperation onDefault( Consumer<AttributePreserver> defaultApplicator ) { verifyNotNull( defaultApplicator, "defaultApplicator" ); this.defaultApplicator = defaultApplicator; return this; } void execute() { if( isTopLevelSelector() ) { applyTopLevelSelector(); } else { applyDefault(); } } AttributePreserver getStyleAttributePreserver() { return styleAttributePreserver; } private void applyTopLevelSelector() { if( isTopLevelWindow() ) { defaultApplicator.accept( styleAttributePreserver ); topLevelApplicator.accept( styleAttributePreserver ); } } private void applyDefault() { if( !hasTopLevelValue( key( key.identifier + TOP_LEVEL_WINDOW_SELECTOR, key.type ) ) ) { defaultApplicator.accept( styleAttributePreserver ); } } private boolean hasTopLevelValue( AttributeKey<?> key ) { return styleAttributePreserver.get( key ).isPresent(); } private boolean isTopLevelSelector() { return key.identifier.endsWith( TOP_LEVEL_WINDOW_SELECTOR ); } private boolean isTopLevelWindow() { return topLevelWindowChecker.get().booleanValue(); } }