All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.github.interacto.jfx.binding.NodeUpdateBinder Maven / Gradle / Ivy

The newest version!
/*
 * Interacto
 * Copyright (C) 2020 Arnaud Blouin
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see .
 */
package io.github.interacto.jfx.binding;

import io.github.interacto.command.Command;
import io.github.interacto.interaction.InteractionData;
import io.github.interacto.jfx.binding.api.BaseUpdateBinder;
import io.github.interacto.jfx.binding.api.CmdUpdateBinder;
import io.github.interacto.jfx.binding.api.InteractionCmdUpdateBinder;
import io.github.interacto.jfx.binding.api.InteractionUpdateBinder;
import io.github.interacto.jfx.binding.api.LogLevel;
import io.github.interacto.jfx.instrument.JfxInstrument;
import io.github.interacto.jfx.interaction.JfxInteraction;
import io.github.interacto.jfx.interaction.help.HelpAnimation;
import java.util.Collections;
import java.util.EnumSet;
import java.util.List;
import java.util.function.BiConsumer;
import java.util.function.BooleanSupplier;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.ObservableList;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.layout.Pane;

/**
 * The base binding builder for bindings where commands can be updated while the user interaction is running.
 * @param  The type of the command to produce.
 * @author Arnaud Blouin
 */
class NodeUpdateBinder, D extends InteractionData>
			extends Binder implements InteractionUpdateBinder, CmdUpdateBinder,
				InteractionCmdUpdateBinder, BaseUpdateBinder {
	private BiConsumer updateFct;
	private Consumer cancelFct;
	private Consumer endOrCancelFct;
	private boolean continuousCmdExecution;
	private boolean strictStart;
	private long throttleTimeout;

	NodeUpdateBinder(final JfxInstrument instrument, final BindingsObserver observer) {
		this(null, null, null, Collections.emptyList(), null, instrument, false, null,
			Collections.emptyList(), EnumSet.noneOf(LogLevel.class), null, false, null, null, null, null,
			null, null, false, false, 0L, null, null, null,
			observer, false);
	}

	NodeUpdateBinder(final BiConsumer initCmd, final Predicate checkConditions, final Function cmdProducer, final List widgets,
			final Supplier interactionSupplier, final JfxInstrument instrument, final boolean async, final BiConsumer onEnd,
			final List> additionalWidgets, final EnumSet logLevels, final HelpAnimation helpAnimation,
			final boolean withHelp, final DoubleProperty progressProp, final StringProperty msgProp, final Button cancel, final BiConsumer updateFct,
			final Consumer cancelFct, final Consumer endOrCancelFct, final boolean continuousCmdExecution, final boolean strictStart,
			final long throttleTimeout, final BiConsumer hadNoEffectFct, final BiConsumer hadEffectsFct,
			final BiConsumer cannotExecFct, final BindingsObserver observer, final boolean consumeEvents) {
		super(initCmd, checkConditions, cmdProducer, widgets, interactionSupplier, instrument, async, onEnd, additionalWidgets, logLevels, helpAnimation,
			withHelp, progressProp, msgProp, cancel, hadNoEffectFct, hadEffectsFct, cannotExecFct, observer, consumeEvents);
		this.updateFct = updateFct;
		this.cancelFct = cancelFct;
		this.endOrCancelFct = endOrCancelFct;
		this.continuousCmdExecution = continuousCmdExecution;
		this.strictStart = strictStart;
		this.throttleTimeout = throttleTimeout;
	}

	@Override
	public NodeUpdateBinder then(final BiConsumer update) {
		final NodeUpdateBinder dup = duplicate();
		dup.updateFct = update;
		return dup;
	}

	@Override
	public NodeUpdateBinder then(final Consumer update) {
		final NodeUpdateBinder dup = duplicate();
		dup.updateFct = (i, c) -> update.accept(c);
		return dup;
	}

	@Override
	public NodeUpdateBinder continuousExecution() {
		final NodeUpdateBinder dup = duplicate();
		dup.continuousCmdExecution = true;
		return dup;
	}

	@Override
	public NodeUpdateBinder cancel(final Consumer cancel) {
		final NodeUpdateBinder dup = duplicate();
		dup.cancelFct = cancel;
		return dup;
	}

	@Override
	public NodeUpdateBinder endOrCancel(final Consumer endOrCancel) {
		final NodeUpdateBinder dup = duplicate();
		dup.endOrCancelFct = endOrCancel;
		return dup;
	}


	@Override
	public NodeUpdateBinder strictStart() {
		final NodeUpdateBinder dup = duplicate();
		dup.strictStart = true;
		return dup;
	}

	@Override
	public NodeUpdateBinder throttle(final long timeout) {
		final NodeUpdateBinder dup = duplicate();
		dup.throttleTimeout = timeout;
		return dup;
	}

	@Override
	public NodeUpdateBinder on(final W... widgets) {
		return (NodeUpdateBinder) super.on(widgets);
	}

	@Override
	public NodeUpdateBinder on(final ObservableList widgets) {
		return (NodeUpdateBinder) super.on(widgets);
	}

	@Override
	public NodeUpdateBinder first(final Consumer initCmdFct) {
		return (NodeUpdateBinder) super.first(initCmdFct);
	}

	@Override
	public NodeUpdateBinder first(final BiConsumer initCmdFct) {
		return (NodeUpdateBinder) super.first(initCmdFct);
	}

	@Override
	public NodeUpdateBinder when(final Predicate checkCmd) {
		return (NodeUpdateBinder) super.when(checkCmd);
	}

	@Override
	public NodeUpdateBinder when(final BooleanSupplier checkCmd) {
		return (NodeUpdateBinder) super.when(checkCmd);
	}

	@Override
	public NodeUpdateBinder async(final Button cancel, final DoubleProperty progressProp, final StringProperty msgProp) {
		return (NodeUpdateBinder) super.async(cancel, progressProp, msgProp);
	}

	@Override
	public NodeUpdateBinder ifHadEffects(final BiConsumer hadEffectsFct) {
		return (NodeUpdateBinder) super.ifHadEffects(hadEffectsFct);
	}

	@Override
	public NodeUpdateBinder ifHadNoEffect(final BiConsumer noEffectFct) {
		return (NodeUpdateBinder) super.ifHadNoEffect(noEffectFct);
	}

	@Override
	public NodeUpdateBinder end(final Consumer onEnd) {
		return (NodeUpdateBinder) super.end(onEnd);
	}

	@Override
	public NodeUpdateBinder end(final Runnable endFct) {
		return (NodeUpdateBinder) super.end(endFct);
	}

	@Override
	public NodeUpdateBinder end(final BiConsumer onEndFct) {
		return (NodeUpdateBinder) super.end(onEndFct);
	}

	@Override
	public NodeUpdateBinder consume() {
		return (NodeUpdateBinder) super.consume();
	}

	@Override
	public NodeUpdateBinder log(final LogLevel... level) {
		return (NodeUpdateBinder) super.log(level);
	}

	@Override
	public NodeUpdateBinder help(final HelpAnimation animation) {
		return (NodeUpdateBinder) super.help(animation);
	}

	@Override
	public NodeUpdateBinder help(final Pane helpPane) {
		return (NodeUpdateBinder) super.help(helpPane);
	}

	@Override
	public , D2 extends InteractionData> NodeUpdateBinder usingInteraction(final Supplier interactionSupplier) {
		return (NodeUpdateBinder) super.usingInteraction(interactionSupplier);
	}

	@Override
	public  NodeUpdateBinder toProduce(final Supplier cmdSupplier) {
		return (NodeUpdateBinder) super.toProduce(cmdSupplier);
	}

	@Override
	public  NodeUpdateBinder toProduce(final Function cmdCreation) {
		return (NodeUpdateBinder) super.toProduce(cmdCreation);
	}

	@Override
	protected NodeUpdateBinder duplicate() {
		return new NodeUpdateBinder<>(initCmd, checkConditions, cmdProducer, widgets, interactionSupplier, instrument, async,
			onEnd, additionalWidgets, logLevels, helpAnimation, withHelp, progressProp, msgProp, cancel, updateFct, cancelFct,
			endOrCancelFct, continuousCmdExecution, strictStart, throttleTimeout, hadNoEffectFct, hadEffectsFct, cannotExecFct, observer, consumeEvents);
	}

	@Override
	public JfxWidgetBinding bind() {
		final List> adds = additionalWidgets == null ? null :
			additionalWidgets.stream().map(l -> (ObservableList) l).collect(Collectors.toList());

		final var binding = new JfxAnonNodeBinding<>(continuousCmdExecution, interactionSupplier.get(), initCmd, updateFct,
				checkConditions, onEnd, cmdProducer, cancelFct, endOrCancelFct,
				widgets.stream().map(elt -> (Node) elt).collect(Collectors.toList()), adds,
				async, strictStart, throttleTimeout, logLevels, withHelp, helpAnimation, hadNoEffectFct, hadEffectsFct, cannotExecFct, consumeEvents);
		binding.setProgressBarProp(progressProp);
		binding.setProgressMsgProp(msgProp);
		binding.setCancelCmdButton(cancel);
		if(instrument != null) {
			instrument.addBinding(binding);
		}
		if(observer != null) {
			observer.observeBinding(binding);
		}
		return binding;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy