DefaultLanternaWindowManager.java
001 /*
002  * Copyright 2008-2014 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.lanterna;
017 
018 import com.googlecode.lanterna.gui.Window;
019 import com.googlecode.lanterna.gui.listener.WindowAdapter;
020 import griffon.core.ApplicationEvent;
021 import griffon.core.GriffonApplication;
022 import griffon.core.env.ApplicationPhase;
023 import griffon.core.event.EventRouter;
024 import griffon.exceptions.InstanceNotFoundException;
025 import griffon.lanterna.LanternaWindowDisplayHandler;
026 import griffon.lanterna.LanternaWindowManager;
027 import org.codehaus.griffon.runtime.core.view.AbstractWindowManager;
028 
029 import javax.annotation.Nonnull;
030 import javax.inject.Inject;
031 import javax.inject.Named;
032 import java.util.List;
033 
034 import static java.util.Arrays.asList;
035 import static java.util.Objects.requireNonNull;
036 
037 /**
038  @author Andres Almiray
039  @since 2.0.0
040  */
041 public class DefaultLanternaWindowManager extends AbstractWindowManager<Window> implements LanternaWindowManager {
042     private final WindowHelper windowHelper = new WindowHelper();
043 
044     @Inject
045     @Nonnull
046     public DefaultLanternaWindowManager(@Nonnull GriffonApplication application, @Nonnull @Named("windowDisplayHandler"LanternaWindowDisplayHandler 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.addWindowListener(windowHelper);
055     }
056 
057     @Override
058     protected void doDetach(@Nonnull Window window) {
059         requireNonNull(window, ERROR_WINDOW_NULL);
060     }
061 
062     @Override
063     protected boolean isWindowVisible(@Nonnull Window window) {
064         requireNonNull(window, ERROR_WINDOW_NULL);
065         return true;
066     }
067 
068     public void handleClose(@Nonnull Window widget) {
069         if (getApplication().getPhase() == ApplicationPhase.SHUTDOWN) {
070             return;
071         }
072 
073         int visibleWindows = getWindows().size();
074         if (visibleWindows <= && isAutoShutdown()) {
075             if (!getApplication().shutdown())
076                 show(widget);
077         }
078     }
079 
080     /**
081      * WindowAdapter that optionally invokes hide() when the window is about to be closed.
082      *
083      @author Andres Almiray
084      */
085     private class WindowHelper extends WindowAdapter {
086         @Override
087         public void onWindowClosed(@Nonnull Window window) {
088             super.onWindowClosed(window);
089             event(ApplicationEvent.WINDOW_HIDDEN, asList(window));
090             handleClose(window);
091         }
092 
093         @Override
094         public void onWindowShown(Window window) {
095             super.onWindowShown(window);
096             event(ApplicationEvent.WINDOW_SHOWN, asList(window));
097         }
098     }
099 
100     private void event(@Nonnull ApplicationEvent evt, List<?> args) {
101         try {
102             EventRouter eventRouter = getApplication().getEventRouter();
103             eventRouter.publishEvent(evt.getName(), args);
104         catch (InstanceNotFoundException infe) {
105             if (getApplication().getPhase() != ApplicationPhase.SHUTDOWN) {
106                 throw infe;
107             }
108         }
109     }
110 }