io.github.interacto.jfx.binding.NodeUpdateBinder Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of interacto-javafx Show documentation
Show all versions of interacto-javafx Show documentation
The JavaFX implementation of the Interacto library
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;
}
}