JavaFX Integration #4
Labels
No Label
1
13
2
21
3
34
5
55
8
bug
could have
documentation
duplicate
enhancement
help wanted
must have
question
should have
stale
wont have
L
M
S
XL
bug
bugfix
discussion
documentation
feature
maintenance
postponed
refactoring
wontfix
No Milestone
No Assignees
3 Participants
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: zdm/undo-redo#4
Loading…
Reference in New Issue
Block a user
No description provided.
Delete Branch "f/javafx"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #3
Looks good
@ -24,1 +24,4 @@
@Override
public Optional<C> getLastChange() {
return index == -1 ? Optional.empty() : Optional.of(changes.get(index));
index < 0
@ -44,0 +53,4 @@
* @since 0.0.1
*/
@Test
@Order(3)
I see you noticed the problem when adding a new test that has to be executed earlier:
You have to increment all subsequent priorities.
For this reason I propose another mechanism for using
@Order
: Instead of@Order(n)
, we should use@Order(10^n)
for the tests that are created when creating the class.Adding newer tests is then as simple as using
@Order(10^n / i)
wherei
is the amount of other elements with that order.That way, when we have the basic tests, we don't have to subsequently change all indices below them when adding newer tests.
Take the following example:
@Order(1)
,@Order(2)
,@Order(3)
,@Order(4)
,@Order(5)
are the tests we created initially.Now, we add
@Order(2b)
,@Order(3a)
,@Order(3c)
and@Order(6)
. With our mechanism, that is pretty inefficient.With my method, we would have initially
@Order(10)
,@Order(100)
,@Order(1 000)
,@Order(10 000)
,@Order(100 000)
.Now, we simply add
@Order(150)
,@Order(500)
,@Order(1 500)
and@Order(1 000 000)
.And then we're done.
How would you deal with a class that has more than nine tests?
Bring out my "division by 2" skills again.
Also, you first need to have 9 tests that depend on order.
In most cases, tests should not depend on a specific order.
I would prefer having gaps of 10, or maybe 100, but with exponential gaps, the rule is unnecessarily complex and we can easily surpass
Integer.MAX_VALUE / 2
, which is the default order for JUnit tests, leading to unexpected results for tests without an explicitly defined order.That's another possibility.
I don't care.
Should we use the notation
@Order(10n)
then?@ -0,0 +21,4 @@
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-base</artifactId>
<version>11</version>
Shouldn't it be
provided
?Otherwise we run into version problems...
A project using this library should be able to use any JavaFX version >= 11. A fixed version would be defined like this:
[11]
.<scope>provided</scope>
assumes that the dependency is present in some kind of runtime container, like the JDK or a Java EE container, which isn't the case here.I thought that was exactly the goal behind
provided
: To declare that any version of JavaFX is possible, as long as it is present...I don't think the scope has anything to do with the version: https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope
There is a possibility to specify version ranger, but the default should be sufficient for us: https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVEN402
@ -0,0 +8,4 @@
/**
* Wraps an ordinary change manager into an observable change manager, providing the required
* properties for concrete implementations.
@ -0,0 +18,4 @@
public class ChangeManagerWrapper<C extends Change, M extends ChangeManager<C>>
implements ObservableChangeManager<C> {
protected ReadOnlyObjectWrapper<C> lastChange =
I have to say, I like that you were even able to implement it without having to use listeners.
Maybe we should add a paragraph in the Javadoc of
ChangeManager
that that is the preferred way to listen to changes.I also like that our implementation seems to be
UndoFX
which creates an object storing the current position whenever you undo or redo something...)UndoFX might be more flexible in some cases (e.g. non-linear history and such), but for our and most other purposes this solution should be more than enough.
@ -0,0 +19,4 @@
implements ObservableChangeManager<C> {
protected ReadOnlyObjectWrapper<C> lastChange =
new ReadOnlyObjectWrapper<>(this, "lastChange");
Perhaps we should extract these names into
public static final
constants to avoid confusion.You mean the string literal? So for every property that is declared we would declare another constant?
Yes.
But what purpose should this have? When would it be used?
Bindings.bind(someProperty, ChangeManagerWrapper.UndoAvailable)
or however it is called.@ -0,0 +29,4 @@
protected final M manager;
protected ChangeManagerWrapper(M manager) {
Wait, protected?
How do you instantiate one then? Do you really have to create your own class? Isn't that a bit overkill?
I think the wrapper can be concrete, but should be open for extension in case we want a wrapper for a change manager with additional methods.
@ -0,0 +54,4 @@
updateProperties();
return true;
}
return false;
Wait, what was the result of the last discussion we had about that?
I can't remember, and I don't remember either which PR in which project it was where we talked about that.
We discussed this in #2. I think @DieGurke resolved the suggestion as we didn't reach a conclusion after stating our opinions.
@ -0,0 +7,4 @@
import dev.kske.undoredo.core.*;
/**
* @param <C> the change type to store in this change manager
Purpose of this interface?
@ -0,0 +8,4 @@
exports dev.kske.undoredo.javafx;
requires dev.kske.undoredo.core;
requires transitive
?The core module doesn't have any dependencies, so this shouldn't make a difference.
I think
transitive
is meant for the other way around:Not that we require all dependencies from that module,
but that modules requiring our module also automatically require the
core
module.