Skip to content

Commit

Permalink
Merge pull request #6 from minifx/integrable-into-other-apps
Browse files Browse the repository at this point in the history
Integrable into other apps
  • Loading branch information
kaifox authored Jul 5, 2021
2 parents 386fec0 + 10161c6 commit 1b8f15c
Show file tree
Hide file tree
Showing 26 changed files with 392 additions and 150 deletions.
20 changes: 17 additions & 3 deletions src/main/java/org/minifx/fxcommons/MiniFxSceneBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@

import java.util.Collection;
import java.util.HashSet;
import java.util.List;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableList.Builder;

import javafx.scene.Parent;
import javafx.scene.Scene;
Expand Down Expand Up @@ -63,15 +67,25 @@ public Scene build() {
} else {
scene = new Scene(rootNode);
}
applyStylesTo(scene);
return scene;
}

public void applyStylesTo(Scene scene) {
scene.getStylesheets().addAll(cssLocations());
}

public List<String> cssLocations() {
Builder<String> builder = ImmutableList.builder();
if (useMinifxStyle) {
scene.getStylesheets().addAll(CSS_LOCATIONS);
builder.addAll(CSS_LOCATIONS);
}

if (additionalCss != null && !additionalCss.isEmpty()) {
scene.getStylesheets().addAll(additionalCss);
builder.addAll(additionalCss);
}

return scene;
return builder.build();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,16 @@

package org.minifx.fxcommons;

import static org.minifx.fxcommons.MiniFxSceneBuilder.miniFxSceneBuilder;

import java.util.Collection;

import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

import java.util.Collection;

import static org.minifx.fxcommons.MiniFxSceneBuilder.miniFxSceneBuilder;

public final class MiniFxUtilityDialogBuilder {

private final MiniFxSceneBuilder sceneBuilder = miniFxSceneBuilder();
Expand Down
39 changes: 39 additions & 0 deletions src/main/java/org/minifx/fxcommons/MiniFxWorkbench.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package org.minifx.fxcommons;

import java.util.List;

import org.minifx.workbench.components.MainPane;
import org.springframework.context.ApplicationContext;

import javafx.scene.Parent;
import javafx.scene.Scene;

public class MiniFxWorkbench {

private final MiniFxSceneBuilder sceneBuilder;
private final MainPane mainPane;
private final ApplicationContext springContext;

public MiniFxWorkbench(MiniFxSceneBuilder sceneBuilder, MainPane mainPane, ApplicationContext springContext) {
this.sceneBuilder = sceneBuilder;
this.mainPane = mainPane;
this.springContext = springContext;
}

public Parent mainPane() {
return mainPane;
}

public Scene createScene() {
return sceneBuilder.withRoot(mainPane).build();
}

public List<String> cssLocations() {
return sceneBuilder.cssLocations();
}

public ApplicationContext springContext() {
return springContext;
}

}
13 changes: 7 additions & 6 deletions src/main/java/org/minifx/fxcommons/service/AgingService.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
package org.minifx.fxcommons.service;

import javafx.concurrent.Service;
import javafx.concurrent.Task;
import org.apache.commons.lang3.time.DurationFormatUtils;

import java.time.Instant;

import static java.lang.String.format;
import static java.time.Duration.between;
import static java.time.Instant.now;

import java.time.Instant;

import org.apache.commons.lang3.time.DurationFormatUtils;

import javafx.concurrent.Service;
import javafx.concurrent.Task;

public final class AgingService extends Service<Void> {
private static final int DEFAULT_AGING_INTERVAL = 1000;
private Instant referenceTime;
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/org/minifx/fxcommons/util/ChangeListeners.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package org.minifx.fxcommons.util;

import javafx.beans.value.ChangeListener;

import java.util.function.Consumer;

import javafx.beans.value.ChangeListener;

public final class ChangeListeners {

public static <T> ChangeListener<T> onChange(Consumer<T> consumer) {
Expand Down
28 changes: 23 additions & 5 deletions src/main/java/org/minifx/workbench/MiniFx.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,12 @@
import java.util.Arrays;
import java.util.List;

import org.minifx.fxcommons.MiniFxWorkbench;
import org.minifx.fxcommons.SingleSceneSpringJavaFxApplication;
import org.minifx.fxcommons.SingleSceneSpringJavaFxApplication.FxLauncher;
import org.minifx.workbench.conf.MiniFxWorkbenchConfiguration;
import org.minifx.workbench.conf.MiniFxWorkbenchSceneConfiguration;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class MiniFx {

Expand All @@ -26,14 +29,29 @@ private MiniFx() {
* @return the launcher
*/
public static FxLauncher launcher(Class<?>... configurationClasses) {
return SingleSceneSpringJavaFxApplication.applicationLauncher()
.configurationClasses(ensureMiniFxConfigIsContainedAndLast(configurationClasses));
return SingleSceneSpringJavaFxApplication.applicationLauncher().configurationClasses(
ensureContainedAndLast(MiniFxWorkbenchSceneConfiguration.class, configurationClasses));
}

private static final Class<?>[] ensureMiniFxConfigIsContainedAndLast(Class<?>... configurationClasses) {
/**
* Loads the minifx workbench from the given configuration classes, ensuring that the minifx configurations, which
* do the magic are contained at the right place (last in the list).
* NOTE: this must be called from the fx-thread!
*
* @param configurationClasses the configuration classes to load
* @return a {@link MiniFxWorkbench} object, containing all the configured views etc, ready to be plugged into
* another application.
*/
public static MiniFxWorkbench loadFrom(Class<?>... configurationClasses) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(
ensureContainedAndLast(MiniFxWorkbenchConfiguration.class, configurationClasses));
return ctx.getBean(MiniFxWorkbench.class);
}

private static final Class<?>[] ensureContainedAndLast(Class<?> confToPutLast, Class<?>[] configurationClasses) {
List<Class<?>> classes = new ArrayList<>(Arrays.asList(configurationClasses));
classes.remove(MiniFxWorkbenchConfiguration.class);
classes.add(MiniFxWorkbenchConfiguration.class);
classes.remove(confToPutLast);
classes.add(confToPutLast);
return classes.toArray(new Class<?>[classes.size()]);
}
}
9 changes: 5 additions & 4 deletions src/main/java/org/minifx/workbench/annotations/Icon.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,16 @@

package org.minifx.workbench.annotations;

import javafx.scene.paint.Color;
import org.controlsfx.glyphfont.FontAwesome;
import org.minifx.workbench.domain.Perspective;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.controlsfx.glyphfont.FontAwesome;
import org.minifx.workbench.domain.Perspective;

import javafx.scene.paint.Color;

/**
* Annotation for specifying the Icon of a MiniFx view or {@link Perspective}. NOTE: the {@link #color()} String must
* conform to the rules of JavaFX {@link Color#valueOf(String)} method.
Expand Down
65 changes: 35 additions & 30 deletions src/main/java/org/minifx/workbench/components/MainPane.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,27 @@

package org.minifx.workbench.components;

import javafx.application.Platform;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.control.ToggleButton;
import javafx.scene.control.ToggleGroup;
import javafx.scene.control.ToolBar;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import static java.util.Collections.singletonList;
import static java.util.Comparator.comparing;
import static java.util.stream.Collectors.toList;
import static org.minifx.workbench.css.MiniFxCssConstants.PERSPECTIVE_BUTTON_CLASS;
import static org.minifx.workbench.css.MiniFxCssConstants.TOOLBAR_BUTTON_CLASS;
import static org.minifx.workbench.util.MiniFxComponents.containerPaneFrom;
import static org.minifx.workbench.util.MiniFxComponents.createPerspective;

import java.util.Collection;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

import org.minifx.workbench.css.MiniFxCssConstants;
import org.minifx.workbench.domain.definition.DisplayProperties;
import org.minifx.workbench.domain.definition.FooterDefinition;
import org.minifx.workbench.domain.definition.PerspectiveDefinition;
import org.minifx.workbench.nodes.FxNodeFactory;
import org.minifx.workbench.domain.definition.ToolbarItemDefinition;
import org.minifx.workbench.spring.AbstractPerspectiveEvent;
import org.minifx.workbench.spring.ActivatePerspectiveCommand;
import org.minifx.workbench.spring.ChangePerspectiveButtonStyleCommand;
Expand All @@ -26,20 +33,15 @@
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.event.EventListener;

import java.util.Collection;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

import static com.google.common.collect.ImmutableList.copyOf;
import static java.util.Collections.singletonList;
import static org.minifx.workbench.css.MiniFxCssConstants.PERSPECTIVE_BUTTON_CLASS;
import static org.minifx.workbench.css.MiniFxCssConstants.TOOLBAR_BUTTON_CLASS;
import static org.minifx.workbench.util.MiniFxComponents.containerPaneFrom;
import static org.minifx.workbench.util.MiniFxComponents.createPerspective;
import javafx.application.Platform;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.control.ToggleButton;
import javafx.scene.control.ToggleGroup;
import javafx.scene.control.ToolBar;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;

/**
* Main JavaFX Pane for a MiniFx application. It has a toolbar for perspective switching at the top. The active
Expand All @@ -56,14 +58,16 @@ public class MainPane extends BorderPane {
private HBox perspectiveButtonsBox;
private ToggleGroup perspectiveButtonToggleGroup = new ToggleGroup();

public MainPane(Iterable<Object> toolbarItems, ApplicationEventPublisher publisher, FxNodeFactory fxNodeFactory) {
this(toolbarItems, DEFAULT_FILLER, publisher, fxNodeFactory);
public MainPane(Collection<ToolbarItemDefinition> toolbarItems, ApplicationEventPublisher publisher) {
this(toolbarItems, DEFAULT_FILLER, publisher);
}

public MainPane(Iterable<Object> toolbarItems, Node filler, ApplicationEventPublisher publisher,
FxNodeFactory fxNodeFactory) {
public MainPane(Collection<ToolbarItemDefinition> toolbarItems, Node filler, ApplicationEventPublisher publisher) {
this.publisher = publisher;
List<Node> toolbarNodes = fxNodeFactory.fxNodesFrom(copyOf(toolbarItems));
List<Node> toolbarNodes = toolbarItems.stream()//
.sorted(comparing(ToolbarItemDefinition::order))//
.map(ToolbarItemDefinition::node)//
.collect(toList());

HBox toolbarBox = horizontalBoxOf(Pos.TOP_LEFT);
HBox centralBox = horizontalBoxOf(Pos.TOP_CENTER);
Expand All @@ -87,7 +91,8 @@ public void setFooters(Collection<FooterDefinition> footers) {
throw new IllegalStateException("Footer already initialized!");
}

Platform.runLater(() -> containerPaneFrom(footers).map(MiniFxComponents::configureSingleNodeStyle).ifPresent(this::setBottom));
Platform.runLater(() -> containerPaneFrom(footers).map(MiniFxComponents::configureSingleNodeStyle)
.ifPresent(this::setBottom));
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@

package org.minifx.workbench.conf;

import javafx.scene.Scene;
import static java.util.stream.Collectors.toList;
import static org.minifx.fxcommons.MiniFxSceneBuilder.miniFxSceneBuilder;

import java.util.List;

import org.minifx.fxcommons.MiniFxSceneBuilder;
import org.minifx.fxcommons.MiniFxWorkbench;
import org.minifx.workbench.components.MainPane;
import org.minifx.workbench.domain.definition.FooterDefinition;
import org.minifx.workbench.domain.definition.PerspectiveDefinition;
import org.minifx.workbench.nodes.FxNodeFactory;
import org.minifx.workbench.providers.PerspectiveProvider;
import org.minifx.workbench.spring.BeanInformationExtractor;
import org.minifx.workbench.spring.BeanInformationExtractorImpl;
import org.minifx.workbench.spring.BeanInformationRepository;
Expand All @@ -23,20 +25,10 @@
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.EventListener;

import java.util.Collection;
import java.util.List;
import java.util.stream.Stream;

import static java.util.stream.Collectors.toList;
import static java.util.stream.Stream.concat;
import static org.minifx.fxcommons.MiniFxSceneBuilder.miniFxSceneBuilder;

@Configuration
@Import({FactoryMethodsCollectorConfiguration.class, FxmlNodeServiceConfiguration.class,
NodeFactoryConfiguration.class, MiniFxWorkbenchInitialization.class})
@Import({ FactoryMethodsCollectorConfiguration.class, FxmlNodeServiceConfiguration.class,
NodeFactoryConfiguration.class, MiniFxWorkbenchInitialization.class })
public class MiniFxWorkbenchConfiguration {

private static final int DEFAULT_HEIGHT = 760;
Expand All @@ -52,36 +44,34 @@ public class MiniFxWorkbenchConfiguration {
private MiniFxSceneBuilder sceneBuilder;

@Bean
public Scene mainScene(MainPane mainPane) {
public MiniFxWorkbench miniFxContext(MainPane mainPane, ApplicationContext ctx) {
if (sceneBuilder == null) {
sceneBuilder = miniFxSceneBuilder().withSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
}

sceneBuilder.withRoot(mainPane);

if (cssStyleSheets != null) {
sceneBuilder.withAdditionalCss(cssStyleSheets.stream().flatMap(List::stream).collect(toList()));
}

return sceneBuilder.build();
return new MiniFxWorkbench(sceneBuilder, mainPane, ctx);
}

@Bean
public ElementsDefinitionConstructor elementsDefinitionConstructor(
public static ElementsDefinitionConstructor elementsDefinitionConstructor(
WorkbenchElementsRepository factoryMethodsRepository, BeanInformationExtractor beanInformationExtractor,
FxNodeFactory fxNodeFactory) {
return new ElementsDefinitionConstructor(factoryMethodsRepository, beanInformationExtractor, fxNodeFactory);
}

@Bean
public BeanInformationExtractor beanInformationExtractor(BeanInformationRepository factoryMethodsRepository) {
public static BeanInformationExtractor beanInformationExtractor(BeanInformationRepository factoryMethodsRepository) {
return new BeanInformationExtractorImpl(factoryMethodsRepository);
}

@Bean
public MainPane mainPane(ApplicationEventPublisher publisher, WorkbenchElementsRepository factoryMethodsRepository,
FxNodeFactory fxNodeFactory) {
MainPane mainPanel = new MainPane(factoryMethodsRepository.toolbarItems(), publisher, fxNodeFactory);
public static MainPane mainPane(ApplicationEventPublisher publisher,
ElementsDefinitionConstructor elementsDefinitionConstructor) {
MainPane mainPanel = new MainPane(elementsDefinitionConstructor.toolbarItems(), publisher);
mainPanel.setId(ID_MAIN_PANEL);
return mainPanel;
}
Expand Down
Loading

0 comments on commit 1b8f15c

Please sign in to comment.