WindowManager.java
001 /*
002  * Copyright 2008-2016 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 griffon.core.view;
017 
018 import griffon.core.GriffonApplication;
019 import griffon.core.ShutdownHandler;
020 
021 import javax.annotation.Nonnull;
022 import javax.annotation.Nullable;
023 import java.util.Collection;
024 import java.util.Set;
025 
026 /**
027  * Controls a set of windows that belong to the application.<p>
028  * Windows that are controlled by a WindowManager can be shown/hidden
029  * using a custom strategy ({@code WindowDisplayHandler})
030  *
031  @author Andres Almiray
032  @since 2.0.0
033  */
034 public interface WindowManager<W> extends ShutdownHandler {
035     /**
036      * Finds a Window by name.
037      *
038      @param name the value of the of the Window's name
039      @return a Window if a match is found, null otherwise.
040      */
041     @Nullable
042     W findWindow(@Nonnull String name);
043 
044     /**
045      * Convenience method to get a managed Window by index.<p>
046      * Follows the Groovy conventions for overriding the [] operator.
047      *
048      @param index the index of the Window to be retrieved
049      @return the Window found at the specified index
050      @throws ArrayIndexOutOfBoundsException if the index is invalid (below 0 or greater than the size
051      *                                        of the managed windows list)
052      */
053     @Nullable
054     W getAt(int index);
055 
056     /**
057      * Finds the Window that should be displayed during the Ready phase of an application.<p>
058      * The WindowManager expects a configuration flag <code>windowManager.startingWindow</code> to be
059      * present in order to determine which Window will be displayed during the Ready phase. If no configuration
060      * is found the WindowManager will pick the first Window found in the list of managed windows.<p>
061      * The configuration flag accepts two value types:<ul>
062      <li>a String that defines the name of the Window. You must make sure the Window has a matching name property.</li>
063      <li>a Number that defines the index of the Window in the list of managed windows.</li>
064      </ul>
065      *
066      @return a Window that matches the given criteria or null if no match is found.
067      */
068     @Nullable
069     W getStartingWindow();
070 
071     /**
072      * Returns the collection of windows managed by this manager.
073      *
074      @return a Collection of currently managed windows
075      */
076     @Nonnull
077     Collection<W> getWindows();
078 
079     /**
080      * Returns a set of names related to all windows managed by this manager.
081      *
082      @return a Set of managed window names
083      @since 2.3.0
084      */
085     @Nonnull
086     Set<String> getWindowNames();
087 
088     /**
089      * Lookups a name related to a Window.
090      *
091      @param window the window to be looked up
092      @return the name of the window if it's managed by this manager, <tt>null</tt> otherwise.
093      @since 2.3.0
094      */
095     @Nullable
096     String findWindowName(@Nonnull W window);
097 
098     /**
099      * Lookups the index related to a Window.
100      *
101      @param window the window to be looked up
102      @return the index of the window if it's managed by this manager, <tt>-1</tt> otherwise.
103      @since 2.3.0
104      */
105     int indexOf(@Nonnull W window);
106 
107     /**
108      * Registers a window on this manager if an only if the window is not null
109      * and it's not registered already.
110      *
111      @param name   the value of the of the Window's name
112      @param window the window to be added to the list of managed windows
113      */
114     void attach(@Nonnull String name, @Nonnull W window);
115 
116     /**
117      * Removes the window from the list of manages windows if and only if it
118      * is registered with this manager.
119      *
120      @param name the value of the of the Window's name
121      */
122     void detach(@Nonnull String name);
123 
124     /**
125      * Shows the window.<p>
126      * This method is executed <b>SYNCHRONOUSLY</b> in the UI thread.
127      *
128      @param window the window to show
129      */
130     void show(@Nonnull W window);
131 
132     /**
133      * Shows the window.<p>
134      * This method is executed <b>SYNCHRONOUSLY</b> in the UI thread.
135      *
136      @param name the name of window to show
137      */
138     void show(@Nonnull String name);
139 
140     /**
141      * Hides the window.<p>
142      * This method is executed <b>SYNCHRONOUSLY</b> in the UI thread.
143      *
144      @param window the window to hide
145      */
146     void hide(@Nonnull W window);
147 
148     /**
149      * Hides the window.<p>
150      * This method is executed <b>SYNCHRONOUSLY</b> in the UI thread.
151      *
152      @param name the name of window to hide
153      */
154     void hide(@Nonnull String name);
155 
156     boolean canShutdown(@Nonnull GriffonApplication app);
157 
158     /**
159      * Hides all visible windows
160      */
161     void onShutdown(@Nonnull GriffonApplication app);
162 
163     /**
164      * Counts how many Windows are visible regardless of their attached status to this WindowManager.
165      *
166      @return the number of visible Windows
167      */
168     int countVisibleWindows();
169 
170     /**
171      * Returns the value of the "application.autoShutdown" configuration flag.
172      *
173      @return the value of the "application.autoShutdown" configuration flag.
174      */
175     boolean isAutoShutdown();
176 }