DefaultJavaFXWindowManager.java
001 /*
002  * Copyright 2008-2015 the original author or authors.
003  *
004  * Licensed under the Apache License, Version 2.0 (the "License");
005  * you may not use this file except in compliance with the License.
006  * You may obtain a copy of the License at
007  *
008  *     http://www.apache.org/licenses/LICENSE-2.0
009  *
010  * Unless required by applicable law or agreed to in writing, software
011  * distributed under the License is distributed on an "AS IS" BASIS,
012  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013  * See the License for the specific language governing permissions and
014  * limitations under the License.
015  */
016 package org.codehaus.griffon.runtime.javafx;
017 
018 import griffon.core.ApplicationEvent;
019 import griffon.core.GriffonApplication;
020 import griffon.core.env.ApplicationPhase;
021 import griffon.javafx.JavaFXWindowDisplayHandler;
022 import griffon.javafx.JavaFXWindowManager;
023 import javafx.event.EventHandler;
024 import javafx.stage.Window;
025 import javafx.stage.WindowEvent;
026 import org.codehaus.griffon.runtime.core.view.AbstractWindowManager;
027 
028 import javax.annotation.Nonnull;
029 import javax.inject.Inject;
030 import javax.inject.Named;
031 
032 import static java.util.Arrays.asList;
033 import static java.util.Objects.requireNonNull;
034 
035 /**
036  @author Andres Almiray
037  @since 2.0.0
038  */
039 public class DefaultJavaFXWindowManager extends AbstractWindowManager<Window> implements JavaFXWindowManager {
040     private final OnWindowHidingHelper onWindowHiding = new OnWindowHidingHelper();
041     private final OnWindowShownHelper onWindowShown = new OnWindowShownHelper();
042     private final OnWindowHiddenHelper onWindowHidden = new OnWindowHiddenHelper();
043 
044     @Inject
045     @Nonnull
046     public DefaultJavaFXWindowManager(@Nonnull GriffonApplication application, @Nonnull @Named("windowDisplayHandler"JavaFXWindowDisplayHandler windowDisplayHandler) {
047         super(application, windowDisplayHandler);
048         requireNonNull(application.getEventRouter()"Argument 'application.eventRouter' must not be null");
049     }
050 
051     @Override
052     protected void doAttach(@Nonnull Window window) {
053         requireNonNull(window, ERROR_WINDOW_NULL);
054         window.setOnHiding(onWindowHiding);
055         window.setOnShown(onWindowShown);
056         window.setOnHidden(onWindowHidden);
057     }
058 
059     @Override
060     protected void doDetach(@Nonnull Window window) {
061         requireNonNull(window, ERROR_WINDOW_NULL);
062         window.setOnHiding(null);
063         window.setOnShown(null);
064         window.setOnHidden(null);
065     }
066 
067     @Override
068     protected boolean isWindowVisible(@Nonnull Window window) {
069         requireNonNull(window, ERROR_WINDOW_NULL);
070         return window.isShowing();
071     }
072 
073     public void handleClose(@Nonnull Window widget) {
074         if (getApplication().getPhase() == ApplicationPhase.SHUTDOWN) {
075             return;
076         }
077         int visibleWindows = 0;
078         for (Window window : getWindows()) {
079             if (window.isShowing()) {
080                 visibleWindows++;
081             }
082         }
083 
084         if (visibleWindows <= && isAutoShutdown()) {
085             if (!getApplication().shutdown())
086                 show(widget);
087         }
088     }
089 
090     /**
091      * WindowAdapter that invokes hide() when the window is about to be closed.
092      *
093      @author Andres Almiray
094      */
095     private class OnWindowHidingHelper implements EventHandler<WindowEvent> {
096         public void handle(WindowEvent event) {
097             hide((Windowevent.getSource());
098             handleClose((Windowevent.getSource());
099         }
100     }
101 
102     /**
103      * Listener that triggers application events when a window is shown.
104      *
105      @author Andres Almiray
106      */
107     private class OnWindowShownHelper implements EventHandler<WindowEvent> {
108         /**
109          * Triggers a <tt>WindowShown</tt> event with the window as sole argument
110          */
111         public void handle(WindowEvent windowEvent) {
112             event(ApplicationEvent.WINDOW_SHOWN, asList(windowEvent.getSource()));
113         }
114     }
115 
116     /**
117      * Listener that triggers application events when a window is hidden.
118      *
119      @author Andres Almiray
120      */
121     private class OnWindowHiddenHelper implements EventHandler<WindowEvent> {
122         /**
123          * Triggers a <tt>WindowHidden</tt> event with the window as sole argument
124          */
125         public void handle(WindowEvent windowEvent) {
126             event(ApplicationEvent.WINDOW_HIDDEN, asList(windowEvent.getSource()));
127         }
128     }
129 }