Skip to content

Commit

Permalink
Added possibility to inject the primary Stage. Set owner stage for "A…
Browse files Browse the repository at this point in the history
…ddContactPopup"
  • Loading branch information
manuel-mauky committed Aug 29, 2014
1 parent 68b9f83 commit b9b63c3
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 22 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
package de.saxsys.mvvmfx.contacts;

import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.stage.Stage;

import javax.enterprise.event.Observes;
import javax.inject.Inject;

import de.saxsys.mvvmfx.FluentViewLoader;
import de.saxsys.mvvmfx.ViewTuple;
import de.saxsys.mvvmfx.cdi.MvvmfxCdiApplication;
Expand All @@ -9,24 +16,17 @@
import de.saxsys.mvvmfx.contacts.model.Repository;
import de.saxsys.mvvmfx.contacts.ui.main.MainView;
import de.saxsys.mvvmfx.contacts.ui.main.MainViewModel;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.stage.Stage;

import javax.enterprise.event.Observes;
import javax.inject.Inject;

public class App extends MvvmfxCdiApplication{



public static void main(String...args){
launch(args);
}


@Inject
private Repository repository;

@Override
public void init() throws Exception {
super.init();
Expand All @@ -43,7 +43,8 @@ public void init() throws Exception {

@Override
public void start(Stage stage) throws Exception {

makePrimaryStageInjectable(stage);

ViewTuple<MainView, MainViewModel> main = FluentViewLoader.fxmlView(MainView.class).load();

stage.setScene(new Scene(main.getView()));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
package de.saxsys.mvvmfx.contacts.ui.addcontact;

import de.saxsys.mvvmfx.FluentViewLoader;
import de.saxsys.mvvmfx.FxmlView;
import de.saxsys.mvvmfx.contacts.events.OpenAddContactPopupEvent;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

import javax.enterprise.event.Observes;
import javax.inject.Inject;
import javax.inject.Singleton;

import de.saxsys.mvvmfx.FluentViewLoader;
import de.saxsys.mvvmfx.FxmlView;
import de.saxsys.mvvmfx.contacts.events.OpenAddContactPopupEvent;

@Singleton
public class AddContactPopup extends VBox implements FxmlView<AddContactPopupViewModel>{

Expand All @@ -22,9 +22,10 @@ public AddContactPopup(){
}


public void open(@Observes OpenAddContactPopupEvent event){
public void open(@Observes OpenAddContactPopupEvent event, Stage primaryStage){

if(popupStage.getScene() == null){ // When the popup is shown the first time
popupStage.initOwner(primaryStage);
popupStage.setScene(new Scene(this));
}else{
popupStage.toFront();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,23 +15,20 @@
******************************************************************************/
package de.saxsys.mvvmfx.cdi;

import de.saxsys.mvvmfx.MvvmFX;
import de.saxsys.mvvmfx.cdi.internal.CdiInjector;
import de.saxsys.mvvmfx.cdi.internal.MvvmfxProducer;
import javafx.application.Application;
import javafx.application.HostServices;
import javafx.stage.Stage;

import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.event.Observes;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.AnnotatedType;
import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.inject.spi.InjectionTarget;
import javax.inject.Inject;

import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;

import de.saxsys.mvvmfx.MvvmFX;
import de.saxsys.mvvmfx.cdi.internal.MvvmfxProducer;


/**
* This class has to be extended by the user to build a javafx application powered by CDI.
Expand All @@ -45,6 +42,9 @@ public abstract class MvvmfxCdiApplication extends Application {
private CreationalContext<MvvmfxCdiApplication> ctx;
private InjectionTarget<MvvmfxCdiApplication> injectionTarget;
private final Weld weld;

@Inject
private MvvmfxProducer producer;

public MvvmfxCdiApplication(){
weld = new Weld();
Expand All @@ -58,6 +58,10 @@ public MvvmfxCdiApplication(){
beanManager = weldContainer.getBeanManager();

}

protected void makePrimaryStageInjectable(Stage primaryStage){
producer.setPrimaryStage(primaryStage);
}

/**
* This method is called when the javafx application is initialized. See {@link javafx.application.Application#init()}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import de.saxsys.jfx.mvvm.viewloader.ViewLoader;
import javafx.application.Application;
import javafx.application.HostServices;
import javafx.stage.Stage;


/**
Expand All @@ -39,6 +40,8 @@ public class MvvmfxProducer {


private HostServices hostServices;

private Stage primaryStage;

@Produces
public NotificationCenter produceNotificationCenter() {
Expand All @@ -65,4 +68,17 @@ public void setHostServices(HostServices hostServices){
public HostServices produceHostServices(){
return hostServices;
}

public void setPrimaryStage(Stage primaryStage){
this.primaryStage = primaryStage;
}

@Produces
public Stage producePrimaryStage(){
if(primaryStage == null){
throw new IllegalStateException("The primary Stage is not available for injection. " +
"In your application class please call 'makePrimaryStageInjectable' method from within the 'start' method");
}
return primaryStage;
}
}

0 comments on commit b9b63c3

Please sign in to comment.